diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68ff9552..1c7c07d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,9 @@ name: CI # lock-files ───────────────────────────┘ # # The Release leg packs before it tests: the package-consumption tests install the very files CI uploads. Jobs exchange -# artifacts instead of rebuilding (names reserved, nothing else is uploaded): -# nuget-packages build-test (Release) → sonar, release.yml +# artifacts instead of rebuilding (names reserved, nothing else is uploaded). Normal CI compiles and tests the pinned +# SDK submodule; only the production release path packs and consumes NuGet packages: +# nuget-packages build-test (production Release) → release.yml # coverage build-test (Debug) → sonar # test-results- build-test → humans # test-dumps-, binlogs-* on failure only → humans @@ -34,6 +35,12 @@ on: description: Days to keep the nuget-packages artifact. type: number default: 7 + production-packages: + description: >- + Build, pack and consume the reviewed NuGet graph for a production release. Ordinary CI builds and tests the + pinned SDK submodule instead. + type: boolean + default: false secrets: SONAR_TOKEN: description: SonarQube Cloud analysis token. Needed only when sonar is true. @@ -58,11 +65,14 @@ jobs: env: CONFIGURATION: ${{ matrix.configuration }} RESULTS: artifacts/test-results/${{ matrix.configuration }} + PRODUCTION_PACKAGES: ${{ inputs.production-packages }} + CheatEngineSdkSourceMode: ${{ inputs.production-packages && 'false' || 'true' }} steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 # the package version comes from tags and history + submodules: recursive # normal builds compile the pinned SDK source persist-credentials: false - name: Setup .NET @@ -85,7 +95,7 @@ jobs: # release names the exact version, every file must be named "..nupkg" / ".snupkg". - name: Pack id: pack - if: matrix.configuration == 'Release' + if: inputs.production-packages && matrix.configuration == 'Release' env: PACKAGE_VERSION: ${{ inputs.package-version }} run: | @@ -156,8 +166,8 @@ jobs: "Discovered $($benchmarks.Count) benchmarks." | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8 # One parallel run over every tests/**/*.Tests module. A skip fails the run (--fail-skips on). Debug collects one - # coverage report per module and leaves the package-consumption tests to Release by trait filter, never Skip. - # Release hands those tests the packages the Pack step produced. Both legs exclude the live qualification tests + # coverage report per module and excludes package consumption except in the production Release job, never Skip. + # That one job hands the package tests the exact packages the Pack step produced. Both legs exclude live tests # by trait: they start a sandboxed Cheat Engine and run only on a maintainer workstation that opts in. The hang # dump fires after 15 minutes without test activity, well below the job timeout. - name: Test @@ -171,10 +181,13 @@ jobs: '--hangdump', '--hangdump-timeout', '15m', '--crashdump', '--filter-not-trait', 'Category=LiveQualification' ) + if ($env:PRODUCTION_PACKAGES -ne 'true' -or $env:CONFIGURATION -eq 'Debug') { + $options += '--filter-not-trait', 'Category=PackageConsumption' + } if ($env:CONFIGURATION -eq 'Debug') { - $options += '--coverage', '--coverage-output-format', 'xml', '--filter-not-trait', 'Category=PackageConsumption' + $options += '--coverage', '--coverage-output-format', 'xml' } - else { + elseif ($env:PRODUCTION_PACKAGES -eq 'true') { # Set only here: the smoke tests fail on a set-but-empty value, and the Debug leg has no packages. if ([string]::IsNullOrEmpty($env:PACKAGE_SOURCE)) { throw 'The Pack step exported no package-source.' @@ -187,7 +200,7 @@ jobs: } - name: Upload packages - if: matrix.configuration == 'Release' + if: inputs.production-packages && matrix.configuration == 'Release' uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: nuget-packages @@ -241,11 +254,14 @@ jobs: name: Native AOT publication probe runs-on: windows-2025 timeout-minutes: 25 + env: + CheatEngineSdkSourceMode: ${{ inputs.production-packages && 'false' || 'true' }} steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 # the package version comes from tags and history + submodules: recursive # the AOT graph uses the pinned SDK source persist-credentials: false - name: Setup .NET @@ -353,7 +369,7 @@ jobs: # Style rules are enforced by the build (EnforceCodeStyleInBuild). - name: Verify whitespace formatting run: | - dotnet format whitespace . --folder --verify-no-changes --exclude artifacts + dotnet format whitespace . --folder --verify-no-changes --exclude artifacts externals if ($LASTEXITCODE -ne 0) { throw "Whitespace formatting differs (exit code $LASTEXITCODE). Fix it with: dotnet format whitespace --folder" } @@ -386,10 +402,13 @@ jobs: name: Lock files runs-on: windows-2025 timeout-minutes: 15 + env: + CheatEngineSdkSourceMode: ${{ inputs.production-packages && 'false' || 'true' }} steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + submodules: recursive # locked restore follows the normal source graph persist-credentials: false - name: Setup .NET diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a5f4c357..43819e14 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -38,6 +38,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 # MinVer computes the package version from the tag history + submodules: recursive persist-credentials: false - name: Set up .NET and restore the product graph (locked) diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml index 1aa8d3ed..d5f11f8a 100644 --- a/.github/workflows/dependency-submission.yml +++ b/.github/workflows/dependency-submission.yml @@ -40,6 +40,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} + submodules: recursive persist-credentials: false - name: Set up .NET and restore (locked) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3f2b6a4b..6dbe650a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -174,6 +174,7 @@ jobs: with: package-version: ${{ needs.verify.outputs.version }} package-retention-days: 90 + production-packages: true # Every run, dry runs included, with a read-only token and no OIDC token: extracts the SPDX SBOM each package embeds # and writes SHA256SUMS over the packages, the symbol packages and the SBOMs. A dry run ends here, with those files in diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index aa66efd1..1198a25f 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -1,8 +1,8 @@ name: Sonar # Reusable SonarQube Cloud analysis, called by ci.yml after build-test when SONAR_EXPECTED is true. It reuses the -# coverage and nuget-packages artifacts of the same run; only the instrumented build is repeated, because the scanner -# must observe a compilation. +# coverage artifacts of the same source-mode run; only the instrumented build is repeated, because the scanner must +# observe a compilation. # # CI-based analysis only: Automatic Analysis must stay OFF for the project in SonarQube Cloud (Administration > Analysis # Method). SonarQube Cloud exposes no API to read that setting; with both methods on, scanner begin fails, which is the @@ -47,6 +47,7 @@ jobs: SONAR_PROJECT_KEY: ${{ inputs.project-key }} SONAR_ORGANIZATION: ${{ inputs.organization }} SONAR_WAIT_QUALITY_GATE: ${{ inputs.wait-quality-gate }} + CheatEngineImportSourceSettings: 'true' steps: # ci.yml never calls this workflow for forks or Dependabot, so an empty token is a configuration error. Fail # before the instrumented build instead of after it. @@ -63,6 +64,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 # SCM blame for new-code detection + submodules: recursive # analyse the same pinned SDK source graph as CI persist-credentials: false # SonarScanner for .NET uses Java. The same JDK 21 distribution as CheatEngine.SDK keeps scanner behaviour @@ -92,12 +94,6 @@ jobs: name: coverage path: ${{ runner.temp }}/coverage - - name: Download packages - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: nuget-packages - path: ${{ runner.temp }}/packages - # Do not use the checked-out nuget.config to resolve tooling. The scanner package and every restored dependency # must come only from nuget.org, not a source a pull request can redirect. - name: Create NuGet.org-only configuration @@ -149,15 +145,18 @@ jobs: Write-Host '::error::The coverage artifact holds no report.' exit 1 } - # The new-code period follows sonar.projectVersion: the core version of the facade package built in this run - # (0.1.0 for 0.1.0-alpha.0.37). The digit right after "CheatEngine.Client." excludes the other package ids. - $packages = @(Get-ChildItem -Path "$env:RUNNER_TEMP/packages" -Filter 'CheatEngine.Client.*.nupkg' -File | - Where-Object { $_.Name -match '^CheatEngine\.Client\.\d' }) - if ($packages.Count -ne 1 -or $packages[0].Name -notmatch '^CheatEngine\.Client\.(?\d+\.\d+\.\d+)') { - Write-Host '::error::The nuget-packages artifact must hold exactly one CheatEngine.Client facade package.' + # Run MinVer before reading its version, then retain the core version used by the previous package-based + # calculation. A different prerelease commit must not reset Sonar's version-based new-code period. + $versionOutput = @(dotnet msbuild src/CheatEngine.Client/CheatEngine.Client.csproj -target:MinVer -getProperty:MinVerVersion --nologo) + if ($LASTEXITCODE -ne 0) { + throw "Reading the source version failed with exit code $LASTEXITCODE." + } + $version = ($versionOutput -join "`n").Trim() + if ($version -notmatch '^(?\d+\.\d+\.\d+)(?:-[0-9A-Za-z.-]+)?$') { + Write-Host "::error::Could not read the MinVer source version from:`n$($versionOutput -join "`n")" exit 1 } - $version = $Matches['version'] + $version = $Matches['core'] Write-Host "Coverage reports: $($reports.Count); project version: $version" # These findings conflict with deliberate repository contracts. Keep them in the scanner configuration so the # sources stay free of Sonar-only attributes and suppressions. @@ -176,7 +175,7 @@ jobs: "/k:$env:SONAR_PROJECT_KEY" "/o:$env:SONAR_ORGANIZATION" "/v:$version" - '/d:sonar.exclusions=artifacts/**,tests/CheatEngine.Client.Benchmarks/**' + '/d:sonar.exclusions=artifacts/**,externals/**,tests/CheatEngine.Client.Benchmarks/**' # CI publishes managed coverage of the shipping code only: tests and build tooling stay out of the coverage # metric instead of presenting an incomplete report as if it covered them. Every excluded path exists # (the repository has no documentation folder; its Markdown files are not analysed code). @@ -185,7 +184,7 @@ jobs: # (xUnit has no attached Cheat Engine process or Lua state): its lines are untestable, not merely # untested, and its non-SDK branches keep the tests they allow next to it (for example # SdkTableRecordMutationPortTests). A lot that adds an Sdk*Port.cs adds its own entry here. - '/d:sonar.coverage.exclusions=tests/**,eng/**,libs/CheatEngine.Client.Core/Domains/SdkTableRecordMutationPort.cs,libs/CheatEngine.Client.Core/Domains/SdkAobScanPort.cs,libs/CheatEngine.Client.Core/Domains/IMemoryCodecContextPort.cs,libs/CheatEngine.Client.Core/Domains/SdkRuntimeObservationPort.cs,libs/CheatEngine.Client.Core/Domains/SdkProcessSelectionPort.cs,libs/CheatEngine.Client.Core/Domains/SdkInspectionPort.cs,libs/CheatEngine.Client.Core/Domains/SdkTableFilePort.cs,libs/CheatEngine.Client.Core/Domains/SdkTableRecordLookupPort.cs,libs/CheatEngine.Client.Core/Domains/ValueScanning/SdkValueScanPort.cs,libs/CheatEngine.Client.Core/Domains/Allocations/SdkAllocationPort.cs,libs/CheatEngine.Client.Core/Domains/Assembly/SdkAutoAssemblerPort.cs,libs/CheatEngine.Client.Core/Domains/Assembly/SdkInstructionPort.cs' + '/d:sonar.coverage.exclusions=externals/**,tests/**,eng/**,libs/CheatEngine.Client.Core/Domains/SdkTableRecordMutationPort.cs,libs/CheatEngine.Client.Core/Domains/SdkAobScanPort.cs,libs/CheatEngine.Client.Core/Domains/IMemoryCodecContextPort.cs,libs/CheatEngine.Client.Core/Domains/SdkRuntimeObservationPort.cs,libs/CheatEngine.Client.Core/Domains/SdkProcessSelectionPort.cs,libs/CheatEngine.Client.Core/Domains/SdkInspectionPort.cs,libs/CheatEngine.Client.Core/Domains/SdkTableFilePort.cs,libs/CheatEngine.Client.Core/Domains/SdkTableRecordLookupPort.cs,libs/CheatEngine.Client.Core/Domains/ValueScanning/SdkValueScanPort.cs,libs/CheatEngine.Client.Core/Domains/Allocations/SdkAllocationPort.cs,libs/CheatEngine.Client.Core/Domains/Assembly/SdkAutoAssemblerPort.cs,libs/CheatEngine.Client.Core/Domains/Assembly/SdkInstructionPort.cs' # Never set sonar.dotnet.excludeTestProjects: the scanner then strips every analyzer, including source # generators, from test projects, and their [GeneratedRegex]/[LoggerMessage] partial methods fail with # CS8795 (https://github.com/SonarSource/sonar-scanner-msbuild/issues/1469). Test projects are analysed as diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..b1428414 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "externals/CheatEngine.SDK"] + path = externals/CheatEngine.SDK + url = https://github.com/CheatEngineNet/CheatEngine.SDK.git diff --git a/CHANGELOG.md b/CHANGELOG.md index e6318921..89d03561 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,10 +25,11 @@ ship. ### Added -- **Source SDK builds.** Workspace consumers can opt into `CheatEngineSdkSourceRoot` to build Client and SDK together - through project references. Source builds record the SDK Engine version and Git commit from its PE metadata, - preserve plugin profile checks, and reject mismatched runtime identities. Normal NuGet builds retain their existing - package identity checks. +- **Pinned SDK submodule.** Repository builds, tests, plugin fixtures and PR CI build `externals/CheatEngine.SDK` + through project references, with separate source lock files. Parent workspaces can override `CheatEngineSdkSourceRoot`. + Source builds record the SDK Engine version and Git commit from its PE metadata, preserve plugin profile checks, + and reject mismatched runtime identities. NuGet packaging and package-consumer checks run on the production release + path with `CheatEngineSdkSourceMode=false`; SDK remains a separate published dependency. ### Changed diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd3dfb3e..e2de3944 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,24 +1,25 @@ # Contributing to CheatEngine.Client Thanks for contributing. CheatEngine.Client is a Windows x64, .NET 10 layer for in-process Cheat Engine 7.7 plugins, -built on the `CheatEngine.SDK` package. Keep changes focused, preserve existing patterns, and update the documentation +built on the pinned `CheatEngine.SDK` Git submodule. Keep changes focused, preserve existing patterns, and update the documentation and tests that describe the behavior you change. ## Prerequisites - Windows x64 -- .NET SDK 10.0.401 exactly, as pinned in [`global.json`](global.json). `rollForward` is `disable`, so any other +- .NET SDK 10.0.402 exactly, as pinned in [`global.json`](global.json). `rollForward` is `disable`, so any other SDK, a newer one included, stops the build with the install command: - `winget install Microsoft.DotNet.SDK.10 --version 10.0.401` + `winget install Microsoft.DotNet.SDK.10 --version 10.0.402` - PowerShell 7.4 or later, to run the CI checks locally (actionlint, zizmor, the lock-file check) - Git ## Build and test Run these commands from the repository root before every commit. Restores are locked: they fail when a project's -dependencies no longer match its committed `packages.lock.json`. +dependencies no longer match the committed source locks in `eng/locks/source/`. ```powershell +git submodule update --init --recursive dotnet restore CheatEngine.Client.slnx --locked-mode dotnet build CheatEngine.Client.slnx -c Debug --no-restore dotnet test --solution CheatEngine.Client.slnx -c Debug --no-build --fail-skips on --filter-not-trait "Category=PackageConsumption" --filter-not-trait "Category=LiveQualification" @@ -27,23 +28,27 @@ dotnet build CheatEngine.Client.slnx -c Release --no-restore The test command is the one of the CI Debug leg: it runs every test except the package consumption tests (`Category=PackageConsumption`) and the live qualification tests (`Category=LiveQualification`); the Release build -compiles the configuration that is packed. A skipped test fails the run: an environment-dependent test is fixed or +also builds the submodule graph. Normal PR CI tests both configurations without package consumption. A skipped test fails the run: an environment-dependent test is fixed or deleted, never skipped. The live qualification tests start a sandboxed Cheat Engine, so every command here, like CI, excludes them by trait; run without that filter, they fail with the instructions of their opt-in (see [Live qualification](#live-qualification)). -The package consumption tests consume the exact packages you pack, as the CI Release leg does. Run them as well when a -change reaches what is packed: a project file, `eng/`, `Directory.Build.*`, `Directory.Packages.props`, `templates/`, -a packed README, or a public API that the template or a README snippet uses. The Native AOT probe completes the set: +NuGet and package-consumption tests belong to production release validation. The release workflow enables +`production-packages` and requires the exact packages it packs to pass consumption checks. Before preparing a release, +update the separate SDK NuGet pin to a published version containing every API used by Client, then validate this graph: ```powershell -Remove-Item artifacts/nuget -Recurse -Force -ErrorAction SilentlyContinue +$env:CheatEngineSdkSourceMode = 'false' +dotnet restore CheatEngine.Client.slnx --locked-mode +dotnet build CheatEngine.Client.slnx -c Release --no-restore dotnet pack CheatEngine.Client.slnx -c Release --no-build -o artifacts/nuget $env:CHEATENGINE_CLIENT_PACKAGE_SOURCE = (Resolve-Path artifacts/nuget).Path dotnet test --solution CheatEngine.Client.slnx -c Release --no-build --fail-skips on --filter-not-trait "Category=LiveQualification" Remove-Item Env:CHEATENGINE_CLIENT_PACKAGE_SOURCE +dotnet restore tests/CheatEngine.Client.AotProbe/CheatEngine.Client.AotProbe.csproj --locked-mode dotnet publish tests/CheatEngine.Client.AotProbe/CheatEngine.Client.AotProbe.csproj -c Release --no-restore -o artifacts/aot-probe ./artifacts/aot-probe/CheatEngine.Client.AotProbe.exe +Remove-Item Env:CheatEngineSdkSourceMode ``` Without `CHEATENGINE_CLIENT_PACKAGE_SOURCE`, the package consumption tests pack the repository themselves, which is @@ -84,7 +89,11 @@ version. ### The consumed CheatEngine.SDK -The Client consumes exactly one `CheatEngine.SDK` package, pinned in the single reviewed source +Ordinary builds consume the SDK submodule. Review its changes, check out the intended commit, regenerate affected +source locks one project at a time, and commit the gitlink together with those locks. Parent workspaces can select +another SDK checkout as described in the README; standalone CI always uses the committed submodule. + +Production releases consume exactly one `CheatEngine.SDK` package, pinned in the single reviewed source [`eng/CheatEngineSdk.props`](eng/CheatEngineSdk.props): never write an SDK version literal anywhere else. There is no script for the bump; the props file's own header documents the procedure, all of it in one pull request: update `CheatEngineSdkVersion`, update the reviewed identity literals it names @@ -131,11 +140,11 @@ on every push, including on drafts, but it is advisory: it never blocks a merge | Check (`CI / ...`) | Runner | What it does | |--------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------------| | `Build and test (Debug)` | `windows-2025` | Locked restore, build, one `dotnet test --solution` run with coverage (package consumption and live qualification tests excluded by trait) | -| `Build and test (Release)` | `windows-2025` | Locked restore, build, pack (exact package set, embedded SBOM), benchmark discovery, one test run against the packed packages (live qualification tests excluded by trait) | +| `Build and test (Release)` | `windows-2025` | Locked restore, source build, benchmark discovery and portable tests. Production releases additionally pack and validate the exact package set and embedded SBOM. | | `Native AOT publication probe` | `windows-2025` | Publishes and runs `tests/CheatEngine.Client.AotProbe`: trim and Native AOT compatibility of the Client graph, not a Cheat Engine load | | `Sonar / Analyze` | `windows-2025` | SonarQube Cloud CI-based analysis with the Debug coverage; waits for the quality gate except on pushes to `main` | | `Lint` | `ubuntu-24.04` | actionlint and the offline zizmor audits over the workflows | -| `Format` | `ubuntu-24.04` | `dotnet format whitespace . --folder --verify-no-changes --exclude artifacts` | +| `Format` | `ubuntu-24.04` | `dotnet format whitespace . --folder --verify-no-changes --exclude artifacts externals` | | `Dependency review` | `ubuntu-24.04` | On pull requests, reviews dependency changes against `.github/dependency-review-config.yml`; a notice on other events | | `Lock files` | `windows-2025` | `dotnet restore CheatEngine.Client.slnx --locked-mode` | | `Gate` | `ubuntu-24.04` | The required check described above | @@ -284,6 +293,9 @@ loaded; it reads assembly attributes only. Its reason says whether the loaded as a distinction the qualification gate needs (a receipt covers only the tuple it was produced with). A build that cannot embed that identity fails with `CHEATENGINECLIENT9050`. +Source builds instead embed the Engine assembly's exact version and Git commit with `Kind=source` and no NuGet hash. +The runtime gate requires that exact source identity. The source build does not inherit package qualification evidence. + **Instructions** (`CECLIENT5003`): the internal `AssemblyClient` runs each call in one dispatched callback behind one `LuaAdmission`, observes the instruction profile once (`InstructionProfiles.TryObserveCurrent`), refuses an address wider than that profile before any instruction function of Cheat Engine is called, and passes the same profile to @@ -415,6 +427,10 @@ runs in CI. ### Live qualification +This runner qualifies production packages and templates only. It requires an explicit +`CHEATENGINE_CLIENT_PACKAGE_SOURCE` artifact directory as well as the live-operation opt-in; it never self-packs +the development checkout. Source fixture builds and portable tests do not produce live qualification receipts. + The live qualification tests (`tests/CheatEngine.Client.Tests/LiveQualification`, `Category=LiveQualification`) build plugins from the packed Client packages, load them into a sandboxed copy of Cheat Engine 7.7.0.10621 x64 and drive disposable gtutorial targets. They run only on a maintainer workstation that opts in, with the operator present, never diff --git a/Directory.Build.targets b/Directory.Build.targets index 6aa72724..868fcd72 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,8 +1,22 @@ + + + + + Platform=AnyCPU + Configuration=$(Configuration) + %(ProjectReference.AdditionalProperties);ShouldUnsetParentConfigurationAndPlatform=false + + + + Text="Source SDK mode builds and tests the pinned submodule. For production packaging, restore, build and pack with CheatEngineSdkSourceMode=false to validate the reviewed NuGet dependency graph."/> @@ -205,7 +219,7 @@ TypeLoadException, which neither package validation nor the public API baselines can see. The seven packages share one version (CHEATENGINECLIENT9019), so each one requires exactly that version of every Client package it depends on. - The .NET SDK 10.0.401 pack targets (NuGet.Build.Tasks.Pack.targets, internal and undocumented; eng/CheatEngineSdk.props + The .NET SDK 10.0.402 pack targets (NuGet.Build.Tasks.Pack.targets, internal and undocumented; eng/CheatEngineSdk.props asks for a re-check after a .NET SDK bump): GenerateNuspec depends on _GetProjectReferenceVersions, which reads the project references of project.assets.json, calls _GetProjectVersion on each and collects the results as _ProjectReferencesWithVersions items, whose ProjectVersion metadata is the referenced project's $(PackageVersion). diff --git a/README.md b/README.md index ee182353..d955b298 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,12 @@ never exposes a `LuaState`, CE object handle, raw native pointer, or SDK ownersh ### Building with an SDK source checkout -NuGet remains the default. A workspace that builds Client and SDK from source can place `CheatEngine.Source.props` -beside the Client checkout with these settings: +Repository builds and tests use the SDK Git submodule pinned at `externals/CheatEngine.SDK`. Clone with +`git clone --recurse-submodules`, or run `git submodule update --init --recursive` in an existing checkout. +Keep its full history and tags for MinVer. Updating the SDK means reviewing and committing a new gitlink; +ordinary builds never follow a moving branch or download the SDK from NuGet. + +A parent workspace can override the submodule by placing `CheatEngine.Source.props` beside the Client checkout: ```xml @@ -38,10 +42,10 @@ beside the Client checkout with these settings: ``` -The SDK root must contain its Engine and Hosting runtime projects. The optional lock directory keeps this source -graph separate from Client's committed NuGet locks. Parent-workspace settings are read during both restore and build; -`CheatEngineImportSourceSettings=false` disables the import. Command-line properties can select the same settings. -Clone complete Git history and tags so MinVer can derive the SDK assembly version and source revision. +The SDK root must contain its Engine and Hosting runtime projects. Source dependency locks live in `eng/locks/source/` +unless the parent selects another directory. Parent-workspace settings are read during both restore and build; +`CheatEngineImportSourceSettings=false` disables that import and selects the nested submodule instead. +Command-line properties can select an explicit SDK checkout. Source consumers reference the Client facade project. A plugin also directly references the SDK Engine and Hosting projects, imports the SDK and Client consumer build assets, and references their plugin generators as analyzers; @@ -49,8 +53,10 @@ project references do not propagate NuGet build assets or analyzers. The SDK's c of the plugin output. Source mode reads the consumed Engine PE metadata without executing it and requires that exact version and commit at runtime. It does not claim a NuGet package hash or native qualification. -Package publication requires the normal NuGet graph; `CHEATENGINECLIENT9051` refuses source-mode packing or an invalid -SDK source root. Restore and validate the package graph before publishing Client packages. +NuGet is reserved for production releases. Set `CheatEngineSdkSourceMode=false` consistently for release restore, +build, pack and package-consumer tests. `CHEATENGINECLIENT9051` refuses source-mode packing or an invalid SDK source +root. Production packages retain their separate SDK NuGet dependency and require a published SDK containing every +API Client uses; a passing source build does not establish release readiness. ## Why this project exists @@ -88,7 +94,7 @@ A plugin project that consumes the packages needs: |---|---| | Target framework | `net10.0` | | Language | C# 14 (`14.0`) | -| .NET SDK | 10.0.401 or later: the Lua generator packed in Hosting is compiled against Roslyn 5.9.0; an older compiler does not run it and reports only warning CS9057 | +| .NET SDK | 10.0.402 or later: the Lua generator packed in Hosting is compiled against Roslyn 5.9.0; an older compiler does not run it and reports only warning CS9057 | | Platform | Windows x64; `PlatformTarget` is `x64` or `AnyCPU` | | Cheat Engine host | 7.7.0.10621 x64 (`cheatengine-x86_64.exe`), loading the plugin through its managed .NET host | | Plugin form | Framework-dependent managed plugin output folder, never a Native AOT DLL | @@ -99,8 +105,8 @@ Building this repository needs: | Repository build requirement | Value | |---|---| | Operating system | Windows x64 | -| .NET SDK | 10.0.401 exactly (`global.json` `rollForward: disable`); install it with `winget install Microsoft.DotNet.SDK.10 --version 10.0.401` | -| `CheatEngine.SDK` | 2.0.0, pinned in `eng/CheatEngineSdk.props` and in every committed lock file | +| .NET SDK | 10.0.402 exactly (`global.json` `rollForward: disable`); install it with `winget install Microsoft.DotNet.SDK.10 --version 10.0.402` | +| `CheatEngine.SDK` | The Git commit pinned by `externals/CheatEngine.SDK`; production packages separately retain the reviewed 2.0.0 NuGet pin until the release dependency is updated | | Tools | PowerShell 7.4 or later and Git, to run the CI checks locally ([CONTRIBUTING](CONTRIBUTING.md#prerequisites)) | | Cheat Engine | Only for the opt-in live qualification tests, never for an ordinary build or test run | @@ -372,7 +378,8 @@ dependency of `CheatEngine.Client.Extensions.DependencyInjection`. ending in `Kind`, `Status`, `State`, `Effect` or `Scope`) has `Unknown = 0`: handle a value you do not recognize like `Unknown`. An option enum has a valid default at 0 and never an outcome suffix. - **Frozen for all of 1.x:** the *Implementable* interfaces (`ILuaModule`, `ILuaOperation`, - `ILuaResultMapper`, `IMemoryCodec` and `ICheatEngineClientModule`) never gain, lose or change a + `ILuaResultMapper`, `IMemoryCodec`, `ICheatEngineClientModule`, + `ICheatEngineClientModuleDeactivationNotification` and `ICheatEngineClientResourceCleanup`) never gain, lose or change a member. - **Experimental APIs**, marked `[Experimental("CECLIENT500x")]`, can change or be removed in a minor release until their live qualification passes; using one is an explicit opt-in to that diagnostic. @@ -403,7 +410,7 @@ files, package validation, and the probe described above. ## Build and validation -The repository pins the .NET SDK in [global.json](global.json) (10.0.401 exactly), uses Central Package Management, and +The repository pins the .NET SDK in [global.json](global.json) (10.0.402 exactly), uses Central Package Management, and commits NuGet lock files. [CONTRIBUTING](CONTRIBUTING.md#build-and-test) gives the exact Windows validation sequence, from the locked restore to the package consumption tests and the Native AOT probe, and describes each job of the required `CI / Gate` check ([Continuous integration](CONTRIBUTING.md#continuous-integration)). diff --git a/RELEASING.md b/RELEASING.md index e3d17758..3bb1647d 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -75,6 +75,13 @@ otherwise. ## Prepare a release +Development and PR CI use the pinned SDK submodule. Production packaging deliberately uses the separate SDK NuGet +dependency: update its reviewed pin and package identity to a published version containing every SDK API Client uses +before releasing. The source rollback hook added after the current package pin requires that dependency update. +Set `CheatEngineSdkSourceMode=false` for all local release restore/build/pack/test commands below. The release workflow +sets it through `production-packages: true` and requires package-consumer checks before publication; source CI alone +does not qualify a package release. + 1. Move the entries of `## [Unreleased]` in [CHANGELOG.md](CHANGELOG.md) to a `## [X.Y.Z] - YYYY-MM-DD` section. Its body becomes the GitHub release notes; a stable tag fails without it, a prerelease tag falls back to `[Unreleased]`. `## [Unreleased]` keeps its four category headings, empty. For 1.0.0, the section summarizes the initial release by diff --git a/eng/CheatEngineSdk.props b/eng/CheatEngineSdk.props index 7f5708b1..282d1a94 100644 --- a/eng/CheatEngineSdk.props +++ b/eng/CheatEngineSdk.props @@ -1,8 +1,8 @@ + A standalone Client checkout uses its pinned SDK submodule. Production packaging opts out explicitly. --> + Condition="'$(CheatEngineSdkSourceMode)' != 'false' and '$(CheatEngineImportSourceSettings)' != 'false' and Exists('$(MSBuildThisFileDirectory)../../CheatEngine.Source.props')"/> - - true + true + + false + $(MSBuildThisFileDirectory)../externals/CheatEngine.SDK <_CheatEngineSdkSourceDirectory Condition="'$(CheatEngineSdkSourceMode)' == 'true'">$([MSBuild]::EnsureTrailingSlash($([System.IO.Path]::GetFullPath('$(CheatEngineSdkSourceRoot)')))) $(_CheatEngineSdkSourceDirectory)libs/CheatEngine.SDK.Engine/CheatEngine.SDK.Engine.csproj $(_CheatEngineSdkSourceDirectory)libs/CheatEngine.SDK.Hosting/CheatEngine.SDK.Hosting.csproj - $(CheatEngineSourceLockFileDirectory)/$(MSBuildProjectName).lock.json + $(MSBuildThisFileDirectory)locks/source + $(CheatEngineSourceLockFileDirectory)/$(MSBuildProjectName).lock.json 2.0.0 3.0.0 [$(CheatEngineSdkVersion),$(CheatEngineSdkUpperBound)) <_CheatEngineClientSupportedSdkMajor>2 + + + + Platform=AnyCPU + + + Text="SDK source projects are missing. Run git submodule update --init --recursive, or set CheatEngineSdkSourceRoot to an SDK checkout containing the Engine and Hosting runtime projects."/> diff --git a/eng/SdkSourcePlugin.props b/eng/SdkSourcePlugin.props new file mode 100644 index 00000000..c6a08353 --- /dev/null +++ b/eng/SdkSourcePlugin.props @@ -0,0 +1,29 @@ + + + + + <_CheatEngineSdkLuaBridgePath>$(_CheatEngineSdkSourceDirectory)native/cheatengine-sdk-lua-bridge/runtimes/win-x64/native/cheatengine-sdk-lua-bridge.dll + + + + + + + + + + + + + diff --git a/eng/locks/source/CheatEngine.Client.Abstractions.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Abstractions.Tests.lock.json new file mode 100644 index 00000000..2e7e2260 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Abstractions.Tests.lock.json @@ -0,0 +1,252 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "6.0.4", + "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Abstractions.lock.json b/eng/locks/source/CheatEngine.Client.Abstractions.lock.json new file mode 100644 index 00000000..71c44679 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Abstractions.lock.json @@ -0,0 +1,64 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.PublicApiAnalyzers": { + "type": "Direct", + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "W4kJGezNIKLzo0Ak5FAQDFvkMf2U7DtGL4THmHyRSApfKsKt5V+eX/bU0ZLKAt/uf9Bb2o1bi0YDKj/GRB/vYQ==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.AotProbe.lock.json b/eng/locks/source/CheatEngine.Client.AotProbe.lock.json new file mode 100644 index 00000000..64577226 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.AotProbe.lock.json @@ -0,0 +1,224 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.DotNet.ILCompiler": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "MnT222WlxhelguLZTQx9soBHKW7TeY6A9YUwVaprjUd+ARlhLAkfsXGFNX9w6kRq89/yxUcAQ/lzvmgndSFfOw==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Fluent": "[1.1.0, )", + "CheatEngine.Client.Hosting": "[1.1.0, )" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.fluent": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + }, + "net10.0/win-x64": { + "Microsoft.DotNet.ILCompiler": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "MnT222WlxhelguLZTQx9soBHKW7TeY6A9YUwVaprjUd+ARlhLAkfsXGFNX9w6kRq89/yxUcAQ/lzvmgndSFfOw==", + "dependencies": { + "runtime.win-x64.Microsoft.DotNet.ILCompiler": "10.0.13" + } + }, + "runtime.win-x64.Microsoft.DotNet.ILCompiler": { + "type": "Transitive", + "resolved": "10.0.13", + "contentHash": "L85cXCLA3BMnFyf6xtFczYVstkmMqlJk4pP8cpsvz86V6Gqn885K9rg+aJdoYGCEF7I01ptCYcwujtMmqkezsA==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Benchmarks.lock.json b/eng/locks/source/CheatEngine.Client.Benchmarks.lock.json new file mode 100644 index 00000000..3e3417d9 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Benchmarks.lock.json @@ -0,0 +1,302 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "BenchmarkDotNet": { + "type": "Direct", + "requested": "[0.15.8, )", + "resolved": "0.15.8", + "contentHash": "paCfrWxSeHqn3rUZc0spYXVFnHCF0nzRhG0nOLnyTjZYs8spsimBaaNmb3vwqvALKIplbYq/TF393vYiYSnh/Q==", + "dependencies": { + "BenchmarkDotNet.Annotations": "0.15.8", + "CommandLineParser": "2.9.1", + "Gee.External.Capstone": "2.3.0", + "Iced": "1.21.0", + "Microsoft.CodeAnalysis.CSharp": "4.14.0", + "Microsoft.Diagnostics.Runtime": "3.1.512801", + "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.21", + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Perfolizer": "[0.6.1]", + "System.Management": "9.0.5" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "BenchmarkDotNet.Annotations": { + "type": "Transitive", + "resolved": "0.15.8", + "contentHash": "hfucY0ycAsB0SsoaZcaAp9oq5wlWBJcylvEJb9pmvdYUx6PD6S4mDiYnZWjdjAlLhIpe/xtGCwzORfzAzPqvzA==" + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Gee.External.Capstone": { + "type": "Transitive", + "resolved": "2.3.0", + "contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw==" + }, + "Iced": { + "type": "Transitive", + "resolved": "1.21.0", + "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.14.0", + "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.11.0" + } + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.510501", + "contentHash": "juoqJYMDs+lRrrZyOkXXMImJHneCF23cuvO4waFRd2Ds7j+ZuGIPbJm0Y/zz34BdeaGiiwGWraMUlln05W1PCQ==", + "dependencies": { + "Microsoft.Extensions.Logging": "6.0.0" + } + }, + "Microsoft.Diagnostics.Runtime": { + "type": "Transitive", + "resolved": "3.1.512801", + "contentHash": "0lMUDr2oxNZa28D6NH5BuSQEe5T9tZziIkvkD44YkkCGQXPJqvFjLq5ZQq1hYLl3RjQJrY+hR0jFgap+EWPDTw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.410101" + } + }, + "Microsoft.Diagnostics.Tracing.TraceEvent": { + "type": "Transitive", + "resolved": "3.1.21", + "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", + "System.Reflection.TypeExtensions": "4.7.0" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "Perfolizer": { + "type": "Transitive", + "resolved": "0.6.1", + "contentHash": "CR1QmWg4XYBd1Pb7WseP+sDmV8nGPwvmowKynExTqr3OuckIGVMhvmN4LC5PGzfXqDlR295+hz/T7syA1CxEqA==", + "dependencies": { + "Pragmastat": "3.2.4" + } + }, + "Pragmastat": { + "type": "Transitive", + "resolved": "3.2.4", + "contentHash": "I5qFifWw/gaTQT52MhzjZpkm/JPlfjSeO/DTZJjO7+hTKI+0aGRgOgZ3NN6D96dDuuqbIAZSeA5RimtHjqrA2A==" + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "n6o9PZm9p25+zAzC3/48K0oHnaPKTInRrxqFq1fi/5TPbMLjuoCm/h//mS3cUmSy+9AO1Z+qsC/Ilt/ZFatv5Q==", + "dependencies": { + "System.CodeDom": "9.0.5" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.fluent": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "CentralTransitive", + "requested": "[5.9.0, )", + "resolved": "3.11.0", + "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "CentralTransitive", + "requested": "[5.9.0, )", + "resolved": "4.14.0", + "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Common": "[4.14.0]" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Core.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Core.Tests.lock.json new file mode 100644 index 00000000..c21a5edd --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Core.Tests.lock.json @@ -0,0 +1,260 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "6.0.4", + "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Core.lock.json b/eng/locks/source/CheatEngine.Client.Core.lock.json new file mode 100644 index 00000000..46b9ed01 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Core.lock.json @@ -0,0 +1,71 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.PublicApiAnalyzers": { + "type": "Direct", + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "W4kJGezNIKLzo0Ak5FAQDFvkMf2U7DtGL4THmHyRSApfKsKt5V+eX/bU0ZLKAt/uf9Bb2o1bi0YDKj/GRB/vYQ==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Extensions.DependencyInjection.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Extensions.DependencyInjection.Tests.lock.json new file mode 100644 index 00000000..f9090e34 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Extensions.DependencyInjection.Tests.lock.json @@ -0,0 +1,366 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Extensions.DependencyInjection.lock.json b/eng/locks/source/CheatEngine.Client.Extensions.DependencyInjection.lock.json new file mode 100644 index 00000000..82fb436e --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Extensions.DependencyInjection.lock.json @@ -0,0 +1,179 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.PublicApiAnalyzers": { + "type": "Direct", + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "W4kJGezNIKLzo0Ak5FAQDFvkMf2U7DtGL4THmHyRSApfKsKt5V+eX/bU0ZLKAt/uf9Bb2o1bi0YDKj/GRB/vYQ==" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Fluent.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Fluent.Tests.lock.json new file mode 100644 index 00000000..242425ef --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Fluent.Tests.lock.json @@ -0,0 +1,258 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.fluent": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "6.0.4", + "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Fluent.lock.json b/eng/locks/source/CheatEngine.Client.Fluent.lock.json new file mode 100644 index 00000000..46b9ed01 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Fluent.lock.json @@ -0,0 +1,71 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.PublicApiAnalyzers": { + "type": "Direct", + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "W4kJGezNIKLzo0Ak5FAQDFvkMf2U7DtGL4THmHyRSApfKsKt5V+eX/bU0ZLKAt/uf9Bb2o1bi0YDKj/GRB/vYQ==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Hosting.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Hosting.Tests.lock.json new file mode 100644 index 00000000..79a8e226 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Hosting.Tests.lock.json @@ -0,0 +1,376 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Hosting.lock.json b/eng/locks/source/CheatEngine.Client.Hosting.lock.json new file mode 100644 index 00000000..1c28aa52 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Hosting.lock.json @@ -0,0 +1,191 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.PublicApiAnalyzers": { + "type": "Direct", + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "W4kJGezNIKLzo0Ak5FAQDFvkMf2U7DtGL4THmHyRSApfKsKt5V+eX/bU0ZLKAt/uf9Bb2o1bi0YDKj/GRB/vYQ==" + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginA.lock.json b/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginA.lock.json new file mode 100644 index 00000000..8c03feae --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginA.lock.json @@ -0,0 +1,175 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginB.lock.json b/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginB.lock.json new file mode 100644 index 00000000..8c03feae --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginB.lock.json @@ -0,0 +1,175 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginCollision.lock.json b/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginCollision.lock.json new file mode 100644 index 00000000..8c03feae --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.LivePlugin.Coexistence.PluginCollision.lock.json @@ -0,0 +1,175 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.LivePlugin.Qualification.Tests.lock.json b/eng/locks/source/CheatEngine.Client.LivePlugin.Qualification.Tests.lock.json new file mode 100644 index 00000000..7be2f9a0 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.LivePlugin.Qualification.Tests.lock.json @@ -0,0 +1,261 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Direct", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.LivePlugin.Qualification.lock.json b/eng/locks/source/CheatEngine.Client.LivePlugin.Qualification.lock.json new file mode 100644 index 00000000..e42c00e9 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.LivePlugin.Qualification.lock.json @@ -0,0 +1,189 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Repository.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Repository.Tests.lock.json new file mode 100644 index 00000000..ce701119 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Repository.Tests.lock.json @@ -0,0 +1,218 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "YamlDotNet": { + "type": "Direct", + "requested": "[18.1.0, )", + "resolved": "18.1.0", + "contentHash": "5K+9KFg2TdTl7VXv88Qzi/0lqK6JFoNP3lRuImPYGRV7K/QYklDyTrj4+A+KAki1JsQi6qKY+hDyY7d6WRqjrw==" + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "6.0.4", + "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.SourceGenerators.Lua.Tests.lock.json b/eng/locks/source/CheatEngine.Client.SourceGenerators.Lua.Tests.lock.json new file mode 100644 index 00000000..7dd20439 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.SourceGenerators.Lua.Tests.lock.json @@ -0,0 +1,402 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[5.9.0, )", + "resolved": "5.9.0", + "contentHash": "7JGDA0UT1+h7k9ZcA3rF4eFC8+QPq1xyYaXxag4p8r/zzPurEJxvdi7aM+MRL/SfP7XADXpWF/pl/eUYXOq/ww==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "5.9.0-1.26328.17", + "Microsoft.CodeAnalysis.Common": "[5.9.0]" + } + }, + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "5.9.0", + "contentHash": "IYaIaUWdIx539AReKZOBEqTskFusZfCh/wFSPilDvCn5Say8MegLw2LONcSIcVy+v3Gzv53qYBspgvBGSErfbQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "5.9.0-1.26328.17" + } + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.sourcegenerators.lua": { + "type": "Project" + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "cheatengine.sdk.sourcegenerators.luabindings": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.SourceGenerators.Shared": "[1.0.0, )" + } + }, + "cheatengine.sdk.sourcegenerators.shared": { + "type": "Project" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "CentralTransitive", + "requested": "[5.9.0, )", + "resolved": "5.9.0-1.26328.17", + "contentHash": "HP9NNk8ZjOSI2hgOyXnQg+kv7/X837Vr2nAlXiGAtqtYnYKjRRa1UmQFr8KFs5ynGYKqfbb8zB9APoWjiAGdMg==" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.SourceGenerators.Lua.lock.json b/eng/locks/source/CheatEngine.Client.SourceGenerators.Lua.lock.json new file mode 100644 index 00000000..4373bcc3 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.SourceGenerators.Lua.lock.json @@ -0,0 +1,126 @@ +{ + "version": 2, + "dependencies": { + ".NETStandard,Version=v2.0": { + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[5.9.0, )", + "resolved": "5.9.0", + "contentHash": "jMNOo+uoBGiWbZ6Wx0dqU93r5WD4P5WnIRZdoz67RP5N09OUetHgAbo4L7hihOH1NHdD2TgW5/l+SP4gQukwww==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[5.9.0, )", + "resolved": "5.9.0", + "contentHash": "7JGDA0UT1+h7k9ZcA3rF4eFC8+QPq1xyYaXxag4p8r/zzPurEJxvdi7aM+MRL/SfP7XADXpWF/pl/eUYXOq/ww==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "5.9.0-1.26328.17", + "Microsoft.CodeAnalysis.Common": "[5.9.0]", + "System.Buffers": "4.6.1", + "System.Collections.Immutable": "10.0.1", + "System.Memory": "4.6.3", + "System.Numerics.Vectors": "4.6.1", + "System.Reflection.Metadata": "10.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2", + "System.Text.Encoding.CodePages": "8.0.0", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "5.9.0", + "contentHash": "IYaIaUWdIx539AReKZOBEqTskFusZfCh/wFSPilDvCn5Say8MegLw2LONcSIcVy+v3Gzv53qYBspgvBGSErfbQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "5.9.0-1.26328.17", + "System.Buffers": "4.6.1", + "System.Collections.Immutable": "10.0.1", + "System.Memory": "4.6.3", + "System.Numerics.Vectors": "4.6.1", + "System.Reflection.Metadata": "10.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2", + "System.Text.Encoding.CodePages": "8.0.0", + "System.Threading.Tasks.Extensions": "4.6.3" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "N8GXpmiLMtljq7gwvyS+1QvKT/W2J8sNAvx+HVg4NGmsG/H+2k/y9QI23auLJRterrzCiDH+IWAw4V/GPwsMlw==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "kdTe61B8P7i2M1pODC3MLbZ/CfFGjpC6c6jzxjQoB5DHZNewayCRqgFUmx3JKB6vLQtozpMQEiw+R5fO32Jv4g==", + "dependencies": { + "System.Memory": "4.6.3", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "dependencies": { + "System.Buffers": "4.6.1", + "System.Numerics.Vectors": "4.6.1", + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.6.1", + "contentHash": "sQxefTnhagrhoq2ReR0D/6K0zJcr9Hrd6kikeXsA1I8kOCboTavcUC4r7TSfpKFeE163uMuxZcyfO1mGO3EN8Q==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "zpcfT/wacPPhE17zcudozlxQtWN/84qyiMyZNGLnK4cj2IMBtLsZYwYjVnALUhPliwyUVj/P7kaZvBWYBCnf2Q==", + "dependencies": { + "System.Collections.Immutable": "10.0.1" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.2", + "contentHash": "2hBr6zdbIBTDE3EhK7NSVNdX58uTK6iHW/P/Axmm9sl1xoGSLqDvMtpecn226TNwHByFokYwJmt/aQQNlO5CRw==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.6.3", + "contentHash": "7sCiwilJLYbTZELaKnc7RecBBXWXA+xMLQWZKWawBxYjp6DBlSE3v9/UcvKBvr1vv2tTOhipiogM8rRmxlhrVA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.1.2" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Templates.lock.json b/eng/locks/source/CheatEngine.Client.Templates.lock.json new file mode 100644 index 00000000..d7c55145 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Templates.lock.json @@ -0,0 +1,25 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "Microsoft.TemplateEngine.Authoring.Tasks": { + "type": "Direct", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "YlT7YyzhPbEz60qYJFnYMutyIdqZGADNI0TICy1B87+iv6wKBZsz/9liI7yjHBctyLT8BpZ2l2BTc/3w36kcfA==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.Tests.lock.json b/eng/locks/source/CheatEngine.Client.Tests.lock.json new file mode 100644 index 00000000..dd7b7b24 --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.Tests.lock.json @@ -0,0 +1,389 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.12.0, )", + "resolved": "18.12.0", + "contentHash": "BST/sWYpKk9OXO7Yxktcg6FWORRsHU0EdCbMwZ7d3OqJsMKlrNHIZ30g0Ib4k5T5acJYXRBmg9mNrTU/N6cy1g==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.10", + "Microsoft.Extensions.DependencyModel": "10.0.10", + "Microsoft.Testing.Platform": "2.5.0", + "Mono.Cecil": "0.11.6" + } + }, + "Microsoft.Testing.Extensions.CrashDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "bV05eIsFehkX1k9WHgzsx7MlhOy4UlFhof6T/HaJxaGfI2sNA0tJJOGKQwbacm/7ldN3ZIK1B01fdqvr5Xyfag==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.GitHubActionsReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NdcPRLl7aTlodLo0JGa4kQIx1HNMkSHYn4AVWCdgsVrQ9OgaAVX3KEFXN1daDoV0fy29ehMW5wuJj6k8fjupsg==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.HangDump": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "z0PfgjBRMpIIxUipOXm8wI85IVBhDq46dBS6HP9LSZizcH2QWIDjCi09UMkvROaYFAhfwBVv1cAihFMquTw/bw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.607501", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.5.1, )", + "resolved": "2.5.1", + "contentHash": "NHqpG2UAVsXoNnNZtyIjxgsfPe9N/E6eTHjHCs7uaSbdOCOsbX5I7N0d1BHyjM7vv3Q5R2nlvngKSHWT+ZCRXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[4.0.2, )", + "resolved": "4.0.2", + "contentHash": "XLV32FhkuvheBStvX0DvjfPEtI+4SOVcIhnlTS+549r8VfVwsjpWdkJtQmQ7D23PA+Zoaqo+sTjBkRSkidC6Tw==", + "dependencies": { + "xunit.analyzers": "2.2.0", + "xunit.v3.assert": "[4.0.2]", + "xunit.v3.core.mtp-v2": "[4.0.2]" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.607501", + "contentHash": "17Yxzao41A1oZZ5lCCAnnXOy9up5i/GVEGazBjJAUZ4UISsNAotUt6h7zvCDgfKIC46CD7jszgLzLZoscSIJQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.10", + "contentHash": "zmGsm6b2y3STDa/Of7rdkkfTDV8VuGB8aCqIkLoJIQh5tL78K3zJ8OUyFKnfsaORXmGr9iOKwDkZfUjeXi+CwA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "rfZA1RjR021RPqSmIPovfz2aOd79TGqJ9BengbjnzIISOVwjLmuSDnhCMmiY/1c6iYvGolQ1iNGzkav0u11XEA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "mu2iyoHovwl0q1mGeeRU0h8+LALXC7HqbxniLa1shTKYdJGl+KPoCEgjWIQ8MLzk1tlTGPOfg1JsxdH3RxhMCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "DYTZAguaHz0wNJdHDTTGYOXtnlDoLoIbTMDKSApNNcytm55DJcnwpwELfQGLk5DB5QlgaEjNhnGo1Pu5QvL5VA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "FAMaFFWnULW+hDHMb40Qzhcgz9cAU2/EtgRCBNX/DdQoKo0sPG2EiY+w7bQdl/BgHnf/DbpXLbf5Xy0o15M8NA==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.5.1", + "contentHash": "lYawcAwY+h76rQmpma2n0HaL8zkOFbbKapso0Eb+uOAUQn7333pIByLftEuiO67csAoZufHNMwi6PqhNemWQXA==", + "dependencies": { + "Microsoft.Testing.Platform": "[2.5.1, 3.0.0)" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.6", + "contentHash": "f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "dXMIIztipcAyL3a19gtUrih/RLrE33/4VJdICoinYqIXXo1KLtsMPsaQ9dO2pE8xajDguwE2kqVbBqE5/EoJ0Q==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "5PKRexYlvufWFdXenRcRGKqvaJBBZFJZpqUGlUs9p13eKEgVdOrLpkPknjzUvLY5kEUicK9871DIUDcCPA6AXA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "++CtT8daIf6qfieQev/8V88U3zViIDWou5cj+oWps1/Hf73UoaY/L0hKyi3v7Zlt3BmbU0pUc73zCB1GiB4nYA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "XyPMcQRsnUQLhmBBRRgYWsuPc8TyiANzcXtqfzyWfDpPuyh3Q0K4oWozZYQKZRNGnqJ97ifD6qUDWhsEEe32uw==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.5.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.5.1", + "Microsoft.Testing.Platform": "2.5.1", + "Microsoft.Testing.Platform.MSBuild": "2.5.1", + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.inproc.console": "[4.0.2]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "ARTt+pGyd86mdtiFBkKpyBQvRC3u0rr8oidBlII2GsAg7D6TfOsDFCsoQtFij83V5pE57m3whUIqT4xjiARXbQ==", + "dependencies": { + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "YlYKVhTJVcwEgJ6rm59Pjf71lQqKwKxEHqVRxWUuwrwm/nxB/mNFP/lP4vlntDO3GclNnLT9BjYOpJH9gViGQg==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "System.Security.AccessControl": "[6.0.1]", + "xunit.v3.common": "[4.0.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "cg4XNpCN4Ry9nswutknpreN3ckSUBwtjMRmEQSNK/sIKPo6KN5tDGGGCaHDm5HGA4yFVVtTJX65tLCsZArUNfQ==", + "dependencies": { + "xunit.v3.extensibility.core": "[4.0.2]", + "xunit.v3.runner.common": "[4.0.2]" + } + }, + "cheatengine.client": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Fluent": "[1.1.0, )", + "CheatEngine.Client.Hosting": "[1.1.0, )" + } + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.fluent": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/eng/locks/source/CheatEngine.Client.lock.json b/eng/locks/source/CheatEngine.Client.lock.json new file mode 100644 index 00000000..57a3a85b --- /dev/null +++ b/eng/locks/source/CheatEngine.Client.lock.json @@ -0,0 +1,207 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.CodeAnalysis.PublicApiAnalyzers": { + "type": "Direct", + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "W4kJGezNIKLzo0Ak5FAQDFvkMf2U7DtGL4THmHyRSApfKsKt5V+eX/bU0ZLKAt/uf9Bb2o1bi0YDKj/GRB/vYQ==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.13, )", + "resolved": "10.0.13", + "contentHash": "40yrBMsLEcjixBR4G+FiUaBPvxXIPSKJ2OgSrbOZcmSDBda4Sb0k7BWrfDpIvn3IvvDzwOL/tEPa6gDQfh6aRw==" + }, + "Microsoft.Sbom.Targets": { + "type": "Direct", + "requested": "[4.1.13, )", + "resolved": "4.1.13", + "contentHash": "l9NiCqVmBBY06Lrxv61xWtiLvU1feto6j7QmMsaARBopO+QLTFDFLEIbYe8pYGjk1INJ2eWE/GGjToqQpokYAw==" + }, + "MinVer": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AJy/KVjXgUbgjf6HiI8wAk4DSSq0SCmvXQF8aU6IB+pnIQq+YJvofvMczug2hqO8yEvnQY557ryew66KPpyCsA==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" + }, + "cheatengine.client.abstractions": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.core": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )" + } + }, + "cheatengine.client.extensions.dependencyinjection": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )", + "CheatEngine.Client.Core": "[1.1.0, )", + "Microsoft.Extensions.Configuration.Abstractions": "[10.0.12, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.12, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.12, )" + } + }, + "cheatengine.client.fluent": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Abstractions": "[1.1.0, )" + } + }, + "cheatengine.client.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0, )", + "CheatEngine.SDK.Engine": "[1.0.0, )", + "CheatEngine.SDK.Hosting": "[1.0.0, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.12, )", + "Microsoft.Extensions.Logging": "[10.0.12, )" + } + }, + "cheatengine.sdk.abi": { + "type": "Project" + }, + "cheatengine.sdk.annotations": { + "type": "Project" + }, + "cheatengine.sdk.engine": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.hosting": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Abi": "[1.0.0, )", + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua": { + "type": "Project", + "dependencies": { + "CheatEngine.SDK.Annotations": "[1.0.0, )", + "CheatEngine.SDK.Lua.Interop": "[1.0.0, )" + } + }, + "cheatengine.sdk.lua.interop": { + "type": "Project" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "CentralTransitive", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "rPqU/cnDMmL4Gx7sglNnYwh/upWxSLTwVe0ysT88WH9HEE3OfZgaT7TyM86C4GeXwDsDQaj95fUGL5jEB3vxng==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" + } + } + } + } +} \ No newline at end of file diff --git a/externals/CheatEngine.SDK b/externals/CheatEngine.SDK new file mode 160000 index 00000000..524979c2 --- /dev/null +++ b/externals/CheatEngine.SDK @@ -0,0 +1 @@ +Subproject commit 524979c2d5f9de984afd95a4dbebebc92f2ae894 diff --git a/global.json b/global.json index 6a239c07..961d9d08 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "10.0.401", + "version": "10.0.402", "rollForward": "disable", "allowPrerelease": false, - "errorMessage": "CheatEngine.Client builds only with .NET SDK 10.0.401 exactly (global.json rollForward: disable, NuGet lock files). Install it with: winget install Microsoft.DotNet.SDK.10 --version 10.0.401" + "errorMessage": "CheatEngine.Client builds only with .NET SDK 10.0.402 exactly (global.json rollForward: disable, NuGet lock files). Install it with: winget install Microsoft.DotNet.SDK.10 --version 10.0.402" }, "test": { "runner": "Microsoft.Testing.Platform" diff --git a/libs/CheatEngine.Client.Abstractions/Modules/ICheatEngineClientModuleDeactivationNotification.cs b/libs/CheatEngine.Client.Abstractions/Modules/ICheatEngineClientModuleDeactivationNotification.cs new file mode 100644 index 00000000..d4c958b0 --- /dev/null +++ b/libs/CheatEngine.Client.Abstractions/Modules/ICheatEngineClientModuleDeactivationNotification.cs @@ -0,0 +1,18 @@ +namespace CheatEngine.Client.Modules; + +/// Finalizes session-long module state after module shutdown callbacks complete. +/// +/// Implementable. Applications implement this callback and Hosting supplies the stopping Client. +/// Its members are frozen for the 1.x line. +/// Hosting invokes this after every module's callback and before +/// it releases module-owned or Client-owned resources. It runs inside the activation's synchronous cleanup scope, +/// after was cancelled. Implementations may finalize persistent +/// presentation or state that already exists for this activation, but must not create resources, attach, or use the +/// ordinary Client Lua facade. Failures are isolated from notification peers and later resource cleanup. +/// +public interface ICheatEngineClientModuleDeactivationNotification +{ + /// Finalizes persistent module state for the stopping activation. + /// The Client activation that is stopping. + public void OnDeactivated(ICheatEngineClient client); +} diff --git a/libs/CheatEngine.Client.Abstractions/Modules/ICheatEngineClientResourceCleanup.cs b/libs/CheatEngine.Client.Abstractions/Modules/ICheatEngineClientResourceCleanup.cs new file mode 100644 index 00000000..6093b765 --- /dev/null +++ b/libs/CheatEngine.Client.Abstractions/Modules/ICheatEngineClientResourceCleanup.cs @@ -0,0 +1,18 @@ +namespace CheatEngine.Client.Modules; + +/// Releases resources owned by a Client module as its activation ends. +/// +/// Implementable. Applications implement this callback and Hosting supplies the stopping Client. +/// Its members are frozen for the 1.x line. +/// Hosting invokes this after every module's callback and before +/// it drains Client-owned leases. It runs inside the activation's synchronous cleanup scope, after +/// was cancelled. Implementations should release only resources they own, +/// use the Client dispatcher for main-thread work, and must not create new resources. The Client Lua facade remains +/// unavailable during this stage. +/// +public interface ICheatEngineClientResourceCleanup +{ + /// Releases this module's owned resources before the activation drains Client-owned leases. + /// The Client activation that is stopping. + public void OnReleasingResources(ICheatEngineClient client); +} diff --git a/libs/CheatEngine.Client.Abstractions/PublicAPI.Unshipped.txt b/libs/CheatEngine.Client.Abstractions/PublicAPI.Unshipped.txt index 7dc5c581..8bf2faea 100644 --- a/libs/CheatEngine.Client.Abstractions/PublicAPI.Unshipped.txt +++ b/libs/CheatEngine.Client.Abstractions/PublicAPI.Unshipped.txt @@ -1 +1,5 @@ #nullable enable +CheatEngine.Client.Modules.ICheatEngineClientModuleDeactivationNotification +CheatEngine.Client.Modules.ICheatEngineClientModuleDeactivationNotification.OnDeactivated(CheatEngine.Client.ICheatEngineClient! client) -> void +CheatEngine.Client.Modules.ICheatEngineClientResourceCleanup +CheatEngine.Client.Modules.ICheatEngineClientResourceCleanup.OnReleasingResources(CheatEngine.Client.ICheatEngineClient! client) -> void diff --git a/libs/CheatEngine.Client.Abstractions/README.md b/libs/CheatEngine.Client.Abstractions/README.md index 9a7f5402..8091b36c 100644 --- a/libs/CheatEngine.Client.Abstractions/README.md +++ b/libs/CheatEngine.Client.Abstractions/README.md @@ -992,7 +992,7 @@ This charter is normative for every public type of the seven Client packages; th The documentation of every public interface says whether it is **Call-only** (the Client implements it and applications call it; a 1.x minor release can add members, so implement it only in a test double) or **Implementable** (applications implement it and the Client calls it; its members are frozen for 1.x): `ILuaModule`, -`ILuaOperation`, `ILuaResultMapper`, `IMemoryCodec` and `ICheatEngineClientModule`. +`ILuaOperation`, `ILuaResultMapper`, `IMemoryCodec`, `ICheatEngineClientModule`, `ICheatEngineClientModuleDeactivationNotification` and `ICheatEngineClientResourceCleanup`. ### CheatEngine.SDK types in public signatures diff --git a/libs/CheatEngine.Client.Hosting/CheatEngineClientPlugin.cs b/libs/CheatEngine.Client.Hosting/CheatEngineClientPlugin.cs index d751ccc5..ca621285 100644 --- a/libs/CheatEngine.Client.Hosting/CheatEngineClientPlugin.cs +++ b/libs/CheatEngine.Client.Hosting/CheatEngineClientPlugin.cs @@ -110,7 +110,12 @@ protected virtual void OnClientDisabling(ICheatEngineClient client) /// The activation failed and its rollback failed too: the activation failure comes first, then every rollback /// failure. A failure whose rollback succeeded is rethrown unchanged. /// - protected sealed override void OnEnable() + protected sealed override void OnEnable() => EnableActivation(signalSdkRollback: true); + + /// Runs activation for Hosting tests that do not initialize the SDK plugin host. + internal void EnableForHostingTest() => EnableActivation(signalSdkRollback: false); + + private void EnableActivation(bool signalSdkRollback) { if (Volatile.Read(ref _activation) is not null) { @@ -135,6 +140,11 @@ protected sealed override void OnEnable() } catch (Exception enableFailure) { + if (signalSdkRollback) + { + BeginFailedEnableRollback(); + } + if (activation is null) { RethrowAfterCleanup(enableFailure, CleanupUnpublishedActivation(construction)); @@ -263,7 +273,7 @@ private static List CleanupUnpublishedActivation(ActivationConstructi /// Closes an activation in the only safe disposal order and collects every cleanup failure. /// - /// Module callbacks and Client-owned Cheat Engine resources run while the SDK context is valid. The activation scope, + /// Module callbacks, persistent-state notifications, module-owned resources and Client-owned Cheat Engine resources run while the SDK context is valid. The activation scope, /// root provider, and configuration are then released in that order. Each stage is attempted even after an earlier /// stage fails, allowing the caller to report one aggregate failure only after all owned resources had a cleanup /// opportunity. Each failed stage is logged with its stable stage name and the exception type name only (Q43, @@ -279,6 +289,8 @@ private List CleanupActivation(Activation activation) using (activation.Cleanup.EnterCleanupScope()) { report.Record(CleanupStage.ModuleCallbacks, activation.Lifecycle.Cleanup(OnClientDisabling)); + report.Record(CleanupStage.ModuleNotifications, activation.Lifecycle.NotifyDeactivated()); + report.Record(CleanupStage.ModuleResources, activation.Lifecycle.ReleaseOwnedResources()); report.Run(CleanupStage.ClientResources, activation.Cleanup.DrainOwnedResourcesForDisable); } } @@ -415,6 +427,8 @@ private enum CleanupStage { CleanupScope, ModuleCallbacks, + ModuleNotifications, + ModuleResources, ClientResources, Scope, Provider, @@ -498,6 +512,8 @@ private static string GetName(CleanupStage stage) { CleanupStage.CleanupScope => "CleanupScope", CleanupStage.ModuleCallbacks => "ModuleCallbacks", + CleanupStage.ModuleNotifications => "ModuleNotifications", + CleanupStage.ModuleResources => "ModuleResources", CleanupStage.ClientResources => "ClientResources", CleanupStage.Scope => "Scope", CleanupStage.Provider => "Provider", diff --git a/libs/CheatEngine.Client.Hosting/ClientActivationLifecycle.cs b/libs/CheatEngine.Client.Hosting/ClientActivationLifecycle.cs index d416da1b..773dc833 100644 --- a/libs/CheatEngine.Client.Hosting/ClientActivationLifecycle.cs +++ b/libs/CheatEngine.Client.Hosting/ClientActivationLifecycle.cs @@ -12,6 +12,8 @@ internal sealed class ClientActivationLifecycle private readonly ICheatEngineClient _client; private readonly ICheatEngineClientModule[] _modules; private bool _cleanupStarted; + private bool _notificationStarted; + private bool _resourceCleanupStarted; private bool _clientEnableHookEntered; private int _enabledModuleCount; @@ -82,4 +84,64 @@ internal List Cleanup(Action onClientDisabling) return failures; } + + /// Finalizes enabled modules' persistent state in reverse order before owned resources are released. + internal List NotifyDeactivated() + { + if (_notificationStarted) + { + return []; + } + + _notificationStarted = true; + List failures = []; + for (int index = _enabledModuleCount - 1; index >= 0; index--) + { + if (_modules[index] is not ICheatEngineClientModuleDeactivationNotification notification) + { + continue; + } + + try + { + notification.OnDeactivated(_client); + } + catch (Exception exception) + { + failures.Add(exception); + } + } + + return failures; + } + + /// Releases enabled modules' owned resources in reverse order before Client leases are drained. + internal List ReleaseOwnedResources() + { + if (_resourceCleanupStarted) + { + return []; + } + + _resourceCleanupStarted = true; + List failures = []; + for (int index = _enabledModuleCount - 1; index >= 0; index--) + { + if (_modules[index] is not ICheatEngineClientResourceCleanup owner) + { + continue; + } + + try + { + owner.OnReleasingResources(_client); + } + catch (Exception exception) + { + failures.Add(exception); + } + } + + return failures; + } } diff --git a/libs/CheatEngine.Client.Hosting/README.md b/libs/CheatEngine.Client.Hosting/README.md index 8b52a4b4..8a1701b3 100644 --- a/libs/CheatEngine.Client.Hosting/README.md +++ b/libs/CheatEngine.Client.Hosting/README.md @@ -70,9 +70,10 @@ On enable, `CheatEngineClientPlugin` calls `Configure`, builds a provider with ` resolves options to force validation, resolves the Client, starts registered modules in registration order, and then calls `OnClientEnabled`. -On disable—or if activation fails—the host invokes `OnClientDisabling` and module cleanup in reverse order, drains -Client-owned Cheat Engine resources while the SDK context remains valid, disposes the scope and provider, and finally -disposes activation configuration. Cleanup failures are aggregated after all cleanup opportunities have run. +On disable—or if activation fails—the host invokes `OnClientDisabling`, finalizes persistent module state, and releases +module-owned resources in reverse order, then drains Client-owned Cheat Engine resources while the SDK context remains +valid, disposes the scope and provider, and finally disposes activation configuration. Cleanup failures are aggregated +after all cleanup opportunities have run. ## Composition lifetime and DI ownership @@ -159,6 +160,16 @@ public sealed class MyClientModule : ICheatEngineClientModule } ``` +An activation module that keeps session-long presentation or state can implement +`ICheatEngineClientModuleDeactivationNotification`. Hosting invokes `OnDeactivated` after all `OnDisabling` callbacks and +before module-owned resources are released. It is for finalizing already-existing persistent state, never creating a +resource or invoking the ordinary Client Lua facade. Its failures are collected independently. + +An activation module that owns effects which must be released before Client leases drain can also implement +`ICheatEngineClientResourceCleanup`. Hosting invokes `OnReleasingResources` after deactivation notifications and before +the Client-owned resource drain. Its failures are collected independently so later modules and Client leases still get +their cleanup opportunity. The normal Client Lua facade remains unavailable during this stage. + ## Build diagnostics Plugin projects must reference `CheatEngine.SDK` directly as well as `CheatEngine.Client`. The SDK's plugin entry-point @@ -215,10 +226,12 @@ while the plugin is disabled; destination files are individually never copied in ## Cleanup diagnostics and redaction Disable runs every cleanup stage even after an earlier stage fails, in this order: `CleanupScope` (the main-thread -cleanup scope), `ModuleCallbacks` (application hook, then modules in reverse order), `ClientResources` (Client-owned -Cheat Engine resources, while the SDK context is still attached), then `Scope`, `Provider`, and `Configuration`. One -failure is rethrown unchanged; several are reported together as one `AggregateException` in attempt order. Core applies -the same rule to its own resource registries, so a faulty module or lease never prevents the next release. +cleanup scope), `ModuleCallbacks` (application hook, then modules in reverse order), `ModuleNotifications` (persistent +module-state finalization, in reverse module order), `ModuleResources` (module-owned resources, in reverse module +order), `ClientResources` (Client-owned Cheat Engine resources, while the SDK context is still attached), then `Scope`, +`Provider`, and `Configuration`. One failure is rethrown unchanged; several are reported +together as one `AggregateException` in attempt order. Core applies the same rule to its own resource registries, so a +faulty module or lease never prevents the next release. Once per enable, before the modules start, event 20 (`ActivationIdentified`, Information) identifies the activation: epoch, plugin type name, CheatEngine.Client version, the consumed CheatEngine.SDK version and NuGet content hash diff --git a/src/CheatEngine.Client/README.md b/src/CheatEngine.Client/README.md index 9880a1ab..ee1f49f6 100644 --- a/src/CheatEngine.Client/README.md +++ b/src/CheatEngine.Client/README.md @@ -218,7 +218,8 @@ dependency of `CheatEngine.Client.Extensions.DependencyInjection`. ending in `Kind`, `Status`, `State`, `Effect` or `Scope`) has `Unknown = 0`: handle a value you do not recognize like `Unknown`. An option enum has a valid default at 0 and never an outcome suffix. - **Frozen for all of 1.x:** the *Implementable* interfaces (`ILuaModule`, `ILuaOperation`, - `ILuaResultMapper`, `IMemoryCodec` and `ICheatEngineClientModule`) never gain, lose or change a + `ILuaResultMapper`, `IMemoryCodec`, `ICheatEngineClientModule`, + `ICheatEngineClientModuleDeactivationNotification` and `ICheatEngineClientResourceCleanup`) never gain, lose or change a member. - **Experimental APIs**, marked `[Experimental("CECLIENT500x")]`, can change or be removed in a minor release until their live qualification passes; using one is an explicit opt-in to that diagnostic. diff --git a/tests/CheatEngine.Client.AotProbe/CheatEngine.Client.AotProbe.csproj b/tests/CheatEngine.Client.AotProbe/CheatEngine.Client.AotProbe.csproj index 45733d3e..9dfa0ea5 100644 --- a/tests/CheatEngine.Client.AotProbe/CheatEngine.Client.AotProbe.csproj +++ b/tests/CheatEngine.Client.AotProbe/CheatEngine.Client.AotProbe.csproj @@ -15,4 +15,6 @@ ReferenceOutputAssembly="false"/> + + diff --git a/tests/CheatEngine.Client.Core.Tests/Domains/RuntimeClientTests.cs b/tests/CheatEngine.Client.Core.Tests/Domains/RuntimeClientTests.cs index 7bae30a0..9a07183f 100644 --- a/tests/CheatEngine.Client.Core.Tests/Domains/RuntimeClientTests.cs +++ b/tests/CheatEngine.Client.Core.Tests/Domains/RuntimeClientTests.cs @@ -648,17 +648,25 @@ public void PackageGateIsUnknownWithoutEmbeddedIdentity() } [Fact] - public void TheIdentityOfThisBuildMatchesTheLoadedSdkPackage() + public void TheIdentityOfThisBuildMatchesTheLoadedSdkDependency() { - // The Core assembly under test embeds the identity of its locked and restored CheatEngine.SDK package (a - // build that cannot embed it fails with CHEATENGINECLIENT9050), and the test process loads that package, so - // the production identity is embedded and Satisfied. + // Source builds embed the exact version and commit from the pinned SDK project. Production builds embed the + // reviewed package identity; both must match the Engine assembly loaded by the test process. ConsumedSdkIdentity current = ConsumedSdkIdentity.Current; Assert.True(current.IsEmbedded, "The Core assembly under test embeds no consumed CheatEngine.SDK identity."); Assert.Equal(ClientCapabilityEvidenceState.Satisfied, current.PackageGate.State); Assert.True(current.ExactReviewedIdentity); - Assert.Equal("the reviewed package", current.IdentityLabel); + if (current.IsSource) + { + Assert.Null(current.ContentHashSha512); + Assert.Equal("the consumed source build", current.IdentityLabel); + } + else + { + Assert.Equal(SdkContentHash, current.ContentHashSha512); + Assert.Equal("the reviewed package", current.IdentityLabel); + } Assert.Equal(typeof(RuntimeInfo).Assembly .GetCustomAttributes(typeof(System.Reflection.AssemblyInformationalVersionAttribute), false) .Cast().Single().InformationalVersion, diff --git a/tests/CheatEngine.Client.Hosting.Tests/CheatEngineClientPluginTests.cs b/tests/CheatEngine.Client.Hosting.Tests/CheatEngineClientPluginTests.cs index 84866436..18c27019 100644 --- a/tests/CheatEngine.Client.Hosting.Tests/CheatEngineClientPluginTests.cs +++ b/tests/CheatEngine.Client.Hosting.Tests/CheatEngineClientPluginTests.cs @@ -62,7 +62,7 @@ public void EnableThenDisableUsesOneScopedClientLifecycleAndReleasesCleanupResou FakeClient client = new(42); RecordingCleanup cleanup = new(events); TestPlugin plugin = CreatePlugin(events, client, cleanup, - static builder => builder.Client.AddModule()); + static builder => builder.Client.AddModule()); plugin.EnableForTest(); @@ -76,7 +76,7 @@ public void EnableThenDisableUsesOneScopedClientLifecycleAndReleasesCleanupResou Assert.Equal( [ "configure", "module.enabled", "client.enabled", "cleanup.enter", "client.disabling", - "module.disabling", "cleanup.drain", "cleanup.exit" + "module.disabling", "module.deactivated", "module.resources", "cleanup.drain", "cleanup.exit" ], events); Assert.Equal(1, cleanup.DrainCount); @@ -112,6 +112,32 @@ public void FailedModuleEnableRollsBackAllEnteredModulesAndLeavesThePluginInacti Assert.Equal(1, cleanup.DrainCount); } + [Fact] + public void FailedModuleEnableStillNotifiesAndReleasesResourcesWhenBothCleanupHooksFail() + { + List events = []; + FakeClient client = new(44); + RecordingCleanup cleanup = new(events); + TestPlugin plugin = CreatePlugin(events, client, cleanup, + static builder => builder.Client.AddModule()); + + AggregateException exception = Assert.Throws(plugin.EnableForTest); + + Assert.Collection(exception.InnerExceptions, + failure => Assert.Equal("module enable", failure.Message), + failure => Assert.Equal("module notification", failure.Message), + failure => Assert.Equal("module resources", failure.Message)); + Assert.Equal( + [ + "configure", "module.enable-failed", "cleanup.enter", "module.disabling", + "module.deactivated", "module.resources", "cleanup.drain", "cleanup.exit" + ], events); + Assert.Throws(plugin.GetRequiredClientForTest); + plugin.DisableForTest(); + Assert.Equal(1, cleanup.DrainCount); + Assert.Equal(1, cleanup.ScopeDisposeCount); + } + [Fact] public void DefaultApplicationCallbacksParticipateInTheActivationLifecycle() { @@ -208,6 +234,30 @@ public void DisableAggregatesApplicationModuleAndResourceCleanupFailures() Assert.Equal(1, cleanup.DrainCount); } + [Fact] + [Trait("Qualification", "Q43")] + public void DisableAggregatesDeactivationNotificationFailuresBeforeResourceCleanup() + { + List events = []; + FakeClient client = new(451); + RecordingCleanup cleanup = new(events); + TestPlugin plugin = CreatePlugin(events, client, cleanup, + static builder => builder.Client.AddModule().AddModule()); + plugin.EnableForTest(); + + InvalidOperationException exception = Assert.Throws(plugin.DisableForTest); + + Assert.Equal("module notification", exception.Message); + Assert.Equal( + [ + "configure", "notification.enabled", "module.enabled", "client.enabled", "cleanup.enter", + "client.disabling", "module.disabling", "notification.disabling", "module.deactivated", + "notification.deactivated", "module.resources", "cleanup.drain", "cleanup.exit" + ], + events); + Assert.Equal(1, cleanup.DrainCount); + } + [Fact] public void ConfigureFailureDoesNotPublishAnActivation() { @@ -402,7 +452,7 @@ public void DisableAttemptsEveryStageAndLogsEachFailedStageWithoutExceptionMessa AggregateException exception = Assert.Throws(plugin.DisableForTest); - Assert.Equal(2, exception.InnerExceptions.Count); + Assert.Equal(3, exception.InnerExceptions.Count); Assert.Equal(1, cleanup.DrainCount); Assert.Equal(1, cleanup.ScopeDisposeCount); Assert.Contains("cleanup.exit", events); @@ -411,11 +461,14 @@ public void DisableAttemptsEveryStageAndLogsEachFailedStageWithoutExceptionMessa module => Assert.Equal( "Cheat Engine Client activation 51 cleanup stage ModuleCallbacks failed with System.InvalidOperationException.", module.Message), + resourceCleanup => Assert.Equal( + "Cheat Engine Client activation 51 cleanup stage ModuleResources failed with System.InvalidOperationException.", + resourceCleanup.Message), drain => Assert.Equal( "Cheat Engine Client activation 51 cleanup stage ClientResources failed with System.InvalidOperationException.", drain.Message)); LogEntry completed = Assert.Single(logs.Entries, static entry => entry.EventId == 7); - Assert.Equal("Cheat Engine Client activation 51 attempted 6 cleanup stage(s); 2 failed.", completed.Message); + Assert.Equal("Cheat Engine Client activation 51 attempted 8 cleanup stage(s); 3 failed.", completed.Message); Assert.Contains(logs.Entries, static entry => entry.EventId == 5); Assert.All(logs.Entries, static entry => { @@ -475,12 +528,17 @@ public void EnableLogsOneIdentificationEventWithoutPaths() Assert.Null(identification.Exception); Assert.Contains("activation 53 enables " + typeof(TestPlugin).FullName, message, StringComparison.Ordinal); Assert.Contains("CheatEngine.SDK " + GetConsumedSdkMetadata("Version"), message, StringComparison.Ordinal); - Assert.Contains("NuGet content hash " + GetConsumedSdkMetadata("ContentHashSha512"), message, + bool sourceSdk = System.Reflection.Assembly.Load("CheatEngine.Client.Core") + .GetCustomAttributes() + .Any(static attribute => attribute.Key == "CheatEngine.Client.ConsumedSdk.Kind" && attribute.Value == "source"); + string contentHash = sourceSdk ? "unknown" : GetConsumedSdkMetadata("ContentHashSha512"); + Assert.Contains("NuGet content hash " + contentHash, message, StringComparison.Ordinal); - // The test process loads the reviewed package itself, so the identity label, built from versions only, says so. + // Workspace tests load the source SDK; standalone package tests load the reviewed package. string loaded = typeof(CheatEngine.SDK.Engine.Runtime.RuntimeInfo).Assembly .GetCustomAttribute()!.InformationalVersion; - Assert.Contains($"loaded CheatEngine.SDK.Engine {loaded} (the reviewed package), package evidence Satisfied;", + string identityLabel = sourceSdk ? "the consumed source build" : "the reviewed package"; + Assert.Contains($"loaded CheatEngine.SDK.Engine {loaded} ({identityLabel}), package evidence Satisfied;", message, StringComparison.Ordinal); Assert.Contains("supported host profile ce-7.7.0.10621-x64-managed-hostfxr.", message, StringComparison.Ordinal); Assert.DoesNotMatch(@"[A-Za-z]:\\", message); @@ -734,7 +792,7 @@ protected override void OnClientDisabling(ICheatEngineClient client) internal void EnableForTest() { - OnEnable(); + EnableForHostingTest(); } internal void DisableForTest() @@ -757,7 +815,7 @@ protected override void Configure(CheatEnginePluginBuilder builder) internal void EnableForTest() { - OnEnable(); + EnableForHostingTest(); } internal void DisableForTest() @@ -784,6 +842,50 @@ public void OnDisabling(ICheatEngineClient client) } } + public sealed class ResourceCleanupModule(List events) + : ICheatEngineClientModule, ICheatEngineClientModuleDeactivationNotification, ICheatEngineClientResourceCleanup + { + public void OnEnabled(ICheatEngineClient client) + { + events.Add("module.enabled"); + } + + public void OnDisabling(ICheatEngineClient client) + { + events.Add("module.disabling"); + } + + public void OnDeactivated(ICheatEngineClient client) + { + events.Add("module.deactivated"); + } + + public void OnReleasingResources(ICheatEngineClient client) + { + events.Add("module.resources"); + } + } + + public sealed class FailingNotificationModule(List events) + : ICheatEngineClientModule, ICheatEngineClientModuleDeactivationNotification + { + public void OnEnabled(ICheatEngineClient client) + { + events.Add("notification.enabled"); + } + + public void OnDisabling(ICheatEngineClient client) + { + events.Add("notification.disabling"); + } + + public void OnDeactivated(ICheatEngineClient client) + { + events.Add("notification.deactivated"); + throw new InvalidOperationException("module notification"); + } + } + public sealed class FailingEnableModule(List events) : ICheatEngineClientModule { public void OnEnabled(ICheatEngineClient client) @@ -798,6 +900,33 @@ public void OnDisabling(ICheatEngineClient client) } } + public sealed class FailingEnableCleanupModule(List events) : ICheatEngineClientModule, + ICheatEngineClientModuleDeactivationNotification, ICheatEngineClientResourceCleanup + { + public void OnEnabled(ICheatEngineClient client) + { + events.Add("module.enable-failed"); + throw new InvalidOperationException("module enable"); + } + + public void OnDisabling(ICheatEngineClient client) + { + events.Add("module.disabling"); + } + + public void OnDeactivated(ICheatEngineClient client) + { + events.Add("module.deactivated"); + throw new InvalidOperationException("module notification"); + } + + public void OnReleasingResources(ICheatEngineClient client) + { + events.Add("module.resources"); + throw new InvalidOperationException("module resources"); + } + } + public sealed class FailingDisableModule(List events) : ICheatEngineClientModule { public void OnEnabled(ICheatEngineClient client) @@ -1092,7 +1221,8 @@ public void Dispose() public sealed record SensitiveFailure(string Message); - public sealed class SensitiveDisableModule(List events, SensitiveFailure failure) : ICheatEngineClientModule + public sealed class SensitiveDisableModule(List events, SensitiveFailure failure) + : ICheatEngineClientModule, ICheatEngineClientResourceCleanup { public void OnEnabled(ICheatEngineClient client) { @@ -1104,6 +1234,12 @@ public void OnDisabling(ICheatEngineClient client) events.Add("module.disabling"); throw new InvalidOperationException(failure.Message); } + + public void OnReleasingResources(ICheatEngineClient client) + { + events.Add("module.resources"); + throw new InvalidOperationException(failure.Message); + } } public sealed class OptionsProbe diff --git a/tests/CheatEngine.Client.Hosting.Tests/ClientActivationLifecycleTests.cs b/tests/CheatEngine.Client.Hosting.Tests/ClientActivationLifecycleTests.cs index 8118cb6d..1a33148a 100644 --- a/tests/CheatEngine.Client.Hosting.Tests/ClientActivationLifecycleTests.cs +++ b/tests/CheatEngine.Client.Hosting.Tests/ClientActivationLifecycleTests.cs @@ -103,6 +103,52 @@ public void CleanupContinuesAfterFailuresAndIsIdempotent() events); } + [Fact] + public void CleanupReleasesModuleResourcesInReverseOrderBeforeReturningEachFailure() + { + List events = []; + ClientActivationLifecycle lifecycle = CreateLifecycle(events, out _, + new RecordingResourceModule("first", events), + new RecordingResourceModule("second", events, new InvalidOperationException("second resources"))); + lifecycle.Enable(_ => events.Add("application.enabled")); + + Assert.Empty(lifecycle.Cleanup(_ => events.Add("application.disabling"))); + List failures = lifecycle.ReleaseOwnedResources(); + List repeatedFailures = lifecycle.ReleaseOwnedResources(); + + Assert.Collection(failures, failure => Assert.Equal("second resources", failure.Message)); + Assert.Empty(repeatedFailures); + Assert.Equal( + [ + "first.enabled", "second.enabled", "application.enabled", "application.disabling", "second.disabling", + "first.disabling", "second.resources", "first.resources" + ], + events); + } + + [Fact] + public void DeactivationNotificationsRunInReverseOrderBeforeResourceCleanupAndAreIdempotent() + { + List events = []; + ClientActivationLifecycle lifecycle = CreateLifecycle(events, out _, + new RecordingNotificationModule("first", events), + new RecordingNotificationModule("second", events, new InvalidOperationException("second notification"))); + lifecycle.Enable(_ => events.Add("application.enabled")); + + Assert.Empty(lifecycle.Cleanup(_ => events.Add("application.disabling"))); + List failures = lifecycle.NotifyDeactivated(); + List repeatedFailures = lifecycle.NotifyDeactivated(); + + Assert.Collection(failures, failure => Assert.Equal("second notification", failure.Message)); + Assert.Empty(repeatedFailures); + Assert.Equal( + [ + "first.enabled", "second.enabled", "application.enabled", "application.disabling", "second.disabling", + "first.disabling", "second.notified", "first.notified" + ], + events); + } + private static ClientActivationLifecycle CreateLifecycle( List events, out ICheatEngineClient client, @@ -146,6 +192,56 @@ public void OnDisabling(ICheatEngineClient client) } } + private sealed class RecordingResourceModule( + string name, + List events, + Exception? resourceFailure = null) : ICheatEngineClientModule, ICheatEngineClientResourceCleanup + { + public void OnEnabled(ICheatEngineClient client) + { + events.Add($"{name}.enabled"); + } + + public void OnDisabling(ICheatEngineClient client) + { + events.Add($"{name}.disabling"); + } + + public void OnReleasingResources(ICheatEngineClient client) + { + events.Add($"{name}.resources"); + if (resourceFailure is not null) + { + throw resourceFailure; + } + } + } + + private sealed class RecordingNotificationModule( + string name, + List events, + Exception? notificationFailure = null) : ICheatEngineClientModule, ICheatEngineClientModuleDeactivationNotification + { + public void OnEnabled(ICheatEngineClient client) + { + events.Add($"{name}.enabled"); + } + + public void OnDisabling(ICheatEngineClient client) + { + events.Add($"{name}.disabling"); + } + + public void OnDeactivated(ICheatEngineClient client) + { + events.Add($"{name}.notified"); + if (notificationFailure is not null) + { + throw notificationFailure; + } + } + } + private sealed class FakeClient : ICheatEngineClient { public long Epoch => 42; diff --git a/tests/CheatEngine.Client.LivePlugin.Coexistence/CoexistencePlugin.props b/tests/CheatEngine.Client.LivePlugin.Coexistence/CoexistencePlugin.props index 70ec2763..f2a6b920 100644 --- a/tests/CheatEngine.Client.LivePlugin.Coexistence/CoexistencePlugin.props +++ b/tests/CheatEngine.Client.LivePlugin.Coexistence/CoexistencePlugin.props @@ -24,7 +24,7 @@ restore records the candidate closure in a lock file under obj/ and never rewrites the committed one. Lock files stay enabled, because disabling them while a committed lock file exists fails the restore (NU1005). --> - $(MSBuildProjectExtensionsPath)coexistence-candidate.packages.lock.json + $(MSBuildProjectExtensionsPath)coexistence-candidate.packages.lock.json @@ -35,10 +35,12 @@ ReferenceOutputAssembly="false" PrivateAssets="all"/> - + + + diff --git a/tests/CheatEngine.Client.LivePlugin.Qualification/CheatEngine.Client.LivePlugin.Qualification.csproj b/tests/CheatEngine.Client.LivePlugin.Qualification/CheatEngine.Client.LivePlugin.Qualification.csproj index 4b05beba..9326d43d 100644 --- a/tests/CheatEngine.Client.LivePlugin.Qualification/CheatEngine.Client.LivePlugin.Qualification.csproj +++ b/tests/CheatEngine.Client.LivePlugin.Qualification/CheatEngine.Client.LivePlugin.Qualification.csproj @@ -28,9 +28,11 @@ ReferenceOutputAssembly="false" PrivateAssets="all"/> - + + + diff --git a/tests/CheatEngine.Client.Repository.Tests/Governance/CodeQlWorkflowTests.cs b/tests/CheatEngine.Client.Repository.Tests/Governance/CodeQlWorkflowTests.cs index 5ba57051..de4f88c7 100644 --- a/tests/CheatEngine.Client.Repository.Tests/Governance/CodeQlWorkflowTests.cs +++ b/tests/CheatEngine.Client.Repository.Tests/Governance/CodeQlWorkflowTests.cs @@ -65,7 +65,7 @@ public void TheBuiltProjectReachesEveryShippedAssemblyAndTheSourceGenerator() string include = ((string) reference.Attribute("Include")!).Replace('\\', '/'); if (include is "$(CheatEngineSdkEngineProject)" or "$(CheatEngineSdkHostingProject)") { - // CodeQL builds the package graph. External SDK projects are present only in the explicit workspace mode. + // SDK source belongs to its submodule; this traversal checks Client's own shipped assemblies. Assert.Equal("'$(CheatEngineSdkSourceMode)' == 'true'", (string?) reference.Attribute("Condition")); continue; } diff --git a/tests/CheatEngine.Client.Repository.Tests/Infrastructure/RepositoryRoot.cs b/tests/CheatEngine.Client.Repository.Tests/Infrastructure/RepositoryRoot.cs index f1cf493e..a5cb4f32 100644 --- a/tests/CheatEngine.Client.Repository.Tests/Infrastructure/RepositoryRoot.cs +++ b/tests/CheatEngine.Client.Repository.Tests/Infrastructure/RepositoryRoot.cs @@ -37,6 +37,12 @@ public static IEnumerable EnumerateSourceFiles(string searchPattern) private static bool IsExcluded(string relativePath) { + // Submodules own their build and governance contracts; these tests audit Client's files only. + if (relativePath.StartsWith("externals/", StringComparison.Ordinal)) + { + return true; + } + foreach (string segment in relativePath.Split('/')) { if (segment is "artifacts" or "bin" or "obj" or ".git" or ".idea" or ".vs" or "TestResults") diff --git a/tests/CheatEngine.Client.Repository.Tests/Packaging/SdkPinTests.cs b/tests/CheatEngine.Client.Repository.Tests/Packaging/SdkPinTests.cs index 0a4dbbf8..1dd2d20d 100644 --- a/tests/CheatEngine.Client.Repository.Tests/Packaging/SdkPinTests.cs +++ b/tests/CheatEngine.Client.Repository.Tests/Packaging/SdkPinTests.cs @@ -352,7 +352,8 @@ public void CoexistenceFixturesDeriveTheirSdkVersionFromThePin() Assert.Equal("$(CheatEngineSdkVersion)", version.Value); // An operator-supplied SDK version restores into a lock file under obj/: disabling lock files while the committed // one exists fails the restore with NU1005, and rewriting the committed one would record an unreviewed package. - Assert.Equal("'$(CoexistenceSdkPackageVersion)' != '$(CheatEngineSdkVersion)'", (string?) candidateLock.Attribute("Condition")); + Assert.Equal("'$(CheatEngineSdkSourceMode)' != 'true' and '$(CoexistenceSdkPackageVersion)' != '$(CheatEngineSdkVersion)'", (string?) candidateLock.Attribute("Condition")); + Assert.Equal("'$(CheatEngineSdkSourceMode)' != 'true'", (string?) reference.Attribute("Condition")); Assert.StartsWith("$(MSBuildProjectExtensionsPath)", candidateLock.Value, StringComparison.Ordinal); Assert.Empty(props.Descendants("RestorePackagesWithLockFile")); Assert.Equal("$(CoexistenceSdkPackageVersion)", (string?) reference.Attribute("Version")); diff --git a/tests/CheatEngine.Client.Repository.Tests/Release/ReleaseWorkflowTests.cs b/tests/CheatEngine.Client.Repository.Tests/Release/ReleaseWorkflowTests.cs index f023e4b7..618ba57a 100644 --- a/tests/CheatEngine.Client.Repository.Tests/Release/ReleaseWorkflowTests.cs +++ b/tests/CheatEngine.Client.Repository.Tests/Release/ReleaseWorkflowTests.cs @@ -77,7 +77,8 @@ public void ReleaseCallsCiWithThePackageVersionAndNinetyDayRetentionButNoSonar() Assert.Equal("./.github/workflows/ci.yml", Scalar(ci, "uses")); Assert.Equal("${{ needs.verify.outputs.version }}", Scalar(with, "package-version")); Assert.Equal("90", Scalar(with, "package-retention-days")); - Assert.Equal(2, with.Children.Count); + Assert.Equal("true", Scalar(with, "production-packages")); + Assert.Equal(3, with.Children.Count); Assert.False(ci.Children.ContainsKey(new YamlScalarNode("secrets")), "release.yml must not pass secrets to ci.yml (no Sonar on the release path)."); } diff --git a/tests/CheatEngine.Client.Repository.Tests/Workflows/WorkflowContractTests.cs b/tests/CheatEngine.Client.Repository.Tests/Workflows/WorkflowContractTests.cs index 757c6159..16d57337 100644 --- a/tests/CheatEngine.Client.Repository.Tests/Workflows/WorkflowContractTests.cs +++ b/tests/CheatEngine.Client.Repository.Tests/Workflows/WorkflowContractTests.cs @@ -324,7 +324,7 @@ public void SonarRestoresLockedBeforeScannerBegin() // ---- build-test --------------------------------------------------------------------------------------------------- [Fact] - public void ReleaseLegPacksBeforeTestingAndExportsThePackageSource() + public void ProductionReleasePacksBeforeTestingAndExportsThePackageSource() { WorkflowJob buildTest = WorkflowFile.Load(CiWorkflow).Job("build-test"); IReadOnlyList steps = buildTest.Steps; @@ -335,6 +335,9 @@ public void ReleaseLegPacksBeforeTestingAndExportsThePackageSource() Assert.True(build.Index < pack.Index && pack.Index < test.Index, "build-test must run Build, then Pack, then Test."); Assert.Equal("pack", pack.Id); Assert.Contains("'Release'", pack.Condition ?? string.Empty, StringComparison.Ordinal); + Assert.Contains("inputs.production-packages", pack.Condition ?? string.Empty, StringComparison.Ordinal); + Assert.Equal("inputs.production-packages && 'false' || 'true'", + Yaml.NormalizeExpression(Yaml.Scalar(Yaml.Mapping(buildTest.Node, "env"), "CheatEngineSdkSourceMode"))); Assert.Contains("--no-build", pack.Run, StringComparison.Ordinal); Assert.Contains("manifest.spdx.json", pack.Run, StringComparison.Ordinal); @@ -348,12 +351,13 @@ public void ReleaseLegPacksBeforeTestingAndExportsThePackageSource() } [Fact] - public void DebugLegExcludesPackageConsumptionTestsByTraitNeverBySkip() + public void SourceAndDebugLegsExcludePackageConsumptionTestsByTraitNeverBySkip() { WorkflowStep test = TestStep(); IReadOnlyList tokens = Yaml.Tokens(test.Run); Assert.Contains("Category=PackageConsumption", TraitExclusions(tokens)); + Assert.Contains("$env:PRODUCTION_PACKAGES -ne 'true' -or $env:CONFIGURATION -eq 'Debug'", test.Run, StringComparison.Ordinal); Assert.DoesNotContain("Category=PackageConsumption", TraitExclusions(Yaml.Tokens(SharedTestOptions(test.Run)))); Assert.Equal("on", TokenAfter(tokens, "--fail-skips")); Assert.Equal("CheatEngine.Client.slnx", TokenAfter(tokens, "--solution")); diff --git a/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/CheatEngine.Client.SourceGenerators.Lua.Tests.csproj b/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/CheatEngine.Client.SourceGenerators.Lua.Tests.csproj index 89fd5f1b..c0f3d497 100644 --- a/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/CheatEngine.Client.SourceGenerators.Lua.Tests.csproj +++ b/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/CheatEngine.Client.SourceGenerators.Lua.Tests.csproj @@ -15,16 +15,26 @@ - + + + + + + + + + + + diff --git a/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/Composition/RealSdkGeneratorCompositionTests.cs b/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/Composition/RealSdkGeneratorCompositionTests.cs index f0725ee7..69eb58cd 100644 --- a/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/Composition/RealSdkGeneratorCompositionTests.cs +++ b/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/Composition/RealSdkGeneratorCompositionTests.cs @@ -8,12 +8,12 @@ namespace CheatEngine.Client.SourceGenerators.Lua.Tests.Composition; /// -/// CRIT-07: the Client generator and the real CheatEngine.SDK LuaBindings generator of the pinned package run on the +/// CRIT-07: the Client generator and the real CheatEngine.SDK LuaBindings generator of the selected dependency run on the /// same compilation, and what each emits must compile against what the other emits. The other generator tests replace /// the SDK output with hand-written stubs; this is the proof of the contract between the two generators. /// /// -/// The SDK generator is loaded from +/// Source builds use the SDK submodule generator copied next to the test assembly. Production builds load it from /// $(NuGetPackageRoot)cheatengine.sdk/$(CheatEngineSdkVersion)/analyzers/dotnet/cs, which the test project /// passes as assembly metadata with the pin itself: never a user path. /// @@ -81,14 +81,24 @@ internal static long Run(ILuaClient client) private static readonly Lazy SRun = new(Run, LazyThreadSafetyMode.ExecutionAndPublication); [Fact] - public void TheSdkGeneratorIsLoadedFromThePinnedPackageFolder() + public void TheSdkGeneratorIsLoadedFromTheSelectedDependency() { string directory = SdkGeneratorDirectory(); string[] segments = Path.GetFullPath(directory).TrimEnd(Path.DirectorySeparatorChar) .Split(Path.DirectorySeparatorChar); Assert.True(Path.IsPathFullyQualified(directory), directory); - Assert.Equal(["cheatengine.sdk", Metadata(VersionMetadataKey), "analyzers", "dotnet", "cs"], segments[^5..]); + bool source = typeof(RealSdkGeneratorCompositionTests).Assembly.GetCustomAttributes() + .Any(static attribute => attribute.Key == "CheatEngine.Client.Tests.SdkGeneratorKind" && attribute.Value == "source"); + if (source) + { + Assert.Equal(Path.TrimEndingDirectorySeparator(AppContext.BaseDirectory), + Path.TrimEndingDirectorySeparator(Path.GetFullPath(directory))); + } + else + { + Assert.Equal(["cheatengine.sdk", Metadata(VersionMetadataKey), "analyzers", "dotnet", "cs"], segments[^5..]); + } Assert.True(File.Exists(Path.Combine(directory, "CheatEngine.SDK.SourceGenerators.LuaBindings.dll"))); Assert.True(File.Exists(Path.Combine(directory, "CheatEngine.SDK.SourceGenerators.Shared.dll"))); } diff --git a/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/README.md b/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/README.md index 1f04c133..99aafaf5 100644 --- a/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/README.md +++ b/tests/CheatEngine.Client.SourceGenerators.Lua.Tests/README.md @@ -7,7 +7,7 @@ emits the contracts that Core reserves before mutation. | Folder | What it proves | |---|---| | `EndToEnd/` | C1 execution of the generated module and registrar around the CheatEngine.SDK registration leases (Q16): the test compilation replaces only the generated SDK adapter, whose members are one SDK call each, with one that forwards each call to `FakeLuaGlobals`, a managed double of the SDK admission and registration set, and calls the module's public `Register`/`Unregister`; every decision is the real registrar's. `GeneratedRegistrarMappingTests` proves that the registrar maps every SDK admission status, registration result and release kind, and fails closed. The double compares values by object identity, not by Lua type semantics. A function kept after disable (CRIT-07) runs inside the SDK registration set that the double replaces, so it has no C1 evidence here: `Composition/` and the Q16 host scenario cover it. | -| `Composition/` | CRIT-07: the real CheatEngine.SDK LuaBindings generator of the pinned package, loaded from the restored package folder the test project passes as assembly metadata, runs next to the Client generator; both outputs must compile together, the module must publish through `LuaRegistrationSet`, and integer results must use the refusing SDK marshallers. | +| `Composition/` | CRIT-07: the real CheatEngine.SDK LuaBindings generator built from the pinned submodule (or the reviewed package during production release validation), loaded from the folder the test project passes as assembly metadata, runs next to the Client generator; both outputs must compile together, the module must publish through `LuaRegistrationSet`, and integer results must use the refusing SDK marshallers. | | `Architecture/` | C0 ratchet of the SDK-imposed registration API: the exact list of CheatEngine.SDK members the generated adapter uses, read from the emitted image, and the proof that only the adapter calls CheatEngine.SDK. | | `Diagnostics/` | CECLUA1201-1204 shape diagnostics and the catalog check against `AnalyzerReleases.Unshipped.md` and the generator README (linked into the output). | | `Validation/` | Incremental models (cached on unrelated edits, no Roslyn objects), identifier stability, and the descriptor contract, public projection, registration-call and no-runtime checks kept separate from the golden snapshot. | diff --git a/tests/CheatEngine.Client.Tests/Architecture/PublicApiDocumentationTests.cs b/tests/CheatEngine.Client.Tests/Architecture/PublicApiDocumentationTests.cs index 2d1b19a4..899642f6 100644 --- a/tests/CheatEngine.Client.Tests/Architecture/PublicApiDocumentationTests.cs +++ b/tests/CheatEngine.Client.Tests/Architecture/PublicApiDocumentationTests.cs @@ -94,7 +94,9 @@ public sealed class PublicApiDocumentationTests "CheatEngine.Client.Lua.ILuaOperation`1", "CheatEngine.Client.Lua.ILuaResultMapper`2", "CheatEngine.Client.Memory.IMemoryCodec`1", - "CheatEngine.Client.Modules.ICheatEngineClientModule" + "CheatEngine.Client.Modules.ICheatEngineClientModule", + "CheatEngine.Client.Modules.ICheatEngineClientModuleDeactivationNotification", + "CheatEngine.Client.Modules.ICheatEngineClientResourceCleanup" }; /// diff --git a/tests/CheatEngine.Client.Tests/Architecture/SdkExperimentalApiRatchetTests.cs b/tests/CheatEngine.Client.Tests/Architecture/SdkExperimentalApiRatchetTests.cs index 6e23f0c0..03d880c7 100644 --- a/tests/CheatEngine.Client.Tests/Architecture/SdkExperimentalApiRatchetTests.cs +++ b/tests/CheatEngine.Client.Tests/Architecture/SdkExperimentalApiRatchetTests.cs @@ -66,7 +66,7 @@ private static readonly (string Member, string DiagnosticId)[] ExperimentalFloor private static readonly HashSet SkippedDirectories = new(StringComparer.OrdinalIgnoreCase) { - "artifacts", "bin", "obj", ".git", ".vs", ".idea", "TestResults", "node_modules" + "artifacts", "bin", "obj", ".git", ".vs", ".idea", "TestResults", "node_modules", "externals" }; private static readonly HashSet MsBuildExtensions = new(StringComparer.OrdinalIgnoreCase) diff --git a/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationFixture.cs b/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationFixture.cs index 5f8a620f..40de4920 100644 --- a/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationFixture.cs +++ b/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationFixture.cs @@ -18,9 +18,9 @@ public sealed class LiveQualificationSerialGroup : ICollectionFixture /// Evaluates the opt-in first and does nothing else when it refuses, so an unauthorized run fails in milliseconds -/// with instructions. Only an authorized run initializes the the plugins are -/// built from: the exact packages of CHEATENGINE_CLIENT_PACKAGE_SOURCE, restored in isolated consumers with -/// CheatEngine.SDK from nuget.org. +/// with instructions. This production-artifact qualification requires an explicit +/// CHEATENGINE_CLIENT_PACKAGE_SOURCE; it never self-packs a source checkout or claims source qualification. +/// Only an authorized run with those artifacts initializes the . /// [SupportedOSPlatform("windows")] public sealed class LiveQualificationFixture : IAsyncLifetime diff --git a/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationOptIn.cs b/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationOptIn.cs index 91656d43..88bc115c 100644 --- a/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationOptIn.cs +++ b/tests/CheatEngine.Client.Tests/LiveQualification/LiveQualificationOptIn.cs @@ -48,12 +48,15 @@ internal static class LiveQualificationOptIn /// The commands of a local S0 run, from the repository root, in PowerShell. The README repeats them. internal static readonly string[] LocalCommand = [ + "$env:CheatEngineSdkSourceMode = 'false'", + "dotnet restore CheatEngine.Client.slnx --locked-mode", "dotnet build CheatEngine.Client.slnx -c Release --no-restore", "dotnet pack CheatEngine.Client.slnx -c Release --no-build -o artifacts/nuget", "$env:CHEATENGINE_CLIENT_PACKAGE_SOURCE = (Resolve-Path artifacts/nuget).Path", $"$env:{OptInVariable} = '{Acknowledgement}'", "dotnet test --project tests/CheatEngine.Client.Tests/CheatEngine.Client.Tests.csproj -c Release --no-build --filter-trait Session=S0", - $"Remove-Item Env:{OptInVariable}" + $"Remove-Item Env:{OptInVariable}", + "Remove-Item Env:CheatEngineSdkSourceMode" ]; /// How to run the live qualification tests, appended to every refusal. diff --git a/tests/CheatEngine.Client.Tests/LiveQualification/LiveSandboxSpikeTests.cs b/tests/CheatEngine.Client.Tests/LiveQualification/LiveSandboxSpikeTests.cs index 6323a465..6fb80ee5 100644 --- a/tests/CheatEngine.Client.Tests/LiveQualification/LiveSandboxSpikeTests.cs +++ b/tests/CheatEngine.Client.Tests/LiveQualification/LiveSandboxSpikeTests.cs @@ -14,6 +14,7 @@ namespace CheatEngine.Client.Tests.LiveQualification; /// [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S0")] [SupportedOSPlatform("windows")] public sealed class LiveSandboxSpikeTests(LiveQualificationFixture fixture) diff --git a/tests/CheatEngine.Client.Tests/LiveQualification/LiveSessionTests.cs b/tests/CheatEngine.Client.Tests/LiveQualification/LiveSessionTests.cs index 90af7117..c5b9bfab 100644 --- a/tests/CheatEngine.Client.Tests/LiveQualification/LiveSessionTests.cs +++ b/tests/CheatEngine.Client.Tests/LiveQualification/LiveSessionTests.cs @@ -37,6 +37,7 @@ internal static async Task RunAsync(LiveQualificationFixture fixture, Qualificat /// S1: the x64 core on gtutorial-x86_64. [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S1")] [Trait("Qualification", "Q05")] [Trait("Qualification", "Q16.b")] @@ -70,6 +71,7 @@ public Task X64CoreSessionRecordsItsReceiptsAsync() /// S2: lifecycle and faults, without the Auto Assembler opt-in. [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S2")] [Trait("Qualification", "Q05")] [Trait("Qualification", "Q06")] @@ -90,6 +92,7 @@ public Task LifecycleSessionRecordsItsReceiptsAsync() /// S3: target identity on two gtutorial-x86_64 instances and a file opened as a process. [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S3")] [Trait("Qualification", "Q26")] [Trait("Qualification", "Q28")] @@ -110,6 +113,7 @@ public Task TargetIdentitySessionRecordsItsReceiptsAsync() /// S4: the x86 target gtutorial-i386. [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S4")] [Trait("Qualification", "Q21")] [Trait("Qualification", "Q28")] @@ -127,6 +131,7 @@ public Task X86SessionRecordsItsReceiptsAsync() /// S5: coexistence, in both load orders. [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S5")] [Trait("Qualification", "Q09")] [Trait("Qualification", "Q10")] @@ -150,6 +155,7 @@ public Task NeighbourPluginAPluginBOrderRecordsItsReceiptsAsync() /// S6: the template, instantiated from the packed Templates package. [Collection(LiveQualificationSerialGroup.Name)] [Trait("Category", "LiveQualification")] +[Trait("Category", "PackageConsumption")] [Trait("Session", "S6")] [Trait("Qualification", "Q40")] [SupportedOSPlatform("windows")] diff --git a/tests/CheatEngine.Client.Tests/Packaging/PackagedClientFeedFixture.cs b/tests/CheatEngine.Client.Tests/Packaging/PackagedClientFeedFixture.cs index d91549f9..eb8d6810 100644 --- a/tests/CheatEngine.Client.Tests/Packaging/PackagedClientFeedFixture.cs +++ b/tests/CheatEngine.Client.Tests/Packaging/PackagedClientFeedFixture.cs @@ -519,7 +519,7 @@ private async Task PackRepositoryAsync(string output) { DotNetProcessResult pack = await DotNetProcess.RunAsync(RepositoryLayout.Root, "pack", RepositoryLayout.Combine("CheatEngine.Client.slnx"), "--configuration", "Release", "--output", output, - "-nodeReuse:false"); + "-nodeReuse:false", "-p:CheatEngineSdkSourceMode=false"); _steps.Add(new SmokeStep("self-pack", pack)); if (pack.ExitCode != 0) { diff --git a/tests/CheatEngine.Client.Tests/Packaging/SdkSourceBuildTests.cs b/tests/CheatEngine.Client.Tests/Packaging/SdkSourceBuildTests.cs new file mode 100644 index 00000000..a440fbd9 --- /dev/null +++ b/tests/CheatEngine.Client.Tests/Packaging/SdkSourceBuildTests.cs @@ -0,0 +1,194 @@ +using System.Text.Json.Nodes; +using System.Xml.Linq; + +using CheatEngine.Client.Tests.Infrastructure; + +namespace CheatEngine.Client.Tests.Packaging; + +/// +/// Verifies the evaluated build graph used by normal Client development. These checks do not restore or compile: they +/// prove the source-submodule and production-package modes remain intentionally separate. +/// +public sealed class SdkSourceBuildTests +{ + private const string HostingProject = "libs/CheatEngine.Client.Hosting/CheatEngine.Client.Hosting.csproj"; + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public async Task TransitiveSdkReferencesKeepTheSameBuildConfigurationAsync(string configuration) + { + using TemporaryDirectory directory = new("sdk-transitive-configuration"); + string project = Path.Combine(directory.Path, "Probe.proj"); + XDocument document = new(new XElement("Project", + new XElement("PropertyGroup", new XElement("CheatEngineSdkSourceMode", "true"), + new XElement("Configuration", configuration)), + new XElement("Import", new XAttribute("Project", RepositoryLayout.Combine("Directory.Build.targets"))), + new XElement("Target", new XAttribute("Name", "IncludeTransitiveProjectReferences"), + new XElement("ItemGroup", + new XElement("ProjectReference", new XAttribute("Include", "CheatEngine.SDK.Lua.Interop.csproj"), + new XElement("AdditionalProperties", "Existing=preserved")), + new XElement("ProjectReference", new XAttribute("Include", "Other.csproj")))))); + document.Save(project); + + DotNetProcessResult result = await DotNetProcess.RunAsync(RepositoryLayout.Root, + "msbuild", project, "-target:IncludeTransitiveProjectReferences", "-getItem:ProjectReference", + "-nologo", "-nodeReuse:false", "-verbosity:quiet"); + + Assert.True(result.ExitCode == 0, result.ToString()); + JsonArray references = JsonNode.Parse(result.StandardOutput)!["Items"]!["ProjectReference"]!.AsArray(); + Assert.Equal(2, references.Count); + JsonNode sdk = references[0]!; + Assert.Equal("Platform=AnyCPU", sdk["SetPlatform"]!.GetValue()); + Assert.Equal($"Configuration={configuration}", sdk["SetConfiguration"]!.GetValue()); + Assert.Equal("Existing=preserved;ShouldUnsetParentConfigurationAndPlatform=false", + sdk["AdditionalProperties"]!.GetValue()); + Assert.Null(references[1]!["AdditionalProperties"]); + } + + [Fact] + public async Task StandaloneBuildUsesPinnedSubmoduleAndSeparateSourceLockAsync() + { + JsonObject evaluation = await EvaluateHostingAsync("-p:CheatEngineImportSourceSettings=false"); + + Assert.Equal("true", Property(evaluation, "CheatEngineSdkSourceMode")); + Assert.Equal(RepositoryLayout.Combine("externals/CheatEngine.SDK"), + Path.TrimEndingDirectorySeparator(Path.GetFullPath(Property(evaluation, "CheatEngineSdkSourceRoot")))); + Assert.Equal(RepositoryLayout.Combine("eng/locks/source/CheatEngine.Client.Hosting.lock.json"), + Path.GetFullPath(Property(evaluation, "NuGetLockFilePath"))); + AssertHasProjectReference(evaluation, "CheatEngine.SDK.Engine"); + AssertHasProjectReference(evaluation, "CheatEngine.SDK.Hosting"); + Assert.DoesNotContain("CheatEngine.SDK", PackageReferences(evaluation), StringComparer.OrdinalIgnoreCase); + // Equal effective defaults with different global properties schedule duplicate SDK nodes and race on outputs. + Assert.All(evaluation["Items"]!["ProjectReference"]!.AsArray(), reference => + Assert.Equal("Platform=AnyCPU", reference!["SetPlatform"]!.GetValue())); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SourcePackagingIsRefusedWhileProductionPackagingRemainsAvailableAsync(bool sourceMode) + { + DotNetProcessResult result = await DotNetProcess.RunAsync(RepositoryLayout.Root, + "msbuild", RepositoryLayout.Combine(HostingProject), "-t:CheatEngineClientRefuseSourceDependencyPackage", + "-nologo", "-nodeReuse:false", "-verbosity:minimal", "-p:CheatEngineImportSourceSettings=false", + $"-p:CheatEngineSdkSourceMode={sourceMode.ToString().ToLowerInvariant()}"); + + if (sourceMode) + { + Assert.NotEqual(0, result.ExitCode); + Assert.Contains("error CHEATENGINECLIENT9051", result.StandardOutput, StringComparison.Ordinal); + } + else + { + Assert.True(result.ExitCode == 0, result.ToString()); + } + } + + [Fact] + public async Task ExplicitSdkSourceRootOverridesThePinnedSubmoduleAsync() + { + using TemporaryDirectory directory = new("sdk-source-root-override"); + JsonObject evaluation = await EvaluateHostingAsync("-p:CheatEngineImportSourceSettings=false", + $"-p:CheatEngineSdkSourceRoot={directory.Path}"); + + Assert.Equal("true", Property(evaluation, "CheatEngineSdkSourceMode")); + Assert.Equal(directory.Path, Path.TrimEndingDirectorySeparator(Property(evaluation, "CheatEngineSdkSourceRoot"))); + AssertHasProjectReference(evaluation, "CheatEngine.SDK.Engine"); + AssertHasProjectReference(evaluation, "CheatEngine.SDK.Hosting"); + } + + [Fact] + public async Task ProductionPackageModeUsesSdkPackageAndCommittedLockLocationAsync() + { + JsonObject evaluation = await EvaluateHostingAsync("-p:CheatEngineImportSourceSettings=false", + "-p:CheatEngineSdkSourceMode=false"); + + Assert.Equal("false", Property(evaluation, "CheatEngineSdkSourceMode")); + Assert.Equal(string.Empty, Property(evaluation, "NuGetLockFilePath")); + Assert.DoesNotContain(ProjectReferences(evaluation), reference => + Path.GetFileNameWithoutExtension(reference) is "CheatEngine.SDK.Engine" or "CheatEngine.SDK.Hosting"); + Assert.Contains("CheatEngine.SDK", PackageReferences(evaluation), StringComparer.OrdinalIgnoreCase); + } + + [Fact] + public async Task MissingSdkSubmoduleReportsRecoveryCommandAsync() + { + using TemporaryDirectory directory = new("sdk-source-root-missing"); + DotNetProcessResult result = await DotNetProcess.RunAsync(RepositoryLayout.Root, + "msbuild", RepositoryLayout.Combine(HostingProject), "-t:CheatEngineClientValidateSdkSourceRoot", "-nologo", + "-nodeReuse:false", "-verbosity:minimal", "-p:CheatEngineImportSourceSettings=false", "-p:CheatEngineSdkSourceMode=true", + $"-p:CheatEngineSdkSourceRoot={directory.Path}"); + + Assert.True(result.ExitCode != 0, result.ToString()); + Assert.Contains("error CHEATENGINECLIENT9051", result.StandardOutput, StringComparison.Ordinal); + Assert.Contains("git submodule update --init --recursive", result.StandardOutput, StringComparison.Ordinal); + } + + [Fact] + public void SourceLocksDoNotResolveCheatEngineSdkFromNuGet() + { + string sourceLockDirectory = RepositoryLayout.Combine("eng/locks/source"); + string[] lockFiles = Directory.GetFiles(sourceLockDirectory, "*.lock.json"); + + Assert.NotEmpty(lockFiles); + foreach (string lockFile in lockFiles) + { + JsonObject lockFileRoot = Assert.IsType(JsonNode.Parse(File.ReadAllText(lockFile))); + JsonObject frameworks = Assert.IsType(lockFileRoot["dependencies"]); + foreach (JsonNode? frameworkDependencies in frameworks.Select(entry => entry.Value)) + { + JsonObject dependencies = Assert.IsType(frameworkDependencies); + Assert.DoesNotContain(dependencies, dependency => + string.Equals(dependency.Key, "CheatEngine.SDK", StringComparison.OrdinalIgnoreCase)); + } + } + } + + private static async Task EvaluateHostingAsync(params string[] properties) + { + List arguments = + [ + "msbuild", RepositoryLayout.Combine(HostingProject), + "-getProperty:CheatEngineSdkSourceMode,CheatEngineSdkSourceRoot,NuGetLockFilePath", + "-getItem:ProjectReference,PackageReference", "-nologo", "-nodeReuse:false", "-verbosity:quiet" + ]; + arguments.AddRange(properties); + // Exercise defaults independently of the production workflow's environment-level override. + DotNetProcessResult result = await DotNetProcess.RunAsync(RepositoryLayout.Root, + new Dictionary(StringComparer.Ordinal) { ["CheatEngineSdkSourceMode"] = string.Empty }, [.. arguments]); + Assert.True(result.ExitCode == 0, result.ToString()); + + return Assert.IsType(JsonNode.Parse(result.StandardOutput)); + } + + private static string Property(JsonObject evaluation, string name) + { + return evaluation["Properties"]?[name]?.GetValue() ?? string.Empty; + } + + private static string[] ProjectReferences(JsonObject evaluation) + { + return evaluation["Items"]?["ProjectReference"]?.AsArray() + .Select(item => item?["FullPath"]?.GetValue() ?? string.Empty) + .ToArray() ?? []; + } + + private static string[] PackageReferences(JsonObject evaluation) + { + return Items(evaluation, "PackageReference"); + } + + private static string[] Items(JsonObject evaluation, string name) + { + return evaluation["Items"]?[name]?.AsArray() + .Select(item => item?["Identity"]?.GetValue() ?? string.Empty) + .ToArray() ?? []; + } + + private static void AssertHasProjectReference(JsonObject evaluation, string expectedProjectName) + { + Assert.Contains(ProjectReferences(evaluation), reference => + string.Equals(Path.GetFileNameWithoutExtension(reference), expectedProjectName, StringComparison.Ordinal)); + } +} diff --git a/tests/CheatEngine.Client.Tests/README.md b/tests/CheatEngine.Client.Tests/README.md index c4b16786..aa182688 100644 --- a/tests/CheatEngine.Client.Tests/README.md +++ b/tests/CheatEngine.Client.Tests/README.md @@ -259,12 +259,15 @@ out the S0 spike, whose receipts are never committed. Run it from the repository root, in PowerShell, with Cheat Engine, every gtutorial and DebugView closed: ```powershell +$env:CheatEngineSdkSourceMode = 'false' +dotnet restore CheatEngine.Client.slnx --locked-mode dotnet build CheatEngine.Client.slnx -c Release --no-restore dotnet pack CheatEngine.Client.slnx -c Release --no-build -o artifacts/nuget $env:CHEATENGINE_CLIENT_PACKAGE_SOURCE = (Resolve-Path artifacts/nuget).Path $env:CHEATENGINE_CLIENT_LIVE_QUALIFICATION = 'I_AUTHORIZE_CE77_LIVE_PROBES_ON_A_DISPOSABLE_TARGET' dotnet test --project tests/CheatEngine.Client.Tests/CheatEngine.Client.Tests.csproj -c Release --no-build --filter-trait Session=S0 Remove-Item Env:CHEATENGINE_CLIENT_LIVE_QUALIFICATION +Remove-Item Env:CheatEngineSdkSourceMode ``` Optional inputs: `CHEATENGINE_CLIENT_LIVE_QUALIFICATION_CE_DIRECTORY` (default `C:/Program Files/Cheat Engine`, only diff --git a/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkIdentityEmbeddingTests.cs b/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkIdentityEmbeddingTests.cs index 93c82673..a7dcd113 100644 --- a/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkIdentityEmbeddingTests.cs +++ b/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkIdentityEmbeddingTests.cs @@ -8,11 +8,10 @@ namespace CheatEngine.Client.Tests.SdkContract; /// -/// The consumed CheatEngine.SDK identity that Client.Core embeds for its runtime package gate (audit ADR-09, ADR-10, -/// A21-35) is the locked and restored package: the version and content hash of the resolved lock-file entry, the pin -/// of eng/CheatEngineSdk.props, the source commit of the CheatEngine.SDK.Engine assembly actually loaded, and -/// the supported major of eng/CheatEngineSdk.props. A build that cannot embed it fails with -/// CHEATENGINECLIENT9050. +/// The consumed CheatEngine.SDK identity that Client.Core embeds for its runtime gate (audit ADR-09, ADR-10, +/// A21-35) comes from the pinned source submodule in ordinary builds: its Engine assembly contributes the semantic +/// version and Git commit, while the build records the source kind and supported major without inventing a NuGet +/// content hash. Production package mode verifies the separate locked and restored package identity. /// /// /// The guard cases run only the evaluation and the guard target of CheatEngine.Client.Core.csproj (nothing is @@ -23,38 +22,81 @@ public sealed class ConsumedSdkIdentityEmbeddingTests private const string MetadataPrefix = "CheatEngine.Client.ConsumedSdk."; private const string CoreProject = "libs/CheatEngine.Client.Core/CheatEngine.Client.Core.csproj"; private const string CoreLockFile = "libs/CheatEngine.Client.Core/packages.lock.json"; - private const string IdentityGuard = "CheatEngineClientRequireConsumedSdkIdentity"; + private const string PackageIdentityGuard = "CheatEngineClientRequireConsumedSdkIdentity"; + private const string SourceRootGuard = "CheatEngineClientValidateSdkSourceRoot"; [Fact] [Trait("Qualification", "Q48")] - public void EmbeddedSdkIdentityEqualsTheLockedAndLoadedSdkPackage() + public void EmbeddedSdkIdentityMatchesTheBuildDependencyKind() { - using JsonDocument lockFile = JsonDocument.Parse(File.ReadAllText(RepositoryLayout.Combine(CoreLockFile))); - JsonElement lockedSdk = lockFile.RootElement.GetProperty("dependencies").GetProperty("net10.0") - .GetProperty("CheatEngine.SDK"); string? loaded = ClientAssemblyCatalog.Load("CheatEngine.SDK.Engine") .GetCustomAttribute()?.InformationalVersion; Dictionary embedded = ReadEmbeddedMetadata(); Assert.NotNull(loaded); - Assert.Equal( - new Dictionary(StringComparer.Ordinal) - { - [MetadataPrefix + "Version"] = lockedSdk.GetProperty("resolved").GetString()!, - [MetadataPrefix + "SourceCommit"] = loaded[(loaded.IndexOf('+', StringComparison.Ordinal) + 1)..], - [MetadataPrefix + "ContentHashSha512"] = lockedSdk.GetProperty("contentHash").GetString()!, - [MetadataPrefix + "SupportedMajor"] = SdkPin.SupportedMajor.ToString(CultureInfo.InvariantCulture) - }, - embedded); - Assert.Equal(SdkPin.Version, embedded[MetadataPrefix + "Version"]); + if (embedded.TryGetValue(MetadataPrefix + "Kind", out string? kind)) + { + Assert.Equal("source", kind); + Assert.Equal( + new Dictionary(StringComparer.Ordinal) + { + [MetadataPrefix + "Kind"] = "source", + [MetadataPrefix + "Version"] = loaded[..loaded.IndexOf('+', StringComparison.Ordinal)], + [MetadataPrefix + "SourceCommit"] = loaded[(loaded.IndexOf('+', StringComparison.Ordinal) + 1)..], + [MetadataPrefix + "SupportedMajor"] = SdkPin.SupportedMajor.ToString(CultureInfo.InvariantCulture) + }, + embedded); + } + else + { + using JsonDocument lockFile = JsonDocument.Parse(File.ReadAllText(RepositoryLayout.Combine(CoreLockFile))); + JsonElement lockedSdk = lockFile.RootElement.GetProperty("dependencies").GetProperty("net10.0") + .GetProperty("CheatEngine.SDK"); + Assert.Equal( + new Dictionary(StringComparer.Ordinal) + { + [MetadataPrefix + "Version"] = lockedSdk.GetProperty("resolved").GetString()!, + [MetadataPrefix + "SourceCommit"] = loaded[(loaded.IndexOf('+', StringComparison.Ordinal) + 1)..], + [MetadataPrefix + "ContentHashSha512"] = lockedSdk.GetProperty("contentHash").GetString()!, + [MetadataPrefix + "SupportedMajor"] = SdkPin.SupportedMajor.ToString(CultureInfo.InvariantCulture) + }, + embedded); + Assert.Equal(SdkPin.Version, embedded[MetadataPrefix + "Version"]); + } Assert.Equal($"{embedded[MetadataPrefix + "Version"]}+{embedded[MetadataPrefix + "SourceCommit"]}", loaded); } [Fact] [Trait("Qualification", "Q48")] - public async Task CommittedLockAndRestoredPackagePassTheConsumedSdkIdentityGuardAsync() + public async Task PinnedSourceSdkPassesTheConsumedSdkIdentityGuardAsync() + { + DotNetProcessResult result = await RunGuardAsync(SourceRootGuard, + "-p:CheatEngineSdkSourceMode=true", "-p:CheatEngineImportSourceSettings=false"); + + Assert.True(result.ExitCode == 0, result.ToString()); + Assert.DoesNotContain("CHEATENGINECLIENT9050", result.StandardOutput, StringComparison.Ordinal); + } + + [Fact] + [Trait("Qualification", "Q48")] + public async Task SourceBuildWithoutThePinnedSdkReportsTheSubmoduleRecoveryCommandAsync() + { + using TemporaryDirectory emptySdkRoot = new("empty-sdk-source-root"); + DotNetProcessResult result = await RunGuardAsync(SourceRootGuard, + "-p:CheatEngineSdkSourceMode=true", "-p:CheatEngineImportSourceSettings=false", + $"-p:CheatEngineSdkSourceRoot={emptySdkRoot.Path}"); + + Assert.True(result.ExitCode != 0, result.ToString()); + Assert.Contains("error CHEATENGINECLIENT9051", result.StandardOutput, StringComparison.Ordinal); + Assert.Contains("git submodule update --init --recursive", result.StandardOutput, StringComparison.Ordinal); + } + + [Fact] + [Trait("Qualification", "Q48")] + [Trait("Category", "PackageConsumption")] + public async Task ProductionPackageModePassesTheConsumedSdkIdentityGuardAsync() { - DotNetProcessResult result = await RunGuardAsync(); + DotNetProcessResult result = await RunGuardAsync(PackageIdentityGuard, "-p:CheatEngineSdkSourceMode=false"); Assert.True(result.ExitCode == 0, result.ToString()); Assert.DoesNotContain("CHEATENGINECLIENT9050", result.StandardOutput, StringComparison.Ordinal); @@ -62,13 +104,16 @@ public async Task CommittedLockAndRestoredPackagePassTheConsumedSdkIdentityGuard [Fact] [Trait("Qualification", "Q48")] - public async Task BuildThatCannotEmbedTheConsumedSdkIdentityFailsWithCHEATENGINECLIENT9050Async() + [Trait("Category", "PackageConsumption")] + public async Task ProductionPackageModeFailsWhenItCannotEmbedTheConsumedSdkIdentityAsync() { using TemporaryDirectory emptyPackageRoot = new("empty-package-root"); string driftedPin = $"{SdkPin.Major}.{SdkPin.Minor}.{SdkPin.Patch + 1}"; - DotNetProcessResult packageMissing = await RunGuardAsync($"-p:NuGetPackageRoot={emptyPackageRoot.Path}"); - DotNetProcessResult pinDrift = await RunGuardAsync($"-p:CheatEngineSdkVersion={driftedPin}"); + DotNetProcessResult packageMissing = await RunGuardAsync(PackageIdentityGuard, + "-p:CheatEngineSdkSourceMode=false", $"-p:NuGetPackageRoot={emptyPackageRoot.Path}"); + DotNetProcessResult pinDrift = await RunGuardAsync(PackageIdentityGuard, + "-p:CheatEngineSdkSourceMode=false", $"-p:CheatEngineSdkVersion={driftedPin}"); Assert.True(packageMissing.ExitCode != 0, packageMissing.ToString()); Assert.Contains("error CHEATENGINECLIENT9050", packageMissing.StandardOutput, StringComparison.Ordinal); @@ -80,11 +125,11 @@ public async Task BuildThatCannotEmbedTheConsumedSdkIdentityFailsWithCHEATENGINE StringComparison.Ordinal); } - private static Task RunGuardAsync(params string[] properties) + private static Task RunGuardAsync(string target, params string[] properties) { List arguments = [ - "msbuild", RepositoryLayout.Combine(CoreProject), $"-t:{IdentityGuard}", "-nologo", "-nodeReuse:false", + "msbuild", RepositoryLayout.Combine(CoreProject), $"-t:{target}", "-nologo", "-nodeReuse:false", "-verbosity:minimal" ]; arguments.AddRange(properties); diff --git a/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkSurface.cs b/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkSurface.cs index 98dd80e6..3a0344f8 100644 --- a/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkSurface.cs +++ b/tests/CheatEngine.Client.Tests/SdkContract/ConsumedSdkSurface.cs @@ -487,6 +487,7 @@ internal static class ConsumedSdkSurface "CheatEngine.Client.Hosting M CheatEngine.SDK.Hosting.Diagnostics.HostLog::IsEnabled(CheatEngine.SDK.Hosting.Diagnostics.HostLogLevel)->boolean", "CheatEngine.Client.Hosting M CheatEngine.SDK.Hosting.Diagnostics.HostLog::Write(CheatEngine.SDK.Hosting.Diagnostics.HostLogLevel,string,System.Exception)->void", "CheatEngine.Client.Hosting M CheatEngine.SDK.Hosting.Plugin.CheatEnginePlugin::.ctor()->void", + "CheatEngine.Client.Hosting M CheatEngine.SDK.Hosting.Plugin.CheatEnginePlugin::BeginFailedEnableRollback()->void", "CheatEngine.Client.Hosting T CheatEngine.SDK.Hosting.Diagnostics.HostLog", "CheatEngine.Client.Hosting T CheatEngine.SDK.Hosting.Diagnostics.HostLogLevel", "CheatEngine.Client.Hosting T CheatEngine.SDK.Hosting.Plugin.CheatEnginePlugin" diff --git a/tests/CheatEngine.Client.Tests/SdkContract/SdkApiUsage.cs b/tests/CheatEngine.Client.Tests/SdkContract/SdkApiUsage.cs index 3aa8b42f..ddff5122 100644 --- a/tests/CheatEngine.Client.Tests/SdkContract/SdkApiUsage.cs +++ b/tests/CheatEngine.Client.Tests/SdkContract/SdkApiUsage.cs @@ -442,6 +442,11 @@ internal static void AllocationSurface(TargetAllocationAcquireOutcome outcome, A private sealed class CompileOnlyPlugin : CheatEnginePlugin { + internal static void RollBackFailedEnable() + { + BeginFailedEnableRollback(); + } + protected override void OnEnable() { }