diff --git a/.gitattributes b/.gitattributes index d9d5236..6046cc7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,15 +10,15 @@ *.ps1 text eol=crlf # Explicitly declare text files you want to always be normalized and converted to native line endings on checkout -*.cs text diff=csharp -*.csproj text -*.sln text -*.slnx text -*.md text -*.json text -*.yaml text -*.yml text -*.xml text +*.cs text eol=lf diff=csharp +*.csproj text eol=lf +*.sln text eol=lf +*.slnx text eol=lf +*.md text eol=lf +*.json text eol=lf +*.yaml text eol=lf +*.yml text eol=lf +*.xml text eol=lf # Denote all files that are truly binary and should not be modified *.png binary diff --git a/.github/CONVENTIONS.md b/.github/CONVENTIONS.md index 9e9317d..bf4a370 100644 --- a/.github/CONVENTIONS.md +++ b/.github/CONVENTIONS.md @@ -24,6 +24,7 @@ - [Performance](#performance) - [Security](#security) - [Naming](#naming) + - [AOT and Trimming](#aot-and-trimming) - [Git and PR Hygiene](#git-and-pr-hygiene) - [Files with shared content](#files-with-shared-content-5) - [Documentation](#documentation) @@ -132,7 +133,7 @@ The project owner is a non-native English speaker. - Global usings: defined in **`usings.cs` per project** - Standard folder layout: - `src/` — source code - - `test/` — test projects. The stack is: **xUnit, FluentAssertions, NSubstitute, MTP v2, coverage** + - `tests/` — test projects. The stack is: **xUnit, FluentAssertions, NSubstitute, MTP v2, coverage** - `benchmarks/` — **BenchmarkDotNet** projects (desirable) - `examples/` — usage examples (desirable). Prefer single-file programs for simplicity, but multi-file projects are acceptable if the example is complex enough to warrant it. - `docs/` — documentation (optional, in addition to README.md, e.g. blogs, design docs, etc.) @@ -257,6 +258,65 @@ The project owner is a non-native English speaker. - Events: past tense — `OrderPlacedEvent`. - Commands: imperative — `PlaceOrderCommand`. - Handlers: `...Handler` suffix. +- **Always set `` explicitly** in every `*.csproj` to make it clear to the CI scripts what type of file to run for tests and benchmarks, and to avoid drift when project file names change. +- Prefer **domain-first public API type names** without suffixes unless required to avoid language-level symbol conflicts. +- Prefer **package-first artifact identity** for NuGet packages and assemblies: + - Package ID: `vm2.` or `vm2..` + - Assembly name: `vm2.` or `vm2..` +- Always set `` explicitly in every `*.csproj`. +- Root namespace policy: + - For core libraries, prioritize API clarity and discoverability. + - For feature libraries, use a stable hierarchy that mirrors the feature domain. +- Test naming policy (tests-first): + - Project and assembly: `.Tests` or `..Tests` to group tests by package and feature, e.g. `Ulid.Tests` for `vm2.Ulid` package, `UlidTool.Tests` for `vm2.UlidTool` package, etc. This also makes it clear that the assembly contains tests for the specific package or feature. **Prefer the default name for the assembly** - the name of the project file without the extension, e.g. `Ulid.Tests` for `Ulid.Tests.csproj`. + - Namespace: `vm2.Tests.[.]` to avoid conflicts where `` is also a name of a type, e.g. `Ulid`. It also makes it clear that the namespace contains tests for the specific package, class, or feature, e.g. `vm2.Tests.Ulid` for `vm2.Ulid` package/type, `vm2.Tests.UlidTool` for `vm2.UlidTool` package/feature (tool), etc. + - **Always specify `Exe` explicitly** in test project files to make it clear to the CI scripts what type of file to run. +- Benchmark naming policy (benchmarks-first): + - Project and assembly: `.Benchmarks` or `..Benchmarks` to group benchmarks by package and feature, e.g. `Ulid.Benchmarks` for `vm2.Ulid` package. This also makes it clear that the assembly contains benchmarks for the specific package or feature. **The assembly name MUST be the default** - the name of the project file without the extension, e.g. `Ulid.Benchmarks` for `Ulid.Benchmarks.csproj`. This is BenchmarkDotNet's required convention. + - Namespace: `vm2.Benchmarks.[.Feature]` to avoid conflicts where `` is also a name of a type, e.g. `Ulid`. It also makes it clear that the namespace contains tests for the specific package, class, or feature, e.g. `vm2.Tests.Ulid` for `vm2.Ulid` package/type. + - **Always specify `Exe`** in benchmark project files to make it clear to the CI scripts what type of file to run for benchmarks. +- Inside a single repository, do not mix naming strategies. Choose one namespace strategy and apply it consistently to `src/`, `tests/`, and `benchmarks/`. + +## AOT and Trimming + +- Scope by project type (usually set in **`Directory.Build.props`** with folder-based conditions): + - **test** and **benchmark** projects: no trimming and no AOT checks by default; optimize for correctness/perf feedback, not deployment-shape validation: + - `IsAotCompatible=false` + - `VerifyReferenceAotCompatibility=false` + - `EnableTrimAnalyzer=false` + - `IsTrimmable=false` + - **product** projects: trimming and AOT checks enabled by default (usually set in **`Directory.Build.props`**): + - `IsAotCompatible=true` + - `VerifyReferenceAotCompatibility=true` when strict dependency metadata validation is desired. + - `EnableTrimAnalyzer=true` + - `IsTrimmable=true` +- Build and classify diagnostics (handled in CI and local `dotnet build`/`dotnet publish`): + - IL2026-family: trimming compatibility issue. + - IL3050-family: AOT dynamic-code issue. + - IL3058: referenced assembly is not marked AOT-compatible. +- If IL2026 appears (code-level fix): + - first try `DynamicallyAccessedMembersAttribute` to make reflection requirements explicit. + - if an API is fundamentally trim-unsafe, annotate the API boundary with `RequiresUnreferencedCodeAttribute`. + - avoid suppression-first fixes. +- If IL3050 appears (code-level fix): + - first try removing/replacing dynamic code patterns. + - if an API is fundamentally AOT-unsafe, annotate the API boundary with `RequiresDynamicCodeAttribute`. + - if unsupported surface is substantial, split into AOT-safe core and non-AOT companion code/package. +- If strict AOT/trimming is not worth it for a specific product project (project-level opt-out in **`*.csproj`**): + - `IsAotCompatible=false` + - `VerifyReferenceAotCompatibility=false` + If needed, also set: + - `EnableTrimAnalyzer=false` + - `IsTrimmable=false` + - use this only as an explicit, documented design decision with rationale in README/changelog/PR. +- Re-run checks and verify warning flow (CI and local build/publish): + - warnings should be either fixed or intentionally bubbled at public API boundaries. + - unsupported features must be documented clearly for consumers. +- IL warning suppression policy (code-level and project-level): + - **do not suppress IL warnings** (`IL2xxx`, `IL3xxx`) by default. + - only suppress when the safety argument is explicit, tested, and documented. + - if you think suppression is the easiest fix, stop and re-evaluate API design first. + - unless you really, really know what you are doing, Val. ## Git and PR Hygiene diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index 64605d0..ae28c4e 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -52,20 +52,21 @@ concurrency: env: BUILD_PROJECTS: >- [ - "./vm2.Ulid.slnx" + "vm2.Ulid.slnx" ] TEST_PROJECTS: >- [ - "test/UlidType.Tests/UlidType.Tests.csproj", - "test/UlidTool.Tests/UlidTool.Tests.csproj" + "tests/Ulid/Ulid.Tests.csproj", + "tests/UlidTool/UlidTool.Tests.csproj" ] BENCHMARK_PROJECTS: >- [ - "benchmarks/UlidType.Benchmarks/UlidType.Benchmarks.csproj" + "benchmarks/Ulid/Ulid.Benchmarks.csproj" ] PACKAGE_PROJECTS: >- [ - "src/UlidType/UlidType.csproj", + "src/Ulid/Ulid.csproj", + "src/Serialization.NsJson.Ulid/Serialization.NsJson.Ulid.csproj", "src/UlidTool/UlidTool.csproj" ] RUNNERS_OS: >- diff --git a/.github/workflows/Prerelease.yaml b/.github/workflows/Prerelease.yaml index 4247e53..659dd12 100644 --- a/.github/workflows/Prerelease.yaml +++ b/.github/workflows/Prerelease.yaml @@ -26,7 +26,8 @@ on: env: PACKAGE_PROJECTS: >- [ - "src/UlidType/UlidType.csproj", + "src/Ulid/Ulid.csproj", + "src/Serialization.NsJson.Ulid/Serialization.NsJson.Ulid.csproj", "src/UlidTool/UlidTool.csproj" ] # Ensure the NUGET_API_KEY secret is issued by the server selected here. diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 9a8c650..997a1c1 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -12,7 +12,8 @@ on: env: PACKAGE_PROJECTS: >- [ - "src/UlidType/UlidType.csproj", + "src/Ulid/Ulid.csproj", + "src/Serialization.NsJson.Ulid/Serialization.NsJson.Ulid.csproj", "src/UlidTool/UlidTool.csproj" ] # Ensure the NUGET_API_KEY secret is issued by the server selected here. diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 6432777..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "cSpell.words": [ - "inproc", - "Ulids" - ] -} diff --git a/CLAUDE.md b/CLAUDE.md index 8f9ff98..f51bfac 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -33,12 +33,12 @@ Key design decisions: ```text vm2.Ulid/ ├── src/ -│ ├── UlidType/ # Core library: Ulid struct, UlidFactory, providers +│ ├── Ulid/ # Core library: Ulid struct, UlidFactory, providers │ └── UlidTool/ # CLI tool: generate ULIDs from command line -├── test/ -│ └── UlidType.Tests/ # xUnit v3 tests +├── tests/ +│ └── Ulid.Tests/ # xUnit v3 tests ├── benchmarks/ -│ └── UlidType.Benchmarks/ +│ └── Ulid.Benchmarks/ ├── examples/ │ └── GenerateUlids.cs # Runnable script example └── vm2.Ulid.slnx diff --git a/Directory.Build.props b/Directory.Build.props index fe07603..51eb429 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,4 +1,35 @@ + + + + true + + + true + + + true + + + true + + + true + + 0 @@ -8,7 +39,8 @@ - $(preprocessor_symbols);$(DefineConstants) + $(preprocessor_symbols);$(DefineConstants) $([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), 'Directory.Build.props')) @@ -27,9 +59,6 @@ $(NoWarn);IDE0058;IDE0290;IDE0130; true portable - true - true - true true true true @@ -48,13 +77,13 @@ - + true vm vm2 vm2 packages and tools Val Melamed - Copyright ©2025 vm + Copyright ©2025-2026 vm MIT false git @@ -66,7 +95,22 @@ true - + + + true + true + true + true + + + + + + + + + + @@ -75,27 +119,6 @@ - - - - - - - - - - - - - - - all - - - all - - - - - - true - - Exe - false - False false $(NoWarn); @@ -131,10 +143,12 @@ TestingPlatformServer/TestContainer capabilities, causing an infinite project reload loop (Solution Explorer flickering). Disabling the server capability stops the loop. Tests still run from CLI and VS Build+Run (Ctrl+R,A). --> - true + true - $(TestingPlatformCommandLineArguments) --coverage --coverage-output-format cobertura --coverage-settings "$(RepoRoot)coverage.settings.xml" + $(TestingPlatformCommandLineArguments) --coverage --coverage-output-format cobertura --coverage-settings "$(RepoRoot)coverage.settings.xml" @@ -168,15 +182,6 @@ FluentAssertions For non-test projects in the ./test folder (utilities, extensions, etc.): --> - - - true - - false @@ -208,18 +213,9 @@ - - - true - - Exe - false - False false $(NoWarn); @@ -247,9 +243,7 @@ $(DefineConstants);SHORT_RUN @@ -264,23 +258,13 @@ - - - true - - - false - false - + - diff --git a/Directory.Packages.props b/Directory.Packages.props index d7afc9b..c7aa4be 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -4,20 +4,9 @@ true - - - - - - - - - - - - + @@ -30,12 +19,15 @@ - + + - + + + diff --git a/README.md b/README.md index b444c9b..e28b2d1 100644 --- a/README.md +++ b/README.md @@ -25,16 +25,17 @@ - [Why Do I Need `UlidFactory`?](#why-do-i-need-ulidfactory) - [The `vm2.UlidFactory` Class](#the-vm2ulidfactory-class) - [Randomness Provider (`vm2.IRandomNumberGenerator`)](#randomness-provider-vm2irandomnumbergenerator) - - [Timestamp Provider (`vm2.ITimestampProvider`)](#timestamp-provider-vm2itimestampprovider) + - [Timestamp Provider (`System.TimeProvider`)](#timestamp-provider-systemtimeprovider) + - [Serialization](#serialization) - [The `UlidFactory` in a Distributed System](#the-ulidfactory-in-a-distributed-system) - [Performance](#performance) - - [Related Packages](#related-packages) + - [Related Documents and Packages](#related-documents-and-packages) - [License](#license) ## Overview -A small, fast, and spec-compliant .NET package that implements +A small, fast, AoT ready, and **spec-compliant** .NET package that implements [Universally Unique Lexicographically Sortable Identifier (ULID)](https://github.com/ulid/spec). ULIDs combine a 48-bit timestamp (milliseconds since Unix epoch) with 80 bits of randomness, producing compact 128-bit @@ -93,14 +94,14 @@ For testing, database seeding, and other automation, use the [vm2.UlidTool](http ## Get the Code -You can clone the [GitHub repository](https://github.com/vm2/vm2.Ulid). The project is in the `src/UlidType` directory. +You can clone the [GitHub repository](https://github.com/vm2/vm2.Ulid). The project is in the `src/Ulid` directory. ## Build from the Source Code - Command line: ```bash - dotnet build src/UlidType/UlidType.csproj + dotnet build src/Ulid/Ulid.csproj ``` - Visual Studio: @@ -114,7 +115,7 @@ Tests are buildable and runnable from the command line using the `dotnet` CLI an - Command line: ```bash - dotnet test --project test/UlidType.Tests/UlidType.Tests.csproj + dotnet test --project tests/Ulid.Tests/Ulid.Tests.csproj ``` - The tests can also be run standalone after building the solution or the test project: @@ -123,24 +124,23 @@ Tests are buildable and runnable from the command line using the `dotnet` CLI an ```bash dotnet build # build the full solution or - dotnet build test/UlidType.Tests/UlidType.Tests.csproj # the test project only + dotnet build tests/Ulid.Tests/Ulid.Tests.csproj # the test project only ``` - Run the tests standalone: ```bash - test/UlidType.Tests/bin/Debug/net10.0/UlidType.Tests + tests/Ulid.Tests/bin/Debug/net10.0/Ulid.Tests ``` ## Benchmark Tests -The benchmark tests project is in the `benchmarks` directory. It uses BenchmarkDotNet v0.13.8. Benchmarks are buildable and -runnable from the command line using the `dotnet` CLI. +The benchmark tests project is in the `benchmarks` directory. It uses BenchmarkDotNet Benchmarks are buildable and runnable from the command line using the `dotnet` in **Release** configuration. - Command line: ```bash - dotnet run --project benchmarks/UlidType.Benchmarks/UlidType.Benchmarks.csproj -c Release + dotnet run --project benchmarks/Ulid.Benchmarks/Ulid.Benchmarks.csproj -c Release ``` - The benchmarks can also be run standalone after building the benchmark project: @@ -148,21 +148,27 @@ runnable from the command line using the `dotnet` CLI. - build the benchmark project only: ```bash - dotnet build -c Release benchmarks/UlidType.Benchmarks/UlidType.Benchmarks.csproj + dotnet build -c Release benchmarks/Ulid.Benchmarks/Ulid.Benchmarks.csproj ``` - Run the benchmarks standalone (Linux/macOS): ```bash - benchmarks/UlidType.Benchmarks/bin/Release/net10.0/UlidType.Benchmarks + benchmarks/Ulid.Benchmarks/bin/Release/net10.0/Ulid.Benchmarks --filter '*' --join --exporters json markdown --memory ``` - Run the benchmarks standalone (Windows): ```bash - benchmarks/UlidType.Benchmarks/bin/Release/net10.0/UlidType.Benchmarks.exe + benchmarks/Ulid.Benchmarks/bin/Release/net10.0/Ulid.Benchmarks.exe --filter '*' --join --exporters json markdown --memory ``` +- You can also use the Bash script `run-benchmarks.sh` from the `vm2.DevOps` repository to run the benchmarks, e.g.: + + ```bash + bash vm2.DevOps/.github/scripts/run-benchmarks.sh $VM2_REPOS/vm2.Ulid/benchmarks/Ulid/Ulid.Benchmarks.csproj + ``` + ## Build and Run the Example The example is a file-based application `GenerateUlids.cs` in the `examples` directory. It demonstrates basic usage of the @@ -257,16 +263,15 @@ generating a new random value. ### The `vm2.UlidFactory` Class The `vm2.UlidFactory` class encapsulates the requirements and exposes a simple interface for generating ULIDs. Use multiple -`vm2.UlidFactory` instances when needed, e.g. one per database table or entity type. +`vm2.UlidFactory` instances when needed, e.g. one per aggregate root or database table. -ULID factories are thread-safe and ensure monotonicity of generated ULIDs across application contexts. -The factory uses two providers: one for the random bytes and one for the timestamp. +ULID factories are thread-safe and ensure monotonicity of generated ULIDs across application contexts. The factory uses two providers: one for the random bytes and one for the timestamp. Use dependency injection to construct the factory and manage the providers. DI keeps the provider lifetimes explicit, makes testing simple, and enforces a single, consistent configuration across the app or service. In simple scenarios, use the static method `vm2.Ulid.NewUlid()` instead of `vm2.UlidFactory`. It uses an internal single static -factory instance with a cryptographic random number generator and `DateTimeOffset.UtcNow` based clock. +factory instance with a cryptographic random number generator and a clock based on `System.TimeProvider.System.GetUtcNow().ToUnixTimeMilliseconds()`. #### Randomness Provider (`vm2.IRandomNumberGenerator`) @@ -276,11 +281,16 @@ e.g. for testing purposes, for performance reasons, or if you are concerned abou can explicitly specify that the factory should use the pseudo-random number generator `vm2.UlidRandomProviders.PseudoRandom`. You can also provide your own, thread-safe implementation of `vm2.IRandomNumberGenerator` to the factory. -#### Timestamp Provider (`vm2.ITimestampProvider`) +#### Timestamp Provider (`System.TimeProvider`) + +By default, the timestamp provider uses `System.TimeProvider.System.GetUtcNow().ToUnixTimeMilliseconds()` converted to Unix epoch time in milliseconds. If you need a different source of time, e.g. for testing purposes, you can use `Microsoft.Extensions.Time.Testing.FakeTimeProvider` (package `Microsoft.Extensions.TimeProvider.Testing`) or provide your own implementation that overrides the .NET BCL class `System.TimeProvider` and pass that to the factory. + +#### Serialization + +The `vm2.Ulid` type is marked with the `System.Text.Json.Serialization.JsonConverterAttribute` attribute, so it can be serialized and deserialized by `System.Text.Json` without any additional configuration. For Newtonsoft.Json, use the companion package `vm2.UlidSerialization.NsJson` ([source code](https://github.com/vmelamed/vm2.Ulid/blob/main/src/UlidNsConverter)). -By default, the timestamp provider uses `DateTimeOffset.UtcNow` converted to Unix epoch time in milliseconds. If you need a -different source of time, e.g. for testing purposes, you can provide your own implementation of `vm2.ITimestampProvider` to the -factory. +> [!WARNING] +> The `vm2.UlidSerialization.NsJson` package depends on Newtonsoft.Json, which is not AoT compatible. ### The `UlidFactory` in a Distributed System @@ -335,10 +345,12 @@ Legend: random number generator on every call, whereas `Ulid.NewUlid` only uses it when the millisecond timestamp changes and if it doesn't, it simply increments the random part of the previous call. -## Related Packages +## Related Documents and Packages - **[ULID Specification](https://github.com/ulid/spec)** - Official ULID spec +- **[vm2.UlidSerialization.NsJson](https://github.com/vmelamed/vm2.Ulid/blob/main/src/UlidNsConverter)** - Companion package: Newtonsoft.Json converter for vm2.Ulid - **[vm2.UlidTool](https://github.com/vmelamed/vm2.Ulid/blob/main/src/UlidTool)** - ULID Generator Command Line Tool +- **[Example](https://github.com/vmelamed/vm2.Ulid/blob/main/examples/GenerateUlids.cs)** - Basic usage example ## License diff --git a/benchmarks/Ulid/NewUlid.cs b/benchmarks/Ulid/NewUlid.cs new file mode 100644 index 0000000..66cae25 --- /dev/null +++ b/benchmarks/Ulid/NewUlid.cs @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2025-2026 Val Melamed + +namespace vm2.Benchmarks.Ulid; + +using vm2; + +#if SHORT_RUN +[ShortRunJob] +#else +[SimpleJob(RuntimeMoniker.HostProcess)] +#endif +public class NewUlid +{ + [Params(nameof(CryptoRandom), nameof(PseudoRandom))] + public string RandomProviderType { get; set; } = ""; + + IUlidRandomProvider? RandomProvider { get; set; } + + UlidFactory Factory { get; set; } = null!; + + [GlobalSetup] + public void Setup() + { + RandomProvider = RandomProviderType switch { + nameof(CryptoRandom) => new CryptoRandom(), + nameof(PseudoRandom) => new PseudoRandom(), + _ => throw new InvalidOperationException("RandomProviderType is not set"), + }; + Factory = new(RandomProvider); + } + +#if GUID_BASELINE + [Benchmark(Description = "Guid.NewGuid", Baseline = true)] + public Guid Guid_NewGuid() => Guid.NewGuid(); +#endif + + [Benchmark(Description = "Ulid.NewUlid")] + public Ulid Ulid_NewUlid() => Ulid.NewUlid(); + + [Benchmark(Description = "Factory.NewUlid")] + public Ulid Factory_NewUlid() => Factory.NewUlid(); +} diff --git a/benchmarks/Ulid/ParseUlid.cs b/benchmarks/Ulid/ParseUlid.cs new file mode 100644 index 0000000..04a50fe --- /dev/null +++ b/benchmarks/Ulid/ParseUlid.cs @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2025-2026 Val Melamed + +namespace vm2.Benchmarks.Ulid; + +using vm2; + +#if SHORT_RUN +[ShortRunJob] +#else +[SimpleJob(RuntimeMoniker.HostProcess)] +#endif +public class ParseUlid +{ + const int MaxDataItems = 1000; + PreGeneratedData _data2 = null!; + PreGeneratedData _data3 = null!; +#if GUID_BASELINE + PreGeneratedData _data1 = null!; +#endif + + [GlobalSetup] + public void Setup() + { + UlidFactory _factory = new(); + + _data2 = new(MaxDataItems, _ => _factory.NewUlid().ToString()); + _data3 = new(MaxDataItems, _ => Encoding.UTF8.GetBytes(_factory.NewUlid().ToString())); +#if GUID_BASELINE + _data1 = new(MaxDataItems, _ => Guid.NewGuid().ToString()); +#endif + } + + [Benchmark(Description = "Ulid.Parse(StringUtf16)")] + public Ulid Ulid_Parse_Utf16() => Ulid.Parse(_data2.GetNext()); + + [Benchmark(Description = "Ulid.Parse(StringUtf8)")] + public Ulid Ulid_Parse_Utf8() => Ulid.Parse(_data3.GetNext()); + +#if GUID_BASELINE + [Benchmark(Description = "Guid.Parse(string)", Baseline = true)] + public Guid Guid_Parse() => Guid.Parse(_data1.GetNext()); +#endif +} diff --git a/benchmarks/Ulid/PreGeneratedData.cs b/benchmarks/Ulid/PreGeneratedData.cs new file mode 100644 index 0000000..0608c21 --- /dev/null +++ b/benchmarks/Ulid/PreGeneratedData.cs @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2025-2026 Val Melamed + +namespace vm2.Benchmarks.Ulid; + +class PreGeneratedData +{ + int _numberItems; + int _index; + T[] _data = null!; + + public PreGeneratedData(int number, Func factory) + { + _numberItems = number; + _index = 0; + _data = [.. Enumerable.Range(0, _numberItems).Select(factory)]; + } + + public T GetNext() + { + if (_index >= _numberItems) + _index = 0; + return _data[_index++]; + } + + public T Current => _data[_index]; +} diff --git a/benchmarks/UlidType.Benchmarks/Program.cs b/benchmarks/Ulid/Program.cs similarity index 100% rename from benchmarks/UlidType.Benchmarks/Program.cs rename to benchmarks/Ulid/Program.cs diff --git a/benchmarks/Ulid/Ulid.Benchmarks.csproj b/benchmarks/Ulid/Ulid.Benchmarks.csproj new file mode 100644 index 0000000..461e996 --- /dev/null +++ b/benchmarks/Ulid/Ulid.Benchmarks.csproj @@ -0,0 +1,15 @@ + + + + Exe + vm2.Benchmarks.Ulid + + + + + + + + + + diff --git a/benchmarks/Ulid/UlidToString.cs b/benchmarks/Ulid/UlidToString.cs new file mode 100644 index 0000000..a8b78e4 --- /dev/null +++ b/benchmarks/Ulid/UlidToString.cs @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2025-2026 Val Melamed + +namespace vm2.Benchmarks.Ulid; + +using vm2; + +#if SHORT_RUN +[ShortRunJob] +#else +[SimpleJob(RuntimeMoniker.HostProcess)] +#endif +public class UlidToString +{ + const int MaxDataItems = 1000; + +#if GUID_BASELINE + PreGeneratedData _data1 = null!; +#endif + PreGeneratedData _data2 = null!; + + [GlobalSetup] + public void Setup() + { + UlidFactory _factory = new(); + +#if GUID_BASELINE + _data1 = new(MaxDataItems, _ => Guid.NewGuid()); +#endif + _data2 = new(MaxDataItems, _ => _factory.NewUlid()); + } + +#if GUID_BASELINE + [Benchmark(Description = "Guid.ToString", Baseline = true)] + public string Guid_ToString() => _data1.GetNext().ToString(); +#endif + + [Benchmark(Description = "Ulid.ToString")] + public string Ulid_ToString() => _data2.GetNext().ToString(); +} diff --git a/benchmarks/Ulid/packages.lock.json b/benchmarks/Ulid/packages.lock.json new file mode 100644 index 0000000..15033ef --- /dev/null +++ b/benchmarks/Ulid/packages.lock.json @@ -0,0 +1,219 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "BenchmarkDotNet": { + "type": "Direct", + "requested": "[0.15.8, )", + "resolved": "0.15.8", + "contentHash": "paCfrWxSeHqn3rUZc0spYXVFnHCF0nzRhG0nOLnyTjZYs8spsimBaaNmb3vwqvALKIplbYq/TF393vYiYSnh/Q==", + "dependencies": { + "BenchmarkDotNet.Annotations": "0.15.8", + "CommandLineParser": "2.9.1", + "Gee.External.Capstone": "2.3.0", + "Iced": "1.21.0", + "Microsoft.CodeAnalysis.CSharp": "4.14.0", + "Microsoft.Diagnostics.Runtime": "3.1.512801", + "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.21", + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Perfolizer": "[0.6.1]", + "System.Management": "9.0.5" + } + }, + "BenchmarkDotNet.Annotations": { + "type": "Direct", + "requested": "[0.15.8, )", + "resolved": "0.15.8", + "contentHash": "hfucY0ycAsB0SsoaZcaAp9oq5wlWBJcylvEJb9pmvdYUx6PD6S4mDiYnZWjdjAlLhIpe/xtGCwzORfzAzPqvzA==" + }, + "Microsoft.Extensions.TimeProvider.Testing": { + "type": "Direct", + "requested": "[10.6.0, )", + "resolved": "10.6.0", + "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[10.0.300, )", + "resolved": "10.0.300", + "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "10.0.300", + "Microsoft.SourceLink.Common": "10.0.300", + "System.IO.Hashing": "10.0.8" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Gee.External.Capstone": { + "type": "Transitive", + "resolved": "2.3.0", + "contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw==" + }, + "Iced": { + "type": "Transitive", + "resolved": "1.21.0", + "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", + "dependencies": { + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.11.0", + "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.14.0", + "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.11.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.14.0", + "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Common": "[4.14.0]" + } + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.510501", + "contentHash": "juoqJYMDs+lRrrZyOkXXMImJHneCF23cuvO4waFRd2Ds7j+ZuGIPbJm0Y/zz34BdeaGiiwGWraMUlln05W1PCQ==", + "dependencies": { + "Microsoft.Extensions.Logging": "6.0.0" + } + }, + "Microsoft.Diagnostics.Runtime": { + "type": "Transitive", + "resolved": "3.1.512801", + "contentHash": "0lMUDr2oxNZa28D6NH5BuSQEe5T9tZziIkvkD44YkkCGQXPJqvFjLq5ZQq1hYLl3RjQJrY+hR0jFgap+EWPDTw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.410101" + } + }, + "Microsoft.Diagnostics.Tracing.TraceEvent": { + "type": "Transitive", + "resolved": "3.1.21", + "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", + "System.Reflection.TypeExtensions": "4.7.0" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" + }, + "Perfolizer": { + "type": "Transitive", + "resolved": "0.6.1", + "contentHash": "CR1QmWg4XYBd1Pb7WseP+sDmV8nGPwvmowKynExTqr3OuckIGVMhvmN4LC5PGzfXqDlR295+hz/T7syA1CxEqA==", + "dependencies": { + "Pragmastat": "3.2.4" + } + }, + "Pragmastat": { + "type": "Transitive", + "resolved": "3.2.4", + "contentHash": "I5qFifWw/gaTQT52MhzjZpkm/JPlfjSeO/DTZJjO7+hTKI+0aGRgOgZ3NN6D96dDuuqbIAZSeA5RimtHjqrA2A==" + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "n6o9PZm9p25+zAzC3/48K0oHnaPKTInRrxqFq1fi/5TPbMLjuoCm/h//mS3cUmSy+9AO1Z+qsC/Ilt/ZFatv5Q==", + "dependencies": { + "System.CodeDom": "9.0.5" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "vm2.Ulid": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )" + } + } + } + } +} \ No newline at end of file diff --git a/benchmarks/Ulid/usings.cs b/benchmarks/Ulid/usings.cs new file mode 100644 index 0000000..76daf3c --- /dev/null +++ b/benchmarks/Ulid/usings.cs @@ -0,0 +1,3 @@ +global using System.Text; + +global using vm2.Providers.Ulid; diff --git a/benchmarks/UlidType.Benchmarks/UlidBenchmarks.cs b/benchmarks/UlidType.Benchmarks/UlidBenchmarks.cs deleted file mode 100644 index 4d3d2ea..0000000 --- a/benchmarks/UlidType.Benchmarks/UlidBenchmarks.cs +++ /dev/null @@ -1,143 +0,0 @@ -// SPDX-License-Identifier: MIT -// Copyright (c) 2025-2026 Val Melamed - -namespace vm2.UlidType.Benchmarks; - -using System.Text; - -using vm2; -using vm2.Providers; - -#pragma warning disable CA1822 // The benchmark methods must not be static - -class PreGeneratedData -{ - int _numberItems; - int _index; - T[] _data = null!; - - public PreGeneratedData(int number, Func factory) - { - _numberItems = number; - _index = 0; - _data = [.. Enumerable.Range(0, _numberItems).Select(factory)]; - } - - public T GetNext() - { - if (_index >= _numberItems) - _index = 0; - return _data[_index++]; - } - - public T Current => _data[_index]; -} - -#if SHORT_RUN -[ShortRunJob] -#else -[SimpleJob(RuntimeMoniker.HostProcess)] -#endif -public class NewUlid -{ - [Params(nameof(CryptoRandom), nameof(PseudoRandom))] - public string RandomProviderType { get; set; } = ""; - - IUlidRandomProvider? RandomProvider { get; set; } - - UlidFactory Factory { get; set; } = null!; - - [GlobalSetup] - public void Setup() - { - RandomProvider = RandomProviderType switch { - nameof(CryptoRandom) => new CryptoRandom(), - nameof(PseudoRandom) => new PseudoRandom(), - _ => throw new InvalidOperationException("RandomProviderType is not set"), - }; - Factory = new(RandomProvider); - } - -#if GUID_BASELINE - [Benchmark(Description = "Guid.NewGuid", Baseline = true)] - public Guid Guid_NewGuid() => Guid.NewGuid(); -#endif - - [Benchmark(Description = "Ulid.NewUlid")] - public Ulid Ulid_NewUlid() => Ulid.NewUlid(); - - [Benchmark(Description = "Factory.NewUlid")] - public Ulid Factory_NewUlid() => Factory.NewUlid(); -} - -#if SHORT_RUN -[ShortRunJob] -#else -[SimpleJob(RuntimeMoniker.HostProcess)] -#endif -public class UlidToString -{ - const int MaxDataItems = 1000; - -#if GUID_BASELINE - PreGeneratedData _data1 = null!; -#endif - PreGeneratedData _data2 = null!; - - [GlobalSetup] - public void Setup() - { - UlidFactory _factory = new(); - -#if GUID_BASELINE - _data1 = new(MaxDataItems, _ => Guid.NewGuid()); -#endif - _data2 = new(MaxDataItems, _ => _factory.NewUlid()); - } - -#if GUID_BASELINE - [Benchmark(Description = "Guid.ToString", Baseline = true)] - public string Guid_ToString() => _data1.GetNext().ToString(); -#endif - - [Benchmark(Description = "Ulid.ToString")] - public string Ulid_ToString() => _data2.GetNext().ToString(); -} - -#if SHORT_RUN -[ShortRunJob] -#else -[SimpleJob(RuntimeMoniker.HostProcess)] -#endif -public class ParseUlid -{ - const int MaxDataItems = 1000; - PreGeneratedData _data2 = null!; - PreGeneratedData _data3 = null!; -#if GUID_BASELINE - PreGeneratedData _data1 = null!; -#endif - - [GlobalSetup] - public void Setup() - { - UlidFactory _factory = new(); - - _data2 = new(MaxDataItems, _ => _factory.NewUlid().ToString()); - _data3 = new(MaxDataItems, _ => Encoding.UTF8.GetBytes(_factory.NewUlid().ToString())); -#if GUID_BASELINE - _data1 = new(MaxDataItems, _ => Guid.NewGuid().ToString()); -#endif - } - - [Benchmark(Description = "Ulid.Parse(StringUtf16)")] - public Ulid Ulid_Parse_Utf16() => Ulid.Parse(_data2.GetNext()); - - [Benchmark(Description = "Ulid.Parse(StringUtf8)")] - public Ulid Ulid_Parse_Utf8() => Ulid.Parse(_data3.GetNext()); - -#if GUID_BASELINE - [Benchmark(Description = "Guid.Parse(string)", Baseline = true)] - public Guid Guid_Parse() => Guid.Parse(_data1.GetNext()); -#endif -} diff --git a/benchmarks/UlidType.Benchmarks/UlidType.Benchmarks.csproj b/benchmarks/UlidType.Benchmarks/UlidType.Benchmarks.csproj deleted file mode 100644 index 40c1978..0000000 --- a/benchmarks/UlidType.Benchmarks/UlidType.Benchmarks.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - vm2.UlidType.Benchmark - - - - - - - - - - diff --git a/benchmarks/UlidType.Benchmarks/packages.lock.json b/benchmarks/UlidType.Benchmarks/packages.lock.json deleted file mode 100644 index 366e7df..0000000 --- a/benchmarks/UlidType.Benchmarks/packages.lock.json +++ /dev/null @@ -1,404 +0,0 @@ -{ - "version": 2, - "dependencies": { - "net10.0": { - "BenchmarkDotNet": { - "type": "Direct", - "requested": "[0.15.8, )", - "resolved": "0.15.8", - "contentHash": "paCfrWxSeHqn3rUZc0spYXVFnHCF0nzRhG0nOLnyTjZYs8spsimBaaNmb3vwqvALKIplbYq/TF393vYiYSnh/Q==", - "dependencies": { - "BenchmarkDotNet.Annotations": "0.15.8", - "CommandLineParser": "2.9.1", - "Gee.External.Capstone": "2.3.0", - "Iced": "1.21.0", - "Microsoft.CodeAnalysis.CSharp": "4.14.0", - "Microsoft.Diagnostics.Runtime": "3.1.512801", - "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.21", - "Microsoft.DotNet.PlatformAbstractions": "3.1.6", - "Perfolizer": "[0.6.1]", - "System.Management": "9.0.5" - } - }, - "BenchmarkDotNet.Annotations": { - "type": "Direct", - "requested": "[0.15.8, )", - "resolved": "0.15.8", - "contentHash": "hfucY0ycAsB0SsoaZcaAp9oq5wlWBJcylvEJb9pmvdYUx6PD6S4mDiYnZWjdjAlLhIpe/xtGCwzORfzAzPqvzA==" - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "R3NN1X+kVu14uoxLEW6sBSQyhogDSbaOQzILnCtuXxBN4hx22AgjWPwZX6v/suERFkEDgU1lk12AglHTrUxhlw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "nQXq1a4MiInYh+0VF9fguxAl06q2ftmOyYQ+5e933s4rk57xjgkbTjUdFUySzjrcrvDeWsSqlZB+TE8+TbM2HA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "bVGqctAfPGfTxJvNp8pMshtvpsUj6r6JkeiCNVIGVYO5gBxuxdN0Lbr25kEvE/zXdctkEc44g8HssnPgDnFGVA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "KLtAZ6A38s1pIfCO2ns6aG14NNGMYNZ4PBYfFK4M+R4A+xuSc6oklhqDcpHZxvDpyBWeFtR5C8iQBw2ng8tUHQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "6cv53sHsPnFS56PJw8X4GbNcjeX1KGyFJRxJWvxOgK63cnqeSB1k1eRwjUdkse0tBhwlH6qc9EOYDlan+CYTuw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "VOapXeO3lhBH0zYoyAH7tjapuo4V5pTHlevPpiSHueEquAajqd5nF0mttm+h/uE/exwAEuM5s26SzOJtletE3w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.TimeProvider.Testing": { - "type": "Direct", - "requested": "[10.6.0, )", - "resolved": "10.6.0", - "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "dVbSXGIFNR5nZcv2tOLoWI+a9T4jtFd77IYjuND+QVe360qWgAF7H0WtoopYhRw/+SgpGUTyrkrh+65+ClNnfw==" - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[10.0.300, )", - "resolved": "10.0.300", - "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.300", - "Microsoft.SourceLink.Common": "10.0.300", - "System.IO.Hashing": "10.0.8" - } - }, - "MinVer": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" - }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.4, )", - "resolved": "13.0.4", - "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" - }, - "System.Configuration.ConfigurationManager": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "QG+HHwJjLyUiRuA9axr5pDqHAxboo7FXCTRakxMABE9CUAUij/tsd/MsgQPJUEppkf+YBLT+F/P/wKIVCAIcNg==", - "dependencies": { - "System.Diagnostics.EventLog": "10.0.8", - "System.Security.Cryptography.ProtectedData": "10.0.8" - } - }, - "CommandLineParser": { - "type": "Transitive", - "resolved": "2.9.1", - "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" - }, - "Gee.External.Capstone": { - "type": "Transitive", - "resolved": "2.3.0", - "contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw==" - }, - "Iced": { - "type": "Transitive", - "resolved": "1.21.0", - "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", - "dependencies": { - "System.IO.Hashing": "10.0.8" - } - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.11.0", - "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.14.0", - "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.11.0" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.14.0", - "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.11.0", - "Microsoft.CodeAnalysis.Common": "[4.14.0]" - } - }, - "Microsoft.Diagnostics.NETCore.Client": { - "type": "Transitive", - "resolved": "0.2.510501", - "contentHash": "juoqJYMDs+lRrrZyOkXXMImJHneCF23cuvO4waFRd2Ds7j+ZuGIPbJm0Y/zz34BdeaGiiwGWraMUlln05W1PCQ==", - "dependencies": { - "Microsoft.Extensions.Logging": "6.0.0" - } - }, - "Microsoft.Diagnostics.Runtime": { - "type": "Transitive", - "resolved": "3.1.512801", - "contentHash": "0lMUDr2oxNZa28D6NH5BuSQEe5T9tZziIkvkD44YkkCGQXPJqvFjLq5ZQq1hYLl3RjQJrY+hR0jFgap+EWPDTw==", - "dependencies": { - "Microsoft.Diagnostics.NETCore.Client": "0.2.410101" - } - }, - "Microsoft.Diagnostics.Tracing.TraceEvent": { - "type": "Transitive", - "resolved": "3.1.21", - "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==", - "dependencies": { - "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", - "System.Reflection.TypeExtensions": "4.7.0" - } - }, - "Microsoft.DotNet.PlatformAbstractions": { - "type": "Transitive", - "resolved": "3.1.6", - "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "ehZcoPbjzWzS4XFvuz7R3V55SmpdkyMqFURLH3yXaN9NtXd9tR6CGB7pd49HYtCkenl+G7ctXSFLhNI08xLfRg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "1g9mzuu8gIHkjYb0jLxOTQVl/QDG5nn0b0JzgT/gbgNKr6gXZzxOHRAsdYRc1eDApB7LdHR8uK5vQrNjIQdRrQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Physical": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "U+oquaPxFdY8lYeEIWO/AD7jDIl9sPW6aVWMQRHU/pZ/SWpLcOrAj2fcLe1HwXl4sYw1ONI56K/eELT3xr4RRQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "GkPvQe6IdidLu6Q3Lw6+B8NJpW8feW8czZ5mBKt5rXM/x8MvZfEp5WvAsjznzDGd23chIDrW0b2mmt+ScnEgiw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "IUQet3SY51xIFcFZKtAB6a54/Zdxs7T3SQ84kJtOD6yeXfZgiOMksACWD5qtTmXGQGFH4QYGBOT0KIO8Uy/dJw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" - }, - "Perfolizer": { - "type": "Transitive", - "resolved": "0.6.1", - "contentHash": "CR1QmWg4XYBd1Pb7WseP+sDmV8nGPwvmowKynExTqr3OuckIGVMhvmN4LC5PGzfXqDlR295+hz/T7syA1CxEqA==", - "dependencies": { - "Pragmastat": "3.2.4" - } - }, - "Pragmastat": { - "type": "Transitive", - "resolved": "3.2.4", - "contentHash": "I5qFifWw/gaTQT52MhzjZpkm/JPlfjSeO/DTZJjO7+hTKI+0aGRgOgZ3NN6D96dDuuqbIAZSeA5RimtHjqrA2A==" - }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" - }, - "System.Management": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "n6o9PZm9p25+zAzC3/48K0oHnaPKTInRrxqFq1fi/5TPbMLjuoCm/h//mS3cUmSy+9AO1Z+qsC/Ilt/ZFatv5Q==", - "dependencies": { - "System.CodeDom": "9.0.5" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "/ldVgSfImIBp6fLWS7sLH0BnmtFj0ZwGlZo4Xx2q0K3ZhJNDbW45kj2f6zPoC+L+BTINuHdMzTsopuwmkbgcNA==" - }, - "vm2.Ulid": { - "type": "Project", - "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "[10.0.8, )", - "Microsoft.Extensions.Configuration.CommandLine": "[10.0.8, )", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "[10.0.8, )", - "Microsoft.Extensions.Configuration.Json": "[10.0.8, )", - "Microsoft.Extensions.DependencyInjection": "[10.0.8, )", - "Microsoft.Extensions.Logging": "[10.0.8, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", - "Microsoft.Extensions.Logging.Configuration": "[10.0.8, )", - "Microsoft.Extensions.Logging.Console": "[10.0.8, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.8, )", - "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", - "Newtonsoft.Json": "[13.0.4, )", - "System.Configuration.ConfigurationManager": "[10.0.8, )" - } - } - } - } -} \ No newline at end of file diff --git a/examples/GenerateUlids.cs b/examples/GenerateUlids.cs index a2eee08..6e15350 100755 --- a/examples/GenerateUlids.cs +++ b/examples/GenerateUlids.cs @@ -4,7 +4,8 @@ // Copyright (c) 2025-2026 Val Melamed #:property TargetFramework=net10.0 -#:project ../src/UlidType/UlidType.csproj +#:property CopyLocalLockFileAssemblies=true +#:project ../src/Ulid/Ulid.csproj using static System.Console; using static System.Text.Encoding; diff --git a/examples/packages.lock.json b/examples/packages.lock.json index 78a433b..8b0534e 100644 --- a/examples/packages.lock.json +++ b/examples/packages.lock.json @@ -8,119 +8,6 @@ "resolved": "10.0.8", "contentHash": "RJxitcN5CCyZDcPNXKLsecwKvACzmy8C1z8hGM9+hFcnPhv1jDysJFFIeUHIPWaZ6wDAfYtZcgKEtegvL2Nz8A==" }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "R3NN1X+kVu14uoxLEW6sBSQyhogDSbaOQzILnCtuXxBN4hx22AgjWPwZX6v/suERFkEDgU1lk12AglHTrUxhlw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "nQXq1a4MiInYh+0VF9fguxAl06q2ftmOyYQ+5e933s4rk57xjgkbTjUdFUySzjrcrvDeWsSqlZB+TE8+TbM2HA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "bVGqctAfPGfTxJvNp8pMshtvpsUj6r6JkeiCNVIGVYO5gBxuxdN0Lbr25kEvE/zXdctkEc44g8HssnPgDnFGVA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "KLtAZ6A38s1pIfCO2ns6aG14NNGMYNZ4PBYfFK4M+R4A+xuSc6oklhqDcpHZxvDpyBWeFtR5C8iQBw2ng8tUHQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "6cv53sHsPnFS56PJw8X4GbNcjeX1KGyFJRxJWvxOgK63cnqeSB1k1eRwjUdkse0tBhwlH6qc9EOYDlan+CYTuw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "VOapXeO3lhBH0zYoyAH7tjapuo4V5pTHlevPpiSHueEquAajqd5nF0mttm+h/uE/exwAEuM5s26SzOJtletE3w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, "Microsoft.Extensions.TimeProvider.Testing": { "type": "Direct", "requested": "[10.6.0, )", @@ -150,22 +37,6 @@ "resolved": "7.0.0", "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.4, )", - "resolved": "13.0.4", - "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" - }, - "System.Configuration.ConfigurationManager": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "QG+HHwJjLyUiRuA9axr5pDqHAxboo7FXCTRakxMABE9CUAUij/tsd/MsgQPJUEppkf+YBLT+F/P/wKIVCAIcNg==", - "dependencies": { - "System.Diagnostics.EventLog": "10.0.8", - "System.Security.Cryptography.ProtectedData": "10.0.8" - } - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "10.0.300", @@ -174,113 +45,20 @@ "System.IO.Hashing": "10.0.8" } }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "ehZcoPbjzWzS4XFvuz7R3V55SmpdkyMqFURLH3yXaN9NtXd9tR6CGB7pd49HYtCkenl+G7ctXSFLhNI08xLfRg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "1g9mzuu8gIHkjYb0jLxOTQVl/QDG5nn0b0JzgT/gbgNKr6gXZzxOHRAsdYRc1eDApB7LdHR8uK5vQrNjIQdRrQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Physical": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "U+oquaPxFdY8lYeEIWO/AD7jDIl9sPW6aVWMQRHU/pZ/SWpLcOrAj2fcLe1HwXl4sYw1ONI56K/eELT3xr4RRQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "GkPvQe6IdidLu6Q3Lw6+B8NJpW8feW8czZ5mBKt5rXM/x8MvZfEp5WvAsjznzDGd23chIDrW0b2mmt+ScnEgiw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "IUQet3SY51xIFcFZKtAB6a54/Zdxs7T3SQ84kJtOD6yeXfZgiOMksACWD5qtTmXGQGFH4QYGBOT0KIO8Uy/dJw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" - }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "10.0.300", "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" - }, "System.IO.Hashing": { "type": "Transitive", "resolved": "10.0.8", "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "/ldVgSfImIBp6fLWS7sLH0BnmtFj0ZwGlZo4Xx2q0K3ZhJNDbW45kj2f6zPoC+L+BTINuHdMzTsopuwmkbgcNA==" - }, "vm2.Ulid": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "[10.0.8, )", - "Microsoft.Extensions.Configuration.CommandLine": "[10.0.8, )", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "[10.0.8, )", - "Microsoft.Extensions.Configuration.Json": "[10.0.8, )", - "Microsoft.Extensions.DependencyInjection": "[10.0.8, )", - "Microsoft.Extensions.Logging": "[10.0.8, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", - "Microsoft.Extensions.Logging.Configuration": "[10.0.8, )", - "Microsoft.Extensions.Logging.Console": "[10.0.8, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.8, )", - "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", - "Newtonsoft.Json": "[13.0.4, )", - "System.Configuration.ConfigurationManager": "[10.0.8, )" + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )" } } }, @@ -298,11 +76,6 @@ "type": "Transitive", "resolved": "10.0.8", "contentHash": "0jxyi69frgaqADCnEpHE+f65NoiRTAjfjvNDMOxWV77BumQ56eMDL4ECw29DcJTqwaYJQ92PqDS6y6CiLf7kgw==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" } } } diff --git a/src/Serialization.NsJson.Ulid/Serialization.NsJson.Ulid.csproj b/src/Serialization.NsJson.Ulid/Serialization.NsJson.Ulid.csproj new file mode 100644 index 0000000..a061453 --- /dev/null +++ b/src/Serialization.NsJson.Ulid/Serialization.NsJson.Ulid.csproj @@ -0,0 +1,38 @@ + + + + Library + vm2.Serialization.NsJson.Ulid + + + false + false + + + + vm2.Ulid.Serialization.NsJson + Companion package: Newtonsoft.Json converter for vm2.Ulid + Provides a Newtonsoft.Json converter for the ULID-s from vm2.Ulid. + ULID Universally Unique Lexicographically Sortable Identifier .net core vm2 Newtonsoft JSON converter + https://github.com/vmelamed/vm2.Ulid/blob/main/src/UlidNsConverter/UlidNsConverter.csproj + https://github.com/vmelamed/vm2.Ulid + README.md + Initial release: split from vm2.Ulid. This package is not AoT compatible because it depends on Newtonsoft.Json. + + + + + + + + + + + + + + + + + diff --git a/src/UlidType/Serialization/NsJson/UlidNsConverter.cs b/src/Serialization.NsJson.Ulid/UlidConverter.cs similarity index 77% rename from src/UlidType/Serialization/NsJson/UlidNsConverter.cs rename to src/Serialization.NsJson.Ulid/UlidConverter.cs index 8f44dce..812530f 100644 --- a/src/UlidType/Serialization/NsJson/UlidNsConverter.cs +++ b/src/Serialization.NsJson.Ulid/UlidConverter.cs @@ -1,28 +1,28 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidSerialization.NsJson; +namespace vm2.Serialization.NsJson.Ulid; using Newtonsoft.Json; /// -/// Provides functionality to convert values to and from JSON format. -/// Implements the Newtonsoft.Json.". +/// Provides functionality to convert values to and from JSON format. +/// Implements . /// -/// This converter is used to serialize and deserialize values in JSON format. It -/// ensures that instances are correctly represented as strings in JSON and parsed back into objects during deserialization. -public class UlidNsConverter : JsonConverter +/// This converter is used to serialize and deserialize values in JSON format. It +/// ensures that instances are correctly represented as strings in JSON and parsed back into objects during deserialization. +public class UlidConverter : JsonConverter { /// - /// Determines whether the specified type can be converted to or from a . + /// Determines whether the specified type can be converted to or from a . /// /// The type to evaluate for conversion compatibility. /// - /// if the specified type is or ; otherwise, . + /// if the specified type is or vm2.Ulid?; otherwise, . /// public override bool CanConvert(Type objectType) - => objectType == typeof(Ulid) || objectType == typeof(Ulid?); + => objectType == typeof(vm2.Ulid) || objectType == typeof(vm2.Ulid?); /// /// Writes the JSON representation of the specified object using the provided . @@ -38,13 +38,13 @@ public override void WriteJson(JsonWriter writer, object? value, JsonSerializer return; } - if (value is Ulid ulid) + if (value is vm2.Ulid ulid) { writer.WriteValue(ulid.ToString()); return; } - throw new JsonWriterException($"Expected value to be of type {typeof(Ulid)} or null, but got {value?.GetType()}."); + throw new JsonWriterException($"Expected value to be of type {typeof(vm2.Ulid)} or null, but got {value?.GetType()}."); } /// @@ -66,7 +66,7 @@ public override void WriteJson(JsonWriter writer, object? value, JsonSerializer if (reader.TokenType is not JsonToken.String) throw new JsonReaderException($"Expected token type to be {JsonToken.String} or {JsonToken.Null}, but got {reader.TokenType}."); - return Parse(reader.Value.ToString()!); + return vm2.Ulid.Parse(reader.Value.ToString()!); } catch (Exception ex) when (ex is not JsonReaderException) { diff --git a/src/Serialization.NsJson.Ulid/packages.lock.json b/src/Serialization.NsJson.Ulid/packages.lock.json new file mode 100644 index 0000000..1240789 --- /dev/null +++ b/src/Serialization.NsJson.Ulid/packages.lock.json @@ -0,0 +1,66 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Extensions.TimeProvider.Testing": { + "type": "Direct", + "requested": "[10.6.0, )", + "resolved": "10.6.0", + "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "dVbSXGIFNR5nZcv2tOLoWI+a9T4jtFd77IYjuND+QVe360qWgAF7H0WtoopYhRw/+SgpGUTyrkrh+65+ClNnfw==" + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[10.0.300, )", + "resolved": "10.0.300", + "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "10.0.300", + "Microsoft.SourceLink.Common": "10.0.300", + "System.IO.Hashing": "10.0.8" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" + }, + "Newtonsoft.Json": { + "type": "Direct", + "requested": "[13.0.4, )", + "resolved": "13.0.4", + "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", + "dependencies": { + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" + }, + "vm2.Ulid": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/UlidType/IUlidRandomProvider.cs b/src/Ulid/IUlidRandomProvider.cs similarity index 100% rename from src/UlidType/IUlidRandomProvider.cs rename to src/Ulid/IUlidRandomProvider.cs diff --git a/src/UlidType/Providers/CryptoRandom.cs b/src/Ulid/Providers.Ulid/CryptoRandom.cs similarity index 93% rename from src/UlidType/Providers/CryptoRandom.cs rename to src/Ulid/Providers.Ulid/CryptoRandom.cs index 459164e..478f5fc 100644 --- a/src/UlidType/Providers/CryptoRandom.cs +++ b/src/Ulid/Providers.Ulid/CryptoRandom.cs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.Providers; +namespace vm2.Providers.Ulid; /// /// A random provider that uses cryptographic random number generation. diff --git a/src/UlidType/Providers/PseudoRandom.cs b/src/Ulid/Providers.Ulid/PseudoRandom.cs similarity index 93% rename from src/UlidType/Providers/PseudoRandom.cs rename to src/Ulid/Providers.Ulid/PseudoRandom.cs index 5047527..1045c90 100644 --- a/src/UlidType/Providers/PseudoRandom.cs +++ b/src/Ulid/Providers.Ulid/PseudoRandom.cs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.Providers; +namespace vm2.Providers.Ulid; /// /// A random provider that uses a pseudo-random number generator. diff --git a/src/UlidType/Serialization/SysJson/UlidSysConverter.cs b/src/Ulid/Serialization.SysJson.Ulid/UlidConverter.cs similarity index 72% rename from src/UlidType/Serialization/SysJson/UlidSysConverter.cs rename to src/Ulid/Serialization.SysJson.Ulid/UlidConverter.cs index e820c5c..58ae149 100644 --- a/src/UlidType/Serialization/SysJson/UlidSysConverter.cs +++ b/src/Ulid/Serialization.SysJson.Ulid/UlidConverter.cs @@ -1,33 +1,31 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidSerialization.SysJson; - -using System.Text.Json.Serialization; +namespace vm2.Serialization.SysJson.Ulid; /// -/// Provides functionality to convert values to and from JSON format. +/// Provides functionality to convert values to and from JSON format. /// Implements the System.Text.Json.Serialization.". /// /// -/// This converter is used to serialize and deserialize values when working with JSON. It ensures that -/// instances are correctly represented as strings in JSON and parsed back into objects +/// This converter is used to serialize and deserialize values when working with JSON. It ensures that +/// instances are correctly represented as strings in JSON and parsed back into objects /// during deserialization. /// -public class UlidSysConverter : JsonConverter +public class UlidConverter : JsonConverter { /// - /// Writes the specified value as a raw JSON string using the provided . + /// Writes the specified value as a raw JSON string using the provided . /// /// - /// The to which the value will be written. Cannot be null. + /// The to which the value will be written. Cannot be null. /// - /// The value to write. + /// The value to write. /// The to use during serialization. This parameter is not used in this /// implementation but is required by the method signature. public override void Write( Utf8JsonWriter writer, - Ulid value, + vm2.Ulid value, JsonSerializerOptions _) { Span utf8Chars = stackalloc byte[UlidStringLength]; @@ -45,11 +43,11 @@ public override void Write( /// /// The to read the JSON data from. /// The type of the object to convert. This parameter is ignored as this method always converts to a . + /// cref="vm2.Ulid"/>. /// The serializer __ to use during deserialization. This parameter is not used in this implementation. - /// The value parsed from the JSON data. + /// The value parsed from the JSON data. /// Thrown if the JSON data does not represent a valid ULID. - public override Ulid Read(ref Utf8JsonReader reader, Type _, JsonSerializerOptions __) + public override vm2.Ulid Read(ref Utf8JsonReader reader, Type _, JsonSerializerOptions __) { try { diff --git a/src/UlidType/Ulid.Constants.cs b/src/Ulid/Ulid.Constants.cs similarity index 100% rename from src/UlidType/Ulid.Constants.cs rename to src/Ulid/Ulid.Constants.cs diff --git a/src/UlidType/Ulid.cs b/src/Ulid/Ulid.cs similarity index 99% rename from src/UlidType/Ulid.cs rename to src/Ulid/Ulid.cs index 317a5fc..3888fb0 100644 --- a/src/UlidType/Ulid.cs +++ b/src/Ulid/Ulid.cs @@ -11,8 +11,7 @@ namespace vm2; /// order. This struct provides methods for creating, parsing, and manipulating ULIDs, as well as converting them to other formats
/// such as strings or GUIDs. ULIDs are commonly used in distributed systems where unique, sortable identifiers are required. /// -[Newtonsoft.Json.JsonConverter(typeof(UlidNsConverter))] -[System.Text.Json.Serialization.JsonConverter(typeof(UlidSysConverter))] +[JsonConverter(typeof(UlidConverter))] public readonly partial struct Ulid : IEquatable, IComparable, diff --git a/src/UlidType/UlidType.csproj b/src/Ulid/Ulid.csproj similarity index 92% rename from src/UlidType/UlidType.csproj rename to src/Ulid/Ulid.csproj index 4401ff1..12816f3 100644 --- a/src/UlidType/UlidType.csproj +++ b/src/Ulid/Ulid.csproj @@ -1,6 +1,7 @@  + Library vm2 @@ -9,7 +10,7 @@ Universally Unique Lexicographically Sortable Identifier (ULID) for .NET Implementation of the Universally Unique Lexicographically Sortable Identifier (ULID) for .NET. ULID Universally Unique Lexicographically Sortable Identifier .net core vm2 - https://github.com/vmelamed/vm2.Ulid/blob/main/src/UlidType/UlidType.csproj + https://github.com/vmelamed/vm2.Ulid/blob/main/src/Ulid/Ulid.csproj https://github.com/vmelamed/vm2.Ulid README.md No significant changes, but moved to the latest build pipeline templates. diff --git a/src/UlidType/UlidFactory.cs b/src/Ulid/UlidFactory.cs similarity index 99% rename from src/UlidType/UlidFactory.cs rename to src/Ulid/UlidFactory.cs index dcf2107..e0979be 100644 --- a/src/UlidType/UlidFactory.cs +++ b/src/Ulid/UlidFactory.cs @@ -3,8 +3,6 @@ namespace vm2; -using vm2.Providers; - /// /// Provides functionality to generate unique lexicographically sortable identifiers (ULIDs). /// diff --git a/src/Ulid/packages.lock.json b/src/Ulid/packages.lock.json new file mode 100644 index 0000000..7349e48 --- /dev/null +++ b/src/Ulid/packages.lock.json @@ -0,0 +1,54 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "Microsoft.Extensions.TimeProvider.Testing": { + "type": "Direct", + "requested": "[10.6.0, )", + "resolved": "10.6.0", + "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.8, )", + "resolved": "10.0.8", + "contentHash": "dVbSXGIFNR5nZcv2tOLoWI+a9T4jtFd77IYjuND+QVe360qWgAF7H0WtoopYhRw/+SgpGUTyrkrh+65+ClNnfw==" + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[10.0.300, )", + "resolved": "10.0.300", + "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "10.0.300", + "Microsoft.SourceLink.Common": "10.0.300", + "System.IO.Hashing": "10.0.8" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", + "dependencies": { + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" + } + } + } +} \ No newline at end of file diff --git a/src/UlidType/usings.cs b/src/Ulid/usings.cs similarity index 71% rename from src/UlidType/usings.cs rename to src/Ulid/usings.cs index d7f39f0..2782b61 100644 --- a/src/UlidType/usings.cs +++ b/src/Ulid/usings.cs @@ -7,12 +7,10 @@ global using System.Numerics; global using System.Security.Cryptography; global using System.Text.Json; -global using System.Runtime.Serialization; +global using System.Text.Json.Serialization; -global using static System.Buffers.Binary.BinaryPrimitives; - -global using vm2; -global using vm2.UlidSerialization.NsJson; -global using vm2.UlidSerialization.SysJson; +global using vm2.Serialization.SysJson.Ulid; +global using vm2.Providers.Ulid; +global using static System.Buffers.Binary.BinaryPrimitives; global using static vm2.Ulid; diff --git a/src/UlidTool/README.md b/src/UlidTool/README.md index 267bfdb..0f209ae 100644 --- a/src/UlidTool/README.md +++ b/src/UlidTool/README.md @@ -23,7 +23,7 @@ A CLI tool for generating ULIDs (Universally Unique Lexicographically Sortable Identifiers). The tool is based on the -[`vm2.Ulid`](https://github.com/vmelamed/vm2.Ulid/tree/main/src/UlidType) library and provides various output formats and +[`vm2.Ulid`](https://github.com/vmelamed/vm2.Ulid/tree/main/src/Ulid) library and provides various output formats and options for generating ULIDs from the command line. ## Installation diff --git a/src/UlidTool/UlidTool.csproj b/src/UlidTool/UlidTool.csproj index d44029a..9e5c004 100644 --- a/src/UlidTool/UlidTool.csproj +++ b/src/UlidTool/UlidTool.csproj @@ -3,6 +3,10 @@ Exe vm2.UlidTool + + false + false + true ulid @@ -18,7 +22,7 @@ - + diff --git a/src/UlidTool/packages.lock.json b/src/UlidTool/packages.lock.json index 4c6d96f..cfe3bb9 100644 --- a/src/UlidTool/packages.lock.json +++ b/src/UlidTool/packages.lock.json @@ -2,119 +2,6 @@ "version": 2, "dependencies": { "net10.0": { - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "R3NN1X+kVu14uoxLEW6sBSQyhogDSbaOQzILnCtuXxBN4hx22AgjWPwZX6v/suERFkEDgU1lk12AglHTrUxhlw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "nQXq1a4MiInYh+0VF9fguxAl06q2ftmOyYQ+5e933s4rk57xjgkbTjUdFUySzjrcrvDeWsSqlZB+TE8+TbM2HA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "bVGqctAfPGfTxJvNp8pMshtvpsUj6r6JkeiCNVIGVYO5gBxuxdN0Lbr25kEvE/zXdctkEc44g8HssnPgDnFGVA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "KLtAZ6A38s1pIfCO2ns6aG14NNGMYNZ4PBYfFK4M+R4A+xuSc6oklhqDcpHZxvDpyBWeFtR5C8iQBw2ng8tUHQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "6cv53sHsPnFS56PJw8X4GbNcjeX1KGyFJRxJWvxOgK63cnqeSB1k1eRwjUdkse0tBhwlH6qc9EOYDlan+CYTuw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "VOapXeO3lhBH0zYoyAH7tjapuo4V5pTHlevPpiSHueEquAajqd5nF0mttm+h/uE/exwAEuM5s26SzOJtletE3w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, "Microsoft.Extensions.TimeProvider.Testing": { "type": "Direct", "requested": "[10.6.0, )", @@ -144,28 +31,12 @@ "resolved": "7.0.0", "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.4, )", - "resolved": "13.0.4", - "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" - }, "System.CommandLine": { "type": "Direct", "requested": "[2.0.8, )", "resolved": "2.0.8", "contentHash": "FbpgF8p/ClXnoXEWLjQB34kNh5rsLewEgIgLyVzLDucAOQ4cNs7ec9Cam7gdKPruSb6zp4Mx8htZGTL4/5PJPg==" }, - "System.Configuration.ConfigurationManager": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "QG+HHwJjLyUiRuA9axr5pDqHAxboo7FXCTRakxMABE9CUAUij/tsd/MsgQPJUEppkf+YBLT+F/P/wKIVCAIcNg==", - "dependencies": { - "System.Diagnostics.EventLog": "10.0.8", - "System.Security.Cryptography.ProtectedData": "10.0.8" - } - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "10.0.300", @@ -174,113 +45,20 @@ "System.IO.Hashing": "10.0.8" } }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "ehZcoPbjzWzS4XFvuz7R3V55SmpdkyMqFURLH3yXaN9NtXd9tR6CGB7pd49HYtCkenl+G7ctXSFLhNI08xLfRg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "1g9mzuu8gIHkjYb0jLxOTQVl/QDG5nn0b0JzgT/gbgNKr6gXZzxOHRAsdYRc1eDApB7LdHR8uK5vQrNjIQdRrQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Physical": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "U+oquaPxFdY8lYeEIWO/AD7jDIl9sPW6aVWMQRHU/pZ/SWpLcOrAj2fcLe1HwXl4sYw1ONI56K/eELT3xr4RRQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "GkPvQe6IdidLu6Q3Lw6+B8NJpW8feW8czZ5mBKt5rXM/x8MvZfEp5WvAsjznzDGd23chIDrW0b2mmt+ScnEgiw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "IUQet3SY51xIFcFZKtAB6a54/Zdxs7T3SQ84kJtOD6yeXfZgiOMksACWD5qtTmXGQGFH4QYGBOT0KIO8Uy/dJw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" - }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "10.0.300", "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" - }, "System.IO.Hashing": { "type": "Transitive", "resolved": "10.0.8", "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "/ldVgSfImIBp6fLWS7sLH0BnmtFj0ZwGlZo4Xx2q0K3ZhJNDbW45kj2f6zPoC+L+BTINuHdMzTsopuwmkbgcNA==" - }, "vm2.Ulid": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "[10.0.8, )", - "Microsoft.Extensions.Configuration.CommandLine": "[10.0.8, )", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "[10.0.8, )", - "Microsoft.Extensions.Configuration.Json": "[10.0.8, )", - "Microsoft.Extensions.DependencyInjection": "[10.0.8, )", - "Microsoft.Extensions.Logging": "[10.0.8, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", - "Microsoft.Extensions.Logging.Configuration": "[10.0.8, )", - "Microsoft.Extensions.Logging.Console": "[10.0.8, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.8, )", - "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", - "Newtonsoft.Json": "[13.0.4, )", - "System.Configuration.ConfigurationManager": "[10.0.8, )" + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )" } } } diff --git a/src/UlidType/packages.lock.json b/src/UlidType/packages.lock.json deleted file mode 100644 index 6a5c39a..0000000 --- a/src/UlidType/packages.lock.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "version": 2, - "dependencies": { - "net10.0": { - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "R3NN1X+kVu14uoxLEW6sBSQyhogDSbaOQzILnCtuXxBN4hx22AgjWPwZX6v/suERFkEDgU1lk12AglHTrUxhlw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "nQXq1a4MiInYh+0VF9fguxAl06q2ftmOyYQ+5e933s4rk57xjgkbTjUdFUySzjrcrvDeWsSqlZB+TE8+TbM2HA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "bVGqctAfPGfTxJvNp8pMshtvpsUj6r6JkeiCNVIGVYO5gBxuxdN0Lbr25kEvE/zXdctkEc44g8HssnPgDnFGVA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "KLtAZ6A38s1pIfCO2ns6aG14NNGMYNZ4PBYfFK4M+R4A+xuSc6oklhqDcpHZxvDpyBWeFtR5C8iQBw2ng8tUHQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "6cv53sHsPnFS56PJw8X4GbNcjeX1KGyFJRxJWvxOgK63cnqeSB1k1eRwjUdkse0tBhwlH6qc9EOYDlan+CYTuw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "VOapXeO3lhBH0zYoyAH7tjapuo4V5pTHlevPpiSHueEquAajqd5nF0mttm+h/uE/exwAEuM5s26SzOJtletE3w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.TimeProvider.Testing": { - "type": "Direct", - "requested": "[10.6.0, )", - "resolved": "10.6.0", - "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "dVbSXGIFNR5nZcv2tOLoWI+a9T4jtFd77IYjuND+QVe360qWgAF7H0WtoopYhRw/+SgpGUTyrkrh+65+ClNnfw==" - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[10.0.300, )", - "resolved": "10.0.300", - "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.300", - "Microsoft.SourceLink.Common": "10.0.300", - "System.IO.Hashing": "10.0.8" - } - }, - "MinVer": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" - }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.4, )", - "resolved": "13.0.4", - "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" - }, - "System.Configuration.ConfigurationManager": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "QG+HHwJjLyUiRuA9axr5pDqHAxboo7FXCTRakxMABE9CUAUij/tsd/MsgQPJUEppkf+YBLT+F/P/wKIVCAIcNg==", - "dependencies": { - "System.Diagnostics.EventLog": "10.0.8", - "System.Security.Cryptography.ProtectedData": "10.0.8" - } - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", - "dependencies": { - "System.IO.Hashing": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "ehZcoPbjzWzS4XFvuz7R3V55SmpdkyMqFURLH3yXaN9NtXd9tR6CGB7pd49HYtCkenl+G7ctXSFLhNI08xLfRg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "1g9mzuu8gIHkjYb0jLxOTQVl/QDG5nn0b0JzgT/gbgNKr6gXZzxOHRAsdYRc1eDApB7LdHR8uK5vQrNjIQdRrQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Physical": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "U+oquaPxFdY8lYeEIWO/AD7jDIl9sPW6aVWMQRHU/pZ/SWpLcOrAj2fcLe1HwXl4sYw1ONI56K/eELT3xr4RRQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "GkPvQe6IdidLu6Q3Lw6+B8NJpW8feW8czZ5mBKt5rXM/x8MvZfEp5WvAsjznzDGd23chIDrW0b2mmt+ScnEgiw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "IUQet3SY51xIFcFZKtAB6a54/Zdxs7T3SQ84kJtOD6yeXfZgiOMksACWD5qtTmXGQGFH4QYGBOT0KIO8Uy/dJw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "/ldVgSfImIBp6fLWS7sLH0BnmtFj0ZwGlZo4Xx2q0K3ZhJNDbW45kj2f6zPoC+L+BTINuHdMzTsopuwmkbgcNA==" - } - } - } -} \ No newline at end of file diff --git a/test/UlidTool.Tests/packages.lock.json b/test/UlidTool.Tests/packages.lock.json deleted file mode 100644 index 1b83171..0000000 --- a/test/UlidTool.Tests/packages.lock.json +++ /dev/null @@ -1,501 +0,0 @@ -{ - "version": 2, - "dependencies": { - "net10.0": { - "FluentAssertions": { - "type": "Direct", - "requested": "[8.10.0, )", - "resolved": "8.10.0", - "contentHash": "yGvv+xp0gHFgGwhQcGoDdKIrhLhPi3zYYWWLLHPMctr+G6PWD7QH8L4wqoa5WRZquPbfSV/cP1MraI7ppAHrWw==" - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "R3NN1X+kVu14uoxLEW6sBSQyhogDSbaOQzILnCtuXxBN4hx22AgjWPwZX6v/suERFkEDgU1lk12AglHTrUxhlw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "nQXq1a4MiInYh+0VF9fguxAl06q2ftmOyYQ+5e933s4rk57xjgkbTjUdFUySzjrcrvDeWsSqlZB+TE8+TbM2HA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "bVGqctAfPGfTxJvNp8pMshtvpsUj6r6JkeiCNVIGVYO5gBxuxdN0Lbr25kEvE/zXdctkEc44g8HssnPgDnFGVA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "KLtAZ6A38s1pIfCO2ns6aG14NNGMYNZ4PBYfFK4M+R4A+xuSc6oklhqDcpHZxvDpyBWeFtR5C8iQBw2ng8tUHQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "6cv53sHsPnFS56PJw8X4GbNcjeX1KGyFJRxJWvxOgK63cnqeSB1k1eRwjUdkse0tBhwlH6qc9EOYDlan+CYTuw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "VOapXeO3lhBH0zYoyAH7tjapuo4V5pTHlevPpiSHueEquAajqd5nF0mttm+h/uE/exwAEuM5s26SzOJtletE3w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.TimeProvider.Testing": { - "type": "Direct", - "requested": "[10.6.0, )", - "resolved": "10.6.0", - "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "dVbSXGIFNR5nZcv2tOLoWI+a9T4jtFd77IYjuND+QVe360qWgAF7H0WtoopYhRw/+SgpGUTyrkrh+65+ClNnfw==" - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[10.0.300, )", - "resolved": "10.0.300", - "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.300", - "Microsoft.SourceLink.Common": "10.0.300", - "System.IO.Hashing": "10.0.8" - } - }, - "Microsoft.Testing.Extensions.CodeCoverage": { - "type": "Direct", - "requested": "[18.7.0, )", - "resolved": "18.7.0", - "contentHash": "i7ifcFK6lzM5BHaROS4O7SAkk7L/gAeOwZxs3pyhn8hW73ZDTwQppovXNJL1bm1JBXL69HuI4DO5NzU8rhzIiA==", - "dependencies": { - "Microsoft.DiaSymReader": "2.2.6", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Platform": "2.2.1" - } - }, - "Microsoft.Testing.Extensions.TrxReport": { - "type": "Direct", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "9Hot3ty5ZVWHrW40k2NPfD0dCaPwIxj7j7VjujNYwpYkYw9AdbejPHjGNkL/gvUWorauJf5IkeDoUeIbS7LuUg==", - "dependencies": { - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3", - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "MinVer": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" - }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.4, )", - "resolved": "13.0.4", - "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" - }, - "NSubstitute": { - "type": "Direct", - "requested": "[5.3.0, )", - "resolved": "5.3.0", - "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==", - "dependencies": { - "Castle.Core": "5.1.1" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "QG+HHwJjLyUiRuA9axr5pDqHAxboo7FXCTRakxMABE9CUAUij/tsd/MsgQPJUEppkf+YBLT+F/P/wKIVCAIcNg==", - "dependencies": { - "System.Diagnostics.EventLog": "10.0.8", - "System.Security.Cryptography.ProtectedData": "10.0.8" - } - }, - "vm2.TestUtilities": { - "type": "Direct", - "requested": "[1.5.1, )", - "resolved": "1.5.1", - "contentHash": "ItST5G6Uiu9OIRE3v7azAcBI4Gtst+9WD4NP2kNQL2X1PPwD7a4etGVsQU+ZC9gxvdN3rXb0SlAMSsip5dI40w==", - "dependencies": { - "FluentAssertions": "8.10.0", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.Configuration.CommandLine": "10.0.8", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.8", - "Microsoft.Extensions.Configuration.Json": "10.0.8", - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Logging.Console": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8", - "System.Configuration.ConfigurationManager": "10.0.8", - "xunit.v3.extensibility.core": "3.2.2" - } - }, - "xunit.v3.mtp-v2": { - "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "S0LJpeMIMrmbVLXDCvPVX47OLk28qBYfGU+5SNCbarOEdw8oKLfiVqaACwuYRvLiOqDEB/+VJ8gTSB1ZwheoOQ==", - "dependencies": { - "xunit.analyzers": "1.27.0", - "xunit.v3.assert": "[3.2.2]", - "xunit.v3.core.mtp-v2": "[3.2.2]" - } - }, - "Castle.Core": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", - "dependencies": { - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.23.0", - "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", - "dependencies": { - "System.IO.Hashing": "10.0.8" - } - }, - "Microsoft.DiaSymReader": { - "type": "Transitive", - "resolved": "2.2.6", - "contentHash": "UitZ43WYJQYmcuScLEDTR95EGulBwk2R4N2zLBhaka8frXGVioa6Bkcbc5Fib8UkHIdrnN1lyzOublenrfpgxA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "ehZcoPbjzWzS4XFvuz7R3V55SmpdkyMqFURLH3yXaN9NtXd9tR6CGB7pd49HYtCkenl+G7ctXSFLhNI08xLfRg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "1g9mzuu8gIHkjYb0jLxOTQVl/QDG5nn0b0JzgT/gbgNKr6gXZzxOHRAsdYRc1eDApB7LdHR8uK5vQrNjIQdRrQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Physical": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "U+oquaPxFdY8lYeEIWO/AD7jDIl9sPW6aVWMQRHU/pZ/SWpLcOrAj2fcLe1HwXl4sYw1ONI56K/eELT3xr4RRQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "GkPvQe6IdidLu6Q3Lw6+B8NJpW8feW8czZ5mBKt5rXM/x8MvZfEp5WvAsjznzDGd23chIDrW0b2mmt+ScnEgiw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "IUQet3SY51xIFcFZKtAB6a54/Zdxs7T3SQ84kJtOD6yeXfZgiOMksACWD5qtTmXGQGFH4QYGBOT0KIO8Uy/dJw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "/ldVgSfImIBp6fLWS7sLH0BnmtFj0ZwGlZo4Xx2q0K3ZhJNDbW45kj2f6zPoC+L+BTINuHdMzTsopuwmkbgcNA==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.27.0", - "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" - }, - "xunit.v3.assert": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" - }, - "xunit.v3.common": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, - "xunit.v3.core.mtp-v2": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "zW82tdCm+T1uUD1JKE+SmhgMq8nCAvcFPRLIVEiRgaxBSjcyJEKopLU3bHGOa416q+N3Dz7m1zLoPR5VJ5OQ+Q==", - "dependencies": { - "Microsoft.Testing.Extensions.Telemetry": "2.0.2", - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.0.2", - "Microsoft.Testing.Platform": "2.0.2", - "Microsoft.Testing.Platform.MSBuild": "2.0.2", - "xunit.v3.extensibility.core": "[3.2.2]", - "xunit.v3.runner.inproc.console": "[3.2.2]" - } - }, - "xunit.v3.runner.common": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", - "dependencies": { - "Microsoft.Win32.Registry": "[5.0.0]", - "xunit.v3.common": "[3.2.2]" - } - }, - "xunit.v3.runner.inproc.console": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", - "dependencies": { - "xunit.v3.extensibility.core": "[3.2.2]", - "xunit.v3.runner.common": "[3.2.2]" - } - }, - "vm2.Ulid": { - "type": "Project", - "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "[10.0.8, )", - "Microsoft.Extensions.Configuration.CommandLine": "[10.0.8, )", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "[10.0.8, )", - "Microsoft.Extensions.Configuration.Json": "[10.0.8, )", - "Microsoft.Extensions.DependencyInjection": "[10.0.8, )", - "Microsoft.Extensions.Logging": "[10.0.8, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", - "Microsoft.Extensions.Logging.Configuration": "[10.0.8, )", - "Microsoft.Extensions.Logging.Console": "[10.0.8, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.8, )", - "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", - "Newtonsoft.Json": "[13.0.4, )", - "System.Configuration.ConfigurationManager": "[10.0.8, )" - } - }, - "vm2.UlidTool": { - "type": "Project", - "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "[10.0.8, )", - "Microsoft.Extensions.Configuration.CommandLine": "[10.0.8, )", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "[10.0.8, )", - "Microsoft.Extensions.Configuration.Json": "[10.0.8, )", - "Microsoft.Extensions.DependencyInjection": "[10.0.8, )", - "Microsoft.Extensions.Logging": "[10.0.8, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", - "Microsoft.Extensions.Logging.Configuration": "[10.0.8, )", - "Microsoft.Extensions.Logging.Console": "[10.0.8, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.8, )", - "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", - "Newtonsoft.Json": "[13.0.4, )", - "System.CommandLine": "[2.0.8, )", - "System.Configuration.ConfigurationManager": "[10.0.8, )", - "vm2.Ulid": "[1.0.0, )" - } - }, - "Microsoft.Testing.Extensions.Telemetry": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "mLdW+JOR3kXYGTdgR/qc/UZBA0r+eCR2k6bUxTcuDj5w9WdIQ7Lol5MBUU7YOSGd9bs9bvhSYWAptgz0YtQqCA==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "Microsoft.Testing.Extensions.TrxReport.Abstractions": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "hntvxJEkmUAx6C2xXc/PO38DqEQl4rimzOgSvTR1hAMruMid7R4RcXOrzzF33J66gKaN7jRaQ0TMW/nNfaV9jw==", - "dependencies": { - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "Microsoft.Testing.Platform": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "LhM1/Qoi8Ams5QcD4r3f09CSOono9iQr3NEJQItFtyzWB55nWTgEOsVqXqMWWWIwk3nkPqc+XfnlJmp8xUI5fg==" - }, - "Microsoft.Testing.Platform.MSBuild": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "Q22jJYJLx4srTinsAuoCskqmzjrBJC8YeGJMHHIcrf1dQeHoEZ7wsqDzTlENkMoke2qfufF7U+9u58nlZunH/Q==", - "dependencies": { - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "System.CommandLine": { - "type": "CentralTransitive", - "requested": "[2.0.8, )", - "resolved": "2.0.8", - "contentHash": "FbpgF8p/ClXnoXEWLjQB34kNh5rsLewEgIgLyVzLDucAOQ4cNs7ec9Cam7gdKPruSb6zp4Mx8htZGTL4/5PJPg==" - }, - "xunit.v3.extensibility.core": { - "type": "CentralTransitive", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", - "dependencies": { - "xunit.v3.common": "[3.2.2]" - } - } - } - } -} \ No newline at end of file diff --git a/test/UlidTool.Tests/usings.cs b/test/UlidTool.Tests/usings.cs deleted file mode 100644 index 4d9cdcb..0000000 --- a/test/UlidTool.Tests/usings.cs +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -// Copyright (c) 2025-2026 Val Melamed - -global using System.Diagnostics.CodeAnalysis; -global using System.Runtime.Serialization; -global using System.Text; -global using System.Text.RegularExpressions; - -global using vm2.TestUtilities; - -global using vm2.Providers; - -global using static vm2.TestUtilities.TestUtilities; - -global using static vm2.Ulid; diff --git a/test/UlidType.Tests/UlidType.Tests.csproj b/test/UlidType.Tests/UlidType.Tests.csproj deleted file mode 100644 index 2a8d630..0000000 --- a/test/UlidType.Tests/UlidType.Tests.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - vm2.UlidType.Tests - - - - - - - diff --git a/test/UlidType.Tests/packages.lock.json b/test/UlidType.Tests/packages.lock.json deleted file mode 100644 index 1d06b9f..0000000 --- a/test/UlidType.Tests/packages.lock.json +++ /dev/null @@ -1,475 +0,0 @@ -{ - "version": 2, - "dependencies": { - "net10.0": { - "FluentAssertions": { - "type": "Direct", - "requested": "[8.10.0, )", - "resolved": "8.10.0", - "contentHash": "yGvv+xp0gHFgGwhQcGoDdKIrhLhPi3zYYWWLLHPMctr+G6PWD7QH8L4wqoa5WRZquPbfSV/cP1MraI7ppAHrWw==" - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "R3NN1X+kVu14uoxLEW6sBSQyhogDSbaOQzILnCtuXxBN4hx22AgjWPwZX6v/suERFkEDgU1lk12AglHTrUxhlw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "nQXq1a4MiInYh+0VF9fguxAl06q2ftmOyYQ+5e933s4rk57xjgkbTjUdFUySzjrcrvDeWsSqlZB+TE8+TbM2HA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "bVGqctAfPGfTxJvNp8pMshtvpsUj6r6JkeiCNVIGVYO5gBxuxdN0Lbr25kEvE/zXdctkEc44g8HssnPgDnFGVA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "KLtAZ6A38s1pIfCO2ns6aG14NNGMYNZ4PBYfFK4M+R4A+xuSc6oklhqDcpHZxvDpyBWeFtR5C8iQBw2ng8tUHQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "daf62xHIrq8pnE709hgaZZN9tSam9TGGepWe1+bE6V3GEuVwJiMs6ib+38lfMCyAJAHiX0vapxBhsuMSV7U+cg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "K60JhWC2hN/Gi7TP68tBxSzk5ACWOs7lkmPzsfA8Bcf/IXTajujt2ORMf9rSMk1bsng6Lv4Y3fuxp3bm1+15ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "6cv53sHsPnFS56PJw8X4GbNcjeX1KGyFJRxJWvxOgK63cnqeSB1k1eRwjUdkse0tBhwlH6qc9EOYDlan+CYTuw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "VOapXeO3lhBH0zYoyAH7tjapuo4V5pTHlevPpiSHueEquAajqd5nF0mttm+h/uE/exwAEuM5s26SzOJtletE3w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Options": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.TimeProvider.Testing": { - "type": "Direct", - "requested": "[10.6.0, )", - "resolved": "10.6.0", - "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "dVbSXGIFNR5nZcv2tOLoWI+a9T4jtFd77IYjuND+QVe360qWgAF7H0WtoopYhRw/+SgpGUTyrkrh+65+ClNnfw==" - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[10.0.300, )", - "resolved": "10.0.300", - "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.300", - "Microsoft.SourceLink.Common": "10.0.300", - "System.IO.Hashing": "10.0.8" - } - }, - "Microsoft.Testing.Extensions.CodeCoverage": { - "type": "Direct", - "requested": "[18.7.0, )", - "resolved": "18.7.0", - "contentHash": "i7ifcFK6lzM5BHaROS4O7SAkk7L/gAeOwZxs3pyhn8hW73ZDTwQppovXNJL1bm1JBXL69HuI4DO5NzU8rhzIiA==", - "dependencies": { - "Microsoft.DiaSymReader": "2.2.6", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Platform": "2.2.1" - } - }, - "Microsoft.Testing.Extensions.TrxReport": { - "type": "Direct", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "9Hot3ty5ZVWHrW40k2NPfD0dCaPwIxj7j7VjujNYwpYkYw9AdbejPHjGNkL/gvUWorauJf5IkeDoUeIbS7LuUg==", - "dependencies": { - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3", - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "MinVer": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" - }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.4, )", - "resolved": "13.0.4", - "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" - }, - "NSubstitute": { - "type": "Direct", - "requested": "[5.3.0, )", - "resolved": "5.3.0", - "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==", - "dependencies": { - "Castle.Core": "5.1.1" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Direct", - "requested": "[10.0.8, )", - "resolved": "10.0.8", - "contentHash": "QG+HHwJjLyUiRuA9axr5pDqHAxboo7FXCTRakxMABE9CUAUij/tsd/MsgQPJUEppkf+YBLT+F/P/wKIVCAIcNg==", - "dependencies": { - "System.Diagnostics.EventLog": "10.0.8", - "System.Security.Cryptography.ProtectedData": "10.0.8" - } - }, - "vm2.TestUtilities": { - "type": "Direct", - "requested": "[1.5.1, )", - "resolved": "1.5.1", - "contentHash": "ItST5G6Uiu9OIRE3v7azAcBI4Gtst+9WD4NP2kNQL2X1PPwD7a4etGVsQU+ZC9gxvdN3rXb0SlAMSsip5dI40w==", - "dependencies": { - "FluentAssertions": "8.10.0", - "Microsoft.Extensions.Configuration.Binder": "10.0.8", - "Microsoft.Extensions.Configuration.CommandLine": "10.0.8", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.8", - "Microsoft.Extensions.Configuration.Json": "10.0.8", - "Microsoft.Extensions.DependencyInjection": "10.0.8", - "Microsoft.Extensions.Logging": "10.0.8", - "Microsoft.Extensions.Logging.Abstractions": "10.0.8", - "Microsoft.Extensions.Logging.Configuration": "10.0.8", - "Microsoft.Extensions.Logging.Console": "10.0.8", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8", - "System.Configuration.ConfigurationManager": "10.0.8", - "xunit.v3.extensibility.core": "3.2.2" - } - }, - "xunit.v3.mtp-v2": { - "type": "Direct", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "S0LJpeMIMrmbVLXDCvPVX47OLk28qBYfGU+5SNCbarOEdw8oKLfiVqaACwuYRvLiOqDEB/+VJ8gTSB1ZwheoOQ==", - "dependencies": { - "xunit.analyzers": "1.27.0", - "xunit.v3.assert": "[3.2.2]", - "xunit.v3.core.mtp-v2": "[3.2.2]" - } - }, - "Castle.Core": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", - "dependencies": { - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.23.0", - "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", - "dependencies": { - "System.IO.Hashing": "10.0.8" - } - }, - "Microsoft.DiaSymReader": { - "type": "Transitive", - "resolved": "2.2.6", - "contentHash": "UitZ43WYJQYmcuScLEDTR95EGulBwk2R4N2zLBhaka8frXGVioa6Bkcbc5Fib8UkHIdrnN1lyzOublenrfpgxA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "ehZcoPbjzWzS4XFvuz7R3V55SmpdkyMqFURLH3yXaN9NtXd9tR6CGB7pd49HYtCkenl+G7ctXSFLhNI08xLfRg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "I63esIFbL3h5pSt7gXpXOlmcwDmYBUoYNEglKfDPFUqtYvSV84f2l28hO2lfVXsV0wdlplgAM7IVz16matapSg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "1g9mzuu8gIHkjYb0jLxOTQVl/QDG5nn0b0JzgT/gbgNKr6gXZzxOHRAsdYRc1eDApB7LdHR8uK5vQrNjIQdRrQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.8", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileProviders.Physical": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "U+oquaPxFdY8lYeEIWO/AD7jDIl9sPW6aVWMQRHU/pZ/SWpLcOrAj2fcLe1HwXl4sYw1ONI56K/eELT3xr4RRQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "GkPvQe6IdidLu6Q3Lw6+B8NJpW8feW8czZ5mBKt5rXM/x8MvZfEp5WvAsjznzDGd23chIDrW0b2mmt+ScnEgiw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.8", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "IUQet3SY51xIFcFZKtAB6a54/Zdxs7T3SQ84kJtOD6yeXfZgiOMksACWD5qtTmXGQGFH4QYGBOT0KIO8Uy/dJw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "VBD+131DpTNCNDfA4kIyKTiCySvJGNhwibdWBSdFRu7GMfXLXcXODkgA+KStKbbhzraLglZWUN4nXyHgW4JIRA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8", - "Microsoft.Extensions.Primitives": "10.0.8" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "OBPo4nYhMyIbtueoC10CBm6AGAbo/A9IV8QQ/6ryZS7VvmqpGT7hunazeHLxFawRzn3oLOq4jhqhpBX4tfswWQ==" - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "10.0.300", - "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+Ro7WgIom+BDNH+YhTuZKL6QJ0ctfOpTyfUG/h3aU5KwXt3OaNf0wYWrTvoBUj+34Dy5V8dN9yCco1hAJQ4txw==" - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "10.0.8", - "contentHash": "/ldVgSfImIBp6fLWS7sLH0BnmtFj0ZwGlZo4Xx2q0K3ZhJNDbW45kj2f6zPoC+L+BTINuHdMzTsopuwmkbgcNA==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.27.0", - "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" - }, - "xunit.v3.assert": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" - }, - "xunit.v3.common": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, - "xunit.v3.core.mtp-v2": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "zW82tdCm+T1uUD1JKE+SmhgMq8nCAvcFPRLIVEiRgaxBSjcyJEKopLU3bHGOa416q+N3Dz7m1zLoPR5VJ5OQ+Q==", - "dependencies": { - "Microsoft.Testing.Extensions.Telemetry": "2.0.2", - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.0.2", - "Microsoft.Testing.Platform": "2.0.2", - "Microsoft.Testing.Platform.MSBuild": "2.0.2", - "xunit.v3.extensibility.core": "[3.2.2]", - "xunit.v3.runner.inproc.console": "[3.2.2]" - } - }, - "xunit.v3.runner.common": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", - "dependencies": { - "Microsoft.Win32.Registry": "[5.0.0]", - "xunit.v3.common": "[3.2.2]" - } - }, - "xunit.v3.runner.inproc.console": { - "type": "Transitive", - "resolved": "3.2.2", - "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", - "dependencies": { - "xunit.v3.extensibility.core": "[3.2.2]", - "xunit.v3.runner.common": "[3.2.2]" - } - }, - "vm2.Ulid": { - "type": "Project", - "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "[10.0.8, )", - "Microsoft.Extensions.Configuration.CommandLine": "[10.0.8, )", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "[10.0.8, )", - "Microsoft.Extensions.Configuration.Json": "[10.0.8, )", - "Microsoft.Extensions.DependencyInjection": "[10.0.8, )", - "Microsoft.Extensions.Logging": "[10.0.8, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.8, )", - "Microsoft.Extensions.Logging.Configuration": "[10.0.8, )", - "Microsoft.Extensions.Logging.Console": "[10.0.8, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.8, )", - "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", - "Newtonsoft.Json": "[13.0.4, )", - "System.Configuration.ConfigurationManager": "[10.0.8, )" - } - }, - "Microsoft.Testing.Extensions.Telemetry": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "mLdW+JOR3kXYGTdgR/qc/UZBA0r+eCR2k6bUxTcuDj5w9WdIQ7Lol5MBUU7YOSGd9bs9bvhSYWAptgz0YtQqCA==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "Microsoft.Testing.Extensions.TrxReport.Abstractions": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "hntvxJEkmUAx6C2xXc/PO38DqEQl4rimzOgSvTR1hAMruMid7R4RcXOrzzF33J66gKaN7jRaQ0TMW/nNfaV9jw==", - "dependencies": { - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "Microsoft.Testing.Platform": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "LhM1/Qoi8Ams5QcD4r3f09CSOono9iQr3NEJQItFtyzWB55nWTgEOsVqXqMWWWIwk3nkPqc+XfnlJmp8xUI5fg==" - }, - "Microsoft.Testing.Platform.MSBuild": { - "type": "CentralTransitive", - "requested": "[2.2.3, )", - "resolved": "2.2.3", - "contentHash": "Q22jJYJLx4srTinsAuoCskqmzjrBJC8YeGJMHHIcrf1dQeHoEZ7wsqDzTlENkMoke2qfufF7U+9u58nlZunH/Q==", - "dependencies": { - "Microsoft.Testing.Platform": "2.2.3" - } - }, - "xunit.v3.extensibility.core": { - "type": "CentralTransitive", - "requested": "[3.2.2, )", - "resolved": "3.2.2", - "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", - "dependencies": { - "xunit.v3.common": "[3.2.2]" - } - } - } - } -} \ No newline at end of file diff --git a/test/UlidType.Tests/NsJson/UlidNsConverterTests.cs b/tests/Ulid/NsJson/UlidNsConverterTests.cs similarity index 75% rename from test/UlidType.Tests/NsJson/UlidNsConverterTests.cs rename to tests/Ulid/NsJson/UlidNsConverterTests.cs index e81d801..465e161 100644 --- a/test/UlidType.Tests/NsJson/UlidNsConverterTests.cs +++ b/tests/Ulid/NsJson/UlidNsConverterTests.cs @@ -1,15 +1,23 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidType.Tests.NsJson; +namespace vm2.Tests.Serialization.NsJson.Ulid; using Newtonsoft.Json; -using vm2.UlidSerialization.NsJson; +using vm2; +using vm2.Serialization.NsJson.Ulid; [ExcludeFromCodeCoverage] -public class UlidNsConverterTests +public class UlidConverterTests : TestBase { + JsonSerializerSettings _settings; + + public UlidConverterTests(ITestOutputHelper output) : base(output) + { + _settings = new JsonSerializerSettings(); + _settings.Converters.Add(new UlidConverter()); + } class Subject { @@ -36,7 +44,7 @@ public Subject1() [Fact] public void Test_CanConvert_Returns_True_For_Ulid_And_Nullable_Ulid() { - var sut = new UlidNsConverter(); + var sut = new UlidConverter(); sut.CanConvert(typeof(Ulid)).Should().BeTrue(); sut.CanConvert(typeof(Ulid?)).Should().BeTrue(); @@ -47,97 +55,88 @@ public void Test_CanConvert_Returns_True_For_Ulid_And_Nullable_Ulid() // This disables type name handling, which is the main source of reflection in Newtonsoft.Json. [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_NotNull_Ulid_Serializes_To_Json_With_Newtonsoft_Json() { var sut = new Subject("01K5N2TW3MA38KG6D7WNFDPAKS"); - var json = JsonConvert.SerializeObject(sut); + var json = JsonConvert.SerializeObject(sut, _settings); json.Should().Contain(sut?.Id?.ToString()); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_NotNull_Ulid_Deserializes_From_Json_With_Newtonsoft_Json() { var ulid = new Ulid("01K5N3A2GJYH10NGHHTWQR4VBP"); var json = $@"{{ ""Id"": ""{ulid}"" }}"; - var deserialize = () => JsonConvert.DeserializeObject(json); + var deserialize = () => JsonConvert.DeserializeObject(json, _settings); var sut = deserialize.Should().NotThrow().Which; sut.Id.Should().Be(ulid); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_Null_Ulid_Serializes_To_Json_With_Newtonsoft_Json() { var sut = new Subject(); - var json = JsonConvert.SerializeObject(sut); + var json = JsonConvert.SerializeObject(sut, _settings); json.Should().Be(@"{""Id"":null}"); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_Null_Ulid_Deserializes_From_Json_With_Newtonsoft_Json() { var json = $@"{{ ""Id"":null}}"; - var deserialize = () => JsonConvert.DeserializeObject(json); + var deserialize = () => JsonConvert.DeserializeObject(json, _settings); var sut = deserialize.Should().NotThrow().Which; sut.Id.Should().BeNull(); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_Ulid_Serializes_To_Json_With_Newtonsoft_Json() { var sut = new Subject1("01K5N2TW3MA38KG6D7WNFDPAKS"); - var json = JsonConvert.SerializeObject(sut); + var json = JsonConvert.SerializeObject(sut, _settings); json.Should().Contain(sut?.Id.ToString()); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_Ulid_Deserializes_From_Json_With_Newtonsoft_Json() { var ulid = new Ulid("01K5N3A2GJYH10NGHHTWQR4VBP"); var json = $@"{{ ""Id"": ""{ulid}"" }}"; - var deserialize = () => JsonConvert.DeserializeObject(json); + var deserialize = () => JsonConvert.DeserializeObject(json, _settings); var sut = deserialize.Should().NotThrow().Which; sut.Id.Should().Be(ulid); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_Ulid_Deserializes_InvalidUlid_Throws() { var json = @"{ ""Id"": ""U1K5N3A2GJYH10NGHHTWQR4VBP"" }"; - var deserialize = () => JsonConvert.DeserializeObject(json); + var deserialize = () => JsonConvert.DeserializeObject(json, _settings); deserialize.Should().Throw(); } [Fact] - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "")] public void Test_NotNull_BadString_Ulid_Deserializes_From_Json_With_Newtonsoft_Json() { var ulid = new Ulid("01K5N3A2GJYH10NGHHTWQR4VBP"); var json = $@"{{ ""Id"": ""$%^&{ulid}"" }}"; - var deserialize = () => JsonConvert.DeserializeObject(json); + var deserialize = () => JsonConvert.DeserializeObject(json, _settings); deserialize.Should().Throw(); } - } diff --git a/test/UlidType.Tests/SysJson/UlidSysConverterTests.cs b/tests/Ulid/SysJson/UlidSysConverterTests.cs similarity index 96% rename from test/UlidType.Tests/SysJson/UlidSysConverterTests.cs rename to tests/Ulid/SysJson/UlidSysConverterTests.cs index c68e342..383d8d3 100644 --- a/test/UlidType.Tests/SysJson/UlidSysConverterTests.cs +++ b/tests/Ulid/SysJson/UlidSysConverterTests.cs @@ -1,12 +1,14 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidType.Tests.SysJson; +namespace vm2.Tests.Ulid.SysJson; using System.Text.Json; +using vm2; + [ExcludeFromCodeCoverage] -public class UlidSysConverterTests +public class UlidSysConverterTests(ITestOutputHelper output) : TestBase(output) { class Subject diff --git a/tests/Ulid/Ulid.Tests.csproj b/tests/Ulid/Ulid.Tests.csproj new file mode 100644 index 0000000..e51911c --- /dev/null +++ b/tests/Ulid/Ulid.Tests.csproj @@ -0,0 +1,13 @@ + + + + Exe + vm2.Tests.Ulid + + + + + + + + diff --git a/test/UlidType.Tests/UlidTests.TypesAndData.cs b/tests/Ulid/UlidTests.TypesAndData.cs similarity index 98% rename from test/UlidType.Tests/UlidTests.TypesAndData.cs rename to tests/Ulid/UlidTests.TypesAndData.cs index 40428df..106ab3d 100644 --- a/test/UlidType.Tests/UlidTests.TypesAndData.cs +++ b/tests/Ulid/UlidTests.TypesAndData.cs @@ -1,9 +1,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidType.Tests; - -using Xunit.Sdk; +namespace vm2.Tests.Ulid; public partial class UlidTests { diff --git a/test/UlidType.Tests/UlidTests.cs b/tests/Ulid/UlidTests.cs similarity index 99% rename from test/UlidType.Tests/UlidTests.cs rename to tests/Ulid/UlidTests.cs index 5e2e58c..a3dc4a1 100644 --- a/test/UlidType.Tests/UlidTests.cs +++ b/tests/Ulid/UlidTests.cs @@ -1,7 +1,9 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidType.Tests; +namespace vm2.Tests.Ulid; + +using vm2; [ExcludeFromCodeCoverage] public partial class UlidTests(ITestOutputHelper output) : TestBase(output) diff --git a/tests/Ulid/packages.lock.json b/tests/Ulid/packages.lock.json new file mode 100644 index 0000000..d686d57 --- /dev/null +++ b/tests/Ulid/packages.lock.json @@ -0,0 +1,269 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "FluentAssertions": { + "type": "Direct", + "requested": "[8.10.0, )", + "resolved": "8.10.0", + "contentHash": "yGvv+xp0gHFgGwhQcGoDdKIrhLhPi3zYYWWLLHPMctr+G6PWD7QH8L4wqoa5WRZquPbfSV/cP1MraI7ppAHrWw==" + }, + "Microsoft.Extensions.TimeProvider.Testing": { + "type": "Direct", + "requested": "[10.6.0, )", + "resolved": "10.6.0", + "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[10.0.300, )", + "resolved": "10.0.300", + "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "10.0.300", + "Microsoft.SourceLink.Common": "10.0.300", + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.7.0, )", + "resolved": "18.7.0", + "contentHash": "i7ifcFK6lzM5BHaROS4O7SAkk7L/gAeOwZxs3pyhn8hW73ZDTwQppovXNJL1bm1JBXL69HuI4DO5NzU8rhzIiA==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.6", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "9Hot3ty5ZVWHrW40k2NPfD0dCaPwIxj7j7VjujNYwpYkYw9AdbejPHjGNkL/gvUWorauJf5IkeDoUeIbS7LuUg==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3", + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" + }, + "NSubstitute": { + "type": "Direct", + "requested": "[5.3.0, )", + "resolved": "5.3.0", + "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "vm2.TestUtilities": { + "type": "Direct", + "requested": "[2.0.2, )", + "resolved": "2.0.2", + "contentHash": "yjulWlMvLnbGPnXe2BUOmiYaOPnoxeeRuKgsSLXL3cxOa1/GX4HnRUBtfEyBYbO0kzdolGLN3dm/ENIwNnFGpw==", + "dependencies": { + "FluentAssertions": "8.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "xunit.v3.extensibility.core": "3.2.2" + } + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "S0LJpeMIMrmbVLXDCvPVX47OLk28qBYfGU+5SNCbarOEdw8oKLfiVqaACwuYRvLiOqDEB/+VJ8gTSB1ZwheoOQ==", + "dependencies": { + "xunit.analyzers": "1.27.0", + "xunit.v3.assert": "[3.2.2]", + "xunit.v3.core.mtp-v2": "[3.2.2]" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", + "dependencies": { + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.6", + "contentHash": "UitZ43WYJQYmcuScLEDTR95EGulBwk2R4N2zLBhaka8frXGVioa6Bkcbc5Fib8UkHIdrnN1lyzOublenrfpgxA==" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "zW82tdCm+T1uUD1JKE+SmhgMq8nCAvcFPRLIVEiRgaxBSjcyJEKopLU3bHGOa416q+N3Dz7m1zLoPR5VJ5OQ+Q==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.0.2", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.0.2", + "Microsoft.Testing.Platform": "2.0.2", + "Microsoft.Testing.Platform.MSBuild": "2.0.2", + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.inproc.console": "[3.2.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "xunit.v3.common": "[3.2.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", + "dependencies": { + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.common": "[3.2.2]" + } + }, + "vm2.Ulid": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )" + } + }, + "vm2.Ulid.Serialization.NsJson": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", + "Newtonsoft.Json": "[13.0.4, )", + "vm2.Ulid": "[1.0.0, )" + } + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "mLdW+JOR3kXYGTdgR/qc/UZBA0r+eCR2k6bUxTcuDj5w9WdIQ7Lol5MBUU7YOSGd9bs9bvhSYWAptgz0YtQqCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "hntvxJEkmUAx6C2xXc/PO38DqEQl4rimzOgSvTR1hAMruMid7R4RcXOrzzF33J66gKaN7jRaQ0TMW/nNfaV9jw==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "Microsoft.Testing.Platform": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "LhM1/Qoi8Ams5QcD4r3f09CSOono9iQr3NEJQItFtyzWB55nWTgEOsVqXqMWWWIwk3nkPqc+XfnlJmp8xUI5fg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "Q22jJYJLx4srTinsAuoCskqmzjrBJC8YeGJMHHIcrf1dQeHoEZ7wsqDzTlENkMoke2qfufF7U+9u58nlZunH/Q==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "Newtonsoft.Json": { + "type": "CentralTransitive", + "requested": "[13.0.4, )", + "resolved": "13.0.4", + "contentHash": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==" + }, + "xunit.v3.extensibility.core": { + "type": "CentralTransitive", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", + "dependencies": { + "xunit.v3.common": "[3.2.2]" + } + } + } + } +} \ No newline at end of file diff --git a/test/UlidType.Tests/usings.cs b/tests/Ulid/usings.cs similarity index 84% rename from test/UlidType.Tests/usings.cs rename to tests/Ulid/usings.cs index f7ed2f9..7f45da5 100644 --- a/test/UlidType.Tests/usings.cs +++ b/tests/Ulid/usings.cs @@ -3,12 +3,13 @@ global using System.Diagnostics.CodeAnalysis; global using System.Text; + global using Microsoft.Extensions.Time.Testing; -global using vm2.TestUtilities; +global using Xunit.Sdk; -global using vm2.Providers; +global using vm2.TestUtilities; +global using vm2.Providers.Ulid; global using static vm2.TestUtilities.TestUtilities; - global using static vm2.Ulid; diff --git a/test/UlidTool.Tests/UlidTool.Tests.csproj b/tests/UlidTool/UlidTool.Tests.csproj similarity index 67% rename from test/UlidTool.Tests/UlidTool.Tests.csproj rename to tests/UlidTool/UlidTool.Tests.csproj index 2ebc84c..85483ee 100644 --- a/test/UlidTool.Tests/UlidTool.Tests.csproj +++ b/tests/UlidTool/UlidTool.Tests.csproj @@ -1,7 +1,8 @@ - vm2.UlidTool.Tests + Exe + vm2.Tests.UlidTool diff --git a/test/UlidTool.Tests/UlidToolAppTests.cs b/tests/UlidTool/UlidToolAppTests.cs similarity index 98% rename from test/UlidTool.Tests/UlidToolAppTests.cs rename to tests/UlidTool/UlidToolAppTests.cs index df84be2..804a35f 100644 --- a/test/UlidTool.Tests/UlidToolAppTests.cs +++ b/tests/UlidTool/UlidToolAppTests.cs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2025-2026 Val Melamed -namespace vm2.UlidTool.Tests; +namespace vm2.Tests.UlidTool; public sealed class UlidToolAppTests(ITestOutputHelper output) : TestBase(output) { diff --git a/tests/UlidTool/packages.lock.json b/tests/UlidTool/packages.lock.json new file mode 100644 index 0000000..408864a --- /dev/null +++ b/tests/UlidTool/packages.lock.json @@ -0,0 +1,269 @@ +{ + "version": 2, + "dependencies": { + "net10.0": { + "FluentAssertions": { + "type": "Direct", + "requested": "[8.10.0, )", + "resolved": "8.10.0", + "contentHash": "yGvv+xp0gHFgGwhQcGoDdKIrhLhPi3zYYWWLLHPMctr+G6PWD7QH8L4wqoa5WRZquPbfSV/cP1MraI7ppAHrWw==" + }, + "Microsoft.Extensions.TimeProvider.Testing": { + "type": "Direct", + "requested": "[10.6.0, )", + "resolved": "10.6.0", + "contentHash": "qQDiaYWpvIymGbu+kXaMDS8YdqfeQkv6DOxPF2GSwC+eSzIKqOOnSP34TYt7gKqvB7p8/aSptexnW6nF0CUdnw==" + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[10.0.300, )", + "resolved": "10.0.300", + "contentHash": "QzCtLkXVb3l4IxcpvJCbzUwMLihAmLN6vVLjQGSzYSF8d2dvXxqJAZk83RV3gYnp2egz8jRMgSR2woY3vOahTA==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "10.0.300", + "Microsoft.SourceLink.Common": "10.0.300", + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.7.0, )", + "resolved": "18.7.0", + "contentHash": "i7ifcFK6lzM5BHaROS4O7SAkk7L/gAeOwZxs3pyhn8hW73ZDTwQppovXNJL1bm1JBXL69HuI4DO5NzU8rhzIiA==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.6", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "9Hot3ty5ZVWHrW40k2NPfD0dCaPwIxj7j7VjujNYwpYkYw9AdbejPHjGNkL/gvUWorauJf5IkeDoUeIbS7LuUg==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3", + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "MinVer": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "2lMTCQl5bGP4iv0JNkockPnyllC6eHLz+CoK2ICvalvHod+exXSxueu9hq+zNkU7bZBJf8wMfeRC/Edn8AGmEg==" + }, + "NSubstitute": { + "type": "Direct", + "requested": "[5.3.0, )", + "resolved": "5.3.0", + "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "vm2.TestUtilities": { + "type": "Direct", + "requested": "[2.0.2, )", + "resolved": "2.0.2", + "contentHash": "yjulWlMvLnbGPnXe2BUOmiYaOPnoxeeRuKgsSLXL3cxOa1/GX4HnRUBtfEyBYbO0kzdolGLN3dm/ENIwNnFGpw==", + "dependencies": { + "FluentAssertions": "8.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.8", + "xunit.v3.extensibility.core": "3.2.2" + } + }, + "xunit.v3.mtp-v2": { + "type": "Direct", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "S0LJpeMIMrmbVLXDCvPVX47OLk28qBYfGU+5SNCbarOEdw8oKLfiVqaACwuYRvLiOqDEB/+VJ8gTSB1ZwheoOQ==", + "dependencies": { + "xunit.analyzers": "1.27.0", + "xunit.v3.assert": "[3.2.2]", + "xunit.v3.core.mtp-v2": "[3.2.2]" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "P0kaQwVZx4xIUe2FtrLyBadYNXuAljttJUPvjBYRuHhPE8L77L42KakLDkaADRiUrGspoLcMwayjrbQhYTr0zA==", + "dependencies": { + "System.IO.Hashing": "10.0.8" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.6", + "contentHash": "UitZ43WYJQYmcuScLEDTR95EGulBwk2R4N2zLBhaka8frXGVioa6Bkcbc5Fib8UkHIdrnN1lyzOublenrfpgxA==" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "21nbDV60SRPWGIivsyl6lqBeEJNG1sginhhfWgRrr3Ais7aQ12To25OAHQxgoiJkjqy1aQ6RxpZBGYuTi7Ge6A==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "fdVadZmsC8jRP0KvKy8mO8f6GV/HyBvElfcSxEhd+5FM5boAw/01iSaCto5G3G37ApJira4A3pNaVvBv8cUiLQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.8" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "10.0.300", + "contentHash": "0jlkXaUGjYlWTIVPve5MftjKHnT3SlAtq9BCLV4J9IjdPrxV/+4rMlBSjfr1khG8/GC6KGojjola8E1VvWF0qQ==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "10.0.8", + "contentHash": "+dJsbPJ3FyUbTZNplFj0RCKePFizmv6ewDV46JE9q/IVH4c3xTCftHfHelLsAKf0jryIPqgMb5GpS0x7TAY3mg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core.mtp-v2": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "zW82tdCm+T1uUD1JKE+SmhgMq8nCAvcFPRLIVEiRgaxBSjcyJEKopLU3bHGOa416q+N3Dz7m1zLoPR5VJ5OQ+Q==", + "dependencies": { + "Microsoft.Testing.Extensions.Telemetry": "2.0.2", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.0.2", + "Microsoft.Testing.Platform": "2.0.2", + "Microsoft.Testing.Platform.MSBuild": "2.0.2", + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.inproc.console": "[3.2.2]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0]", + "xunit.v3.common": "[3.2.2]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", + "dependencies": { + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.common": "[3.2.2]" + } + }, + "vm2.Ulid": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )" + } + }, + "vm2.UlidTool": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.TimeProvider.Testing": "[10.6.0, )", + "System.CommandLine": "[2.0.8, )", + "vm2.Ulid": "[1.0.0, )" + } + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "mLdW+JOR3kXYGTdgR/qc/UZBA0r+eCR2k6bUxTcuDj5w9WdIQ7Lol5MBUU7YOSGd9bs9bvhSYWAptgz0YtQqCA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "hntvxJEkmUAx6C2xXc/PO38DqEQl4rimzOgSvTR1hAMruMid7R4RcXOrzzF33J66gKaN7jRaQ0TMW/nNfaV9jw==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "Microsoft.Testing.Platform": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "LhM1/Qoi8Ams5QcD4r3f09CSOono9iQr3NEJQItFtyzWB55nWTgEOsVqXqMWWWIwk3nkPqc+XfnlJmp8xUI5fg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "CentralTransitive", + "requested": "[2.2.3, )", + "resolved": "2.2.3", + "contentHash": "Q22jJYJLx4srTinsAuoCskqmzjrBJC8YeGJMHHIcrf1dQeHoEZ7wsqDzTlENkMoke2qfufF7U+9u58nlZunH/Q==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.3" + } + }, + "System.CommandLine": { + "type": "CentralTransitive", + "requested": "[2.0.8, )", + "resolved": "2.0.8", + "contentHash": "FbpgF8p/ClXnoXEWLjQB34kNh5rsLewEgIgLyVzLDucAOQ4cNs7ec9Cam7gdKPruSb6zp4Mx8htZGTL4/5PJPg==" + }, + "xunit.v3.extensibility.core": { + "type": "CentralTransitive", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", + "dependencies": { + "xunit.v3.common": "[3.2.2]" + } + } + } + } +} \ No newline at end of file diff --git a/tests/UlidTool/usings.cs b/tests/UlidTool/usings.cs new file mode 100644 index 0000000..c81b182 --- /dev/null +++ b/tests/UlidTool/usings.cs @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2025-2026 Val Melamed + +global using System.Text.RegularExpressions; + +global using vm2.TestUtilities; diff --git a/vm2.Ulid.slnx b/vm2.Ulid.slnx index 80db9c5..5caddf3 100644 --- a/vm2.Ulid.slnx +++ b/vm2.Ulid.slnx @@ -11,7 +11,7 @@ - + @@ -36,11 +36,12 @@ - + + - - - + + +