diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 9146253..a01b2eb 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -17,6 +17,16 @@ updates:
patterns:
- "Aspire.*"
+ - package-ecosystem: "npm"
+ directory: "/Documentations"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ open-pull-requests-limit: 5
+ labels:
+ - "dependencies"
+ - "documentation"
+
- package-ecosystem: "github-actions"
directory: "/"
schedule:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..7c013ba
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,86 @@
+name: CI
+
+on:
+ push:
+ branches: ['**']
+ pull_request:
+ branches: [main]
+
+permissions:
+ contents: read
+
+env:
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+ DOTNET_NOLOGO: true
+ DOTNET_VERSION: '10.0.x'
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
+
+jobs:
+ build-and-test:
+ name: Build & Test
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup .NET ${{ env.DOTNET_VERSION }}
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Cache NuGet packages
+ uses: actions/cache@v4
+ with:
+ path: ~/.nuget/packages
+ key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj', '**/*.slnx') }}
+ restore-keys: nuget-${{ runner.os }}-
+
+ - name: Restore dependencies
+ run: dotnet restore CaeriusNet.slnx
+
+ - name: Build (Release)
+ run: |
+ dotnet build CaeriusNet.slnx \
+ --configuration Release \
+ --no-restore \
+ -p:TreatWarningsAsErrors=true \
+ -p:WarningLevel=4
+
+ - name: Run tests with coverage
+ run: |
+ dotnet test CaeriusNet.slnx \
+ --configuration Release \
+ --no-restore \
+ --no-build \
+ --collect:"XPlat Code Coverage" \
+ --results-directory ./coverage \
+ --logger "trx;LogFileName=test-results.trx" \
+ --logger "console;verbosity=normal" \
+ -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura
+
+ - name: Upload coverage reports
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: coverage-reports
+ path: ./coverage/**/coverage.cobertura.xml
+ retention-days: 14
+
+ - name: Upload test results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: test-results
+ path: ./coverage/**/*.trx
+ retention-days: 14
+
+ - name: Upload coverage to Codecov
+ uses: codecov/codecov-action@v5
+ if: success() && secrets.CODECOV_TOKEN != ''
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: ./coverage/**/coverage.cobertura.xml
+ flags: unittests
+ name: caeriusnet-coverage
+ fail_ci_if_error: false
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..e3c2c29
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,63 @@
+name: CodeQL Security Analysis
+
+on:
+ push:
+ branches: [main, 'feature/**']
+ pull_request:
+ branches: [main]
+ schedule:
+ - cron: '0 3 * * 1' # Monday 03:00 UTC
+
+permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+env:
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+ DOTNET_NOLOGO: true
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
+
+jobs:
+ analyze:
+ name: CodeQL Analysis — C#
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [csharp]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v3
+ with:
+ languages: ${{ matrix.language }}
+ queries: security-extended
+ config: |
+ paths-ignore:
+ - Benchmark/**
+ - Exemples/**
+ - Documentations/**
+
+ - name: Setup .NET 10
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '10.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore CaeriusNet.slnx
+
+ - name: Build for CodeQL
+ run: |
+ dotnet build CaeriusNet.slnx \
+ --configuration Release \
+ --no-restore
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v3
+ with:
+ category: /language:${{ matrix.language }}
+ upload: true
diff --git a/.github/workflows/github-pages-deploy.yml b/.github/workflows/github-pages-deploy.yml
index 68f6c3b..f8173ed 100644
--- a/.github/workflows/github-pages-deploy.yml
+++ b/.github/workflows/github-pages-deploy.yml
@@ -26,6 +26,9 @@ concurrency:
group: pages
cancel-in-progress: false
+env:
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
+
jobs:
# Build job
build:
@@ -50,6 +53,9 @@ jobs:
- name: Install dependencies
working-directory: Documentations
run: npm ci # or pnpm install / yarn install / bun install
+ - name: Audit npm dependencies
+ working-directory: Documentations
+ run: npm audit --audit-level=high
- name: Build with VitePress
working-directory: Documentations
run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
diff --git a/.github/workflows/nuget-dotnet.yml b/.github/workflows/nuget-dotnet.yml
index 1cdb3d1..82f910a 100644
--- a/.github/workflows/nuget-dotnet.yml
+++ b/.github/workflows/nuget-dotnet.yml
@@ -24,6 +24,7 @@ env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
jobs:
bump-version:
@@ -59,11 +60,48 @@ jobs:
git commit -m "chore: bump version to ${{ steps.bump.outputs.new_version }} [skip ci]"
git push
- build:
- name: Build and Pack
+ test:
+ name: Test & Validate
runs-on: ubuntu-latest
needs: [bump-version]
if: always() && (needs.bump-version.result == 'success' || needs.bump-version.result == 'skipped')
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '10.0.x'
+
+ - name: Cache NuGet packages
+ uses: actions/cache@v4
+ with:
+ path: ~/.nuget/packages
+ key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj', '**/*.slnx') }}
+ restore-keys: nuget-${{ runner.os }}-
+
+ - name: Restore Dependencies
+ run: dotnet restore CaeriusNet.slnx
+
+ - name: Build
+ run: dotnet build CaeriusNet.slnx --configuration Release --no-restore
+
+ - name: Run Tests
+ run: |
+ dotnet test CaeriusNet.slnx \
+ --configuration Release \
+ --no-restore \
+ --no-build \
+ --collect:"XPlat Code Coverage" \
+ --results-directory ./coverage \
+ --logger "console;verbosity=normal"
+
+ build:
+ name: Build and Pack
+ runs-on: ubuntu-latest
+ needs: [test]
+ if: always() && needs.test.result == 'success'
steps:
- name: Checkout Repository
uses: actions/checkout@v4
@@ -73,8 +111,14 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
- dotnet-version: |
- 10.0.x
+ dotnet-version: '10.0.x'
+
+ - name: Cache NuGet packages
+ uses: actions/cache@v4
+ with:
+ path: ~/.nuget/packages
+ key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj', '**/*.slnx') }}
+ restore-keys: nuget-${{ runner.os }}-
- name: Restore Dependencies
run: dotnet restore Src/CaeriusNet.csproj
@@ -82,8 +126,14 @@ jobs:
- name: Build CaeriusNet
run: dotnet build Src/CaeriusNet.csproj --configuration Release --no-restore
- - name: Pack CaeriusNet
- run: dotnet pack Src/CaeriusNet.csproj --configuration Release --no-build --output ./packages
+ - name: Pack CaeriusNet (nupkg + snupkg)
+ run: >
+ dotnet pack Src/CaeriusNet.csproj
+ --configuration Release
+ --no-build
+ --output ./packages
+ -p:IncludeSymbols=true
+ -p:SymbolPackageFormat=snupkg
- name: Upload Package Artifacts
uses: actions/upload-artifact@v4
@@ -105,4 +155,12 @@ jobs:
path: ./packages
- name: Publish CaeriusNet to NuGet
- run: dotnet nuget push ./packages/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
\ No newline at end of file
+ run: |
+ dotnet nuget push ./packages/*.nupkg \
+ --api-key ${{ secrets.NUGET_API_KEY }} \
+ --source https://api.nuget.org/v3/index.json \
+ --skip-duplicate
+ dotnet nuget push ./packages/*.snupkg \
+ --api-key ${{ secrets.NUGET_API_KEY }} \
+ --source https://api.nuget.org/v3/index.json \
+ --skip-duplicate || true
\ No newline at end of file
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
new file mode 100644
index 0000000..3394ff5
--- /dev/null
+++ b/.github/workflows/security.yml
@@ -0,0 +1,103 @@
+name: Security Audit
+
+on:
+ pull_request:
+ branches: [main]
+ push:
+ branches: [main]
+ schedule:
+ - cron: '0 4 * * 1' # Monday 04:00 UTC
+
+env:
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+ DOTNET_NOLOGO: true
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
+
+jobs:
+ dependency-review:
+ name: Dependency Review (PR only)
+ runs-on: ubuntu-latest
+ if: github.event_name == 'pull_request'
+ permissions:
+ contents: read
+ pull-requests: write
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Dependency Review
+ uses: actions/dependency-review-action@v4
+ with:
+ fail-on-severity: high
+ deny-licenses: GPL-2.0, GPL-3.0, AGPL-3.0
+ comment-summary-in-pr: always
+
+ vulnerability-scan:
+ name: Vulnerable Package Scan
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup .NET 10
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '10.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore CaeriusNet.slnx
+
+ - name: Scan for vulnerable packages (main library)
+ run: |
+ echo "=== Scanning Src/CaeriusNet.csproj for vulnerabilities ==="
+ RESULT=$(dotnet list Src/CaeriusNet.csproj package --vulnerable --include-transitive --format json 2>&1)
+ echo "$RESULT"
+ VULN_COUNT=$(echo "$RESULT" | jq '[.projects[].frameworks[] | ((.topLevelPackages // [])[], (.transitivePackages // [])[]) | select((.vulnerabilities // []) | length > 0)] | length' || echo 0)
+ if [ "$VULN_COUNT" -gt 0 ]; then
+ echo "::error title=Vulnerable Packages::Vulnerable NuGet packages detected in CaeriusNet! See log for details."
+ exit 1
+ fi
+ echo "✅ No vulnerable packages found in main library."
+
+ - name: Scan for vulnerable packages (source generator)
+ run: |
+ echo "=== Scanning SourceGenerators/CaeriusNet.Generator.csproj for vulnerabilities ==="
+ RESULT=$(dotnet list SourceGenerators/CaeriusNet.Generator.csproj package --vulnerable --include-transitive --format json 2>&1)
+ echo "$RESULT"
+ VULN_COUNT=$(echo "$RESULT" | jq '[.projects[].frameworks[] | ((.topLevelPackages // [])[], (.transitivePackages // [])[]) | select((.vulnerabilities // []) | length > 0)] | length' || echo 0)
+ if [ "$VULN_COUNT" -gt 0 ]; then
+ echo "::error title=Vulnerable Packages::Vulnerable NuGet packages detected in CaeriusNet.Generator! See log for details."
+ exit 1
+ fi
+ echo "✅ No vulnerable packages found in source generator."
+
+ - name: Scan for vulnerable packages (test projects, informational)
+ run: |
+ echo "=== Scanning test projects for vulnerabilities (non-blocking) ==="
+ RESULT_TESTS=$(dotnet list Tests/CaeriusNet.Tests/CaeriusNet.Tests.csproj package --vulnerable --include-transitive --format json 2>&1 || true)
+ RESULT_GEN=$(dotnet list Tests/CaeriusNet.Generator.Tests/CaeriusNet.Generator.Tests.csproj package --vulnerable --include-transitive --format json 2>&1 || true)
+ echo "$RESULT_TESTS"
+ echo "$RESULT_GEN"
+ VULN_COUNT=$(( \
+ $(echo "$RESULT_TESTS" | jq '[.projects[].frameworks[] | ((.topLevelPackages // [])[], (.transitivePackages // [])[]) | select((.vulnerabilities // []) | length > 0)] | length' || echo 0) + \
+ $(echo "$RESULT_GEN" | jq '[.projects[].frameworks[] | ((.topLevelPackages // [])[], (.transitivePackages // [])[]) | select((.vulnerabilities // []) | length > 0)] | length' || echo 0) \
+ ))
+ if [ "$VULN_COUNT" -gt 0 ]; then
+ echo "::warning title=Vulnerable Packages::Vulnerable packages found in test projects (non-blocking)."
+ else
+ echo "✅ No vulnerable packages found in test projects."
+ fi
+ if [ "$VULN_COUNT" -gt 0 ]; then
+ echo "::warning title=Vulnerable Packages::Vulnerable packages found in test projects (non-blocking)."
+ else
+ echo "✅ No vulnerable packages found in test projects."
+ fi
+
+ - name: Report outdated packages (informational)
+ run: |
+ echo "=== Outdated packages (informational, non-blocking) ==="
+ dotnet list Src/CaeriusNet.csproj package --outdated || true
+ continue-on-error: true
diff --git a/Documentations/package-lock.json b/Documentations/package-lock.json
deleted file mode 100644
index 3781de3..0000000
--- a/Documentations/package-lock.json
+++ /dev/null
@@ -1,2226 +0,0 @@
-{
- "name": "Documentations",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "devDependencies": {
- "vitepress": "^2.0.0-alpha.12"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
- "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
- "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.28.2"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
- "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@docsearch/css": {
- "version": "4.0.0-beta.7",
- "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.0.0-beta.7.tgz",
- "integrity": "sha512-hBIwf14yLasrUcDNS7jrneM1ibFD/JFJVDjdxd1h/LUHx7eyLrS726pKHVr3cTdToNXP/7jrTbnC1MAuDHPoow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@docsearch/js": {
- "version": "4.0.0-beta.7",
- "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.0.0-beta.7.tgz",
- "integrity": "sha512-0RJALbDpLMuFy3H/26rjms/qwi5KjsGMN8Lu4k/bs6kBfOWHUN6Dzg/ybj8qB2OLdT2UegsavRIDZKW3QrzQ4Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
- "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
- "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
- "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
- "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
- "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
- "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
- "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
- "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
- "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
- "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
- "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
- "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
- "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
- "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
- "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
- "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
- "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
- "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
- "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
- "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
- "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
- "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
- "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
- "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
- "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
- "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@iconify-json/simple-icons": {
- "version": "1.2.48",
- "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.48.tgz",
- "integrity": "sha512-EACOtZMoPJtERiAbX1De0asrrCtlwI27+03c9OJlYWsly9w1O5vcD8rTzh+kDPjo+K8FOVnq2Qy+h/CzljSKDA==",
- "dev": true,
- "license": "CC0-1.0",
- "dependencies": {
- "@iconify/types": "*"
- }
- },
- "node_modules/@iconify/types": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
- "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-beta.29",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz",
- "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.4.tgz",
- "integrity": "sha512-B2wfzCJ+ps/OBzRjeds7DlJumCU3rXMxJJS1vzURyj7+KBHGONm7c9q1TfdBl4vCuNMkDvARn3PBl2wZzuR5mw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.4.tgz",
- "integrity": "sha512-FGJYXvYdn8Bs6lAlBZYT5n+4x0ciEp4cmttsvKAZc/c8/JiPaQK8u0c/86vKX8lA7OY/+37lIQSe0YoAImvBAA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.4.tgz",
- "integrity": "sha512-/9qwE/BM7ATw/W/OFEMTm3dmywbJyLQb4f4v5nmOjgYxPIGpw7HaxRi6LnD4Pjn/q7k55FGeHe1/OD02w63apA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.4.tgz",
- "integrity": "sha512-QkWfNbeRuzFnv2d0aPlrzcA3Ebq2mE8kX/5Pl7VdRShbPBjSnom7dbT8E3Jmhxo2RL784hyqGvR5KHavCJQciw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.4.tgz",
- "integrity": "sha512-+ToyOMYnSfV8D+ckxO6NthPln/PDNp1P6INcNypfZ7muLmEvPKXqduUiD8DlJpMMT8LxHcE5W0dK9kXfJke9Zw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.4.tgz",
- "integrity": "sha512-cGT6ey/W+sje6zywbLiqmkfkO210FgRz7tepWAzzEVgQU8Hn91JJmQWNqs55IuglG8sJdzk7XfNgmGRtcYlo1w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.4.tgz",
- "integrity": "sha512-9fhTJyOb275w5RofPSl8lpr4jFowd+H4oQKJ9XTYzD1JWgxdZKE8bA6d4npuiMemkecQOcigX01FNZNCYnQBdA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.4.tgz",
- "integrity": "sha512-+6kCIM5Zjvz2HwPl/udgVs07tPMIp1VU2Y0c72ezjOvSvEfAIWsUgpcSDvnC7g9NrjYR6X9bZT92mZZ90TfvXw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.4.tgz",
- "integrity": "sha512-SWuXdnsayCZL4lXoo6jn0yyAj7TTjWE4NwDVt9s7cmu6poMhtiras5c8h6Ih6Y0Zk6Z+8t/mLumvpdSPTWub2Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.4.tgz",
- "integrity": "sha512-vDknMDqtMhrrroa5kyX6tuC0aRZZlQ+ipDfbXd2YGz5HeV2t8HOl/FDAd2ynhs7Ki5VooWiiZcCtxiZ4IjqZwQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.4.tgz",
- "integrity": "sha512-mCBkjRZWhvjtl/x+Bd4fQkWZT8canStKDxGrHlBiTnZmJnWygGcvBylzLVCZXka4dco5ymkWhZlLwKCGFF4ivw==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.4.tgz",
- "integrity": "sha512-YMdz2phOTFF+Z66dQfGf0gmeDSi5DJzY5bpZyeg9CPBkV9QDzJ1yFRlmi/j7WWRf3hYIWrOaJj5jsfwgc8GTHQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.4.tgz",
- "integrity": "sha512-r0WKLSfFAK8ucG024v2yiLSJMedoWvk8yWqfNICX28NHDGeu3F/wBf8KG6mclghx4FsLePxJr/9N8rIj1PtCnw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.4.tgz",
- "integrity": "sha512-IaizpPP2UQU3MNyPH1u0Xxbm73D+4OupL0bjo4Hm0496e2wg3zuvoAIhubkD1NGy9fXILEExPQy87mweujEatA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.4.tgz",
- "integrity": "sha512-aCM29orANR0a8wk896p6UEgIfupReupnmISz6SUwMIwTGaTI8MuKdE0OD2LvEg8ondDyZdMvnaN3bW4nFbATPA==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.4.tgz",
- "integrity": "sha512-0Xj1vZE3cbr/wda8d/m+UeuSL+TDpuozzdD4QaSzu/xSOMK0Su5RhIkF7KVHFQsobemUNHPLEcYllL7ZTCP/Cg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.4.tgz",
- "integrity": "sha512-kM/orjpolfA5yxsx84kI6bnK47AAZuWxglGKcNmokw2yy9i5eHY5UAjcX45jemTJnfHAWo3/hOoRqEeeTdL5hw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.4.tgz",
- "integrity": "sha512-cNLH4psMEsWKILW0isbpQA2OvjXLbKvnkcJFmqAptPQbtLrobiapBJVj6RoIvg6UXVp5w0wnIfd/Q56cNpF+Ew==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.4.tgz",
- "integrity": "sha512-OiEa5lRhiANpv4SfwYVgQ3opYWi/QmPDC5ve21m8G9pf6ZO+aX1g2EEF1/IFaM1xPSP7mK0msTRXlPs6mIagkg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.4.tgz",
- "integrity": "sha512-IKL9mewGZ5UuuX4NQlwOmxPyqielvkAPUS2s1cl6yWjjQvyN3h5JTdVFGD5Jr5xMjRC8setOfGQDVgX8V+dkjg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@shikijs/core": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.11.0.tgz",
- "integrity": "sha512-oJwU+DxGqp6lUZpvtQgVOXNZcVsirN76tihOLBmwILkKuRuwHteApP8oTXmL4tF5vS5FbOY0+8seXmiCoslk4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "3.11.0",
- "@shikijs/vscode-textmate": "^10.0.2",
- "@types/hast": "^3.0.4",
- "hast-util-to-html": "^9.0.5"
- }
- },
- "node_modules/@shikijs/engine-javascript": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.11.0.tgz",
- "integrity": "sha512-6/ov6pxrSvew13k9ztIOnSBOytXeKs5kfIR7vbhdtVRg+KPzvp2HctYGeWkqv7V6YIoLicnig/QF3iajqyElZA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "3.11.0",
- "@shikijs/vscode-textmate": "^10.0.2",
- "oniguruma-to-es": "^4.3.3"
- }
- },
- "node_modules/@shikijs/engine-oniguruma": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.11.0.tgz",
- "integrity": "sha512-4DwIjIgETK04VneKbfOE4WNm4Q7WC1wo95wv82PoHKdqX4/9qLRUwrfKlmhf0gAuvT6GHy0uc7t9cailk6Tbhw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "3.11.0",
- "@shikijs/vscode-textmate": "^10.0.2"
- }
- },
- "node_modules/@shikijs/langs": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.11.0.tgz",
- "integrity": "sha512-Njg/nFL4HDcf/ObxcK2VeyidIq61EeLmocrwTHGGpOQx0BzrPWM1j55XtKQ1LvvDWH15cjQy7rg96aJ1/l63uw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "3.11.0"
- }
- },
- "node_modules/@shikijs/themes": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.11.0.tgz",
- "integrity": "sha512-BhhWRzCTEk2CtWt4S4bgsOqPJRkapvxdsifAwqP+6mk5uxboAQchc0etiJ0iIasxnMsb764qGD24DK9albcU9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "3.11.0"
- }
- },
- "node_modules/@shikijs/transformers": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.11.0.tgz",
- "integrity": "sha512-fhSpVoq0FoCtKbBpzE3mXcIbr0b7ozFDSSWiVjWrQy+wrOfaFfwxgJqh8kY3Pbv/i+4pcuMIVismLD2MfO62eQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/core": "3.11.0",
- "@shikijs/types": "3.11.0"
- }
- },
- "node_modules/@shikijs/types": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.11.0.tgz",
- "integrity": "sha512-RB7IMo2E7NZHyfkqAuaf4CofyY8bPzjWPjJRzn6SEak3b46fIQyG6Vx5fG/obqkfppQ+g8vEsiD7Uc6lqQt32Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/vscode-textmate": "^10.0.2",
- "@types/hast": "^3.0.4"
- }
- },
- "node_modules/@shikijs/vscode-textmate": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
- "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
- "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/markdown-it": {
- "version": "14.1.2",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
- "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/linkify-it": "^5",
- "@types/mdurl": "^2"
- }
- },
- "node_modules/@types/mdast": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
- "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/unist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
- "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/web-bluetooth": {
- "version": "0.0.21",
- "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
- "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
- "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/@vitejs/plugin-vue": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz",
- "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rolldown/pluginutils": "1.0.0-beta.29"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "peerDependencies": {
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
- "vue": "^3.2.25"
- }
- },
- "node_modules/@vue/compiler-core": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.19.tgz",
- "integrity": "sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.28.3",
- "@vue/shared": "3.5.19",
- "entities": "^4.5.0",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-dom": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.19.tgz",
- "integrity": "sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-core": "3.5.19",
- "@vue/shared": "3.5.19"
- }
- },
- "node_modules/@vue/compiler-sfc": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.19.tgz",
- "integrity": "sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.28.3",
- "@vue/compiler-core": "3.5.19",
- "@vue/compiler-dom": "3.5.19",
- "@vue/compiler-ssr": "3.5.19",
- "@vue/shared": "3.5.19",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.17",
- "postcss": "^8.5.6",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-ssr": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.19.tgz",
- "integrity": "sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-dom": "3.5.19",
- "@vue/shared": "3.5.19"
- }
- },
- "node_modules/@vue/devtools-api": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.0.tgz",
- "integrity": "sha512-I2jF/knesMU36zTw1hnExjoixDZvDoantiWKVrHpLd2J160zqqe8vp3vrGfjWdfuHmPJwSXe/YNG3rYOYiwy1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/devtools-kit": "^8.0.0"
- }
- },
- "node_modules/@vue/devtools-kit": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.0.tgz",
- "integrity": "sha512-b11OeQODkE0bctdT0RhL684pEV2DPXJ80bjpywVCbFn1PxuL3bmMPDoJKjbMnnoWbrnUYXYzFfmMWBZAMhORkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/devtools-shared": "^8.0.0",
- "birpc": "^2.5.0",
- "hookable": "^5.5.3",
- "mitt": "^3.0.1",
- "perfect-debounce": "^1.0.0",
- "speakingurl": "^14.0.1",
- "superjson": "^2.2.2"
- }
- },
- "node_modules/@vue/devtools-shared": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.0.tgz",
- "integrity": "sha512-jrKnbjshQCiOAJanoeJjTU7WaCg0Dz2BUal6SaR6VM/P3hiFdX5Q6Pxl73ZMnrhCxNK9nAg5hvvRGqs+6dtU1g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "rfdc": "^1.4.1"
- }
- },
- "node_modules/@vue/reactivity": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.19.tgz",
- "integrity": "sha512-4bueZg2qs5MSsK2dQk3sssV0cfvxb/QZntTC8v7J448GLgmfPkQ+27aDjlt40+XFqOwUq5yRxK5uQh14Fc9eVA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/shared": "3.5.19"
- }
- },
- "node_modules/@vue/runtime-core": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.19.tgz",
- "integrity": "sha512-TaooCr8Hge1sWjLSyhdubnuofs3shhzZGfyD11gFolZrny76drPwBVQj28/z/4+msSFb18tOIg6VVVgf9/IbIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/reactivity": "3.5.19",
- "@vue/shared": "3.5.19"
- }
- },
- "node_modules/@vue/runtime-dom": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.19.tgz",
- "integrity": "sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/reactivity": "3.5.19",
- "@vue/runtime-core": "3.5.19",
- "@vue/shared": "3.5.19",
- "csstype": "^3.1.3"
- }
- },
- "node_modules/@vue/server-renderer": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.19.tgz",
- "integrity": "sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-ssr": "3.5.19",
- "@vue/shared": "3.5.19"
- },
- "peerDependencies": {
- "vue": "3.5.19"
- }
- },
- "node_modules/@vue/shared": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.19.tgz",
- "integrity": "sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@vueuse/core": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.7.0.tgz",
- "integrity": "sha512-myagn09+c6BmS6yHc1gTwwsdZilAovHslMjyykmZH3JNyzI5HoWhv114IIdytXiPipdHJ2gDUx0PB93jRduJYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/web-bluetooth": "^0.0.21",
- "@vueuse/metadata": "13.7.0",
- "@vueuse/shared": "13.7.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "vue": "^3.5.0"
- }
- },
- "node_modules/@vueuse/integrations": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.7.0.tgz",
- "integrity": "sha512-Na5p0ONLepNV/xCBi8vBMuzCOZh9CFT/OHnrUlABWXgWTWSHM3wrVaLS1xvAijPLU5B1ysyJDDW/hKak80oLGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vueuse/core": "13.7.0",
- "@vueuse/shared": "13.7.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "async-validator": "^4",
- "axios": "^1",
- "change-case": "^5",
- "drauu": "^0.4",
- "focus-trap": "^7",
- "fuse.js": "^7",
- "idb-keyval": "^6",
- "jwt-decode": "^4",
- "nprogress": "^0.2",
- "qrcode": "^1.5",
- "sortablejs": "^1",
- "universal-cookie": "^7 || ^8",
- "vue": "^3.5.0"
- },
- "peerDependenciesMeta": {
- "async-validator": {
- "optional": true
- },
- "axios": {
- "optional": true
- },
- "change-case": {
- "optional": true
- },
- "drauu": {
- "optional": true
- },
- "focus-trap": {
- "optional": true
- },
- "fuse.js": {
- "optional": true
- },
- "idb-keyval": {
- "optional": true
- },
- "jwt-decode": {
- "optional": true
- },
- "nprogress": {
- "optional": true
- },
- "qrcode": {
- "optional": true
- },
- "sortablejs": {
- "optional": true
- },
- "universal-cookie": {
- "optional": true
- }
- }
- },
- "node_modules/@vueuse/metadata": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.7.0.tgz",
- "integrity": "sha512-8okFhS/1ite8EwUdZZfvTYowNTfXmVCOrBFlA31O0HD8HKXhY+WtTRyF0LwbpJfoFPc+s9anNJIXMVrvP7UTZg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/shared": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.7.0.tgz",
- "integrity": "sha512-Wi2LpJi4UA9kM0OZ0FCZslACp92HlVNw1KPaDY6RAzvQ+J1s7seOtcOpmkfbD5aBSmMn9NvOakc8ZxMxmDXTIg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "vue": "^3.5.0"
- }
- },
- "node_modules/birpc": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
- "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-html4": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
- "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-legacy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
- "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
- "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/copy-anything": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
- "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-what": "^4.1.8"
- },
- "engines": {
- "node": ">=12.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/mesqueeb"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/devlop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
- "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dequal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
- "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.9",
- "@esbuild/android-arm": "0.25.9",
- "@esbuild/android-arm64": "0.25.9",
- "@esbuild/android-x64": "0.25.9",
- "@esbuild/darwin-arm64": "0.25.9",
- "@esbuild/darwin-x64": "0.25.9",
- "@esbuild/freebsd-arm64": "0.25.9",
- "@esbuild/freebsd-x64": "0.25.9",
- "@esbuild/linux-arm": "0.25.9",
- "@esbuild/linux-arm64": "0.25.9",
- "@esbuild/linux-ia32": "0.25.9",
- "@esbuild/linux-loong64": "0.25.9",
- "@esbuild/linux-mips64el": "0.25.9",
- "@esbuild/linux-ppc64": "0.25.9",
- "@esbuild/linux-riscv64": "0.25.9",
- "@esbuild/linux-s390x": "0.25.9",
- "@esbuild/linux-x64": "0.25.9",
- "@esbuild/netbsd-arm64": "0.25.9",
- "@esbuild/netbsd-x64": "0.25.9",
- "@esbuild/openbsd-arm64": "0.25.9",
- "@esbuild/openbsd-x64": "0.25.9",
- "@esbuild/openharmony-arm64": "0.25.9",
- "@esbuild/sunos-x64": "0.25.9",
- "@esbuild/win32-arm64": "0.25.9",
- "@esbuild/win32-ia32": "0.25.9",
- "@esbuild/win32-x64": "0.25.9"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/focus-trap": {
- "version": "7.6.5",
- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz",
- "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tabbable": "^6.2.0"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/hast-util-to-html": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
- "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "ccount": "^2.0.0",
- "comma-separated-tokens": "^2.0.0",
- "hast-util-whitespace": "^3.0.0",
- "html-void-elements": "^3.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "property-information": "^7.0.0",
- "space-separated-tokens": "^2.0.0",
- "stringify-entities": "^4.0.0",
- "zwitch": "^2.0.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-whitespace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
- "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hookable": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
- "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/html-void-elements": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
- "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-what": {
- "version": "4.1.16",
- "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
- "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/mesqueeb"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.17",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
- "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0"
- }
- },
- "node_modules/mark.js": {
- "version": "8.11.1",
- "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
- "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mdast-util-to-hast": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
- "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "trim-lines": "^3.0.0",
- "unist-util-position": "^5.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-util-character": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
- "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
- "dev": true,
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-encode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
- "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
- "dev": true,
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-sanitize-uri": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
- "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
- "dev": true,
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-symbol": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
- "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
- "dev": true,
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-types": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
- "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
- "dev": true,
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/minisearch": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz",
- "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mitt": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
- "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/oniguruma-parser": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
- "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/oniguruma-to-es": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz",
- "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "oniguruma-parser": "^0.12.1",
- "regex": "^6.0.1",
- "regex-recursion": "^6.0.2"
- }
- },
- "node_modules/perfect-debounce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
- "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.6",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.11",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/property-information": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
- "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz",
- "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regex-utilities": "^2.3.0"
- }
- },
- "node_modules/regex-recursion": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
- "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regex-utilities": "^2.3.0"
- }
- },
- "node_modules/regex-utilities": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
- "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/rfdc": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
- "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/rollup": {
- "version": "4.46.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.4.tgz",
- "integrity": "sha512-YbxoxvoqNg9zAmw4+vzh1FkGAiZRK+LhnSrbSrSXMdZYsRPDWoshcSd/pldKRO6lWzv/e9TiJAVQyirYIeSIPQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.8"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.46.4",
- "@rollup/rollup-android-arm64": "4.46.4",
- "@rollup/rollup-darwin-arm64": "4.46.4",
- "@rollup/rollup-darwin-x64": "4.46.4",
- "@rollup/rollup-freebsd-arm64": "4.46.4",
- "@rollup/rollup-freebsd-x64": "4.46.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.46.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.46.4",
- "@rollup/rollup-linux-arm64-gnu": "4.46.4",
- "@rollup/rollup-linux-arm64-musl": "4.46.4",
- "@rollup/rollup-linux-loongarch64-gnu": "4.46.4",
- "@rollup/rollup-linux-ppc64-gnu": "4.46.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.46.4",
- "@rollup/rollup-linux-riscv64-musl": "4.46.4",
- "@rollup/rollup-linux-s390x-gnu": "4.46.4",
- "@rollup/rollup-linux-x64-gnu": "4.46.4",
- "@rollup/rollup-linux-x64-musl": "4.46.4",
- "@rollup/rollup-win32-arm64-msvc": "4.46.4",
- "@rollup/rollup-win32-ia32-msvc": "4.46.4",
- "@rollup/rollup-win32-x64-msvc": "4.46.4",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/shiki": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.11.0.tgz",
- "integrity": "sha512-VgKumh/ib38I1i3QkMn6mAQA6XjjQubqaAYhfge71glAll0/4xnt8L2oSuC45Qcr/G5Kbskj4RliMQddGmy/Og==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@shikijs/core": "3.11.0",
- "@shikijs/engine-javascript": "3.11.0",
- "@shikijs/engine-oniguruma": "3.11.0",
- "@shikijs/langs": "3.11.0",
- "@shikijs/themes": "3.11.0",
- "@shikijs/types": "3.11.0",
- "@shikijs/vscode-textmate": "^10.0.2",
- "@types/hast": "^3.0.4"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/speakingurl": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
- "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stringify-entities": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
- "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "character-entities-html4": "^2.0.0",
- "character-entities-legacy": "^3.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/superjson": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
- "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "copy-anything": "^3.0.2"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/tabbable": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
- "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.3"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/trim-lines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
- "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
- "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-stringify-position": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
- "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
- "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-message": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
- "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vite": {
- "version": "7.1.12",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz",
- "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.25.0",
- "fdir": "^6.5.0",
- "picomatch": "^4.0.3",
- "postcss": "^8.5.6",
- "rollup": "^4.43.0",
- "tinyglobby": "^0.2.15"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^20.19.0 || >=22.12.0",
- "jiti": ">=1.21.0",
- "less": "^4.0.0",
- "lightningcss": "^1.21.0",
- "sass": "^1.70.0",
- "sass-embedded": "^1.70.0",
- "stylus": ">=0.54.8",
- "sugarss": "^5.0.0",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/vitepress": {
- "version": "2.0.0-alpha.12",
- "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.12.tgz",
- "integrity": "sha512-yZwCwRRepcpN5QeAhwSnEJxS3I6zJcVixqL1dnm6km4cnriLpQyy2sXQDsE5Ti3pxGPbhU51nTMwI+XC1KNnJg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@docsearch/css": "^4.0.0-beta.7",
- "@docsearch/js": "^4.0.0-beta.7",
- "@iconify-json/simple-icons": "^1.2.47",
- "@shikijs/core": "^3.9.2",
- "@shikijs/transformers": "^3.9.2",
- "@shikijs/types": "^3.9.2",
- "@types/markdown-it": "^14.1.2",
- "@vitejs/plugin-vue": "^6.0.1",
- "@vue/devtools-api": "^8.0.0",
- "@vue/shared": "^3.5.18",
- "@vueuse/core": "^13.6.0",
- "@vueuse/integrations": "^13.6.0",
- "focus-trap": "^7.6.5",
- "mark.js": "8.11.1",
- "minisearch": "^7.1.2",
- "shiki": "^3.9.2",
- "vite": "^7.1.2",
- "vue": "^3.5.18"
- },
- "bin": {
- "vitepress": "bin/vitepress.js"
- },
- "peerDependencies": {
- "markdown-it-mathjax3": "^4",
- "oxc-minify": "^0.82.1",
- "postcss": "^8"
- },
- "peerDependenciesMeta": {
- "markdown-it-mathjax3": {
- "optional": true
- },
- "oxc-minify": {
- "optional": true
- },
- "postcss": {
- "optional": true
- }
- }
- },
- "node_modules/vue": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.19.tgz",
- "integrity": "sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-dom": "3.5.19",
- "@vue/compiler-sfc": "3.5.19",
- "@vue/runtime-dom": "3.5.19",
- "@vue/server-renderer": "3.5.19",
- "@vue/shared": "3.5.19"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/zwitch": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
- "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- }
- }
-}
diff --git a/Documentations/package.json b/Documentations/package.json
index d8d508f..5aa719c 100644
--- a/Documentations/package.json
+++ b/Documentations/package.json
@@ -1,6 +1,6 @@
{
"devDependencies": {
- "vitepress": "^2.0.0-alpha.12"
+ "vitepress": "^2.0.0-alpha.16"
},
"scripts": {
"docs:dev": "vitepress dev docs",
diff --git a/SourceGenerators/CaeriusNet.Generator.csproj b/SourceGenerators/CaeriusNet.Generator.csproj
index 3c73b8d..a203707 100644
--- a/SourceGenerators/CaeriusNet.Generator.csproj
+++ b/SourceGenerators/CaeriusNet.Generator.csproj
@@ -10,6 +10,7 @@
true
true
CaeriusNet.Generator
+ true
diff --git a/Src/Caches/RedisCacheManager.cs b/Src/Caches/RedisCacheManager.cs
index c8d4a80..af71432 100644
--- a/Src/Caches/RedisCacheManager.cs
+++ b/Src/Caches/RedisCacheManager.cs
@@ -113,7 +113,7 @@ public bool TryGet(string cacheKey, out T? value)
}
catch (Exception ex)
{
- _logger?.LogWarning(ex, "Redis TryGet failed for key '{CacheKey}'", cacheKey);
+ _logger?.LogRedisTryGetFailed(cacheKey, ex);
return false;
}
}
diff --git a/Src/CaeriusNet.csproj b/Src/CaeriusNet.csproj
index 924d945..b2a96a7 100644
--- a/Src/CaeriusNet.csproj
+++ b/Src/CaeriusNet.csproj
@@ -12,7 +12,7 @@
true
- 10.2.0
+ 10.2.1
CaeriusNet
AriusII & CaeriusNet
High-performance micro-ORM for C# 14 / .NET 10 and SQL Server. Execute Stored Procedures, map DTOs at compile-time ([GenerateDto]), pass Table-Valued Parameters ([GenerateTvp]), and cache results — all in a single package.
@@ -33,6 +33,25 @@
true
+
+ true
+ true
+ true
+ true
+ snupkg
+
+
+
+ moderate
+ all
+
+
+
+ true
+ latest-recommended
+ false
+
+
true
DEBUG;TRACE
@@ -42,10 +61,12 @@
true
- x64
portable
true
true
+ true
+ 4
+ false
diff --git a/Src/GlobalUsings.cs b/Src/GlobalUsings.cs
index b5e7da2..6838704 100644
--- a/Src/GlobalUsings.cs
+++ b/Src/GlobalUsings.cs
@@ -25,4 +25,7 @@
global using System.Runtime.CompilerServices;
global using System.Runtime.InteropServices;
global using System.Text.Json.Serialization;
-global using static CaeriusNet.Helpers.CacheType;
\ No newline at end of file
+global using static CaeriusNet.Helpers.CacheType;
+
+[assembly: InternalsVisibleTo("CaeriusNet.Tests")]
+[assembly: CLSCompliant(false)]
\ No newline at end of file
diff --git a/Src/Helpers/CacheHelper.cs b/Src/Helpers/CacheHelper.cs
index 2f268bb..f30d0fe 100644
--- a/Src/Helpers/CacheHelper.cs
+++ b/Src/Helpers/CacheHelper.cs
@@ -92,7 +92,7 @@ internal static void StoreInCache(
break;
default:
- throw new ArgumentOutOfRangeException();
+ throw new ArgumentOutOfRangeException(nameof(spParameters), spParameters.CacheType.Value, "Unsupported cache type value.");
}
}
}
\ No newline at end of file
diff --git a/Src/Logging/LogMessages.cs b/Src/Logging/LogMessages.cs
index 6a12e20..1e5dede 100644
--- a/Src/Logging/LogMessages.cs
+++ b/Src/Logging/LogMessages.cs
@@ -387,6 +387,21 @@ public static partial void LogRedisRetrieveError(
string cacheKey,
Exception exception);
+ ///
+ /// Logs when a TryGet operation fails in Redis
+ ///
+ /// The logger instance
+ /// The cache key being accessed
+ /// The exception that occurred
+ [LoggerMessage(
+ EventId = 3017,
+ Level = LogLevel.Warning,
+ Message = "Redis TryGet failed for key '{cacheKey}'")]
+ public static partial void LogRedisTryGetFailed(
+ this ILogger logger,
+ string cacheKey,
+ Exception exception);
+
#endregion
#region Database Operations (4xxx)
diff --git a/Tests/CaeriusNet.Generator.Tests/CaeriusNet.Generator.Tests.csproj b/Tests/CaeriusNet.Generator.Tests/CaeriusNet.Generator.Tests.csproj
index 1ae63c8..4f353a8 100644
--- a/Tests/CaeriusNet.Generator.Tests/CaeriusNet.Generator.Tests.csproj
+++ b/Tests/CaeriusNet.Generator.Tests/CaeriusNet.Generator.Tests.csproj
@@ -8,6 +8,10 @@
false
true
CaeriusNet.Generator.Tests
+ true
+ 4
+ latest
+ false
@@ -21,6 +25,10 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
diff --git a/Tests/CaeriusNet.Generator.Tests/Dto/DtoSourceGeneratorTests.cs b/Tests/CaeriusNet.Generator.Tests/Dto/DtoSourceGeneratorTests.cs
index 75a2c63..5071551 100644
--- a/Tests/CaeriusNet.Generator.Tests/Dto/DtoSourceGeneratorTests.cs
+++ b/Tests/CaeriusNet.Generator.Tests/Dto/DtoSourceGeneratorTests.cs
@@ -200,4 +200,210 @@ public sealed partial record OrderDto(int Id, decimal Total);
Assert.Equal(2, result.GeneratedTrees.Length);
}
+
+ [Fact]
+ public void Guid_Field_Generates_GetGuid()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record EntityDto(int Id, System.Guid TraceId);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetGuid(1)", generated);
+ }
+
+ [Fact]
+ public void Bool_Field_Generates_GetBoolean()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record FlagDto(int Id, bool IsActive);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetBoolean(1)", generated);
+ }
+
+ [Fact]
+ public void Long_Field_Generates_GetInt64()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record MetricDto(int Id, long Ticks);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetInt64(1)", generated);
+ }
+
+ [Fact]
+ public void Short_Field_Generates_GetInt16()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record CodeDto(int Id, short Code);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetInt16(1)", generated);
+ }
+
+ [Fact]
+ public void Decimal_Field_Generates_GetDecimal()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record PriceDto(int Id, decimal Price);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetDecimal(1)", generated);
+ }
+
+ [Fact]
+ public void Float_Field_Generates_GetFloat()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record ScoreDto(int Id, float Score);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetFloat(1)", generated);
+ }
+
+ [Fact]
+ public void Double_Field_Generates_GetDouble()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record RatioDto(int Id, double Ratio);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetDouble(1)", generated);
+ }
+
+ [Fact]
+ public void Byte_Field_Generates_GetByte()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record LevelDto(int Id, byte Level);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetByte(1)", generated);
+ }
+
+ [Fact]
+ public void Nullable_Guid_Generates_IsDBNull_Check()
+ {
+ const string source = """
+ #nullable enable
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record TraceDto(int Id, System.Guid? TraceId);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.IsDBNull(1)", generated);
+ Assert.Contains("reader.GetGuid(1)", generated);
+ }
+
+ [Fact]
+ public void Nested_Namespace_Generates_Correct_Namespace()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace My.App.Data.Models;
+ [GenerateDto]
+ public sealed partial record DeepDto(int Id, string Name);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("namespace My.App.Data.Models;", generated);
+ }
+
+ [Fact]
+ public void Enum_Int_Property_Generates_Cast_From_GetInt32()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ public enum Status { Active = 1, Inactive = 2 }
+ [GenerateDto]
+ public sealed partial record ItemDto(int Id, Status Status);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Single(result.GeneratedTrees);
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("reader.GetInt32(1)", generated);
+ Assert.Contains("(Test.Models.Status)", generated);
+ }
+
+ [Fact]
+ public void EmptyParameterRecord_DoesNotGenerate()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Dto;
+ namespace Test.Models;
+ [GenerateDto]
+ public sealed partial record EmptyDto();
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Empty(result.GeneratedTrees);
+ }
}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Generator.Tests/Tvp/TvpSourceGeneratorTests.cs b/Tests/CaeriusNet.Generator.Tests/Tvp/TvpSourceGeneratorTests.cs
index 505055d..205c77b 100644
--- a/Tests/CaeriusNet.Generator.Tests/Tvp/TvpSourceGeneratorTests.cs
+++ b/Tests/CaeriusNet.Generator.Tests/Tvp/TvpSourceGeneratorTests.cs
@@ -1,3 +1,5 @@
+using System.Text.RegularExpressions;
+
namespace CaeriusNet.Generator.Tests.Tvp;
public sealed class TvpSourceGeneratorTests
@@ -163,8 +165,137 @@ public sealed partial record UserIdTvp(int Id);
var result = SourceGeneratorTestHelper.RunGenerator(source);
var generated = result.GeneratedTrees[0].GetText().ToString();
- // Verify the generator creates a single SqlDataRecord and reuses it (no new inside loop)
Assert.Contains("var record = new SqlDataRecord(_tvpMetaData);", generated);
Assert.Contains("yield return record;", generated);
}
+
+ [Fact]
+ public void Bool_Field_Generates_SqlDbType_Bit()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_flag")]
+ public sealed partial record FlagTvp(int Id, bool IsActive);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("SqlDbType.Bit", generated);
+ }
+
+ [Fact]
+ public void Long_Field_Generates_SqlDbType_BigInt()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_big")]
+ public sealed partial record BigIntTvp(int Id, long Ticks);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("SqlDbType.BigInt", generated);
+ }
+
+ [Fact]
+ public void Decimal_Field_Generates_SqlDbType_Decimal()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_price")]
+ public sealed partial record PriceTvp(int Id, decimal Price);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("SqlDbType.Decimal", generated);
+ }
+
+ [Fact]
+ public void Guid_Field_Generates_SqlDbType_UniqueIdentifier()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_guid")]
+ public sealed partial record GuidTvp(int Id, System.Guid TraceId);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("SqlDbType.UniqueIdentifier", generated);
+ }
+
+ [Fact]
+ public void Nullable_String_Generates_SetDBNull_And_NVarChar()
+ {
+ const string source = """
+ #nullable enable
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_optstr")]
+ public sealed partial record OptStrTvp(int Id, string? Name);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ Assert.Contains("SqlDbType.NVarChar", generated);
+ Assert.Contains("SetDBNull", generated);
+ }
+
+ [Fact]
+ public void MultiColumn_MetaData_Array_Has_Correct_Length()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_multi")]
+ public sealed partial record MultiTvp(int Id, string Name, decimal Price, bool IsActive);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ var generated = result.GeneratedTrees[0].GetText().ToString();
+ // Generator uses C# collection expressions; verify all 4 properties map to SqlMetaData entries
+ var metaDataEntries = Regex.Matches(generated, @"new SqlMetaData\(").Count;
+ Assert.Equal(4, metaDataEntries);
+ }
+
+ [Fact]
+ public void NonSealed_Type_Does_Not_Generate()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_int")]
+ public partial record UserIdTvp(int Id);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Empty(result.GeneratedTrees);
+ }
+
+ [Fact]
+ public void NonPartial_Type_Does_Not_Generate()
+ {
+ const string source = """
+ using CaeriusNet.Attributes.Tvp;
+ namespace Test.Models;
+ [GenerateTvp(Schema = "dbo", TvpName = "tvp_int")]
+ public sealed record UserIdTvp(int Id);
+ """;
+
+ var result = SourceGeneratorTestHelper.RunGenerator(source);
+
+ Assert.Empty(result.GeneratedTrees);
+ }
}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/Builders/CaeriusNetBuilderTests.cs b/Tests/CaeriusNet.Tests/Builders/CaeriusNetBuilderTests.cs
new file mode 100644
index 0000000..6fcb01f
--- /dev/null
+++ b/Tests/CaeriusNet.Tests/Builders/CaeriusNetBuilderTests.cs
@@ -0,0 +1,146 @@
+namespace CaeriusNet.Tests.Builders;
+
+public sealed class CaeriusNetBuilderTests
+{
+ [Fact]
+ public void Create_WithNull_ServiceCollection_Throws_ArgumentNullException()
+ {
+ Assert.Throws(() => CaeriusNetBuilder.Create((IServiceCollection)null!));
+ }
+
+ [Fact]
+ public void Create_WithNull_HostApplicationBuilder_Throws_ArgumentNullException()
+ {
+ Assert.Throws(() => CaeriusNetBuilder.Create((IHostApplicationBuilder)null!));
+ }
+
+ [Fact]
+ public void Create_WithValidServices_Returns_NonNull_Builder()
+ {
+ var services = new ServiceCollection();
+
+ var builder = CaeriusNetBuilder.Create(services);
+
+ Assert.NotNull(builder);
+ }
+
+ [Fact]
+ public void WithSqlServer_EmptyString_Throws_ArgumentException()
+ {
+ var services = new ServiceCollection();
+
+ Assert.Throws(() =>
+ CaeriusNetBuilder.Create(services).WithSqlServer(""));
+ }
+
+ [Fact]
+ public void WithSqlServer_NullString_Throws_ArgumentException()
+ {
+ var services = new ServiceCollection();
+
+ Assert.Throws(() =>
+ CaeriusNetBuilder.Create(services).WithSqlServer(null!));
+ }
+
+ [Fact]
+ public void WithSqlServer_WhitespaceString_Throws_ArgumentException()
+ {
+ var services = new ServiceCollection();
+
+ Assert.Throws(() =>
+ CaeriusNetBuilder.Create(services).WithSqlServer(" "));
+ }
+
+ [Fact]
+ public void Build_WithoutSqlServer_Throws_InvalidOperationException()
+ {
+ var services = new ServiceCollection();
+
+ Assert.Throws(() =>
+ CaeriusNetBuilder.Create(services).Build());
+ }
+
+ [Fact]
+ public void WithSqlServer_ValidString_Returns_SameBuilder_For_Chaining()
+ {
+ var services = new ServiceCollection();
+ var builder = CaeriusNetBuilder.Create(services);
+
+ var result = builder.WithSqlServer("Server=.;Database=test;");
+
+ Assert.Same(builder, result);
+ }
+
+ [Fact]
+ public void Build_AfterWithSqlServer_Returns_ServiceCollection()
+ {
+ var services = new ServiceCollection();
+
+ var result = CaeriusNetBuilder
+ .Create(services)
+ .WithSqlServer("Server=.;Database=test;Integrated Security=true;")
+ .Build();
+
+ Assert.NotNull(result);
+ }
+
+ [Fact]
+ public void Build_AfterWithSqlServer_Registers_ICaeriusNetDbContext()
+ {
+ var services = new ServiceCollection();
+
+ CaeriusNetBuilder
+ .Create(services)
+ .WithSqlServer("Server=.;Database=test;Integrated Security=true;")
+ .Build();
+
+ var descriptor = Assert.Single(
+ services,
+ sd => sd.ServiceType == typeof(ICaeriusNetDbContext));
+ Assert.NotNull(descriptor);
+ }
+
+ [Fact]
+ public void WithAspireSqlServer_WithoutAspireBuilder_Throws_InvalidOperationException()
+ {
+ var services = new ServiceCollection();
+
+ Assert.Throws(() =>
+ CaeriusNetBuilder.Create(services).WithAspireSqlServer());
+ }
+
+ [Fact]
+ public void WithAspireRedis_WithoutAspireBuilder_Throws_InvalidOperationException()
+ {
+ var services = new ServiceCollection();
+
+ Assert.Throws(() =>
+ CaeriusNetBuilder.Create(services).WithAspireRedis());
+ }
+
+ [Fact]
+ public void WithRedis_ValidConnectionString_Returns_SameBuilder_For_Chaining()
+ {
+ var services = new ServiceCollection();
+ var builder = CaeriusNetBuilder.Create(services);
+
+ var result = builder.WithRedis("localhost:6379");
+
+ Assert.Same(builder, result);
+ }
+
+ [Fact]
+ public void WithSqlServer_And_WithRedis_Build_RegistersServices_WithoutThrowing()
+ {
+ var services = new ServiceCollection();
+
+ var exception = Record.Exception(() =>
+ CaeriusNetBuilder
+ .Create(services)
+ .WithSqlServer("Server=.;Database=test;Integrated Security=true;")
+ .WithRedis("localhost:6379")
+ .Build());
+
+ Assert.Null(exception);
+ }
+}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/Builders/StoredProcedureParametersBuilderTests.cs b/Tests/CaeriusNet.Tests/Builders/StoredProcedureParametersBuilderTests.cs
index 84e9399..68f8dee 100644
--- a/Tests/CaeriusNet.Tests/Builders/StoredProcedureParametersBuilderTests.cs
+++ b/Tests/CaeriusNet.Tests/Builders/StoredProcedureParametersBuilderTests.cs
@@ -195,4 +195,117 @@ public void Builder_Is_Chainable_Returns_Same_Instance()
Assert.Same(builder, returned);
}
+
+ [Fact]
+ public void AddParameter_CorrectParameterName_SetInSpan()
+ {
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddParameter("@UserId", 42, SqlDbType.Int)
+ .Build();
+
+ Assert.Equal("@UserId", sp.GetParametersSpan()[0].ParameterName);
+ }
+
+ [Fact]
+ public void AddParameter_CorrectSqlDbType_SetInSpan()
+ {
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddParameter("@Code", (short)7, SqlDbType.SmallInt)
+ .Build();
+
+ Assert.Equal(SqlDbType.SmallInt, sp.GetParametersSpan()[0].SqlDbType);
+ }
+
+ [Fact]
+ public void AddParameter_CorrectValue_SetInSpan()
+ {
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddParameter("@Score", 99, SqlDbType.Int)
+ .Build();
+
+ Assert.Equal(99, sp.GetParametersSpan()[0].Value);
+ }
+
+ [Fact]
+ public void AddParameter_NullValue_SetsValueToNull()
+ {
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddParameter("@OptName", null!, SqlDbType.NVarChar)
+ .Build();
+
+ Assert.Null(sp.GetParametersSpan()[0].Value);
+ }
+
+ [Fact]
+ public void Builder_Capacity_Zero_Is_Accepted()
+ {
+ var builder = new StoredProcedureParametersBuilder("dbo", "sp_Test", 0);
+
+ var exception = Record.Exception(() => builder.Build());
+
+ Assert.Null(exception);
+ }
+
+ [Fact]
+ public void Builder_Capacity_One_Is_Accepted()
+ {
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test", 1).Build();
+
+ Assert.Equal(1, sp.Capacity);
+ }
+
+ [Fact]
+ public void Builder_Timeout_Zero_Is_Accepted()
+ {
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test", 16, 0).Build();
+
+ Assert.Equal(0, sp.CommandTimeout);
+ }
+
+ [Fact]
+ public void AddTvpParameter_Sets_SqlDbType_Structured()
+ {
+ var items = new List { new(1) };
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddTvpParameter("@Ids", items)
+ .Build();
+
+ Assert.Equal(SqlDbType.Structured, sp.GetParametersSpan()[0].SqlDbType);
+ }
+
+ [Fact]
+ public void AddTvpParameter_Sets_TypeName_Correctly()
+ {
+ var items = new List { new(1) };
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddTvpParameter("@Ids", items)
+ .Build();
+
+ Assert.Equal(TestTvpItem.TvpTypeName, sp.GetParametersSpan()[0].TypeName);
+ }
+
+ [Fact]
+ public void AddTvpParameter_Multiple_TVPs_Adds_Multiple_Parameters()
+ {
+ var items = new List { new(1), new(2) };
+ var sp = new StoredProcedureParametersBuilder("dbo", "sp_Test")
+ .AddTvpParameter("@Ids1", items)
+ .AddTvpParameter("@Ids2", items)
+ .Build();
+
+ Assert.Equal(2, sp.GetParametersSpan().Length);
+ }
+
+ [Fact]
+ public void GetParametersSpan_LargeParameterCount_AllPresent()
+ {
+ var builder = new StoredProcedureParametersBuilder("dbo", "sp_Test");
+
+ for (var i = 0; i < 50; i++)
+ builder.AddParameter($"@Param{i}", i, SqlDbType.Int);
+
+ var sp = builder.Build();
+
+ Assert.Equal(50, sp.GetParametersSpan().Length);
+ }
}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/Caches/FrozenCacheManagerTests.cs b/Tests/CaeriusNet.Tests/Caches/FrozenCacheManagerTests.cs
new file mode 100644
index 0000000..536f622
--- /dev/null
+++ b/Tests/CaeriusNet.Tests/Caches/FrozenCacheManagerTests.cs
@@ -0,0 +1,134 @@
+namespace CaeriusNet.Tests.Caches;
+
+///
+/// Unit tests for .
+/// Each test uses a GUID-based key to avoid interference from the shared static cache state.
+///
+public sealed class FrozenCacheManagerTests
+{
+ [Fact]
+ public void TryGet_MissingKey_Returns_False()
+ {
+ var key = $"frozen_missing_{Guid.NewGuid()}";
+
+ var found = FrozenCacheManager.TryGet(key, out _);
+
+ Assert.False(found);
+ }
+
+ [Fact]
+ public void TryGet_MissingKey_Outputs_DefaultValue()
+ {
+ var key = $"frozen_default_{Guid.NewGuid()}";
+
+ FrozenCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(default, value);
+ }
+
+ [Fact]
+ public void Store_Then_TryGet_Returns_True()
+ {
+ var key = $"frozen_store_{Guid.NewGuid()}";
+
+ FrozenCacheManager.Store(key, 42);
+ var found = FrozenCacheManager.TryGet(key, out _);
+
+ Assert.True(found);
+ }
+
+ [Fact]
+ public void Store_Then_TryGet_Returns_CorrectValue()
+ {
+ var key = $"frozen_value_{Guid.NewGuid()}";
+ const int expected = 99;
+
+ FrozenCacheManager.Store(key, expected);
+ FrozenCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(expected, value);
+ }
+
+ [Fact]
+ public void Store_SameKey_Twice_IsIdempotent_FirstValuePreserved()
+ {
+ var key = $"frozen_idempotent_{Guid.NewGuid()}";
+
+ FrozenCacheManager.Store(key, 100);
+ FrozenCacheManager.Store(key, 999); // second store is a no-op (double-checked locking)
+
+ FrozenCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(100, value);
+ }
+
+ [Fact]
+ public void TryGet_WrongType_Returns_False()
+ {
+ var key = $"frozen_wrongtype_{Guid.NewGuid()}";
+
+ FrozenCacheManager.Store(key, 42); // stored as int
+ var found = FrozenCacheManager.TryGet(key, out var value); // retrieved as string
+
+ Assert.False(found);
+ Assert.Null(value);
+ }
+
+ [Fact]
+ public void Store_StringValue_TryGet_Returns_CorrectString()
+ {
+ var key = $"frozen_string_{Guid.NewGuid()}";
+ const string expected = "hello_frozen_cache";
+
+ FrozenCacheManager.Store(key, expected);
+ FrozenCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(expected, value);
+ }
+
+ [Fact]
+ public void StoreRange_Then_TryGet_AllValues_Found()
+ {
+ var key1 = $"frozen_range_a_{Guid.NewGuid()}";
+ var key2 = $"frozen_range_b_{Guid.NewGuid()}";
+ var key3 = $"frozen_range_c_{Guid.NewGuid()}";
+
+ var entries = new Dictionary
+ {
+ [key1] = "value1",
+ [key2] = "value2",
+ [key3] = "value3"
+ };
+
+ FrozenCacheManager.StoreRange(entries);
+
+ Assert.True(FrozenCacheManager.TryGet(key1, out var v1));
+ Assert.True(FrozenCacheManager.TryGet(key2, out var v2));
+ Assert.True(FrozenCacheManager.TryGet(key3, out var v3));
+ Assert.Equal("value1", v1);
+ Assert.Equal("value2", v2);
+ Assert.Equal("value3", v3);
+ }
+
+ [Fact]
+ public void StoreRange_EmptyCollection_DoesNotThrow()
+ {
+ var entries = new Dictionary();
+
+ var exception = Record.Exception(() => FrozenCacheManager.StoreRange(entries));
+
+ Assert.Null(exception);
+ }
+
+ [Fact]
+ public void StoreRange_SingleEntry_CanBeRetrieved()
+ {
+ var key = $"frozen_single_range_{Guid.NewGuid()}";
+ var entries = new Dictionary { [key] = 777 };
+
+ FrozenCacheManager.StoreRange(entries);
+ FrozenCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(777, value);
+ }
+}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/Caches/InMemoryCacheManagerTests.cs b/Tests/CaeriusNet.Tests/Caches/InMemoryCacheManagerTests.cs
new file mode 100644
index 0000000..3225a20
--- /dev/null
+++ b/Tests/CaeriusNet.Tests/Caches/InMemoryCacheManagerTests.cs
@@ -0,0 +1,101 @@
+namespace CaeriusNet.Tests.Caches;
+
+///
+/// Unit tests for .
+/// Each test uses a GUID-based key to avoid interference from the shared static MemoryCache.
+///
+public sealed class InMemoryCacheManagerTests
+{
+ private static readonly TimeSpan LongExpiry = TimeSpan.FromHours(1);
+
+ [Fact]
+ public void TryGet_MissingKey_Returns_False()
+ {
+ var key = $"memory_missing_{Guid.NewGuid()}";
+
+ var found = InMemoryCacheManager.TryGet(key, out _);
+
+ Assert.False(found);
+ }
+
+ [Fact]
+ public void TryGet_MissingKey_Outputs_DefaultValue()
+ {
+ var key = $"memory_default_{Guid.NewGuid()}";
+
+ InMemoryCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(default, value);
+ }
+
+ [Fact]
+ public void Store_Then_TryGet_Returns_True()
+ {
+ var key = $"memory_store_{Guid.NewGuid()}";
+
+ InMemoryCacheManager.Store(key, 42, LongExpiry);
+ var found = InMemoryCacheManager.TryGet(key, out _);
+
+ Assert.True(found);
+ }
+
+ [Fact]
+ public void Store_Then_TryGet_Returns_CorrectValue()
+ {
+ var key = $"memory_value_{Guid.NewGuid()}";
+ const int expected = 55;
+
+ InMemoryCacheManager.Store(key, expected, LongExpiry);
+ InMemoryCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(expected, value);
+ }
+
+ [Fact]
+ public void Store_StringValue_TryGet_Returns_CorrectString()
+ {
+ var key = $"memory_string_{Guid.NewGuid()}";
+ const string expected = "hello_memory_cache";
+
+ InMemoryCacheManager.Store(key, expected, LongExpiry);
+ InMemoryCacheManager.TryGet(key, out var value);
+
+ Assert.Equal(expected, value);
+ }
+
+ [Fact]
+ public void TryGet_WrongType_Returns_False()
+ {
+ var key = $"memory_wrongtype_{Guid.NewGuid()}";
+
+ InMemoryCacheManager.Store(key, 42, LongExpiry); // stored as int
+ var found = InMemoryCacheManager.TryGet(key, out var value); // retrieved as string
+
+ Assert.False(found);
+ Assert.Null(value);
+ }
+
+ [Fact]
+ public void Store_OverwritesSameKey_WithNewValue()
+ {
+ var key = $"memory_overwrite_{Guid.NewGuid()}";
+
+ InMemoryCacheManager.Store(key, "first", LongExpiry);
+ InMemoryCacheManager.Store(key, "second", LongExpiry); // overwrites — unlike FrozenCacheManager
+ InMemoryCacheManager.TryGet(key, out var value);
+
+ Assert.Equal("second", value);
+ }
+
+ [Fact]
+ public void Store_ListValue_ThenTryGet_Returns_SameList()
+ {
+ var key = $"memory_list_{Guid.NewGuid()}";
+ var list = new List { 1, 2, 3 };
+
+ InMemoryCacheManager.Store(key, list, LongExpiry);
+ InMemoryCacheManager.TryGet>(key, out var value);
+
+ Assert.Equal(list, value);
+ }
+}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/CaeriusNet.Tests.csproj b/Tests/CaeriusNet.Tests/CaeriusNet.Tests.csproj
index ad81123..a5056fc 100644
--- a/Tests/CaeriusNet.Tests/CaeriusNet.Tests.csproj
+++ b/Tests/CaeriusNet.Tests/CaeriusNet.Tests.csproj
@@ -8,6 +8,9 @@
false
true
CaeriusNet.Tests
+ true
+ 4
+ false
@@ -21,6 +24,10 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
diff --git a/Tests/CaeriusNet.Tests/Exceptions/CaeriusNetSqlExceptionTests.cs b/Tests/CaeriusNet.Tests/Exceptions/CaeriusNetSqlExceptionTests.cs
new file mode 100644
index 0000000..ede72a0
--- /dev/null
+++ b/Tests/CaeriusNet.Tests/Exceptions/CaeriusNetSqlExceptionTests.cs
@@ -0,0 +1,57 @@
+namespace CaeriusNet.Tests.Exceptions;
+
+public sealed class CaeriusNetSqlExceptionTests
+{
+ [Fact]
+ public void CaeriusNetSqlException_Inherits_From_Exception()
+ {
+ Assert.True(typeof(CaeriusNetSqlException).IsSubclassOf(typeof(Exception)));
+ }
+
+ [Fact]
+ public void CaeriusNetSqlException_IsSealed()
+ {
+ Assert.True(typeof(CaeriusNetSqlException).IsSealed);
+ }
+
+ [Fact]
+ public void CaeriusNetSqlException_Has_Single_Constructor()
+ {
+ var ctors = typeof(CaeriusNetSqlException).GetConstructors();
+
+ Assert.Single(ctors);
+ }
+
+ [Fact]
+ public void CaeriusNetSqlException_Constructor_Has_Two_Parameters()
+ {
+ var parameters = typeof(CaeriusNetSqlException).GetConstructors()[0].GetParameters();
+
+ Assert.Equal(2, parameters.Length);
+ }
+
+ [Fact]
+ public void CaeriusNetSqlException_FirstParameter_Is_String()
+ {
+ var parameters = typeof(CaeriusNetSqlException).GetConstructors()[0].GetParameters();
+
+ Assert.Equal(typeof(string), parameters[0].ParameterType);
+ }
+
+ [Fact]
+ public void CaeriusNetSqlException_SecondParameter_Is_SqlException()
+ {
+ var parameters = typeof(CaeriusNetSqlException).GetConstructors()[0].GetParameters();
+
+ Assert.Equal(typeof(SqlException), parameters[1].ParameterType);
+ }
+
+ [Fact]
+ public void CaeriusNetSqlException_SecondParameterType_IsAssignableTo_Exception()
+ {
+ var secondParamType = typeof(CaeriusNetSqlException).GetConstructors()[0].GetParameters()[1].ParameterType;
+
+ // Verifies the constructor contract: SqlException satisfies base Exception(string, Exception)
+ Assert.True(typeof(Exception).IsAssignableFrom(secondParamType));
+ }
+}
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/GlobalUsings.cs b/Tests/CaeriusNet.Tests/GlobalUsings.cs
index 10d314c..b24a26c 100644
--- a/Tests/CaeriusNet.Tests/GlobalUsings.cs
+++ b/Tests/CaeriusNet.Tests/GlobalUsings.cs
@@ -4,7 +4,12 @@
global using System.Data;
global using Microsoft.Data.SqlClient;
global using Microsoft.Data.SqlClient.Server;
+global using CaeriusNet.Abstractions;
global using CaeriusNet.Builders;
+global using CaeriusNet.Caches;
+global using CaeriusNet.Exceptions;
global using CaeriusNet.Mappers;
global using CaeriusNet.Helpers;
-global using CaeriusNet.Tests.Helpers;
\ No newline at end of file
+global using CaeriusNet.Tests.Helpers;
+global using Microsoft.Extensions.DependencyInjection;
+global using Microsoft.Extensions.Hosting;
\ No newline at end of file
diff --git a/Tests/CaeriusNet.Tests/Mappers/StoredProcedureParametersTests.cs b/Tests/CaeriusNet.Tests/Mappers/StoredProcedureParametersTests.cs
index dda49ac..b3eee86 100644
--- a/Tests/CaeriusNet.Tests/Mappers/StoredProcedureParametersTests.cs
+++ b/Tests/CaeriusNet.Tests/Mappers/StoredProcedureParametersTests.cs
@@ -77,4 +77,39 @@ public void GetParametersSpan_Returns_Correct_Parameter_Name()
Assert.Equal("@UserId", span[0].ParameterName);
}
+
+ [Fact]
+ public void GetParametersSpan_Returns_Correct_SqlDbType()
+ {
+ var parameters = new SqlParameter[] { new("@Flag", SqlDbType.Bit) };
+ var sp = new StoredProcedureParameters("dbo", "sp_Test", 16, parameters, null, null, null);
+
+ var span = sp.GetParametersSpan();
+
+ Assert.Equal(SqlDbType.Bit, span[0].SqlDbType);
+ }
+
+ [Fact]
+ public void GetParametersSpan_LargeArray_ReturnsCorrectLength()
+ {
+ var parameters = Enumerable.Range(0, 100)
+ .Select(i => new SqlParameter($"@P{i}", SqlDbType.Int))
+ .ToArray();
+ var sp = new StoredProcedureParameters("dbo", "sp_Test", 16, parameters, null, null, null);
+
+ Assert.Equal(100, sp.GetParametersSpan().Length);
+ }
+
+ [Fact]
+ public void Two_Distinct_Instances_HaveIndependent_ParameterSpans()
+ {
+ var params1 = new SqlParameter[] { new("@Id", SqlDbType.Int) };
+ var params2 = new SqlParameter[] { new("@Name", SqlDbType.NVarChar) };
+
+ var sp1 = new StoredProcedureParameters("dbo", "sp_Test", 16, params1, null, null, null);
+ var sp2 = new StoredProcedureParameters("dbo", "sp_Test", 16, params2, null, null, null);
+
+ Assert.Equal("@Id", sp1.GetParametersSpan()[0].ParameterName);
+ Assert.Equal("@Name", sp2.GetParametersSpan()[0].ParameterName);
+ }
}
\ No newline at end of file