Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
910633d
Updating tests for licensing
TimPurdum Feb 12, 2026
7522b9d
fixing TestSetup script
TimPurdum Feb 13, 2026
3e06012
merge
TimPurdum Feb 13, 2026
052e7d0
update from develop
TimPurdum Feb 13, 2026
57be2fd
wip
TimPurdum Feb 14, 2026
6853ce7
fix scriptBuilder race condition
TimPurdum Feb 14, 2026
0454bcb
refactoring LicenseKeyLocator.cs
TimPurdum Feb 16, 2026
a08d3f9
fixed validation unit tests
TimPurdum Feb 16, 2026
74f3549
fixed license validator to work for previous license version on initi…
TimPurdum Feb 16, 2026
f80d064
consolidate BuildValidator.cs into single task
TimPurdum Feb 17, 2026
c610c5f
fixing publishing validation
TimPurdum Feb 18, 2026
bf3f5a0
unit tests passing, validating multiple projects
TimPurdum Feb 19, 2026
54bd0da
update scripts
TimPurdum Feb 20, 2026
0dbb1fd
prep to remove publish file
TimPurdum Feb 21, 2026
236a2f0
rebuilding slnx
TimPurdum Feb 23, 2026
4c94c4b
wip
TimPurdum Feb 26, 2026
30104a8
working on integration tests
TimPurdum Feb 27, 2026
d1f8b57
console dialog changes
TimPurdum Feb 28, 2026
2a03fe1
update gitignore
TimPurdum Mar 1, 2026
4ab82af
cleanup missing protobuf implementation pieces
TimPurdum Mar 1, 2026
fa6a423
test cleanup
TimPurdum Mar 2, 2026
f9fffd4
Fix ConsoleDialog for WSL
TimPurdum Mar 2, 2026
3964140
update linux script builds
TimPurdum Mar 2, 2026
f95a627
revert broken condition
TimPurdum Mar 2, 2026
f7a5c6d
fixing ESBuild trigger issue
TimPurdum Mar 2, 2026
1f36c56
Fix spatialReference Id serialization, add AcquireBuildLock script
TimPurdum Mar 5, 2026
efceb04
update gitignore
TimPurdum Mar 5, 2026
77ba9c4
Merge branch 'develop' into feature/license-validation
TimPurdum Mar 5, 2026
5677b24
build fixes
TimPurdum Mar 5, 2026
d3c3b86
Merge branch 'develop' of https://github.com/dymaptic/GeoBlazor into …
TimPurdum Mar 5, 2026
129553b
Merge branch 'develop' into feature/license-validation
TimPurdum Mar 5, 2026
d3f4e06
add node_modules cleaning to pipelines
TimPurdum Mar 5, 2026
9f33592
build tool updates
TimPurdum Mar 6, 2026
d202b2d
Testing fixes
TimPurdum Mar 7, 2026
d1ce4b3
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 7, 2026
0bdb421
Fix merge failure in ESBuild.cs
TimPurdum Mar 7, 2026
ecce0be
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 7, 2026
a35de07
Revert "Fix merge failure in ESBuild.cs"
TimPurdum Mar 7, 2026
465b30d
update scripts
TimPurdum Mar 8, 2026
01abac4
updated scripts
TimPurdum Mar 8, 2026
9d4918f
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 8, 2026
6d66ebb
updating filtering in TestConfig.cs
TimPurdum Mar 8, 2026
8748ed5
fix layer load
TimPurdum Mar 8, 2026
c23d1a9
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 8, 2026
bb3c560
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 8, 2026
2881fc0
fix test cpnfig
TimPurdum Mar 9, 2026
702fa8a
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 9, 2026
e9feb52
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 9, 2026
6d72b06
Fix DirectoryNotFoundException in CI when Pro test directories are mi…
TimPurdum Mar 9, 2026
bac83fb
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 9, 2026
46604ca
Fix AnalyzeUnitTests counting non-test methods in total test count
TimPurdum Mar 9, 2026
1f22220
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 9, 2026
4bf3b9b
Exclude AutomationExclude tests from FilteredTests denominator
TimPurdum Mar 9, 2026
029f0e6
Fix tests
TimPurdum Mar 10, 2026
2ce1e99
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 10, 2026
1fcf821
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
6b14309
fixes
TimPurdum Mar 10, 2026
9a14f8b
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 10, 2026
1020246
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
0055bf4
Fix test count mismatch: filter non-test methods and CIExclude tests
TimPurdum Mar 10, 2026
3ee88fc
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
af07fdf
wip
TimPurdum Mar 10, 2026
e6fa83d
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
565522d
fix testConfig
TimPurdum Mar 10, 2026
bbeefef
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 10, 2026
2036877
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
fd91959
fix test class
TimPurdum Mar 10, 2026
e4e5766
Merge branches 'feature/license-validation' and 'feature/license-vali…
TimPurdum Mar 10, 2026
fb10e13
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
b90b24e
fix testconfig
TimPurdum Mar 10, 2026
c9ed800
final count fixes, hopefully
TimPurdum Mar 10, 2026
e75644a
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
058eefe
just keep trying
TimPurdum Mar 10, 2026
76491eb
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 10, 2026
8dab5eb
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
2f6f894
gbtest
TimPurdum Mar 10, 2026
8ea09fb
Merge branch 'feature/license-validation' of https://github.com/dymap…
TimPurdum Mar 10, 2026
ceaef57
Pipeline Build Commit of Version and Docs
submodule-validation-for-geoblazor[bot] Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ root = true
[**/wwwroot/js/**.js]
generated_code = true

# MSBuild / XML project files
[*.{props,csproj,targets}]
ij_xml_attribute_wrap = split_into_lines
ij_xml_keep_line_breaks = true

# C# files
[*.cs]

Expand Down Expand Up @@ -94,9 +99,9 @@ dotnet_style_allow_statement_immediately_after_block_experimental = true
#### C# Coding Conventions ####

# var preferences (Rider: UseVarWhenEvident for all)
csharp_style_var_elsewhere = true
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false

# Expression-bodied members
csharp_style_expression_bodied_accessors = true
Expand All @@ -122,7 +127,7 @@ csharp_style_conditional_delegate_call = true
# Modifier preferences
csharp_prefer_static_anonymous_function = true
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
csharp_preferred_modifier_order = public, private, protected, internal, file, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, required, volatile, async
csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true

Expand Down Expand Up @@ -268,7 +273,7 @@ dotnet_naming_symbols.private_constants.required_modifiers = const

dotnet_naming_symbols.private_static_readonly.applicable_kinds = field
dotnet_naming_symbols.private_static_readonly.applicable_accessibilities = private
dotnet_naming_symbols.private_static_readonly.required_modifiers = static,readonly
dotnet_naming_symbols.private_static_readonly.required_modifiers = static, readonly

dotnet_naming_symbols.public_fields.applicable_kinds = field
dotnet_naming_symbols.public_fields.applicable_accessibilities = public
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/dev-pr-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ jobs:
repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }}
ref: ${{ github.event.pull_request.head.ref || github.ref }}

- name: Clean node_modules
shell: pwsh
run: |
Remove-Item -Recurse -Force ./src/dymaptic.GeoBlazor.Core/node_modules -ErrorAction SilentlyContinue

- name: Run Tests
shell: pwsh
env:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ PublishScripts/

# NuGet Packages
*.nupkg
*.nupkg.bak
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
Expand Down Expand Up @@ -399,3 +400,4 @@ DefaultDocsLinks
.esbuild-record.json
*.nupkg.bak
/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/arcgis_token_cache.json
build-tools/debug-output
28 changes: 20 additions & 8 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CoreVersion>5.0.0.85</CoreVersion>
<CoreVersion>5.0.0.142</CoreVersion>
<Configurations>Debug;Release;SourceGen Highlighting</Configurations>
<Platforms>AnyCPU</Platforms>
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
Expand Down Expand Up @@ -48,9 +48,6 @@
<!-- ESBuild Project Trigger: Must happen before RESTORE -->
<PropertyGroup>
<ESBuildLockFilePath>$(MSBuildThisFileDirectory)src/dymaptic.GeoBlazor.Core/esBuild.lock</ESBuildLockFilePath>
<ESBuildLockFileTimeStamp Condition="EXISTS($(ESBuildLockFilePath))">$([System.IO.File]::GetLastWriteTime(`$(ESBuildLockFilePath)`).Ticks)</ESBuildLockFileTimeStamp>
<ESBuildLockFileTimeStamp Condition="'$(ESBuildLockFileTimeStamp)' == ''">0</ESBuildLockFileTimeStamp>
<StaleFileThresholdTimeStamp>$([System.DateTime]::Now.AddMinutes(-5).Ticks)</StaleFileThresholdTimeStamp>
<ESBuildRemoveProps>
BuildProjectReferences;
Configuration;
Expand All @@ -69,10 +66,25 @@
TriggerESBuild;
TriggerProESBuild
</ESBuildRemoveProps>
<ESBuildNonTriggeringProjects>
;dymaptic.GeoBlazor.Core.ESBuild;
;dymaptic.GeoBlazor.Pro.ESBuild;
;dymaptic.GeoBlazor.Pro.V;
</ESBuildNonTriggeringProjects>
</PropertyGroup>
<Target Name="TriggerESBuild" BeforeTargets="Restore;BeforeBuild" Condition="'$(MSBuildProjectName)' != 'dymaptic.GeoBlazor.Core.ESBuild' AND (!EXISTS($(ESBuildLockFilePath)) OR $(ESBuildLockFileTimeStamp) &lt; $(StaleFileThresholdTimeStamp))">
<WriteLinesToFile File="$(ESBuildLockFilePath)" Lines="$([System.DateTime]::Now.ToString(`o`))" Overwrite="false" ContinueOnError="true" />
<Exec Command="dotnet restore $(MSBuildThisFileDirectory)src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj" />
<MSBuild Projects="$(MSBuildThisFileDirectory)src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj" Properties="GBBuildToolsPath=$(GBBuildToolsPath);ShowScriptDialogs=$(ShowScriptDialogs)" RemoveProperties="$(ESBuildRemoveProps)" />
<Target Name="TriggerESBuild" BeforeTargets="Restore;BeforeBuild" Condition="!$(ESBuildNonTriggeringProjects.Contains(';$(MSBuildProjectName);'))">
<!-- Atomically check-and-acquire the lock file; exit code 0 = acquired.
AcquireBuildLock also creates a .running marker file when the lock is acquired,
so other projects can wait for ESBuild to complete. -->
<Exec Command="dotnet &quot;$(GBBuildToolsPath)/AcquireBuildLock.dll&quot; &quot;$(ESBuildLockFilePath)&quot; 5" IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="_AcquireLockExitCode" />
</Exec>
<!-- Lock acquired: run ESBuild, then remove the .running marker -->
<Message Importance="high" Text="Triggering Core ESBuild from $(MSBuildProjectName)" Condition="'$(_AcquireLockExitCode)' == '0'" />
<Exec Command="dotnet restore $(MSBuildThisFileDirectory)src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj" Condition="'$(_AcquireLockExitCode)' == '0'" />
<MSBuild Projects="$(MSBuildThisFileDirectory)src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj" Properties="GBBuildToolsPath=$(GBBuildToolsPath);ShowScriptDialogs=$(ShowScriptDialogs)" RemoveProperties="$(ESBuildRemoveProps)" Condition="'$(_AcquireLockExitCode)' == '0'" />
<Delete Files="$(ESBuildLockFilePath).running" Condition="'$(_AcquireLockExitCode)' == '0'" />
<!-- Lock not acquired: another project is running ESBuild — wait for it to finish -->
<Exec Command="dotnet &quot;$(GBBuildToolsPath)/WaitForBuildComplete.dll&quot; &quot;$(ESBuildLockFilePath).running&quot; 120" Condition="'$(_AcquireLockExitCode)' != '0'" />
</Target>
</Project>
24 changes: 10 additions & 14 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ COPY ./Directory.Build.* ./
COPY ./.gitignore ./.gitignore
COPY ./nuget.config ./nuget.config
COPY ./src/ ./src/

# Create GeoBlazor NuGet Packages
RUN --mount=type=cache,target=/root/.nuget/packages \
dotnet ./build-tools/linux-x64/GeoBlazorBuild.dll -pkg -obf -c "Release"

COPY ./test/dymaptic.GeoBlazor.Core.Test.Blazor.Shared ./test/dymaptic.GeoBlazor.Core.Test.Blazor.Shared
COPY ./test/dymaptic.GeoBlazor.Core.Test.WebApp ./test/dymaptic.GeoBlazor.Core.Test.WebApp

Expand All @@ -49,30 +54,21 @@ RUN dotnet ./build-tools/linux-x64/BuildAppSettings.dll \
-w "${WFS_SERVERS}"

# Build from source with debug symbols for code coverage
# UsePackageReference=false builds GeoBlazor from source instead of NuGet
# UsePackageReferences=false builds GeoBlazor from source instead of NuGet
# DebugSymbols=true and DebugType=portable ensure PDB files are generated
RUN --mount=type=cache,target=/root/.nuget/packages \
dotnet build ./test/dymaptic.GeoBlazor.Core.Test.WebApp/dymaptic.GeoBlazor.Core.Test.WebApp/dymaptic.GeoBlazor.Core.Test.WebApp.csproj \
-c Release \
/p:UsePackageReference=false \
/p:DebugSymbols=true \
/p:DebugType=portable \
/p:GeneratePackage=false \
/p:GenerateDocs=false \
/p:GenerateXmlComments=false \
/p:ShowScriptDialogs=false

RUN --mount=type=cache,target=/root/.nuget/packages \
dotnet publish ./test/dymaptic.GeoBlazor.Core.Test.WebApp/dymaptic.GeoBlazor.Core.Test.WebApp/dymaptic.GeoBlazor.Core.Test.WebApp.csproj \
-c Release \
/p:UsePackageReference=false \
/p:UsePackageReferences=true \
/p:DebugSymbols=true \
/p:DebugType=portable \
/p:GeneratePackage=false \
/p:GenerateDocs=false \
/p:GenerateXmlComments=false \
/p:ShowScriptDialogs=false \
-o /app/publish
-o /app/publish -bl

RUN cp ./msbuild.binlog /app/publish/msbuild.binlog 2>/dev/null || true

FROM mcr.microsoft.com/dotnet/aspnet:10.0

Expand Down
4 changes: 2 additions & 2 deletions Dockerfile.unit
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ COPY $TEST_FOLDER $TEST_FOLDER
RUN --mount=type=cache,target=/root/.nuget/packages \
dotnet build $TEST_PROJECT \
-c Release \
/p:UsePackageReference=false \
/p:UsePackageReferences=false \
/p:DebugSymbols=true \
/p:DebugType=portable \
/p:GeneratePackage=false \
/p:GenerateDocs=false \
/p:GenerateXmlComments=false \
/p:ShowScriptDialogs=false
/p:ShowScriptDialogs=false -bl

# Create user and set working directory
RUN groupadd -r info && useradd -r -g info info \
Expand Down
4 changes: 2 additions & 2 deletions badge_fullmethodcoverage.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions badge_linecoverage.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions badge_methodcoverage.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
74 changes: 74 additions & 0 deletions build-tools/build-scripts/AcquireBuildLock.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/usr/bin/env dotnet

// AcquireBuildLock - Atomic build lock acquisition
// =================================================
// Atomically checks whether a time-based lock file is stale and acquires it
// if so, using exclusive file access to prevent races in parallel MSBuild.
//
// When the lock is acquired, a companion ".running" marker file is also created
// atomically. This allows other projects to wait for the build step to complete
// by polling for the marker file's removal (see WaitForBuildComplete).
//
// Usage: dotnet AcquireBuildLock.cs <lock-file-path> [stale-minutes]
//
// Arguments:
// <lock-file-path> Path to the lock file
// [stale-minutes] Minutes before the lock is considered stale (default: 5)
//
// Exit codes:
// 0 Lock acquired — caller should proceed with the build step
// 1 Lock is fresh or held by another process — caller should skip

if (args.Length < 1 || args[0] is "-h" or "--help")
{
Console.WriteLine("Usage: dotnet AcquireBuildLock.cs <lock-file-path> [stale-minutes]");
Console.WriteLine();
Console.WriteLine("Exit codes:");
Console.WriteLine(" 0 Lock acquired (proceed)");
Console.WriteLine(" 1 Lock fresh or held (skip)");
return args.Length > 0 ? 0 : 1;
}

string lockFilePath = args[0];
string runningFilePath = lockFilePath + ".running";
int staleMinutes = args.Length > 1 && int.TryParse(args[1], out int m) ? m : 5;

try
{
string? dir = Path.GetDirectoryName(lockFilePath);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
Directory.CreateDirectory(dir);

// FileShare.None = exclusive lock; concurrent callers get IOException
using var fs = new FileStream(lockFilePath,
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.None);

using var reader = new StreamReader(fs, leaveOpen: true);
string content = reader.ReadToEnd().Trim();

if (!string.IsNullOrEmpty(content) &&
DateTime.TryParse(content, out DateTime lastWrite) &&
(DateTime.Now - lastWrite).TotalMinutes < staleMinutes)
{
// Lock is fresh — another project already triggered
return 1;
}

// Stale or missing — we win, stamp it
fs.SetLength(0);
using var writer = new StreamWriter(fs);
writer.Write(DateTime.Now.ToString("o"));
writer.Flush();

// Create .running marker so other projects can wait for completion
File.WriteAllText(runningFilePath, DateTime.Now.ToString("o"));

return 0;
}
catch (IOException)
{
// Another process holds the exclusive lock — they win
return 1;
}
Loading