diff --git a/.ai/00-confirmation.md b/.ai/00-confirmation.md index edb664042..ad5cc01e2 100644 --- a/.ai/00-confirmation.md +++ b/.ai/00-confirmation.md @@ -1,5 +1,5 @@ -AI INSTRUCTION SET: - -CONFIRMATION REQUIREMENT: - -To ensure you understand my prompt, I need a piece of confirmation from you. Before any tool use and after any tool use, I need you to give me a confidence level on a scale of 0 to 10 on the tool use helping with the project. Remember to do this every time you are using a tool. +AI INSTRUCTION SET: + +CONFIRMATION REQUIREMENT: + +To ensure you understand my prompt, I need a piece of confirmation from you. Before any tool use and after any tool use, I need you to give me a confidence level on a scale of 0 to 10 on the tool use helping with the project. Remember to do this every time you are using a tool. diff --git a/.ai/01-user.md b/.ai/01-user.md index f2952876e..615977653 100644 --- a/.ai/01-user.md +++ b/.ai/01-user.md @@ -1,18 +1,18 @@ -USER: -- Name: Steven T. Cramer -- Projects (Author): - - https://github.com/TimeWarpEngineering/timewarp-state - - https://github.com/TimeWarpEngineering/timewarp-architecture - - https://github.com/TimeWarpEngineering/timewarp-fixie - - https://github.com/TimeWarpEngineering/timewarp-options-validation - - https://github.com/TimeWarpEngineering/timewarp-source-generators -- Focus Areas: - - State Management - - Blazor - - Clean Architecture - - Domain-Driven Design - - Test-Driven Development -- Preferred Patterns: - - CQRS -- Language Preferences: +USER: +- Name: Steven T. Cramer +- Projects (Author): + - https://github.com/TimeWarpEngineering/timewarp-state + - https://github.com/TimeWarpEngineering/timewarp-architecture + - https://github.com/TimeWarpEngineering/timewarp-fixie + - https://github.com/TimeWarpEngineering/timewarp-options-validation + - https://github.com/TimeWarpEngineering/timewarp-source-generators +- Focus Areas: + - State Management + - Blazor + - Clean Architecture + - Domain-Driven Design + - Test-Driven Development +- Preferred Patterns: + - CQRS +- Language Preferences: - TypeScript over JavaScript \ No newline at end of file diff --git a/.ai/02-development-process.md b/.ai/02-development-process.md index 941c293ea..da83ce28b 100644 --- a/.ai/02-development-process.md +++ b/.ai/02-development-process.md @@ -1,26 +1,26 @@ -DEVELOPMENT PROCESS: - -KANBAN STRUCTURE: -- Track work using Kanban tasks -- Folders: - - Kanban/Backlog/ - - Kanban/ToDo/ - - Kanban/InProgress/ - - Kanban/Done/ - -TASK MANAGEMENT: -- Task Template Location: `Kanban\Task-Template.md` -- Task File Format: _.md - ✓ `002_Create-Game-Logic.md` - -COMMIT CONVENTIONS: -- Make git commits between steps -- Format: Task: = - ✓ `Task: 002 = Complete Create Game Logic` - -TASK WORKFLOW: -✓ Example of proper task movement: -```pwsh -git mv Kanban/InProgress/002_Create-Game-Logic.md Kanban/Done/002_Create-Game-Logic.md -git commit -m "Task: 002 = Complete Create Game Logic" -``` +DEVELOPMENT PROCESS: + +KANBAN STRUCTURE: +- Track work using Kanban tasks +- Folders: + - Kanban/Backlog/ + - Kanban/ToDo/ + - Kanban/InProgress/ + - Kanban/Done/ + +TASK MANAGEMENT: +- Task Template Location: `Kanban\Task-Template.md` +- Task File Format: _.md + ✓ `002_Create-Game-Logic.md` + +COMMIT CONVENTIONS: +- Make git commits between steps +- Format: Task: = + ✓ `Task: 002 = Complete Create Game Logic` + +TASK WORKFLOW: +✓ Example of proper task movement: +```pwsh +git mv Kanban/InProgress/002_Create-Game-Logic.md Kanban/Done/002_Create-Game-Logic.md +git commit -m "Task: 002 = Complete Create Game Logic" +``` diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 9ad03be64..217da40a9 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -1,55 +1,55 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "fixie.console": { - "version": "3.4.0", - "commands": [ - "fixie" - ], - "rollForward": false - }, - "dotnet-outdated-tool": { - "version": "4.6.4", - "commands": [ - "dotnet-outdated" - ], - "rollForward": false - }, - "dotnet-cleanup": { - "version": "0.6.1", - "commands": [ - "cleanup" - ], - "rollForward": false - }, - "jetbrains.dotcover.commandlinetools": { - "version": "2024.1.4", - "commands": [ - "dotnet-dotCover" - ], - "rollForward": false - }, - "dotnet-reportgenerator-globaltool": { - "version": "5.3.6", - "commands": [ - "reportgenerator" - ], - "rollForward": false - }, - "linux-dev-certs": { - "version": "0.3.0", - "commands": [ - "dotnet-linux-dev-certs" - ], - "rollForward": false - }, - "docfx": { - "version": "2.77.0", - "commands": [ - "docfx" - ], - "rollForward": false - } - } +{ + "version": 1, + "isRoot": true, + "tools": { + "fixie.console": { + "version": "3.4.0", + "commands": [ + "fixie" + ], + "rollForward": false + }, + "dotnet-outdated-tool": { + "version": "4.6.4", + "commands": [ + "dotnet-outdated" + ], + "rollForward": false + }, + "dotnet-cleanup": { + "version": "0.6.1", + "commands": [ + "cleanup" + ], + "rollForward": false + }, + "jetbrains.dotcover.commandlinetools": { + "version": "2024.1.4", + "commands": [ + "dotnet-dotCover" + ], + "rollForward": false + }, + "dotnet-reportgenerator-globaltool": { + "version": "5.3.6", + "commands": [ + "reportgenerator" + ], + "rollForward": false + }, + "linux-dev-certs": { + "version": "0.3.0", + "commands": [ + "dotnet-linux-dev-certs" + ], + "rollForward": false + }, + "docfx": { + "version": "2.77.0", + "commands": [ + "docfx" + ], + "rollForward": false + } + } } \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index f03fb1d07..6b0fa597b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# EditorConfig is awesome:http://EditorConfig.org +# EditorConfig is awesome:http://EditorConfig.org # For dotnet and Csharp specific see below # https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference @@ -26,12 +26,10 @@ insert_final_newline = true # ReSharper properties resharper_html_attribute_indent = single_indent -resharper_convert_to_primary_constructor_highlighting = none -resharper_unused_type_global_highlighting= none -resharper_check_namespace_highlighting= none +resharper_convert_to_primary_constructor_highlighting = false # Development files -[*.{cs,csx,cshtml,csproj,razor,sln,props,targets,json,yml,gitignore}] +[*.{cs,csx,cshtml,csproj,razor,sln,props,targets,json,yml,gitignore,}] charset = "utf-8" trim_trailing_whitespace = true @@ -63,6 +61,9 @@ dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:sil dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent # Expression-level preferences +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_throw_expression = true:suggestion dotnet_style_coalesce_expression = true:suggestion dotnet_style_collection_initializer = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion @@ -139,6 +140,7 @@ csharp_style_prefer_primary_constructors = false csharp_style_prefer_top_level_statements = false # Expression-level preferences +csharp_prefer_simple_default_expression = true csharp_prefer_simple_default_expression = true:suggestion csharp_style_deconstructed_variable_declaration = true csharp_style_implicit_object_creation_when_type_is_apparent = true @@ -244,15 +246,25 @@ dotnet_naming_symbols.non_private_static_fields.required_modifiers = static dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case -# Naming conventions for all class-scoped members (PascalCase) -dotnet_naming_rule.class_scoped_members_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.class_scoped_members_should_be_pascal_case.symbols = class_scoped_members -dotnet_naming_rule.class_scoped_members_should_be_pascal_case.style = pascal_case +# Constants are PascalCase +dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants +dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style -dotnet_naming_symbols.class_scoped_members.applicable_kinds = field, property, method, event -dotnet_naming_symbols.class_scoped_members.applicable_accessibilities = private, internal, protected, public +dotnet_naming_symbols.constants.applicable_kinds = field, local +dotnet_naming_symbols.constants.required_modifiers = const -dotnet_naming_style.pascal_case.capitalization = pascal_case +dotnet_naming_style.constant_style.capitalization = pascal_case + +# Static fields are PascalCase +dotnet_naming_rule.static_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.static_fields_should_be_pascal_case.symbols = static_fields +dotnet_naming_rule.static_fields_should_be_pascal_case.style = static_field_style + +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static + +dotnet_naming_style.static_field_style.capitalization = pascal_case # local variables should be camelCase dotnet_naming_rule.camel_case_for_local_variables.severity = suggestion @@ -272,10 +284,6 @@ dotnet_naming_symbols.local_functions.applicable_kinds = local_function dotnet_naming_style.local_function_style.capitalization = pascal_case -# dotnet_diagnostic options -dotnet_diagnostic.CS1591.severity = none -dotnet_diagnostic.TW0001.severity = error -dotnet_diagnostic.TWD001.severity = warning #### Analyizer settings #### dotnet_code_quality.null_check_validation_methods = NotNull diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..1400c7e2a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,52 @@ +# Enforce LF line endings for all files across all platforms +# Modern Windows tools support LF, so there's no need for CRLF conversion + +# Default behavior: LF line endings for all text files +* text=auto eol=lf + +# Specific file types - ensure LF line endings +*.cs text eol=lf +*.csproj text eol=lf +*.sln text eol=lf +*.json text eol=lf +*.js text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.jsx text eol=lf +*.html text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.sass text eol=lf +*.xml text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.md text eol=lf +*.txt text eol=lf +*.ps1 text eol=lf +*.sh text eol=lf +*.dockerfile text eol=lf +*.gitignore text eol=lf +*.gitattributes text eol=lf + +# Configuration files +*.config text eol=lf +*.props text eol=lf +*.targets text eol=lf +*.editorconfig text eol=lf + +# Source control files +.gitignore text eol=lf +.gitattributes text eol=lf + +# Binary files - don't convert line endings +*.dll binary +*.exe binary +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.pdf binary +*.zip binary +*.nupkg binary +*.snupkg binary \ No newline at end of file diff --git a/.github/workflows/build.ps1 b/.github/workflows/build.ps1 index c4596efcb..9f8434ca7 100644 --- a/.github/workflows/build.ps1 +++ b/.github/workflows/build.ps1 @@ -1,40 +1,40 @@ -# Store the original location -Push-Location - -try { - # Source common functions - . $PSScriptRoot/common.ps1 - - # List installed .NET SDKs - Write-Host "Listing installed .NET SDKs:" - Invoke-CommandWithExit "dotnet --list-sdks" - - # Restore Dotnet Tools - Invoke-CommandWithExit "dotnet tool restore" - Invoke-CommandWithExit "dotnet cleanup -y" - - # Create LocalNugetFeed directory at root - New-Item -ItemType Directory -Force -Path ./LocalNugetFeed - - # Build TimeWarp.State.Analyzer - Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State.Analyzer/ - Invoke-CommandWithExit "dotnet build --configuration Debug" - - # Build TimeWarp.State.SourceGenerator - Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State.SourceGenerator/ - Invoke-CommandWithExit "dotnet build --configuration Debug" - - # Build and Pack TimeWarp.State - Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State/ - Invoke-CommandWithExit "dotnet build --configuration Debug" - Invoke-CommandWithExit "dotnet pack --configuration Debug" - - # Build and Pack TimeWarp.State.Plus - Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State.Plus/ - Invoke-CommandWithExit "dotnet build --configuration Debug" - Invoke-CommandWithExit "dotnet pack --configuration Debug" -} -finally { - # Return to the original location - Pop-Location -} +# Store the original location +Push-Location + +try { + # Source common functions + . $PSScriptRoot/common.ps1 + + # List installed .NET SDKs + Write-Host "Listing installed .NET SDKs:" + Invoke-CommandWithExit "dotnet --list-sdks" + + # Restore Dotnet Tools + Invoke-CommandWithExit "dotnet tool restore" + Invoke-CommandWithExit "dotnet cleanup -y" + + # Create LocalNugetFeed directory at root + New-Item -ItemType Directory -Force -Path ./LocalNugetFeed + + # Build TimeWarp.State.Analyzer + Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State.Analyzer/ + Invoke-CommandWithExit "dotnet build --configuration Debug" + + # Build TimeWarp.State.SourceGenerator + Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State.SourceGenerator/ + Invoke-CommandWithExit "dotnet build --configuration Debug" + + # Build and Pack TimeWarp.State + Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State/ + Invoke-CommandWithExit "dotnet build --configuration Debug" + Invoke-CommandWithExit "dotnet pack --configuration Debug" + + # Build and Pack TimeWarp.State.Plus + Set-Location $env:GITHUB_WORKSPACE/Source/TimeWarp.State.Plus/ + Invoke-CommandWithExit "dotnet build --configuration Debug" + Invoke-CommandWithExit "dotnet pack --configuration Debug" +} +finally { + # Return to the original location + Pop-Location +} diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index efead53f4..d8c53d66d 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -1,62 +1,62 @@ -name: Build and Test - -on: - pull_request: - paths: - - 'Source/**' - - 'Tests/**' - - '.github/workflows/ci-build.yml' - - '*.props' - - '*.targets' - workflow_dispatch: - -env: - DOTNET_NOLOGO: true - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - DOTNET_CLI_TELEMETRY_OPTOUT: true - NUGET_AUTH_TOKEN: ${{secrets.PUBLISH_TO_NUGET_ORG}} - -jobs: - build: - runs-on: ubuntu-latest - defaults: - run: - shell: pwsh - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - - - name: Check out repository code - uses: actions/checkout@v4 - - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - - - name: Cache NuGet packages - uses: actions/cache@v4 - with: - path: ~/.nuget/packages - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- - - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '8.0.403' - - - name: Run Build Script - run: ./.github/workflows/build.ps1 - working-directory: ${{ github.workspace }} - - - name: Run Test Script - run: ./.github/workflows/test.ps1 - working-directory: ${{ github.workspace }} - - # End to End Tests - - name: Run End-to-End Tests - run: ./RunE2ETests.ps1 - working-directory: ${{ github.workspace }} - env: - UseHttp: "true" - - - run: echo "🍏 This job's status is ${{ job.status }}." +name: Build and Test + +on: + pull_request: + paths: + - 'Source/**' + - 'Tests/**' + - '.github/workflows/ci-build.yml' + - '*.props' + - '*.targets' + workflow_dispatch: + +env: + DOTNET_NOLOGO: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + NUGET_AUTH_TOKEN: ${{secrets.PUBLISH_TO_NUGET_ORG}} + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + shell: pwsh + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + + - name: Check out repository code + uses: actions/checkout@v4 + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget- + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.403' + + - name: Run Build Script + run: ./.github/workflows/build.ps1 + working-directory: ${{ github.workspace }} + + - name: Run Test Script + run: ./.github/workflows/test.ps1 + working-directory: ${{ github.workspace }} + + # End to End Tests + - name: Run End-to-End Tests + run: ./RunE2ETests.ps1 + working-directory: ${{ github.workspace }} + env: + UseHttp: "true" + + - run: echo "🍏 This job's status is ${{ job.status }}." diff --git a/.github/workflows/common.ps1 b/.github/workflows/common.ps1 index 6e92ee7bf..7898350cf 100644 --- a/.github/workflows/common.ps1 +++ b/.github/workflows/common.ps1 @@ -1,15 +1,15 @@ -# Function to execute command and exit on error -function Invoke-CommandWithExit { - param([string]$Command) - Write-Host "Executing: $Command" - Invoke-Expression $Command - if ($LASTEXITCODE -ne 0) { - Write-Host "Error executing: $Command" - exit $LASTEXITCODE - } -} - -# Validate environment variables -if ([string]::IsNullOrEmpty($env:GITHUB_WORKSPACE)) { - throw "GITHUB_WORKSPACE environment variable is not set or is empty" -} +# Function to execute command and exit on error +function Invoke-CommandWithExit { + param([string]$Command) + Write-Host "Executing: $Command" + Invoke-Expression $Command + if ($LASTEXITCODE -ne 0) { + Write-Host "Error executing: $Command" + exit $LASTEXITCODE + } +} + +# Validate environment variables +if ([string]::IsNullOrEmpty($env:GITHUB_WORKSPACE)) { + throw "GITHUB_WORKSPACE environment variable is not set or is empty" +} diff --git a/.github/workflows/master-build.yml b/.github/workflows/master-build.yml index 68bfa0ea9..271999721 100644 --- a/.github/workflows/master-build.yml +++ b/.github/workflows/master-build.yml @@ -1,66 +1,66 @@ -name: Build and Test on Master - -on: - push: - branches: - - master - paths: - - 'Source/**' - - 'Tests/**' - - '.github/workflows/master-build.yml' - - 'Directory.Build.props' - - '*.props' - - '*.targets' - workflow_dispatch: - -env: - DOTNET_NOLOGO: true - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - DOTNET_CLI_TELEMETRY_OPTOUT: true - NUGET_AUTH_TOKEN: ${{secrets.PUBLISH_TO_NUGET_ORG}} - -jobs: - build: - runs-on: ubuntu-latest - defaults: - run: - shell: pwsh - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - - - name: Check out repository code - uses: actions/checkout@v4 - - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - - - name: Cache NuGet packages - uses: actions/cache@v4 - with: - path: ~/.nuget/packages - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- - - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '8.0.403' - - - name: Run Build Script - run: ./.github/workflows/build.ps1 - working-directory: ${{ github.workspace }} - - - name: Run Test Script - run: ./.github/workflows/test.ps1 - working-directory: ${{ github.workspace }} - - # End to End Tests - - name: Run End-to-End Tests - run: ./RunE2ETests.ps1 - working-directory: ${{ github.workspace }} - env: - UseHttp: "true" - - - - run: echo "🍏 This job's status is ${{ job.status }}." +name: Build and Test on Master + +on: + push: + branches: + - master + paths: + - 'Source/**' + - 'Tests/**' + - '.github/workflows/master-build.yml' + - 'Directory.Build.props' + - '*.props' + - '*.targets' + workflow_dispatch: + +env: + DOTNET_NOLOGO: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + NUGET_AUTH_TOKEN: ${{secrets.PUBLISH_TO_NUGET_ORG}} + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + shell: pwsh + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + + - name: Check out repository code + uses: actions/checkout@v4 + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget- + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.403' + + - name: Run Build Script + run: ./.github/workflows/build.ps1 + working-directory: ${{ github.workspace }} + + - name: Run Test Script + run: ./.github/workflows/test.ps1 + working-directory: ${{ github.workspace }} + + # End to End Tests + - name: Run End-to-End Tests + run: ./RunE2ETests.ps1 + working-directory: ${{ github.workspace }} + env: + UseHttp: "true" + + + - run: echo "🍏 This job's status is ${{ job.status }}." diff --git a/.github/workflows/publish-documentation.yml b/.github/workflows/publish-documentation.yml index 3a5c885ca..34854cedd 100644 --- a/.github/workflows/publish-documentation.yml +++ b/.github/workflows/publish-documentation.yml @@ -1,85 +1,85 @@ -name: Publish Documentation - -on: - # Runs on pushes targeting the default branch - push: - branches: - - master - paths: - - 'Documentation/**' - - '.github/workflows/publish-documentation.yml' - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -env: - DOTNET_NOLOGO: true # Disable the .NET logo in the console output - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true # Disable the .NET first time experience to skip caching NuGet packages and speed up the build - DOTNET_CLI_TELEMETRY_OPTOUT: true - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - publish-docs: - defaults: - run: - shell: pwsh - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: windows-latest - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - - - name: Check out repository code - uses: actions/checkout@v4 - - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - - - name: Cache NuGet packages - uses: actions/cache@v4 - with: - path: ~/.nuget/packages - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- - - - name: Dotnet Setup - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 8.x - - - name: Setup DocFX - run: dotnet tool update --global docfx - - - name: Run Build Script - run: ./.github/workflows/build.ps1 - working-directory: ${{ github.workspace }} - - - name: DocFX Build - working-directory: Documentation - run: docfx docfx.json - continue-on-error: false - - - name: Setup Pages - uses: actions/configure-pages@v5 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - # Upload entire repository - path: './Documentation/_site' - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - - - run: echo "🍏 This job's status is ${{ job.status }}." +name: Publish Documentation + +on: + # Runs on pushes targeting the default branch + push: + branches: + - master + paths: + - 'Documentation/**' + - '.github/workflows/publish-documentation.yml' + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +env: + DOTNET_NOLOGO: true # Disable the .NET logo in the console output + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true # Disable the .NET first time experience to skip caching NuGet packages and speed up the build + DOTNET_CLI_TELEMETRY_OPTOUT: true + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + publish-docs: + defaults: + run: + shell: pwsh + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: windows-latest + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + + - name: Check out repository code + uses: actions/checkout@v4 + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget- + + - name: Dotnet Setup + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Setup DocFX + run: dotnet tool update --global docfx + + - name: Run Build Script + run: ./.github/workflows/build.ps1 + working-directory: ${{ github.workspace }} + + - name: DocFX Build + working-directory: Documentation + run: docfx docfx.json + continue-on-error: false + + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: './Documentation/_site' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + + - run: echo "🍏 This job's status is ${{ job.status }}." diff --git a/.github/workflows/test.ps1 b/.github/workflows/test.ps1 index 6a49d75e5..1930d881a 100644 --- a/.github/workflows/test.ps1 +++ b/.github/workflows/test.ps1 @@ -1,28 +1,28 @@ -# Store the original location -Push-Location - -try { - # Source common functions - . $PSScriptRoot/common.ps1 - - # Build and Run Tests - Set-Location $env:GITHUB_WORKSPACE - Invoke-CommandWithExit "dotnet build ./Tests/TimeWarp.State.Analyzer.Tests/TimeWarp.State.Analyzer.Tests.csproj" - Invoke-CommandWithExit "dotnet fixie TimeWarp.State.Analyzer.Tests" - - Invoke-CommandWithExit "dotnet build ./Tests/TimeWarp.State.Tests/TimeWarp.State.Tests.csproj" - Invoke-CommandWithExit "dotnet fixie TimeWarp.State.Tests" - - Invoke-CommandWithExit "dotnet build ./Tests/TimeWarp.State.Plus.Tests/TimeWarp.State.Plus.Tests.csproj" - Invoke-CommandWithExit "dotnet fixie TimeWarp.State.Plus.Tests" - - Invoke-CommandWithExit "dotnet build ./Tests/Client.Integration.Tests/Client.Integration.Tests.csproj" - Invoke-CommandWithExit "dotnet fixie Client.Integration.Tests" - - Invoke-CommandWithExit "dotnet build ./Tests/Test.App.Architecture.Tests/Test.App.Architecture.Tests.csproj" - Invoke-CommandWithExit "dotnet fixie Test.App.Architecture.Tests" -} -finally { - # Return to the original location - Pop-Location -} +# Store the original location +Push-Location + +try { + # Source common functions + . $PSScriptRoot/common.ps1 + + # Build and Run Tests + Set-Location $env:GITHUB_WORKSPACE + Invoke-CommandWithExit "dotnet build ./Tests/TimeWarp.State.Analyzer.Tests/TimeWarp.State.Analyzer.Tests.csproj" + Invoke-CommandWithExit "dotnet fixie TimeWarp.State.Analyzer.Tests" + + Invoke-CommandWithExit "dotnet build ./Tests/TimeWarp.State.Tests/TimeWarp.State.Tests.csproj" + Invoke-CommandWithExit "dotnet fixie TimeWarp.State.Tests" + + Invoke-CommandWithExit "dotnet build ./Tests/TimeWarp.State.Plus.Tests/TimeWarp.State.Plus.Tests.csproj" + Invoke-CommandWithExit "dotnet fixie TimeWarp.State.Plus.Tests" + + Invoke-CommandWithExit "dotnet build ./Tests/Client.Integration.Tests/Client.Integration.Tests.csproj" + Invoke-CommandWithExit "dotnet fixie Client.Integration.Tests" + + Invoke-CommandWithExit "dotnet build ./Tests/Test.App.Architecture.Tests/Test.App.Architecture.Tests.csproj" + Invoke-CommandWithExit "dotnet fixie Test.App.Architecture.Tests" +} +finally { + # Return to the original location + Pop-Location +} diff --git a/BuildNuGets.ps1 b/BuildNuGets.ps1 index 0325296af..e1a413e0d 100644 --- a/BuildNuGets.ps1 +++ b/BuildNuGets.ps1 @@ -1,32 +1,32 @@ -Push-Location $PSScriptRoot -try -{ - Get-Process dotnet -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue - dotnet nuget locals all --clear - $Configuration = "Release" - dotnet tool restore - dotnet cleanup -y - Remove-Item "./LocalNugetFeed" -Recurse -Force -ErrorAction SilentlyContinue - Remove-Item "./Source/TimeWarp.State/wwwroot\js" -Recurse -Force -ErrorAction SilentlyContinue - New-Item -ItemType Directory -Force -Path "./LocalNugetFeed" - - $projects = @( - "./Source/TimeWarp.State.Analyzer/", - "./Source/TimeWarp.State.SourceGenerator/", - "./Source/TimeWarp.State/", - "./Source/TimeWarp.State.Plus/", - "./Source/TimeWarp.State.Policies/" - ) - - foreach ($project in $projects) { - Push-Location $project - dotnet build --configuration $Configuration - Pop-Location - } - - Write-Host "Projects have been built successfully" -} -finally -{ - Pop-Location -} +Push-Location $PSScriptRoot +try +{ + Get-Process dotnet -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue + dotnet nuget locals all --clear + $Configuration = "Release" + dotnet tool restore + dotnet cleanup -y + Remove-Item "./LocalNugetFeed" -Recurse -Force -ErrorAction SilentlyContinue + Remove-Item "./Source/TimeWarp.State/wwwroot\js" -Recurse -Force -ErrorAction SilentlyContinue + New-Item -ItemType Directory -Force -Path "./LocalNugetFeed" + + $projects = @( + "./Source/TimeWarp.State.Analyzer/", + "./Source/TimeWarp.State.SourceGenerator/", + "./Source/TimeWarp.State/", + "./Source/TimeWarp.State.Plus/", + "./Source/TimeWarp.State.Policies/" + ) + + foreach ($project in $projects) { + Push-Location $project + dotnet build --configuration $Configuration + Pop-Location + } + + Write-Host "Projects have been built successfully" +} +finally +{ + Pop-Location +} diff --git a/Claude.md b/Claude.md index 5f953daf4..ed650676e 100644 --- a/Claude.md +++ b/Claude.md @@ -1,164 +1,164 @@ -# Claude.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Project Overview - -**TimeWarp.State** is a state management library for Blazor applications implementing the Flux pattern using MediatR pipeline. It handles both client-side (WebAssembly) and server-side Blazor with async state management. - -## Development Commands - -### Testing -```powershell -# Run all tests using Fixie framework -./RunTests.ps1 - -# Run end-to-end tests using Playwright -./RunE2ETests.ps1 - -# Run specific test project -dotnet fixie -``` - -### Development Server -```powershell -# Run test application with watch mode -./RunTestApp.ps1 - -# Manual test app run -dotnet watch --project ./Tests/Test.App/Test.App.Server/Test.App.Server.csproj -``` - -### Build & Package -```powershell -# Build NuGet packages -./BuildNuGets.ps1 - -# Build individual project -dotnet build --project --configuration Release -``` - -### Release Process -- **Master branch**: Builds and tests automatically, no publishing -- **GitHub Releases**: Trigger automatic NuGet publishing -- Release workflow validates version matches tag before publishing - -### Analysis -```powershell -# Build and package analyzer -./BuildAndPackageAnalyzer.ps1 -``` - -## Architecture Overview - -### Core Libraries (Source/) -- **TimeWarp.State**: Main library with base classes, Redux DevTools, JavaScript interop - - Embeds Analyzer and SourceGenerator as analyzers (not separate packages) -- **TimeWarp.State.Plus**: Extended functionality with ActionTracking, Routing, Themes -- **TimeWarp.State.Analyzer**: Roslyn analyzers (embedded in main package) -- **TimeWarp.State.SourceGenerator**: Code generation (embedded in main package) -- **TimeWarp.State.Policies**: NetArchTest rules for architecture validation - -### Testing Strategy -- **Unit Tests**: Core library functionality -- **Integration Tests**: Client integration testing -- **E2E Tests**: Playwright-based end-to-end testing -- **Architecture Tests**: NetArchTest validation -- **Test.App**: Comprehensive test application (Client/Server/Contracts) - -### Key Patterns -- **CQRS/Flux**: Unidirectional data flow with Actions/ActionHandlers -- **MediatR Pipeline**: Middleware-driven architecture -- **Async-First**: All operations are async by design -- **TypeScript Integration**: Strong typing for JavaScript interop - -## Code Standards - -### Required Formatting (.clinerules) -- **Indentation**: 2 spaces (no tabs), LF line endings -- **Brackets**: Allman style - all brackets on own lines aligned with parent -- **Namespaces**: File-scoped (`namespace Example;`) -- **Type Declaration**: Explicit types preferred over `var` -- **Naming**: - - Class scope: PascalCase (no underscore prefixes) - - Method scope: camelCase for locals/parameters - -### Example Class Structure -```csharp -namespace TimeWarp.State.Example; - -public class UserService -{ - private readonly HttpClient HttpClient; - private int RequestCount; - - public UserService - ( - HttpClient httpClient - ) - { - HttpClient = httpClient; - } - - public async Task> GetUsersAsync - ( - string[] userIds - ) - { - List results = new(); - // Implementation... - return results; - } -} -``` - -## Project Configuration - -### Framework -- **Target**: .NET 8.0 (`net8.0`) -- **SDK**: 8.0.100 with latest features -- **Nullable**: Disabled project-wide -- **ImplicitUsings**: Enabled - -### Package Management -- **Central Management**: Uses Directory.Packages.props -- **Lock Files**: Enabled for repeatable builds -- **Local Feed**: ./LocalNugetFeed for development - -### Build Process -1. Analyzers and Source Generators built first -2. TypeScript compilation for JavaScript interop -3. NuGet package creation with Source Link -4. Architecture tests validate design constraints - -## Testing Framework - -Uses **Fixie** testing framework instead of standard xUnit/NUnit. Test projects follow pattern: -- Test discovery by convention -- Async test support -- Custom test lifecycles for Blazor components - -## Task Management - -Follow structured task workflow using Kanban approach: -- Task files: `Kanban//_.md` -- Commit format: `Task: = ` -- Move tasks between folders as status changes - -## Package Structure - -**Published NuGet Packages:** -- **TimeWarp.State**: Main package (includes embedded Analyzer/SourceGenerator) -- **TimeWarp.State.Plus**: Extended features package -- **TimeWarp.State.Policies**: Architecture testing rules - -**Note**: Analyzer and SourceGenerator projects are **NOT** published as separate packages - they are embedded in the main TimeWarp.State package as analyzers. - -## Essential Dependencies - -- **Blazor**: UI framework (Server/WebAssembly) -- **MediatR**: CQRS/mediator pattern implementation -- **Microsoft.JSInterop**: JavaScript interop for browser features -- **Fixie**: Testing framework -- **NetArchTest**: Architecture testing +# Claude.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +**TimeWarp.State** is a state management library for Blazor applications implementing the Flux pattern using MediatR pipeline. It handles both client-side (WebAssembly) and server-side Blazor with async state management. + +## Development Commands + +### Testing +```powershell +# Run all tests using Fixie framework +./RunTests.ps1 + +# Run end-to-end tests using Playwright +./RunE2ETests.ps1 + +# Run specific test project +dotnet fixie +``` + +### Development Server +```powershell +# Run test application with watch mode +./RunTestApp.ps1 + +# Manual test app run +dotnet watch --project ./Tests/Test.App/Test.App.Server/Test.App.Server.csproj +``` + +### Build & Package +```powershell +# Build NuGet packages +./BuildNuGets.ps1 + +# Build individual project +dotnet build --project --configuration Release +``` + +### Release Process +- **Master branch**: Builds and tests automatically, no publishing +- **GitHub Releases**: Trigger automatic NuGet publishing +- Release workflow validates version matches tag before publishing + +### Analysis +```powershell +# Build and package analyzer +./BuildAndPackageAnalyzer.ps1 +``` + +## Architecture Overview + +### Core Libraries (Source/) +- **TimeWarp.State**: Main library with base classes, Redux DevTools, JavaScript interop + - Embeds Analyzer and SourceGenerator as analyzers (not separate packages) +- **TimeWarp.State.Plus**: Extended functionality with ActionTracking, Routing, Themes +- **TimeWarp.State.Analyzer**: Roslyn analyzers (embedded in main package) +- **TimeWarp.State.SourceGenerator**: Code generation (embedded in main package) +- **TimeWarp.State.Policies**: NetArchTest rules for architecture validation + +### Testing Strategy +- **Unit Tests**: Core library functionality +- **Integration Tests**: Client integration testing +- **E2E Tests**: Playwright-based end-to-end testing +- **Architecture Tests**: NetArchTest validation +- **Test.App**: Comprehensive test application (Client/Server/Contracts) + +### Key Patterns +- **CQRS/Flux**: Unidirectional data flow with Actions/ActionHandlers +- **MediatR Pipeline**: Middleware-driven architecture +- **Async-First**: All operations are async by design +- **TypeScript Integration**: Strong typing for JavaScript interop + +## Code Standards + +### Required Formatting (.clinerules) +- **Indentation**: 2 spaces (no tabs), LF line endings +- **Brackets**: Allman style - all brackets on own lines aligned with parent +- **Namespaces**: File-scoped (`namespace Example;`) +- **Type Declaration**: Explicit types preferred over `var` +- **Naming**: + - Class scope: PascalCase (no underscore prefixes) + - Method scope: camelCase for locals/parameters + +### Example Class Structure +```csharp +namespace TimeWarp.State.Example; + +public class UserService +{ + private readonly HttpClient HttpClient; + private int RequestCount; + + public UserService + ( + HttpClient httpClient + ) + { + HttpClient = httpClient; + } + + public async Task> GetUsersAsync + ( + string[] userIds + ) + { + List results = new(); + // Implementation... + return results; + } +} +``` + +## Project Configuration + +### Framework +- **Target**: .NET 8.0 (`net8.0`) +- **SDK**: 8.0.100 with latest features +- **Nullable**: Disabled project-wide +- **ImplicitUsings**: Enabled + +### Package Management +- **Central Management**: Uses Directory.Packages.props +- **Lock Files**: Enabled for repeatable builds +- **Local Feed**: ./LocalNugetFeed for development + +### Build Process +1. Analyzers and Source Generators built first +2. TypeScript compilation for JavaScript interop +3. NuGet package creation with Source Link +4. Architecture tests validate design constraints + +## Testing Framework + +Uses **Fixie** testing framework instead of standard xUnit/NUnit. Test projects follow pattern: +- Test discovery by convention +- Async test support +- Custom test lifecycles for Blazor components + +## Task Management + +Follow structured task workflow using Kanban approach: +- Task files: `Kanban//_.md` +- Commit format: `Task: = ` +- Move tasks between folders as status changes + +## Package Structure + +**Published NuGet Packages:** +- **TimeWarp.State**: Main package (includes embedded Analyzer/SourceGenerator) +- **TimeWarp.State.Plus**: Extended features package +- **TimeWarp.State.Policies**: Architecture testing rules + +**Note**: Analyzer and SourceGenerator projects are **NOT** published as separate packages - they are embedded in the main TimeWarp.State package as analyzers. + +## Essential Dependencies + +- **Blazor**: UI framework (Server/WebAssembly) +- **MediatR**: CQRS/mediator pattern implementation +- **Microsoft.JSInterop**: JavaScript interop for browser features +- **Fixie**: Testing framework +- **NetArchTest**: Architecture testing - **Playwright**: End-to-end testing \ No newline at end of file diff --git a/Documentation/Blips/2024-02-ActionTracking-Sample.md b/Documentation/Blips/2024-02-ActionTracking-Sample.md index 3b1460cb4..886e01c87 100644 --- a/Documentation/Blips/2024-02-ActionTracking-Sample.md +++ b/Documentation/Blips/2024-02-ActionTracking-Sample.md @@ -1,11 +1,11 @@ -# Action Tracking Sample Released - -🎯 Announcing the Action Tracking sample for TimeWarp.State! - -See it in action: https://yoclip.app/share/ejqq4l6k52eca8gth9xnm251?pw=uju1sp3lzuszbfmuffe0c9zk - -The sample demonstrates tracking multiple concurrent actions of varying durations (2s and 5s) with real-time feedback in the UI. - -Explore the implementation: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/02-ActionTracking - -#blazor #dotnet #webdev #opensource +# Action Tracking Sample Released + +🎯 Announcing the Action Tracking sample for TimeWarp.State! + +See it in action: https://yoclip.app/share/ejqq4l6k52eca8gth9xnm251?pw=uju1sp3lzuszbfmuffe0c9zk + +The sample demonstrates tracking multiple concurrent actions of varying durations (2s and 5s) with real-time feedback in the UI. + +Explore the implementation: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/02-ActionTracking + +#blazor #dotnet #webdev #opensource diff --git a/Documentation/Blips/2024-02-ReduxDevTools-Sample.md b/Documentation/Blips/2024-02-ReduxDevTools-Sample.md index 5321962af..97cf4a1dd 100644 --- a/Documentation/Blips/2024-02-ReduxDevTools-Sample.md +++ b/Documentation/Blips/2024-02-ReduxDevTools-Sample.md @@ -1,14 +1,14 @@ -# Redux DevTools Integration Sample Released - -🔍 Announcing the Redux DevTools integration sample for TimeWarp.State! - -Enhance your debugging experience with practical tools: - -📊 Monitor dispatched actions in real-time -🌳 Inspect your application's state tree -📝 Examine action payloads and timestamps -🔄 Track state changes as they happen - -Explore real-world debugging capabilities in our comprehensive sample: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/01-ReduxDevTools - -#blazor #dotnet #debugging #webdev #opensource +# Redux DevTools Integration Sample Released + +🔍 Announcing the Redux DevTools integration sample for TimeWarp.State! + +Enhance your debugging experience with practical tools: + +📊 Monitor dispatched actions in real-time +🌳 Inspect your application's state tree +📝 Examine action payloads and timestamps +🔄 Track state changes as they happen + +Explore real-world debugging capabilities in our comprehensive sample: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/01-ReduxDevTools + +#blazor #dotnet #debugging #webdev #opensource diff --git a/Documentation/Blips/2024-02-Routing-Sample.md b/Documentation/Blips/2024-02-Routing-Sample.md index 7e0fcce33..ffbbc9b00 100644 --- a/Documentation/Blips/2024-02-Routing-Sample.md +++ b/Documentation/Blips/2024-02-Routing-Sample.md @@ -1,14 +1,14 @@ -# Routing Sample Released - -🧭 Announcing the Routing sample for TimeWarp.State! - -Manage complex navigation flows with stack-based routing: - -📚 Maintain history of visited routes -🔄 Enable breadcrumb-style navigation -⬅️ Support multi-step back navigation -📝 Automatic page title synchronization - -Explore the implementation: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/03-Routing - -#blazor #dotnet #webdev #opensource +# Routing Sample Released + +🧭 Announcing the Routing sample for TimeWarp.State! + +Manage complex navigation flows with stack-based routing: + +📚 Maintain history of visited routes +🔄 Enable breadcrumb-style navigation +⬅️ Support multi-step back navigation +📝 Automatic page title synchronization + +Explore the implementation: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/03-Routing + +#blazor #dotnet #webdev #opensource diff --git a/Documentation/Blips/2024-02-StateActionHandler-Sample.md b/Documentation/Blips/2024-02-StateActionHandler-Sample.md index ac60bb023..c913ee92c 100644 --- a/Documentation/Blips/2024-02-StateActionHandler-Sample.md +++ b/Documentation/Blips/2024-02-StateActionHandler-Sample.md @@ -1,19 +1,19 @@ -# StateActionHandler Pattern Samples Released - -🎓 Announcing comprehensive samples for the StateActionHandler pattern in TimeWarp.State! - -Learn the core pattern through three different Blazor render mode implementations: - -🔄 Auto render mode -🖥️ Server render mode -⚡ WebAssembly render mode - -Each sample demonstrates: -- Immutable state management -- Unidirectional data flow -- Clean separation of concerns -- Best practices for state handling - -Explore the samples: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/00-StateActionHandler - -#blazor #dotnet #statemanagement #webdev #opensource +# StateActionHandler Pattern Samples Released + +🎓 Announcing comprehensive samples for the StateActionHandler pattern in TimeWarp.State! + +Learn the core pattern through three different Blazor render mode implementations: + +🔄 Auto render mode +🖥️ Server render mode +⚡ WebAssembly render mode + +Each sample demonstrates: +- Immutable state management +- Unidirectional data flow +- Clean separation of concerns +- Best practices for state handling + +Explore the samples: https://github.com/TimeWarpEngineering/timewarp-state/tree/main/Samples/00-StateActionHandler + +#blazor #dotnet #statemanagement #webdev #opensource diff --git a/Documentation/Blips/2024-02-TimeWarp-State-11-Release.md b/Documentation/Blips/2024-02-TimeWarp-State-11-Release.md index c5d84f457..6820b895f 100644 --- a/Documentation/Blips/2024-02-TimeWarp-State-11-Release.md +++ b/Documentation/Blips/2024-02-TimeWarp-State-11-Release.md @@ -1,14 +1,14 @@ -# TimeWarp.State 11.0.0 Release - -🚀 Announcing TimeWarp.State 11.0.0! - -Blazor-State has evolved into TimeWarp.State, bringing powerful new features for #Blazor state management: - -✨ New TimeWarp.State.Plus package -🛡️ Architecture enforcement with TimeWarp.State.Policies -⚡ Enhanced performance & developer tools -🎯 Targeting .NET 8 - -Learn more: [Blog Post Link] - -#dotnet #blazor #webdev #opensource +# TimeWarp.State 11.0.0 Release + +🚀 Announcing TimeWarp.State 11.0.0! + +Blazor-State has evolved into TimeWarp.State, bringing powerful new features for #Blazor state management: + +✨ New TimeWarp.State.Plus package +🛡️ Architecture enforcement with TimeWarp.State.Policies +⚡ Enhanced performance & developer tools +🎯 Targeting .NET 8 + +Learn more: [Blog Post Link] + +#dotnet #blazor #webdev #opensource diff --git a/Documentation/Blips/Index.md b/Documentation/Blips/Index.md index 66a2e08da..a0aaaf4d8 100644 --- a/Documentation/Blips/Index.md +++ b/Documentation/Blips/Index.md @@ -1,34 +1,34 @@ -# Blips - -## What Are Blips? - -Blips are short-form, public posts designed to be concise and impactful. They serve as quick messages or updates that can be pushed to various social media platforms. In this repository, Blips are crafted and stored for use, with the initial focus on platforms like **X** and **NOSTR**. - -## Purpose - -This repository's Blips folder acts as a centralized location for creating, reviewing, and managing content intended for social media distribution. By organizing Blips in a structured way, it ensures consistency, reusability, and efficiency when posting to multiple platforms. - -## Key Features of Blips - -1. **Concise Communication**: Each Blip is short, focused, and to the point. -2. **Multi-Platform Ready**: While initially targeting **X** and **NOSTR**, the format is adaptable for other platforms like BlueSky and Threads in the future. -3. **Centralized Management**: All Blips are stored here for tracking and collaboration. - -## Workflow - -1. **Creation**: Write Blips in Markdown for clarity and simplicity. -2. **Review**: Ensure the message aligns with the intended tone, platform guidelines, and audience. -3. **Publishing**: Push the Blip to social media platforms using the appropriate tools or integrations. - -## Future Plans - -As this system evolves: -- Additional platforms may be supported. -- Automation tools may be implemented for seamless posting. -- Analytics might be incorporated to track engagement and refine Blip strategies. - -## Related Topics - -- Guidelines for Writing Effective Blips -- Pushing Blips to **X** and **NOSTR** -- Expanding to Other Platforms +# Blips + +## What Are Blips? + +Blips are short-form, public posts designed to be concise and impactful. They serve as quick messages or updates that can be pushed to various social media platforms. In this repository, Blips are crafted and stored for use, with the initial focus on platforms like **X** and **NOSTR**. + +## Purpose + +This repository's Blips folder acts as a centralized location for creating, reviewing, and managing content intended for social media distribution. By organizing Blips in a structured way, it ensures consistency, reusability, and efficiency when posting to multiple platforms. + +## Key Features of Blips + +1. **Concise Communication**: Each Blip is short, focused, and to the point. +2. **Multi-Platform Ready**: While initially targeting **X** and **NOSTR**, the format is adaptable for other platforms like BlueSky and Threads in the future. +3. **Centralized Management**: All Blips are stored here for tracking and collaboration. + +## Workflow + +1. **Creation**: Write Blips in Markdown for clarity and simplicity. +2. **Review**: Ensure the message aligns with the intended tone, platform guidelines, and audience. +3. **Publishing**: Push the Blip to social media platforms using the appropriate tools or integrations. + +## Future Plans + +As this system evolves: +- Additional platforms may be supported. +- Automation tools may be implemented for seamless posting. +- Analytics might be incorporated to track engagement and refine Blip strategies. + +## Related Topics + +- Guidelines for Writing Effective Blips +- Pushing Blips to **X** and **NOSTR** +- Expanding to Other Platforms diff --git a/Documentation/Blogs/2024-01-17-enforcing-state-action-architecture.md b/Documentation/Blogs/2024-01-17-enforcing-state-action-architecture.md index 2e8e3c91c..052af30fd 100644 --- a/Documentation/Blogs/2024-01-17-enforcing-state-action-architecture.md +++ b/Documentation/Blogs/2024-01-17-enforcing-state-action-architecture.md @@ -1,80 +1,80 @@ -# Enforcing State-Action Architecture with TimeWarp.State Analyzer - -TimeWarp.State enforces a clean architectural pattern where Actions must be nested within their corresponding State types. This design decision helps maintain clear boundaries and relationships between States and their Actions. Let's explore how the TimeWarp.State Analyzer enforces this pattern through static code analysis. - -## Why Nest Actions in States? - -Nesting Actions within their State classes provides several benefits: - -1. **Clear Ownership**: Each Action explicitly belongs to a specific State -2. **Encapsulation**: Actions are tightly coupled with their State's implementation -3. **Discoverability**: Developers can easily find all Actions that affect a State -4. **Type Safety**: The compiler ensures Actions are properly scoped - -## The Analyzer in Action - -The TimeWarp.State Analyzer enforces this pattern through the `TW0001` diagnostic rule. Here are some examples: - -### ✅ Valid Code - -```csharp -public class CounterState : IState -{ - public int Count { get; private set; } - - // Correctly nested Action - public class IncrementAction : IAction { } -} -``` - -### ❌ Invalid Code - -```csharp -// Error TW0001: The Action 'IncrementAction' is not a nested type of its State -public class IncrementAction : IAction { } -``` - -## How It Works - -The analyzer: - -1. Identifies types implementing `IAction` -2. Verifies they are nested within a type implementing `IState` -3. Reports violations as compilation errors - -This ensures architectural compliance at compile-time rather than runtime. - -## Advanced Scenarios - -The analyzer handles various scenarios: - -### Record-based Actions -```csharp -public class WeatherState : IState -{ - public record UpdateTemperatureAction(double Temperature) : IAction; -} -``` - -### Inherited Actions -```csharp -public class BaseState : IState -{ - public abstract class BaseAction : IAction { } - - public class ConcreteAction : BaseAction { } -} -``` - -## Best Practices - -1. Name Actions clearly to indicate their purpose -2. Keep Actions focused and specific to their parent State -3. Use appropriate type declarations (class/record/struct) based on needs -4. Consider inheritance for shared Action behavior - -## Conclusion - -The TimeWarp.State Analyzer helps maintain clean architecture by enforcing proper Action nesting. This design pattern promotes maintainable and discoverable code while preventing common architectural mistakes at compile-time. - -For more information, check out the [TimeWarp.State documentation](https://timewarpengineering.github.io/timewarp-state/). +# Enforcing State-Action Architecture with TimeWarp.State Analyzer + +TimeWarp.State enforces a clean architectural pattern where Actions must be nested within their corresponding State types. This design decision helps maintain clear boundaries and relationships between States and their Actions. Let's explore how the TimeWarp.State Analyzer enforces this pattern through static code analysis. + +## Why Nest Actions in States? + +Nesting Actions within their State classes provides several benefits: + +1. **Clear Ownership**: Each Action explicitly belongs to a specific State +2. **Encapsulation**: Actions are tightly coupled with their State's implementation +3. **Discoverability**: Developers can easily find all Actions that affect a State +4. **Type Safety**: The compiler ensures Actions are properly scoped + +## The Analyzer in Action + +The TimeWarp.State Analyzer enforces this pattern through the `TW0001` diagnostic rule. Here are some examples: + +### ✅ Valid Code + +```csharp +public class CounterState : IState +{ + public int Count { get; private set; } + + // Correctly nested Action + public class IncrementAction : IAction { } +} +``` + +### ❌ Invalid Code + +```csharp +// Error TW0001: The Action 'IncrementAction' is not a nested type of its State +public class IncrementAction : IAction { } +``` + +## How It Works + +The analyzer: + +1. Identifies types implementing `IAction` +2. Verifies they are nested within a type implementing `IState` +3. Reports violations as compilation errors + +This ensures architectural compliance at compile-time rather than runtime. + +## Advanced Scenarios + +The analyzer handles various scenarios: + +### Record-based Actions +```csharp +public class WeatherState : IState +{ + public record UpdateTemperatureAction(double Temperature) : IAction; +} +``` + +### Inherited Actions +```csharp +public class BaseState : IState +{ + public abstract class BaseAction : IAction { } + + public class ConcreteAction : BaseAction { } +} +``` + +## Best Practices + +1. Name Actions clearly to indicate their purpose +2. Keep Actions focused and specific to their parent State +3. Use appropriate type declarations (class/record/struct) based on needs +4. Consider inheritance for shared Action behavior + +## Conclusion + +The TimeWarp.State Analyzer helps maintain clean architecture by enforcing proper Action nesting. This design pattern promotes maintainable and discoverable code while preventing common architectural mistakes at compile-time. + +For more information, check out the [TimeWarp.State documentation](https://timewarpengineering.github.io/timewarp-state/). diff --git a/Documentation/Blogs/2024-02-TimeWarp-State-11-Release.md b/Documentation/Blogs/2024-02-TimeWarp-State-11-Release.md index f1fdfcb81..6d1c166f3 100644 --- a/Documentation/Blogs/2024-02-TimeWarp-State-11-Release.md +++ b/Documentation/Blogs/2024-02-TimeWarp-State-11-Release.md @@ -1,55 +1,55 @@ -# TimeWarp.State 11.0.0: A New Era in Blazor State Management - -We're thrilled to announce the release of TimeWarp.State 11.0.0, marking a significant milestone in our journey. Previously known as Blazor-State, this release represents not just a rebranding but a major evolution in state management for Blazor applications. - -## What's New in TimeWarp.State? - -### 🚀 Major Enhancements - -#### TimeWarp.State.Plus Package -We've introduced a new package packed with advanced features: -- **Timer System**: Robust timer management with MultiTimer support and activity-based reset capabilities -- **Enhanced Routing**: New TwBreadcrumb and TwPageTitle components -- **Improved Caching**: TimeWarpCacheableState for better state persistence - -#### TimeWarp.State.Policies Package -Enforce architectural patterns with our new policies package: -- BeNestedInStateCustomRule for proper nesting -- HaveInjectableConstructor rule -- HaveJsonConstructor rule -- Comprehensive Action, ActionHandler, ActionSet, and State policies - -### 💡 Key Features - -- **Flexible State Inheritance**: Chain inherits from State<> to create custom BaseState<> implementations -- **ActionSet Source Generator**: Simplified action creation -- **Persistent State**: New [PersistentState] attribute for state persistence -- **Enhanced Action Tracking**: Improved capabilities with ActionTrackingState -- **Advanced Rendering Control**: Fine-grained control over component re-rendering through TimeWarpStateComponent -- **Better Performance**: New RenderMode and RenderReasons tracking for optimized rendering - -### 🛠 Developer Experience - -- **Improved Analyzers**: TimeWarp.State.Analyzer provides comprehensive code analysis -- **Enhanced Source Generators**: Improved development productivity -- **Comprehensive Samples**: New examples demonstrating various features: - - Basic State and Action Handler usage - - Redux DevTools integration - - Action Tracking capabilities - - Advanced routing features - -## Breaking Changes - -TimeWarp.State 11.0.0 requires .NET 8.0 or later. The rebranding means you'll need to update: -- Package references from `Blazor-State` to `TimeWarp.State` -- Namespace references from `BlazorState` to `TimeWarp.State` - -For detailed migration instructions, check our [Migration Guide](https://timewarpengineering.github.io/timewarp-state/Migrations/Migration10-11.html). - -## Looking Forward - -This release sets a new foundation for state management in Blazor applications. With improved performance, enhanced developer tools, and new features, TimeWarp.State 11.0.0 provides a robust solution for managing application state. - -We're committed to continuing this evolution, making state management in Blazor applications more powerful and developer-friendly. - -Ready to get started? Check out our [documentation](https://timewarpengineering.github.io/timewarp-state/) for comprehensive guides and examples. +# TimeWarp.State 11.0.0: A New Era in Blazor State Management + +We're thrilled to announce the release of TimeWarp.State 11.0.0, marking a significant milestone in our journey. Previously known as Blazor-State, this release represents not just a rebranding but a major evolution in state management for Blazor applications. + +## What's New in TimeWarp.State? + +### 🚀 Major Enhancements + +#### TimeWarp.State.Plus Package +We've introduced a new package packed with advanced features: +- **Timer System**: Robust timer management with MultiTimer support and activity-based reset capabilities +- **Enhanced Routing**: New TwBreadcrumb and TwPageTitle components +- **Improved Caching**: TimeWarpCacheableState for better state persistence + +#### TimeWarp.State.Policies Package +Enforce architectural patterns with our new policies package: +- BeNestedInStateCustomRule for proper nesting +- HaveInjectableConstructor rule +- HaveJsonConstructor rule +- Comprehensive Action, ActionHandler, ActionSet, and State policies + +### 💡 Key Features + +- **Flexible State Inheritance**: Chain inherits from State<> to create custom BaseState<> implementations +- **ActionSet Source Generator**: Simplified action creation +- **Persistent State**: New [PersistentState] attribute for state persistence +- **Enhanced Action Tracking**: Improved capabilities with ActionTrackingState +- **Advanced Rendering Control**: Fine-grained control over component re-rendering through TimeWarpStateComponent +- **Better Performance**: New RenderMode and RenderReasons tracking for optimized rendering + +### 🛠 Developer Experience + +- **Improved Analyzers**: TimeWarp.State.Analyzer provides comprehensive code analysis +- **Enhanced Source Generators**: Improved development productivity +- **Comprehensive Samples**: New examples demonstrating various features: + - Basic State and Action Handler usage + - Redux DevTools integration + - Action Tracking capabilities + - Advanced routing features + +## Breaking Changes + +TimeWarp.State 11.0.0 requires .NET 8.0 or later. The rebranding means you'll need to update: +- Package references from `Blazor-State` to `TimeWarp.State` +- Namespace references from `BlazorState` to `TimeWarp.State` + +For detailed migration instructions, check our [Migration Guide](https://timewarpengineering.github.io/timewarp-state/Migrations/Migration10-11.html). + +## Looking Forward + +This release sets a new foundation for state management in Blazor applications. With improved performance, enhanced developer tools, and new features, TimeWarp.State 11.0.0 provides a robust solution for managing application state. + +We're committed to continuing this evolution, making state management in Blazor applications more powerful and developer-friendly. + +Ready to get started? Check out our [documentation](https://timewarpengineering.github.io/timewarp-state/) for comprehensive guides and examples. diff --git a/Documentation/ReleaseNotes/Release10.0.0.md b/Documentation/ReleaseNotes/Release10.0.0.md index 5f5c04d29..76e7a6468 100644 --- a/Documentation/ReleaseNotes/Release10.0.0.md +++ b/Documentation/ReleaseNotes/Release10.0.0.md @@ -1,12 +1,12 @@ ---- -uid: BlazorState:Release.10.0.0.md -title: Release 10.0.0 ---- - -## Release 10.0.0 - -### Breaking Changes - -* IBlazorStateComponent no longer has Mediator or Store properties. - -See [Migrations](xref:BlazorState:Migration9-10.md) for instructions on how to migrate from version 9.0 to 10.0. +--- +uid: BlazorState:Release.10.0.0.md +title: Release 10.0.0 +--- + +## Release 10.0.0 + +### Breaking Changes + +* IBlazorStateComponent no longer has Mediator or Store properties. + +See [Migrations](xref:BlazorState:Migration9-10.md) for instructions on how to migrate from version 9.0 to 10.0. diff --git a/Documentation/ReleaseNotes/Release11.0.0.md b/Documentation/ReleaseNotes/Release11.0.0.md index 5952ceec0..cd10ec376 100644 --- a/Documentation/ReleaseNotes/Release11.0.0.md +++ b/Documentation/ReleaseNotes/Release11.0.0.md @@ -1,89 +1,89 @@ ---- -uid: TimeWarpState:Release.11.0.0.md -title: Release 11.0.0 ---- - -## Release 11.0.0 - -### Major Changes - -**Rebranding to TimeWarp.State** -We're excited to announce that Blazor-State has been rebranded to TimeWarp.State. -This change reflects our evolving vision and commitment to providing a robust state management solution for Blazor applications. - -### Breaking Changes - -See [Migrations](xref:TimeWarpState:Migration10-11.md) for instructions on how to migrate from version 10.0 to 11.0. - -- `TimeWarp.State` now requires .NET 8.0 or later. -- All references to `BlazorState` should be updated to `TimeWarp.State`. -- The package name has changed from `Blazor-State` to `TimeWarp.State`. - You'll need to update your package references and namespaces accordingly. - -### New Features - -- Enabled chained inherits from State<> - so users can make/use their own BaseState<> -- Introduced `TimeWarp.State.Plus` NuGet package with additional features: - - New Timer system with MultiTimer support and activity-based reset capabilities - - Feature Flag system for managing feature toggles - - Enhanced routing with TwBreadcrumb and TwPageTitle components - - Improved caching with TimeWarpCacheableState -- Added `TimeWarp.State.Policies` NuGet package for architecture policies: - - BeNestedInStateCustomRule for enforcing proper nesting - - HaveInjectableConstructor rule - - HaveJsonConstructor rule - - Action, ActionHandler, ActionSet, and State policies -- Implemented ActionSet source generator for simplified action creation -- Added support for persistent state with `[PersistentState]` attribute -- Introduced `RenderSubscriptionContext` for improved render subscription management -- Added `ActionTrackingState` for better action tracking capabilities -- Enhanced component rendering with new RenderMode and RenderReasons tracking - -### Improvements - -- Optimized CI/CD pipelines for better performance and reliability -- Enhanced caching mechanisms for NuGet packages in GitHub Actions -- Improved logging capabilities with new Logger implementation -- Updated to use the latest MediatR version -- Refactored and improved the test suite: - - Added comprehensive Playwright end-to-end tests - - New architecture tests for enforcing conventions - - Enhanced integration tests -- Optimized TwPageTitle component with improved rendering performance -- Added state initialization pre-processor -- Enhanced JavaScript interop capabilities - -### Documentation - -- Completely revamped documentation structure and content -- Added new tutorials and updated existing ones for TimeWarp.State -- Implemented automated documentation publishing workflow -- Added comprehensive samples demonstrating various features: - - Sample 00: Basic State and Action Handler usage - - Sample 01: Redux DevTools integration - - Sample 02: Action Tracking capabilities - - Sample 03: Advanced routing features - -### Developer Experience - -- Added support for central package management -- Improved developer tooling, including updated EditorConfig and coding standards -- Enhanced source generators for better development productivity -- Added TimeWarp.State.Analyzer for code analysis: - - ActionAnalyzer - - StateImplementationAnalyzer - - StateInheritanceAnalyzer - - StateReadOnlyPublicPropertiesAnalyzer - -### Other Changes - -- Removed time travel debugging feature to optimize performance and reduce complexity -- Updated all dependencies to their latest stable versions -- Improved error handling and exception reporting throughout the library -- Added .ai folder to the repository for prompting AI-generated content -- Reorganized project structure for better maintainability -- Enhanced build and test scripts - -### Migration Guide - -For detailed instructions on how to migrate from Blazor-State to TimeWarp.State, please refer to our [Migration Guide](xref:TimeWarpState:Migration10-11.md). +--- +uid: TimeWarpState:Release.11.0.0.md +title: Release 11.0.0 +--- + +## Release 11.0.0 + +### Major Changes + +**Rebranding to TimeWarp.State** +We're excited to announce that Blazor-State has been rebranded to TimeWarp.State. +This change reflects our evolving vision and commitment to providing a robust state management solution for Blazor applications. + +### Breaking Changes + +See [Migrations](xref:TimeWarpState:Migration10-11.md) for instructions on how to migrate from version 10.0 to 11.0. + +- `TimeWarp.State` now requires .NET 8.0 or later. +- All references to `BlazorState` should be updated to `TimeWarp.State`. +- The package name has changed from `Blazor-State` to `TimeWarp.State`. + You'll need to update your package references and namespaces accordingly. + +### New Features + +- Enabled chained inherits from State<> - so users can make/use their own BaseState<> +- Introduced `TimeWarp.State.Plus` NuGet package with additional features: + - New Timer system with MultiTimer support and activity-based reset capabilities + - Feature Flag system for managing feature toggles + - Enhanced routing with TwBreadcrumb and TwPageTitle components + - Improved caching with TimeWarpCacheableState +- Added `TimeWarp.State.Policies` NuGet package for architecture policies: + - BeNestedInStateCustomRule for enforcing proper nesting + - HaveInjectableConstructor rule + - HaveJsonConstructor rule + - Action, ActionHandler, ActionSet, and State policies +- Implemented ActionSet source generator for simplified action creation +- Added support for persistent state with `[PersistentState]` attribute +- Introduced `RenderSubscriptionContext` for improved render subscription management +- Added `ActionTrackingState` for better action tracking capabilities +- Enhanced component rendering with new RenderMode and RenderReasons tracking + +### Improvements + +- Optimized CI/CD pipelines for better performance and reliability +- Enhanced caching mechanisms for NuGet packages in GitHub Actions +- Improved logging capabilities with new Logger implementation +- Updated to use the latest MediatR version +- Refactored and improved the test suite: + - Added comprehensive Playwright end-to-end tests + - New architecture tests for enforcing conventions + - Enhanced integration tests +- Optimized TwPageTitle component with improved rendering performance +- Added state initialization pre-processor +- Enhanced JavaScript interop capabilities + +### Documentation + +- Completely revamped documentation structure and content +- Added new tutorials and updated existing ones for TimeWarp.State +- Implemented automated documentation publishing workflow +- Added comprehensive samples demonstrating various features: + - Sample 00: Basic State and Action Handler usage + - Sample 01: Redux DevTools integration + - Sample 02: Action Tracking capabilities + - Sample 03: Advanced routing features + +### Developer Experience + +- Added support for central package management +- Improved developer tooling, including updated EditorConfig and coding standards +- Enhanced source generators for better development productivity +- Added TimeWarp.State.Analyzer for code analysis: + - ActionAnalyzer + - StateImplementationAnalyzer + - StateInheritanceAnalyzer + - StateReadOnlyPublicPropertiesAnalyzer + +### Other Changes + +- Removed time travel debugging feature to optimize performance and reduce complexity +- Updated all dependencies to their latest stable versions +- Improved error handling and exception reporting throughout the library +- Added .ai folder to the repository for prompting AI-generated content +- Reorganized project structure for better maintainability +- Enhanced build and test scripts + +### Migration Guide + +For detailed instructions on how to migrate from Blazor-State to TimeWarp.State, please refer to our [Migration Guide](xref:TimeWarpState:Migration10-11.md). diff --git a/Documentation/ReleaseNotes/Release9.0.0.md b/Documentation/ReleaseNotes/Release9.0.0.md index 2cb9f5271..d1ba0f806 100644 --- a/Documentation/ReleaseNotes/Release9.0.0.md +++ b/Documentation/ReleaseNotes/Release9.0.0.md @@ -1,24 +1,24 @@ ---- -uid: BlazorState:Release.9.0.0.md -title: Release 9.0.0 ---- - -## Release 9.0.0 - -### Breaking Changes - -* Blazor-State now requires MediatR version 12.1.1 which actually should have been a breaking change on MediatR. - -See [Migrations](xref:BlazorState:Migration8-9.md) for instructions on how to migrate from version 8.0 to 9.0. - -### Other Changes - -* Updates to the Sample app and test app to use MediatR version 12.1 -* Update Microsoft.CodeAnalysis.Common 4.6.0 -> 4.7.0 -* Update Microsoft.CodeAnalysis.CSharp.Workspaces 4.6.0 -> 4.7.0 -* Updates other development dependencies - - -## Release 9.0.1 - +--- +uid: BlazorState:Release.9.0.0.md +title: Release 9.0.0 +--- + +## Release 9.0.0 + +### Breaking Changes + +* Blazor-State now requires MediatR version 12.1.1 which actually should have been a breaking change on MediatR. + +See [Migrations](xref:BlazorState:Migration8-9.md) for instructions on how to migrate from version 8.0 to 9.0. + +### Other Changes + +* Updates to the Sample app and test app to use MediatR version 12.1 +* Update Microsoft.CodeAnalysis.Common 4.6.0 -> 4.7.0 +* Update Microsoft.CodeAnalysis.CSharp.Workspaces 4.6.0 -> 4.7.0 +* Updates other development dependencies + + +## Release 9.0.1 + * Added InvalidCloneException to assist in detecting when the clone did not work as expected. \ No newline at end of file diff --git a/Kanban/Done/001_Build-TimeWarp-State-Tutorial.md b/Kanban/Done/001_Build-TimeWarp-State-Tutorial.md index 6429c82a0..f47856cb1 100644 --- a/Kanban/Done/001_Build-TimeWarp-State-Tutorial.md +++ b/Kanban/Done/001_Build-TimeWarp-State-Tutorial.md @@ -1,63 +1,63 @@ -# Task 001: Build TimeWarp.State Tutorial - -## Description -Create a comprehensive tutorial for TimeWarp.State that walks users through building a Blazor application with state management. The tutorial will demonstrate core concepts and best practices through practical examples. - -## Requirements -- Tutorial must be clear and beginner-friendly -- Cover essential TimeWarp.State concepts: - 1. State class implementation and initialization - 2. Action definition and structure - 3. Handler implementation for state mutation - 4. Component integration with TimeWarpStateComponent - 5. Pipeline flow: Component -> Action -> Handler -> State - 6. State immutability and proper mutation patterns -- Include practical, working examples -- Provide clear explanations for each step -- Follow consistent naming convention: - * Use 'Sample00' for first tutorial project - * Subsequent tutorials will use 'Sample01', 'Sample02', etc. - * Project names should align with tutorial directory numbers -- Cover Blazor render modes: - * Interactive Auto (current tutorial) - * Static (no state management needed) - -## Checklist - -### Design -- [x] Plan tutorial structure -- [x] Design basic counter example -- [x] Add render mode metadata to tutorial -- [x] Plan additional render mode tutorials - -### Implementation -- [x] Basic project setup instructions -- [x] Service configuration steps -- [x] Counter state implementation -- [x] Action and Handler implementation -- [x] UI integration -- [x] Standardize project naming convention - -### Documentation -- [x] Basic tutorial documentation in Readme.md - -### Review -- [x] Tutorial walkthrough verification -- [x] Test across supported render modes - -## Notes -- Base tutorial content exists in Samples/00-StateActionHandler/Readme.md -- Include common pitfalls and how to avoid them: - 1. Direct state mutation outside handlers - 2. Improper state initialization - 3. Missing service configuration -- Consider adding diagrams for: - 1. State-Action-Handler flow - 2. Component interaction with state -- Project naming follows pattern: Sample[XX] -- Each tutorial should clearly indicate its render mode -- Initial counter example implemented and working -- Service configuration documented -- Basic state management flow demonstrated -- Project renamed from 'Sample' to 'Sample00' -- Added render mode metadata to tutorial +# Task 001: Build TimeWarp.State Tutorial + +## Description +Create a comprehensive tutorial for TimeWarp.State that walks users through building a Blazor application with state management. The tutorial will demonstrate core concepts and best practices through practical examples. + +## Requirements +- Tutorial must be clear and beginner-friendly +- Cover essential TimeWarp.State concepts: + 1. State class implementation and initialization + 2. Action definition and structure + 3. Handler implementation for state mutation + 4. Component integration with TimeWarpStateComponent + 5. Pipeline flow: Component -> Action -> Handler -> State + 6. State immutability and proper mutation patterns +- Include practical, working examples +- Provide clear explanations for each step +- Follow consistent naming convention: + * Use 'Sample00' for first tutorial project + * Subsequent tutorials will use 'Sample01', 'Sample02', etc. + * Project names should align with tutorial directory numbers +- Cover Blazor render modes: + * Interactive Auto (current tutorial) + * Static (no state management needed) + +## Checklist + +### Design +- [x] Plan tutorial structure +- [x] Design basic counter example +- [x] Add render mode metadata to tutorial +- [x] Plan additional render mode tutorials + +### Implementation +- [x] Basic project setup instructions +- [x] Service configuration steps +- [x] Counter state implementation +- [x] Action and Handler implementation +- [x] UI integration +- [x] Standardize project naming convention + +### Documentation +- [x] Basic tutorial documentation in Readme.md + +### Review +- [x] Tutorial walkthrough verification +- [x] Test across supported render modes + +## Notes +- Base tutorial content exists in Samples/00-StateActionHandler/Readme.md +- Include common pitfalls and how to avoid them: + 1. Direct state mutation outside handlers + 2. Improper state initialization + 3. Missing service configuration +- Consider adding diagrams for: + 1. State-Action-Handler flow + 2. Component interaction with state +- Project naming follows pattern: Sample[XX] +- Each tutorial should clearly indicate its render mode +- Initial counter example implemented and working +- Service configuration documented +- Basic state management flow demonstrated +- Project renamed from 'Sample' to 'Sample00' +- Added render mode metadata to tutorial diff --git a/Kanban/Done/002_Create-TimeWarp-State-Server-Tutorial.md b/Kanban/Done/002_Create-TimeWarp-State-Server-Tutorial.md index 0d7758771..09aff4cad 100644 --- a/Kanban/Done/002_Create-TimeWarp-State-Server-Tutorial.md +++ b/Kanban/Done/002_Create-TimeWarp-State-Server-Tutorial.md @@ -1,54 +1,54 @@ -# Task 002: Create TimeWarp.State Server Tutorial - -## Description -Create a comprehensive tutorial for TimeWarp.State that demonstrates building a Blazor application with state management in Interactive Server mode. The tutorial will showcase how to implement state management specifically for server-side Blazor applications. - -## Requirements -- Tutorial must be clear and beginner-friendly -- Cover essential TimeWarp.State concepts in server context: - 1. State class implementation and initialization - 2. Action definition and structure - 3. Handler implementation for state mutation - 4. Component integration with TimeWarpStateComponent - 5. Pipeline flow: Component -> Action -> Handler -> State - 6. State immutability and proper mutation patterns -- Include practical, working examples -- Provide clear explanations for each step -- Follow consistent naming convention -- Focus on Interactive Server render mode specifics -- Address server-specific considerations: - * SignalR connection management - * Server-side state persistence - * Performance considerations - -## Checklist - -### Design -- [x] Plan tutorial structure -- [x] Design example application -- [x] Identify server-specific patterns and best practices - -### Implementation -- [x] Basic project setup instructions -- [x] Service configuration steps -- [x] State implementation -- [x] Action and Handler implementation -- [x] UI integration -- [x] Server-specific configuration - -### Documentation -- [x] Basic tutorial documentation -- [x] Server-specific considerations and best practices -- [x] Performance recommendations - -### Review -- [x] Tutorial walkthrough verification -- [x] Test with Interactive Server render mode -- [x] Verify SignalR connection handling - -## Notes -- Tutorial has been completed and is available in Samples/00-StateActionHandler/Server/README.md -- Includes comprehensive implementation details and examples -- Covers server-specific considerations and best practices -- Demonstrates proper state management patterns -- Highlights key differences from other render modes +# Task 002: Create TimeWarp.State Server Tutorial + +## Description +Create a comprehensive tutorial for TimeWarp.State that demonstrates building a Blazor application with state management in Interactive Server mode. The tutorial will showcase how to implement state management specifically for server-side Blazor applications. + +## Requirements +- Tutorial must be clear and beginner-friendly +- Cover essential TimeWarp.State concepts in server context: + 1. State class implementation and initialization + 2. Action definition and structure + 3. Handler implementation for state mutation + 4. Component integration with TimeWarpStateComponent + 5. Pipeline flow: Component -> Action -> Handler -> State + 6. State immutability and proper mutation patterns +- Include practical, working examples +- Provide clear explanations for each step +- Follow consistent naming convention +- Focus on Interactive Server render mode specifics +- Address server-specific considerations: + * SignalR connection management + * Server-side state persistence + * Performance considerations + +## Checklist + +### Design +- [x] Plan tutorial structure +- [x] Design example application +- [x] Identify server-specific patterns and best practices + +### Implementation +- [x] Basic project setup instructions +- [x] Service configuration steps +- [x] State implementation +- [x] Action and Handler implementation +- [x] UI integration +- [x] Server-specific configuration + +### Documentation +- [x] Basic tutorial documentation +- [x] Server-specific considerations and best practices +- [x] Performance recommendations + +### Review +- [x] Tutorial walkthrough verification +- [x] Test with Interactive Server render mode +- [x] Verify SignalR connection handling + +## Notes +- Tutorial has been completed and is available in Samples/00-StateActionHandler/Server/README.md +- Includes comprehensive implementation details and examples +- Covers server-specific considerations and best practices +- Demonstrates proper state management patterns +- Highlights key differences from other render modes diff --git a/Kanban/Done/003_Create-TimeWarp-State-WebAssembly-Tutorial.md b/Kanban/Done/003_Create-TimeWarp-State-WebAssembly-Tutorial.md index 8f950e860..7212595bd 100644 --- a/Kanban/Done/003_Create-TimeWarp-State-WebAssembly-Tutorial.md +++ b/Kanban/Done/003_Create-TimeWarp-State-WebAssembly-Tutorial.md @@ -1,54 +1,54 @@ -# Task 003: Create TimeWarp.State WebAssembly Tutorial - -## Description -Create a comprehensive tutorial for TimeWarp.State that demonstrates building a Blazor application with state management in Interactive WebAssembly mode. The tutorial will showcase how to implement state management specifically for WebAssembly-based Blazor applications. - -## Requirements -- Tutorial must be clear and beginner-friendly -- Cover essential TimeWarp.State concepts in WebAssembly context: - 1. State class implementation and initialization - 2. Action definition and structure - 3. Handler implementation for state mutation - 4. Component integration with TimeWarpStateComponent - 5. Pipeline flow: Component -> Action -> Handler -> State - 6. State immutability and proper mutation patterns -- Include practical, working examples -- Provide clear explanations for each step -- Follow consistent naming convention -- Focus on Interactive WebAssembly render mode specifics -- Address WebAssembly-specific considerations: - * Client-side state management - * Browser storage integration - * Performance optimization - * Download size considerations - -## Checklist - -### Design -- [ ] Plan tutorial structure -- [ ] Design example application -- [ ] Identify WebAssembly-specific patterns and best practices - -### Implementation -- [ ] Basic project setup instructions -- [ ] Service configuration steps -- [ ] State implementation -- [ ] Action and Handler implementation -- [ ] UI integration -- [ ] WebAssembly-specific configuration - -### Documentation -- [ ] Basic tutorial documentation -- [ ] WebAssembly-specific considerations and best practices -- [ ] Performance optimization guidelines - -### Review -- [ ] Tutorial walkthrough verification -- [ ] Test with Interactive WebAssembly render mode -- [ ] Verify browser compatibility - -## Notes -- Should complement the existing Auto mode tutorial -- Include WebAssembly-specific pitfalls and how to avoid them -- Consider adding diagrams for client-side state flow -- Focus on differences from other render modes +# Task 003: Create TimeWarp.State WebAssembly Tutorial + +## Description +Create a comprehensive tutorial for TimeWarp.State that demonstrates building a Blazor application with state management in Interactive WebAssembly mode. The tutorial will showcase how to implement state management specifically for WebAssembly-based Blazor applications. + +## Requirements +- Tutorial must be clear and beginner-friendly +- Cover essential TimeWarp.State concepts in WebAssembly context: + 1. State class implementation and initialization + 2. Action definition and structure + 3. Handler implementation for state mutation + 4. Component integration with TimeWarpStateComponent + 5. Pipeline flow: Component -> Action -> Handler -> State + 6. State immutability and proper mutation patterns +- Include practical, working examples +- Provide clear explanations for each step +- Follow consistent naming convention +- Focus on Interactive WebAssembly render mode specifics +- Address WebAssembly-specific considerations: + * Client-side state management + * Browser storage integration + * Performance optimization + * Download size considerations + +## Checklist + +### Design +- [ ] Plan tutorial structure +- [ ] Design example application +- [ ] Identify WebAssembly-specific patterns and best practices + +### Implementation +- [ ] Basic project setup instructions +- [ ] Service configuration steps +- [ ] State implementation +- [ ] Action and Handler implementation +- [ ] UI integration +- [ ] WebAssembly-specific configuration + +### Documentation +- [ ] Basic tutorial documentation +- [ ] WebAssembly-specific considerations and best practices +- [ ] Performance optimization guidelines + +### Review +- [ ] Tutorial walkthrough verification +- [ ] Test with Interactive WebAssembly render mode +- [ ] Verify browser compatibility + +## Notes +- Should complement the existing Auto mode tutorial +- Include WebAssembly-specific pitfalls and how to avoid them +- Consider adding diagrams for client-side state flow +- Focus on differences from other render modes diff --git a/Kanban/Done/004_Fix-Source-Generator-Visibility-Bug.md b/Kanban/Done/004_Fix-Source-Generator-Visibility-Bug.md index 2a543c69a..c0a3101d8 100644 --- a/Kanban/Done/004_Fix-Source-Generator-Visibility-Bug.md +++ b/Kanban/Done/004_Fix-Source-Generator-Visibility-Bug.md @@ -1,26 +1,26 @@ -# Task: Fix ActionSetMethodGenerator Visibility Bug - -## Description -The ActionSetMethodGenerator is currently declaring the partial class with explicit public visibility, which conflicts with the original class's visibility when it's internal. - -## Requirements -- Remove explicit visibility modifier from the partial class declaration in the generator -- Let the partial class inherit visibility from the original class declaration - -## Implementation Notes -- Issue found in ActionSetMethodGenerator.cs line 82 -- Currently declaring with explicit public visibility: -```csharp -public partial class {{parentClassName}} -``` -- Should remove visibility modifier: -```csharp -partial class {{parentClassName}} -``` - -## Files to Modify -- Source/TimeWarp.State.SourceGenerator/ActionSetMethodGenerator.cs - -## Checklist -- [ ] Remove 'public' modifier from partial class declaration -- [ ] Test with internal and public state classes +# Task: Fix ActionSetMethodGenerator Visibility Bug + +## Description +The ActionSetMethodGenerator is currently declaring the partial class with explicit public visibility, which conflicts with the original class's visibility when it's internal. + +## Requirements +- Remove explicit visibility modifier from the partial class declaration in the generator +- Let the partial class inherit visibility from the original class declaration + +## Implementation Notes +- Issue found in ActionSetMethodGenerator.cs line 82 +- Currently declaring with explicit public visibility: +```csharp +public partial class {{parentClassName}} +``` +- Should remove visibility modifier: +```csharp +partial class {{parentClassName}} +``` + +## Files to Modify +- Source/TimeWarp.State.SourceGenerator/ActionSetMethodGenerator.cs + +## Checklist +- [ ] Remove 'public' modifier from partial class declaration +- [ ] Test with internal and public state classes diff --git a/Kanban/Done/005_Build-ReduxDevTools-Tutorial.md b/Kanban/Done/005_Build-ReduxDevTools-Tutorial.md index d005126a4..5f318e2b8 100644 --- a/Kanban/Done/005_Build-ReduxDevTools-Tutorial.md +++ b/Kanban/Done/005_Build-ReduxDevTools-Tutorial.md @@ -1,69 +1,69 @@ -# Task 005: Build ReduxDevTools Tutorial - -## Description -Create a comprehensive tutorial that demonstrates how to add Redux DevTools support to a TimeWarp.State Blazor WebAssembly application. This tutorial will build upon the foundation established in the StateActionHandler tutorial (Sample00) and show users how to integrate and utilize Redux DevTools for state debugging and monitoring. - -## Requirements -- Prerequisites must be clearly stated: - 1. Completed Sample00 StateActionHandler tutorial - 2. Understanding of basic TimeWarp.State concepts -- Tutorial must cover: - 1. Adding ReduxDevTools configuration to services - 2. Setting up JavaScript Interop - 3. Implementing RouteState management - 4. Using Redux DevTools in Chrome Dev Tools -- Include practical demonstrations of: - 1. Viewing state changes in Redux DevTools - 2. Monitoring actions as they are executed - 3. Inspecting RouteState in DevTools -- Follow consistent naming convention: - * Use 'Sample01' for the project name - * Maintain alignment with tutorial directory structure - -## Checklist - -### Design -- [ ] Review existing Sample00 tutorial structure -- [ ] Plan ReduxDevTools integration steps -- [ ] Design clear examples of DevTools usage - -### Implementation -- [ ] Update Program.cs configuration -- [ ] Add JavaScript Interop setup -- [ ] Implement RouteState management -- [ ] Add App.razor.cs implementation -- [ ] Verify Redux DevTools integration - -### Documentation -- [ ] Create step-by-step tutorial documentation -- [ ] Add screenshots of Redux DevTools interface -- [ ] Document RouteState visualization -- [ ] Include troubleshooting tips - -### Review -- [ ] Test tutorial walkthrough -- [ ] Verify Redux DevTools functionality -- [ ] Check JavaScript Interop implementation -- [ ] Ensure RouteState is properly tracked - -## Notes -- Base tutorial content exists in: - 1. Samples/00-StateActionHandler/Wasm/README.md (prerequisites) - 2. Samples/01-ReduxDevTools/Readme.md (implementation) -- Key components to document: - 1. ReduxDevTools configuration in Program.cs - 2. JavaScript Interop setup in App.razor.cs - 3. RouteState management implementation - 4. Chrome DevTools integration -- Include screenshots showing: - 1. Redux DevTools interface with actions - 2. RouteState visualization in DevTools -- Common pitfalls to address: - 1. Missing JavaScript Interop initialization - 2. Incorrect service configuration - 3. Chrome DevTools access and usage - -## Implementation Notes -- Tutorial should emphasize the debugging and monitoring capabilities provided by Redux DevTools -- Clear explanation needed for the relationship between TimeWarp.State actions and Redux DevTools visualization -- Include guidance on using DevTools for development and debugging workflows +# Task 005: Build ReduxDevTools Tutorial + +## Description +Create a comprehensive tutorial that demonstrates how to add Redux DevTools support to a TimeWarp.State Blazor WebAssembly application. This tutorial will build upon the foundation established in the StateActionHandler tutorial (Sample00) and show users how to integrate and utilize Redux DevTools for state debugging and monitoring. + +## Requirements +- Prerequisites must be clearly stated: + 1. Completed Sample00 StateActionHandler tutorial + 2. Understanding of basic TimeWarp.State concepts +- Tutorial must cover: + 1. Adding ReduxDevTools configuration to services + 2. Setting up JavaScript Interop + 3. Implementing RouteState management + 4. Using Redux DevTools in Chrome Dev Tools +- Include practical demonstrations of: + 1. Viewing state changes in Redux DevTools + 2. Monitoring actions as they are executed + 3. Inspecting RouteState in DevTools +- Follow consistent naming convention: + * Use 'Sample01' for the project name + * Maintain alignment with tutorial directory structure + +## Checklist + +### Design +- [ ] Review existing Sample00 tutorial structure +- [ ] Plan ReduxDevTools integration steps +- [ ] Design clear examples of DevTools usage + +### Implementation +- [ ] Update Program.cs configuration +- [ ] Add JavaScript Interop setup +- [ ] Implement RouteState management +- [ ] Add App.razor.cs implementation +- [ ] Verify Redux DevTools integration + +### Documentation +- [ ] Create step-by-step tutorial documentation +- [ ] Add screenshots of Redux DevTools interface +- [ ] Document RouteState visualization +- [ ] Include troubleshooting tips + +### Review +- [ ] Test tutorial walkthrough +- [ ] Verify Redux DevTools functionality +- [ ] Check JavaScript Interop implementation +- [ ] Ensure RouteState is properly tracked + +## Notes +- Base tutorial content exists in: + 1. Samples/00-StateActionHandler/Wasm/README.md (prerequisites) + 2. Samples/01-ReduxDevTools/Readme.md (implementation) +- Key components to document: + 1. ReduxDevTools configuration in Program.cs + 2. JavaScript Interop setup in App.razor.cs + 3. RouteState management implementation + 4. Chrome DevTools integration +- Include screenshots showing: + 1. Redux DevTools interface with actions + 2. RouteState visualization in DevTools +- Common pitfalls to address: + 1. Missing JavaScript Interop initialization + 2. Incorrect service configuration + 3. Chrome DevTools access and usage + +## Implementation Notes +- Tutorial should emphasize the debugging and monitoring capabilities provided by Redux DevTools +- Clear explanation needed for the relationship between TimeWarp.State actions and Redux DevTools visualization +- Include guidance on using DevTools for development and debugging workflows diff --git a/Kanban/Done/006_Rename-Sample00-Application.md b/Kanban/Done/006_Rename-Sample00-Application.md index 2f42e76f0..fd0024fe2 100644 --- a/Kanban/Done/006_Rename-Sample00-Application.md +++ b/Kanban/Done/006_Rename-Sample00-Application.md @@ -1,44 +1,44 @@ -# Task 006: Rename Sample00 Application to Sample00Auto - -## Description - -Rename the Sample00 Application to Sample00Auto to maintain consistency with the Server and Wasm naming conventions in the project structure. - -## Requirements - -- Rename the Sample00 Application directory to Sample00Auto -- Update any references to the application name in configuration files -- Ensure build and test processes continue to work after the rename - -## Checklist - -### Design -- [ ] Review all references to Sample00 in the codebase -- [ ] Plan the renaming strategy to minimize impact - -### Implementation -- [ ] Rename the application directory -- [ ] Update project references -- [ ] Update solution files -- [ ] Update any import statements or namespaces -- [ ] Update build scripts if necessary -- [ ] Verify build process works -- [ ] Run tests to ensure no regressions - -### Documentation -- [ ] Update documentation references -- [ ] Update any example code or tutorials - -### Review -- [ ] Consider CI/CD Implications -- [ ] Code Review -- [ ] Verify all tests pass -- [ ] Ensure no broken references - -## Notes - -The rename is needed to maintain consistent naming conventions across the project, where Server and Wasm components already follow this pattern. - -## Implementation Notes - -- To be filled in during implementation +# Task 006: Rename Sample00 Application to Sample00Auto + +## Description + +Rename the Sample00 Application to Sample00Auto to maintain consistency with the Server and Wasm naming conventions in the project structure. + +## Requirements + +- Rename the Sample00 Application directory to Sample00Auto +- Update any references to the application name in configuration files +- Ensure build and test processes continue to work after the rename + +## Checklist + +### Design +- [ ] Review all references to Sample00 in the codebase +- [ ] Plan the renaming strategy to minimize impact + +### Implementation +- [ ] Rename the application directory +- [ ] Update project references +- [ ] Update solution files +- [ ] Update any import statements or namespaces +- [ ] Update build scripts if necessary +- [ ] Verify build process works +- [ ] Run tests to ensure no regressions + +### Documentation +- [ ] Update documentation references +- [ ] Update any example code or tutorials + +### Review +- [ ] Consider CI/CD Implications +- [ ] Code Review +- [ ] Verify all tests pass +- [ ] Ensure no broken references + +## Notes + +The rename is needed to maintain consistent naming conventions across the project, where Server and Wasm components already follow this pattern. + +## Implementation Notes + +- To be filled in during implementation diff --git a/Kanban/Done/007-Create-Action-Tracking-Sample.md b/Kanban/Done/007-Create-Action-Tracking-Sample.md index 44179d32d..6ef58cd8c 100644 --- a/Kanban/Done/007-Create-Action-Tracking-Sample.md +++ b/Kanban/Done/007-Create-Action-Tracking-Sample.md @@ -1,92 +1,92 @@ -# Task 007: Create Action Tracking Tutorial and Sample - -## Description - -Create a step-by-step tutorial in the README explaining how to implement Action Tracking, followed by creating a sample application that demonstrates these concepts. This will help developers understand how to utilize the Action Tracking Feature from TimeWarp.State.Plus in their applications. - -## Requirements - -Phase 1 - Tutorial Creation: -- Create a detailed tutorial in the README that explains: - - What Action Tracking is and its benefits - - How to use the existing ActionTrackingState from TimeWarp.State.Plus - - Step-by-step guide for implementing tracked actions - - How to display and manage action tracking information - -Phase 2 - Sample Implementation: -- Create a sample application based on Sample00Wasm that implements the concepts from the tutorial -- Demonstrate practical usage of action tracking features - -## Checklist - -### Phase 1 - Tutorial -- [x] Research and outline tutorial structure -- [x] Document Action Tracking concept overview -- [x] Write step-by-step implementation guide: - - [x] Adding TimeWarp.State.Plus package - - [x] Creating trackable actions - - [x] Using TrackActionAttribute - - [x] Configuring ActionTrackingBehavior - - [x] Displaying tracking information -- [x] Include code snippets and examples -- [x] Add troubleshooting section -- [x] Review and refine tutorial content - -### Phase 2 - Sample Implementation -- [x] Create new sample project based on Sample00Wasm -- [x] Implement features following tutorial steps: - - [x] Create State with tracked actions - - [x] Implement sample actions (TwoSecondAction, FiveSecondAction) - - [x] Add tracking configuration - - [x] Create UI components -- [x] Verify implementation matches tutorial -- [x] Test and validate functionality - -### Documentation -- [x] Update main documentation to reference tutorial -- [x] Add inline code comments -- [x] Create sample project README -- [x] Add usage examples - -### Review -- [x] Review tutorial clarity and completeness -- [x] Test tutorial steps for accuracy -- [x] Verify sample implementation -- [x] Review code quality -- [x] Test build and run process - -## Notes - -Reference implementations: -- Tests/Test.App/Test.App.Client/Pages/ActiveActionsPage.razor -- Source/TimeWarp.State.Plus/Features/ActionTracking/ActionTrackingState/ActionTrackingState.cs -- Source/TimeWarp.State.Plus/Features/ActionTracking/Pipeline/ActionTrackingBehavior.cs -- Source/TimeWarp.State.Plus/Features/ActionTracking/Pipeline/TrackActionAttribute.cs - -Tutorial should cover: -- Action Tracking concept explanation -- Using existing ActionTrackingState -- Creating trackable actions -- Implementing tracking display -- Error handling -- Best practices - -Sample should demonstrate: -- Practical implementation of tutorial concepts -- Multiple action duration scenarios -- Concurrent action handling -- Error handling scenarios - -## Implementation Notes - -Tutorial considerations: -1. Focus on clarity and step-by-step progression -2. Include practical examples -3. Explain why each step is necessary -4. Address common pitfalls - -Sample considerations: -1. Follow tutorial structure exactly -2. Demonstrate practical usage -3. Include error handling examples -4. Show concurrent action tracking +# Task 007: Create Action Tracking Tutorial and Sample + +## Description + +Create a step-by-step tutorial in the README explaining how to implement Action Tracking, followed by creating a sample application that demonstrates these concepts. This will help developers understand how to utilize the Action Tracking Feature from TimeWarp.State.Plus in their applications. + +## Requirements + +Phase 1 - Tutorial Creation: +- Create a detailed tutorial in the README that explains: + - What Action Tracking is and its benefits + - How to use the existing ActionTrackingState from TimeWarp.State.Plus + - Step-by-step guide for implementing tracked actions + - How to display and manage action tracking information + +Phase 2 - Sample Implementation: +- Create a sample application based on Sample00Wasm that implements the concepts from the tutorial +- Demonstrate practical usage of action tracking features + +## Checklist + +### Phase 1 - Tutorial +- [x] Research and outline tutorial structure +- [x] Document Action Tracking concept overview +- [x] Write step-by-step implementation guide: + - [x] Adding TimeWarp.State.Plus package + - [x] Creating trackable actions + - [x] Using TrackActionAttribute + - [x] Configuring ActionTrackingBehavior + - [x] Displaying tracking information +- [x] Include code snippets and examples +- [x] Add troubleshooting section +- [x] Review and refine tutorial content + +### Phase 2 - Sample Implementation +- [x] Create new sample project based on Sample00Wasm +- [x] Implement features following tutorial steps: + - [x] Create State with tracked actions + - [x] Implement sample actions (TwoSecondAction, FiveSecondAction) + - [x] Add tracking configuration + - [x] Create UI components +- [x] Verify implementation matches tutorial +- [x] Test and validate functionality + +### Documentation +- [x] Update main documentation to reference tutorial +- [x] Add inline code comments +- [x] Create sample project README +- [x] Add usage examples + +### Review +- [x] Review tutorial clarity and completeness +- [x] Test tutorial steps for accuracy +- [x] Verify sample implementation +- [x] Review code quality +- [x] Test build and run process + +## Notes + +Reference implementations: +- Tests/Test.App/Test.App.Client/Pages/ActiveActionsPage.razor +- Source/TimeWarp.State.Plus/Features/ActionTracking/ActionTrackingState/ActionTrackingState.cs +- Source/TimeWarp.State.Plus/Features/ActionTracking/Pipeline/ActionTrackingBehavior.cs +- Source/TimeWarp.State.Plus/Features/ActionTracking/Pipeline/TrackActionAttribute.cs + +Tutorial should cover: +- Action Tracking concept explanation +- Using existing ActionTrackingState +- Creating trackable actions +- Implementing tracking display +- Error handling +- Best practices + +Sample should demonstrate: +- Practical implementation of tutorial concepts +- Multiple action duration scenarios +- Concurrent action handling +- Error handling scenarios + +## Implementation Notes + +Tutorial considerations: +1. Focus on clarity and step-by-step progression +2. Include practical examples +3. Explain why each step is necessary +4. Address common pitfalls + +Sample considerations: +1. Follow tutorial structure exactly +2. Demonstrate practical usage +3. Include error handling examples +4. Show concurrent action tracking diff --git a/Kanban/Done/008-Move-Active-Actions-Section.md b/Kanban/Done/008-Move-Active-Actions-Section.md index c566c8531..6f215750e 100644 --- a/Kanban/Done/008-Move-Active-Actions-Section.md +++ b/Kanban/Done/008-Move-Active-Actions-Section.md @@ -1,39 +1,39 @@ -# Task 008: Move Active Actions Section Below Buttons - -## Description - -Move the "Active Actions" section on the Action Tracking Demo page below the action buttons to prevent UI jumping when actions are triggered. - -## Requirements - -- Active Actions section must be positioned below the action buttons -- UI must remain stable when actions are running -- Existing functionality must be preserved - -## Checklist - -### Design -- [ ] Review current layout in Demo.razor -- [ ] Plan new component structure - -### Implementation -- [ ] Move Active Actions section below buttons in Demo.razor -- [ ] Test with running actions -- [ ] Verify UI stability - -### Documentation -- [ ] Update any relevant documentation if needed - -### Review -- [ ] Consider Accessibility Implications -- [ ] Consider Performance Implications -- [ ] Code Review - -## Notes - -File to modify: -- Samples\02-ActionTracking\Sample02Wasm\Pages\Demo.razor - -## Implementation Notes - -To be added during implementation. +# Task 008: Move Active Actions Section Below Buttons + +## Description + +Move the "Active Actions" section on the Action Tracking Demo page below the action buttons to prevent UI jumping when actions are triggered. + +## Requirements + +- Active Actions section must be positioned below the action buttons +- UI must remain stable when actions are running +- Existing functionality must be preserved + +## Checklist + +### Design +- [ ] Review current layout in Demo.razor +- [ ] Plan new component structure + +### Implementation +- [ ] Move Active Actions section below buttons in Demo.razor +- [ ] Test with running actions +- [ ] Verify UI stability + +### Documentation +- [ ] Update any relevant documentation if needed + +### Review +- [ ] Consider Accessibility Implications +- [ ] Consider Performance Implications +- [ ] Code Review + +## Notes + +File to modify: +- Samples\02-ActionTracking\Sample02Wasm\Pages\Demo.razor + +## Implementation Notes + +To be added during implementation. diff --git a/Kanban/Done/009-Create-Routing-Sample.md b/Kanban/Done/009-Create-Routing-Sample.md index 2845f6403..16d20761b 100644 --- a/Kanban/Done/009-Create-Routing-Sample.md +++ b/Kanban/Done/009-Create-Routing-Sample.md @@ -1,161 +1,161 @@ -# Task 009: Create Sample Application Demonstrating TimeWarp State Plus Routing Feature - -## Description - -Create a new sample application that demonstrates the TimeWarp.State.Plus Routing Feature's comprehensive navigation management system. This feature provides stack-based navigation history that enables breadcrumb navigation, along with direct route changes and back navigation capabilities through state management. - -## Requirements - -- Demonstrate all three core actions of the Routing Feature: - 1. ChangeRoute: Direct navigation with absolute URI handling - 2. GoBack: Stack-based back navigation with configurable steps - 3. PushRouteInfo: Route stack management with title synchronization -- Implement a breadcrumb component showcasing the primary use case: - - Display navigation history using RouteState.Routes - - Show page titles in breadcrumb trail - - Enable navigation through breadcrumb clicks -- Show proper integration with NavigationManager -- Demonstrate thread-safe route updates -- Implement logging for route changes -- Show both component-based and manual implementations - -## Checklist - -### Design -- [x] Review existing implementation: - - [x] RouteState stack management - - [x] ChangeRoute action handling - - [x] GoBack functionality - - [x] PushRouteInfo synchronization - - [x] Thread safety mechanisms -- [x] Design navigation flow demonstrating all actions -- [x] Design breadcrumb component layout and behavior -- [x] Plan demonstration scenarios - -### Implementation -- [x] Create sample project structure -- [x] Implement RouteState integration -- [x] Create multiple pages with distinct titles -- [x] Implement breadcrumb component: - - [x] Display route stack as breadcrumb trail - - [x] Show page titles - - [x] Handle breadcrumb navigation - - [x] Style breadcrumb UI -- [x] Add additional navigation components: - - [x] Direct route change controls - - [x] Back navigation with step selection - - [x] Route stack visualization -- [x] Implement all action handlers: - - [x] ChangeRoute with proper URI handling - - [x] GoBack with stack management - - [x] PushRouteInfo with title sync -- [x] Add logging integration -- [x] Implement thread safety -- [x] Add TimeWarpPageRenderNotifier example -- [x] Add manual PushRouteInfo example - -### Documentation -- [x] Add README explaining: - - [x] All three routing actions - - [x] Stack-based navigation concept - - [x] Breadcrumb implementation using RouteState - - [x] Route state management - - [x] Thread safety considerations - - [x] Logging integration -- [x] Document navigation patterns -- [x] Add inline documentation -- [x] Include usage examples - -### Review -- [x] Test all routing actions: - - [x] Direct route changes - - [x] Back navigation - - [x] Route stack updates -- [x] Test breadcrumb functionality: - - [x] Correct display of navigation history - - [x] Proper handling of breadcrumb navigation - - [x] Title synchronization -- [x] Verify logging output -- [x] Test thread safety -- [x] Validate page title synchronization -- [x] Ensure proper state management -- [x] Code Review - -## Notes - -- Reference implementation in Source/TimeWarp.State.Plus/Features/Routing/RouteState -- Primary use case is enabling breadcrumb navigation through RouteState.Routes -- Ensure proper handling of absolute vs relative URIs -- Demonstrate logging of route changes -- Show proper semaphore usage for route updates -- Include examples of both TimeWarpPageRenderNotifier and manual implementations -- Follow patterns from Test.App.Client's GoBackPage implementation - -## Implementation Notes - -### Components Overview - -1. TwPageTitle Component - - Integrates with TimeWarp's route state management - - Wraps Blazor's built-in PageTitle component - - Performance optimized: - - Inherits TimeWarpStateComponent for efficient parameter tracking - - Uses built-in parameter change detection - - Avoids state subscriptions to prevent render loops - - Updates route state only on first render - - Leverages reference comparison for RenderFragment changes - - Simple usage: `Your Page Title` - -2. TwBreadcrumb Component - - Provides stack-based navigation history visualization - - Features: - - Configurable maximum number of displayed links through MaxLinks parameter - - Shows ellipsis when routes exceed MaxLinks - - Displays newest-to-oldest navigation history - - Automatic active state handling for current route - - Direct navigation through breadcrumb clicks using GoBack action - - Implementation details: - - Inherits TimeWarpStateComponent - - Uses RouteState.Routes for navigation history - - Calculates correct "steps back" for each breadcrumb link - - Prevents default link behavior and uses state-managed navigation - - Semantic HTML with proper accessibility attributes and CSS classes for customization - -### Integration Points - -1. Route State Management - - Components work together to maintain consistent navigation state: - - TwPageTitle updates the route info in the state - - TwBreadcrumb reads from the route state to display history - - Both components leverage TimeWarpStateComponent for optimization - -2. Navigation Flow - - TwPageTitle: Updates page title and maintains route state - - TwBreadcrumb: Provides UI for navigating through route history - - Both components work with RouteState actions: - - ChangeRoute: Used for direct navigation - - GoBack: Used by breadcrumb navigation - - PushRouteInfo: Managed by TwPageTitle for route stack updates - -3. Performance Considerations - - Both components are optimized for minimal re-renders - - State updates are carefully managed to prevent infinite loops - - Parameter change detection is leveraged for efficiency - - Reference comparison is used where applicable - -### Usage Guidelines - -1. Page Title Management - - Use TwPageTitle on each page to maintain accurate navigation history - - Title updates automatically sync with route state - - No manual PushRouteInfo calls needed when using TwPageTitle - -2. Breadcrumb Navigation - - Place TwBreadcrumb component where navigation history should be displayed - - Configure MaxLinks based on UI requirements - - Breadcrumb links automatically handle navigation through GoBack action - -3. State Integration - - Components handle state management internally - - No additional setup required beyond component placement - - Thread-safe route updates are managed by the underlying RouteState +# Task 009: Create Sample Application Demonstrating TimeWarp State Plus Routing Feature + +## Description + +Create a new sample application that demonstrates the TimeWarp.State.Plus Routing Feature's comprehensive navigation management system. This feature provides stack-based navigation history that enables breadcrumb navigation, along with direct route changes and back navigation capabilities through state management. + +## Requirements + +- Demonstrate all three core actions of the Routing Feature: + 1. ChangeRoute: Direct navigation with absolute URI handling + 2. GoBack: Stack-based back navigation with configurable steps + 3. PushRouteInfo: Route stack management with title synchronization +- Implement a breadcrumb component showcasing the primary use case: + - Display navigation history using RouteState.Routes + - Show page titles in breadcrumb trail + - Enable navigation through breadcrumb clicks +- Show proper integration with NavigationManager +- Demonstrate thread-safe route updates +- Implement logging for route changes +- Show both component-based and manual implementations + +## Checklist + +### Design +- [x] Review existing implementation: + - [x] RouteState stack management + - [x] ChangeRoute action handling + - [x] GoBack functionality + - [x] PushRouteInfo synchronization + - [x] Thread safety mechanisms +- [x] Design navigation flow demonstrating all actions +- [x] Design breadcrumb component layout and behavior +- [x] Plan demonstration scenarios + +### Implementation +- [x] Create sample project structure +- [x] Implement RouteState integration +- [x] Create multiple pages with distinct titles +- [x] Implement breadcrumb component: + - [x] Display route stack as breadcrumb trail + - [x] Show page titles + - [x] Handle breadcrumb navigation + - [x] Style breadcrumb UI +- [x] Add additional navigation components: + - [x] Direct route change controls + - [x] Back navigation with step selection + - [x] Route stack visualization +- [x] Implement all action handlers: + - [x] ChangeRoute with proper URI handling + - [x] GoBack with stack management + - [x] PushRouteInfo with title sync +- [x] Add logging integration +- [x] Implement thread safety +- [x] Add TimeWarpPageRenderNotifier example +- [x] Add manual PushRouteInfo example + +### Documentation +- [x] Add README explaining: + - [x] All three routing actions + - [x] Stack-based navigation concept + - [x] Breadcrumb implementation using RouteState + - [x] Route state management + - [x] Thread safety considerations + - [x] Logging integration +- [x] Document navigation patterns +- [x] Add inline documentation +- [x] Include usage examples + +### Review +- [x] Test all routing actions: + - [x] Direct route changes + - [x] Back navigation + - [x] Route stack updates +- [x] Test breadcrumb functionality: + - [x] Correct display of navigation history + - [x] Proper handling of breadcrumb navigation + - [x] Title synchronization +- [x] Verify logging output +- [x] Test thread safety +- [x] Validate page title synchronization +- [x] Ensure proper state management +- [x] Code Review + +## Notes + +- Reference implementation in Source/TimeWarp.State.Plus/Features/Routing/RouteState +- Primary use case is enabling breadcrumb navigation through RouteState.Routes +- Ensure proper handling of absolute vs relative URIs +- Demonstrate logging of route changes +- Show proper semaphore usage for route updates +- Include examples of both TimeWarpPageRenderNotifier and manual implementations +- Follow patterns from Test.App.Client's GoBackPage implementation + +## Implementation Notes + +### Components Overview + +1. TwPageTitle Component + - Integrates with TimeWarp's route state management + - Wraps Blazor's built-in PageTitle component + - Performance optimized: + - Inherits TimeWarpStateComponent for efficient parameter tracking + - Uses built-in parameter change detection + - Avoids state subscriptions to prevent render loops + - Updates route state only on first render + - Leverages reference comparison for RenderFragment changes + - Simple usage: `Your Page Title` + +2. TwBreadcrumb Component + - Provides stack-based navigation history visualization + - Features: + - Configurable maximum number of displayed links through MaxLinks parameter + - Shows ellipsis when routes exceed MaxLinks + - Displays newest-to-oldest navigation history + - Automatic active state handling for current route + - Direct navigation through breadcrumb clicks using GoBack action + - Implementation details: + - Inherits TimeWarpStateComponent + - Uses RouteState.Routes for navigation history + - Calculates correct "steps back" for each breadcrumb link + - Prevents default link behavior and uses state-managed navigation + - Semantic HTML with proper accessibility attributes and CSS classes for customization + +### Integration Points + +1. Route State Management + - Components work together to maintain consistent navigation state: + - TwPageTitle updates the route info in the state + - TwBreadcrumb reads from the route state to display history + - Both components leverage TimeWarpStateComponent for optimization + +2. Navigation Flow + - TwPageTitle: Updates page title and maintains route state + - TwBreadcrumb: Provides UI for navigating through route history + - Both components work with RouteState actions: + - ChangeRoute: Used for direct navigation + - GoBack: Used by breadcrumb navigation + - PushRouteInfo: Managed by TwPageTitle for route stack updates + +3. Performance Considerations + - Both components are optimized for minimal re-renders + - State updates are carefully managed to prevent infinite loops + - Parameter change detection is leveraged for efficiency + - Reference comparison is used where applicable + +### Usage Guidelines + +1. Page Title Management + - Use TwPageTitle on each page to maintain accurate navigation history + - Title updates automatically sync with route state + - No manual PushRouteInfo calls needed when using TwPageTitle + +2. Breadcrumb Navigation + - Place TwBreadcrumb component where navigation history should be displayed + - Configure MaxLinks based on UI requirements + - Breadcrumb links automatically handle navigation through GoBack action + +3. State Integration + - Components handle state management internally + - No additional setup required beyond component placement + - Thread-safe route updates are managed by the underlying RouteState diff --git a/Kanban/Done/012-Create-TrackedPageTitle-Component.md b/Kanban/Done/012-Create-TrackedPageTitle-Component.md index cb2736056..d7446c733 100644 --- a/Kanban/Done/012-Create-TrackedPageTitle-Component.md +++ b/Kanban/Done/012-Create-TrackedPageTitle-Component.md @@ -1,51 +1,51 @@ -# Task 012: Create TrackedPageTitle Component - -## Description - -Create a new Blazor component called TrackedPageTitle that will automatically update the RouteState when the page title changes. This component will help maintain consistent route state tracking across the application. - -## Requirements - -- Create a new Blazor component called TrackedPageTitle -- Component should accept a Title parameter -- Component should call RouteState.PushRouteInfo whenever the Title changes -- Component should be reusable across different pages -- Implement proper parameter change detection -- Ensure proper integration with existing RouteState functionality - -## Checklist - -### Design -- [ ] Design component interface -- [ ] Plan integration with RouteState -- [ ] Add unit tests for the component - -### Implementation -- [ ] Create TrackedPageTitle.razor component -- [ ] Implement Title parameter handling -- [ ] Implement RouteState.PushRouteInfo integration -- [ ] Add parameter change detection -- [ ] Add component to shared components -- [ ] Test integration with existing pages - -### Documentation -- [ ] Add XML documentation to component -- [ ] Update usage documentation -- [ ] Add example usage in sample application - -### Review -- [ ] Consider Performance Implications of title updates -- [ ] Code Review -- [ ] Test in sample application - -## Notes - -This component will be a key part of the routing infrastructure, ensuring that route state is properly maintained as users navigate through the application. It will help maintain a consistent state tracking mechanism for page titles across the application. - -## Implementation Notes - -Key considerations: -- Use OnParametersSet lifecycle method to detect title changes -- Ensure proper null checking for Title parameter -- Consider implementing IDisposable if needed for cleanup -- May need to handle cases where RouteState is not available +# Task 012: Create TrackedPageTitle Component + +## Description + +Create a new Blazor component called TrackedPageTitle that will automatically update the RouteState when the page title changes. This component will help maintain consistent route state tracking across the application. + +## Requirements + +- Create a new Blazor component called TrackedPageTitle +- Component should accept a Title parameter +- Component should call RouteState.PushRouteInfo whenever the Title changes +- Component should be reusable across different pages +- Implement proper parameter change detection +- Ensure proper integration with existing RouteState functionality + +## Checklist + +### Design +- [ ] Design component interface +- [ ] Plan integration with RouteState +- [ ] Add unit tests for the component + +### Implementation +- [ ] Create TrackedPageTitle.razor component +- [ ] Implement Title parameter handling +- [ ] Implement RouteState.PushRouteInfo integration +- [ ] Add parameter change detection +- [ ] Add component to shared components +- [ ] Test integration with existing pages + +### Documentation +- [ ] Add XML documentation to component +- [ ] Update usage documentation +- [ ] Add example usage in sample application + +### Review +- [ ] Consider Performance Implications of title updates +- [ ] Code Review +- [ ] Test in sample application + +## Notes + +This component will be a key part of the routing infrastructure, ensuring that route state is properly maintained as users navigate through the application. It will help maintain a consistent state tracking mechanism for page titles across the application. + +## Implementation Notes + +Key considerations: +- Use OnParametersSet lifecycle method to detect title changes +- Ensure proper null checking for Title parameter +- Consider implementing IDisposable if needed for cleanup +- May need to handle cases where RouteState is not available diff --git a/Kanban/Done/013_Update-Breadcrumb-Navigation.md b/Kanban/Done/013_Update-Breadcrumb-Navigation.md index 9a34b78ff..097e96061 100644 --- a/Kanban/Done/013_Update-Breadcrumb-Navigation.md +++ b/Kanban/Done/013_Update-Breadcrumb-Navigation.md @@ -1,76 +1,76 @@ -# Task 013: Update BreadCrumb Component Navigation Implementation - -## Description - -Update the BreadCrumb component to improve its navigation implementation by: -1. Using RouteState's GoBack method instead of ChangeRoute for more accurate navigation history -2. Replacing anchor tags with NavLink components for better Blazor integration - -## Requirements - -- Replace `` tags with Blazor's `` components -- Modify the component to use RouteState.GoBack instead of RouteState.ChangeRoute -- Calculate the correct number of steps to go back based on the clicked breadcrumb position -- Maintain existing functionality where breadcrumb items show the navigation history -- Ensure the component still works with the existing RouteState pattern - -## Checklist - -### Design -- [ ] Review current breadcrumb navigation behavior -- [ ] Design the logic to calculate steps to go back -- [ ] Plan NavLink implementation and styling - -### Implementation -- [ ] Update BreadCrumb.razor component to use NavLink -- [ ] Replace ChangeRoute call with GoBack -- [ ] Implement logic to calculate the number of steps to go back -- [ ] Ensure proper CSS classes are applied to NavLink components -- [ ] Test the component in various navigation scenarios - -### Documentation -- [ ] Update component documentation if present -- [ ] Add comments explaining the GoBack calculation logic -- [ ] Document NavLink configuration - -### Review -- [ ] Consider Accessibility Implications - - Ensure navigation behavior remains intuitive - - Verify ARIA attributes are maintained with NavLink -- [ ] Consider Performance Implications - - Verify navigation stack handling is efficient -- [ ] Code Review - -## Notes - -Current Implementation: -```razor - - @route.PageTitle - -``` - -Needs to be updated to: -```razor - - @route.PageTitle - -``` - -And code-behind change: -```csharp -private async Task NavigateBack(int position) -{ - await RouteState.GoBack(position); -} -``` - -The position parameter should be calculated based on the difference between the current position and the clicked breadcrumb position in the navigation stack. - -## Implementation Notes - -- The GoBack method is already implemented in RouteState and tested in GoBackPage.razor -- NavLink provides better integration with Blazor's routing system -- NavLink automatically handles active state styling -- The change will provide more accurate navigation history management -- Consider adding validation to prevent invalid navigation attempts +# Task 013: Update BreadCrumb Component Navigation Implementation + +## Description + +Update the BreadCrumb component to improve its navigation implementation by: +1. Using RouteState's GoBack method instead of ChangeRoute for more accurate navigation history +2. Replacing anchor tags with NavLink components for better Blazor integration + +## Requirements + +- Replace `` tags with Blazor's `` components +- Modify the component to use RouteState.GoBack instead of RouteState.ChangeRoute +- Calculate the correct number of steps to go back based on the clicked breadcrumb position +- Maintain existing functionality where breadcrumb items show the navigation history +- Ensure the component still works with the existing RouteState pattern + +## Checklist + +### Design +- [ ] Review current breadcrumb navigation behavior +- [ ] Design the logic to calculate steps to go back +- [ ] Plan NavLink implementation and styling + +### Implementation +- [ ] Update BreadCrumb.razor component to use NavLink +- [ ] Replace ChangeRoute call with GoBack +- [ ] Implement logic to calculate the number of steps to go back +- [ ] Ensure proper CSS classes are applied to NavLink components +- [ ] Test the component in various navigation scenarios + +### Documentation +- [ ] Update component documentation if present +- [ ] Add comments explaining the GoBack calculation logic +- [ ] Document NavLink configuration + +### Review +- [ ] Consider Accessibility Implications + - Ensure navigation behavior remains intuitive + - Verify ARIA attributes are maintained with NavLink +- [ ] Consider Performance Implications + - Verify navigation stack handling is efficient +- [ ] Code Review + +## Notes + +Current Implementation: +```razor + + @route.PageTitle + +``` + +Needs to be updated to: +```razor + + @route.PageTitle + +``` + +And code-behind change: +```csharp +private async Task NavigateBack(int position) +{ + await RouteState.GoBack(position); +} +``` + +The position parameter should be calculated based on the difference between the current position and the clicked breadcrumb position in the navigation stack. + +## Implementation Notes + +- The GoBack method is already implemented in RouteState and tested in GoBackPage.razor +- NavLink provides better integration with Blazor's routing system +- NavLink automatically handles active state styling +- The change will provide more accurate navigation history management +- Consider adding validation to prevent invalid navigation attempts diff --git a/Kanban/Done/014-Validate-Program-Main-Usage-In-Samples.md b/Kanban/Done/014-Validate-Program-Main-Usage-In-Samples.md index 11c055831..e90e1ccb4 100644 --- a/Kanban/Done/014-Validate-Program-Main-Usage-In-Samples.md +++ b/Kanban/Done/014-Validate-Program-Main-Usage-In-Samples.md @@ -1,44 +1,44 @@ -# Task 014: Validate --program-main Usage in Samples - -## Description - -Ensure all samples are consistently using the --program-main approach in both code implementation and documentation instructions. - -## Requirements - -- Review all sample projects for --program-main usage -- Verify both code implementations and documentation reflect the correct usage -- Ensure consistency across all samples - -## Checklist - -### Design -- [ ] Review current --program-main implementation in samples -- [ ] Identify any inconsistencies or missing implementations - -### Implementation -- [ ] Update sample projects to use --program-main where missing -- [ ] Standardize implementation across all samples -- [ ] Verify each sample builds and runs correctly - -### Documentation -- [ ] Update sample documentation to reflect --program-main usage -- [ ] Ensure README files in sample directories mention --program-main -- [ ] Update any related tutorial content - -### Review -- [ ] Verify all samples work as expected -- [ ] Code Review -- [ ] Documentation Review - -## Notes - -The --program-main approach is important for proper application initialization and should be consistently implemented across all sample projects to demonstrate best practices. - -## Implementation Notes - -- List of samples to review: - - Sample 00-StateActionHandler - - Sample 01-ReduxDevTools - - Sample 02-ActionTracking - - Sample 03-Routing +# Task 014: Validate --program-main Usage in Samples + +## Description + +Ensure all samples are consistently using the --program-main approach in both code implementation and documentation instructions. + +## Requirements + +- Review all sample projects for --program-main usage +- Verify both code implementations and documentation reflect the correct usage +- Ensure consistency across all samples + +## Checklist + +### Design +- [ ] Review current --program-main implementation in samples +- [ ] Identify any inconsistencies or missing implementations + +### Implementation +- [ ] Update sample projects to use --program-main where missing +- [ ] Standardize implementation across all samples +- [ ] Verify each sample builds and runs correctly + +### Documentation +- [ ] Update sample documentation to reflect --program-main usage +- [ ] Ensure README files in sample directories mention --program-main +- [ ] Update any related tutorial content + +### Review +- [ ] Verify all samples work as expected +- [ ] Code Review +- [ ] Documentation Review + +## Notes + +The --program-main approach is important for proper application initialization and should be consistently implemented across all sample projects to demonstrate best practices. + +## Implementation Notes + +- List of samples to review: + - Sample 00-StateActionHandler + - Sample 01-ReduxDevTools + - Sample 02-ActionTracking + - Sample 03-Routing diff --git a/Kanban/Done/015-Optimize-TwPageTitle-Rendering.md b/Kanban/Done/015-Optimize-TwPageTitle-Rendering.md index f4323537e..7d7e0ae3d 100644 --- a/Kanban/Done/015-Optimize-TwPageTitle-Rendering.md +++ b/Kanban/Done/015-Optimize-TwPageTitle-Rendering.md @@ -1,52 +1,52 @@ -# Task 015: Optimize TwPageTitle Using RenderTrigger - -## Description - -Optimize the TwPageTitle component's rendering by implementing a RenderTrigger that will only trigger re-renders when the page title actually changes. This will leverage TimeWarpStateComponent's built-in render optimization features to prevent unnecessary renders. - -## Requirements - -- Implement RegisterRenderTrigger to optimize rendering based on title changes -- Maintain existing route state update functionality -- Ensure component only re-renders when title actually changes - -## Checklist - -### Design -- [ ] Design RenderTrigger condition for title changes -- [ ] Review impact on existing route state updates -- [ ] Consider component lifecycle implications - -### Implementation -- [ ] Add RegisterRenderTrigger in component initialization -- [ ] Configure trigger to compare title changes -- [ ] Maintain existing firstRender route info update -- [ ] Add unit tests for render optimization - -### Documentation -- [ ] Update component documentation -- [ ] Document render trigger implementation - -### Review -- [ ] Verify render optimization -- [ ] Ensure no regression in functionality -- [ ] Code Review - -## Notes - -Current Implementation: -- Uses GetState without subscription to avoid recursion -- Updates route info on firstRender -- No render optimization for title changes - -Optimization Approach: -- Use RegisterRenderTrigger to compare title changes -- Leverage TimeWarpStateComponent's built-in render optimization -- Maintain existing route state management - -## Implementation Notes - -Implementation should: -1. Use RegisterRenderTrigger to compare RouteState title changes -2. Keep existing firstRender route info update -3. Maintain proper state synchronization +# Task 015: Optimize TwPageTitle Using RenderTrigger + +## Description + +Optimize the TwPageTitle component's rendering by implementing a RenderTrigger that will only trigger re-renders when the page title actually changes. This will leverage TimeWarpStateComponent's built-in render optimization features to prevent unnecessary renders. + +## Requirements + +- Implement RegisterRenderTrigger to optimize rendering based on title changes +- Maintain existing route state update functionality +- Ensure component only re-renders when title actually changes + +## Checklist + +### Design +- [ ] Design RenderTrigger condition for title changes +- [ ] Review impact on existing route state updates +- [ ] Consider component lifecycle implications + +### Implementation +- [ ] Add RegisterRenderTrigger in component initialization +- [ ] Configure trigger to compare title changes +- [ ] Maintain existing firstRender route info update +- [ ] Add unit tests for render optimization + +### Documentation +- [ ] Update component documentation +- [ ] Document render trigger implementation + +### Review +- [ ] Verify render optimization +- [ ] Ensure no regression in functionality +- [ ] Code Review + +## Notes + +Current Implementation: +- Uses GetState without subscription to avoid recursion +- Updates route info on firstRender +- No render optimization for title changes + +Optimization Approach: +- Use RegisterRenderTrigger to compare title changes +- Leverage TimeWarpStateComponent's built-in render optimization +- Maintain existing route state management + +## Implementation Notes + +Implementation should: +1. Use RegisterRenderTrigger to compare RouteState title changes +2. Keep existing firstRender route info update +3. Maintain proper state synchronization diff --git a/Kanban/Done/016-Create-Sample03Wasm-Tutorial.md b/Kanban/Done/016-Create-Sample03Wasm-Tutorial.md index 082aa7887..e530a3488 100644 --- a/Kanban/Done/016-Create-Sample03Wasm-Tutorial.md +++ b/Kanban/Done/016-Create-Sample03Wasm-Tutorial.md @@ -1,74 +1,74 @@ -# Task 016: Create Sample03Wasm Tutorial - -## Description - -Create a comprehensive tutorial that guides users through building Sample03Wasm, demonstrating TimeWarp.State.Plus's routing capabilities. The tutorial will build upon the ReduxDevTools sample, showing how to implement stack-based navigation management with features like breadcrumb navigation, direct route changes, and back navigation. - -## Requirements - -- Tutorial must follow the progression from ReduxDevTools sample to routing implementation -- Cover all key routing features: - * Stack-based navigation - * Breadcrumb navigation - * Direct route changes - * Back navigation - * Thread-safe route updates - * Page title synchronization -- Include implementation of core routing actions: - * ChangeRoute - * GoBack - * PushRouteInfo -- Demonstrate integration with: - * Blazor's NavigationManager - * ReduxDevTools for route debugging - * Built-in logging support - -## Checklist - -### Design -- [x] Review Sample01Wasm (ReduxDevTools) implementation -- [x] Review Sample03Wasm routing implementation -- [x] Map progression path from ReduxDevTools to routing features -- [x] Identify key learning points and concepts - -### Implementation -- [x] Create step-by-step tutorial structure -- [x] Document initial setup from ReduxDevTools base -- [x] Detail routing feature implementation steps -- [x] Include code samples for each routing action -- [x] Add configuration and integration steps -- [x] Include thread safety implementation details -- [x] Document ReduxDevTools integration for route debugging - -### Documentation -- [x] Add tutorial to Documentation/Tutorial folder -- [x] Include screenshots of: - * Route state in ReduxDevTools - * Breadcrumb navigation - * Navigation stack visualization -- [x] Add diagrams explaining: - * Stack-based navigation flow - * Route state management -- [x] Include troubleshooting section -- [x] Add best practices section -- [x] Cross-reference with existing tutorials - -### Review -- [x] Verify tutorial progression logic -- [x] Test all code samples -- [x] Validate ReduxDevTools integration steps -- [x] Review thread safety explanations -- [x] Check clarity of routing concepts -- [x] Ensure consistency with existing documentation - -## Notes - -- Base tutorial structure on existing Sample01Wasm (ReduxDevTools) tutorial format -- Focus on explaining the transition from basic state management to advanced routing features -- Include practical examples demonstrating real-world routing scenarios -- Emphasize debugging capabilities through ReduxDevTools integration -- Include examples of common routing patterns and their implementation - -## Implementation Notes - -- To be added during implementation +# Task 016: Create Sample03Wasm Tutorial + +## Description + +Create a comprehensive tutorial that guides users through building Sample03Wasm, demonstrating TimeWarp.State.Plus's routing capabilities. The tutorial will build upon the ReduxDevTools sample, showing how to implement stack-based navigation management with features like breadcrumb navigation, direct route changes, and back navigation. + +## Requirements + +- Tutorial must follow the progression from ReduxDevTools sample to routing implementation +- Cover all key routing features: + * Stack-based navigation + * Breadcrumb navigation + * Direct route changes + * Back navigation + * Thread-safe route updates + * Page title synchronization +- Include implementation of core routing actions: + * ChangeRoute + * GoBack + * PushRouteInfo +- Demonstrate integration with: + * Blazor's NavigationManager + * ReduxDevTools for route debugging + * Built-in logging support + +## Checklist + +### Design +- [x] Review Sample01Wasm (ReduxDevTools) implementation +- [x] Review Sample03Wasm routing implementation +- [x] Map progression path from ReduxDevTools to routing features +- [x] Identify key learning points and concepts + +### Implementation +- [x] Create step-by-step tutorial structure +- [x] Document initial setup from ReduxDevTools base +- [x] Detail routing feature implementation steps +- [x] Include code samples for each routing action +- [x] Add configuration and integration steps +- [x] Include thread safety implementation details +- [x] Document ReduxDevTools integration for route debugging + +### Documentation +- [x] Add tutorial to Documentation/Tutorial folder +- [x] Include screenshots of: + * Route state in ReduxDevTools + * Breadcrumb navigation + * Navigation stack visualization +- [x] Add diagrams explaining: + * Stack-based navigation flow + * Route state management +- [x] Include troubleshooting section +- [x] Add best practices section +- [x] Cross-reference with existing tutorials + +### Review +- [x] Verify tutorial progression logic +- [x] Test all code samples +- [x] Validate ReduxDevTools integration steps +- [x] Review thread safety explanations +- [x] Check clarity of routing concepts +- [x] Ensure consistency with existing documentation + +## Notes + +- Base tutorial structure on existing Sample01Wasm (ReduxDevTools) tutorial format +- Focus on explaining the transition from basic state management to advanced routing features +- Include practical examples demonstrating real-world routing scenarios +- Emphasize debugging capabilities through ReduxDevTools integration +- Include examples of common routing patterns and their implementation + +## Implementation Notes + +- To be added during implementation diff --git a/Kanban/Done/017-Push-To-Production.md b/Kanban/Done/017-Push-To-Production.md index dc0a9c65f..3bd963b76 100644 --- a/Kanban/Done/017-Push-To-Production.md +++ b/Kanban/Done/017-Push-To-Production.md @@ -1,134 +1,134 @@ -# Task 017: Push To Production - -## Description - -Prepare TimeWarp.State for production release by updating version numbers, removing prerelease flags, and ensuring all production readiness requirements are met. - -## Requirements - -- Update version in Directory.Build.props from 11.0.0-beta.96+8.0.403 to 11.0.0 -- Remove --prerelease flags from all sample project package references -- Ensure all documentation is up to date -- Verify all samples are working with production version -- Update release notes - -## Summary of Blocking Issues - -1. Critical Issues (New Tasks Created): - - Task 018: Fix Sample03-Routing state persistence issue (state resets during navigation) - - Task 019: Fix Sample00-StateActionHandler Auto project structure - - Task 020: Fix 36 documentation warnings for invalid links and cross-references - -2. Path to Production: - - Complete Tasks 018, 019, and 020 - - Re-verify all samples with fixes applied - - Final review of documentation with all warnings resolved - - Conduct final security and performance review - - Test package installation in a new project - - Release to production - -## Checklist - -### Design -- [x] Review current version number and update plan -- [x] Review all sample projects for prerelease dependencies - -### Implementation -- [x] Update TimeWarpStateVersion in Directory.Build.props to 11.0.0 -- [x] Remove --prerelease flags from all sample project package references: - - [x] Sample00-StateActionHandler - - [x] Sample01-ReduxDevTools - - [x] Sample02-ActionTracking - - [x] Sample03-Routing -- [x] Update package versions in all sample project files to 11.0.0 -- [ ] Run all samples to verify they work with production version - - [x] Sample00-StateActionHandler Server (Verified working) - - [x] Sample00-StateActionHandler Wasm (Verified working) - - [x] Sample01-ReduxDevTools (Verified working - base functionality works, Redux DevTools warning expected) - - [x] Sample02-ActionTracking (Verified working - action tracking functionality fully operational) - - [x] Sample03-Routing (Partial - routing works but state persistence issue found, see Task 018) - - [ ] Sample00-StateActionHandler Auto (Needs investigation - project structure issue, see Task 019) -- [x] Update packages.lock.json files -- [x] Run all tests to ensure everything passes -- [x] Build and verify NuGet packages - -### Documentation -- [x] Update Release Notes for 11.0.0 -- [x] Review and update main documentation -- [x] Update sample documentation to remove prerelease references -- [x] Verify documentation build and deployment (Build succeeds with warnings, see Task 020) -- [x] Update README.md if needed (No updates required) - -### Review -- [x] Review all breaking changes -- [ ] Verify all features are production-ready (Pending completion of Tasks 018, 019) -- [ ] Check for any deprecated features or warnings -- [ ] Review performance metrics -- [ ] Review security implications -- [ ] Conduct final code review -- [ ] Test package installation in a new project - -## Notes - -- This release marks the transition from beta to production for version 11.0.0 -- All samples should be updated to use the production version -- Documentation should reflect production status -- Consider creating a release checklist template for future releases -- Sample00-StateActionHandler Auto needs investigation for project structure issues (Task 019) -- Sample03-Routing state persistence issue needs investigation before production release (Task 018) -- Documentation warnings need to be resolved (Task 020) -- All test suites passing with expected skipped tests: - - TimeWarp.State.Analyzer.Tests: 4 passed - - TimeWarp.State.Tests: 16 passed, 1 skipped - - TimeWarp.State.Plus.Tests: 8 passed, 1 skipped - - Client.Integration.Tests: 11 passed, 1 skipped - - Test.App.Architecture.Tests: 7 passed, 1 skipped - -## Implementation Notes - -- Updated Directory.Build.props version to 11.0.0 -- Removed --prerelease flags from Sample00-StateActionHandler documentation (both Server and Auto) -- Verified no other samples contained prerelease flags -- Reviewed Release11.0.0.md and confirmed it's comprehensive and up-to-date -- Searched all documentation for any remaining beta/prerelease references and found none -- Updated package versions to 11.0.0 in all sample projects: - - Sample00-StateActionHandler (Server, Wasm, Auto) - - Sample01-ReduxDevTools - - Sample02-ActionTracking - - Sample03-Routing - - Updated both TimeWarp.State and TimeWarp.State.Plus where applicable -- Built and published NuGet packages version 11.0.0 to local feed -- Verified Sample00-StateActionHandler Server working with production version -- Noted issue with Sample00-StateActionHandler Auto project structure - created Task 019 -- Verified Sample00-StateActionHandler Wasm working with production version - counter functionality working as expected -- Verified Sample01-ReduxDevTools working with production version: - - Base counter functionality working correctly - - Redux DevTools integration properly warns when DevTools not installed (expected behavior) -- Verified Sample02-ActionTracking working with production version: - - Counter functionality working correctly - - Action tracking state updates properly - - Both 2-second and 5-second actions work as expected - - Active action status displayed correctly -- Tested Sample03-Routing with production version: - - Basic routing functionality works (navigation and breadcrumbs) - - Page titles update correctly - - Issue found: State does not persist when navigating between pages - created Task 018 - - Counter resets to 0 after navigation, should maintain previous value -- Ran all test suites successfully: - - All core functionality tests passing - - Architecture tests passing - - Integration tests passing - - Only expected example tests skipped -- Documentation build completed with warnings - created Task 020: - - Documentation compiles successfully - - 36 warnings found, mostly related to file links and cross-references - - No critical errors that would prevent documentation deployment -- README.md reviewed and confirmed up-to-date: - - Version references correct - - Installation instructions accurate - - Documentation links valid - - No prerelease content present -- Created new tasks for blocking issues: - - Task 018: Fix Routing State Persistence - - Task 019: Fix Auto Sample Project Structure - - Task 020: Fix Documentation Warnings +# Task 017: Push To Production + +## Description + +Prepare TimeWarp.State for production release by updating version numbers, removing prerelease flags, and ensuring all production readiness requirements are met. + +## Requirements + +- Update version in Directory.Build.props from 11.0.0-beta.96+8.0.403 to 11.0.0 +- Remove --prerelease flags from all sample project package references +- Ensure all documentation is up to date +- Verify all samples are working with production version +- Update release notes + +## Summary of Blocking Issues + +1. Critical Issues (New Tasks Created): + - Task 018: Fix Sample03-Routing state persistence issue (state resets during navigation) + - Task 019: Fix Sample00-StateActionHandler Auto project structure + - Task 020: Fix 36 documentation warnings for invalid links and cross-references + +2. Path to Production: + - Complete Tasks 018, 019, and 020 + - Re-verify all samples with fixes applied + - Final review of documentation with all warnings resolved + - Conduct final security and performance review + - Test package installation in a new project + - Release to production + +## Checklist + +### Design +- [x] Review current version number and update plan +- [x] Review all sample projects for prerelease dependencies + +### Implementation +- [x] Update TimeWarpStateVersion in Directory.Build.props to 11.0.0 +- [x] Remove --prerelease flags from all sample project package references: + - [x] Sample00-StateActionHandler + - [x] Sample01-ReduxDevTools + - [x] Sample02-ActionTracking + - [x] Sample03-Routing +- [x] Update package versions in all sample project files to 11.0.0 +- [ ] Run all samples to verify they work with production version + - [x] Sample00-StateActionHandler Server (Verified working) + - [x] Sample00-StateActionHandler Wasm (Verified working) + - [x] Sample01-ReduxDevTools (Verified working - base functionality works, Redux DevTools warning expected) + - [x] Sample02-ActionTracking (Verified working - action tracking functionality fully operational) + - [x] Sample03-Routing (Partial - routing works but state persistence issue found, see Task 018) + - [ ] Sample00-StateActionHandler Auto (Needs investigation - project structure issue, see Task 019) +- [x] Update packages.lock.json files +- [x] Run all tests to ensure everything passes +- [x] Build and verify NuGet packages + +### Documentation +- [x] Update Release Notes for 11.0.0 +- [x] Review and update main documentation +- [x] Update sample documentation to remove prerelease references +- [x] Verify documentation build and deployment (Build succeeds with warnings, see Task 020) +- [x] Update README.md if needed (No updates required) + +### Review +- [x] Review all breaking changes +- [ ] Verify all features are production-ready (Pending completion of Tasks 018, 019) +- [ ] Check for any deprecated features or warnings +- [ ] Review performance metrics +- [ ] Review security implications +- [ ] Conduct final code review +- [ ] Test package installation in a new project + +## Notes + +- This release marks the transition from beta to production for version 11.0.0 +- All samples should be updated to use the production version +- Documentation should reflect production status +- Consider creating a release checklist template for future releases +- Sample00-StateActionHandler Auto needs investigation for project structure issues (Task 019) +- Sample03-Routing state persistence issue needs investigation before production release (Task 018) +- Documentation warnings need to be resolved (Task 020) +- All test suites passing with expected skipped tests: + - TimeWarp.State.Analyzer.Tests: 4 passed + - TimeWarp.State.Tests: 16 passed, 1 skipped + - TimeWarp.State.Plus.Tests: 8 passed, 1 skipped + - Client.Integration.Tests: 11 passed, 1 skipped + - Test.App.Architecture.Tests: 7 passed, 1 skipped + +## Implementation Notes + +- Updated Directory.Build.props version to 11.0.0 +- Removed --prerelease flags from Sample00-StateActionHandler documentation (both Server and Auto) +- Verified no other samples contained prerelease flags +- Reviewed Release11.0.0.md and confirmed it's comprehensive and up-to-date +- Searched all documentation for any remaining beta/prerelease references and found none +- Updated package versions to 11.0.0 in all sample projects: + - Sample00-StateActionHandler (Server, Wasm, Auto) + - Sample01-ReduxDevTools + - Sample02-ActionTracking + - Sample03-Routing + - Updated both TimeWarp.State and TimeWarp.State.Plus where applicable +- Built and published NuGet packages version 11.0.0 to local feed +- Verified Sample00-StateActionHandler Server working with production version +- Noted issue with Sample00-StateActionHandler Auto project structure - created Task 019 +- Verified Sample00-StateActionHandler Wasm working with production version - counter functionality working as expected +- Verified Sample01-ReduxDevTools working with production version: + - Base counter functionality working correctly + - Redux DevTools integration properly warns when DevTools not installed (expected behavior) +- Verified Sample02-ActionTracking working with production version: + - Counter functionality working correctly + - Action tracking state updates properly + - Both 2-second and 5-second actions work as expected + - Active action status displayed correctly +- Tested Sample03-Routing with production version: + - Basic routing functionality works (navigation and breadcrumbs) + - Page titles update correctly + - Issue found: State does not persist when navigating between pages - created Task 018 + - Counter resets to 0 after navigation, should maintain previous value +- Ran all test suites successfully: + - All core functionality tests passing + - Architecture tests passing + - Integration tests passing + - Only expected example tests skipped +- Documentation build completed with warnings - created Task 020: + - Documentation compiles successfully + - 36 warnings found, mostly related to file links and cross-references + - No critical errors that would prevent documentation deployment +- README.md reviewed and confirmed up-to-date: + - Version references correct + - Installation instructions accurate + - Documentation links valid + - No prerelease content present +- Created new tasks for blocking issues: + - Task 018: Fix Routing State Persistence + - Task 019: Fix Auto Sample Project Structure + - Task 020: Fix Documentation Warnings diff --git a/Kanban/Done/018-Fix-Routing-State-Persistence.md b/Kanban/Done/018-Fix-Routing-State-Persistence.md index 7cd19eb98..2e3bda649 100644 --- a/Kanban/Done/018-Fix-Routing-State-Persistence.md +++ b/Kanban/Done/018-Fix-Routing-State-Persistence.md @@ -1,45 +1,45 @@ -# Task 018: Fix Routing State Persistence - -## Description - -Fix state persistence issue in Sample03-Routing where state resets when navigating between pages. Currently, the counter value resets to 0 after navigation when it should maintain its previous value. - -## Requirements - -- Investigate why state is not persisting during navigation -- Fix state persistence in Sample03-Routing -- Ensure counter value maintains its value across page navigation -- Update any relevant documentation - -## Checklist - -### Design -- [ ] Review current routing implementation -- [ ] Analyze state management during navigation -- [ ] Design solution for state persistence - -### Implementation -- [ ] Fix state persistence issue -- [ ] Add tests to verify state persistence across navigation -- [ ] Update sample documentation if needed - -### Testing -- [ ] Verify counter state persists after navigation -- [ ] Test other state values persist correctly -- [ ] Run all tests to ensure no regressions - -### Documentation -- [ ] Update any relevant documentation -- [ ] Add notes about state persistence in routing documentation -- [ ] Update sample comments if needed - -## Notes - -- Issue discovered during production release preparation -- Counter resets to 0 when navigating away and back -- Should maintain state across navigation -- Part of production readiness requirements - -## Implementation Notes - -- Add implementation notes as the task progresses +# Task 018: Fix Routing State Persistence + +## Description + +Fix state persistence issue in Sample03-Routing where state resets when navigating between pages. Currently, the counter value resets to 0 after navigation when it should maintain its previous value. + +## Requirements + +- Investigate why state is not persisting during navigation +- Fix state persistence in Sample03-Routing +- Ensure counter value maintains its value across page navigation +- Update any relevant documentation + +## Checklist + +### Design +- [ ] Review current routing implementation +- [ ] Analyze state management during navigation +- [ ] Design solution for state persistence + +### Implementation +- [ ] Fix state persistence issue +- [ ] Add tests to verify state persistence across navigation +- [ ] Update sample documentation if needed + +### Testing +- [ ] Verify counter state persists after navigation +- [ ] Test other state values persist correctly +- [ ] Run all tests to ensure no regressions + +### Documentation +- [ ] Update any relevant documentation +- [ ] Add notes about state persistence in routing documentation +- [ ] Update sample comments if needed + +## Notes + +- Issue discovered during production release preparation +- Counter resets to 0 when navigating away and back +- Should maintain state across navigation +- Part of production readiness requirements + +## Implementation Notes + +- Add implementation notes as the task progresses diff --git a/Kanban/Done/019-Fix-Auto-Sample-Project-Structure.md b/Kanban/Done/019-Fix-Auto-Sample-Project-Structure.md index 3a0409ea4..200a3d6a0 100644 --- a/Kanban/Done/019-Fix-Auto-Sample-Project-Structure.md +++ b/Kanban/Done/019-Fix-Auto-Sample-Project-Structure.md @@ -1,76 +1,76 @@ -# Task 019: Fix Auto Sample Project Structure - -## Description - -Implement the project structure defined in the updated Readme for Sample00-StateActionHandler Auto. The documentation now correctly describes the Blazor Auto project structure, and we need to ensure the implementation matches. - -## Requirements - -- Implement project structure as documented in updated Readme -- Ensure all package references are correct -- Verify functionality matches documentation -- Ensure smooth transition between Server and WebAssembly modes - -## Checklist - -### Design -- [x] Review current project structure -- [x] Compare with Blazor Auto project templates -- [x] Identify structural issues -- [x] Plan necessary changes (documented in Readme) - -### Implementation -- [x] Create project structure following updated Readme: - - [x] Set up Sample00Auto.Client project - - [x] Set up Sample00Auto server project - - [x] Configure proper project references - - [x] Implement GlobalUsings.cs files - - [x] Configure Program.cs files - - [x] Set up Routes.razor -- [x] Update package references to 11.0.0 -- [x] Verify build process -- [x] Test Auto functionality - -### Testing -- [x] Verify project builds correctly -- [x] Test Auto render mode functionality: - - [x] Initial server-side rendering - - [x] Transition to WebAssembly - - [x] State management during transition -- [x] Verify state management works in both modes -- [x] Run all tests to ensure no regressions - -### Documentation -- [x] Update project documentation -- [x] Fix any invalid file links -- [x] Update sample README with correct structure -- [x] Add notes about Auto project structure - -## Notes - -- Documentation has been updated with correct project structure -- Readme now includes: - - Proper project organization - - Required GlobalUsings.cs configurations - - Program.cs setup for both Client and Server - - Routes.razor configuration - - State management implementation -- Implementation matches updated documentation -- Part of production readiness requirements - -## Implementation Notes - -- Documentation updated with correct project structure and instructions -- Readme now provides clear guidance for: - - Project creation and setup - - Package installation - - Service configuration - - State implementation - - Auto render mode behavior -- Verification completed: - - Project structure implemented as documented - - Server runs successfully on localhost - - Client-side navigation works between all pages - - State management works correctly (verified with Counter component) - - Data display functions properly (verified with Weather component) - - Proper separation of Client/Server projects maintained +# Task 019: Fix Auto Sample Project Structure + +## Description + +Implement the project structure defined in the updated Readme for Sample00-StateActionHandler Auto. The documentation now correctly describes the Blazor Auto project structure, and we need to ensure the implementation matches. + +## Requirements + +- Implement project structure as documented in updated Readme +- Ensure all package references are correct +- Verify functionality matches documentation +- Ensure smooth transition between Server and WebAssembly modes + +## Checklist + +### Design +- [x] Review current project structure +- [x] Compare with Blazor Auto project templates +- [x] Identify structural issues +- [x] Plan necessary changes (documented in Readme) + +### Implementation +- [x] Create project structure following updated Readme: + - [x] Set up Sample00Auto.Client project + - [x] Set up Sample00Auto server project + - [x] Configure proper project references + - [x] Implement GlobalUsings.cs files + - [x] Configure Program.cs files + - [x] Set up Routes.razor +- [x] Update package references to 11.0.0 +- [x] Verify build process +- [x] Test Auto functionality + +### Testing +- [x] Verify project builds correctly +- [x] Test Auto render mode functionality: + - [x] Initial server-side rendering + - [x] Transition to WebAssembly + - [x] State management during transition +- [x] Verify state management works in both modes +- [x] Run all tests to ensure no regressions + +### Documentation +- [x] Update project documentation +- [x] Fix any invalid file links +- [x] Update sample README with correct structure +- [x] Add notes about Auto project structure + +## Notes + +- Documentation has been updated with correct project structure +- Readme now includes: + - Proper project organization + - Required GlobalUsings.cs configurations + - Program.cs setup for both Client and Server + - Routes.razor configuration + - State management implementation +- Implementation matches updated documentation +- Part of production readiness requirements + +## Implementation Notes + +- Documentation updated with correct project structure and instructions +- Readme now provides clear guidance for: + - Project creation and setup + - Package installation + - Service configuration + - State implementation + - Auto render mode behavior +- Verification completed: + - Project structure implemented as documented + - Server runs successfully on localhost + - Client-side navigation works between all pages + - State management works correctly (verified with Counter component) + - Data display functions properly (verified with Weather component) + - Proper separation of Client/Server projects maintained diff --git a/Kanban/Done/021-Write-Release-Announcements.md b/Kanban/Done/021-Write-Release-Announcements.md index 5c5097a85..90be9733a 100644 --- a/Kanban/Done/021-Write-Release-Announcements.md +++ b/Kanban/Done/021-Write-Release-Announcements.md @@ -1,58 +1,58 @@ -# Task 021: Write Release Announcements - -## Description - -Create a blog post and blip announcing the release of TimeWarp.State. This will help communicate the release to users and the community. - -## Requirements - -- Create a blog post that: - - Announces the release of TimeWarp.State - - Highlights key features and improvements from the release notes - - Provides examples of usage - - Links to documentation - - Includes migration guidance if needed - -- Create a blip that: - - Provides a concise announcement of the release - - Links to the full blog post - - Highlights the most important aspects from the release notes - -## Checklist - -### Implementation -- [ ] Review Release Notes in Documentation/ReleaseNotes/ for content -- [ ] Write blog post draft incorporating release notes content -- [ ] Write blip draft highlighting key points from release notes -- [ ] Review and edit content -- [ ] Add any necessary images or diagrams -- [ ] Ensure all links are correct - -### Documentation -- [ ] Place blog post in Documentation/Blogs directory -- [ ] Place blip in Documentation/Blips directory -- [ ] Update any related documentation references -- [ ] Cross-reference with release notes for accuracy - -### Review -- [ ] Review content for accuracy against release notes -- [ ] Review content for clarity -- [ ] Verify all links work -- [ ] Check formatting - -## Notes - -- Blog posts are stored in Documentation/Blogs/ -- Blips are stored in Documentation/Blips/ -- Release notes are stored in Documentation/ReleaseNotes/ -- Follow existing blog post and blip formats for consistency -- Include relevant code examples where appropriate -- Consider including diagrams or screenshots if they add value -- Use release notes as the primary source for features and improvements - -## Implementation Notes - -- Reference existing blog posts and blips for style and format consistency -- Ensure the announcements align with the project's goals and values -- Focus on the value proposition for users -- Base content on the official release notes to maintain consistency +# Task 021: Write Release Announcements + +## Description + +Create a blog post and blip announcing the release of TimeWarp.State. This will help communicate the release to users and the community. + +## Requirements + +- Create a blog post that: + - Announces the release of TimeWarp.State + - Highlights key features and improvements from the release notes + - Provides examples of usage + - Links to documentation + - Includes migration guidance if needed + +- Create a blip that: + - Provides a concise announcement of the release + - Links to the full blog post + - Highlights the most important aspects from the release notes + +## Checklist + +### Implementation +- [ ] Review Release Notes in Documentation/ReleaseNotes/ for content +- [ ] Write blog post draft incorporating release notes content +- [ ] Write blip draft highlighting key points from release notes +- [ ] Review and edit content +- [ ] Add any necessary images or diagrams +- [ ] Ensure all links are correct + +### Documentation +- [ ] Place blog post in Documentation/Blogs directory +- [ ] Place blip in Documentation/Blips directory +- [ ] Update any related documentation references +- [ ] Cross-reference with release notes for accuracy + +### Review +- [ ] Review content for accuracy against release notes +- [ ] Review content for clarity +- [ ] Verify all links work +- [ ] Check formatting + +## Notes + +- Blog posts are stored in Documentation/Blogs/ +- Blips are stored in Documentation/Blips/ +- Release notes are stored in Documentation/ReleaseNotes/ +- Follow existing blog post and blip formats for consistency +- Include relevant code examples where appropriate +- Consider including diagrams or screenshots if they add value +- Use release notes as the primary source for features and improvements + +## Implementation Notes + +- Reference existing blog posts and blips for style and format consistency +- Ensure the announcements align with the project's goals and values +- Focus on the value proposition for users +- Base content on the official release notes to maintain consistency diff --git a/Kanban/Done/023-Create-Samples-Index.md b/Kanban/Done/023-Create-Samples-Index.md index 56ea5eabf..92c86f602 100644 --- a/Kanban/Done/023-Create-Samples-Index.md +++ b/Kanban/Done/023-Create-Samples-Index.md @@ -1,50 +1,50 @@ -# Task 023: Create Samples Index - -## Description - -Create a README.md file at the root of the Samples directory to provide an overview and navigation for all sample projects. - -## Requirements - -- [x] Create README.md file in the Samples directory root (originally named index.md, renamed for GitHub auto-rendering) -- [x] Include descriptions of each sample project -- [x] Provide links to each sample's documentation -- [x] Follow consistent markdown formatting - -## Checklist - -### Implementation -- [x] Create documentation file -- [x] Add descriptions for each sample project -- [x] Add navigation links -- [x] Verify all links work correctly - -### Documentation -- [x] Ensure content is clear and well-organized -- [x] Include purpose of each sample -- [x] Add any prerequisites or setup instructions if needed - -### Review -- [x] Verify all sample projects are included -- [x] Check markdown formatting -- [x] Proofread content - -## Notes - -The README.md file (originally planned as index.md but renamed for GitHub auto-rendering) serves as the main entry point for developers exploring the sample projects, making it easier to find and understand each example's purpose. - -## Implementation Notes - -1. Created initial file as index.md with comprehensive documentation of all samples -2. Included detailed sections for each sample project: - - 00-StateActionHandler - - 01-ReduxDevTools - - 02-ActionTracking - - 03-Routing -3. Added information about different Blazor render modes -4. Renamed to README.md to enable GitHub's automatic rendering -5. Organized content with clear sections for: - - Available Samples - - Getting Started - - Sample Structure - - Best Practices +# Task 023: Create Samples Index + +## Description + +Create a README.md file at the root of the Samples directory to provide an overview and navigation for all sample projects. + +## Requirements + +- [x] Create README.md file in the Samples directory root (originally named index.md, renamed for GitHub auto-rendering) +- [x] Include descriptions of each sample project +- [x] Provide links to each sample's documentation +- [x] Follow consistent markdown formatting + +## Checklist + +### Implementation +- [x] Create documentation file +- [x] Add descriptions for each sample project +- [x] Add navigation links +- [x] Verify all links work correctly + +### Documentation +- [x] Ensure content is clear and well-organized +- [x] Include purpose of each sample +- [x] Add any prerequisites or setup instructions if needed + +### Review +- [x] Verify all sample projects are included +- [x] Check markdown formatting +- [x] Proofread content + +## Notes + +The README.md file (originally planned as index.md but renamed for GitHub auto-rendering) serves as the main entry point for developers exploring the sample projects, making it easier to find and understand each example's purpose. + +## Implementation Notes + +1. Created initial file as index.md with comprehensive documentation of all samples +2. Included detailed sections for each sample project: + - 00-StateActionHandler + - 01-ReduxDevTools + - 02-ActionTracking + - 03-Routing +3. Added information about different Blazor render modes +4. Renamed to README.md to enable GitHub's automatic rendering +5. Organized content with clear sections for: + - Available Samples + - Getting Started + - Sample Structure + - Best Practices diff --git a/Kanban/Done/024-Create-StateActionHandler-Sample-Blip.md b/Kanban/Done/024-Create-StateActionHandler-Sample-Blip.md index b0741b452..43b8ae1b4 100644 --- a/Kanban/Done/024-Create-StateActionHandler-Sample-Blip.md +++ b/Kanban/Done/024-Create-StateActionHandler-Sample-Blip.md @@ -1,42 +1,42 @@ -# Task 024: Create StateActionHandler Sample Blip Announcement - -## Description - -Create a blip announcement for the StateActionHandler Sample applications in the TimeWarp.State repository, focusing on announcing the availability of implementations across different Blazor render modes. - -## Requirements - -- Create a blip announcement that: - - Announces the availability of StateActionHandler sample implementations - - Highlights the three render mode variations: - - Auto render mode - - Server render mode - - WebAssembly render mode - - Points readers to the sample implementations for detailed information - - References the WASM version's README for in-depth pattern explanation - -## Checklist - -### Implementation -- [ ] Write blip announcement -- [ ] Add to Documentation/Blips directory -- [ ] Update blip index if necessary - -### Documentation -- [ ] Ensure proper linking to sample implementations -- [ ] Cross-reference with existing documentation - -### Review -- [ ] Verify technical accuracy -- [ ] Review writing clarity -- [ ] Final proofreading - -## Notes - -- Keep the blip concise and focused on announcing the sample availability -- Direct readers to the WASM implementation's README for detailed pattern explanation -- Consider mentioning on X and NOSTR for wider reach - -## Implementation Notes - -- To be added during implementation +# Task 024: Create StateActionHandler Sample Blip Announcement + +## Description + +Create a blip announcement for the StateActionHandler Sample applications in the TimeWarp.State repository, focusing on announcing the availability of implementations across different Blazor render modes. + +## Requirements + +- Create a blip announcement that: + - Announces the availability of StateActionHandler sample implementations + - Highlights the three render mode variations: + - Auto render mode + - Server render mode + - WebAssembly render mode + - Points readers to the sample implementations for detailed information + - References the WASM version's README for in-depth pattern explanation + +## Checklist + +### Implementation +- [ ] Write blip announcement +- [ ] Add to Documentation/Blips directory +- [ ] Update blip index if necessary + +### Documentation +- [ ] Ensure proper linking to sample implementations +- [ ] Cross-reference with existing documentation + +### Review +- [ ] Verify technical accuracy +- [ ] Review writing clarity +- [ ] Final proofreading + +## Notes + +- Keep the blip concise and focused on announcing the sample availability +- Direct readers to the WASM implementation's README for detailed pattern explanation +- Consider mentioning on X and NOSTR for wider reach + +## Implementation Notes + +- To be added during implementation diff --git a/Kanban/Done/025-Create-ReduxDevTools-Sample-Blip.md b/Kanban/Done/025-Create-ReduxDevTools-Sample-Blip.md index 72e4e5f75..dbe2b0948 100644 --- a/Kanban/Done/025-Create-ReduxDevTools-Sample-Blip.md +++ b/Kanban/Done/025-Create-ReduxDevTools-Sample-Blip.md @@ -1,43 +1,43 @@ -# Task 025: Create ReduxDevTools Sample Blip - -## Description - -Create a blip announcement for the ReduxDevTools Sample in the TimeWarp.State repository, highlighting the practical debugging capabilities provided by Redux DevTools integration. - -## Requirements - -- Create a blip announcement that: - - Announces the availability of Redux DevTools integration sample - - Highlights practical debugging features: - - Action monitoring and inspection - - State tree visualization - - Action payload examination - - Route state tracking - - Points readers to the sample implementation - - References the comprehensive tutorial in the WASM readme - -## Checklist - -### Implementation -- [ ] Write blip announcement -- [ ] Add to Documentation/Blips directory -- [ ] Update blip index if necessary - -### Documentation -- [ ] Ensure proper linking to sample implementation -- [ ] Cross-reference with existing documentation - -### Review -- [ ] Verify technical accuracy -- [ ] Review writing clarity -- [ ] Final proofreading - -## Notes - -- Keep the blip focused on practical debugging capabilities -- Include link to the Redux DevTools Chrome extension -- Consider mentioning on X and NOSTR for wider reach - -## Implementation Notes - -- To be added during implementation +# Task 025: Create ReduxDevTools Sample Blip + +## Description + +Create a blip announcement for the ReduxDevTools Sample in the TimeWarp.State repository, highlighting the practical debugging capabilities provided by Redux DevTools integration. + +## Requirements + +- Create a blip announcement that: + - Announces the availability of Redux DevTools integration sample + - Highlights practical debugging features: + - Action monitoring and inspection + - State tree visualization + - Action payload examination + - Route state tracking + - Points readers to the sample implementation + - References the comprehensive tutorial in the WASM readme + +## Checklist + +### Implementation +- [ ] Write blip announcement +- [ ] Add to Documentation/Blips directory +- [ ] Update blip index if necessary + +### Documentation +- [ ] Ensure proper linking to sample implementation +- [ ] Cross-reference with existing documentation + +### Review +- [ ] Verify technical accuracy +- [ ] Review writing clarity +- [ ] Final proofreading + +## Notes + +- Keep the blip focused on practical debugging capabilities +- Include link to the Redux DevTools Chrome extension +- Consider mentioning on X and NOSTR for wider reach + +## Implementation Notes + +- To be added during implementation diff --git a/Kanban/Done/026-Create-ActionTracking-Sample-Blip.md b/Kanban/Done/026-Create-ActionTracking-Sample-Blip.md index 24cefe13b..212783cca 100644 --- a/Kanban/Done/026-Create-ActionTracking-Sample-Blip.md +++ b/Kanban/Done/026-Create-ActionTracking-Sample-Blip.md @@ -1,43 +1,43 @@ -# Task 026: Create ActionTracking Sample Blip - -## Description - -Create a blip announcement for the ActionTracking Sample in the TimeWarp.State repository, highlighting how it helps monitor and manage long-running actions in Blazor applications. - -## Requirements - -- Create a blip announcement that: - - Announces the availability of Action Tracking sample - - Highlights key features: - - Real-time visibility of active actions - - Concurrent action monitoring - - Automatic cleanup on completion - - Error handling capabilities - - Points readers to the sample implementation - - References the comprehensive tutorial in the WASM readme - -## Checklist - -### Implementation -- [ ] Write blip announcement -- [ ] Add to Documentation/Blips directory -- [ ] Update blip index if necessary - -### Documentation -- [ ] Ensure proper linking to sample implementation -- [ ] Cross-reference with existing documentation - -### Review -- [ ] Verify technical accuracy -- [ ] Review writing clarity -- [ ] Final proofreading - -## Notes - -- Keep the blip focused on practical benefits for developers -- Emphasize real-world use cases like loading states and progress indicators -- Consider mentioning on X and NOSTR for wider reach - -## Implementation Notes - -- To be added during implementation +# Task 026: Create ActionTracking Sample Blip + +## Description + +Create a blip announcement for the ActionTracking Sample in the TimeWarp.State repository, highlighting how it helps monitor and manage long-running actions in Blazor applications. + +## Requirements + +- Create a blip announcement that: + - Announces the availability of Action Tracking sample + - Highlights key features: + - Real-time visibility of active actions + - Concurrent action monitoring + - Automatic cleanup on completion + - Error handling capabilities + - Points readers to the sample implementation + - References the comprehensive tutorial in the WASM readme + +## Checklist + +### Implementation +- [ ] Write blip announcement +- [ ] Add to Documentation/Blips directory +- [ ] Update blip index if necessary + +### Documentation +- [ ] Ensure proper linking to sample implementation +- [ ] Cross-reference with existing documentation + +### Review +- [ ] Verify technical accuracy +- [ ] Review writing clarity +- [ ] Final proofreading + +## Notes + +- Keep the blip focused on practical benefits for developers +- Emphasize real-world use cases like loading states and progress indicators +- Consider mentioning on X and NOSTR for wider reach + +## Implementation Notes + +- To be added during implementation diff --git a/Kanban/Done/027-Create-Routing-Sample-Blip.md b/Kanban/Done/027-Create-Routing-Sample-Blip.md index 3ac7ceba9..cc58d4fcc 100644 --- a/Kanban/Done/027-Create-Routing-Sample-Blip.md +++ b/Kanban/Done/027-Create-Routing-Sample-Blip.md @@ -1,43 +1,43 @@ -# Task 027: Create Routing Sample Blip - -## Description - -Create a blip announcement for the Routing Sample in the TimeWarp.State repository, highlighting its stack-based navigation management and breadcrumb capabilities. - -## Requirements - -- Create a blip announcement that: - - Announces the availability of the Routing sample - - Highlights key features: - - Stack-based navigation history - - Breadcrumb-style navigation - - Multi-step back navigation - - Page title synchronization - - Points readers to the sample implementation - - References the comprehensive tutorial in the WASM readme - -## Checklist - -### Implementation -- [ ] Write blip announcement -- [ ] Add to Documentation/Blips directory -- [ ] Update blip index if necessary - -### Documentation -- [ ] Ensure proper linking to sample implementation -- [ ] Cross-reference with existing documentation - -### Review -- [ ] Verify technical accuracy -- [ ] Review writing clarity -- [ ] Final proofreading - -## Notes - -- Keep the blip focused on the navigation management capabilities -- Emphasize how it enhances user experience with breadcrumb navigation -- Consider mentioning on X and NOSTR for wider reach - -## Implementation Notes - -- To be added during implementation +# Task 027: Create Routing Sample Blip + +## Description + +Create a blip announcement for the Routing Sample in the TimeWarp.State repository, highlighting its stack-based navigation management and breadcrumb capabilities. + +## Requirements + +- Create a blip announcement that: + - Announces the availability of the Routing sample + - Highlights key features: + - Stack-based navigation history + - Breadcrumb-style navigation + - Multi-step back navigation + - Page title synchronization + - Points readers to the sample implementation + - References the comprehensive tutorial in the WASM readme + +## Checklist + +### Implementation +- [ ] Write blip announcement +- [ ] Add to Documentation/Blips directory +- [ ] Update blip index if necessary + +### Documentation +- [ ] Ensure proper linking to sample implementation +- [ ] Cross-reference with existing documentation + +### Review +- [ ] Verify technical accuracy +- [ ] Review writing clarity +- [ ] Final proofreading + +## Notes + +- Keep the blip focused on the navigation management capabilities +- Emphasize how it enhances user experience with breadcrumb navigation +- Consider mentioning on X and NOSTR for wider reach + +## Implementation Notes + +- To be added during implementation diff --git a/Kanban/InProgress/031_Split-NuGet-Publishing-To-Release-Workflow.md b/Kanban/InProgress/031_Split-NuGet-Publishing-To-Release-Workflow.md index d586cee86..979d02676 100644 --- a/Kanban/InProgress/031_Split-NuGet-Publishing-To-Release-Workflow.md +++ b/Kanban/InProgress/031_Split-NuGet-Publishing-To-Release-Workflow.md @@ -1,66 +1,66 @@ -# Task 031: Split NuGet Publishing to Release Workflow - -## Description - -- Split the CI/CD workflow to publish NuGet packages only on Release creation instead of merging to master branch -- This will provide better control over when packages are published and align with semantic versioning practices - -## Requirements - -- NuGet packages should only be published when a GitHub Release is created -- Master branch merges should run tests and build validation but not publish packages -- Release workflow should include version validation and proper tagging -- Maintain existing build and test automation on master branch - -## Checklist - -### Design -- [x] Analyze current GitHub Actions workflows -- [x] Design separate workflow for release publishing -- [x] Plan version management strategy - -### Implementation -- [x] Create new release workflow (.github/workflows/release-publish.yml) -- [x] Modify existing master workflow to exclude NuGet publishing -- [x] Add release trigger configuration -- [x] Update NuGet package versioning logic -- [ ] Test workflow with draft release - -### Documentation -- [ ] Update README.md with new release process -- [x] Document release workflow in Claude.md -- [x] Update DevOps documentation with release process - -### Review -- [ ] Consider Security Implications (NuGet API keys, workflow permissions) -- [ ] Consider Performance Implications (workflow efficiency) -- [ ] Code Review of workflow changes -- [ ] Test release process end-to-end - -## Notes - -- Current workflow likely publishes on master branch merge -- Need to ensure GitHub Release creation triggers NuGet publishing -- Consider using GitHub's built-in release management features -- May need to update package versioning to align with release tags - -## Implementation Notes - -### Completed Changes: -1. **Analyzed existing workflows**: - - `release-build.yml` was doing both master builds AND releases - - `ci-build.yml` handles PR validation only - -2. **Split workflows**: - - Renamed `release-build.yml` to `master-build.yml` - now only builds/tests on master - - Created `release-publish.yml` - only publishes NuGet on GitHub release creation - -3. **Key improvements**: - - Master workflow now uses same build/test scripts as PR workflow for consistency - - Release workflow validates version matches tag before publishing - - Added publishing for all packages (Analyzer and SourceGenerator were missing) - - Improved output variable syntax (deprecated ::set-output) - -### Next Steps: -- Test with draft release to validate end-to-end workflow +# Task 031: Split NuGet Publishing to Release Workflow + +## Description + +- Split the CI/CD workflow to publish NuGet packages only on Release creation instead of merging to master branch +- This will provide better control over when packages are published and align with semantic versioning practices + +## Requirements + +- NuGet packages should only be published when a GitHub Release is created +- Master branch merges should run tests and build validation but not publish packages +- Release workflow should include version validation and proper tagging +- Maintain existing build and test automation on master branch + +## Checklist + +### Design +- [x] Analyze current GitHub Actions workflows +- [x] Design separate workflow for release publishing +- [x] Plan version management strategy + +### Implementation +- [x] Create new release workflow (.github/workflows/release-publish.yml) +- [x] Modify existing master workflow to exclude NuGet publishing +- [x] Add release trigger configuration +- [x] Update NuGet package versioning logic +- [ ] Test workflow with draft release + +### Documentation +- [ ] Update README.md with new release process +- [x] Document release workflow in Claude.md +- [x] Update DevOps documentation with release process + +### Review +- [ ] Consider Security Implications (NuGet API keys, workflow permissions) +- [ ] Consider Performance Implications (workflow efficiency) +- [ ] Code Review of workflow changes +- [ ] Test release process end-to-end + +## Notes + +- Current workflow likely publishes on master branch merge +- Need to ensure GitHub Release creation triggers NuGet publishing +- Consider using GitHub's built-in release management features +- May need to update package versioning to align with release tags + +## Implementation Notes + +### Completed Changes: +1. **Analyzed existing workflows**: + - `release-build.yml` was doing both master builds AND releases + - `ci-build.yml` handles PR validation only + +2. **Split workflows**: + - Renamed `release-build.yml` to `master-build.yml` - now only builds/tests on master + - Created `release-publish.yml` - only publishes NuGet on GitHub release creation + +3. **Key improvements**: + - Master workflow now uses same build/test scripts as PR workflow for consistency + - Release workflow validates version matches tag before publishing + - Added publishing for all packages (Analyzer and SourceGenerator were missing) + - Improved output variable syntax (deprecated ::set-output) + +### Next Steps: +- Test with draft release to validate end-to-end workflow - Update documentation with new release process \ No newline at end of file diff --git a/Kanban/ToDo/010-Update-PersistenceStateSourceGenerator-To-Incremental.md b/Kanban/ToDo/010-Update-PersistenceStateSourceGenerator-To-Incremental.md index 4410d43fc..228ab4370 100644 --- a/Kanban/ToDo/010-Update-PersistenceStateSourceGenerator-To-Incremental.md +++ b/Kanban/ToDo/010-Update-PersistenceStateSourceGenerator-To-Incremental.md @@ -1,45 +1,45 @@ -# Task 010: Update PersistenceStateSourceGenerator to Incremental Generator - -## Description - -Update the PersistenceStateSourceGenerator to implement IIncrementalGenerator instead of ISourceGenerator. This migration is necessary as ISourceGenerator is being deprecated in .NET 9, and IIncrementalGenerator provides better build performance by only running the generator on changed files. - -## Requirements - -- Replace ISourceGenerator implementation with IIncrementalGenerator to ensure future .NET compatibility -- Implement Initialize method with IncrementalGeneratorInitializationContext parameter -- Properly set up source inputs and transformations using the incremental pipeline -- Ensure all existing functionality is maintained -- Update any relevant tests - -## Checklist - -### Design -- [ ] Review current generator implementation -- [ ] Design incremental pipeline stages -- [ ] Plan transformation steps - -### Implementation -- [ ] Update to IIncrementalGenerator interface -- [ ] Implement Initialize method -- [ ] Set up source inputs registration -- [ ] Configure incremental pipeline -- [ ] Update existing tests -- [ ] Add new tests for incremental behavior - -### Documentation -- [ ] Update inline documentation -- [ ] Document migration rationale and benefits - -### Review -- [ ] Verify generator output matches previous implementation -- [ ] Consider Performance Implications -- [ ] Code Review - -## Notes - -The migration to IIncrementalGenerator is required as ISourceGenerator is being deprecated in .NET 9. This update will not only make the PersistenceStateSourceGenerator more efficient through incremental generation but also ensure compatibility with future .NET versions. - -## Implementation Notes - -- Source file: Source/TimeWarp.State.SourceGenerator/PersistenceStateSourceGenerator.cs +# Task 010: Update PersistenceStateSourceGenerator to Incremental Generator + +## Description + +Update the PersistenceStateSourceGenerator to implement IIncrementalGenerator instead of ISourceGenerator. This migration is necessary as ISourceGenerator is being deprecated in .NET 9, and IIncrementalGenerator provides better build performance by only running the generator on changed files. + +## Requirements + +- Replace ISourceGenerator implementation with IIncrementalGenerator to ensure future .NET compatibility +- Implement Initialize method with IncrementalGeneratorInitializationContext parameter +- Properly set up source inputs and transformations using the incremental pipeline +- Ensure all existing functionality is maintained +- Update any relevant tests + +## Checklist + +### Design +- [ ] Review current generator implementation +- [ ] Design incremental pipeline stages +- [ ] Plan transformation steps + +### Implementation +- [ ] Update to IIncrementalGenerator interface +- [ ] Implement Initialize method +- [ ] Set up source inputs registration +- [ ] Configure incremental pipeline +- [ ] Update existing tests +- [ ] Add new tests for incremental behavior + +### Documentation +- [ ] Update inline documentation +- [ ] Document migration rationale and benefits + +### Review +- [ ] Verify generator output matches previous implementation +- [ ] Consider Performance Implications +- [ ] Code Review + +## Notes + +The migration to IIncrementalGenerator is required as ISourceGenerator is being deprecated in .NET 9. This update will not only make the PersistenceStateSourceGenerator more efficient through incremental generation but also ensure compatibility with future .NET versions. + +## Implementation Notes + +- Source file: Source/TimeWarp.State.SourceGenerator/PersistenceStateSourceGenerator.cs diff --git a/Kanban/ToDo/011-Update-ActionSetMethodSourceGenerator-To-Incremental.md b/Kanban/ToDo/011-Update-ActionSetMethodSourceGenerator-To-Incremental.md index a35376155..f085d1373 100644 --- a/Kanban/ToDo/011-Update-ActionSetMethodSourceGenerator-To-Incremental.md +++ b/Kanban/ToDo/011-Update-ActionSetMethodSourceGenerator-To-Incremental.md @@ -1,45 +1,45 @@ -# Task 011: Update ActionSetMethodSourceGenerator to Incremental Generator - -## Description - -Update the ActionSetMethodSourceGenerator to implement IIncrementalGenerator instead of ISourceGenerator. This migration is necessary as ISourceGenerator is being deprecated in .NET 9, and IIncrementalGenerator provides better build performance by only running the generator on changed files. - -## Requirements - -- Replace ISourceGenerator implementation with IIncrementalGenerator to ensure future .NET compatibility -- Implement Initialize method with IncrementalGeneratorInitializationContext parameter -- Properly set up source inputs and transformations using the incremental pipeline -- Ensure all existing functionality is maintained -- Update any relevant tests - -## Checklist - -### Design -- [ ] Review current generator implementation -- [ ] Design incremental pipeline stages -- [ ] Plan transformation steps - -### Implementation -- [ ] Update to IIncrementalGenerator interface -- [ ] Implement Initialize method -- [ ] Set up source inputs registration -- [ ] Configure incremental pipeline -- [ ] Update existing tests -- [ ] Add new tests for incremental behavior - -### Documentation -- [ ] Update inline documentation -- [ ] Document migration rationale and benefits - -### Review -- [ ] Verify generator output matches previous implementation -- [ ] Consider Performance Implications -- [ ] Code Review - -## Notes - -The migration to IIncrementalGenerator is required as ISourceGenerator is being deprecated in .NET 9. This update will not only make the ActionSetMethodSourceGenerator more efficient through incremental generation but also ensure compatibility with future .NET versions. - -## Implementation Notes - -- Source file: Source/TimeWarp.State.SourceGenerator/ActionSetMethodGenerator.cs +# Task 011: Update ActionSetMethodSourceGenerator to Incremental Generator + +## Description + +Update the ActionSetMethodSourceGenerator to implement IIncrementalGenerator instead of ISourceGenerator. This migration is necessary as ISourceGenerator is being deprecated in .NET 9, and IIncrementalGenerator provides better build performance by only running the generator on changed files. + +## Requirements + +- Replace ISourceGenerator implementation with IIncrementalGenerator to ensure future .NET compatibility +- Implement Initialize method with IncrementalGeneratorInitializationContext parameter +- Properly set up source inputs and transformations using the incremental pipeline +- Ensure all existing functionality is maintained +- Update any relevant tests + +## Checklist + +### Design +- [ ] Review current generator implementation +- [ ] Design incremental pipeline stages +- [ ] Plan transformation steps + +### Implementation +- [ ] Update to IIncrementalGenerator interface +- [ ] Implement Initialize method +- [ ] Set up source inputs registration +- [ ] Configure incremental pipeline +- [ ] Update existing tests +- [ ] Add new tests for incremental behavior + +### Documentation +- [ ] Update inline documentation +- [ ] Document migration rationale and benefits + +### Review +- [ ] Verify generator output matches previous implementation +- [ ] Consider Performance Implications +- [ ] Code Review + +## Notes + +The migration to IIncrementalGenerator is required as ISourceGenerator is being deprecated in .NET 9. This update will not only make the ActionSetMethodSourceGenerator more efficient through incremental generation but also ensure compatibility with future .NET versions. + +## Implementation Notes + +- Source file: Source/TimeWarp.State.SourceGenerator/ActionSetMethodGenerator.cs diff --git a/Kanban/ToDo/020-Fix-Documentation-Warnings.md b/Kanban/ToDo/020-Fix-Documentation-Warnings.md index fe7f78683..ec189bcd9 100644 --- a/Kanban/ToDo/020-Fix-Documentation-Warnings.md +++ b/Kanban/ToDo/020-Fix-Documentation-Warnings.md @@ -1,60 +1,60 @@ -# Task 020: Fix Documentation Warnings - -## Description - -Fix 36 documentation warnings found during production release preparation. These include invalid file links, missing UID references in TOC files, and invalid cross-references in migration documentation. - -## Requirements - -- Fix all invalid file links in sample documentation -- Resolve missing UID references in TOC files -- Fix invalid cross-references in migration documentation -- Ensure documentation builds without warnings - -## Checklist - -### Analysis -- [ ] Review all documentation warnings -- [ ] Categorize warnings by type: - - [ ] Invalid file links - - [ ] Missing UID references - - [ ] Invalid cross-references -- [ ] Create list of files needing updates - -### Implementation -- [ ] Fix invalid file links in sample documentation: - - [ ] Sample00-StateActionHandler - - [ ] Sample01-ReduxDevTools - - [ ] Sample02-ActionTracking - - [ ] Sample03-Routing -- [ ] Fix TOC file UID references: - - [ ] Features/toc.yml - - [ ] Topics/toc.yml - - [ ] Main toc.yml -- [ ] Fix migration documentation cross-references -- [ ] Update any outdated documentation paths - -### Verification -- [ ] Build documentation -- [ ] Verify no warnings remain -- [ ] Test all documentation links -- [ ] Verify cross-references work - -### Documentation -- [ ] Update any related documentation guidelines -- [ ] Document proper link formats -- [ ] Update documentation contribution guide if needed - -## Notes - -- 36 warnings found during documentation build -- Issues include: - - Invalid file links in sample documentation - - Missing UID references in TOC files - - Invalid cross-references in migration documentation -- Part of production readiness requirements -- No critical errors preventing documentation deployment - -## Implementation Notes - -- Add implementation notes as the task progresses +# Task 020: Fix Documentation Warnings + +## Description + +Fix 36 documentation warnings found during production release preparation. These include invalid file links, missing UID references in TOC files, and invalid cross-references in migration documentation. + +## Requirements + +- Fix all invalid file links in sample documentation +- Resolve missing UID references in TOC files +- Fix invalid cross-references in migration documentation +- Ensure documentation builds without warnings + +## Checklist + +### Analysis +- [ ] Review all documentation warnings +- [ ] Categorize warnings by type: + - [ ] Invalid file links + - [ ] Missing UID references + - [ ] Invalid cross-references +- [ ] Create list of files needing updates + +### Implementation +- [ ] Fix invalid file links in sample documentation: + - [ ] Sample00-StateActionHandler + - [ ] Sample01-ReduxDevTools + - [ ] Sample02-ActionTracking + - [ ] Sample03-Routing +- [ ] Fix TOC file UID references: + - [ ] Features/toc.yml + - [ ] Topics/toc.yml + - [ ] Main toc.yml +- [ ] Fix migration documentation cross-references +- [ ] Update any outdated documentation paths + +### Verification +- [ ] Build documentation +- [ ] Verify no warnings remain +- [ ] Test all documentation links +- [ ] Verify cross-references work + +### Documentation +- [ ] Update any related documentation guidelines +- [ ] Document proper link formats +- [ ] Update documentation contribution guide if needed + +## Notes + +- 36 warnings found during documentation build +- Issues include: + - Invalid file links in sample documentation + - Missing UID references in TOC files + - Invalid cross-references in migration documentation +- Part of production readiness requirements +- No critical errors preventing documentation deployment + +## Implementation Notes + +- Add implementation notes as the task progresses diff --git a/Kanban/ToDo/022-Create-TimeWarpStateComponent-Samples.md b/Kanban/ToDo/022-Create-TimeWarpStateComponent-Samples.md index b1acbd2bd..250070e26 100644 --- a/Kanban/ToDo/022-Create-TimeWarpStateComponent-Samples.md +++ b/Kanban/ToDo/022-Create-TimeWarpStateComponent-Samples.md @@ -1,54 +1,54 @@ -# Task 022: Create TimeWarpStateComponent Samples - -## Description - -Create comprehensive samples demonstrating the advanced rendering control features of TimeWarpStateComponent, showcasing its capabilities for fine-grained control over component re-rendering. - -## Requirements - -- Create sample applications that demonstrate: - - RenderMode usage and configuration - - RenderReasons tracking and optimization - - Performance benefits of controlled re-rendering - - Best practices for component state management - - Integration with existing state management patterns - -## Checklist - -### Design -- [ ] Plan sample scenarios that highlight key features -- [ ] Design clear and educational component examples -- [ ] Consider performance demonstration scenarios - -### Implementation -- [ ] Create basic sample demonstrating core features -- [ ] Implement advanced rendering control examples -- [ ] Add performance comparison demonstrations -- [ ] Include comprehensive comments explaining the concepts -- [ ] Add proper error handling and edge cases - -### Documentation -- [ ] Document each sample with clear explanations -- [ ] Include usage guidelines and best practices -- [ ] Add performance optimization tips -- [ ] Create README for each sample -- [ ] Update main documentation to reference new samples - -### Review -- [ ] Review code for clarity and educational value -- [ ] Verify all samples work as intended -- [ ] Test across different scenarios -- [ ] Ensure documentation is clear and complete - -## Notes - -- Focus on real-world use cases that demonstrate practical benefits -- Include performance metrics where applicable -- Consider progressive complexity in examples -- Ensure samples are well-documented for learning purposes - -## Implementation Notes - -- Reference existing samples for consistent structure -- Follow TimeWarp.State coding conventions -- Include comments explaining key concepts and decisions +# Task 022: Create TimeWarpStateComponent Samples + +## Description + +Create comprehensive samples demonstrating the advanced rendering control features of TimeWarpStateComponent, showcasing its capabilities for fine-grained control over component re-rendering. + +## Requirements + +- Create sample applications that demonstrate: + - RenderMode usage and configuration + - RenderReasons tracking and optimization + - Performance benefits of controlled re-rendering + - Best practices for component state management + - Integration with existing state management patterns + +## Checklist + +### Design +- [ ] Plan sample scenarios that highlight key features +- [ ] Design clear and educational component examples +- [ ] Consider performance demonstration scenarios + +### Implementation +- [ ] Create basic sample demonstrating core features +- [ ] Implement advanced rendering control examples +- [ ] Add performance comparison demonstrations +- [ ] Include comprehensive comments explaining the concepts +- [ ] Add proper error handling and edge cases + +### Documentation +- [ ] Document each sample with clear explanations +- [ ] Include usage guidelines and best practices +- [ ] Add performance optimization tips +- [ ] Create README for each sample +- [ ] Update main documentation to reference new samples + +### Review +- [ ] Review code for clarity and educational value +- [ ] Verify all samples work as intended +- [ ] Test across different scenarios +- [ ] Ensure documentation is clear and complete + +## Notes + +- Focus on real-world use cases that demonstrate practical benefits +- Include performance metrics where applicable +- Consider progressive complexity in examples +- Ensure samples are well-documented for learning purposes + +## Implementation Notes + +- Reference existing samples for consistent structure +- Follow TimeWarp.State coding conventions +- Include comments explaining key concepts and decisions diff --git a/README.md b/README.md index 48e96a120..4981fec63 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,73 @@ -[![Stars](https://img.shields.io/github/stars/TimeWarpEngineering/timewarp-state?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state) -[![workflow](https://github.com/TimeWarpEngineering/timewarp-state/actions/workflows/release-build.yml/badge.svg)](https://github.com/TimeWarpEngineering/timewarp-state/actions) -[![Forks](https://img.shields.io/github/forks/TimeWarpEngineering/timewarp-state)](https://github.com/TimeWarpEngineering/timewarp-state) -[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) -[![Issues Open](https://img.shields.io/github/issues/TimeWarpEngineering/timewarp-state.svg?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) -[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TimeWarpEngineering/timewarp-state/badge)](https://scorecard.dev/viewer/?uri=github.com/TimeWarpEngineering/timewarp-state) - -[![nuget](https://img.shields.io/nuget/v/TimeWarp.State?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State/) -[![nuget](https://img.shields.io/nuget/dt/Blazor-State?logo=nuget)](https://www.nuget.org/packages/Blazor-State/) -[![nuget](https://img.shields.io/nuget/dt/TimeWarp.State?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State/) - -[![Twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FTimeWarpEngineering%2Ftimewarp-state)](https://twitter.com/intent/tweet?url=https://github.com/TimeWarpEngineering/timewarp-state) -[![Dotnet](https://img.shields.io/badge/dotnet-8.0-blue)](https://dotnet.microsoft.com) - -[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) -[![Twitter](https://img.shields.io/twitter/follow/StevenTCramer.svg)](https://twitter.com/intent/follow?screen_name=StevenTCramer) -[![Twitter](https://img.shields.io/twitter/follow/TheFreezeTeam1.svg)](https://twitter.com/intent/follow?screen_name=TheFreezeTeam1) - -logo - -# TimeWarp.State - -**TimeWarp.State** (previously known as Blazor-State) is a fully asynchronous state management library for Blazor applications, leveraging the MediatR pipeline to implement the Flux pattern. It handles both Reducers and Effects consistently using async Handlers, simplifying the management of asynchronous operations throughout your app. - -By utilizing the MediatR pipeline, TimeWarp.State enables a flexible, middleware-driven architecture for managing state, similar to the request-processing pipeline in ASP.NET. This approach allows developers to inject custom behaviors, such as logging, validation, and caching, directly into the state management flow. - -In addition to the core library, we offer **[TimeWarp.State.Plus](/Source/TimeWarp.State.Plus)**, which extends the functionality with enhanced middleware, components, and tools to further streamline state management in complex Blazor applications. - -## Give a Star! :star: - -If you find this project useful, please give it a star. Thanks! - -## Getting Started - -I recommend the [tutorial](xref:TimeWarp.State:00-StateActionHandler.md) for a step-by-step guide to building a Blazor app with TimeWarp.State. - -See full [documentation](https://timewarpengineering.github.io/timewarp-state/). - -logo - -## Installation - -```console -dotnet add package TimeWarp.State -dotnet add package TimeWarp.State.Plus -``` - -Check out the latest NuGet packages on the [TimeWarp Enterprises NuGet page](https://www.nuget.org/profiles/TimeWarp.Enterprises). - -* [TimeWarp.State](https://www.nuget.org/packages/TimeWarp.State/) [![nuget](https://img.shields.io/nuget/v/TimeWarp.State?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State/) -* [TimeWarp.State.Plus](https://www.nuget.org/packages/TimeWarp.State.Plus/) [![nuget](https://img.shields.io/nuget/v/TimeWarp.State.Plus?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Plus/) - -## Releases - -View the [Release Notes](https://timewarpengineering.github.io/timewarp-state/ReleaseNotes/Release11.0.0.html) for detailed information on each release. - -## Unlicense - -[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://unlicense.org) -This project is licensed under the [Unlicense](https://unlicense.org). - -## Contributing - -Your contributions are welcome! Before starting any work, please open a [discussion](https://github.com/TimeWarpEngineering/timewarp-state/discussions). - -Help with the [documentation](https://timewarpengineering.github.io/timewarp-state/) is also greatly appreciated. - -## Contact - -If you have an issue and don't receive a timely response, feel free to reach out on our [Discord server](https://discord.gg/A55JARGKKP). - -[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) - +[![Stars](https://img.shields.io/github/stars/TimeWarpEngineering/timewarp-state?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state) +[![workflow](https://github.com/TimeWarpEngineering/timewarp-state/actions/workflows/release-build.yml/badge.svg)](https://github.com/TimeWarpEngineering/timewarp-state/actions) +[![Forks](https://img.shields.io/github/forks/TimeWarpEngineering/timewarp-state)](https://github.com/TimeWarpEngineering/timewarp-state) +[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) +[![Issues Open](https://img.shields.io/github/issues/TimeWarpEngineering/timewarp-state.svg?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) +[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TimeWarpEngineering/timewarp-state/badge)](https://scorecard.dev/viewer/?uri=github.com/TimeWarpEngineering/timewarp-state) + +[![nuget](https://img.shields.io/nuget/v/TimeWarp.State?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State/) +[![nuget](https://img.shields.io/nuget/dt/Blazor-State?logo=nuget)](https://www.nuget.org/packages/Blazor-State/) +[![nuget](https://img.shields.io/nuget/dt/TimeWarp.State?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State/) + +[![Twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FTimeWarpEngineering%2Ftimewarp-state)](https://twitter.com/intent/tweet?url=https://github.com/TimeWarpEngineering/timewarp-state) +[![Dotnet](https://img.shields.io/badge/dotnet-8.0-blue)](https://dotnet.microsoft.com) + +[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) +[![Twitter](https://img.shields.io/twitter/follow/StevenTCramer.svg)](https://twitter.com/intent/follow?screen_name=StevenTCramer) +[![Twitter](https://img.shields.io/twitter/follow/TheFreezeTeam1.svg)](https://twitter.com/intent/follow?screen_name=TheFreezeTeam1) + +logo + +# TimeWarp.State + +**TimeWarp.State** (previously known as Blazor-State) is a fully asynchronous state management library for Blazor applications, leveraging the MediatR pipeline to implement the Flux pattern. It handles both Reducers and Effects consistently using async Handlers, simplifying the management of asynchronous operations throughout your app. + +By utilizing the MediatR pipeline, TimeWarp.State enables a flexible, middleware-driven architecture for managing state, similar to the request-processing pipeline in ASP.NET. This approach allows developers to inject custom behaviors, such as logging, validation, and caching, directly into the state management flow. + +In addition to the core library, we offer **[TimeWarp.State.Plus](/Source/TimeWarp.State.Plus)**, which extends the functionality with enhanced middleware, components, and tools to further streamline state management in complex Blazor applications. + +## Give a Star! :star: + +If you find this project useful, please give it a star. Thanks! + +## Getting Started + +I recommend the [tutorial](xref:TimeWarp.State:00-StateActionHandler.md) for a step-by-step guide to building a Blazor app with TimeWarp.State. + +See full [documentation](https://timewarpengineering.github.io/timewarp-state/). + +logo + +## Installation + +```console +dotnet add package TimeWarp.State +dotnet add package TimeWarp.State.Plus +``` + +Check out the latest NuGet packages on the [TimeWarp Enterprises NuGet page](https://www.nuget.org/profiles/TimeWarp.Enterprises). + +* [TimeWarp.State](https://www.nuget.org/packages/TimeWarp.State/) [![nuget](https://img.shields.io/nuget/v/TimeWarp.State?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State/) +* [TimeWarp.State.Plus](https://www.nuget.org/packages/TimeWarp.State.Plus/) [![nuget](https://img.shields.io/nuget/v/TimeWarp.State.Plus?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Plus/) + +## Releases + +View the [Release Notes](https://timewarpengineering.github.io/timewarp-state/ReleaseNotes/Release11.0.0.html) for detailed information on each release. + +## Unlicense + +[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://unlicense.org) +This project is licensed under the [Unlicense](https://unlicense.org). + +## Contributing + +Your contributions are welcome! Before starting any work, please open a [discussion](https://github.com/TimeWarpEngineering/timewarp-state/discussions). + +Help with the [documentation](https://timewarpengineering.github.io/timewarp-state/) is also greatly appreciated. + +## Contact + +If you have an issue and don't receive a timely response, feel free to reach out on our [Discord server](https://discord.gg/A55JARGKKP). + +[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) + diff --git a/RunTestApp.ps1 b/RunTestApp.ps1 index d846997e4..9cce85b4b 100644 --- a/RunTestApp.ps1 +++ b/RunTestApp.ps1 @@ -1,14 +1,14 @@ -$Env:ASPNETCORE_ENVIRONMENT = "Development" -$Env:UseHttp = "false" # Set to "true" if you want to use HTTP locally - -Push-Location $PSScriptRoot -try { - Clear-Host - # The analyzer is not directly referenced by the test app, so we need to build it first - dotnet build ./Source/TimeWarp.State.Analyzer/TimeWarp.State.Analyzer.csproj - dotnet build ./Source/TimeWarp.State.SourceGenerator/TimeWarp.State.SourceGenerator.csproj - dotnet watch --project ./Tests/Test.App/Test.App.Server/Test.App.Server.csproj -} -finally { - Pop-Location -} +$Env:ASPNETCORE_ENVIRONMENT = "Development" +$Env:UseHttp = "false" # Set to "true" if you want to use HTTP locally + +Push-Location $PSScriptRoot +try { + Clear-Host + # The analyzer is not directly referenced by the test app, so we need to build it first + dotnet build ./Source/TimeWarp.State.Analyzer/TimeWarp.State.Analyzer.csproj + dotnet build ./Source/TimeWarp.State.SourceGenerator/TimeWarp.State.SourceGenerator.csproj + dotnet watch --project ./Tests/Test.App/Test.App.Server/Test.App.Server.csproj +} +finally { + Pop-Location +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.IncrementCount.cs b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.IncrementCount.cs index 0ce6467bc..e9cdd1296 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.IncrementCount.cs +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.IncrementCount.cs @@ -1,29 +1,29 @@ -namespace Sample00Auto.Client.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} +namespace Sample00Auto.Client.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.cs b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.cs index 39bb83b95..e84bccd05 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.cs +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Features/Counter/CounterState.cs @@ -1,10 +1,10 @@ -namespace Sample00Auto.Client.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - public override void Initialize() - { - Count = 3; - } -} +namespace Sample00Auto.Client.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + public override void Initialize() + { + Count = 3; + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/GlobalUsings.cs b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/GlobalUsings.cs index f4a8bdab5..574dd95f1 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/GlobalUsings.cs +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/GlobalUsings.cs @@ -1,4 +1,4 @@ -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using TimeWarp.State; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using TimeWarp.State; diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Program.cs b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Program.cs index fc359dac5..e669a878c 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Program.cs +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Program.cs @@ -1,16 +1,16 @@ -namespace Sample00Auto.Client; - -public class Program -{ - static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - ConfigureServices(builder.Services); - await builder.Build().RunAsync(); - } - - public static void ConfigureServices(IServiceCollection serviceCollection) - { - serviceCollection.AddTimeWarpState(); - } -} +namespace Sample00Auto.Client; + +public class Program +{ + static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + ConfigureServices(builder.Services); + await builder.Build().RunAsync(); + } + + public static void ConfigureServices(IServiceCollection serviceCollection) + { + serviceCollection.AddTimeWarpState(); + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Sample00Auto.Client.csproj b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Sample00Auto.Client.csproj index 31f1eeb69..7a139773d 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Sample00Auto.Client.csproj +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/Sample00Auto.Client.csproj @@ -1,16 +1,16 @@ - - - - net8.0 - enable - enable - true - Default - - - - - - - - + + + + net8.0 + enable + enable + true + Default + + + + + + + + diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.Development.json b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.Development.json index ff66ba6b2..0c208ae91 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.Development.json +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.Development.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.json b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.json index ff66ba6b2..0c208ae91 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.json +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.Client/wwwroot/appsettings.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.sln b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.sln index f3154d283..95698bae5 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.sln +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto.sln @@ -1,50 +1,50 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.0.0 -MinimumVisualStudioVersion = 16.0.0.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample00Auto", "Sample00Auto\Sample00Auto.csproj", "{5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample00Auto.Client", "Sample00Auto.Client\Sample00Auto.Client.csproj", "{8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x64.ActiveCfg = Debug|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x64.Build.0 = Debug|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x86.ActiveCfg = Debug|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x86.Build.0 = Debug|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|Any CPU.Build.0 = Release|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x64.ActiveCfg = Release|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x64.Build.0 = Release|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x86.ActiveCfg = Release|Any CPU - {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x86.Build.0 = Release|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x64.ActiveCfg = Debug|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x64.Build.0 = Debug|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x86.ActiveCfg = Debug|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x86.Build.0 = Debug|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|Any CPU.Build.0 = Release|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x64.ActiveCfg = Release|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x64.Build.0 = Release|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x86.ActiveCfg = Release|Any CPU - {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {8AC77B3D-E7F5-4B16-8CE4-2E314C7CBF55} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.0.0 +MinimumVisualStudioVersion = 16.0.0.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample00Auto", "Sample00Auto\Sample00Auto.csproj", "{5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample00Auto.Client", "Sample00Auto.Client\Sample00Auto.Client.csproj", "{8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x64.Build.0 = Debug|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Debug|x86.Build.0 = Debug|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|Any CPU.Build.0 = Release|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x64.ActiveCfg = Release|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x64.Build.0 = Release|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x86.ActiveCfg = Release|Any CPU + {8F4BA4BA-FF16-4B7C-BCAC-B00EC9014F6C}.Release|x86.Build.0 = Release|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x64.ActiveCfg = Debug|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x64.Build.0 = Debug|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x86.ActiveCfg = Debug|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Debug|x86.Build.0 = Debug|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|Any CPU.Build.0 = Release|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x64.ActiveCfg = Release|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x64.Build.0 = Release|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x86.ActiveCfg = Release|Any CPU + {5B183F83-453C-4FA9-AEE9-D09CFF8C2B3C}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8AC77B3D-E7F5-4B16-8CE4-2E314C7CBF55} + EndGlobalSection +EndGlobal diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/MainLayout.razor.css b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/MainLayout.razor.css index 49baa0c36..038baf178 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/MainLayout.razor.css +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/MainLayout.razor.css @@ -1,96 +1,96 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/NavMenu.razor.css b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/NavMenu.razor.css index 2275bdb3b..4e15395e0 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/NavMenu.razor.css +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Components/Layout/NavMenu.razor.css @@ -1,105 +1,105 @@ -.navbar-toggler { - appearance: none; - cursor: pointer; - width: 3.5rem; - height: 2.5rem; - color: white; - position: absolute; - top: 0.5rem; - right: 1rem; - border: 1px solid rgba(255, 255, 255, 0.1); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); -} - -.navbar-toggler:checked { - background-color: rgba(255, 255, 255, 0.5); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep .nav-link { - color: #d7d7d7; - background: none; - border: none; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - width: 100%; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep .nav-link:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -.nav-scrollable { - display: none; -} - -.navbar-toggler:checked ~ .nav-scrollable { - display: block; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .nav-scrollable { - /* Never collapse the sidebar for wide screens */ - display: block; - - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} +.navbar-toggler { + appearance: none; + cursor: pointer; + width: 3.5rem; + height: 2.5rem; + color: white; + position: absolute; + top: 0.5rem; + right: 1rem; + border: 1px solid rgba(255, 255, 255, 0.1); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); +} + +.navbar-toggler:checked { + background-color: rgba(255, 255, 255, 0.5); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep .nav-link { + color: #d7d7d7; + background: none; + border: none; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + width: 100%; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep .nav-link:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +.nav-scrollable { + display: none; +} + +.navbar-toggler:checked ~ .nav-scrollable { + display: block; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .nav-scrollable { + /* Never collapse the sidebar for wide screens */ + display: block; + + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/GlobalUsings.cs b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/GlobalUsings.cs index 2d3618e9b..2f1eed7f0 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/GlobalUsings.cs +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/GlobalUsings.cs @@ -1,7 +1,7 @@ -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.Extensions.DependencyInjection; -global using Sample00Auto.Client.Pages; -global using Sample00Auto.Components; -global using TimeWarp.State; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.Extensions.DependencyInjection; +global using Sample00Auto.Client.Pages; +global using Sample00Auto.Components; +global using TimeWarp.State; diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Program.cs b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Program.cs index 1ca1bccff..e8cc9c67d 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Program.cs +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Program.cs @@ -1,40 +1,40 @@ -namespace Sample00Auto; - -public class Program -{ - public static void Main(string[] args) - { - var builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddRazorComponents() - .AddInteractiveServerComponents() - .AddInteractiveWebAssemblyComponents(); - - Sample00Auto.Client.Program.ConfigureServices(builder.Services); // <=== Add this line. - - var app = builder.Build(); - - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.UseWebAssemblyDebugging(); - } - else - { - app.UseExceptionHandler("/Error"); - app.UseHsts(); - } - - app.UseHttpsRedirection(); - app.UseStaticFiles(); - app.UseAntiforgery(); - - app.MapRazorComponents() - .AddInteractiveServerRenderMode() - .AddInteractiveWebAssemblyRenderMode() - .AddAdditionalAssemblies(typeof(Client._Imports).Assembly); - - app.Run(); - } -} +namespace Sample00Auto; + +public class Program +{ + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + builder.Services.AddRazorComponents() + .AddInteractiveServerComponents() + .AddInteractiveWebAssemblyComponents(); + + Sample00Auto.Client.Program.ConfigureServices(builder.Services); // <=== Add this line. + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseWebAssemblyDebugging(); + } + else + { + app.UseExceptionHandler("/Error"); + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseAntiforgery(); + + app.MapRazorComponents() + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(Client._Imports).Assembly); + + app.Run(); + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Properties/launchSettings.json b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Properties/launchSettings.json index 23bb51266..d7b9929db 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Properties/launchSettings.json +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Properties/launchSettings.json @@ -1,41 +1,41 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:45555", - "sslPort": 44353 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5249", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7263;http://localhost:5249", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } - } +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:45555", + "sslPort": 44353 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5249", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7263;http://localhost:5249", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } + } diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Sample00Auto.csproj b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Sample00Auto.csproj index 7dbab7f4c..aa81ebb30 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Sample00Auto.csproj +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/Sample00Auto.csproj @@ -1,14 +1,14 @@ - - - - net8.0 - enable - enable - - - - - - - - + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.Development.json b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.Development.json index ff66ba6b2..0c208ae91 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.Development.json +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.Development.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.json b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.json index 4d566948d..10f68b8c8 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.json +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/appsettings.json @@ -1,9 +1,9 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/wwwroot/app.css b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/wwwroot/app.css index 7ac30e2a8..2bd9b7896 100644 --- a/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/wwwroot/app.css +++ b/Samples/00-StateActionHandler/Auto/Sample00Auto/Sample00Auto/wwwroot/app.css @@ -1,51 +1,51 @@ -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -a, .btn-link { - color: #006bb7; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -h1:focus { - outline: none; -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid #e50000; -} - -.validation-message { - color: #e50000; -} - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } - -.darker-border-checkbox.form-check-input { - border-color: #929292; -} +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +a, .btn-link { + color: #006bb7; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +h1:focus { + outline: none; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid #e50000; +} + +.validation-message { + color: #e50000; +} + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.darker-border-checkbox.form-check-input { + border-color: #929292; +} diff --git a/Samples/00-StateActionHandler/README.md b/Samples/00-StateActionHandler/README.md index 2bcd38947..7767c9475 100644 --- a/Samples/00-StateActionHandler/README.md +++ b/Samples/00-StateActionHandler/README.md @@ -1,56 +1,56 @@ -# States Actions and Handlers in TimeWarp.State - -The StateActionHandler pattern is a fundamental concept in TimeWarp.State that implements unidirectional data flow. This pattern consists of three main components: - -## Components - -### 1. State -- Represents the current state of your application or a portion of it -- Is immutable from the outside -- Can only be modified through Actions and their Handlers -- Inherits from `State` - -### 2. Action -- Represents an intent to change the state -- Contains any data needed to perform the state change -- Is immutable -- Implements `IAction` - -### 3. Handler -- Processes the Action and updates the State -- Is the only component allowed to modify State -- Inherits from `ActionHandler` - -## Flow - -1. Components interact with State through read-only properties -2. When a state change is needed, an Action is dispatched -3. The corresponding Handler processes the Action -4. The Handler updates the State -5. Components are automatically notified of State changes - -## Examples - -This directory contains examples of the StateActionHandler pattern implemented in different Blazor render modes: - -- [Auto](Auto/): Implementation using Blazor's Interactive Auto render mode -- [Server](Server/): Implementation using Blazor's Interactive Server render mode -- [Wasm](Wasm/): Implementation using Blazor's Interactive WebAssembly render mode - -Each example demonstrates the same core concepts but highlights considerations specific to that render mode. - -## Key Benefits - -1. **Predictable State Changes**: All state modifications follow the same pattern -2. **Immutable State**: State can only be modified through handlers -3. **Separation of Concerns**: Clear separation between state, actions, and their handlers -4. **Testability**: Actions and their effects are easily testable -5. **Debugging**: State changes are traceable through actions - -## Best Practices - -1. Keep States focused and cohesive -2. Make Actions intention-revealing -3. Keep Handlers pure and predictable -4. Use meaningful names that reflect the domain -5. Follow the immutability principle +# States Actions and Handlers in TimeWarp.State + +The StateActionHandler pattern is a fundamental concept in TimeWarp.State that implements unidirectional data flow. This pattern consists of three main components: + +## Components + +### 1. State +- Represents the current state of your application or a portion of it +- Is immutable from the outside +- Can only be modified through Actions and their Handlers +- Inherits from `State` + +### 2. Action +- Represents an intent to change the state +- Contains any data needed to perform the state change +- Is immutable +- Implements `IAction` + +### 3. Handler +- Processes the Action and updates the State +- Is the only component allowed to modify State +- Inherits from `ActionHandler` + +## Flow + +1. Components interact with State through read-only properties +2. When a state change is needed, an Action is dispatched +3. The corresponding Handler processes the Action +4. The Handler updates the State +5. Components are automatically notified of State changes + +## Examples + +This directory contains examples of the StateActionHandler pattern implemented in different Blazor render modes: + +- [Auto](Auto/): Implementation using Blazor's Interactive Auto render mode +- [Server](Server/): Implementation using Blazor's Interactive Server render mode +- [Wasm](Wasm/): Implementation using Blazor's Interactive WebAssembly render mode + +Each example demonstrates the same core concepts but highlights considerations specific to that render mode. + +## Key Benefits + +1. **Predictable State Changes**: All state modifications follow the same pattern +2. **Immutable State**: State can only be modified through handlers +3. **Separation of Concerns**: Clear separation between state, actions, and their handlers +4. **Testability**: Actions and their effects are easily testable +5. **Debugging**: State changes are traceable through actions + +## Best Practices + +1. Keep States focused and cohesive +2. Make Actions intention-revealing +3. Keep Handlers pure and predictable +4. Use meaningful names that reflect the domain +5. Follow the immutability principle diff --git a/Samples/00-StateActionHandler/Server/README.md b/Samples/00-StateActionHandler/Server/README.md index 1736efee2..9213f46a0 100644 --- a/Samples/00-StateActionHandler/Server/README.md +++ b/Samples/00-StateActionHandler/Server/README.md @@ -1,224 +1,224 @@ ---- -uid: TimeWarp.State:00-StateActionHandler-Server.md -title: TimeWarp.State Blazor Interactive Server Tutorial -renderMode: InteractiveServer -description: Learn TimeWarp.State basics using Blazor with Interactive Server render mode ---- - -# TimeWarp.State Blazor Interactive Server Tutorial - -> [!TIP] -> View the complete reference implementation for this tutorial: -> - [Sample00Server Project](./Sample00Server/) -> - [CounterState Implementation](./Sample00Server/Features/Counter/CounterState.cs) -> - [Counter Page Component](./Sample00Server/Components/Pages/Counter.razor) -> - [Program.cs with Service Configuration](./Sample00Server/Program.cs) - -## State, Actions, and Handlers - -This tutorial will walk you through the steps to create a Blazor application with TimeWarp.State using Interactive Server render mode. - -> [!NOTE] -> This tutorial uses Blazor's Interactive Server render mode. For tutorials covering other render modes (Auto or WebAssembly-only), please see the respective tutorials in this series. - -### Prerequisites - -- [.NET 8.0 SDK](https://dotnet.microsoft.com/download). - -### Creating the Project - -1. Create a new Blazor project: -```bash -dotnet new blazor --use-program-main --interactivity Server -n Sample00Server -``` - -2. Navigate to the project directory: -```bash -cd Sample00Server -``` - -3. Test the application: -```bash -dotnet run --project ./Sample00Server/Sample00Server.csproj -``` - -4. Open the URL shown in the command output (e.g., http://localhost:5256) and test the counter functionality. - -> [!NOTE] -> The counter resets to zero when you navigate away and return because each time you leave the page, -> the counter component is destroyed. -> When you return, a new instance of the component is created, starting the count afresh. - -### Install TimeWarp.State Package - -Add the TimeWarp.State NuGet package: - -```bash -dotnet add ./Sample00Server/Sample00Server.csproj package TimeWarp.State -``` - -### Configure Services - -Create GlobalUsings.cs to centralize common using statements: - -```csharp -// Sample00Server/GlobalUsings.cs -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.Extensions.DependencyInjection; -global using Sample00Server.Components; -global using TimeWarp.State; -``` - -Update Program.cs to add TimeWarp.State services: - -```csharp -// Sample00Server/Program.cs -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); - -builder.Services.AddTimeWarpState(); // Add this line - -var app = builder.Build(); - -// Configure the HTTP request pipeline. -if (!app.Environment.IsDevelopment()) -{ - app.UseExceptionHandler("/Error"); - app.UseHsts(); -} - -app.UseHttpsRedirection(); -app.UseStaticFiles(); -app.UseAntiforgery(); - -app.MapRazorComponents() - .AddInteractiveServerRenderMode(); - -app.Run(); -``` - -### Add Features - -1. Create a `Features` folder in the project root. -2. Inside `Features`, add a `Counter` folder. -3. Inside `Counter`, add `CounterState.cs`: - -```csharp -// CounterState.cs -namespace Sample00Server.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - - public override void Initialize() - { - Count = 3; - } -} -``` - -### UI Integration - -Modify `Components/Pages/Counter.razor`: - -```razor -@page "/counter" -@rendermode InteractiveServer -@using Sample00Server.Features.Counter -@inherits TimeWarp.State.TimeWarpStateComponent - -Counter - -

Counter

- -

Current count: @currentCount

- - - -@code { - CounterState CounterState => GetState(); - private int currentCount => CounterState.Count; - - private void IncrementCount() - { - // Empty for now - } -} -``` - -### Implementing State Mutation through Actions and Handlers - -Create `CounterState.IncrementCount.cs` in the Counter folder: - -```csharp -namespace Sample00Server.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} -``` - -### Update Counter Component - -Update the `IncrementCount` method in `Counter.razor`: - -```razor -private async Task IncrementCount() -{ - await CounterState.IncrementCount(amount: 5); -} -``` - -### Validate - -Run the application and test the counter functionality: - -```bash -dotnet run -``` - -You should see: -1. The counter starts at 3 (initialized in CounterState) -2. Each click increases the count by 5 -3. The state persists as long as the server connection is maintained -4. If you refresh the page or restart the server, the state resets - -### Key Differences from Auto Mode - -1. **State Location**: In Server mode, state is maintained on the server, not in the browser -2. **Connection Dependency**: State persists only as long as the SignalR connection is maintained -3. **Memory Management**: Server must manage state for all connected clients -4. **Performance**: No need to serialize state between client and server - -This implementation demonstrates how TimeWarp.State works in a server-side context while maintaining the same clean architecture and patterns used in other render modes. +--- +uid: TimeWarp.State:00-StateActionHandler-Server.md +title: TimeWarp.State Blazor Interactive Server Tutorial +renderMode: InteractiveServer +description: Learn TimeWarp.State basics using Blazor with Interactive Server render mode +--- + +# TimeWarp.State Blazor Interactive Server Tutorial + +> [!TIP] +> View the complete reference implementation for this tutorial: +> - [Sample00Server Project](./Sample00Server/) +> - [CounterState Implementation](./Sample00Server/Features/Counter/CounterState.cs) +> - [Counter Page Component](./Sample00Server/Components/Pages/Counter.razor) +> - [Program.cs with Service Configuration](./Sample00Server/Program.cs) + +## State, Actions, and Handlers + +This tutorial will walk you through the steps to create a Blazor application with TimeWarp.State using Interactive Server render mode. + +> [!NOTE] +> This tutorial uses Blazor's Interactive Server render mode. For tutorials covering other render modes (Auto or WebAssembly-only), please see the respective tutorials in this series. + +### Prerequisites + +- [.NET 8.0 SDK](https://dotnet.microsoft.com/download). + +### Creating the Project + +1. Create a new Blazor project: +```bash +dotnet new blazor --use-program-main --interactivity Server -n Sample00Server +``` + +2. Navigate to the project directory: +```bash +cd Sample00Server +``` + +3. Test the application: +```bash +dotnet run --project ./Sample00Server/Sample00Server.csproj +``` + +4. Open the URL shown in the command output (e.g., http://localhost:5256) and test the counter functionality. + +> [!NOTE] +> The counter resets to zero when you navigate away and return because each time you leave the page, +> the counter component is destroyed. +> When you return, a new instance of the component is created, starting the count afresh. + +### Install TimeWarp.State Package + +Add the TimeWarp.State NuGet package: + +```bash +dotnet add ./Sample00Server/Sample00Server.csproj package TimeWarp.State +``` + +### Configure Services + +Create GlobalUsings.cs to centralize common using statements: + +```csharp +// Sample00Server/GlobalUsings.cs +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.Extensions.DependencyInjection; +global using Sample00Server.Components; +global using TimeWarp.State; +``` + +Update Program.cs to add TimeWarp.State services: + +```csharp +// Sample00Server/Program.cs +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); + +builder.Services.AddTimeWarpState(); // Add this line + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseAntiforgery(); + +app.MapRazorComponents() + .AddInteractiveServerRenderMode(); + +app.Run(); +``` + +### Add Features + +1. Create a `Features` folder in the project root. +2. Inside `Features`, add a `Counter` folder. +3. Inside `Counter`, add `CounterState.cs`: + +```csharp +// CounterState.cs +namespace Sample00Server.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + + public override void Initialize() + { + Count = 3; + } +} +``` + +### UI Integration + +Modify `Components/Pages/Counter.razor`: + +```razor +@page "/counter" +@rendermode InteractiveServer +@using Sample00Server.Features.Counter +@inherits TimeWarp.State.TimeWarpStateComponent + +Counter + +

Counter

+ +

Current count: @currentCount

+ + + +@code { + CounterState CounterState => GetState(); + private int currentCount => CounterState.Count; + + private void IncrementCount() + { + // Empty for now + } +} +``` + +### Implementing State Mutation through Actions and Handlers + +Create `CounterState.IncrementCount.cs` in the Counter folder: + +```csharp +namespace Sample00Server.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} +``` + +### Update Counter Component + +Update the `IncrementCount` method in `Counter.razor`: + +```razor +private async Task IncrementCount() +{ + await CounterState.IncrementCount(amount: 5); +} +``` + +### Validate + +Run the application and test the counter functionality: + +```bash +dotnet run +``` + +You should see: +1. The counter starts at 3 (initialized in CounterState) +2. Each click increases the count by 5 +3. The state persists as long as the server connection is maintained +4. If you refresh the page or restart the server, the state resets + +### Key Differences from Auto Mode + +1. **State Location**: In Server mode, state is maintained on the server, not in the browser +2. **Connection Dependency**: State persists only as long as the SignalR connection is maintained +3. **Memory Management**: Server must manage state for all connected clients +4. **Performance**: No need to serialize state between client and server + +This implementation demonstrates how TimeWarp.State works in a server-side context while maintaining the same clean architecture and patterns used in other render modes. diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/MainLayout.razor.css b/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/MainLayout.razor.css index 49baa0c36..038baf178 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/MainLayout.razor.css +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/MainLayout.razor.css @@ -1,96 +1,96 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/NavMenu.razor.css b/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/NavMenu.razor.css index 2275bdb3b..4e15395e0 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/NavMenu.razor.css +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Components/Layout/NavMenu.razor.css @@ -1,105 +1,105 @@ -.navbar-toggler { - appearance: none; - cursor: pointer; - width: 3.5rem; - height: 2.5rem; - color: white; - position: absolute; - top: 0.5rem; - right: 1rem; - border: 1px solid rgba(255, 255, 255, 0.1); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); -} - -.navbar-toggler:checked { - background-color: rgba(255, 255, 255, 0.5); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep .nav-link { - color: #d7d7d7; - background: none; - border: none; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - width: 100%; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep .nav-link:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -.nav-scrollable { - display: none; -} - -.navbar-toggler:checked ~ .nav-scrollable { - display: block; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .nav-scrollable { - /* Never collapse the sidebar for wide screens */ - display: block; - - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} +.navbar-toggler { + appearance: none; + cursor: pointer; + width: 3.5rem; + height: 2.5rem; + color: white; + position: absolute; + top: 0.5rem; + right: 1rem; + border: 1px solid rgba(255, 255, 255, 0.1); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); +} + +.navbar-toggler:checked { + background-color: rgba(255, 255, 255, 0.5); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep .nav-link { + color: #d7d7d7; + background: none; + border: none; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + width: 100%; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep .nav-link:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +.nav-scrollable { + display: none; +} + +.navbar-toggler:checked ~ .nav-scrollable { + display: block; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .nav-scrollable { + /* Never collapse the sidebar for wide screens */ + display: block; + + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.IncrementCount.cs b/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.IncrementCount.cs index 0c25817ba..0a3ebddc8 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.IncrementCount.cs +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.IncrementCount.cs @@ -1,30 +1,30 @@ -namespace Sample00Server.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} +namespace Sample00Server.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.cs b/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.cs index a4d003e25..dd2656d91 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.cs +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Features/Counter/CounterState.cs @@ -1,11 +1,11 @@ -namespace Sample00Server.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - - public override void Initialize() - { - Count = 3; - } -} +namespace Sample00Server.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + + public override void Initialize() + { + Count = 3; + } +} diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/GlobalUsings.cs b/Samples/00-StateActionHandler/Server/Sample00Server/GlobalUsings.cs index d0b72d690..88b3d4213 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/GlobalUsings.cs +++ b/Samples/00-StateActionHandler/Server/Sample00Server/GlobalUsings.cs @@ -1,6 +1,6 @@ -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.Extensions.DependencyInjection; -global using Sample00Server.Components; -global using TimeWarp.State; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.Extensions.DependencyInjection; +global using Sample00Server.Components; +global using TimeWarp.State; diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Program.cs b/Samples/00-StateActionHandler/Server/Sample00Server/Program.cs index a66126b03..987ff3ffd 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Program.cs +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Program.cs @@ -1,35 +1,35 @@ -namespace Sample00Server; - -public class Program -{ - public static void Main(string[] args) - { - var builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); - - builder.Services.AddTimeWarpState(); // Add this line - - var app = builder.Build(); - - // Configure the HTTP request pipeline. - if (!app.Environment.IsDevelopment()) - { - app.UseExceptionHandler("/Error"); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - } - - app.UseHttpsRedirection(); - - app.UseStaticFiles(); - app.UseAntiforgery(); - - app.MapRazorComponents() - .AddInteractiveServerRenderMode(); - - app.Run(); - } -} +namespace Sample00Server; + +public class Program +{ + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); + + builder.Services.AddTimeWarpState(); // Add this line + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + if (!app.Environment.IsDevelopment()) + { + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + + app.UseStaticFiles(); + app.UseAntiforgery(); + + app.MapRazorComponents() + .AddInteractiveServerRenderMode(); + + app.Run(); + } +} diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Properties/launchSettings.json b/Samples/00-StateActionHandler/Server/Sample00Server/Properties/launchSettings.json index 09a1d4a00..18de3d6a7 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Properties/launchSettings.json +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Properties/launchSettings.json @@ -1,38 +1,38 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:64871", - "sslPort": 44300 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5084", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7075;http://localhost:5084", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } - } +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:64871", + "sslPort": 44300 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5084", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7075;http://localhost:5084", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } + } diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/Sample00Server.csproj b/Samples/00-StateActionHandler/Server/Sample00Server/Sample00Server.csproj index e1a82a97f..e1dcd389e 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/Sample00Server.csproj +++ b/Samples/00-StateActionHandler/Server/Sample00Server/Sample00Server.csproj @@ -1,13 +1,13 @@ - - - - net8.0 - enable - enable - - - - - - - + + + + net8.0 + enable + enable + + + + + + + diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.Development.json b/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.Development.json index ff66ba6b2..0c208ae91 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.Development.json +++ b/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.Development.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.json b/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.json index 4d566948d..10f68b8c8 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.json +++ b/Samples/00-StateActionHandler/Server/Sample00Server/appsettings.json @@ -1,9 +1,9 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Samples/00-StateActionHandler/Server/Sample00Server/wwwroot/app.css b/Samples/00-StateActionHandler/Server/Sample00Server/wwwroot/app.css index 7ac30e2a8..2bd9b7896 100644 --- a/Samples/00-StateActionHandler/Server/Sample00Server/wwwroot/app.css +++ b/Samples/00-StateActionHandler/Server/Sample00Server/wwwroot/app.css @@ -1,51 +1,51 @@ -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -a, .btn-link { - color: #006bb7; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -h1:focus { - outline: none; -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid #e50000; -} - -.validation-message { - color: #e50000; -} - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } - -.darker-border-checkbox.form-check-input { - border-color: #929292; -} +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +a, .btn-link { + color: #006bb7; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +h1:focus { + outline: none; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid #e50000; +} + +.validation-message { + color: #e50000; +} + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.darker-border-checkbox.form-check-input { + border-color: #929292; +} diff --git a/Samples/00-StateActionHandler/Wasm/README.md b/Samples/00-StateActionHandler/Wasm/README.md index aa639b7fa..6fdfbfdf1 100644 --- a/Samples/00-StateActionHandler/Wasm/README.md +++ b/Samples/00-StateActionHandler/Wasm/README.md @@ -1,207 +1,207 @@ ---- -uid: TimeWarp.State:00-StateActionHandler-Wasm.md -title: TimeWarp.State Blazor WebAssembly Tutorial -renderMode: WebAssembly -description: Learn TimeWarp.State basics using Blazor WebAssembly ---- - -# TimeWarp.State Blazor WebAssembly Tutorial - -> [!TIP] -> View the complete reference implementation for this tutorial: -> - [Sample00Wasm Project](./Sample00Wasm/) -> - [CounterState Implementation](./Sample00Wasm/Features/Counter/CounterState.cs) -> - [Counter Page Component](./Sample00Wasm/Pages/Counter.razor) - -## State, Actions, and Handlers - -This tutorial will walk you through the steps to create a Blazor WebAssembly application with TimeWarp.State. - -> [!NOTE] -> This tutorial uses Blazor WebAssembly standalone mode. For tutorials covering other modes (Auto or Server), please see the respective tutorials in this series. - -### Prerequisites - -- [.NET 8.0 SDK](https://dotnet.microsoft.com/download). - -### Creating the Project - -1. Create a new Blazor WebAssembly project: -```bash -dotnet new blazorwasm -n Sample00Wasm -``` - -2. Navigate to the project directory: -```bash -cd Sample00Wasm -``` - -3. Test the application: -```bash -dotnet run -``` - -4. Open the URL shown in the command output (e.g., http://localhost:5000) and test the counter functionality. - -> [!NOTE] -> The counter resets to zero when you navigate away and return because each time you leave the page, -> the counter component is destroyed. -> When you return, a new instance of the component is created, starting the count afresh. - -### Install TimeWarp.State Package - -Add the TimeWarp.State NuGet package: - -```bash -dotnet add package TimeWarp.State --prerelease -``` - -### Configure Services - -Create GlobalUsings.cs to centralize common using statements: - -```csharp -// GlobalUsings.cs -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using TimeWarp.State; -``` - -Update Program.cs to add TimeWarp.State services: - -```csharp -// Program.cs -var builder = WebAssemblyHostBuilder.CreateDefault(args); -builder.RootComponents.Add("#app"); -builder.RootComponents.Add("head::after"); - -builder.Services.AddTimeWarpState(); - -await builder.Build().RunAsync(); -``` - -### Add Features - -1. Create a `Features` folder in the project root. -2. Inside `Features`, add a `Counter` folder. -3. Inside `Counter`, add `CounterState.cs`: - -```csharp -// CounterState.cs -namespace Sample00Wasm.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - - public override void Initialize() - { - Count = 3; - } -} -``` - -### UI Integration - -Modify `Pages/Counter.razor`: - -```razor -@page "/counter" -@using Sample00Wasm.Features.Counter -@inherits TimeWarp.State.TimeWarpStateComponent - -Counter - -

Counter

- -

Current count: @currentCount

- - - -@code { - CounterState CounterState => GetState(); - private int currentCount => CounterState.Count; - - private async Task IncrementCount() - { - await CounterState.IncrementCount(amount: 5); - } -} -``` - -### Implementing State Mutation through Actions and Handlers - -Create `CounterState.IncrementCount.cs` in the Counter folder: - -```csharp -namespace Sample00Wasm.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} -``` - -### Validate - -Run the application and test the counter functionality: - -```bash -dotnet run -``` - -You should see: -1. The counter starts at 3 (initialized in CounterState) -2. Each click increases the count by 5 -3. The state persists during the current browser session -4. If you refresh the page, the state resets - -### Key Differences from Server Mode - -1. **State Location**: In WebAssembly mode, state is maintained in the browser's memory -2. **Network Independence**: Once loaded, the application can work offline -3. **Performance Characteristics**: - - Initial load is slower (WebAssembly download) - - Actions process faster (no network round-trip) - - Memory usage is limited to browser resources -4. **Browser Limitations**: Must work within browser sandbox constraints - -### WebAssembly-Specific Considerations - -1. **State Persistence**: - - State is lost on page refresh by default - - Consider using browser storage for persistence if needed -2. **Memory Management**: - - Be mindful of memory usage as it's limited by the browser - - Consider cleanup strategies for large state objects -3. **Performance**: - - Minimize state size for better performance - - Use appropriate data structures for WebAssembly context - -This implementation demonstrates how TimeWarp.State works in a WebAssembly context while maintaining the same clean architecture and patterns used in other render modes. +--- +uid: TimeWarp.State:00-StateActionHandler-Wasm.md +title: TimeWarp.State Blazor WebAssembly Tutorial +renderMode: WebAssembly +description: Learn TimeWarp.State basics using Blazor WebAssembly +--- + +# TimeWarp.State Blazor WebAssembly Tutorial + +> [!TIP] +> View the complete reference implementation for this tutorial: +> - [Sample00Wasm Project](./Sample00Wasm/) +> - [CounterState Implementation](./Sample00Wasm/Features/Counter/CounterState.cs) +> - [Counter Page Component](./Sample00Wasm/Pages/Counter.razor) + +## State, Actions, and Handlers + +This tutorial will walk you through the steps to create a Blazor WebAssembly application with TimeWarp.State. + +> [!NOTE] +> This tutorial uses Blazor WebAssembly standalone mode. For tutorials covering other modes (Auto or Server), please see the respective tutorials in this series. + +### Prerequisites + +- [.NET 8.0 SDK](https://dotnet.microsoft.com/download). + +### Creating the Project + +1. Create a new Blazor WebAssembly project: +```bash +dotnet new blazorwasm -n Sample00Wasm +``` + +2. Navigate to the project directory: +```bash +cd Sample00Wasm +``` + +3. Test the application: +```bash +dotnet run +``` + +4. Open the URL shown in the command output (e.g., http://localhost:5000) and test the counter functionality. + +> [!NOTE] +> The counter resets to zero when you navigate away and return because each time you leave the page, +> the counter component is destroyed. +> When you return, a new instance of the component is created, starting the count afresh. + +### Install TimeWarp.State Package + +Add the TimeWarp.State NuGet package: + +```bash +dotnet add package TimeWarp.State --prerelease +``` + +### Configure Services + +Create GlobalUsings.cs to centralize common using statements: + +```csharp +// GlobalUsings.cs +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using TimeWarp.State; +``` + +Update Program.cs to add TimeWarp.State services: + +```csharp +// Program.cs +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddTimeWarpState(); + +await builder.Build().RunAsync(); +``` + +### Add Features + +1. Create a `Features` folder in the project root. +2. Inside `Features`, add a `Counter` folder. +3. Inside `Counter`, add `CounterState.cs`: + +```csharp +// CounterState.cs +namespace Sample00Wasm.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + + public override void Initialize() + { + Count = 3; + } +} +``` + +### UI Integration + +Modify `Pages/Counter.razor`: + +```razor +@page "/counter" +@using Sample00Wasm.Features.Counter +@inherits TimeWarp.State.TimeWarpStateComponent + +Counter + +

Counter

+ +

Current count: @currentCount

+ + + +@code { + CounterState CounterState => GetState(); + private int currentCount => CounterState.Count; + + private async Task IncrementCount() + { + await CounterState.IncrementCount(amount: 5); + } +} +``` + +### Implementing State Mutation through Actions and Handlers + +Create `CounterState.IncrementCount.cs` in the Counter folder: + +```csharp +namespace Sample00Wasm.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} +``` + +### Validate + +Run the application and test the counter functionality: + +```bash +dotnet run +``` + +You should see: +1. The counter starts at 3 (initialized in CounterState) +2. Each click increases the count by 5 +3. The state persists during the current browser session +4. If you refresh the page, the state resets + +### Key Differences from Server Mode + +1. **State Location**: In WebAssembly mode, state is maintained in the browser's memory +2. **Network Independence**: Once loaded, the application can work offline +3. **Performance Characteristics**: + - Initial load is slower (WebAssembly download) + - Actions process faster (no network round-trip) + - Memory usage is limited to browser resources +4. **Browser Limitations**: Must work within browser sandbox constraints + +### WebAssembly-Specific Considerations + +1. **State Persistence**: + - State is lost on page refresh by default + - Consider using browser storage for persistence if needed +2. **Memory Management**: + - Be mindful of memory usage as it's limited by the browser + - Consider cleanup strategies for large state objects +3. **Performance**: + - Minimize state size for better performance + - Use appropriate data structures for WebAssembly context + +This implementation demonstrates how TimeWarp.State works in a WebAssembly context while maintaining the same clean architecture and patterns used in other render modes. diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.IncrementCount.cs b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.IncrementCount.cs index ec0bfae0d..71de3fe2b 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.IncrementCount.cs +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.IncrementCount.cs @@ -1,30 +1,30 @@ -namespace Sample00Wasm.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} +namespace Sample00Wasm.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.cs b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.cs index 7730fcd49..a80fb7c19 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.cs +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Features/Counter/CounterState.cs @@ -1,11 +1,11 @@ -namespace Sample00Wasm.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - - public override void Initialize() - { - Count = 3; - } -} +namespace Sample00Wasm.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + + public override void Initialize() + { + Count = 3; + } +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/GlobalUsings.cs b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/GlobalUsings.cs index 620199a86..533d58d8d 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/GlobalUsings.cs +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/GlobalUsings.cs @@ -1,5 +1,5 @@ -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using TimeWarp.State; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using TimeWarp.State; diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/MainLayout.razor.css b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/MainLayout.razor.css index baef3ee5f..ecf25e5b2 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/MainLayout.razor.css +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/MainLayout.razor.css @@ -1,77 +1,77 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/NavMenu.razor.css b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/NavMenu.razor.css index 07d4c0f8c..881d128a5 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/NavMenu.razor.css +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Layout/NavMenu.razor.css @@ -1,83 +1,83 @@ -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } - - .nav-scrollable { - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Program.cs b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Program.cs index fbb64bb98..b41b897ad 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Program.cs +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Program.cs @@ -1,15 +1,15 @@ -namespace Sample00Wasm; - -public class Program -{ - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - builder.RootComponents.Add("head::after"); - - builder.Services.AddTimeWarpState(); - - await builder.Build().RunAsync(); - } -} +namespace Sample00Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddTimeWarpState(); + + await builder.Build().RunAsync(); + } +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Properties/launchSettings.json b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Properties/launchSettings.json index 2a13c3efd..3262ffa22 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Properties/launchSettings.json +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Properties/launchSettings.json @@ -1,41 +1,41 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:42013", - "sslPort": 44307 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5241", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7230;http://localhost:5241", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:42013", + "sslPort": 44307 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5241", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7230;http://localhost:5241", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Sample00Wasm.csproj b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Sample00Wasm.csproj index 06ff8e334..4fbd50d54 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Sample00Wasm.csproj +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/Sample00Wasm.csproj @@ -1,15 +1,15 @@ - - - - net8.0 - enable - enable - - - - - - - - - + + + + net8.0 + enable + enable + + + + + + + + + diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/css/app.css b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/css/app.css index 0a4519e08..54a8aa38c 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/css/app.css +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/css/app.css @@ -1,103 +1,103 @@ -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -h1:focus { - outline: none; -} - -a, .btn-link { - color: #0071c1; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid red; -} - -.validation-message { - color: red; -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } - -.loading-progress { - position: relative; - display: block; - width: 8rem; - height: 8rem; - margin: 20vh auto 1rem auto; -} - - .loading-progress circle { - fill: none; - stroke: #e0e0e0; - stroke-width: 0.6rem; - transform-origin: 50% 50%; - transform: rotate(-90deg); - } - - .loading-progress circle:last-child { - stroke: #1b6ec2; - stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; - transition: stroke-dasharray 0.05s ease-in-out; - } - -.loading-progress-text { - position: absolute; - text-align: center; - font-weight: bold; - inset: calc(20vh + 3.25rem) 0 auto 0.2rem; -} - - .loading-progress-text:after { - content: var(--blazor-load-percentage-text, "Loading"); - } - -code { - color: #c02d76; -} +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/index.html b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/index.html index 5dc779e9c..90a363951 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/index.html +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/index.html @@ -1,32 +1,32 @@ - - - - - - - Sample00Wasm - - - - - - - - -
- - - - -
-
- -
- An unhandled error has occurred. - Reload - 🗙 -
- - - - + + + + + + + Sample00Wasm + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + diff --git a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/sample-data/weather.json b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/sample-data/weather.json index f0648e7bf..b7459733f 100644 --- a/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/sample-data/weather.json +++ b/Samples/00-StateActionHandler/Wasm/Sample00Wasm/wwwroot/sample-data/weather.json @@ -1,27 +1,27 @@ -[ - { - "date": "2022-01-06", - "temperatureC": 1, - "summary": "Freezing" - }, - { - "date": "2022-01-07", - "temperatureC": 14, - "summary": "Bracing" - }, - { - "date": "2022-01-08", - "temperatureC": -13, - "summary": "Freezing" - }, - { - "date": "2022-01-09", - "temperatureC": -16, - "summary": "Balmy" - }, - { - "date": "2022-01-10", - "temperatureC": -2, - "summary": "Chilly" - } -] +[ + { + "date": "2022-01-06", + "temperatureC": 1, + "summary": "Freezing" + }, + { + "date": "2022-01-07", + "temperatureC": 14, + "summary": "Bracing" + }, + { + "date": "2022-01-08", + "temperatureC": -13, + "summary": "Freezing" + }, + { + "date": "2022-01-09", + "temperatureC": -16, + "summary": "Balmy" + }, + { + "date": "2022-01-10", + "temperatureC": -2, + "summary": "Chilly" + } +] diff --git a/Samples/01-ReduxDevTools/Wasm/Readme.md b/Samples/01-ReduxDevTools/Wasm/Readme.md index 73d55c58b..f466d9913 100644 --- a/Samples/01-ReduxDevTools/Wasm/Readme.md +++ b/Samples/01-ReduxDevTools/Wasm/Readme.md @@ -1,144 +1,144 @@ ---- -uid: TimeWarp.State:01-ReduxDevTools.md -title: Adding Redux DevTools to TimeWarp.State -renderMode: WebAssembly -description: Learn how to integrate Redux DevTools with TimeWarp.State for enhanced debugging ---- - -# Adding Redux DevTools to TimeWarp.State - -> [!TIP] -> View the complete reference implementation for this tutorial: -> - [Sample01Wasm Project](./Sample01Wasm/) -> - [Program.cs with Redux Configuration](./Sample01Wasm/Program.cs) -> - [App.razor with Redux Components](./Sample01Wasm/App.razor) - -This tutorial demonstrates how to add Redux DevTools support to your TimeWarp.State Blazor WebAssembly application. Redux DevTools provides powerful debugging capabilities, allowing you to monitor state changes, inspect actions, and understand your application's behavior. - -## Prerequisites - -- Completed [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler-Wasm.md) -- Understanding of basic TimeWarp.State concepts (State, Actions, and Handlers) -- [Redux DevTools Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd) installed in Chrome - -## Enable Redux DevTools - -1. Add the TimeWarp.State.Plus package: -```bash -dotnet add package TimeWarp.State.Plus --prerelease -``` - -2. Update GlobalUsings.cs to include necessary namespaces: -```csharp -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using Sample01Wasm; -global using System.Reflection; -global using TimeWarp.Features.Routing; -global using TimeWarp.State; -``` - -3. Update Program.cs to enable Redux DevTools: -```csharp -var builder = WebAssemblyHostBuilder.CreateDefault(args); -builder.RootComponents.Add("#app"); -builder.RootComponents.Add("head::after"); - -builder.Services.AddTimeWarpState -( - options => - { - options.UseReduxDevTools(); - } -); - -await builder.Build().RunAsync(); -``` - -4. Add Redux DevTools components to App.razor: -```razor - - - - - - - Not found - -

Sorry, there's nothing at this address.

-
-
-
- - - -``` - -## Using Redux DevTools - -1. Run the application: -```bash -dotnet run -``` - -2. Open Chrome DevTools (F12) and navigate to the Redux tab. - -3. Interact with the Counter page and observe in Redux DevTools: - -![Redux DevTools Interface](../../Documentation/Images/ReduxDevTools.png) - -As shown above, Redux DevTools provides a comprehensive view of: -- Actions being dispatched (left panel) -- Current state tree (right panel) -- Action payloads and timestamps -- State changes over time - -The interface also shows the RouteState being tracked: - -![Route State in Redux DevTools](../../Documentation/Images/ReduxRouteState.png) - -This view demonstrates how TimeWarp.State automatically maintains route information in the state tree, making it easy to debug navigation-related issues. - -### Key Features in Redux DevTools - -1. **Action List**: View a chronological list of dispatched actions -2. **State Tree**: Inspect the current state structure -3. **Action Details**: See the payload and effects of each action -4. **Time Travel**: Jump to any previous state -5. **Route State**: Monitor navigation changes through RouteState - -### Debugging Tips - -1. Use the "State" tab to inspect current values -2. Check "Action" tab for payload details -3. Use time-travel debugging to reproduce issues -4. Monitor RouteState for navigation-related bugs -5. Export/Import state for sharing bug reports - -## Common Issues and Solutions - -1. **Redux DevTools Not Showing** - - Ensure the Chrome extension is installed - - Verify UseReduxDevTools() is called in Program.cs - - Check browser console for JavaScript errors - -2. **Actions Not Appearing** - - Verify TimeWarpJavaScriptInterop and ReduxDevTools components are added to App.razor - - Verify inheritance from TimeWarpStateComponent - - Check action handler registration - -3. **State Not Updating** - - Ensure proper action dispatch - - Verify handler implementation - - Check for exceptions in browser console - -## Next Steps - -- Explore advanced Redux DevTools features -- Implement complex state management patterns -- Add custom middleware for logging -- Integrate with existing debugging workflows - -This implementation demonstrates how Redux DevTools enhances the development experience with TimeWarp.State by providing powerful debugging and state inspection capabilities. +--- +uid: TimeWarp.State:01-ReduxDevTools.md +title: Adding Redux DevTools to TimeWarp.State +renderMode: WebAssembly +description: Learn how to integrate Redux DevTools with TimeWarp.State for enhanced debugging +--- + +# Adding Redux DevTools to TimeWarp.State + +> [!TIP] +> View the complete reference implementation for this tutorial: +> - [Sample01Wasm Project](./Sample01Wasm/) +> - [Program.cs with Redux Configuration](./Sample01Wasm/Program.cs) +> - [App.razor with Redux Components](./Sample01Wasm/App.razor) + +This tutorial demonstrates how to add Redux DevTools support to your TimeWarp.State Blazor WebAssembly application. Redux DevTools provides powerful debugging capabilities, allowing you to monitor state changes, inspect actions, and understand your application's behavior. + +## Prerequisites + +- Completed [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler-Wasm.md) +- Understanding of basic TimeWarp.State concepts (State, Actions, and Handlers) +- [Redux DevTools Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd) installed in Chrome + +## Enable Redux DevTools + +1. Add the TimeWarp.State.Plus package: +```bash +dotnet add package TimeWarp.State.Plus --prerelease +``` + +2. Update GlobalUsings.cs to include necessary namespaces: +```csharp +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using Sample01Wasm; +global using System.Reflection; +global using TimeWarp.Features.Routing; +global using TimeWarp.State; +``` + +3. Update Program.cs to enable Redux DevTools: +```csharp +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddTimeWarpState +( + options => + { + options.UseReduxDevTools(); + } +); + +await builder.Build().RunAsync(); +``` + +4. Add Redux DevTools components to App.razor: +```razor + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
+ + + +``` + +## Using Redux DevTools + +1. Run the application: +```bash +dotnet run +``` + +2. Open Chrome DevTools (F12) and navigate to the Redux tab. + +3. Interact with the Counter page and observe in Redux DevTools: + +![Redux DevTools Interface](../../Documentation/Images/ReduxDevTools.png) + +As shown above, Redux DevTools provides a comprehensive view of: +- Actions being dispatched (left panel) +- Current state tree (right panel) +- Action payloads and timestamps +- State changes over time + +The interface also shows the RouteState being tracked: + +![Route State in Redux DevTools](../../Documentation/Images/ReduxRouteState.png) + +This view demonstrates how TimeWarp.State automatically maintains route information in the state tree, making it easy to debug navigation-related issues. + +### Key Features in Redux DevTools + +1. **Action List**: View a chronological list of dispatched actions +2. **State Tree**: Inspect the current state structure +3. **Action Details**: See the payload and effects of each action +4. **Time Travel**: Jump to any previous state +5. **Route State**: Monitor navigation changes through RouteState + +### Debugging Tips + +1. Use the "State" tab to inspect current values +2. Check "Action" tab for payload details +3. Use time-travel debugging to reproduce issues +4. Monitor RouteState for navigation-related bugs +5. Export/Import state for sharing bug reports + +## Common Issues and Solutions + +1. **Redux DevTools Not Showing** + - Ensure the Chrome extension is installed + - Verify UseReduxDevTools() is called in Program.cs + - Check browser console for JavaScript errors + +2. **Actions Not Appearing** + - Verify TimeWarpJavaScriptInterop and ReduxDevTools components are added to App.razor + - Verify inheritance from TimeWarpStateComponent + - Check action handler registration + +3. **State Not Updating** + - Ensure proper action dispatch + - Verify handler implementation + - Check for exceptions in browser console + +## Next Steps + +- Explore advanced Redux DevTools features +- Implement complex state management patterns +- Add custom middleware for logging +- Integrate with existing debugging workflows + +This implementation demonstrates how Redux DevTools enhances the development experience with TimeWarp.State by providing powerful debugging and state inspection capabilities. diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.IncrementCount.cs b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.IncrementCount.cs index aedcb3d05..e8a1dd9c3 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.IncrementCount.cs +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.IncrementCount.cs @@ -1,30 +1,30 @@ -namespace Sample01Wasm.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} +namespace Sample01Wasm.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.cs b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.cs index 92a61a148..a18e4d311 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.cs +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Features/Counter/CounterState.cs @@ -1,11 +1,11 @@ -namespace Sample01Wasm.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - - public override void Initialize() - { - Count = 3; - } -} +namespace Sample01Wasm.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + + public override void Initialize() + { + Count = 3; + } +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/GlobalUsings.cs b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/GlobalUsings.cs index 10da66904..f1d7bc665 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/GlobalUsings.cs +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/GlobalUsings.cs @@ -1,8 +1,8 @@ -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using TimeWarp.State; -global using System.Reflection; -global using TimeWarp.Features.Routing; -global using Sample01Wasm; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using TimeWarp.State; +global using System.Reflection; +global using TimeWarp.Features.Routing; +global using Sample01Wasm; diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/MainLayout.razor.css b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/MainLayout.razor.css index baef3ee5f..ecf25e5b2 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/MainLayout.razor.css +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/MainLayout.razor.css @@ -1,77 +1,77 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/NavMenu.razor.css b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/NavMenu.razor.css index 07d4c0f8c..881d128a5 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/NavMenu.razor.css +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Layout/NavMenu.razor.css @@ -1,83 +1,83 @@ -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } - - .nav-scrollable { - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Program.cs b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Program.cs index 81af66ade..761308f22 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Program.cs +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Program.cs @@ -1,21 +1,21 @@ -namespace Sample01Wasm; - -public class Program -{ - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - builder.RootComponents.Add("head::after"); - - builder.Services.AddTimeWarpState - ( - options => - { - options.UseReduxDevTools(); // Enable Redux DevTools - } - ); - - await builder.Build().RunAsync(); - } -} +namespace Sample01Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddTimeWarpState + ( + options => + { + options.UseReduxDevTools(); // Enable Redux DevTools + } + ); + + await builder.Build().RunAsync(); + } +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Properties/launchSettings.json b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Properties/launchSettings.json index 66d58bc95..30316759c 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Properties/launchSettings.json +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Properties/launchSettings.json @@ -1,41 +1,41 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:62708", - "sslPort": 44300 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5264", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7186;http://localhost:5264", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:62708", + "sslPort": 44300 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5264", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7186;http://localhost:5264", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Sample01Wasm.csproj b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Sample01Wasm.csproj index 4b18e5b6d..2f381b281 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Sample01Wasm.csproj +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/Sample01Wasm.csproj @@ -1,16 +1,16 @@ - - - - net8.0 - enable - enable - - - - - - - - - - + + + + net8.0 + enable + enable + + + + + + + + + + diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/css/app.css b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/css/app.css index 0a4519e08..54a8aa38c 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/css/app.css +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/css/app.css @@ -1,103 +1,103 @@ -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -h1:focus { - outline: none; -} - -a, .btn-link { - color: #0071c1; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid red; -} - -.validation-message { - color: red; -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } - -.loading-progress { - position: relative; - display: block; - width: 8rem; - height: 8rem; - margin: 20vh auto 1rem auto; -} - - .loading-progress circle { - fill: none; - stroke: #e0e0e0; - stroke-width: 0.6rem; - transform-origin: 50% 50%; - transform: rotate(-90deg); - } - - .loading-progress circle:last-child { - stroke: #1b6ec2; - stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; - transition: stroke-dasharray 0.05s ease-in-out; - } - -.loading-progress-text { - position: absolute; - text-align: center; - font-weight: bold; - inset: calc(20vh + 3.25rem) 0 auto 0.2rem; -} - - .loading-progress-text:after { - content: var(--blazor-load-percentage-text, "Loading"); - } - -code { - color: #c02d76; -} +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/index.html b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/index.html index 461fc2fae..90cd3ebb4 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/index.html +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/index.html @@ -1,32 +1,32 @@ - - - - - - - Sample01Wasm - - - - - - - - -
- - - - -
-
- -
- An unhandled error has occurred. - Reload - 🗙 -
- - - - + + + + + + + Sample01Wasm + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + diff --git a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/sample-data/weather.json b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/sample-data/weather.json index f0648e7bf..b7459733f 100644 --- a/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/sample-data/weather.json +++ b/Samples/01-ReduxDevTools/Wasm/Sample01Wasm/wwwroot/sample-data/weather.json @@ -1,27 +1,27 @@ -[ - { - "date": "2022-01-06", - "temperatureC": 1, - "summary": "Freezing" - }, - { - "date": "2022-01-07", - "temperatureC": 14, - "summary": "Bracing" - }, - { - "date": "2022-01-08", - "temperatureC": -13, - "summary": "Freezing" - }, - { - "date": "2022-01-09", - "temperatureC": -16, - "summary": "Balmy" - }, - { - "date": "2022-01-10", - "temperatureC": -2, - "summary": "Chilly" - } -] +[ + { + "date": "2022-01-06", + "temperatureC": 1, + "summary": "Freezing" + }, + { + "date": "2022-01-07", + "temperatureC": 14, + "summary": "Bracing" + }, + { + "date": "2022-01-08", + "temperatureC": -13, + "summary": "Freezing" + }, + { + "date": "2022-01-09", + "temperatureC": -16, + "summary": "Balmy" + }, + { + "date": "2022-01-10", + "temperatureC": -2, + "summary": "Chilly" + } +] diff --git a/Samples/02-ActionTracking/Wasm/README.md b/Samples/02-ActionTracking/Wasm/README.md index aa4eaf086..b4f1321bb 100644 --- a/Samples/02-ActionTracking/Wasm/README.md +++ b/Samples/02-ActionTracking/Wasm/README.md @@ -1,331 +1,331 @@ -uid: TimeWarp.State:02-ActionTracking.md -title: TimeWarp.State Action Tracking Tutorial -description: Learn how to implement Action Tracking in TimeWarp.State applications ---- - -# TimeWarp.State Action Tracking Tutorial - -> [!TIP] -> View the complete reference implementation for this tutorial: -> - [Sample02Wasm Project](./Sample02Wasm/) -> - [Demo State and Actions](./Sample02Wasm/Features/Demo/) -> - [Demo Page Component](./Sample02Wasm/Pages/Demo.razor) -> - [Program.cs with Action Tracking Configuration](./Sample02Wasm/Program.cs) - -## What is Action Tracking? - -Action Tracking is a powerful feature in TimeWarp.State.Plus that allows you to monitor and manage long-running actions in your application. It provides: - -- Real-time visibility into active actions -- Ability to track multiple concurrent actions -- Automatic cleanup when actions complete -- Error handling for failed actions - -This is particularly useful for: -- Loading states and progress indicators -- Managing concurrent operations -- Monitoring background tasks -- Error handling and recovery - -## Demo Video - -Check out this quick demonstration of the Action Tracking feature: -[Action Tracking Demo](https://yoclip.app/share/ejqq4l6k52eca8gth9xnm251?pw=uju1sp3lzuszbfmuffe0c9zk) - -## Prerequisites - -- Completed [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler-Wasm.md) -- Understanding of basic TimeWarp.State concepts (State, Actions, and Handlers) - -## Implementation Steps - -### 1. Complete Sample00 Tutorial - -First, complete the [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler-Wasm.md), but use `Sample02Wasm` as the project name: - -```bash -dotnet new blazorwasm -n Sample02Wasm --use-program-main -``` - -Follow all steps in the Sample00 tutorial until you have a working counter application. This will be our starting point for adding Action Tracking. - -### 2. Add TimeWarp.State.Plus Package - -Add the TimeWarp.State.Plus NuGet package to your project: - -```bash -dotnet add package TimeWarp.State.Plus --prerelease -``` - -### 3. Configure Services - -Update your Program.cs to register both your application assembly and the TimeWarp.State.Plus assembly, and configure the ActiveActionBehavior: - -```csharp -namespace Sample02Wasm; - -public class Program -{ - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - builder.RootComponents.Add("head::after"); - - builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); - - builder.Services.AddTimeWarpState - ( - options => - { - options.Assemblies = new[] - { - typeof(Program).Assembly, - typeof(TimeWarp.State.Plus.AssemblyMarker).Assembly - }; - } - ); - - // Register the ActiveActionBehavior for action tracking - builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(ActiveActionBehavior<,>)); - - await builder.Build().RunAsync(); - } -} -``` - -### 4. Create Demo State and Actions - -Create a new file `Features/Demo/DemoState.cs`: - -```csharp -namespace Sample02Wasm.Features.Demo; - -internal sealed partial class DemoState : State -{ - public override void Initialize() { } -} -``` - -Create `Features/Demo/DemoState.TwoSecondAction.cs`: - -```csharp -namespace Sample02Wasm.Features.Demo; - -partial class DemoState -{ - public static class TwoSecondActionSet - { - [TrackAction] - public sealed class Action : IAction { } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - public override async Task Handle - ( - Action action, - CancellationToken cancellationToken - ) - { - // Simulate a 2-second action - await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken); - } - } - } -} -``` - -Create `Features/Demo/DemoState.FiveSecondAction.cs`: - -```csharp -namespace Sample02Wasm.Features.Demo; - -partial class DemoState -{ - public static class FiveSecondActionSet - { - [TrackAction] - public sealed class Action : IAction { } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - public override async Task Handle - ( - Action action, - CancellationToken cancellationToken - ) - { - // Simulate a 5-second action - await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); - } - } - } -} -``` - -### 5. Create Demo Page - -Create `Pages/Demo.razor`: - -```razor -@page "/demo" -@using Sample02Wasm.Features.Demo -@using TimeWarp.Features.ActionTracking -@inherits TimeWarpStateComponent - -Action Tracking Demo - -

Action Tracking Demo

- -
-

Action Status

-

Any Active Actions: @ActionTrackingState.IsActive

-

Two Second Action Running: @IsTwoSecondActionRunning

-

Five Second Action Running: @IsFiveSecondActionRunning

-
- -
- - -
- -
-

Active Actions

- @if (ActionTrackingState.IsActive) - { - foreach (var action in ActionTrackingState.ActiveActions) - { -
- Running: @(action.GetType().FullName.Split("+")[1].Replace("ActionSet.Action", "").Replace("ActionSet", "")) -
- } - } - else - { -

No active actions

- } -
- -@code { - DemoState DemoState => GetState(); - ActionTrackingState ActionTrackingState => GetState(); - - bool IsTwoSecondActionRunning => ActionTrackingState.IsAnyActive - ( - [typeof(DemoState.TwoSecondActionSet.Action)] - ); - - bool IsFiveSecondActionRunning => ActionTrackingState.IsAnyActive - ( - [typeof(DemoState.FiveSecondActionSet.Action)] - ); - - private async Task StartTwoSecondAction() => - await DemoState.TwoSecond(); - - private async Task StartFiveSecondAction() => - await DemoState.FiveSecond(); -} -``` - -### 6. Update Navigation - -Update the navigation menu in `Shared/NavMenu.razor` to include the Demo page: - -```razor - -``` - -## Best Practices - -1. **Action Granularity** - - Track significant operations that affect UI state - - Avoid tracking very short-lived actions - - Consider grouping related actions - -2. **Error Handling** - - The tracking behavior automatically handles exceptions - - Actions are removed from tracking even if they fail - - Implement proper error handling in your action handlers - -3. **Performance Considerations** - - Action tracking has minimal overhead - - The tracking state is efficiently updated - - Use specific action type checks when possible - -## Troubleshooting - -### Common Issues - -1. **Actions Not Being Tracked** - - Verify the `[TrackAction]` attribute is applied - - Ensure TimeWarp.State.Plus assembly is registered in Program.cs - - Check if the action inherits from IAction - - Verify ActiveActionBehavior is registered as a pipeline behavior - -2. **Actions Stuck in Tracking** - - Ensure proper cancellation token handling - - Verify the action handler completes properly - - Check for unhandled exceptions - -3. **Multiple Instances of Same Action** - - This is expected behavior if the same action is dispatched multiple times - - Implement logic to prevent duplicate actions if needed - -## Advanced Usage - -### Track Multiple Action Types - -You can track multiple types of actions: - -```razor -@code { - bool IsAnyActionRunning => ActionTrackingState.IsAnyActive - ( - [ - typeof(DemoState.TwoSecondActionSet.Action), - typeof(DemoState.FiveSecondActionSet.Action) - ] - ); -} -``` - -### Custom Action Tracking UI - -Create reusable components for action tracking: - -```razor -@inherits TimeWarpStateComponent - -
- @if (ActionTrackingState.IsActive) - { - foreach (var action in ActionTrackingState.ActiveActions) - { -
- @GetActionDisplayName(action) -
-
- } - } -
- -@code { - private string GetActionDisplayName(IAction action) => - action.GetType().Name.Replace("Action", ""); -} -``` - -This tutorial demonstrates how to add Action Tracking to an existing TimeWarp.State application. The example shows how to track and monitor actions of varying durations, providing real-time feedback to users about the application's state. +uid: TimeWarp.State:02-ActionTracking.md +title: TimeWarp.State Action Tracking Tutorial +description: Learn how to implement Action Tracking in TimeWarp.State applications +--- + +# TimeWarp.State Action Tracking Tutorial + +> [!TIP] +> View the complete reference implementation for this tutorial: +> - [Sample02Wasm Project](./Sample02Wasm/) +> - [Demo State and Actions](./Sample02Wasm/Features/Demo/) +> - [Demo Page Component](./Sample02Wasm/Pages/Demo.razor) +> - [Program.cs with Action Tracking Configuration](./Sample02Wasm/Program.cs) + +## What is Action Tracking? + +Action Tracking is a powerful feature in TimeWarp.State.Plus that allows you to monitor and manage long-running actions in your application. It provides: + +- Real-time visibility into active actions +- Ability to track multiple concurrent actions +- Automatic cleanup when actions complete +- Error handling for failed actions + +This is particularly useful for: +- Loading states and progress indicators +- Managing concurrent operations +- Monitoring background tasks +- Error handling and recovery + +## Demo Video + +Check out this quick demonstration of the Action Tracking feature: +[Action Tracking Demo](https://yoclip.app/share/ejqq4l6k52eca8gth9xnm251?pw=uju1sp3lzuszbfmuffe0c9zk) + +## Prerequisites + +- Completed [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler-Wasm.md) +- Understanding of basic TimeWarp.State concepts (State, Actions, and Handlers) + +## Implementation Steps + +### 1. Complete Sample00 Tutorial + +First, complete the [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler-Wasm.md), but use `Sample02Wasm` as the project name: + +```bash +dotnet new blazorwasm -n Sample02Wasm --use-program-main +``` + +Follow all steps in the Sample00 tutorial until you have a working counter application. This will be our starting point for adding Action Tracking. + +### 2. Add TimeWarp.State.Plus Package + +Add the TimeWarp.State.Plus NuGet package to your project: + +```bash +dotnet add package TimeWarp.State.Plus --prerelease +``` + +### 3. Configure Services + +Update your Program.cs to register both your application assembly and the TimeWarp.State.Plus assembly, and configure the ActiveActionBehavior: + +```csharp +namespace Sample02Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); + + builder.Services.AddTimeWarpState + ( + options => + { + options.Assemblies = new[] + { + typeof(Program).Assembly, + typeof(TimeWarp.State.Plus.AssemblyMarker).Assembly + }; + } + ); + + // Register the ActiveActionBehavior for action tracking + builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(ActiveActionBehavior<,>)); + + await builder.Build().RunAsync(); + } +} +``` + +### 4. Create Demo State and Actions + +Create a new file `Features/Demo/DemoState.cs`: + +```csharp +namespace Sample02Wasm.Features.Demo; + +internal sealed partial class DemoState : State +{ + public override void Initialize() { } +} +``` + +Create `Features/Demo/DemoState.TwoSecondAction.cs`: + +```csharp +namespace Sample02Wasm.Features.Demo; + +partial class DemoState +{ + public static class TwoSecondActionSet + { + [TrackAction] + public sealed class Action : IAction { } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + public override async Task Handle + ( + Action action, + CancellationToken cancellationToken + ) + { + // Simulate a 2-second action + await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken); + } + } + } +} +``` + +Create `Features/Demo/DemoState.FiveSecondAction.cs`: + +```csharp +namespace Sample02Wasm.Features.Demo; + +partial class DemoState +{ + public static class FiveSecondActionSet + { + [TrackAction] + public sealed class Action : IAction { } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + public override async Task Handle + ( + Action action, + CancellationToken cancellationToken + ) + { + // Simulate a 5-second action + await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); + } + } + } +} +``` + +### 5. Create Demo Page + +Create `Pages/Demo.razor`: + +```razor +@page "/demo" +@using Sample02Wasm.Features.Demo +@using TimeWarp.Features.ActionTracking +@inherits TimeWarpStateComponent + +Action Tracking Demo + +

Action Tracking Demo

+ +
+

Action Status

+

Any Active Actions: @ActionTrackingState.IsActive

+

Two Second Action Running: @IsTwoSecondActionRunning

+

Five Second Action Running: @IsFiveSecondActionRunning

+
+ +
+ + +
+ +
+

Active Actions

+ @if (ActionTrackingState.IsActive) + { + foreach (var action in ActionTrackingState.ActiveActions) + { +
+ Running: @(action.GetType().FullName.Split("+")[1].Replace("ActionSet.Action", "").Replace("ActionSet", "")) +
+ } + } + else + { +

No active actions

+ } +
+ +@code { + DemoState DemoState => GetState(); + ActionTrackingState ActionTrackingState => GetState(); + + bool IsTwoSecondActionRunning => ActionTrackingState.IsAnyActive + ( + [typeof(DemoState.TwoSecondActionSet.Action)] + ); + + bool IsFiveSecondActionRunning => ActionTrackingState.IsAnyActive + ( + [typeof(DemoState.FiveSecondActionSet.Action)] + ); + + private async Task StartTwoSecondAction() => + await DemoState.TwoSecond(); + + private async Task StartFiveSecondAction() => + await DemoState.FiveSecond(); +} +``` + +### 6. Update Navigation + +Update the navigation menu in `Shared/NavMenu.razor` to include the Demo page: + +```razor + +``` + +## Best Practices + +1. **Action Granularity** + - Track significant operations that affect UI state + - Avoid tracking very short-lived actions + - Consider grouping related actions + +2. **Error Handling** + - The tracking behavior automatically handles exceptions + - Actions are removed from tracking even if they fail + - Implement proper error handling in your action handlers + +3. **Performance Considerations** + - Action tracking has minimal overhead + - The tracking state is efficiently updated + - Use specific action type checks when possible + +## Troubleshooting + +### Common Issues + +1. **Actions Not Being Tracked** + - Verify the `[TrackAction]` attribute is applied + - Ensure TimeWarp.State.Plus assembly is registered in Program.cs + - Check if the action inherits from IAction + - Verify ActiveActionBehavior is registered as a pipeline behavior + +2. **Actions Stuck in Tracking** + - Ensure proper cancellation token handling + - Verify the action handler completes properly + - Check for unhandled exceptions + +3. **Multiple Instances of Same Action** + - This is expected behavior if the same action is dispatched multiple times + - Implement logic to prevent duplicate actions if needed + +## Advanced Usage + +### Track Multiple Action Types + +You can track multiple types of actions: + +```razor +@code { + bool IsAnyActionRunning => ActionTrackingState.IsAnyActive + ( + [ + typeof(DemoState.TwoSecondActionSet.Action), + typeof(DemoState.FiveSecondActionSet.Action) + ] + ); +} +``` + +### Custom Action Tracking UI + +Create reusable components for action tracking: + +```razor +@inherits TimeWarpStateComponent + +
+ @if (ActionTrackingState.IsActive) + { + foreach (var action in ActionTrackingState.ActiveActions) + { +
+ @GetActionDisplayName(action) +
+
+ } + } +
+ +@code { + private string GetActionDisplayName(IAction action) => + action.GetType().Name.Replace("Action", ""); +} +``` + +This tutorial demonstrates how to add Action Tracking to an existing TimeWarp.State application. The example shows how to track and monitor actions of varying durations, providing real-time feedback to users about the application's state. diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.FiveSecondAction.cs b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.FiveSecondAction.cs index c5c0d27a1..bedd88061 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.FiveSecondAction.cs +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.FiveSecondAction.cs @@ -1,25 +1,25 @@ -namespace Sample02Wasm.Features.Demo; - -partial class DemoState -{ - public static class FiveSecondActionSet - { - [TrackAction] - public sealed class Action : IAction { } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - public override async Task Handle - ( - Action action, - CancellationToken cancellationToken - ) - { - // Simulate a 5-second action - await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); - } - } - } -} +namespace Sample02Wasm.Features.Demo; + +partial class DemoState +{ + public static class FiveSecondActionSet + { + [TrackAction] + public sealed class Action : IAction { } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + public override async Task Handle + ( + Action action, + CancellationToken cancellationToken + ) + { + // Simulate a 5-second action + await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); + } + } + } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.TwoSecondAction.cs b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.TwoSecondAction.cs index e87fe047c..11d742dab 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.TwoSecondAction.cs +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.TwoSecondAction.cs @@ -1,25 +1,25 @@ -namespace Sample02Wasm.Features.Demo; - -partial class DemoState -{ - public static class TwoSecondActionSet - { - [TrackAction] - public sealed class Action : IAction { } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - public override async Task Handle - ( - Action action, - CancellationToken cancellationToken - ) - { - // Simulate a 2-second action - await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken); - } - } - } -} +namespace Sample02Wasm.Features.Demo; + +partial class DemoState +{ + public static class TwoSecondActionSet + { + [TrackAction] + public sealed class Action : IAction { } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + public override async Task Handle + ( + Action action, + CancellationToken cancellationToken + ) + { + // Simulate a 2-second action + await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken); + } + } + } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.cs b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.cs index 63c6a1b90..0c2abfa9b 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.cs +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Features/Demo/DemoState.cs @@ -1,6 +1,6 @@ -namespace Sample02Wasm.Features.Demo; - -internal sealed partial class DemoState : State -{ - public override void Initialize() { } -} +namespace Sample02Wasm.Features.Demo; + +internal sealed partial class DemoState : State +{ + public override void Initialize() { } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/GlobalUsings.cs b/Samples/02-ActionTracking/Wasm/Sample02Wasm/GlobalUsings.cs index 107de2a69..9b1199aad 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/GlobalUsings.cs +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/GlobalUsings.cs @@ -1,8 +1,8 @@ -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using TimeWarp.State; -global using TimeWarp.Features.ActionTracking; -global using Sample02Wasm; -global using MediatR; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using TimeWarp.State; +global using TimeWarp.Features.ActionTracking; +global using Sample02Wasm; +global using MediatR; diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/MainLayout.razor.css b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/MainLayout.razor.css index baef3ee5f..ecf25e5b2 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/MainLayout.razor.css +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/MainLayout.razor.css @@ -1,77 +1,77 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/NavMenu.razor.css b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/NavMenu.razor.css index 07d4c0f8c..881d128a5 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/NavMenu.razor.css +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Layout/NavMenu.razor.css @@ -1,83 +1,83 @@ -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } - - .nav-scrollable { - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Program.cs b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Program.cs index 1151bef19..1a9840a34 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Program.cs +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Program.cs @@ -1,36 +1,36 @@ -namespace Sample02Wasm; - -public class Program -{ - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - builder.RootComponents.Add("head::after"); - - builder.Services.AddScoped - ( - sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) } - ); - - builder.Services.AddTimeWarpState - ( - options => - { - options.Assemblies = new[] - { - typeof(Program).Assembly, - typeof(TimeWarp.State.Plus.AssemblyMarker).Assembly - }; - } - ); - - builder.Services.AddScoped - ( - typeof(IPipelineBehavior<,>), - typeof(ActiveActionBehavior<,>) - ); - - await builder.Build().RunAsync(); - } -} +namespace Sample02Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddScoped + ( + sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) } + ); + + builder.Services.AddTimeWarpState + ( + options => + { + options.Assemblies = new[] + { + typeof(Program).Assembly, + typeof(TimeWarp.State.Plus.AssemblyMarker).Assembly + }; + } + ); + + builder.Services.AddScoped + ( + typeof(IPipelineBehavior<,>), + typeof(ActiveActionBehavior<,>) + ); + + await builder.Build().RunAsync(); + } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Properties/launchSettings.json b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Properties/launchSettings.json index 61d940580..91dfe54a3 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Properties/launchSettings.json +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Properties/launchSettings.json @@ -1,41 +1,41 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:10448", - "sslPort": 44391 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5165", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7243;http://localhost:5165", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:10448", + "sslPort": 44391 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5165", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7243;http://localhost:5165", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Sample02Wasm.csproj b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Sample02Wasm.csproj index 4b18e5b6d..2f381b281 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/Sample02Wasm.csproj +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/Sample02Wasm.csproj @@ -1,16 +1,16 @@ - - - - net8.0 - enable - enable - - - - - - - - - - + + + + net8.0 + enable + enable + + + + + + + + + + diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/css/app.css b/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/css/app.css index 0a4519e08..54a8aa38c 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/css/app.css +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/css/app.css @@ -1,103 +1,103 @@ -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -h1:focus { - outline: none; -} - -a, .btn-link { - color: #0071c1; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid red; -} - -.validation-message { - color: red; -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } - -.loading-progress { - position: relative; - display: block; - width: 8rem; - height: 8rem; - margin: 20vh auto 1rem auto; -} - - .loading-progress circle { - fill: none; - stroke: #e0e0e0; - stroke-width: 0.6rem; - transform-origin: 50% 50%; - transform: rotate(-90deg); - } - - .loading-progress circle:last-child { - stroke: #1b6ec2; - stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; - transition: stroke-dasharray 0.05s ease-in-out; - } - -.loading-progress-text { - position: absolute; - text-align: center; - font-weight: bold; - inset: calc(20vh + 3.25rem) 0 auto 0.2rem; -} - - .loading-progress-text:after { - content: var(--blazor-load-percentage-text, "Loading"); - } - -code { - color: #c02d76; -} +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/index.html b/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/index.html index a580095fe..cb3e1bcda 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/index.html +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/index.html @@ -1,32 +1,32 @@ - - - - - - - Sample02Wasm - - - - - - - - -
- - - - -
-
- -
- An unhandled error has occurred. - Reload - 🗙 -
- - - - + + + + + + + Sample02Wasm + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + diff --git a/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/sample-data/weather.json b/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/sample-data/weather.json index f0648e7bf..b7459733f 100644 --- a/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/sample-data/weather.json +++ b/Samples/02-ActionTracking/Wasm/Sample02Wasm/wwwroot/sample-data/weather.json @@ -1,27 +1,27 @@ -[ - { - "date": "2022-01-06", - "temperatureC": 1, - "summary": "Freezing" - }, - { - "date": "2022-01-07", - "temperatureC": 14, - "summary": "Bracing" - }, - { - "date": "2022-01-08", - "temperatureC": -13, - "summary": "Freezing" - }, - { - "date": "2022-01-09", - "temperatureC": -16, - "summary": "Balmy" - }, - { - "date": "2022-01-10", - "temperatureC": -2, - "summary": "Chilly" - } -] +[ + { + "date": "2022-01-06", + "temperatureC": 1, + "summary": "Freezing" + }, + { + "date": "2022-01-07", + "temperatureC": 14, + "summary": "Bracing" + }, + { + "date": "2022-01-08", + "temperatureC": -13, + "summary": "Freezing" + }, + { + "date": "2022-01-09", + "temperatureC": -16, + "summary": "Balmy" + }, + { + "date": "2022-01-10", + "temperatureC": -2, + "summary": "Chilly" + } +] diff --git a/Samples/03-Routing/README.md b/Samples/03-Routing/README.md index 9be268759..cce3c5fc8 100644 --- a/Samples/03-Routing/README.md +++ b/Samples/03-Routing/README.md @@ -1,46 +1,46 @@ -# Routing in TimeWarp.State - -This sample demonstrates TimeWarp.State.Plus's comprehensive routing feature that provides stack-based navigation management. The routing system enables breadcrumb navigation, direct route changes, and back navigation capabilities through state management. - -## Key Features - -1. **Stack-Based Navigation** - - Maintains a history of visited routes - - Enables breadcrumb-style navigation - - Supports multi-step back navigation - -2. **Core Actions** - - `ChangeRoute`: Direct navigation with absolute URI handling - - `GoBack`: Stack-based back navigation with configurable steps - - `PushRouteInfo`: Route stack management with title synchronization - -3. **Thread Safety** - - Semaphore-based synchronization for route updates - - Safe concurrent navigation handling - -4. **Integration** - - Works seamlessly with Blazor's NavigationManager - - Automatic page title synchronization - - Built-in logging support - -## Examples - -This directory contains examples of the routing feature implemented in different Blazor render modes: - -- [Wasm](Wasm/): Implementation using Blazor's Interactive WebAssembly render mode - -## Key Benefits - -1. **Breadcrumb Navigation**: Built-in support for implementing breadcrumb trails -2. **History Management**: Stack-based route history for complex navigation flows -3. **Thread Safety**: Protected route updates in concurrent scenarios -4. **Title Synchronization**: Automatic page title management -5. **Logging Integration**: Built-in route change logging - -## Best Practices - -1. Use `PushRouteInfo` to maintain accurate navigation history -2. Implement breadcrumbs using `RouteState.Routes` -3. Handle navigation events through state actions -4. Consider thread safety in concurrent scenarios -5. Utilize logging for debugging navigation flows +# Routing in TimeWarp.State + +This sample demonstrates TimeWarp.State.Plus's comprehensive routing feature that provides stack-based navigation management. The routing system enables breadcrumb navigation, direct route changes, and back navigation capabilities through state management. + +## Key Features + +1. **Stack-Based Navigation** + - Maintains a history of visited routes + - Enables breadcrumb-style navigation + - Supports multi-step back navigation + +2. **Core Actions** + - `ChangeRoute`: Direct navigation with absolute URI handling + - `GoBack`: Stack-based back navigation with configurable steps + - `PushRouteInfo`: Route stack management with title synchronization + +3. **Thread Safety** + - Semaphore-based synchronization for route updates + - Safe concurrent navigation handling + +4. **Integration** + - Works seamlessly with Blazor's NavigationManager + - Automatic page title synchronization + - Built-in logging support + +## Examples + +This directory contains examples of the routing feature implemented in different Blazor render modes: + +- [Wasm](Wasm/): Implementation using Blazor's Interactive WebAssembly render mode + +## Key Benefits + +1. **Breadcrumb Navigation**: Built-in support for implementing breadcrumb trails +2. **History Management**: Stack-based route history for complex navigation flows +3. **Thread Safety**: Protected route updates in concurrent scenarios +4. **Title Synchronization**: Automatic page title management +5. **Logging Integration**: Built-in route change logging + +## Best Practices + +1. Use `PushRouteInfo` to maintain accurate navigation history +2. Implement breadcrumbs using `RouteState.Routes` +3. Handle navigation events through state actions +4. Consider thread safety in concurrent scenarios +5. Utilize logging for debugging navigation flows diff --git a/Samples/03-Routing/Wasm/AI.prompt.md b/Samples/03-Routing/Wasm/AI.prompt.md index 33df9e36b..1cfae0821 100644 --- a/Samples/03-Routing/Wasm/AI.prompt.md +++ b/Samples/03-Routing/Wasm/AI.prompt.md @@ -1,49 +1,49 @@ -# STOP! READ THIS FIRST! - -## HEY AI (FUTURE SELF) - DO NOT SKIP AHEAD! - -YOU MUST COMPLETE THESE IN ORDER: - -1. FIRST: Create project named "Sample03Wasm": - ```pwsh - dotnet new blazorwasm -n Sample03Wasm --use-program-main - ``` - -2. NOW STOP! Go to ../00-StateActionHandler/README.md - - Implement EVERYTHING from Sample00 - - IN THE Sample03Wasm project - - TEST IT WORKS - - Reference implementation: Samples\00-StateActionHandler\Wasm\Sample00Wasm - - DO NOT CONTINUE UNTIL THIS WORKS - -3. ONLY AFTER Sample00 works: - - Go to ../01-ReduxDevTools/README.md - - Add EVERYTHING from Sample01 - - IN THE SAME Sample03Wasm project - - TEST IT WORKS - - Reference implementation: Samples\01-ReduxDevTools\Wasm\Sample01Wasm - - DO NOT CONTINUE UNTIL THIS WORKS - -4. ONLY AFTER Sample01 works: - - NOW you can look at ./README.md - - Add the routing features - - Reference implementation: Samples\03-Routing\Wasm\Sample03Wasm - -## NO SERIOUSLY, DO NOT SKIP STEPS - -If you try to implement everything at once: -- IT WILL FAIL -- YOU WILL WASTE TIME -- THE HUMAN WILL GET ANGRY - -## REFERENCE IMPLEMENTATIONS -1. Sample00: Samples\00-StateActionHandler\Wasm\Sample00Wasm -2. Sample01: Samples\01-ReduxDevTools\Wasm\Sample01Wasm -3. Sample03: Samples\03-Routing\Wasm\Sample03Wasm - -## TUTORIAL PATHS (BUT DO THEM IN ORDER!) -1. FIRST: ../00-StateActionHandler/README.md -2. SECOND: ../01-ReduxDevTools/README.md -3. LAST: ./README.md - +# STOP! READ THIS FIRST! + +## HEY AI (FUTURE SELF) - DO NOT SKIP AHEAD! + +YOU MUST COMPLETE THESE IN ORDER: + +1. FIRST: Create project named "Sample03Wasm": + ```pwsh + dotnet new blazorwasm -n Sample03Wasm --use-program-main + ``` + +2. NOW STOP! Go to ../00-StateActionHandler/README.md + - Implement EVERYTHING from Sample00 + - IN THE Sample03Wasm project + - TEST IT WORKS + - Reference implementation: Samples\00-StateActionHandler\Wasm\Sample00Wasm + - DO NOT CONTINUE UNTIL THIS WORKS + +3. ONLY AFTER Sample00 works: + - Go to ../01-ReduxDevTools/README.md + - Add EVERYTHING from Sample01 + - IN THE SAME Sample03Wasm project + - TEST IT WORKS + - Reference implementation: Samples\01-ReduxDevTools\Wasm\Sample01Wasm + - DO NOT CONTINUE UNTIL THIS WORKS + +4. ONLY AFTER Sample01 works: + - NOW you can look at ./README.md + - Add the routing features + - Reference implementation: Samples\03-Routing\Wasm\Sample03Wasm + +## NO SERIOUSLY, DO NOT SKIP STEPS + +If you try to implement everything at once: +- IT WILL FAIL +- YOU WILL WASTE TIME +- THE HUMAN WILL GET ANGRY + +## REFERENCE IMPLEMENTATIONS +1. Sample00: Samples\00-StateActionHandler\Wasm\Sample00Wasm +2. Sample01: Samples\01-ReduxDevTools\Wasm\Sample01Wasm +3. Sample03: Samples\03-Routing\Wasm\Sample03Wasm + +## TUTORIAL PATHS (BUT DO THEM IN ORDER!) +1. FIRST: ../00-StateActionHandler/README.md +2. SECOND: ../01-ReduxDevTools/README.md +3. LAST: ./README.md + Remember: Source generators will create the extension methods. DO NOT CREATE THEM MANUALLY. \ No newline at end of file diff --git a/Samples/03-Routing/Wasm/README.md b/Samples/03-Routing/Wasm/README.md index 2119d62d5..177608c51 100644 --- a/Samples/03-Routing/Wasm/README.md +++ b/Samples/03-Routing/Wasm/README.md @@ -1,249 +1,249 @@ ---- -uid: TimeWarp.State:03-Routing.md -title: TimeWarp.State Routing Tutorial -description: Learn how to implement stack-based routing in TimeWarp.State applications ---- - -# TimeWarp.State Routing Tutorial - -> [!TIP] -> View the complete reference implementation for this tutorial: -> - [Sample03Wasm Project](./Sample03Wasm/) -> - [Program.cs with Routing Configuration](./Sample03Wasm/Program.cs) -> - [MainLayout with TwBreadcrumb](./Sample03Wasm/Layout/MainLayout.razor) -> - [Example Pages with TwPageTitle](./Sample03Wasm/Pages/) - -## What is Stack-Based Routing? - -Stack-based routing in TimeWarp.State.Plus is a comprehensive navigation management system that provides: - -- Maintained history of visited routes -- Breadcrumb-style navigation -- Multi-step back navigation -- Thread-safe route updates -- Automatic page title synchronization - -This is particularly useful for: -- Complex navigation flows -- Breadcrumb trail implementation -- History-based navigation -- Concurrent route handling -- Debugging navigation with ReduxDevTools - -## Prerequisites - -> [!IMPORTANT] -> The tutorials in this series must be completed in sequence. Each tutorial builds upon the previous one: -> -> 1. First complete [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler.md) -> - Establishes basic TimeWarp.State concepts -> - Sets up state management foundation -> - Implements action/handler pattern -> -> 2. Then complete [Sample01 ReduxDevTools tutorial](xref:TimeWarp.State:01-ReduxDevTools.md) -> - Adds TimeWarp.State.Plus package -> - Integrates Redux DevTools -> - Sets up required components -> -> 3. Only then proceed with this routing tutorial -> - Builds on the established foundation -> - Uses features from previous tutorials -> -> Attempting to skip tutorials or complete them out of order will result in errors, as each tutorial depends on the setup and concepts from the previous ones. - -Additional requirements: -- Understanding of TimeWarp.State concepts (State, Actions, and Handlers) -- [Redux DevTools Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd) installed in Chrome - -## Implementation Steps - -### 1. Start from ReduxDevTools Sample - -First, complete the [Sample01 ReduxDevTools tutorial](xref:TimeWarp.State:01-ReduxDevTools.md), but use `Sample03Wasm` as the project name: - -```pwsh -dotnet new blazorwasm -n Sample03Wasm --use-program-main -``` - -Follow all steps in the Sample01 tutorial until you have a working application with ReduxDevTools integration. - -### 2. Add Required Dependencies - -The TimeWarp.State.Plus package should already be installed from the ReduxDevTools tutorial. If not: - -```pwsh -dotnet add package TimeWarp.State.Plus --prerelease -``` - -### 3. Configure Route State - -Update your Program.cs to include routing configuration: - -```csharp -namespace Sample03Wasm; - -public class Program -{ - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - builder.RootComponents.Add("head::after"); - - builder.Services.AddScoped - ( - sp => new HttpClient - { - BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) - } - ); - - builder.Services.AddTimeWarpState - ( - options => - { - options.UseReduxDevTools(); - options.Assemblies = new[] - { - typeof(Program).Assembly, - typeof(TimeWarp.State.Plus.AssemblyMarker).Assembly - }; - } - ); - - await builder.Build().RunAsync(); - } -} -``` - -### 4. Add Navigation Components - -Update `Layout/MainLayout.razor` to include the TwBreadcrumb component: - -```razor -@inherits LayoutComponentBase - -
- - -
-
- About -
- -
- -
- -
- @Body -
-
-
-``` - -The `TwBreadcrumb` component from TimeWarp.State.Plus provides: -- Automatic route history tracking -- Configurable number of displayed links through `MaxLinks` parameter -- Built-in back navigation support -- Proper breadcrumb styling - -### 5. Update Page Titles - -In each of your pages (e.g., Home.razor, Counter.razor, Weather.razor), replace the `PageTitle` component with `TwPageTitle`: - -```razor -// Before -Home - -// After -Home -``` - -The `TwPageTitle` component: -- Automatically updates the browser's title -- Integrates with the route state -- Maintains proper titles in the breadcrumb trail -- Synchronizes with navigation history - -## Best Practices - -### 1. Route State Management -- Use `TwPageTitle` consistently across all pages -- Implement `TwBreadcrumb` in your main layout -- Let the routing system handle navigation state -- Avoid manual route manipulation unless necessary - -### 2. Thread Safety -- Route updates are automatically synchronized -- Use the built-in concurrent navigation handling -- Leverage semaphore-based protection for custom navigation logic -- Monitor route stack modifications in development - -### 3. ReduxDevTools Integration -- Monitor route state changes in real-time -- Use time-travel debugging for navigation issues -- Track route stack modifications -- Analyze navigation patterns during development - -## Troubleshooting - -### Common Issues and Solutions - -1. **Routes Not Updating** - - Verify RouteState initialization in Program.cs - - Check NavigationManager service registration - - Ensure proper action dispatch sequence - - Validate route state subscription - -2. **Breadcrumbs Not Showing** - - Confirm TwBreadcrumb placement in MainLayout - - Verify TwPageTitle usage on all pages - - Check route state updates in ReduxDevTools - - Validate MaxLinks parameter value - -3. **Navigation History Issues** - - Ensure consistent TwPageTitle implementation - - Monitor route stack in ReduxDevTools - - Verify concurrent navigation handling - - Check for custom navigation interference - -### Debugging Tips - -1. **Using ReduxDevTools** - ```csharp - // Enable detailed logging in development - builder.Services.AddTimeWarpState - ( - options => - { - options.UseReduxDevTools - ( - config => - { - config.EnableDetailedLogs = true; - config.TraceLimit = 25; - } - ); - } - ); - ``` - -2. **Route State Inspection** - ```csharp - // Inject IState to inspect current route - @inject IState RouteState - - @code - { - protected override void OnInitialized() - { - var currentRoute = RouteState.Value.CurrentRoute; - var routeStack = RouteState.Value.RouteStack; - } - } - ``` - -This tutorial demonstrates how to implement comprehensive routing features in a TimeWarp.State application using the built-in TwPageTitle and TwBreadcrumb components, while maintaining debuggability through ReduxDevTools integration. +--- +uid: TimeWarp.State:03-Routing.md +title: TimeWarp.State Routing Tutorial +description: Learn how to implement stack-based routing in TimeWarp.State applications +--- + +# TimeWarp.State Routing Tutorial + +> [!TIP] +> View the complete reference implementation for this tutorial: +> - [Sample03Wasm Project](./Sample03Wasm/) +> - [Program.cs with Routing Configuration](./Sample03Wasm/Program.cs) +> - [MainLayout with TwBreadcrumb](./Sample03Wasm/Layout/MainLayout.razor) +> - [Example Pages with TwPageTitle](./Sample03Wasm/Pages/) + +## What is Stack-Based Routing? + +Stack-based routing in TimeWarp.State.Plus is a comprehensive navigation management system that provides: + +- Maintained history of visited routes +- Breadcrumb-style navigation +- Multi-step back navigation +- Thread-safe route updates +- Automatic page title synchronization + +This is particularly useful for: +- Complex navigation flows +- Breadcrumb trail implementation +- History-based navigation +- Concurrent route handling +- Debugging navigation with ReduxDevTools + +## Prerequisites + +> [!IMPORTANT] +> The tutorials in this series must be completed in sequence. Each tutorial builds upon the previous one: +> +> 1. First complete [Sample00 StateActionHandler tutorial](xref:TimeWarp.State:00-StateActionHandler.md) +> - Establishes basic TimeWarp.State concepts +> - Sets up state management foundation +> - Implements action/handler pattern +> +> 2. Then complete [Sample01 ReduxDevTools tutorial](xref:TimeWarp.State:01-ReduxDevTools.md) +> - Adds TimeWarp.State.Plus package +> - Integrates Redux DevTools +> - Sets up required components +> +> 3. Only then proceed with this routing tutorial +> - Builds on the established foundation +> - Uses features from previous tutorials +> +> Attempting to skip tutorials or complete them out of order will result in errors, as each tutorial depends on the setup and concepts from the previous ones. + +Additional requirements: +- Understanding of TimeWarp.State concepts (State, Actions, and Handlers) +- [Redux DevTools Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd) installed in Chrome + +## Implementation Steps + +### 1. Start from ReduxDevTools Sample + +First, complete the [Sample01 ReduxDevTools tutorial](xref:TimeWarp.State:01-ReduxDevTools.md), but use `Sample03Wasm` as the project name: + +```pwsh +dotnet new blazorwasm -n Sample03Wasm --use-program-main +``` + +Follow all steps in the Sample01 tutorial until you have a working application with ReduxDevTools integration. + +### 2. Add Required Dependencies + +The TimeWarp.State.Plus package should already be installed from the ReduxDevTools tutorial. If not: + +```pwsh +dotnet add package TimeWarp.State.Plus --prerelease +``` + +### 3. Configure Route State + +Update your Program.cs to include routing configuration: + +```csharp +namespace Sample03Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddScoped + ( + sp => new HttpClient + { + BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) + } + ); + + builder.Services.AddTimeWarpState + ( + options => + { + options.UseReduxDevTools(); + options.Assemblies = new[] + { + typeof(Program).Assembly, + typeof(TimeWarp.State.Plus.AssemblyMarker).Assembly + }; + } + ); + + await builder.Build().RunAsync(); + } +} +``` + +### 4. Add Navigation Components + +Update `Layout/MainLayout.razor` to include the TwBreadcrumb component: + +```razor +@inherits LayoutComponentBase + +
+ + +
+
+ About +
+ +
+ +
+ +
+ @Body +
+
+
+``` + +The `TwBreadcrumb` component from TimeWarp.State.Plus provides: +- Automatic route history tracking +- Configurable number of displayed links through `MaxLinks` parameter +- Built-in back navigation support +- Proper breadcrumb styling + +### 5. Update Page Titles + +In each of your pages (e.g., Home.razor, Counter.razor, Weather.razor), replace the `PageTitle` component with `TwPageTitle`: + +```razor +// Before +Home + +// After +Home +``` + +The `TwPageTitle` component: +- Automatically updates the browser's title +- Integrates with the route state +- Maintains proper titles in the breadcrumb trail +- Synchronizes with navigation history + +## Best Practices + +### 1. Route State Management +- Use `TwPageTitle` consistently across all pages +- Implement `TwBreadcrumb` in your main layout +- Let the routing system handle navigation state +- Avoid manual route manipulation unless necessary + +### 2. Thread Safety +- Route updates are automatically synchronized +- Use the built-in concurrent navigation handling +- Leverage semaphore-based protection for custom navigation logic +- Monitor route stack modifications in development + +### 3. ReduxDevTools Integration +- Monitor route state changes in real-time +- Use time-travel debugging for navigation issues +- Track route stack modifications +- Analyze navigation patterns during development + +## Troubleshooting + +### Common Issues and Solutions + +1. **Routes Not Updating** + - Verify RouteState initialization in Program.cs + - Check NavigationManager service registration + - Ensure proper action dispatch sequence + - Validate route state subscription + +2. **Breadcrumbs Not Showing** + - Confirm TwBreadcrumb placement in MainLayout + - Verify TwPageTitle usage on all pages + - Check route state updates in ReduxDevTools + - Validate MaxLinks parameter value + +3. **Navigation History Issues** + - Ensure consistent TwPageTitle implementation + - Monitor route stack in ReduxDevTools + - Verify concurrent navigation handling + - Check for custom navigation interference + +### Debugging Tips + +1. **Using ReduxDevTools** + ```csharp + // Enable detailed logging in development + builder.Services.AddTimeWarpState + ( + options => + { + options.UseReduxDevTools + ( + config => + { + config.EnableDetailedLogs = true; + config.TraceLimit = 25; + } + ); + } + ); + ``` + +2. **Route State Inspection** + ```csharp + // Inject IState to inspect current route + @inject IState RouteState + + @code + { + protected override void OnInitialized() + { + var currentRoute = RouteState.Value.CurrentRoute; + var routeStack = RouteState.Value.RouteStack; + } + } + ``` + +This tutorial demonstrates how to implement comprehensive routing features in a TimeWarp.State application using the built-in TwPageTitle and TwBreadcrumb components, while maintaining debuggability through ReduxDevTools integration. diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.IncrementCount.cs b/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.IncrementCount.cs index 1392a93cc..a19379f08 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.IncrementCount.cs +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.IncrementCount.cs @@ -1,30 +1,30 @@ -namespace Sample03Wasm.Features.Counter; - -partial class CounterState -{ - public static class IncrementCountActionSet - { - public sealed class Action : IAction - { - public int Amount { get; } - - public Action(int amount) - { - Amount = amount; - } - } - - public sealed class Handler : ActionHandler - { - public Handler(IStore store) : base(store) { } - - private CounterState CounterState => Store.GetState(); - - public override Task Handle(Action action, CancellationToken cancellationToken) - { - CounterState.Count += action.Amount; - return Task.CompletedTask; - } - } - } -} +namespace Sample03Wasm.Features.Counter; + +partial class CounterState +{ + public static class IncrementCountActionSet + { + public sealed class Action : IAction + { + public int Amount { get; } + + public Action(int amount) + { + Amount = amount; + } + } + + public sealed class Handler : ActionHandler + { + public Handler(IStore store) : base(store) { } + + private CounterState CounterState => Store.GetState(); + + public override Task Handle(Action action, CancellationToken cancellationToken) + { + CounterState.Count += action.Amount; + return Task.CompletedTask; + } + } + } +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.cs b/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.cs index 02b485e7c..08230a2b0 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.cs +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Features/Counter/CounterState.cs @@ -1,11 +1,11 @@ -namespace Sample03Wasm.Features.Counter; - -internal sealed partial class CounterState : State -{ - public int Count { get; private set; } - - public override void Initialize() - { - Count = 3; - } -} +namespace Sample03Wasm.Features.Counter; + +internal sealed partial class CounterState : State +{ + public int Count { get; private set; } + + public override void Initialize() + { + Count = 3; + } +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/GlobalUsings.cs b/Samples/03-Routing/Wasm/Sample03Wasm/GlobalUsings.cs index 0bd571c96..9fe085b51 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/GlobalUsings.cs +++ b/Samples/03-Routing/Wasm/Sample03Wasm/GlobalUsings.cs @@ -1,8 +1,8 @@ -global using Microsoft.AspNetCore.Components; -global using Microsoft.AspNetCore.Components.Web; -global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using TimeWarp.State; -global using TimeWarp.Features.Routing; -global using TimeWarp.State.Plus; -global using TimeWarp.State.Plus.Extensions; +global using Microsoft.AspNetCore.Components; +global using Microsoft.AspNetCore.Components.Web; +global using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +global using Microsoft.Extensions.DependencyInjection; +global using TimeWarp.State; +global using TimeWarp.Features.Routing; +global using TimeWarp.State.Plus; +global using TimeWarp.State.Plus.Extensions; diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Layout/MainLayout.razor.css b/Samples/03-Routing/Wasm/Sample03Wasm/Layout/MainLayout.razor.css index baef3ee5f..ecf25e5b2 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Layout/MainLayout.razor.css +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Layout/MainLayout.razor.css @@ -1,77 +1,77 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Layout/NavMenu.razor.css b/Samples/03-Routing/Wasm/Sample03Wasm/Layout/NavMenu.razor.css index 07d4c0f8c..881d128a5 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Layout/NavMenu.razor.css +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Layout/NavMenu.razor.css @@ -1,83 +1,83 @@ -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } - - .nav-scrollable { - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Program.cs b/Samples/03-Routing/Wasm/Sample03Wasm/Program.cs index a98e76938..11bc17c59 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Program.cs +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Program.cs @@ -1,28 +1,28 @@ -namespace Sample03Wasm; - -public class Program -{ - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - builder.RootComponents.Add("head::after"); - - builder.Services.AddScoped - ( - sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) } - ); - - builder.Services.AddTimeWarpState - ( - options => - { - options.UseReduxDevTools(); - } - ); - - builder.Services.AddTimeWarpStateRouting(); - - await builder.Build().RunAsync(); - } -} +namespace Sample03Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddScoped + ( + sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) } + ); + + builder.Services.AddTimeWarpState + ( + options => + { + options.UseReduxDevTools(); + } + ); + + builder.Services.AddTimeWarpStateRouting(); + + await builder.Build().RunAsync(); + } +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Properties/launchSettings.json b/Samples/03-Routing/Wasm/Sample03Wasm/Properties/launchSettings.json index cbdf23922..3c979714e 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Properties/launchSettings.json +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Properties/launchSettings.json @@ -1,41 +1,41 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:6898", - "sslPort": 44324 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5239", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7033;http://localhost:5239", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:6898", + "sslPort": 44324 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5239", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7033;http://localhost:5239", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Run.ps1 b/Samples/03-Routing/Wasm/Sample03Wasm/Run.ps1 index b172beeee..0a783efeb 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Run.ps1 +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Run.ps1 @@ -1,3 +1,3 @@ -dotnet restore --force-evaluate -dotnet build +dotnet restore --force-evaluate +dotnet build dotnet run \ No newline at end of file diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/Sample03Wasm.csproj b/Samples/03-Routing/Wasm/Sample03Wasm/Sample03Wasm.csproj index 9f5edd939..6e18ee61d 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/Sample03Wasm.csproj +++ b/Samples/03-Routing/Wasm/Sample03Wasm/Sample03Wasm.csproj @@ -1,21 +1,21 @@ - - - - net8.0 - enable - enable - - - - - - - - - - - - + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/css/app.css b/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/css/app.css index 0a4519e08..54a8aa38c 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/css/app.css +++ b/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/css/app.css @@ -1,103 +1,103 @@ -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -h1:focus { - outline: none; -} - -a, .btn-link { - color: #0071c1; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid red; -} - -.validation-message { - color: red; -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } - -.loading-progress { - position: relative; - display: block; - width: 8rem; - height: 8rem; - margin: 20vh auto 1rem auto; -} - - .loading-progress circle { - fill: none; - stroke: #e0e0e0; - stroke-width: 0.6rem; - transform-origin: 50% 50%; - transform: rotate(-90deg); - } - - .loading-progress circle:last-child { - stroke: #1b6ec2; - stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; - transition: stroke-dasharray 0.05s ease-in-out; - } - -.loading-progress-text { - position: absolute; - text-align: center; - font-weight: bold; - inset: calc(20vh + 3.25rem) 0 auto 0.2rem; -} - - .loading-progress-text:after { - content: var(--blazor-load-percentage-text, "Loading"); - } - -code { - color: #c02d76; -} +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/index.html b/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/index.html index a130881cb..b2911b87c 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/index.html +++ b/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/index.html @@ -1,32 +1,32 @@ - - - - - - - Sample03Wasm - - - - - - - - -
- - - - -
-
- -
- An unhandled error has occurred. - Reload - 🗙 -
- - - - + + + + + + + Sample03Wasm + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + diff --git a/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/sample-data/weather.json b/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/sample-data/weather.json index f0648e7bf..b7459733f 100644 --- a/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/sample-data/weather.json +++ b/Samples/03-Routing/Wasm/Sample03Wasm/wwwroot/sample-data/weather.json @@ -1,27 +1,27 @@ -[ - { - "date": "2022-01-06", - "temperatureC": 1, - "summary": "Freezing" - }, - { - "date": "2022-01-07", - "temperatureC": 14, - "summary": "Bracing" - }, - { - "date": "2022-01-08", - "temperatureC": -13, - "summary": "Freezing" - }, - { - "date": "2022-01-09", - "temperatureC": -16, - "summary": "Balmy" - }, - { - "date": "2022-01-10", - "temperatureC": -2, - "summary": "Chilly" - } -] +[ + { + "date": "2022-01-06", + "temperatureC": 1, + "summary": "Freezing" + }, + { + "date": "2022-01-07", + "temperatureC": 14, + "summary": "Bracing" + }, + { + "date": "2022-01-08", + "temperatureC": -13, + "summary": "Freezing" + }, + { + "date": "2022-01-09", + "temperatureC": -16, + "summary": "Balmy" + }, + { + "date": "2022-01-10", + "temperatureC": -2, + "summary": "Chilly" + } +] diff --git a/Samples/README.md b/Samples/README.md index a3c724076..2a4cdcb7d 100644 --- a/Samples/README.md +++ b/Samples/README.md @@ -1,64 +1,64 @@ -# TimeWarp.State Samples - -This directory contains sample projects that demonstrate various features and capabilities of TimeWarp.State. Each sample focuses on specific aspects of the library and includes examples in different Blazor render modes. - -## Available Samples - -### [00-StateActionHandler](00-StateActionHandler/) -Demonstrates the fundamental StateActionHandler pattern, which implements unidirectional data flow in TimeWarp.State. This sample showcases: -- State management through immutable states -- Action-based state modifications -- Handler implementation for processing actions -- Examples in multiple Blazor render modes (Auto, Server, WebAssembly) - -### [01-ReduxDevTools](01-ReduxDevTools/) -Shows integration with Redux DevTools for enhanced debugging capabilities: -- Real-time state monitoring -- Action tracking and time-travel debugging -- State inspection and modification -- WebAssembly implementation example - -### [02-ActionTracking](02-ActionTracking/) -Illustrates action tracking functionality: -- Monitoring action execution -- Performance tracking -- Action state management -- WebAssembly implementation example - -### [03-Routing](03-Routing/) -Demonstrates TimeWarp.State.Plus's comprehensive routing features: -- Stack-based navigation management -- Breadcrumb navigation support -- Route history tracking -- Thread-safe route updates -- Page title synchronization -- WebAssembly implementation example - -## Getting Started - -Each sample project contains its own README with detailed information about: -- Core concepts demonstrated -- Implementation details -- Key benefits -- Best practices -- Specific considerations for different Blazor render modes - -Choose a sample based on the feature you want to explore and refer to its README for detailed guidance. - -## Sample Structure - -Each sample may include implementations in different Blazor render modes: -- **Auto**: Interactive Auto render mode -- **Server**: Interactive Server render mode -- **Wasm**: Interactive WebAssembly render mode - -This helps demonstrate how TimeWarp.State can be used effectively across different Blazor hosting models. - -## Best Practices - -When exploring these samples, consider: -1. Reading the sample's README first to understand its purpose and concepts -2. Examining the implementation in your preferred render mode -3. Following the demonstrated patterns in your own applications -4. Using the samples as reference for implementing similar features -5. Understanding the specific considerations for each render mode +# TimeWarp.State Samples + +This directory contains sample projects that demonstrate various features and capabilities of TimeWarp.State. Each sample focuses on specific aspects of the library and includes examples in different Blazor render modes. + +## Available Samples + +### [00-StateActionHandler](00-StateActionHandler/) +Demonstrates the fundamental StateActionHandler pattern, which implements unidirectional data flow in TimeWarp.State. This sample showcases: +- State management through immutable states +- Action-based state modifications +- Handler implementation for processing actions +- Examples in multiple Blazor render modes (Auto, Server, WebAssembly) + +### [01-ReduxDevTools](01-ReduxDevTools/) +Shows integration with Redux DevTools for enhanced debugging capabilities: +- Real-time state monitoring +- Action tracking and time-travel debugging +- State inspection and modification +- WebAssembly implementation example + +### [02-ActionTracking](02-ActionTracking/) +Illustrates action tracking functionality: +- Monitoring action execution +- Performance tracking +- Action state management +- WebAssembly implementation example + +### [03-Routing](03-Routing/) +Demonstrates TimeWarp.State.Plus's comprehensive routing features: +- Stack-based navigation management +- Breadcrumb navigation support +- Route history tracking +- Thread-safe route updates +- Page title synchronization +- WebAssembly implementation example + +## Getting Started + +Each sample project contains its own README with detailed information about: +- Core concepts demonstrated +- Implementation details +- Key benefits +- Best practices +- Specific considerations for different Blazor render modes + +Choose a sample based on the feature you want to explore and refer to its README for detailed guidance. + +## Sample Structure + +Each sample may include implementations in different Blazor render modes: +- **Auto**: Interactive Auto render mode +- **Server**: Interactive Server render mode +- **Wasm**: Interactive WebAssembly render mode + +This helps demonstrate how TimeWarp.State can be used effectively across different Blazor hosting models. + +## Best Practices + +When exploring these samples, consider: +1. Reading the sample's README first to understand its purpose and concepts +2. Examining the implementation in your preferred render mode +3. Following the demonstrated patterns in your own applications +4. Using the samples as reference for implementing similar features +5. Understanding the specific considerations for each render mode diff --git a/Scripts/BuildReadMe.ps1 b/Scripts/BuildReadMe.ps1 index f999ad075..9ed25075c 100644 --- a/Scripts/BuildReadMe.ps1 +++ b/Scripts/BuildReadMe.ps1 @@ -1,57 +1,57 @@ -# BuildReadMe.ps1 - Concatenate multiple Markdown files into a single README.md, removing YAML front matter. - -# Function to remove YAML front matter from content -function Remove-YamlFrontMatter { - param([string]$content) - if ($content -match "^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n") { - return $content -replace "^---\s*\r?\n[\s\S]*?\r?\n---\s*\r?\n", "" - } - return $content -} - -# Save the current directory and ensure we return to it after execution. -try { - Push-Location - - # Define the list of files to include in the README.md in the desired order. - $files = @( - "../Documentation/Partials/Badges.md", - "../Documentation/Partials/Summary.md", - "../Documentation/Partials/GiveAStar.md", - "../Documentation/Partials/GettingStarted.md", - "../Documentation/Partials/Installation.md", - "../Documentation/Partials/Releases.md", - "../Documentation/Partials/License.md", - "../Documentation/Partials/Contributing.md", - "../Documentation/Partials/Contact.md" - ) - - # Define the output file. - $outputFile = "../README.md" - - # Remove the existing README.md if it exists to start fresh. - if (Test-Path $outputFile) { - Remove-Item $outputFile - } - - # Concatenate each file's content into the README.md, removing YAML front matter. - foreach ($file in $files) { - if (Test-Path $file) { - $content = Get-Content $file -Raw - $contentWithoutFrontMatter = Remove-YamlFrontMatter $content - $contentWithoutFrontMatter | Add-Content $outputFile - } - else { - Write-Host "Warning: $file does not exist and will be skipped." - } - } - - Write-Host "README.md has been successfully generated with YAML front matter removed." -} -catch { - Write-Host "An error occurred: $_" -} -finally { - # Return to the original directory. - Pop-Location -} +# BuildReadMe.ps1 - Concatenate multiple Markdown files into a single README.md, removing YAML front matter. + +# Function to remove YAML front matter from content +function Remove-YamlFrontMatter { + param([string]$content) + if ($content -match "^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n") { + return $content -replace "^---\s*\r?\n[\s\S]*?\r?\n---\s*\r?\n", "" + } + return $content +} + +# Save the current directory and ensure we return to it after execution. +try { + Push-Location + + # Define the list of files to include in the README.md in the desired order. + $files = @( + "../Documentation/Partials/Badges.md", + "../Documentation/Partials/Summary.md", + "../Documentation/Partials/GiveAStar.md", + "../Documentation/Partials/GettingStarted.md", + "../Documentation/Partials/Installation.md", + "../Documentation/Partials/Releases.md", + "../Documentation/Partials/License.md", + "../Documentation/Partials/Contributing.md", + "../Documentation/Partials/Contact.md" + ) + + # Define the output file. + $outputFile = "../README.md" + + # Remove the existing README.md if it exists to start fresh. + if (Test-Path $outputFile) { + Remove-Item $outputFile + } + + # Concatenate each file's content into the README.md, removing YAML front matter. + foreach ($file in $files) { + if (Test-Path $file) { + $content = Get-Content $file -Raw + $contentWithoutFrontMatter = Remove-YamlFrontMatter $content + $contentWithoutFrontMatter | Add-Content $outputFile + } + else { + Write-Host "Warning: $file does not exist and will be skipped." + } + } + + Write-Host "README.md has been successfully generated with YAML front matter removed." +} +catch { + Write-Host "An error occurred: $_" +} +finally { + # Return to the original directory. + Pop-Location +} diff --git a/Scripts/Readme.md b/Scripts/Readme.md index 2d685fff5..807b443ba 100644 --- a/Scripts/Readme.md +++ b/Scripts/Readme.md @@ -1,3 +1,3 @@ -# How to debug analyzer - +# How to debug analyzer + https://peterlesliemorris.com/debugging-my-published-rolsyn-source-generator-nuget-package/ \ No newline at end of file diff --git a/Source/TimeWarp.State.Analyzer/TimeWarpStateActionAnalyzer.cs.md b/Source/TimeWarp.State.Analyzer/TimeWarpStateActionAnalyzer.cs.md index a0c9845a3..4bd1a7bc0 100644 --- a/Source/TimeWarp.State.Analyzer/TimeWarpStateActionAnalyzer.cs.md +++ b/Source/TimeWarp.State.Analyzer/TimeWarpStateActionAnalyzer.cs.md @@ -1,122 +1,122 @@ -# TimeWarp State Action Analyzer - -## Overview -The TimeWarp State Action Analyzer enforces the architectural pattern where Action types must be nested within their corresponding State types. - -## Purpose -The analyzer ensures proper architectural boundaries by requiring that any class, record, or struct implementing `IAction` is defined as a nested type within a class that implements `IState`. This maintains clear relationships between Actions and their States and promotes a consistent codebase structure. - -## Rules - -### TW0001 - Action Nesting Rule -- **Severity**: Error -- **Category**: TimeWarp.State -- **Description**: Actions in TimeWarp.State must be defined as nested types within their corresponding State classes. - -### TWD001 - Debug Diagnostic -- **Severity**: Info -- **Category**: Debug -- **Description**: Provides debug information during analyzer execution. Useful for troubleshooting and development. - -## Diagnostic Rules - -### TW0001: Action Must Be Nested in State -- **Severity**: Error -- **Title**: TimeWarp.State Action should be a nested type of its State -- **Description**: TimeWarp.State Actions should be nested types of their corresponding States. -- **Message Format**: The Action '{0}' is not a nested type of its State - -### TWD001: Debug Information -- **Severity**: Info -- **Category**: Debug -- **Description**: Provides debug information during analyzer execution. Useful for troubleshooting and development. -- **Usage**: Not intended for end users - -## Implementation Details - -The analyzer: -1. Registers for syntax node analysis of: - - Class declarations - - Record declarations - - Struct declarations - -2. For each type declaration, it: - - Checks if the type implements `IAction` (directly or through inheritance) - - Verifies the type is not abstract - - Ensures the type is nested within a class implementing `IState` - -## Key Methods - -- `Initialize`: Sets up the analyzer configuration and registers syntax node actions -- `AnalyzeTypeDeclaration`: Main analysis logic for type declarations -- `ImplementsIAction`: Recursively checks if a type implements IAction -- `IsNestedInIState`: Verifies if the type is nested within an IState implementation - -## Valid Code Examples - -### Class-based Actions -```csharp -public class CounterState : IState -{ - public class IncrementAction : IAction { } -} -``` - -### Record-based Actions -```csharp -public class WeatherState : IState -{ - public record UpdateTemperatureAction(double Temperature) : IAction; -} -``` - -### Struct-based Actions -```csharp -public class GameState : IState -{ - public struct MoveAction : IAction - { - public int X { get; init; } - public int Y { get; init; } - } -} -``` - -### Inherited Actions -```csharp -public class BaseState : IState -{ - public abstract class BaseAction : IAction { } - - public class ConcreteAction : BaseAction { } -} -``` - -## Invalid Code Examples -```csharp -// ❌ Invalid - Action not nested in State -public record InvalidAction : IAction { } - -// ❌ Invalid - Action not nested in State -public class MyAction : IAction { } - -// ❌ Invalid - Action not nested in State, even with inheritance -public abstract class BaseAction : IAction { } -public class ConcreteAction : BaseAction { } -``` - -## Testing - -The analyzer includes comprehensive tests covering various scenarios: -- Invalid record actions -- Invalid class actions -- Invalid struct actions -- Invalid descendant class actions - -See `TimeWarpStateActionAnalyser_Tests.cs` for specific test cases. - -## Best Practices -1. Always nest action types within their corresponding state -2. Use appropriate type declarations (class/record/struct) based on your needs -3. Leverage inheritance when sharing common action behavior -4. Keep actions focused and specific to their parent state +# TimeWarp State Action Analyzer + +## Overview +The TimeWarp State Action Analyzer enforces the architectural pattern where Action types must be nested within their corresponding State types. + +## Purpose +The analyzer ensures proper architectural boundaries by requiring that any class, record, or struct implementing `IAction` is defined as a nested type within a class that implements `IState`. This maintains clear relationships between Actions and their States and promotes a consistent codebase structure. + +## Rules + +### TW0001 - Action Nesting Rule +- **Severity**: Error +- **Category**: TimeWarp.State +- **Description**: Actions in TimeWarp.State must be defined as nested types within their corresponding State classes. + +### TWD001 - Debug Diagnostic +- **Severity**: Info +- **Category**: Debug +- **Description**: Provides debug information during analyzer execution. Useful for troubleshooting and development. + +## Diagnostic Rules + +### TW0001: Action Must Be Nested in State +- **Severity**: Error +- **Title**: TimeWarp.State Action should be a nested type of its State +- **Description**: TimeWarp.State Actions should be nested types of their corresponding States. +- **Message Format**: The Action '{0}' is not a nested type of its State + +### TWD001: Debug Information +- **Severity**: Info +- **Category**: Debug +- **Description**: Provides debug information during analyzer execution. Useful for troubleshooting and development. +- **Usage**: Not intended for end users + +## Implementation Details + +The analyzer: +1. Registers for syntax node analysis of: + - Class declarations + - Record declarations + - Struct declarations + +2. For each type declaration, it: + - Checks if the type implements `IAction` (directly or through inheritance) + - Verifies the type is not abstract + - Ensures the type is nested within a class implementing `IState` + +## Key Methods + +- `Initialize`: Sets up the analyzer configuration and registers syntax node actions +- `AnalyzeTypeDeclaration`: Main analysis logic for type declarations +- `ImplementsIAction`: Recursively checks if a type implements IAction +- `IsNestedInIState`: Verifies if the type is nested within an IState implementation + +## Valid Code Examples + +### Class-based Actions +```csharp +public class CounterState : IState +{ + public class IncrementAction : IAction { } +} +``` + +### Record-based Actions +```csharp +public class WeatherState : IState +{ + public record UpdateTemperatureAction(double Temperature) : IAction; +} +``` + +### Struct-based Actions +```csharp +public class GameState : IState +{ + public struct MoveAction : IAction + { + public int X { get; init; } + public int Y { get; init; } + } +} +``` + +### Inherited Actions +```csharp +public class BaseState : IState +{ + public abstract class BaseAction : IAction { } + + public class ConcreteAction : BaseAction { } +} +``` + +## Invalid Code Examples +```csharp +// ❌ Invalid - Action not nested in State +public record InvalidAction : IAction { } + +// ❌ Invalid - Action not nested in State +public class MyAction : IAction { } + +// ❌ Invalid - Action not nested in State, even with inheritance +public abstract class BaseAction : IAction { } +public class ConcreteAction : BaseAction { } +``` + +## Testing + +The analyzer includes comprehensive tests covering various scenarios: +- Invalid record actions +- Invalid class actions +- Invalid struct actions +- Invalid descendant class actions + +See `TimeWarpStateActionAnalyser_Tests.cs` for specific test cases. + +## Best Practices +1. Always nest action types within their corresponding state +2. Use appropriate type declarations (class/record/struct) based on your needs +3. Leverage inheritance when sharing common action behavior +4. Keep actions focused and specific to their parent state diff --git a/Source/TimeWarp.State.Analyzer/packages.lock.json b/Source/TimeWarp.State.Analyzer/packages.lock.json index 03e7fc7d8..4dd5f187a 100644 --- a/Source/TimeWarp.State.Analyzer/packages.lock.json +++ b/Source/TimeWarp.State.Analyzer/packages.lock.json @@ -1,268 +1,268 @@ -{ - "version": 2, - "dependencies": { - ".NETStandard,Version=v2.0": { - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Buffers": "4.5.1", - "System.Collections.Immutable": "8.0.0", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.Metadata": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Buffers": "4.5.1", - "System.Collections.Immutable": "8.0.0", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.Metadata": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CodeAnalysis.CSharp.Workspaces": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "/oRJPIMvzOfiunIegSF6FEa4VvBAUSXlbLDKxyzXuOZN9nLHg3fHuX6Mr9JZLNIupbe2xqQZEmfsPxgB01vCmg==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0]", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "Microsoft.CodeAnalysis.Workspaces.Common": "[4.11.0]", - "System.Buffers": "4.5.1", - "System.Collections.Immutable": "8.0.0", - "System.Composition": "8.0.0", - "System.IO.Pipelines": "8.0.0", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.Metadata": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.Channels": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "NETStandard.Library": { - "type": "Direct", - "requested": "[2.0.3, )", - "resolved": "2.0.3", - "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeAnalysis.Workspaces.Common": { - "type": "Transitive", - "resolved": "4.11.0", - "contentHash": "UtwEt42V7/LnvAcschSlmUXRLEj0poX1H7QeFbY5bezcS+tJBCssAq8C7GfisgIA0qZPo2xzOrwKGBbg51CetA==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Buffers": "4.5.1", - "System.Collections.Immutable": "8.0.0", - "System.Composition": "8.0.0", - "System.IO.Pipelines": "8.0.0", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.Metadata": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.Channels": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Composition": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "E9oO9olNNxA39J8CxQwf7ceIPm+j/B/PhYpyK9M4LhN/OLLRw6u5fNInkhVqaWueMB9iXxYqnwqwgz+W91loIA==", - "dependencies": { - "System.Composition.AttributedModel": "8.0.0", - "System.Composition.Convention": "8.0.0", - "System.Composition.Hosting": "8.0.0", - "System.Composition.Runtime": "8.0.0", - "System.Composition.TypedParts": "8.0.0" - } - }, - "System.Composition.AttributedModel": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "NyElSuvmBMYdn2iPG0n29i7Igu0bq99izOP3MAtEwskY3OP9jqsavvVmPn9lesVaj/KT/o/QkNjA43dOJTsDQw==" - }, - "System.Composition.Convention": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UuVkc1B3vQU/LzEbWLMZ1aYVssv4rpShzf8wPEyrUqoGNqdYKREmB8bXR73heOMKkwS6ZnPz3PjGODT2MenukQ==", - "dependencies": { - "System.Composition.AttributedModel": "8.0.0" - } - }, - "System.Composition.Hosting": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "qwbONqoxlazxcbiohvb3t1JWZgKIKcRdXS5uEeLbo5wtuBupIbAvdC3PYTAeBCZrZeERvrtAbhYHuuS43Zr1bQ==", - "dependencies": { - "System.Composition.Runtime": "8.0.0" - } - }, - "System.Composition.Runtime": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "G+kRyB5/6+3ucRRQz+DF4uSHGqpkK8Q4ilVdbt4zvxpmvLVZNmSkyFAQpJLcbOyVF85aomJx0m+TGMDVlwx7ZQ==" - }, - "System.Composition.TypedParts": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "DsSklhuA+Dsgo3ZZrar8hjBFvq1wa1grrkNCTt+6SoX3vq0Vy+HXJnVXrU/nNH1BjlGH684A7h4hJQHZd/u5mA==", - "dependencies": { - "System.Composition.AttributedModel": "8.0.0", - "System.Composition.Hosting": "8.0.0", - "System.Composition.Runtime": "8.0.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0", - "System.Memory": "4.5.5" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - } - } - } +{ + "version": 2, + "dependencies": { + ".NETStandard,Version=v2.0": { + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Buffers": "4.5.1", + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.5.5", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "7.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Buffers": "4.5.1", + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.5.5", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "7.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "/oRJPIMvzOfiunIegSF6FEa4VvBAUSXlbLDKxyzXuOZN9nLHg3fHuX6Mr9JZLNIupbe2xqQZEmfsPxgB01vCmg==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0]", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.11.0]", + "System.Buffers": "4.5.1", + "System.Collections.Immutable": "8.0.0", + "System.Composition": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Memory": "4.5.5", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "7.0.0", + "System.Threading.Channels": "7.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.11.0", + "contentHash": "UtwEt42V7/LnvAcschSlmUXRLEj0poX1H7QeFbY5bezcS+tJBCssAq8C7GfisgIA0qZPo2xzOrwKGBbg51CetA==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Buffers": "4.5.1", + "System.Collections.Immutable": "8.0.0", + "System.Composition": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Memory": "4.5.5", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "7.0.0", + "System.Threading.Channels": "7.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Composition": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "E9oO9olNNxA39J8CxQwf7ceIPm+j/B/PhYpyK9M4LhN/OLLRw6u5fNInkhVqaWueMB9iXxYqnwqwgz+W91loIA==", + "dependencies": { + "System.Composition.AttributedModel": "8.0.0", + "System.Composition.Convention": "8.0.0", + "System.Composition.Hosting": "8.0.0", + "System.Composition.Runtime": "8.0.0", + "System.Composition.TypedParts": "8.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "NyElSuvmBMYdn2iPG0n29i7Igu0bq99izOP3MAtEwskY3OP9jqsavvVmPn9lesVaj/KT/o/QkNjA43dOJTsDQw==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UuVkc1B3vQU/LzEbWLMZ1aYVssv4rpShzf8wPEyrUqoGNqdYKREmB8bXR73heOMKkwS6ZnPz3PjGODT2MenukQ==", + "dependencies": { + "System.Composition.AttributedModel": "8.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "qwbONqoxlazxcbiohvb3t1JWZgKIKcRdXS5uEeLbo5wtuBupIbAvdC3PYTAeBCZrZeERvrtAbhYHuuS43Zr1bQ==", + "dependencies": { + "System.Composition.Runtime": "8.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "G+kRyB5/6+3ucRRQz+DF4uSHGqpkK8Q4ilVdbt4zvxpmvLVZNmSkyFAQpJLcbOyVF85aomJx0m+TGMDVlwx7ZQ==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "DsSklhuA+Dsgo3ZZrar8hjBFvq1wa1grrkNCTt+6SoX3vq0Vy+HXJnVXrU/nNH1BjlGH684A7h4hJQHZd/u5mA==", + "dependencies": { + "System.Composition.AttributedModel": "8.0.0", + "System.Composition.Hosting": "8.0.0", + "System.Composition.Runtime": "8.0.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.5.5" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + } + } + } } \ No newline at end of file diff --git a/Source/TimeWarp.State.Plus/Features/Routing/Components/TwPageTitle.md b/Source/TimeWarp.State.Plus/Features/Routing/Components/TwPageTitle.md index cb1658c67..22c4dafd3 100644 --- a/Source/TimeWarp.State.Plus/Features/Routing/Components/TwPageTitle.md +++ b/Source/TimeWarp.State.Plus/Features/Routing/Components/TwPageTitle.md @@ -1,35 +1,35 @@ -# TwPageTitle Component - -## Overview -The TwPageTitle component is a wrapper around Blazor's built-in PageTitle component that integrates with TimeWarp's route state management. It automatically updates the page title and maintains route state while being optimized for performance. - -## Render Optimization -The component inherits from TimeWarpStateComponent which provides built-in parameter change detection: - -1. **Parameter Change Detection** - - Utilizes TimeWarpStateComponent's SetParametersAsync for efficient parameter tracking - - ChildContent (RenderFragment) changes are automatically detected through CheckComplexParameterChanged - - Uses reference comparison for RenderFragment optimization - -2. **State Management** - - Gets RouteState without subscription to avoid infinite recursion - - Only updates route info on first render - - Prevents unnecessary re-renders when title hasn't changed - -## Usage -```razor -Your Page Title -``` - -## Implementation Details -- Inherits TimeWarpStateComponent for optimized rendering -- Uses built-in parameter change detection -- Avoids unnecessary state subscriptions -- Updates route state only when needed (first render) - -## Performance Considerations -The component is optimized by: -1. Using TimeWarpStateComponent's built-in parameter change detection -2. Avoiding state subscriptions that could cause render loops -3. Leveraging reference comparison for RenderFragment changes -4. Minimizing route state updates +# TwPageTitle Component + +## Overview +The TwPageTitle component is a wrapper around Blazor's built-in PageTitle component that integrates with TimeWarp's route state management. It automatically updates the page title and maintains route state while being optimized for performance. + +## Render Optimization +The component inherits from TimeWarpStateComponent which provides built-in parameter change detection: + +1. **Parameter Change Detection** + - Utilizes TimeWarpStateComponent's SetParametersAsync for efficient parameter tracking + - ChildContent (RenderFragment) changes are automatically detected through CheckComplexParameterChanged + - Uses reference comparison for RenderFragment optimization + +2. **State Management** + - Gets RouteState without subscription to avoid infinite recursion + - Only updates route info on first render + - Prevents unnecessary re-renders when title hasn't changed + +## Usage +```razor +Your Page Title +``` + +## Implementation Details +- Inherits TimeWarpStateComponent for optimized rendering +- Uses built-in parameter change detection +- Avoids unnecessary state subscriptions +- Updates route state only when needed (first render) + +## Performance Considerations +The component is optimized by: +1. Using TimeWarpStateComponent's built-in parameter change detection +2. Avoiding state subscriptions that could cause render loops +3. Leveraging reference comparison for RenderFragment changes +4. Minimizing route state updates diff --git a/Source/TimeWarp.State.Plus/packages.lock.json b/Source/TimeWarp.State.Plus/packages.lock.json index efd996793..60d9231a0 100644 --- a/Source/TimeWarp.State.Plus/packages.lock.json +++ b/Source/TimeWarp.State.Plus/packages.lock.json @@ -1,330 +1,330 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "Blazored.LocalStorage": { - "type": "Direct", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.0" - } - }, - "Blazored.SessionStorage": { - "type": "Direct", - "requested": "[2.4.0, )", - "resolved": "2.4.0", - "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "7.0.1" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "Blazored.LocalStorage": { + "type": "Direct", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.0" + } + }, + "Blazored.SessionStorage": { + "type": "Direct", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "7.0.1" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Source/TimeWarp.State.Policies/README.md b/Source/TimeWarp.State.Policies/README.md index 9251a3772..ece7ce81b 100644 --- a/Source/TimeWarp.State.Policies/README.md +++ b/Source/TimeWarp.State.Policies/README.md @@ -1,75 +1,75 @@ -[![Dotnet](https://img.shields.io/badge/dotnet-8.0-blue)](https://dotnet.microsoft.com) -[![Stars](https://img.shields.io/github/stars/TimeWarpEngineering/timewarp-state?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state) -[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) -[![workflow](https://github.com/TimeWarpEngineering/timewarp-state/actions/workflows/release-build.yml/badge.svg)](https://github.com/TimeWarpEngineering/timewarp-state/actions) -[![nuget](https://img.shields.io/nuget/v/TimeWarp.State.Policies?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Policies/) -[![nuget](https://img.shields.io/nuget/dt/TimeWarp.State.Policies?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Policies/) -[![Issues Open](https://img.shields.io/github/issues/TimeWarpEngineering/timewarp-state.svg?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) -[![Forks](https://img.shields.io/github/forks/TimeWarpEngineering/timewarp-state)](https://github.com/TimeWarpEngineering/timewarp-state) -[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) -[![Twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FTimeWarpEngineering%2Ftimewarp-state)](https://twitter.com/intent/tweet?url=https://github.com/TimeWarpEngineering/timewarp-state) - -[![Twitter](https://img.shields.io/twitter/follow/StevenTCramer.svg)](https://twitter.com/intent/follow?screen_name=StevenTCramer) -[![Twitter](https://img.shields.io/twitter/follow/TheFreezeTeam1.svg)](https://twitter.com/intent/follow?screen_name=TheFreezeTeam1) - -# TimeWarp.State.Policies - -![TimeWarp Logo](https://raw.githubusercontent.com/TimeWarpEngineering/timewarp-state/master/Assets/Logo.svg) - -TimeWarp.State.Policies is a part of the TimeWarp.State project, providing policies for the TimeWarp State management library. - -## Overview - -This project contains architectural policies and rules that enforce best practices and conventions for using the TimeWarp.State library. It helps maintain consistency and quality across projects that utilize TimeWarp.State. - -## Features - -- Architectural validation rules -- Best practice enforcement -- Integration with NetArchTest.eNhancedEdition for policy checks -- FluentAssertions for expressive test assertions - -## Give a Star! :star: - -If you find this project useful, please give it a star. Thanks! - -## Getting Started - -To use the policies in your project: - -1. Reference this project in your test project. -2. Create policy tests that utilize the rules defined in this library. -3. Run these tests as part of your CI/CD pipeline to ensure architectural compliance. - -For more detailed information, refer to the [Documentation](https://timewarpengineering.github.io/timewarp-state/). - -## Installation - -```console -dotnet add package TimeWarp.State.Policies -``` - -Check out the latest NuGet packages on the [TimeWarp NuGet page](https://www.nuget.org/profiles/TimeWarp.Enterprises). - -* [TimeWarp.State.Policies](https://www.nuget.org/packages/TimeWarp.State.Policies/) [![nuget](https://img.shields.io/nuget/v/TimeWarp.State.Policies?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Policies/) - -## Releases - -View the [Release Notes](https://timewarpengineering.github.io/timewarp-state/ReleaseNotes/Release11.0.0.html) for detailed information on each release. - -## UnLicense - -[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://unlicense.org) -This project is licensed under the [Unlicense](https://unlicense.org). - -## Contributing - -Your contributions are welcome! Before starting any work, please open a [discussion](https://github.com/TimeWarpEngineering/timewarp-state/discussions). - -Help with the [documentation](https://timewarpengineering.github.io/timewarp-state/) is also greatly appreciated. - -## Contact - -If you have an issue and don't receive a timely response, feel free to reach out on our [Discord server](https://discord.gg/A55JARGKKP). - -[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) +[![Dotnet](https://img.shields.io/badge/dotnet-8.0-blue)](https://dotnet.microsoft.com) +[![Stars](https://img.shields.io/github/stars/TimeWarpEngineering/timewarp-state?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state) +[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) +[![workflow](https://github.com/TimeWarpEngineering/timewarp-state/actions/workflows/release-build.yml/badge.svg)](https://github.com/TimeWarpEngineering/timewarp-state/actions) +[![nuget](https://img.shields.io/nuget/v/TimeWarp.State.Policies?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Policies/) +[![nuget](https://img.shields.io/nuget/dt/TimeWarp.State.Policies?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Policies/) +[![Issues Open](https://img.shields.io/github/issues/TimeWarpEngineering/timewarp-state.svg?logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) +[![Forks](https://img.shields.io/github/forks/TimeWarpEngineering/timewarp-state)](https://github.com/TimeWarpEngineering/timewarp-state) +[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://github.com/TimeWarpEngineering/timewarp-state/issues) +[![Twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FTimeWarpEngineering%2Ftimewarp-state)](https://twitter.com/intent/tweet?url=https://github.com/TimeWarpEngineering/timewarp-state) + +[![Twitter](https://img.shields.io/twitter/follow/StevenTCramer.svg)](https://twitter.com/intent/follow?screen_name=StevenTCramer) +[![Twitter](https://img.shields.io/twitter/follow/TheFreezeTeam1.svg)](https://twitter.com/intent/follow?screen_name=TheFreezeTeam1) + +# TimeWarp.State.Policies + +![TimeWarp Logo](https://raw.githubusercontent.com/TimeWarpEngineering/timewarp-state/master/Assets/Logo.svg) + +TimeWarp.State.Policies is a part of the TimeWarp.State project, providing policies for the TimeWarp State management library. + +## Overview + +This project contains architectural policies and rules that enforce best practices and conventions for using the TimeWarp.State library. It helps maintain consistency and quality across projects that utilize TimeWarp.State. + +## Features + +- Architectural validation rules +- Best practice enforcement +- Integration with NetArchTest.eNhancedEdition for policy checks +- FluentAssertions for expressive test assertions + +## Give a Star! :star: + +If you find this project useful, please give it a star. Thanks! + +## Getting Started + +To use the policies in your project: + +1. Reference this project in your test project. +2. Create policy tests that utilize the rules defined in this library. +3. Run these tests as part of your CI/CD pipeline to ensure architectural compliance. + +For more detailed information, refer to the [Documentation](https://timewarpengineering.github.io/timewarp-state/). + +## Installation + +```console +dotnet add package TimeWarp.State.Policies +``` + +Check out the latest NuGet packages on the [TimeWarp NuGet page](https://www.nuget.org/profiles/TimeWarp.Enterprises). + +* [TimeWarp.State.Policies](https://www.nuget.org/packages/TimeWarp.State.Policies/) [![nuget](https://img.shields.io/nuget/v/TimeWarp.State.Policies?logo=nuget)](https://www.nuget.org/packages/TimeWarp.State.Policies/) + +## Releases + +View the [Release Notes](https://timewarpengineering.github.io/timewarp-state/ReleaseNotes/Release11.0.0.html) for detailed information on each release. + +## UnLicense + +[![License](https://img.shields.io/github/license/TimeWarpEngineering/timewarp-state.svg?style=flat-square&logo=github)](https://unlicense.org) +This project is licensed under the [Unlicense](https://unlicense.org). + +## Contributing + +Your contributions are welcome! Before starting any work, please open a [discussion](https://github.com/TimeWarpEngineering/timewarp-state/discussions). + +Help with the [documentation](https://timewarpengineering.github.io/timewarp-state/) is also greatly appreciated. + +## Contact + +If you have an issue and don't receive a timely response, feel free to reach out on our [Discord server](https://discord.gg/A55JARGKKP). + +[![Discord](https://img.shields.io/discord/715274085940199487?logo=discord)](https://discord.gg/7F4bS2T) diff --git a/Source/TimeWarp.State.Policies/packages.lock.json b/Source/TimeWarp.State.Policies/packages.lock.json index c421e962a..96ae8bd67 100644 --- a/Source/TimeWarp.State.Policies/packages.lock.json +++ b/Source/TimeWarp.State.Policies/packages.lock.json @@ -1,349 +1,349 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "NetArchTest.eNhancedEdition": { - "type": "Direct", - "requested": "[1.4.3, )", - "resolved": "1.4.3", - "contentHash": "BIfFixankK+EXZJB1n3IAnRqAnynPxIlEH0AVL1MmNws2dlMPoG9iJo+rWPHBLFxMp+1xTAodhT2ie7Wun9aTA==", - "dependencies": { - "Mono.Cecil": "0.11.5" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Mono.Cecil": { - "type": "Transitive", - "resolved": "0.11.5", - "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "NetArchTest.eNhancedEdition": { + "type": "Direct", + "requested": "[1.4.3, )", + "resolved": "1.4.3", + "contentHash": "BIfFixankK+EXZJB1n3IAnRqAnynPxIlEH0AVL1MmNws2dlMPoG9iJo+rWPHBLFxMp+1xTAodhT2ie7Wun9aTA==", + "dependencies": { + "Mono.Cecil": "0.11.5" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.5", + "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Source/TimeWarp.State.SourceGenerator/packages.lock.json b/Source/TimeWarp.State.SourceGenerator/packages.lock.json index 6928e27fa..b3a9ddb72 100644 --- a/Source/TimeWarp.State.SourceGenerator/packages.lock.json +++ b/Source/TimeWarp.State.SourceGenerator/packages.lock.json @@ -1,142 +1,142 @@ -{ - "version": 2, - "dependencies": { - ".NETStandard,Version=v2.0": { - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Buffers": "4.5.1", - "System.Collections.Immutable": "8.0.0", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.Metadata": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "NETStandard.Library": { - "type": "Direct", - "requested": "[2.0.3, )", - "resolved": "2.0.3", - "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0", - "System.Memory": "4.5.5" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Buffers": "4.5.1", - "System.Collections.Immutable": "8.0.0", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.Metadata": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - } - } - } +{ + "version": 2, + "dependencies": { + ".NETStandard,Version=v2.0": { + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Buffers": "4.5.1", + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.5.5", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "7.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.5.5" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Buffers": "4.5.1", + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.5.5", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "7.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + } + } + } } \ No newline at end of file diff --git a/Source/TimeWarp.State/packages.lock.json b/Source/TimeWarp.State/packages.lock.json index 83dcb80be..4b81a2e55 100644 --- a/Source/TimeWarp.State/packages.lock.json +++ b/Source/TimeWarp.State/packages.lock.json @@ -1,306 +1,306 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "AnyClone": { - "type": "Direct", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "JetBrains.Annotations": { - "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "Direct", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "Microsoft.TypeScript.MSBuild": { - "type": "Direct", - "requested": "[5.6.2, )", - "resolved": "5.6.2", - "contentHash": "m/TlGozN5VUiGhwHJwigdGGHorffU/3dadJ/Tf3iMVwcy7wBSdPFLcGA4hpruFAtDs1f9x3Fu+OgAbkJW0YYIA==" - }, - "TypeSupport": { - "type": "Direct", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "AnyClone": { + "type": "Direct", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "JetBrains.Annotations": { + "type": "Direct", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "Direct", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Direct", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "Microsoft.TypeScript.MSBuild": { + "type": "Direct", + "requested": "[5.6.2, )", + "resolved": "5.6.2", + "contentHash": "m/TlGozN5VUiGhwHJwigdGGHorffU/3dadJ/Tf3iMVwcy7wBSdPFLcGA4hpruFAtDs1f9x3Fu+OgAbkJW0YYIA==" + }, + "TypeSupport": { + "type": "Direct", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/Client.Integration.Tests/packages.lock.json b/Tests/Client.Integration.Tests/packages.lock.json index f4adbe3b4..f1a64abbf 100644 --- a/Tests/Client.Integration.Tests/packages.lock.json +++ b/Tests/Client.Integration.Tests/packages.lock.json @@ -1,815 +1,815 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "Fixie.TestAdapter": { - "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", - "dependencies": { - "Fixie": "[3.4.0]", - "Microsoft.NET.Test.Sdk": "17.8.0", - "Mono.Cecil": "0.11.5" - } - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.AspNetCore.Mvc.Testing": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "hVHxsQQHbhLqv71DXTjFjNsELXcJp/KiP79RyNQ3tqV3jUVvgoCxkacy4k5undGdlAgchisIG+hsX0flGSuP2g==", - "dependencies": { - "Microsoft.AspNetCore.TestHost": "8.0.17", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Extensions.Hosting": "8.0.1" - } - }, - "Microsoft.AspNetCore.TestHost": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "0e89eGEP7OuhUzM34b9bOZ5REMrue+W1FD+U9DAE/CYNZxbDK0SF1MgkIOkQ2VSkG6ldDe7yTK2+fZenZBNOkQ==", - "dependencies": { - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "TimeWarp.Fixie": { - "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", - "dependencies": { - "Fixie": "3.4.0", - "Fixie.TestAdapter": "3.4.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Scrutor": "4.2.2" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "7tYqdPPpAK+3jO9d5LTuCK2VxrEdf85Ol4trUr6ds4jclBecadWZ/RyPCbNjfbN5iGTfUnD/h65TOQuqQv2c+A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Json": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, - "Microsoft.Extensions.Diagnostics": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - } - }, - "Microsoft.Extensions.Diagnostics.Abstractions": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "bP9EEkHBEfjgYiG8nUaXqMk/ujwJrffOkNPP7onpRMO8R+OUSESSP4xHkCAXgYZ1COP2Q9lXlU5gkMFh20gRuw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", - "Microsoft.Extensions.Configuration.Json": "8.0.1", - "Microsoft.Extensions.Configuration.UserSecrets": "8.0.1", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Diagnostics": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging.Configuration": "8.0.1", - "Microsoft.Extensions.Logging.Console": "8.0.1", - "Microsoft.Extensions.Logging.Debug": "8.0.1", - "Microsoft.Extensions.Logging.EventLog": "8.0.1", - "Microsoft.Extensions.Logging.EventSource": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "uzcg/5U2eLyn5LIKlERkdSxw6VPC1yydnOSQiRRWGBGN3kphq3iL4emORzrojScDmxRhv49gp5BI8U3Dz7y4iA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging.Configuration": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "B8hqNuYudC2RB+L/DI33uO4rf5by41fZVdcVL2oZj0UyoAZqnwTwYHp1KafoH4nkl1/23piNeybFFASaV2HkFg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "ZD1m4GXoxcZeDJIq8qePKj+QAWeQNO/OG8skvrOG8RQfxLp9MAKRoliTc27xanoNUzeqvX5HhS/I7c0BvwAYUg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2", - "System.Diagnostics.EventLog": "8.0.1" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "YMXMAla6B6sEf/SnfZYTty633Ool3AH7KOw2LOaaEqwSo2piK4f7HMtzyc3CNiipDnq1fsUSuG5Oc7ZzpVy8WQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.JSInterop.WebAssembly": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", - "dependencies": { - "Microsoft.JSInterop": "8.0.17" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Mono.Cecil": { - "type": "Transitive", - "resolved": "0.11.5", - "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "test.app.client": { - "type": "Project", - "dependencies": { - "FluentAssertions": "[6.12.1, )", - "Microsoft.AspNetCore.Components.WebAssembly": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Configuration": "[8.0.0, )", - "Test.App.Contracts": "[11.0.0, )", - "TimeWarp.State": "[11.0.0, )", - "TimeWarp.State.Plus": "[11.0.0, )", - "timewarp-heroicons": "[2.0.19, )" - } - }, - "test.app.contracts": { - "type": "Project", - "dependencies": { - "MediatR": "[12.4.1, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "System.Net.Http.Json": "[8.0.0, )" - } - }, - "test.app.server": { - "type": "Project", - "dependencies": { - "Microsoft.AspNetCore.Components.WebAssembly.Server": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Test.App.Client": "[11.0.0, )" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "timewarp.state.plus": { - "type": "Project", - "dependencies": { - "Blazored.LocalStorage": "[4.5.0, )", - "Blazored.SessionStorage": "[2.4.0, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Blazored.LocalStorage": { - "type": "CentralTransitive", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.0" - } - }, - "Blazored.SessionStorage": { - "type": "CentralTransitive", - "requested": "[2.4.0, )", - "resolved": "2.4.0", - "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "7.0.1" - } - }, - "Fixie": { - "type": "CentralTransitive", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.WebAssembly": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.17", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.Configuration.Json": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.JSInterop.WebAssembly": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.WebAssembly.Server": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "+sXLj8Pc1sw0xSwF709neoocPRTQAZ+CX9HLPLfLYLkDoPuJPwF9P8nDusQS2QtG/oFB/hTGZ4VOfsw+VdbN2Q==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging": { - "type": "CentralTransitive", - "requested": "[6.0.1, )", - "resolved": "8.0.1", - "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.1", - "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "CentralTransitive", - "requested": "[17.11.1, )", - "resolved": "17.8.0", - "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", - "dependencies": { - "Microsoft.CodeCoverage": "17.8.0", - "Microsoft.TestPlatform.TestHost": "17.8.0" - } - }, - "Scrutor": { - "type": "CentralTransitive", - "requested": "[4.2.2, )", - "resolved": "4.2.2", - "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Net.Http.Json": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", - "dependencies": { - "System.Text.Json": "8.0.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "timewarp-heroicons": { - "type": "CentralTransitive", - "requested": "[2.0.19, )", - "resolved": "2.0.19", - "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "6.0.7" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "Fixie.TestAdapter": { + "type": "Direct", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", + "dependencies": { + "Fixie": "[3.4.0]", + "Microsoft.NET.Test.Sdk": "17.8.0", + "Mono.Cecil": "0.11.5" + } + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.AspNetCore.Mvc.Testing": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "hVHxsQQHbhLqv71DXTjFjNsELXcJp/KiP79RyNQ3tqV3jUVvgoCxkacy4k5undGdlAgchisIG+hsX0flGSuP2g==", + "dependencies": { + "Microsoft.AspNetCore.TestHost": "8.0.17", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Extensions.Hosting": "8.0.1" + } + }, + "Microsoft.AspNetCore.TestHost": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "0e89eGEP7OuhUzM34b9bOZ5REMrue+W1FD+U9DAE/CYNZxbDK0SF1MgkIOkQ2VSkG6ldDe7yTK2+fZenZBNOkQ==", + "dependencies": { + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "TimeWarp.Fixie": { + "type": "Direct", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", + "dependencies": { + "Fixie": "3.4.0", + "Fixie.TestAdapter": "3.4.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Scrutor": "4.2.2" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "7tYqdPPpAK+3jO9d5LTuCK2VxrEdf85Ol4trUr6ds4jclBecadWZ/RyPCbNjfbN5iGTfUnD/h65TOQuqQv2c+A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "bP9EEkHBEfjgYiG8nUaXqMk/ujwJrffOkNPP7onpRMO8R+OUSESSP4xHkCAXgYZ1COP2Q9lXlU5gkMFh20gRuw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Configuration.UserSecrets": "8.0.1", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Logging.Console": "8.0.1", + "Microsoft.Extensions.Logging.Debug": "8.0.1", + "Microsoft.Extensions.Logging.EventLog": "8.0.1", + "Microsoft.Extensions.Logging.EventSource": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "uzcg/5U2eLyn5LIKlERkdSxw6VPC1yydnOSQiRRWGBGN3kphq3iL4emORzrojScDmxRhv49gp5BI8U3Dz7y4iA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "B8hqNuYudC2RB+L/DI33uO4rf5by41fZVdcVL2oZj0UyoAZqnwTwYHp1KafoH4nkl1/23piNeybFFASaV2HkFg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "ZD1m4GXoxcZeDJIq8qePKj+QAWeQNO/OG8skvrOG8RQfxLp9MAKRoliTc27xanoNUzeqvX5HhS/I7c0BvwAYUg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "System.Diagnostics.EventLog": "8.0.1" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "YMXMAla6B6sEf/SnfZYTty633Ool3AH7KOw2LOaaEqwSo2piK4f7HMtzyc3CNiipDnq1fsUSuG5Oc7ZzpVy8WQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", + "dependencies": { + "Microsoft.JSInterop": "8.0.17" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.5", + "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "test.app.client": { + "type": "Project", + "dependencies": { + "FluentAssertions": "[6.12.1, )", + "Microsoft.AspNetCore.Components.WebAssembly": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Configuration": "[8.0.0, )", + "Test.App.Contracts": "[11.0.0, )", + "TimeWarp.State": "[11.0.0, )", + "TimeWarp.State.Plus": "[11.0.0, )", + "timewarp-heroicons": "[2.0.19, )" + } + }, + "test.app.contracts": { + "type": "Project", + "dependencies": { + "MediatR": "[12.4.1, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "System.Net.Http.Json": "[8.0.0, )" + } + }, + "test.app.server": { + "type": "Project", + "dependencies": { + "Microsoft.AspNetCore.Components.WebAssembly.Server": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Test.App.Client": "[11.0.0, )" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "timewarp.state.plus": { + "type": "Project", + "dependencies": { + "Blazored.LocalStorage": "[4.5.0, )", + "Blazored.SessionStorage": "[2.4.0, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Blazored.LocalStorage": { + "type": "CentralTransitive", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.0" + } + }, + "Blazored.SessionStorage": { + "type": "CentralTransitive", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "7.0.1" + } + }, + "Fixie": { + "type": "CentralTransitive", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.17", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.JSInterop.WebAssembly": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly.Server": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "+sXLj8Pc1sw0xSwF709neoocPRTQAZ+CX9HLPLfLYLkDoPuJPwF9P8nDusQS2QtG/oFB/hTGZ4VOfsw+VdbN2Q==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[6.0.1, )", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.1", + "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "CentralTransitive", + "requested": "[17.11.1, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Scrutor": { + "type": "CentralTransitive", + "requested": "[4.2.2, )", + "resolved": "4.2.2", + "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Net.Http.Json": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", + "dependencies": { + "System.Text.Json": "8.0.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "timewarp-heroicons": { + "type": "CentralTransitive", + "requested": "[2.0.19, )", + "resolved": "2.0.19", + "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "6.0.7" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/Test.App.Architecture.Tests/packages.lock.json b/Tests/Test.App.Architecture.Tests/packages.lock.json index b9b63608c..1bce15b30 100644 --- a/Tests/Test.App.Architecture.Tests/packages.lock.json +++ b/Tests/Test.App.Architecture.Tests/packages.lock.json @@ -1,695 +1,695 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "Fixie.TestAdapter": { - "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", - "dependencies": { - "Fixie": "[3.4.0]", - "Microsoft.NET.Test.Sdk": "17.8.0", - "Mono.Cecil": "0.11.5" - } - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "NetArchTest.eNhancedEdition": { - "type": "Direct", - "requested": "[1.4.3, )", - "resolved": "1.4.3", - "contentHash": "BIfFixankK+EXZJB1n3IAnRqAnynPxIlEH0AVL1MmNws2dlMPoG9iJo+rWPHBLFxMp+1xTAodhT2ie7Wun9aTA==", - "dependencies": { - "Mono.Cecil": "0.11.5" - } - }, - "TimeWarp.Fixie": { - "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", - "dependencies": { - "Fixie": "3.4.0", - "Fixie.TestAdapter": "3.4.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Scrutor": "4.2.2" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.JSInterop.WebAssembly": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", - "dependencies": { - "Microsoft.JSInterop": "8.0.17" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Mono.Cecil": { - "type": "Transitive", - "resolved": "0.11.5", - "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "test.app.client": { - "type": "Project", - "dependencies": { - "FluentAssertions": "[6.12.1, )", - "Microsoft.AspNetCore.Components.WebAssembly": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Configuration": "[8.0.0, )", - "Test.App.Contracts": "[11.0.0, )", - "TimeWarp.State": "[11.0.0, )", - "TimeWarp.State.Plus": "[11.0.0, )", - "timewarp-heroicons": "[2.0.19, )" - } - }, - "test.app.contracts": { - "type": "Project", - "dependencies": { - "MediatR": "[12.4.1, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "System.Net.Http.Json": "[8.0.0, )" - } - }, - "test.app.server": { - "type": "Project", - "dependencies": { - "Microsoft.AspNetCore.Components.WebAssembly.Server": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Test.App.Client": "[11.0.0, )" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "timewarp.state.plus": { - "type": "Project", - "dependencies": { - "Blazored.LocalStorage": "[4.5.0, )", - "Blazored.SessionStorage": "[2.4.0, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "timewarp.state.policies": { - "type": "Project", - "dependencies": { - "FluentAssertions": "[6.12.1, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "NetArchTest.eNhancedEdition": "[1.4.3, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Blazored.LocalStorage": { - "type": "CentralTransitive", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.0" - } - }, - "Blazored.SessionStorage": { - "type": "CentralTransitive", - "requested": "[2.4.0, )", - "resolved": "2.4.0", - "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "7.0.1" - } - }, - "Fixie": { - "type": "CentralTransitive", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.WebAssembly": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.17", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.Configuration.Json": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.JSInterop.WebAssembly": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.WebAssembly.Server": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "+sXLj8Pc1sw0xSwF709neoocPRTQAZ+CX9HLPLfLYLkDoPuJPwF9P8nDusQS2QtG/oFB/hTGZ4VOfsw+VdbN2Q==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging": { - "type": "CentralTransitive", - "requested": "[6.0.1, )", - "resolved": "8.0.1", - "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "CentralTransitive", - "requested": "[17.11.1, )", - "resolved": "17.8.0", - "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", - "dependencies": { - "Microsoft.CodeCoverage": "17.8.0", - "Microsoft.TestPlatform.TestHost": "17.8.0" - } - }, - "Scrutor": { - "type": "CentralTransitive", - "requested": "[4.2.2, )", - "resolved": "4.2.2", - "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Net.Http.Json": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", - "dependencies": { - "System.Text.Json": "8.0.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "timewarp-heroicons": { - "type": "CentralTransitive", - "requested": "[2.0.19, )", - "resolved": "2.0.19", - "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "6.0.7" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "Fixie.TestAdapter": { + "type": "Direct", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", + "dependencies": { + "Fixie": "[3.4.0]", + "Microsoft.NET.Test.Sdk": "17.8.0", + "Mono.Cecil": "0.11.5" + } + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "NetArchTest.eNhancedEdition": { + "type": "Direct", + "requested": "[1.4.3, )", + "resolved": "1.4.3", + "contentHash": "BIfFixankK+EXZJB1n3IAnRqAnynPxIlEH0AVL1MmNws2dlMPoG9iJo+rWPHBLFxMp+1xTAodhT2ie7Wun9aTA==", + "dependencies": { + "Mono.Cecil": "0.11.5" + } + }, + "TimeWarp.Fixie": { + "type": "Direct", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", + "dependencies": { + "Fixie": "3.4.0", + "Fixie.TestAdapter": "3.4.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Scrutor": "4.2.2" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", + "dependencies": { + "Microsoft.JSInterop": "8.0.17" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.5", + "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "test.app.client": { + "type": "Project", + "dependencies": { + "FluentAssertions": "[6.12.1, )", + "Microsoft.AspNetCore.Components.WebAssembly": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Configuration": "[8.0.0, )", + "Test.App.Contracts": "[11.0.0, )", + "TimeWarp.State": "[11.0.0, )", + "TimeWarp.State.Plus": "[11.0.0, )", + "timewarp-heroicons": "[2.0.19, )" + } + }, + "test.app.contracts": { + "type": "Project", + "dependencies": { + "MediatR": "[12.4.1, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "System.Net.Http.Json": "[8.0.0, )" + } + }, + "test.app.server": { + "type": "Project", + "dependencies": { + "Microsoft.AspNetCore.Components.WebAssembly.Server": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Test.App.Client": "[11.0.0, )" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "timewarp.state.plus": { + "type": "Project", + "dependencies": { + "Blazored.LocalStorage": "[4.5.0, )", + "Blazored.SessionStorage": "[2.4.0, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "timewarp.state.policies": { + "type": "Project", + "dependencies": { + "FluentAssertions": "[6.12.1, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "NetArchTest.eNhancedEdition": "[1.4.3, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Blazored.LocalStorage": { + "type": "CentralTransitive", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.0" + } + }, + "Blazored.SessionStorage": { + "type": "CentralTransitive", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "7.0.1" + } + }, + "Fixie": { + "type": "CentralTransitive", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.17", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.JSInterop.WebAssembly": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly.Server": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "+sXLj8Pc1sw0xSwF709neoocPRTQAZ+CX9HLPLfLYLkDoPuJPwF9P8nDusQS2QtG/oFB/hTGZ4VOfsw+VdbN2Q==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[6.0.1, )", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "CentralTransitive", + "requested": "[17.11.1, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Scrutor": { + "type": "CentralTransitive", + "requested": "[4.2.2, )", + "resolved": "4.2.2", + "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Net.Http.Json": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", + "dependencies": { + "System.Text.Json": "8.0.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "timewarp-heroicons": { + "type": "CentralTransitive", + "requested": "[2.0.19, )", + "resolved": "2.0.19", + "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "6.0.7" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/Test.App.EndToEnd.Tests/CacheableWeatherPageTests.cs b/Tests/Test.App.EndToEnd.Tests/CacheableWeatherPageTests.cs index 55741170e..8c1ae115e 100644 --- a/Tests/Test.App.EndToEnd.Tests/CacheableWeatherPageTests.cs +++ b/Tests/Test.App.EndToEnd.Tests/CacheableWeatherPageTests.cs @@ -1,140 +1,140 @@ -namespace CacheableWeatherPageTests; - -[TestClass] -public class CacheableWeatherTests : PageTest -{ - private string SutBaseUrl = null!; - private ILocator CacheKeyLocator = null!; - private ILocator CacheDurationLocator = null!; - private ILocator TimeStampLocator = null!; - private ILocator FetchWeatherForecastsButtonLocator = null!; - private ILocator WeatherTableLocator = null!; - - [TestInitialize] - public async Task Initialize() - { - SutBaseUrl = Configuration.GetSutBaseUrl() ?? throw new InvalidOperationException("SUT base URL is not configured."); - - // Navigate to the Cacheable Weather page - await Page.GotoAsync($"{SutBaseUrl}/CacheableWeatherForecastsPage"); - - // Define the locators for the render modes, cache information, and weather table - CacheKeyLocator = Page.Locator("[data-qa='cache-key']"); - CacheDurationLocator = Page.Locator("[data-qa='cache-duration']"); - TimeStampLocator = Page.Locator("[data-qa='timestamp']"); - FetchWeatherForecastsButtonLocator = Page.Locator("[data-qa='fetch-weather-forecasts']"); - WeatherTableLocator = Page.Locator("[data-qa='weather-table']"); - } - - [TestMethod] - public async Task TestCacheableWeather() - { - Console.WriteLine("Starting TestCacheableWeather"); - - // Validate initial state - Console.WriteLine("Step 1: Validating initial state"); - await ValidateInitialState(); - Console.WriteLine("Initial state validated"); - - // Click the button to fetch weather forecasts - Console.WriteLine("Step 2: Clicking button to fetch weather forecasts"); - await FetchWeatherForecastsButtonLocator.ClickAsync(); - Console.WriteLine("Button clicked"); - - // Validate weather forecasts and cache state - Console.WriteLine("Step 3: Validating weather forecasts and cache state (first fetch)"); - await ValidateWeatherForecastsAndCacheState(true); - Console.WriteLine("First fetch validated"); - - // Click the button a second time within the CacheDuration - Console.WriteLine("Step 4: Clicking button a second time within CacheDuration"); - await FetchWeatherForecastsButtonLocator.ClickAsync(); - Console.WriteLine("Button clicked second time"); - - // Validate weather forecasts and cache state again - Console.WriteLine("Step 5: Validating weather forecasts and cache state (second fetch)"); - await ValidateWeatherForecastsAndCacheState(true); - Console.WriteLine("Second fetch validated"); - - // Wait longer than cache duration and then click the button a third time - Console.WriteLine("Step 6: Waiting for cache duration to expire"); - await Task.Delay(TimeSpan.FromSeconds(11)); - Console.WriteLine("Wait completed"); - - Console.WriteLine("Step 7: Clicking button a third time after cache expiration"); - await FetchWeatherForecastsButtonLocator.ClickAsync(); - Console.WriteLine("Button clicked third time"); - - // Validate new weather forecasts and cache state - Console.WriteLine("Step 8: Validating new weather forecasts and cache state"); - await ValidateWeatherForecastsAndCacheState(false); - Console.WriteLine("Third fetch validated"); - - Console.WriteLine("TestCacheableWeather completed successfully"); - } - - private async Task ValidateInitialState() - { - // Validate render modes - await PageUtilities.ValidateRenderModesAsync(this, Page, RenderModes.Wasm, ConfiguredRenderModes.InteractiveWebAssemblyRenderMode); - - // Validate initial state of cache and weather forecasts - await Expect(CacheKeyLocator).ToBeHiddenAsync(); - await Expect(TimeStampLocator).ToBeHiddenAsync(); - await Expect(WeatherTableLocator).ToBeHiddenAsync(); - await Expect(CacheDurationLocator).ToHaveTextAsync("00:00:10"); - } - - private async Task ValidateWeatherForecastsAndCacheState(bool isCached, string? previousTimeStamp = null) - { - Console.WriteLine("Starting ValidateWeatherForecastsAndCacheState"); - - // Validate the weather table - Console.WriteLine("Checking if weather table is visible"); - await Expect(WeatherTableLocator).ToBeVisibleAsync(); - Console.WriteLine("Weather table visibility check completed"); - - // Validate the cache key - const string expectedCacheKey = "Test.App.Client.Features.WeatherForecast.CacheableWeatherState+FetchWeatherForecastsActionSet+Action|{}"; - Console.WriteLine($"Checking cache key. Expected: {expectedCacheKey}"); - await Expect(CacheKeyLocator).ToHaveTextAsync(expectedCacheKey); - Console.WriteLine("Cache key check completed"); - - // Validate the timestamp - Console.WriteLine("Checking timestamp"); - string? currentTimestamp = await TimeStampLocator.TextContentAsync(); - Console.WriteLine($"Current timestamp: {currentTimestamp}"); - - if (isCached && previousTimeStamp != null) - { - Console.WriteLine($"Expecting timestamp to match previous: {previousTimeStamp}"); - await Expect(TimeStampLocator).ToHaveTextAsync(previousTimeStamp); - } - else if (!isCached && previousTimeStamp != null) - { - Console.WriteLine($"Expecting timestamp to be different from previous: {previousTimeStamp}"); - await Expect(TimeStampLocator).Not.ToHaveTextAsync(previousTimeStamp); - } - else - { - Console.WriteLine("Previous timestamp is null, skipping comparison"); - } - Console.WriteLine("Timestamp check completed"); - - Console.WriteLine("ValidateWeatherForecastsAndCacheState completed"); - } - - private async Task LogPageContentOnFailure(Func action) - { - try - { - await action(); - } - catch - { - Console.WriteLine("Test failed. Capturing page content:"); - Console.WriteLine(await Page.ContentAsync()); - throw; - } - } -} +namespace CacheableWeatherPageTests; + +[TestClass] +public class CacheableWeatherTests : PageTest +{ + private string SutBaseUrl = null!; + private ILocator CacheKeyLocator = null!; + private ILocator CacheDurationLocator = null!; + private ILocator TimeStampLocator = null!; + private ILocator FetchWeatherForecastsButtonLocator = null!; + private ILocator WeatherTableLocator = null!; + + [TestInitialize] + public async Task Initialize() + { + SutBaseUrl = Configuration.GetSutBaseUrl() ?? throw new InvalidOperationException("SUT base URL is not configured."); + + // Navigate to the Cacheable Weather page + await Page.GotoAsync($"{SutBaseUrl}/CacheableWeatherForecastsPage"); + + // Define the locators for the render modes, cache information, and weather table + CacheKeyLocator = Page.Locator("[data-qa='cache-key']"); + CacheDurationLocator = Page.Locator("[data-qa='cache-duration']"); + TimeStampLocator = Page.Locator("[data-qa='timestamp']"); + FetchWeatherForecastsButtonLocator = Page.Locator("[data-qa='fetch-weather-forecasts']"); + WeatherTableLocator = Page.Locator("[data-qa='weather-table']"); + } + + [TestMethod] + public async Task TestCacheableWeather() + { + Console.WriteLine("Starting TestCacheableWeather"); + + // Validate initial state + Console.WriteLine("Step 1: Validating initial state"); + await ValidateInitialState(); + Console.WriteLine("Initial state validated"); + + // Click the button to fetch weather forecasts + Console.WriteLine("Step 2: Clicking button to fetch weather forecasts"); + await FetchWeatherForecastsButtonLocator.ClickAsync(); + Console.WriteLine("Button clicked"); + + // Validate weather forecasts and cache state + Console.WriteLine("Step 3: Validating weather forecasts and cache state (first fetch)"); + await ValidateWeatherForecastsAndCacheState(true); + Console.WriteLine("First fetch validated"); + + // Click the button a second time within the CacheDuration + Console.WriteLine("Step 4: Clicking button a second time within CacheDuration"); + await FetchWeatherForecastsButtonLocator.ClickAsync(); + Console.WriteLine("Button clicked second time"); + + // Validate weather forecasts and cache state again + Console.WriteLine("Step 5: Validating weather forecasts and cache state (second fetch)"); + await ValidateWeatherForecastsAndCacheState(true); + Console.WriteLine("Second fetch validated"); + + // Wait longer than cache duration and then click the button a third time + Console.WriteLine("Step 6: Waiting for cache duration to expire"); + await Task.Delay(TimeSpan.FromSeconds(11)); + Console.WriteLine("Wait completed"); + + Console.WriteLine("Step 7: Clicking button a third time after cache expiration"); + await FetchWeatherForecastsButtonLocator.ClickAsync(); + Console.WriteLine("Button clicked third time"); + + // Validate new weather forecasts and cache state + Console.WriteLine("Step 8: Validating new weather forecasts and cache state"); + await ValidateWeatherForecastsAndCacheState(false); + Console.WriteLine("Third fetch validated"); + + Console.WriteLine("TestCacheableWeather completed successfully"); + } + + private async Task ValidateInitialState() + { + // Validate render modes + await PageUtilities.ValidateRenderModesAsync(this, Page, RenderModes.Wasm, ConfiguredRenderModes.InteractiveWebAssemblyRenderMode); + + // Validate initial state of cache and weather forecasts + await Expect(CacheKeyLocator).ToBeHiddenAsync(); + await Expect(TimeStampLocator).ToBeHiddenAsync(); + await Expect(WeatherTableLocator).ToBeHiddenAsync(); + await Expect(CacheDurationLocator).ToHaveTextAsync("00:00:10"); + } + + private async Task ValidateWeatherForecastsAndCacheState(bool isCached, string? previousTimeStamp = null) + { + Console.WriteLine("Starting ValidateWeatherForecastsAndCacheState"); + + // Validate the weather table + Console.WriteLine("Checking if weather table is visible"); + await Expect(WeatherTableLocator).ToBeVisibleAsync(); + Console.WriteLine("Weather table visibility check completed"); + + // Validate the cache key + const string expectedCacheKey = "Test.App.Client.Features.WeatherForecast.CacheableWeatherState+FetchWeatherForecastsActionSet+Action|{}"; + Console.WriteLine($"Checking cache key. Expected: {expectedCacheKey}"); + await Expect(CacheKeyLocator).ToHaveTextAsync(expectedCacheKey); + Console.WriteLine("Cache key check completed"); + + // Validate the timestamp + Console.WriteLine("Checking timestamp"); + string? currentTimestamp = await TimeStampLocator.TextContentAsync(); + Console.WriteLine($"Current timestamp: {currentTimestamp}"); + + if (isCached && previousTimeStamp != null) + { + Console.WriteLine($"Expecting timestamp to match previous: {previousTimeStamp}"); + await Expect(TimeStampLocator).ToHaveTextAsync(previousTimeStamp); + } + else if (!isCached && previousTimeStamp != null) + { + Console.WriteLine($"Expecting timestamp to be different from previous: {previousTimeStamp}"); + await Expect(TimeStampLocator).Not.ToHaveTextAsync(previousTimeStamp); + } + else + { + Console.WriteLine("Previous timestamp is null, skipping comparison"); + } + Console.WriteLine("Timestamp check completed"); + + Console.WriteLine("ValidateWeatherForecastsAndCacheState completed"); + } + + private async Task LogPageContentOnFailure(Func action) + { + try + { + await action(); + } + catch + { + Console.WriteLine("Test failed. Capturing page content:"); + Console.WriteLine(await Page.ContentAsync()); + throw; + } + } +} diff --git a/Tests/Test.App.EndToEnd.Tests/Configuration.cs b/Tests/Test.App.EndToEnd.Tests/Configuration.cs index fe0e1ee87..d787aa1b5 100644 --- a/Tests/Test.App.EndToEnd.Tests/Configuration.cs +++ b/Tests/Test.App.EndToEnd.Tests/Configuration.cs @@ -1,12 +1,12 @@ -namespace Test.App.EndToEnd.Tests; - -public static class Configuration -{ - public static string GetSutBaseUrl() - { - string port = Environment.GetEnvironmentVariable("SutPort") ?? "7011"; - string protocol = Environment.GetEnvironmentVariable("UseHttp") == "true" ? "http" : "https"; - string sutBaseUrl = $"{protocol}://localhost:{port}"; - return sutBaseUrl; - } -} +namespace Test.App.EndToEnd.Tests; + +public static class Configuration +{ + public static string GetSutBaseUrl() + { + string port = Environment.GetEnvironmentVariable("SutPort") ?? "7011"; + string protocol = Environment.GetEnvironmentVariable("UseHttp") == "true" ? "http" : "https"; + string sutBaseUrl = $"{protocol}://localhost:{port}"; + return sutBaseUrl; + } +} diff --git a/Tests/Test.App.EndToEnd.Tests/HomePageTest.cs b/Tests/Test.App.EndToEnd.Tests/HomePageTest.cs index 02b8d9340..e25fd8f19 100644 --- a/Tests/Test.App.EndToEnd.Tests/HomePageTest.cs +++ b/Tests/Test.App.EndToEnd.Tests/HomePageTest.cs @@ -1,18 +1,18 @@ -namespace HomePage_; - -[TestClass] -public class Should_ : PageTest -{ - [TestMethod] - public async Task RenderStaticContent() - { - string sutBaseUrl = Configuration.GetSutBaseUrl() ?? throw new InvalidOperationException("SUT base URL is not configured. Please check your test configuration."); - await Page.GotoAsync(sutBaseUrl); - Console.WriteLine($"Browser: {Page.Context.Browser?.BrowserType.Name}"); - Console.WriteLine($"Browser Version: {Page.Context.Browser?.Version}"); - Console.WriteLine($"User Agent: {await Page.EvaluateAsync("() => navigator.userAgent")}"); - - await Expect(Page).ToHaveTitleAsync("TimeWarp.State Test App"); - await PageUtilities.ValidateRenderModesAsync(this, Page, RenderModes.Static, ConfiguredRenderModes.None); - } -} +namespace HomePage_; + +[TestClass] +public class Should_ : PageTest +{ + [TestMethod] + public async Task RenderStaticContent() + { + string sutBaseUrl = Configuration.GetSutBaseUrl() ?? throw new InvalidOperationException("SUT base URL is not configured. Please check your test configuration."); + await Page.GotoAsync(sutBaseUrl); + Console.WriteLine($"Browser: {Page.Context.Browser?.BrowserType.Name}"); + Console.WriteLine($"Browser Version: {Page.Context.Browser?.Version}"); + Console.WriteLine($"User Agent: {await Page.EvaluateAsync("() => navigator.userAgent")}"); + + await Expect(Page).ToHaveTitleAsync("TimeWarp.State Test App"); + await PageUtilities.ValidateRenderModesAsync(this, Page, RenderModes.Static, ConfiguredRenderModes.None); + } +} diff --git a/Tests/Test.App.EndToEnd.Tests/PageUtilities.cs b/Tests/Test.App.EndToEnd.Tests/PageUtilities.cs index a0719dee3..f23b46db0 100644 --- a/Tests/Test.App.EndToEnd.Tests/PageUtilities.cs +++ b/Tests/Test.App.EndToEnd.Tests/PageUtilities.cs @@ -1,57 +1,57 @@ -namespace Test.App.EndToEnd.Tests; -using Microsoft.Playwright; - -public static class PageUtilities -{ - private static ILocator CurrentRenderModeLocator(IPage page) - { - return page.Locator("[data-qa='current-render-mode']"); - } - - private static ILocator ConfiguredRenderModeLocator(IPage page) - { - return page.Locator("[data-qa='configured-render-mode']"); - } - - public static async Task WaitTillBlazorWasmIsDownloadedAsync(IPage page) - { - const int retries = 10; - const int delay = 1000; // 1 second - - for (int i = 0; i < retries; i++) - { - // Evaluate JavaScript to check for the key in local storage - bool isBlazorDownloaded = await page.EvaluateAsync(@" - () => { - for (let i = 0; i < localStorage.length; i++) { - if (localStorage.key(i).includes('blazor-resource-hash:')) { - return true; - } - } - return false; - } - "); - - if (isBlazorDownloaded) - { - Console.WriteLine("Blazor WASM resource is downloaded."); - return; - } - - await Task.Delay(delay); - } - - throw new Exception("Blazor WASM resource was not downloaded within the expected time."); - } - - - public static async Task ValidateRenderModesAsync(PlaywrightTest test, IPage page, string expectedCurrentMode, string expectedConfiguredMode) - { - ILocator currentRenderModeLocator = page.Locator("[data-qa='current-render-mode']"); - ILocator configuredRenderModeLocator = page.Locator("[data-qa='configured-render-mode']"); - - // Now validate both current and configured modes - await test.Expect(currentRenderModeLocator).ToHaveTextAsync(expectedCurrentMode, new() { Timeout = 10000 }); - await test.Expect(configuredRenderModeLocator).ToHaveTextAsync(expectedConfiguredMode); - } -} +namespace Test.App.EndToEnd.Tests; +using Microsoft.Playwright; + +public static class PageUtilities +{ + private static ILocator CurrentRenderModeLocator(IPage page) + { + return page.Locator("[data-qa='current-render-mode']"); + } + + private static ILocator ConfiguredRenderModeLocator(IPage page) + { + return page.Locator("[data-qa='configured-render-mode']"); + } + + public static async Task WaitTillBlazorWasmIsDownloadedAsync(IPage page) + { + const int retries = 10; + const int delay = 1000; // 1 second + + for (int i = 0; i < retries; i++) + { + // Evaluate JavaScript to check for the key in local storage + bool isBlazorDownloaded = await page.EvaluateAsync(@" + () => { + for (let i = 0; i < localStorage.length; i++) { + if (localStorage.key(i).includes('blazor-resource-hash:')) { + return true; + } + } + return false; + } + "); + + if (isBlazorDownloaded) + { + Console.WriteLine("Blazor WASM resource is downloaded."); + return; + } + + await Task.Delay(delay); + } + + throw new Exception("Blazor WASM resource was not downloaded within the expected time."); + } + + + public static async Task ValidateRenderModesAsync(PlaywrightTest test, IPage page, string expectedCurrentMode, string expectedConfiguredMode) + { + ILocator currentRenderModeLocator = page.Locator("[data-qa='current-render-mode']"); + ILocator configuredRenderModeLocator = page.Locator("[data-qa='configured-render-mode']"); + + // Now validate both current and configured modes + await test.Expect(currentRenderModeLocator).ToHaveTextAsync(expectedCurrentMode, new() { Timeout = 10000 }); + await test.Expect(configuredRenderModeLocator).ToHaveTextAsync(expectedConfiguredMode); + } +} diff --git a/Tests/Test.App.EndToEnd.Tests/packages.lock.json b/Tests/Test.App.EndToEnd.Tests/packages.lock.json index 3d3f9dd7e..535a5de5c 100644 --- a/Tests/Test.App.EndToEnd.Tests/packages.lock.json +++ b/Tests/Test.App.EndToEnd.Tests/packages.lock.json @@ -1,272 +1,272 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "coverlet.collector": { - "type": "Direct", - "requested": "[6.0.2, )", - "resolved": "6.0.2", - "contentHash": "bJShQ6uWRTQ100ZeyiMqcFlhP7WJ+bCuabUs885dJiBEzMsJMSFr7BOyeCw4rgvQokteGi5rKQTlkhfQPUXg2A==" - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.11.1, )", - "resolved": "17.11.1", - "contentHash": "U3Ty4BaGoEu+T2bwSko9tWqWUOU16WzSFkq6U8zve75oRBMSLTBdMAZrVNNz1Tq12aCdDom9fcOcM9QZaFHqFg==", - "dependencies": { - "Microsoft.CodeCoverage": "17.11.1", - "Microsoft.TestPlatform.TestHost": "17.11.1" - } - }, - "Microsoft.Playwright.MSTest": { - "type": "Direct", - "requested": "[1.52.0, )", - "resolved": "1.52.0", - "contentHash": "2/lX1Gh05pT7GMAj8X0Sd6fycHpsoXXPBHSC/ct9i1YaYtNF7nEbKFQFv786+u5nDBJRYVxjfg9KLbLv8xYUeQ==", - "dependencies": { - "MSTest.TestAdapter": "2.2.7", - "MSTest.TestFramework": "2.2.7", - "Microsoft.NET.Test.Sdk": "17.8.0", - "Microsoft.Playwright": "1.52.0", - "Microsoft.Playwright.TestAdapter": "1.52.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "MSTest.TestAdapter": { - "type": "Direct", - "requested": "[3.6.0, )", - "resolved": "3.6.0", - "contentHash": "UIoSCVXds8Wxk5yWwoSJ6Q87LD6Hv7WrbggK1Uxwir1FmTrTLYtBTap0qUA6yhms4paZsMfESqq3ufJen17A1Q==", - "dependencies": { - "Microsoft.Testing.Extensions.VSTestBridge": "1.4.0", - "Microsoft.Testing.Platform.MSBuild": "1.4.0" - } - }, - "MSTest.TestFramework": { - "type": "Direct", - "requested": "[3.6.0, )", - "resolved": "3.6.0", - "contentHash": "mpIPmxsKPfjc08X9tqh0ec4Pyt/zpFUIfL2GA6CjvLmnX4zTw6llqJGnWpUbXTWEVhQu38jtqfEjeUYjMGT4Gg==" - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.22.0", - "contentHash": "3AOM9bZtku7RQwHyMEY3tQMrHIgjcfRDa6YQpd/QG2LDGvMydSlL9Di+8LLMt7J2RDdfJ7/2jdYv6yHcMJAnNw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.11.1", - "contentHash": "nPJqrcA5iX+Y0kqoT3a+pD/8lrW/V7ayqnEJQsTonSoPz59J8bmoQhcSN4G8+UJ64Hkuf0zuxnfuj2lkHOq4cA==" - }, - "Microsoft.Playwright.TestAdapter": { - "type": "Transitive", - "resolved": "1.52.0", - "contentHash": "wivJE574i5peAj2gQAmtIfvmiEUphsDrRtAqRsehQeSUOOwzEBJepTvAfLopazODRHU16F6Ex6jv1k48cR9aww==", - "dependencies": { - "Microsoft.Playwright": "1.52.0", - "Microsoft.TestPlatform.ObjectModel": "17.3.0" - } - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.Testing.Extensions.Telemetry": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "UX+T/xUOOh63KqWj6kPS2bw/E0uViIdLWUZmxk/iI+RvCzVklNzEKyaaPNo74T1GOowOSc2Kgp7RGhQK57FdyQ==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.22.0", - "Microsoft.Testing.Platform": "1.4.0" - } - }, - "Microsoft.Testing.Extensions.TrxReport.Abstractions": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "7ulY2yQ+0BH1sjSRvgXNBmhWDTtPDHOirULnnOnuKpf0m9sIETttURmfF2xZaGYsajZ/hECkL1AKFegGB+Kb9g==", - "dependencies": { - "Microsoft.Testing.Platform": "1.4.0" - } - }, - "Microsoft.Testing.Extensions.VSTestBridge": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "C6XAiFJuxjJsk67VgoVjhkNvCp0WZSEUJRpzaDTe92GatOY7CkWP9cj78qZuw/JD0mv6kktdKwNcU5lF9F8Yew==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.22.0", - "Microsoft.TestPlatform.ObjectModel": "17.11.0", - "Microsoft.Testing.Extensions.Telemetry": "1.4.0", - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.4.0", - "Microsoft.Testing.Platform": "1.4.0" - } - }, - "Microsoft.Testing.Platform": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "6JtCqi0nq43wFDUrDfx3NrmFJYqWpmbEjEv4bVtgP6BTry1aw0Zd3FDQmZbWqnWGbvPgwm39YUXedf1+yzTkmg==" - }, - "Microsoft.Testing.Platform.MSBuild": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "EBarJH6u97ng2DIpNNimUnbMGAMh2mC3uxaXqdnhLNtdLjNq9QNtEfrf+nOr84mTNA4KwDXZZAK1H5ZupoAaWw==", - "dependencies": { - "Microsoft.Testing.Platform": "1.4.0" - } - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.11.1", - "contentHash": "E2jZqAU6JeWEVsyOEOrSW1o1bpHLgb25ypvKNB/moBXPVsFYBPd/Jwi7OrYahG50J83LfHzezYI+GaEkpAotiA==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.11.1", - "contentHash": "DnG+GOqJXO/CkoqlJWeDFTgPhqD/V6VqUIL3vINizCWZ3X+HshCtbbyDdSHQQEjrc2Sl/K3yaxX6s+5LFEdYuw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.11.1", - "Newtonsoft.Json": "13.0.1" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Playwright": { - "type": "CentralTransitive", - "requested": "[1.19.1, )", - "resolved": "1.52.0", - "contentHash": "zH8a7OiXtq8BC6i0yYHAG/DSN8J8/bVyQYVESK7mK1ZJF19eY1ca51BAQpQxzF+Qm/A20x6Rsl8cT+QYXSfxbw==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "System.ComponentModel.Annotations": "5.0.0", - "System.Text.Json": "6.0.10" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "6.0.10", - "contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[6.0.2, )", + "resolved": "6.0.2", + "contentHash": "bJShQ6uWRTQ100ZeyiMqcFlhP7WJ+bCuabUs885dJiBEzMsJMSFr7BOyeCw4rgvQokteGi5rKQTlkhfQPUXg2A==" + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.11.1, )", + "resolved": "17.11.1", + "contentHash": "U3Ty4BaGoEu+T2bwSko9tWqWUOU16WzSFkq6U8zve75oRBMSLTBdMAZrVNNz1Tq12aCdDom9fcOcM9QZaFHqFg==", + "dependencies": { + "Microsoft.CodeCoverage": "17.11.1", + "Microsoft.TestPlatform.TestHost": "17.11.1" + } + }, + "Microsoft.Playwright.MSTest": { + "type": "Direct", + "requested": "[1.52.0, )", + "resolved": "1.52.0", + "contentHash": "2/lX1Gh05pT7GMAj8X0Sd6fycHpsoXXPBHSC/ct9i1YaYtNF7nEbKFQFv786+u5nDBJRYVxjfg9KLbLv8xYUeQ==", + "dependencies": { + "MSTest.TestAdapter": "2.2.7", + "MSTest.TestFramework": "2.2.7", + "Microsoft.NET.Test.Sdk": "17.8.0", + "Microsoft.Playwright": "1.52.0", + "Microsoft.Playwright.TestAdapter": "1.52.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "[3.6.0, )", + "resolved": "3.6.0", + "contentHash": "UIoSCVXds8Wxk5yWwoSJ6Q87LD6Hv7WrbggK1Uxwir1FmTrTLYtBTap0qUA6yhms4paZsMfESqq3ufJen17A1Q==", + "dependencies": { + "Microsoft.Testing.Extensions.VSTestBridge": "1.4.0", + "Microsoft.Testing.Platform.MSBuild": "1.4.0" + } + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "[3.6.0, )", + "resolved": "3.6.0", + "contentHash": "mpIPmxsKPfjc08X9tqh0ec4Pyt/zpFUIfL2GA6CjvLmnX4zTw6llqJGnWpUbXTWEVhQu38jtqfEjeUYjMGT4Gg==" + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.22.0", + "contentHash": "3AOM9bZtku7RQwHyMEY3tQMrHIgjcfRDa6YQpd/QG2LDGvMydSlL9Di+8LLMt7J2RDdfJ7/2jdYv6yHcMJAnNw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.11.1", + "contentHash": "nPJqrcA5iX+Y0kqoT3a+pD/8lrW/V7ayqnEJQsTonSoPz59J8bmoQhcSN4G8+UJ64Hkuf0zuxnfuj2lkHOq4cA==" + }, + "Microsoft.Playwright.TestAdapter": { + "type": "Transitive", + "resolved": "1.52.0", + "contentHash": "wivJE574i5peAj2gQAmtIfvmiEUphsDrRtAqRsehQeSUOOwzEBJepTvAfLopazODRHU16F6Ex6jv1k48cR9aww==", + "dependencies": { + "Microsoft.Playwright": "1.52.0", + "Microsoft.TestPlatform.ObjectModel": "17.3.0" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "UX+T/xUOOh63KqWj6kPS2bw/E0uViIdLWUZmxk/iI+RvCzVklNzEKyaaPNo74T1GOowOSc2Kgp7RGhQK57FdyQ==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.22.0", + "Microsoft.Testing.Platform": "1.4.0" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "7ulY2yQ+0BH1sjSRvgXNBmhWDTtPDHOirULnnOnuKpf0m9sIETttURmfF2xZaGYsajZ/hECkL1AKFegGB+Kb9g==", + "dependencies": { + "Microsoft.Testing.Platform": "1.4.0" + } + }, + "Microsoft.Testing.Extensions.VSTestBridge": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "C6XAiFJuxjJsk67VgoVjhkNvCp0WZSEUJRpzaDTe92GatOY7CkWP9cj78qZuw/JD0mv6kktdKwNcU5lF9F8Yew==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.22.0", + "Microsoft.TestPlatform.ObjectModel": "17.11.0", + "Microsoft.Testing.Extensions.Telemetry": "1.4.0", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.4.0", + "Microsoft.Testing.Platform": "1.4.0" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "6JtCqi0nq43wFDUrDfx3NrmFJYqWpmbEjEv4bVtgP6BTry1aw0Zd3FDQmZbWqnWGbvPgwm39YUXedf1+yzTkmg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "EBarJH6u97ng2DIpNNimUnbMGAMh2mC3uxaXqdnhLNtdLjNq9QNtEfrf+nOr84mTNA4KwDXZZAK1H5ZupoAaWw==", + "dependencies": { + "Microsoft.Testing.Platform": "1.4.0" + } + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.11.1", + "contentHash": "E2jZqAU6JeWEVsyOEOrSW1o1bpHLgb25ypvKNB/moBXPVsFYBPd/Jwi7OrYahG50J83LfHzezYI+GaEkpAotiA==", + "dependencies": { + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.11.1", + "contentHash": "DnG+GOqJXO/CkoqlJWeDFTgPhqD/V6VqUIL3vINizCWZ3X+HshCtbbyDdSHQQEjrc2Sl/K3yaxX6s+5LFEdYuw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.11.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Playwright": { + "type": "CentralTransitive", + "requested": "[1.19.1, )", + "resolved": "1.52.0", + "contentHash": "zH8a7OiXtq8BC6i0yYHAG/DSN8J8/bVyQYVESK7mK1ZJF19eY1ca51BAQpQxzF+Qm/A20x6Rsl8cT+QYXSfxbw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ComponentModel.Annotations": "5.0.0", + "System.Text.Json": "6.0.10" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "6.0.10", + "contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/Test.App/Test.App.Client/Program.cs b/Tests/Test.App/Test.App.Client/Program.cs index 1d285ea8b..3d41e03e5 100644 --- a/Tests/Test.App/Test.App.Client/Program.cs +++ b/Tests/Test.App/Test.App.Client/Program.cs @@ -1,80 +1,80 @@ -namespace Test.App.Client; - -public class Program -{ - private static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging")); - SetIsoCulture(); - ConfigureServices(builder.Services, builder.Configuration); - - WebAssemblyHost webAssemblyHost = builder.Build(); - ILogger logger = webAssemblyHost.Services.GetRequiredService().CreateLogger(); - logger.LogInformation("Starting up Client..."); - builder.Services.LogTimeWarpStateMiddleware(logger); - - await webAssemblyHost.RunAsync(); - } - public static void ConfigureServices(IServiceCollection serviceCollection, IConfiguration configuration) - { - serviceCollection.AddLogging(); - serviceCollection.AddBlazoredSessionStorage(); - serviceCollection.AddBlazoredLocalStorage(); - - serviceCollection.AddTimeWarpState - ( - options => - { - options - .UseReduxDevTools - ( - reduxDevToolsOptions => - { - reduxDevToolsOptions.Name = "Test App"; - reduxDevToolsOptions.Trace = true; - } - ); - options.Assemblies = - new[] - { - typeof(Test.App.Client.AssemblyMarker).GetTypeInfo().Assembly, - typeof(TimeWarp.State.Plus.AssemblyMarker).GetTypeInfo().Assembly - }; - } - ); - serviceCollection.AddTransient(typeof(IRequestPreProcessor<>), typeof(PrePipelineNotificationRequestPreProcessor<>)); - serviceCollection.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PostPipelineNotificationRequestPostProcessor<,>)); - serviceCollection.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PersistentStatePostProcessor<,>)); - serviceCollection.AddScoped(typeof(IPipelineBehavior<,>), typeof(ActiveActionBehavior<,>)); - serviceCollection.AddScoped(typeof(IPipelineBehavior<,>), typeof(EventStreamBehavior<,>)); - serviceCollection.AddScoped(); - serviceCollection.AddSingleton(serviceCollection); - serviceCollection.AddTimeWarpStateRouting(); - - bool useHttp = configuration.GetValue("UseHttp"); - string protocol = useHttp ? "http" : "https"; - string baseUrl = $"{protocol}://localhost:7011"; - - serviceCollection.AddScoped(sp => - new HttpClient - { - BaseAddress = new Uri(baseUrl) - }); - } - - private static void SetIsoCulture() - { - var isoCulture = - new CultureInfo("en-US") - { - DateTimeFormat = - { - ShortDatePattern = "yyyy-MM-dd", LongDatePattern = "yyyy-MM-ddTHH:mm:ss" - } - }; - - CultureInfo.DefaultThreadCurrentCulture = isoCulture; - CultureInfo.DefaultThreadCurrentUICulture = isoCulture; - } -} +namespace Test.App.Client; + +public class Program +{ + private static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging")); + SetIsoCulture(); + ConfigureServices(builder.Services, builder.Configuration); + + WebAssemblyHost webAssemblyHost = builder.Build(); + ILogger logger = webAssemblyHost.Services.GetRequiredService().CreateLogger(); + logger.LogInformation("Starting up Client..."); + builder.Services.LogTimeWarpStateMiddleware(logger); + + await webAssemblyHost.RunAsync(); + } + public static void ConfigureServices(IServiceCollection serviceCollection, IConfiguration configuration) + { + serviceCollection.AddLogging(); + serviceCollection.AddBlazoredSessionStorage(); + serviceCollection.AddBlazoredLocalStorage(); + + serviceCollection.AddTimeWarpState + ( + options => + { + options + .UseReduxDevTools + ( + reduxDevToolsOptions => + { + reduxDevToolsOptions.Name = "Test App"; + reduxDevToolsOptions.Trace = true; + } + ); + options.Assemblies = + new[] + { + typeof(Test.App.Client.AssemblyMarker).GetTypeInfo().Assembly, + typeof(TimeWarp.State.Plus.AssemblyMarker).GetTypeInfo().Assembly + }; + } + ); + serviceCollection.AddTransient(typeof(IRequestPreProcessor<>), typeof(PrePipelineNotificationRequestPreProcessor<>)); + serviceCollection.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PostPipelineNotificationRequestPostProcessor<,>)); + serviceCollection.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PersistentStatePostProcessor<,>)); + serviceCollection.AddScoped(typeof(IPipelineBehavior<,>), typeof(ActiveActionBehavior<,>)); + serviceCollection.AddScoped(typeof(IPipelineBehavior<,>), typeof(EventStreamBehavior<,>)); + serviceCollection.AddScoped(); + serviceCollection.AddSingleton(serviceCollection); + serviceCollection.AddTimeWarpStateRouting(); + + bool useHttp = configuration.GetValue("UseHttp"); + string protocol = useHttp ? "http" : "https"; + string baseUrl = $"{protocol}://localhost:7011"; + + serviceCollection.AddScoped(sp => + new HttpClient + { + BaseAddress = new Uri(baseUrl) + }); + } + + private static void SetIsoCulture() + { + var isoCulture = + new CultureInfo("en-US") + { + DateTimeFormat = + { + ShortDatePattern = "yyyy-MM-dd", LongDatePattern = "yyyy-MM-ddTHH:mm:ss" + } + }; + + CultureInfo.DefaultThreadCurrentCulture = isoCulture; + CultureInfo.DefaultThreadCurrentUICulture = isoCulture; + } +} diff --git a/Tests/Test.App/Test.App.Client/packages.lock.json b/Tests/Test.App/Test.App.Client/packages.lock.json index fafe988b1..cb26f563f 100644 --- a/Tests/Test.App/Test.App.Client/packages.lock.json +++ b/Tests/Test.App/Test.App.Client/packages.lock.json @@ -1,671 +1,671 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.AspNetCore.Components.WebAssembly": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.17", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.Configuration.Json": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.JSInterop.WebAssembly": "8.0.17" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - } - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "x5/y4l8AtshpBOrCZdlE4txw8K3e3s9meBFeZeR3l8hbbku2V7kK6ojhXvrbjg1rk3G+JqL1BI26gtgc1ZrdUw==" - }, - "Microsoft.NET.Sdk.WebAssembly.Pack": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "wufm5kIsP5PlG54bahrhJDPbN114ru7mIYOdyVQS4sCr3811SLqcn1X6rg3mxZgGxRbyfMcMBXcg5P2HV/MRYQ==" - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "timewarp-heroicons": { - "type": "Direct", - "requested": "[2.0.19, )", - "resolved": "2.0.19", - "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "6.0.7" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.JSInterop.WebAssembly": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", - "dependencies": { - "Microsoft.JSInterop": "8.0.17" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "test.app.contracts": { - "type": "Project", - "dependencies": { - "MediatR": "[12.4.1, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "System.Net.Http.Json": "[8.0.0, )" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "timewarp.state.plus": { - "type": "Project", - "dependencies": { - "Blazored.LocalStorage": "[4.5.0, )", - "Blazored.SessionStorage": "[2.4.0, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Blazored.LocalStorage": { - "type": "CentralTransitive", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.0" - } - }, - "Blazored.SessionStorage": { - "type": "CentralTransitive", - "requested": "[2.4.0, )", - "resolved": "2.4.0", - "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "7.0.1" - } - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging": { - "type": "CentralTransitive", - "requested": "[6.0.1, )", - "resolved": "8.0.1", - "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Net.Http.Json": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", - "dependencies": { - "System.Text.Json": "8.0.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - }, - "net8.0/browser-wasm": { - "runtime.any.System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" - }, - "runtime.any.System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" - }, - "runtime.any.System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" - }, - "runtime.any.System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", - "dependencies": { - "System.Private.Uri": "4.3.0" - } - }, - "runtime.any.System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" - }, - "runtime.any.System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.any.System.IO": "4.3.0" - } - }, - "System.Private.Uri": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "runtime.any.System.Reflection": "4.3.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "runtime.any.System.Reflection.Primitives": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "runtime.any.System.Runtime": "4.3.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "runtime.any.System.Text.Encoding": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "runtime.any.System.Threading.Tasks": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.17", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.JSInterop.WebAssembly": "8.0.17" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "x5/y4l8AtshpBOrCZdlE4txw8K3e3s9meBFeZeR3l8hbbku2V7kK6ojhXvrbjg1rk3G+JqL1BI26gtgc1ZrdUw==" + }, + "Microsoft.NET.Sdk.WebAssembly.Pack": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "wufm5kIsP5PlG54bahrhJDPbN114ru7mIYOdyVQS4sCr3811SLqcn1X6rg3mxZgGxRbyfMcMBXcg5P2HV/MRYQ==" + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "timewarp-heroicons": { + "type": "Direct", + "requested": "[2.0.19, )", + "resolved": "2.0.19", + "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "6.0.7" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", + "dependencies": { + "Microsoft.JSInterop": "8.0.17" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "test.app.contracts": { + "type": "Project", + "dependencies": { + "MediatR": "[12.4.1, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "System.Net.Http.Json": "[8.0.0, )" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "timewarp.state.plus": { + "type": "Project", + "dependencies": { + "Blazored.LocalStorage": "[4.5.0, )", + "Blazored.SessionStorage": "[2.4.0, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Blazored.LocalStorage": { + "type": "CentralTransitive", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.0" + } + }, + "Blazored.SessionStorage": { + "type": "CentralTransitive", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "7.0.1" + } + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[6.0.1, )", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Net.Http.Json": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", + "dependencies": { + "System.Text.Json": "8.0.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + }, + "net8.0/browser-wasm": { + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/Test.App/Test.App.Client/wwwroot/appsettings.json b/Tests/Test.App/Test.App.Client/wwwroot/appsettings.json index 9825ca72c..405f02a75 100644 --- a/Tests/Test.App/Test.App.Client/wwwroot/appsettings.json +++ b/Tests/Test.App/Test.App.Client/wwwroot/appsettings.json @@ -1,9 +1,9 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Debug", - "Microsoft.AspNetCore": "Warning" - } - }, - "UseHttp": false -} +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "Microsoft.AspNetCore": "Warning" + } + }, + "UseHttp": false +} diff --git a/Tests/Test.App/Test.App.Contracts/packages.lock.json b/Tests/Test.App/Test.App.Contracts/packages.lock.json index ae9c0e05b..b20f83344 100644 --- a/Tests/Test.App/Test.App.Contracts/packages.lock.json +++ b/Tests/Test.App/Test.App.Contracts/packages.lock.json @@ -1,113 +1,113 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "MediatR": { - "type": "Direct", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "System.Net.Http.Json": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", - "dependencies": { - "System.Text.Json": "8.0.0" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "MediatR": { + "type": "Direct", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "System.Net.Http.Json": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", + "dependencies": { + "System.Text.Json": "8.0.0" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/Test.App/Test.App.Server/Program.cs b/Tests/Test.App/Test.App.Server/Program.cs index 59ffe88eb..decd2285f 100644 --- a/Tests/Test.App/Test.App.Server/Program.cs +++ b/Tests/Test.App/Test.App.Server/Program.cs @@ -1,74 +1,74 @@ -namespace Test.App.Server; - -using Components; -using Contracts.Features.WeatherForecast; - -internal class Program -{ - private static void Main(string[] args) - { - WebApplicationBuilder builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddRazorComponents() - .AddInteractiveServerComponents() - .AddInteractiveWebAssemblyComponents(); - - Client.Program.ConfigureServices(builder.Services, builder.Configuration); - builder.Logging.AddConsole().AddDebug().SetMinimumLevel(LogLevel.Debug); - - WebApplication app = builder.Build(); - - ILogger logger = app.Services.GetRequiredService().CreateLogger(); - builder.Services.LogTimeWarpStateMiddleware(logger); - - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.UseWebAssemblyDebugging(); - } - else - { - app.UseExceptionHandler("/Error", createScopeForErrors: true); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - } - - // app.UseHttpsRedirection(); - - app.UseStaticFiles(); - app.UseAntiforgery(); - - app.MapRazorComponents() - .AddInteractiveServerRenderMode() - .AddInteractiveWebAssemblyRenderMode() - .AddAdditionalAssemblies(typeof(Test.App.Client.AssemblyMarker).Assembly); - - app.MapGet(GetWeatherForecasts.Query.RouteTemplate, () => - { - Console.WriteLine("Weather API endpoint called at: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); - - var startDate = DateOnly.FromDateTime(DateTime.Now); - string[] summaries = ["Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"]; - GetWeatherForecasts.WeatherForecastDto[] forecasts = - Enumerable.Range(1, 5) - .Select - ( - index => - new GetWeatherForecasts.WeatherForecastDto - ( - startDate.AddDays(index), - summaries[Random.Shared.Next(summaries.Length)], - Random.Shared.Next(-20, 55) - ) - ).ToArray(); - - Console.WriteLine($"Generated {forecasts.Length} weather forecasts"); - - return Results.Ok(forecasts); - }); - - app.Run(); - - } -} +namespace Test.App.Server; + +using Components; +using Contracts.Features.WeatherForecast; + +internal class Program +{ + private static void Main(string[] args) + { + WebApplicationBuilder builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + builder.Services.AddRazorComponents() + .AddInteractiveServerComponents() + .AddInteractiveWebAssemblyComponents(); + + Client.Program.ConfigureServices(builder.Services, builder.Configuration); + builder.Logging.AddConsole().AddDebug().SetMinimumLevel(LogLevel.Debug); + + WebApplication app = builder.Build(); + + ILogger logger = app.Services.GetRequiredService().CreateLogger(); + builder.Services.LogTimeWarpStateMiddleware(logger); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseWebAssemblyDebugging(); + } + else + { + app.UseExceptionHandler("/Error", createScopeForErrors: true); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + // app.UseHttpsRedirection(); + + app.UseStaticFiles(); + app.UseAntiforgery(); + + app.MapRazorComponents() + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(Test.App.Client.AssemblyMarker).Assembly); + + app.MapGet(GetWeatherForecasts.Query.RouteTemplate, () => + { + Console.WriteLine("Weather API endpoint called at: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + + var startDate = DateOnly.FromDateTime(DateTime.Now); + string[] summaries = ["Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"]; + GetWeatherForecasts.WeatherForecastDto[] forecasts = + Enumerable.Range(1, 5) + .Select + ( + index => + new GetWeatherForecasts.WeatherForecastDto + ( + startDate.AddDays(index), + summaries[Random.Shared.Next(summaries.Length)], + Random.Shared.Next(-20, 55) + ) + ).ToArray(); + + Console.WriteLine($"Generated {forecasts.Length} weather forecasts"); + + return Results.Ok(forecasts); + }); + + app.Run(); + + } +} diff --git a/Tests/Test.App/Test.App.Server/Test.App.Server.csproj b/Tests/Test.App/Test.App.Server/Test.App.Server.csproj index d9b1b4f54..bd8a1eef8 100644 --- a/Tests/Test.App/Test.App.Server/Test.App.Server.csproj +++ b/Tests/Test.App/Test.App.Server/Test.App.Server.csproj @@ -1,23 +1,23 @@ - - - - enable - Test.App - false - false - false - - - - - - - - - - - - - - - + + + + enable + Test.App + false + false + false + + + + + + + + + + + + + + + diff --git a/Tests/Test.App/Test.App.Server/packages.lock.json b/Tests/Test.App/Test.App.Server/packages.lock.json index f8f29ff41..27a133104 100644 --- a/Tests/Test.App/Test.App.Server/packages.lock.json +++ b/Tests/Test.App/Test.App.Server/packages.lock.json @@ -1,555 +1,555 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "Microsoft.AspNetCore.Components.WebAssembly.Server": { - "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "+sXLj8Pc1sw0xSwF709neoocPRTQAZ+CX9HLPLfLYLkDoPuJPwF9P8nDusQS2QtG/oFB/hTGZ4VOfsw+VdbN2Q==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.JSInterop.WebAssembly": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", - "dependencies": { - "Microsoft.JSInterop": "8.0.17" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "test.app.client": { - "type": "Project", - "dependencies": { - "FluentAssertions": "[6.12.1, )", - "Microsoft.AspNetCore.Components.WebAssembly": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Configuration": "[8.0.0, )", - "Test.App.Contracts": "[11.0.0, )", - "TimeWarp.State": "[11.0.0, )", - "TimeWarp.State.Plus": "[11.0.0, )", - "timewarp-heroicons": "[2.0.19, )" - } - }, - "test.app.contracts": { - "type": "Project", - "dependencies": { - "MediatR": "[12.4.1, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "System.Net.Http.Json": "[8.0.0, )" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "timewarp.state.plus": { - "type": "Project", - "dependencies": { - "Blazored.LocalStorage": "[4.5.0, )", - "Blazored.SessionStorage": "[2.4.0, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Blazored.LocalStorage": { - "type": "CentralTransitive", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.0" - } - }, - "Blazored.SessionStorage": { - "type": "CentralTransitive", - "requested": "[2.4.0, )", - "resolved": "2.4.0", - "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "7.0.1" - } - }, - "FluentAssertions": { - "type": "CentralTransitive", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.WebAssembly": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.17", - "Microsoft.Extensions.Configuration.Binder": "8.0.2", - "Microsoft.Extensions.Configuration.Json": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1", - "Microsoft.JSInterop.WebAssembly": "8.0.17" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging": { - "type": "CentralTransitive", - "requested": "[6.0.1, )", - "resolved": "8.0.1", - "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Net.Http.Json": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", - "dependencies": { - "System.Text.Json": "8.0.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "timewarp-heroicons": { - "type": "CentralTransitive", - "requested": "[2.0.19, )", - "resolved": "2.0.19", - "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "6.0.7" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "Microsoft.AspNetCore.Components.WebAssembly.Server": { + "type": "Direct", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "+sXLj8Pc1sw0xSwF709neoocPRTQAZ+CX9HLPLfLYLkDoPuJPwF9P8nDusQS2QtG/oFB/hTGZ4VOfsw+VdbN2Q==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "M5Sio9AI3C5CBZ7SeeQ+m/iFoTdhscRkZYQx66yelyXy2m7d9jhWRuRvbvuN3gce3aAWDAuLLHASmz0ttr2I6Q==", + "dependencies": { + "Microsoft.JSInterop": "8.0.17" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "test.app.client": { + "type": "Project", + "dependencies": { + "FluentAssertions": "[6.12.1, )", + "Microsoft.AspNetCore.Components.WebAssembly": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Configuration": "[8.0.0, )", + "Test.App.Contracts": "[11.0.0, )", + "TimeWarp.State": "[11.0.0, )", + "TimeWarp.State.Plus": "[11.0.0, )", + "timewarp-heroicons": "[2.0.19, )" + } + }, + "test.app.contracts": { + "type": "Project", + "dependencies": { + "MediatR": "[12.4.1, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "System.Net.Http.Json": "[8.0.0, )" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "timewarp.state.plus": { + "type": "Project", + "dependencies": { + "Blazored.LocalStorage": "[4.5.0, )", + "Blazored.SessionStorage": "[2.4.0, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Blazored.LocalStorage": { + "type": "CentralTransitive", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.0" + } + }, + "Blazored.SessionStorage": { + "type": "CentralTransitive", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "7.0.1" + } + }, + "FluentAssertions": { + "type": "CentralTransitive", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "QGk+Sp92NWAVXXxl9sj2OPZ7MddLYl8LFq2juEY+YZWMOjBhqv3/seWHMSSXGH5KzDlfXp6YZSaxn4hhGLmn8w==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.17", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.JSInterop.WebAssembly": "8.0.17" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging": { + "type": "CentralTransitive", + "requested": "[6.0.1, )", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Net.Http.Json": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", + "dependencies": { + "System.Text.Json": "8.0.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "timewarp-heroicons": { + "type": "CentralTransitive", + "requested": "[2.0.19, )", + "resolved": "2.0.19", + "contentHash": "31AFxvZZ0C7xU6zNa1c6AvZKo4OyB8poxEMzkS1GB1kvFcQC6zg3qW8UgzvJpB2ANnl1Lj6GB5/SOdwyusGLzw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "6.0.7" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/TimeWarp.State.Analyzer.Tests/packages.lock.json b/Tests/TimeWarp.State.Analyzer.Tests/packages.lock.json index 581ca34c2..b4f92e9c9 100644 --- a/Tests/TimeWarp.State.Analyzer.Tests/packages.lock.json +++ b/Tests/TimeWarp.State.Analyzer.Tests/packages.lock.json @@ -1,934 +1,934 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "Fixie.TestAdapter": { - "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", - "dependencies": { - "Fixie": "[3.4.0]", - "Microsoft.NET.Test.Sdk": "17.8.0", - "Mono.Cecil": "0.11.5" - } - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.CSharp.Analyzer.Testing": { - "type": "Direct", - "requested": "[1.1.2, )", - "resolved": "1.1.2", - "contentHash": "AFHm5lhv7vmo03F1p2zZBqwd8NMSKOgCXdhiKfnP0E0UDNiiMomI1tQAitOl/85/S5n6e8fQP6dYSOkTLbJaZg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzer.Testing": "[1.1.2]", - "Microsoft.CodeAnalysis.CSharp.Workspaces": "1.0.1" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "TimeWarp.Fixie": { - "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", - "dependencies": { - "Fixie": "3.4.0", - "Fixie.TestAdapter": "3.4.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Scrutor": "4.2.2" - } - }, - "DiffPlex": { - "type": "Transitive", - "resolved": "1.7.2", - "contentHash": "qJEjdxEDBWSFZGB8paBB9HDeJXHGlHlOXeGX3kbTuXWuOsgv2iSAEOOzo5V1/B39Vcxr9IVVrNKewRcX+rsn4g==" - }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeAnalysis.Analyzer.Testing": { - "type": "Transitive", - "resolved": "1.1.2", - "contentHash": "g6cSJMPlmTiEHakCKaTobNISbf4jfjNF38YK8V4azAgcV9CE4BxuGQSWW6eftHs43q7mhKOr1lioKsTVQmUc1g==", - "dependencies": { - "DiffPlex": "1.7.2", - "Microsoft.CodeAnalysis.Workspaces.Common": "1.0.1", - "Microsoft.VisualStudio.Composition": "16.1.8", - "NuGet.Common": "6.3.4", - "NuGet.Packaging": "6.3.4", - "NuGet.Protocol": "6.3.4", - "NuGet.Resolver": "6.3.4" - } - }, - "Microsoft.CodeAnalysis.Workspaces.Common": { - "type": "Transitive", - "resolved": "4.11.0", - "contentHash": "UtwEt42V7/LnvAcschSlmUXRLEj0poX1H7QeFbY5bezcS+tJBCssAq8C7GfisgIA0qZPo2xzOrwKGBbg51CetA==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Composition": "8.0.0", - "System.IO.Pipelines": "8.0.0", - "System.Reflection.Metadata": "8.0.0", - "System.Threading.Channels": "7.0.0" - } - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Microsoft.VisualStudio.Composition": { - "type": "Transitive", - "resolved": "16.1.8", - "contentHash": "N+thv3dcT7kjn0Xz3U0uBm2CH4uoaMvH8wC6Gy2HWx7HLNdEpqGoMraLyoBdizmypD1owLCJQIa2uKmWe4/o8A==", - "dependencies": { - "Microsoft.VisualStudio.Composition.NetFxAttributes": "16.1.8", - "Microsoft.VisualStudio.Validation": "15.0.82", - "System.Composition": "1.0.31", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Metadata": "1.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Threading.Tasks.Dataflow": "4.6.0" - } - }, - "Microsoft.VisualStudio.Composition.NetFxAttributes": { - "type": "Transitive", - "resolved": "16.1.8", - "contentHash": "EbwZWTvdzit68qZSuTI8nd1PZ87pYjhpCwtsis8lrUKJ7XLdbE5rxY6YrY7OFze+YUsguzqZlNjX4Yn5nL9qBw==", - "dependencies": { - "System.ComponentModel.Composition": "4.5.0" - } - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "15.0.82", - "contentHash": "XwZyVCsHuEtnd6nYScJnA8XkXPzy4Ok0DV5/hqqAe5ccgOhJ6yap7Qh/sU/i6QxEzuYyECPYDQ7IOyEQ3yRQgQ==" - }, - "Mono.Cecil": { - "type": "Transitive", - "resolved": "0.11.5", - "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "NuGet.Common": { - "type": "Transitive", - "resolved": "6.3.4", - "contentHash": "wKuTiB3RBjbvzB/BhW8+Cu+TTPsABJr91I2Guu/FuM0SXtYRIM26v1NJdwm5rLw59CqB7bamqpWpJKU8bLAdwQ==", - "dependencies": { - "NuGet.Frameworks": "6.3.4" - } - }, - "NuGet.Configuration": { - "type": "Transitive", - "resolved": "6.3.4", - "contentHash": "b+/g6sdnR2128KLn+6qO1MrB8j0goO4kYCFly2RDi/BsLilK+MzKJRHWGYqfMn/YnLmMrgNNJ2sSr4GX7rMEQw==", - "dependencies": { - "NuGet.Common": "6.3.4", - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "NuGet.Packaging": { - "type": "Transitive", - "resolved": "6.3.4", - "contentHash": "0HtJXNCes0443jKeFErjhYxJ08BjyoDrIvw/uWyonoTBQ3B//+H2nztviSUyv0+ydfgKyhwshAjsr0efUT8PRA==", - "dependencies": { - "Newtonsoft.Json": "13.0.1", - "NuGet.Configuration": "6.3.4", - "NuGet.Versioning": "6.3.4", - "System.Security.Cryptography.Cng": "5.0.0", - "System.Security.Cryptography.Pkcs": "5.0.0" - } - }, - "NuGet.Protocol": { - "type": "Transitive", - "resolved": "6.3.4", - "contentHash": "Gmvnz7RoN6UG3POw0F4t9mWM4sIdmHiuutvR9c2pLCJCUiYBN8QvbO/ZvkOuQNNM/aGdYExx/Tm84Zx9iVjOSA==", - "dependencies": { - "NuGet.Packaging": "6.3.4" - } - }, - "NuGet.Resolver": { - "type": "Transitive", - "resolved": "6.3.4", - "contentHash": "cO/QqtGqCIUf/e6EncIQ/ORJDco9UOtxooDL0IZhf18x1l0xFJ/nrcLCyAjZeznE9RAIqaNv1+YFobht4u0Lsw==", - "dependencies": { - "NuGet.Protocol": "6.3.4" - } - }, - "NuGet.Versioning": { - "type": "Transitive", - "resolved": "6.3.4", - "contentHash": "mQW9bwsWJq30lacl33MMVLBlrit5ClNEpGzKryIuLfP1UTL6feQK1yzA/5IQXdtjXvUEoI5bo1Axjen5lOm7Bg==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.0.11", - "contentHash": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - } - }, - "System.Collections.Concurrent": { - "type": "Transitive", - "resolved": "4.0.12", - "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - } - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.ComponentModel.Composition": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "+iB9FoZnfdqMEGq6np28X6YNSUrse16CakmIhV3h6PxEWt7jYxUN3Txs1D8MZhhf4QmyvK0F/EcIN0f4gGN0dA==", - "dependencies": { - "System.Security.Permissions": "4.5.0" - } - }, - "System.Composition": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "E9oO9olNNxA39J8CxQwf7ceIPm+j/B/PhYpyK9M4LhN/OLLRw6u5fNInkhVqaWueMB9iXxYqnwqwgz+W91loIA==", - "dependencies": { - "System.Composition.AttributedModel": "8.0.0", - "System.Composition.Convention": "8.0.0", - "System.Composition.Hosting": "8.0.0", - "System.Composition.Runtime": "8.0.0", - "System.Composition.TypedParts": "8.0.0" - } - }, - "System.Composition.AttributedModel": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "NyElSuvmBMYdn2iPG0n29i7Igu0bq99izOP3MAtEwskY3OP9jqsavvVmPn9lesVaj/KT/o/QkNjA43dOJTsDQw==" - }, - "System.Composition.Convention": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UuVkc1B3vQU/LzEbWLMZ1aYVssv4rpShzf8wPEyrUqoGNqdYKREmB8bXR73heOMKkwS6ZnPz3PjGODT2MenukQ==", - "dependencies": { - "System.Composition.AttributedModel": "8.0.0" - } - }, - "System.Composition.Hosting": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "qwbONqoxlazxcbiohvb3t1JWZgKIKcRdXS5uEeLbo5wtuBupIbAvdC3PYTAeBCZrZeERvrtAbhYHuuS43Zr1bQ==", - "dependencies": { - "System.Composition.Runtime": "8.0.0" - } - }, - "System.Composition.Runtime": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "G+kRyB5/6+3ucRRQz+DF4uSHGqpkK8Q4ilVdbt4zvxpmvLVZNmSkyFAQpJLcbOyVF85aomJx0m+TGMDVlwx7ZQ==" - }, - "System.Composition.TypedParts": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "DsSklhuA+Dsgo3ZZrar8hjBFvq1wa1grrkNCTt+6SoX3vq0Vy+HXJnVXrU/nNH1BjlGH684A7h4hJQHZd/u5mA==", - "dependencies": { - "System.Composition.AttributedModel": "8.0.0", - "System.Composition.Hosting": "8.0.0", - "System.Composition.Runtime": "8.0.0" - } - }, - "System.Diagnostics.Debug": { - "type": "Transitive", - "resolved": "4.0.11", - "contentHash": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - } - }, - "System.Diagnostics.Tracing": { - "type": "Transitive", - "resolved": "4.1.0", - "contentHash": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - } - }, - "System.Dynamic.Runtime": { - "type": "Transitive", - "resolved": "4.0.11", - "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" - }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.0.11", - "contentHash": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - } - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Linq": { - "type": "Transitive", - "resolved": "4.1.0", - "contentHash": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - } - }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.1.0", - "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Emit.Lightweight": "4.0.1", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" - }, - "System.ObjectModel": { - "type": "Transitive", - "resolved": "4.0.12", - "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.0.1", - "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.0.1", - "contentHash": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.0.1", - "contentHash": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Globalization": "4.0.11", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.1.0", - "contentHash": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "2.0.0", - "System.Security.Principal.Windows": "4.5.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", - "dependencies": { - "System.Formats.Asn1": "5.0.0" - } - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "9TPLGjBCGKmNvG8pjwPeuYy0SMVmGZRwlTZvyPHDbYv/DRkoeumJdfumaaDNQzVGMEmbWtg07zUpSW9q70IlDQ==", - "dependencies": { - "System.Formats.Asn1": "5.0.0", - "System.Security.Cryptography.Cng": "5.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "9gdyuARhUR7H+p5CjyUB/zPk7/Xut3wUSP8NJQB6iZr8L3XUXTMdoLeVAg9N4rqF8oIpE7MpdqHdDHQ7XgJe0g==", - "dependencies": { - "System.Security.AccessControl": "4.5.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "2.0.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.0.11", - "contentHash": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", - "dependencies": { - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - } - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks.Dataflow": { - "type": "Transitive", - "resolved": "4.6.0", - "contentHash": "2hRjGu2r2jxRZ55wmcHO/WbdX+YAOz9x6FE8xqkHZgPaoFMKQZRe9dk8xTZIas8fRjxRmzawnTEWIrhlM+Un7w==", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Dynamic.Runtime": "4.0.11", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "timewarp.state.analyzer": { - "type": "Project", - "dependencies": { - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.11.0, )", - "Microsoft.CodeAnalysis.Common": "[4.11.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Fixie": { - "type": "CentralTransitive", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.CSharp.Workspaces": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "/oRJPIMvzOfiunIegSF6FEa4VvBAUSXlbLDKxyzXuOZN9nLHg3fHuX6Mr9JZLNIupbe2xqQZEmfsPxgB01vCmg==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0]", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "Microsoft.CodeAnalysis.Workspaces.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Composition": "8.0.0", - "System.IO.Pipelines": "8.0.0", - "System.Reflection.Metadata": "8.0.0", - "System.Threading.Channels": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "CentralTransitive", - "requested": "[17.11.1, )", - "resolved": "17.8.0", - "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", - "dependencies": { - "Microsoft.CodeCoverage": "17.8.0", - "Microsoft.TestPlatform.TestHost": "17.8.0" - } - }, - "Scrutor": { - "type": "CentralTransitive", - "requested": "[4.2.2, )", - "resolved": "4.2.2", - "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "6.0.0", - "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "Fixie.TestAdapter": { + "type": "Direct", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", + "dependencies": { + "Fixie": "[3.4.0]", + "Microsoft.NET.Test.Sdk": "17.8.0", + "Mono.Cecil": "0.11.5" + } + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp.Analyzer.Testing": { + "type": "Direct", + "requested": "[1.1.2, )", + "resolved": "1.1.2", + "contentHash": "AFHm5lhv7vmo03F1p2zZBqwd8NMSKOgCXdhiKfnP0E0UDNiiMomI1tQAitOl/85/S5n6e8fQP6dYSOkTLbJaZg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzer.Testing": "[1.1.2]", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "1.0.1" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "TimeWarp.Fixie": { + "type": "Direct", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", + "dependencies": { + "Fixie": "3.4.0", + "Fixie.TestAdapter": "3.4.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Scrutor": "4.2.2" + } + }, + "DiffPlex": { + "type": "Transitive", + "resolved": "1.7.2", + "contentHash": "qJEjdxEDBWSFZGB8paBB9HDeJXHGlHlOXeGX3kbTuXWuOsgv2iSAEOOzo5V1/B39Vcxr9IVVrNKewRcX+rsn4g==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeAnalysis.Analyzer.Testing": { + "type": "Transitive", + "resolved": "1.1.2", + "contentHash": "g6cSJMPlmTiEHakCKaTobNISbf4jfjNF38YK8V4azAgcV9CE4BxuGQSWW6eftHs43q7mhKOr1lioKsTVQmUc1g==", + "dependencies": { + "DiffPlex": "1.7.2", + "Microsoft.CodeAnalysis.Workspaces.Common": "1.0.1", + "Microsoft.VisualStudio.Composition": "16.1.8", + "NuGet.Common": "6.3.4", + "NuGet.Packaging": "6.3.4", + "NuGet.Protocol": "6.3.4", + "NuGet.Resolver": "6.3.4" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.11.0", + "contentHash": "UtwEt42V7/LnvAcschSlmUXRLEj0poX1H7QeFbY5bezcS+tJBCssAq8C7GfisgIA0qZPo2xzOrwKGBbg51CetA==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Composition": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Reflection.Metadata": "8.0.0", + "System.Threading.Channels": "7.0.0" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.VisualStudio.Composition": { + "type": "Transitive", + "resolved": "16.1.8", + "contentHash": "N+thv3dcT7kjn0Xz3U0uBm2CH4uoaMvH8wC6Gy2HWx7HLNdEpqGoMraLyoBdizmypD1owLCJQIa2uKmWe4/o8A==", + "dependencies": { + "Microsoft.VisualStudio.Composition.NetFxAttributes": "16.1.8", + "Microsoft.VisualStudio.Validation": "15.0.82", + "System.Composition": "1.0.31", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Threading.Tasks.Dataflow": "4.6.0" + } + }, + "Microsoft.VisualStudio.Composition.NetFxAttributes": { + "type": "Transitive", + "resolved": "16.1.8", + "contentHash": "EbwZWTvdzit68qZSuTI8nd1PZ87pYjhpCwtsis8lrUKJ7XLdbE5rxY6YrY7OFze+YUsguzqZlNjX4Yn5nL9qBw==", + "dependencies": { + "System.ComponentModel.Composition": "4.5.0" + } + }, + "Microsoft.VisualStudio.Validation": { + "type": "Transitive", + "resolved": "15.0.82", + "contentHash": "XwZyVCsHuEtnd6nYScJnA8XkXPzy4Ok0DV5/hqqAe5ccgOhJ6yap7Qh/sU/i6QxEzuYyECPYDQ7IOyEQ3yRQgQ==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.5", + "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Common": { + "type": "Transitive", + "resolved": "6.3.4", + "contentHash": "wKuTiB3RBjbvzB/BhW8+Cu+TTPsABJr91I2Guu/FuM0SXtYRIM26v1NJdwm5rLw59CqB7bamqpWpJKU8bLAdwQ==", + "dependencies": { + "NuGet.Frameworks": "6.3.4" + } + }, + "NuGet.Configuration": { + "type": "Transitive", + "resolved": "6.3.4", + "contentHash": "b+/g6sdnR2128KLn+6qO1MrB8j0goO4kYCFly2RDi/BsLilK+MzKJRHWGYqfMn/YnLmMrgNNJ2sSr4GX7rMEQw==", + "dependencies": { + "NuGet.Common": "6.3.4", + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" + }, + "NuGet.Packaging": { + "type": "Transitive", + "resolved": "6.3.4", + "contentHash": "0HtJXNCes0443jKeFErjhYxJ08BjyoDrIvw/uWyonoTBQ3B//+H2nztviSUyv0+ydfgKyhwshAjsr0efUT8PRA==", + "dependencies": { + "Newtonsoft.Json": "13.0.1", + "NuGet.Configuration": "6.3.4", + "NuGet.Versioning": "6.3.4", + "System.Security.Cryptography.Cng": "5.0.0", + "System.Security.Cryptography.Pkcs": "5.0.0" + } + }, + "NuGet.Protocol": { + "type": "Transitive", + "resolved": "6.3.4", + "contentHash": "Gmvnz7RoN6UG3POw0F4t9mWM4sIdmHiuutvR9c2pLCJCUiYBN8QvbO/ZvkOuQNNM/aGdYExx/Tm84Zx9iVjOSA==", + "dependencies": { + "NuGet.Packaging": "6.3.4" + } + }, + "NuGet.Resolver": { + "type": "Transitive", + "resolved": "6.3.4", + "contentHash": "cO/QqtGqCIUf/e6EncIQ/ORJDco9UOtxooDL0IZhf18x1l0xFJ/nrcLCyAjZeznE9RAIqaNv1+YFobht4u0Lsw==", + "dependencies": { + "NuGet.Protocol": "6.3.4" + } + }, + "NuGet.Versioning": { + "type": "Transitive", + "resolved": "6.3.4", + "contentHash": "mQW9bwsWJq30lacl33MMVLBlrit5ClNEpGzKryIuLfP1UTL6feQK1yzA/5IQXdtjXvUEoI5bo1Axjen5lOm7Bg==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.ComponentModel.Composition": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "+iB9FoZnfdqMEGq6np28X6YNSUrse16CakmIhV3h6PxEWt7jYxUN3Txs1D8MZhhf4QmyvK0F/EcIN0f4gGN0dA==", + "dependencies": { + "System.Security.Permissions": "4.5.0" + } + }, + "System.Composition": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "E9oO9olNNxA39J8CxQwf7ceIPm+j/B/PhYpyK9M4LhN/OLLRw6u5fNInkhVqaWueMB9iXxYqnwqwgz+W91loIA==", + "dependencies": { + "System.Composition.AttributedModel": "8.0.0", + "System.Composition.Convention": "8.0.0", + "System.Composition.Hosting": "8.0.0", + "System.Composition.Runtime": "8.0.0", + "System.Composition.TypedParts": "8.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "NyElSuvmBMYdn2iPG0n29i7Igu0bq99izOP3MAtEwskY3OP9jqsavvVmPn9lesVaj/KT/o/QkNjA43dOJTsDQw==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UuVkc1B3vQU/LzEbWLMZ1aYVssv4rpShzf8wPEyrUqoGNqdYKREmB8bXR73heOMKkwS6ZnPz3PjGODT2MenukQ==", + "dependencies": { + "System.Composition.AttributedModel": "8.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "qwbONqoxlazxcbiohvb3t1JWZgKIKcRdXS5uEeLbo5wtuBupIbAvdC3PYTAeBCZrZeERvrtAbhYHuuS43Zr1bQ==", + "dependencies": { + "System.Composition.Runtime": "8.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "G+kRyB5/6+3ucRRQz+DF4uSHGqpkK8Q4ilVdbt4zvxpmvLVZNmSkyFAQpJLcbOyVF85aomJx0m+TGMDVlwx7ZQ==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "DsSklhuA+Dsgo3ZZrar8hjBFvq1wa1grrkNCTt+6SoX3vq0Vy+HXJnVXrU/nNH1BjlGH684A7h4hJQHZd/u5mA==", + "dependencies": { + "System.Composition.AttributedModel": "8.0.0", + "System.Composition.Hosting": "8.0.0", + "System.Composition.Runtime": "8.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "System.Security.Principal.Windows": "4.5.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", + "dependencies": { + "System.Formats.Asn1": "5.0.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "9TPLGjBCGKmNvG8pjwPeuYy0SMVmGZRwlTZvyPHDbYv/DRkoeumJdfumaaDNQzVGMEmbWtg07zUpSW9q70IlDQ==", + "dependencies": { + "System.Formats.Asn1": "5.0.0", + "System.Security.Cryptography.Cng": "5.0.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "9gdyuARhUR7H+p5CjyUB/zPk7/Xut3wUSP8NJQB6iZr8L3XUXTMdoLeVAg9N4rqF8oIpE7MpdqHdDHQ7XgJe0g==", + "dependencies": { + "System.Security.AccessControl": "4.5.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "2hRjGu2r2jxRZ55wmcHO/WbdX+YAOz9x6FE8xqkHZgPaoFMKQZRe9dk8xTZIas8fRjxRmzawnTEWIrhlM+Un7w==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Dynamic.Runtime": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "timewarp.state.analyzer": { + "type": "Project", + "dependencies": { + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.11.0, )", + "Microsoft.CodeAnalysis.Common": "[4.11.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Fixie": { + "type": "CentralTransitive", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "/oRJPIMvzOfiunIegSF6FEa4VvBAUSXlbLDKxyzXuOZN9nLHg3fHuX6Mr9JZLNIupbe2xqQZEmfsPxgB01vCmg==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0]", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Composition": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Reflection.Metadata": "8.0.0", + "System.Threading.Channels": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "CentralTransitive", + "requested": "[17.11.1, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Scrutor": { + "type": "CentralTransitive", + "requested": "[4.2.2, )", + "resolved": "4.2.2", + "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "6.0.0", + "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/TimeWarp.State.Plus.Tests/packages.lock.json b/Tests/TimeWarp.State.Plus.Tests/packages.lock.json index 570faa289..de67742ad 100644 --- a/Tests/TimeWarp.State.Plus.Tests/packages.lock.json +++ b/Tests/TimeWarp.State.Plus.Tests/packages.lock.json @@ -1,535 +1,535 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "FakeItEasy": { - "type": "Direct", - "requested": "[8.3.0, )", - "resolved": "8.3.0", - "contentHash": "5QmShA6njFOhQHUYrFUjWEepfRcbQLOhgctaFhWyhPTi17kVGNyZOdvJ/2HhoNthmdghIzNsnZsMScJZhVBaQQ==", - "dependencies": { - "Castle.Core": "5.1.1" - } - }, - "Fixie.TestAdapter": { - "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", - "dependencies": { - "Fixie": "[3.4.0]", - "Microsoft.NET.Test.Sdk": "17.8.0", - "Mono.Cecil": "0.11.5" - } - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "NetArchTest.eNhancedEdition": { - "type": "Direct", - "requested": "[1.4.3, )", - "resolved": "1.4.3", - "contentHash": "BIfFixankK+EXZJB1n3IAnRqAnynPxIlEH0AVL1MmNws2dlMPoG9iJo+rWPHBLFxMp+1xTAodhT2ie7Wun9aTA==", - "dependencies": { - "Mono.Cecil": "0.11.5" - } - }, - "TimeWarp.Fixie": { - "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", - "dependencies": { - "Fixie": "3.4.0", - "Fixie.TestAdapter": "3.4.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Scrutor": "4.2.2" - } - }, - "Castle.Core": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", - "dependencies": { - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Mono.Cecil": { - "type": "Transitive", - "resolved": "0.11.5", - "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "timewarp.state.plus": { - "type": "Project", - "dependencies": { - "Blazored.LocalStorage": "[4.5.0, )", - "Blazored.SessionStorage": "[2.4.0, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "timewarp.state.policies": { - "type": "Project", - "dependencies": { - "FluentAssertions": "[6.12.1, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "NetArchTest.eNhancedEdition": "[1.4.3, )", - "TimeWarp.State": "[11.0.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Blazored.LocalStorage": { - "type": "CentralTransitive", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "8.0.0" - } - }, - "Blazored.SessionStorage": { - "type": "CentralTransitive", - "requested": "[2.4.0, )", - "resolved": "2.4.0", - "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", - "dependencies": { - "Microsoft.AspNetCore.Components.Web": "7.0.1" - } - }, - "Fixie": { - "type": "CentralTransitive", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "CentralTransitive", - "requested": "[17.11.1, )", - "resolved": "17.8.0", - "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", - "dependencies": { - "Microsoft.CodeCoverage": "17.8.0", - "Microsoft.TestPlatform.TestHost": "17.8.0" - } - }, - "Scrutor": { - "type": "CentralTransitive", - "requested": "[4.2.2, )", - "resolved": "4.2.2", - "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "6.0.0", - "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "FakeItEasy": { + "type": "Direct", + "requested": "[8.3.0, )", + "resolved": "8.3.0", + "contentHash": "5QmShA6njFOhQHUYrFUjWEepfRcbQLOhgctaFhWyhPTi17kVGNyZOdvJ/2HhoNthmdghIzNsnZsMScJZhVBaQQ==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "Fixie.TestAdapter": { + "type": "Direct", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", + "dependencies": { + "Fixie": "[3.4.0]", + "Microsoft.NET.Test.Sdk": "17.8.0", + "Mono.Cecil": "0.11.5" + } + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "NetArchTest.eNhancedEdition": { + "type": "Direct", + "requested": "[1.4.3, )", + "resolved": "1.4.3", + "contentHash": "BIfFixankK+EXZJB1n3IAnRqAnynPxIlEH0AVL1MmNws2dlMPoG9iJo+rWPHBLFxMp+1xTAodhT2ie7Wun9aTA==", + "dependencies": { + "Mono.Cecil": "0.11.5" + } + }, + "TimeWarp.Fixie": { + "type": "Direct", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", + "dependencies": { + "Fixie": "3.4.0", + "Fixie.TestAdapter": "3.4.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Scrutor": "4.2.2" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.5", + "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "timewarp.state.plus": { + "type": "Project", + "dependencies": { + "Blazored.LocalStorage": "[4.5.0, )", + "Blazored.SessionStorage": "[2.4.0, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "timewarp.state.policies": { + "type": "Project", + "dependencies": { + "FluentAssertions": "[6.12.1, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "NetArchTest.eNhancedEdition": "[1.4.3, )", + "TimeWarp.State": "[11.0.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Blazored.LocalStorage": { + "type": "CentralTransitive", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "6nZuJwA7zNIKx83IsObiHXZb09ponJOpCClU3en+hI8ZFvrOKXeOw+H7TegQZQrvdR1n9fkrVkEBQZg8vx6ZTw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.0" + } + }, + "Blazored.SessionStorage": { + "type": "CentralTransitive", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "e3XXH+zGGxDq1zC7YzLDD8mfvtoC6ESwTWOGD25H+FbPJlB7yQeL72hDY76tqkcrh98fh+y12r4BNhyQVV9YKw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "7.0.1" + } + }, + "Fixie": { + "type": "CentralTransitive", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "CentralTransitive", + "requested": "[17.11.1, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Scrutor": { + "type": "CentralTransitive", + "requested": "[4.2.2, )", + "resolved": "4.2.2", + "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "6.0.0", + "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/Tests/TimeWarp.State.Tests/packages.lock.json b/Tests/TimeWarp.State.Tests/packages.lock.json index 256c8c5cd..83b35990c 100644 --- a/Tests/TimeWarp.State.Tests/packages.lock.json +++ b/Tests/TimeWarp.State.Tests/packages.lock.json @@ -1,467 +1,467 @@ -{ - "version": 2, - "dependencies": { - "net8.0": { - "Fixie.TestAdapter": { - "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", - "dependencies": { - "Fixie": "[3.4.0]", - "Microsoft.NET.Test.Sdk": "17.8.0", - "Mono.Cecil": "0.11.5" - } - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.1, )", - "resolved": "6.12.1", - "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Direct", - "requested": "[3.3.4, )", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Direct", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "Microsoft.CodeAnalysis.Common": "[4.11.0]", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "TimeWarp.Fixie": { - "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", - "dependencies": { - "Fixie": "3.4.0", - "Fixie.TestAdapter": "3.4.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Scrutor": "4.2.2" - } - }, - "MediatR.Contracts": { - "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", - "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.17", - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "Microsoft.Extensions.Options": "8.0.2" - } - }, - "Microsoft.AspNetCore.Components": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", - "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.17", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" - } - }, - "Microsoft.AspNetCore.Components.Analyzers": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" - }, - "Microsoft.AspNetCore.Components.Forms": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17" - } - }, - "Microsoft.AspNetCore.Metadata": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.JSInterop": { - "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Mono.Cecil": { - "type": "Transitive", - "resolved": "0.11.5", - "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "timewarp.state": { - "type": "Project", - "dependencies": { - "AnyClone": "[1.1.6, )", - "JetBrains.Annotations": "[2024.2.0, )", - "MediatR": "[12.4.1, )", - "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", - "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", - "TypeSupport": "[1.2.0, )" - } - }, - "AnyClone": { - "type": "CentralTransitive", - "requested": "[1.1.6, )", - "resolved": "1.1.6", - "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" - }, - "Fixie": { - "type": "CentralTransitive", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" - }, - "JetBrains.Annotations": { - "type": "CentralTransitive", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" - }, - "MediatR": { - "type": "CentralTransitive", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", - "dependencies": { - "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.AspNetCore.Components.Web": { - "type": "CentralTransitive", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", - "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.17", - "Microsoft.AspNetCore.Components.Forms": "8.0.17", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.17", - "System.IO.Pipelines": "8.0.0" - } - }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.11.0, )", - "resolved": "4.11.0", - "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "8.0.0", - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "CentralTransitive", - "requested": "[6.0.0, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "CentralTransitive", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "CentralTransitive", - "requested": "[17.11.1, )", - "resolved": "17.8.0", - "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", - "dependencies": { - "Microsoft.CodeCoverage": "17.8.0", - "Microsoft.TestPlatform.TestHost": "17.8.0" - } - }, - "Scrutor": { - "type": "CentralTransitive", - "requested": "[4.2.2, )", - "resolved": "4.2.2", - "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "System.Text.Json": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "6.0.0", - "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "TypeSupport": { - "type": "CentralTransitive", - "requested": "[1.2.0, )", - "resolved": "1.2.0", - "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", - "dependencies": { - "System.Reflection.Emit": "4.3.0" - } - } - } - } +{ + "version": 2, + "dependencies": { + "net8.0": { + "Fixie.TestAdapter": { + "type": "Direct", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "KQBF/t82Ax/09CuF4GuYOCshfA72YGvMh3t8EGLeqsCLdZmWhR6Lz0IIsbDkS9DrECK7l03WTufHe0D7Mq6WBw==", + "dependencies": { + "Fixie": "[3.4.0]", + "Microsoft.NET.Test.Sdk": "17.8.0", + "Mono.Cecil": "0.11.5" + } + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.1, )", + "resolved": "6.12.1", + "contentHash": "hciWwryyLw3eonfqhFpOMTXyM1/auJChYslEBA+iGJyuBs5O3t/kA8YaeH4iRo/2Fe3ElSYL86C0miivtZ0f3g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Direct", + "requested": "[3.3.4, )", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Direct", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "Microsoft.CodeAnalysis.Common": "[4.11.0]", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "TimeWarp.Fixie": { + "type": "Direct", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "Nl+GAq89Wf2AC9+dyoAlL97n2POB2RSM6fbis24p3+r6EYoBrDYhYG77gVvp1h19BP965qJnNiTSKBPGxoALxw==", + "dependencies": { + "Fixie": "3.4.0", + "Fixie.TestAdapter": "3.4.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Scrutor": "4.2.2" + } + }, + "MediatR.Contracts": { + "type": "Transitive", + "resolved": "2.0.1", + "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "3trCSwZ919JFidsglUPnWANfEIACjGrQ1Vo82nu83p8WLhH6XMBOSI/GZIuscfcXJcYKlVPwlFNKhYbJxF2vZg==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.17", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "eHCM+/J/Ejpu6X0MWI0eXwqRAA4iaLhH6kiPkaiOPUtbABMSBJSnfSV7hW38PzkSrpdb+sTqmCEqusxJfjeljQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.17", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.17" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "QHAATSz19jRVeDjvlauvhqrWwPnAOZ/VbkvcyisGe+NPTZO3+9UBV3b/Ro/DupTcqf/MThtQwHy7Bc8UGb0uAg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "XjY/AJQ+L/c5BHIR8wLp7US/yNb+8kCGFhPIi65z64AV6DVQYCPOArKd1kWSoQrXU0cVugFsFWEJ0dta7bujRg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "VN8osKYj9qgEYsUdO9HRqeP6nuQ13R92u+YtetNlj3I3ZzIvXm8xYFykcmqJr4EGBvKPeXCgdMQJ+7GIdqcrQg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.17", + "contentHash": "vzWgD6toH1Y9L9TxTQ8M1mKff59Kl1z2fOFg8XHAan1k6yBaE5SLePOihAUJaUn0SpWiUszz5Ctl5cEL4x0SHw==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.5", + "contentHash": "fxfX+0JGTZ8YQeu1MYjbBiK2CYTSzDyEeIixt+yqKKTn7FW8rv7JMY70qevup4ZJfD7Kk/VG/jDzQQTpfch87g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "timewarp.state": { + "type": "Project", + "dependencies": { + "AnyClone": "[1.1.6, )", + "JetBrains.Annotations": "[2024.2.0, )", + "MediatR": "[12.4.1, )", + "Microsoft.AspNetCore.Components.Web": "[8.0.17, )", + "Microsoft.CodeAnalysis.CSharp": "[4.11.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )", + "TypeSupport": "[1.2.0, )" + } + }, + "AnyClone": { + "type": "CentralTransitive", + "requested": "[1.1.6, )", + "resolved": "1.1.6", + "contentHash": "iksQmOt2vCnFupLXxEY/o9PJabQj9N1wzWIMR07QqoY/QWctbKS8KLRHXCvQINH+EJtez5de+Z8+UeyndNhKsw==" + }, + "Fixie": { + "type": "CentralTransitive", + "requested": "[3.4.0, )", + "resolved": "3.4.0", + "contentHash": "Rn+KhQIobYpMC8+S3Fk48wgpo8zljYsgT+M84q5csNJM5AzyVebcIIPAv5DXb+lJuKaOCG3ntpTdTEUPOJAHOA==" + }, + "JetBrains.Annotations": { + "type": "CentralTransitive", + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + }, + "MediatR": { + "type": "CentralTransitive", + "requested": "[12.4.1, )", + "resolved": "12.4.1", + "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "dependencies": { + "MediatR.Contracts": "[2.0.1, 3.0.0)", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "CentralTransitive", + "requested": "[8.0.17, )", + "resolved": "8.0.17", + "contentHash": "yLm+c5g+pK1oSQUPazQFSiPmPEY3ZbIDJZc9owN5DQ+UpNvC7fwjo/kIcYjfIhKKIiOI1hjTcIo5ccSp50L8JQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.17", + "Microsoft.AspNetCore.Components.Forms": "8.0.17", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.17", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.CodeAnalysis.Common": { + "type": "CentralTransitive", + "requested": "[4.11.0, )", + "resolved": "4.11.0", + "contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "CentralTransitive", + "requested": "[6.0.0, )", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "CentralTransitive", + "requested": "[17.11.1, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Scrutor": { + "type": "CentralTransitive", + "requested": "[4.2.2, )", + "resolved": "4.2.2", + "contentHash": "t5VIYA7WJXoJJo7s4DoHakMGwTu+MeEnZumMOhTCH7kz9xWha24G7dJNxWrHPlu0ZdZAS4jDZCxxAnyaBh7uYw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Text.Json": { + "type": "CentralTransitive", + "requested": "[8.0.1, )", + "resolved": "6.0.0", + "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "TypeSupport": { + "type": "CentralTransitive", + "requested": "[1.2.0, )", + "resolved": "1.2.0", + "contentHash": "XwwO/N0Sf4gwjkFP2VcclVhbKZV3mNNvtESnkjKHSxw8UuCJiugBUGuoLCFi52YoD4xuLYONSB0iaE5II+Ib3w==", + "dependencies": { + "System.Reflection.Emit": "4.3.0" + } + } + } + } } \ No newline at end of file diff --git a/cline.ps1 b/cline.ps1 index 7ffda34c5..77370707d 100644 --- a/cline.ps1 +++ b/cline.ps1 @@ -1,27 +1,27 @@ -# Define the list of files to concatenate -$files = @( - ".ai/00-confirmation.md", - ".ai/01-user.md", - ".ai/02-development-process.md", - ".ai/03-environment.md", - ".ai/04-csharp-coding-standards.md", - ".ai/05-dotnet-conventions.md" -) - -# Initialize an empty array to store the content -$content = @() - -# Loop through each file -foreach ($file in $files) { - # Read the file content and add it to the array - $content += (Get-Content $file -Raw) # + "`n" -} - -# Join all the content into a single string -$combinedContent = $content -join "`n" - -# Output the combined content (you can redirect this to a file if needed) -$combinedContent - -# Optionally, save to a file +# Define the list of files to concatenate +$files = @( + ".ai/00-confirmation.md", + ".ai/01-user.md", + ".ai/02-development-process.md", + ".ai/03-environment.md", + ".ai/04-csharp-coding-standards.md", + ".ai/05-dotnet-conventions.md" +) + +# Initialize an empty array to store the content +$content = @() + +# Loop through each file +foreach ($file in $files) { + # Read the file content and add it to the array + $content += (Get-Content $file -Raw) # + "`n" +} + +# Join all the content into a single string +$combinedContent = $content -join "`n" + +# Output the combined content (you can redirect this to a file if needed) +$combinedContent + +# Optionally, save to a file $combinedContent | Out-File -FilePath ".clinerules" \ No newline at end of file