From d7f94779a3c8b9cfee754e97f3848ba936376524 Mon Sep 17 00:00:00 2001 From: "Liangying.Wei" Date: Tue, 11 Aug 2026 18:14:41 +1000 Subject: [PATCH 01/20] chore(deps): upgrade repository dependencies Upgrade NuGet, npm, and GitHub Actions dependencies and migrate affected APIs and templates. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/actions/build/action.yml | 4 +- .github/dependabot.yml | 19 +- .github/workflows/ci.yml | 10 +- .github/workflows/dependabot.yml | 2 +- .github/workflows/lint.yml | 4 +- .github/workflows/nightly.yml | 6 +- .github/workflows/release.yml | 10 +- .github/workflows/reports.yml | 2 +- .github/workflows/snapshot.yml | 4 +- Directory.Packages.props | 20 +- .../project/Project/BuildFromProject.csproj | 2 +- .../OverwriteDocumentModelCreator.cs | 4 +- .../Validators/SchemaValidator.cs | 21 +- src/Docfx.Build/TableOfContents/TocHelper.cs | 4 +- .../Docfx.DataContracts.Common.csproj | 2 +- .../Docfx.DataContracts.RestApi.csproj | 2 +- ...fx.DataContracts.UniversalReference.csproj | 2 +- src/Docfx.Dotnet/SymbolFormatter.Symbols.cs | 1 + src/Docfx.Glob/Docfx.Glob.csproj | 2 +- .../Docfx.MarkdigEngine.csproj | 2 +- .../TypeInspectors/EmitTypeInspector.cs | 14 + ...ExtensibleNamingConventionTypeInspector.cs | 6 + ...dableAndWritablePropertiesTypeInspector.cs | 6 + .../ExtensibleTypeInspectorSkeleton.cs | 4 + .../ExtensibleYamlAttributesTypeInspector.cs | 6 + .../YamlDeserializer.cs | 10 + src/docfx/Models/BuildCommand.cs | 2 +- src/docfx/Models/DefaultCommand.cs | 2 +- src/docfx/Models/DownloadCommand.cs | 2 +- src/docfx/Models/InitCommand.cs | 2 +- src/docfx/Models/MergeCommand.cs | 2 +- src/docfx/Models/MetadataCommand.cs | 2 +- src/docfx/Models/PdfCommand.cs | 2 +- src/docfx/Models/ServeCommand.cs | 2 +- src/docfx/Models/TemplateCommand.cs | 4 +- templates/.npmrc | 1 + templates/build.js | 6 +- templates/default/layout/_master.tmpl | 2 +- templates/default/partials/affix.tmpl.partial | 4 +- .../default/partials/breadcrumb.tmpl.partial | 2 +- .../default/partials/footer.tmpl.partial | 2 +- templates/default/partials/li.tmpl.partial | 2 +- .../default/partials/navbar.tmpl.partial | 21 +- .../partials/searchResults.tmpl.partial | 2 +- templates/default/partials/toc.tmpl.partial | 2 +- templates/default/src/docfx.vendor.js | 3 +- templates/default/styles/docfx.css | 53 +- templates/default/styles/docfx.js | 129 +- templates/default/toc.html.primary.tmpl | 4 +- templates/modern/src/layout.scss | 2 +- templates/modern/src/markdown.scss | 1 + templates/modern/src/markdown.ts | 2 +- templates/modern/src/toc.scss | 4 +- templates/package-lock.json | 4847 ++++++----------- templates/package.json | 42 +- templates/stylelint.config.js | 2 +- test/Directory.Packages.props | 8 +- .../Utilities/JsonSchemaUtility.cs | 13 +- 58 files changed, 1948 insertions(+), 3395 deletions(-) create mode 100644 templates/.npmrc diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index d27be338048..1f090603644 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -3,11 +3,11 @@ description: build the project runs: using: "composite" steps: - - uses: actions/setup-node@v6 + - uses: actions/setup-node@v7 with: node-version: 24 - - uses: actions/setup-dotnet@v5 + - uses: actions/setup-dotnet@v6 with: dotnet-version: | 10.x diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 02b7da27175..2171be60690 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,13 +21,13 @@ updates: - "xunit.v3" - "xunit.v3.*" - - package-ecosystem: "nuget" - target-branch: main - directory: "/" - schedule: - interval: "monthly" - allow: - - dependency-name: "Verify.*" +- package-ecosystem: "nuget" + target-branch: main + directory: "/" + schedule: + interval: "monthly" + allow: + - dependency-name: "Verify.*" - package-ecosystem: npm target-branch: main @@ -40,10 +40,7 @@ updates: typescript-eslint: patterns: - "@typescript-eslint/*" - ignore: - # Ignore default template dependency update due to missing tests - - dependency-name: '@default/*' - - dependency-name: 'jquery' + - "typescript-eslint" - package-ecosystem: "github-actions" directory: "/" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c3159eea0a..2d1b3b07698 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: matrix: os: [windows-latest, macos-latest, ubuntu-latest] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -42,7 +42,7 @@ jobs: if: matrix.os == 'ubuntu-latest' id: test-net80 - - run: npm i -g @percy/cli + - run: npm i -g @percy/cli@1.32.5 if: matrix.os == 'ubuntu-latest' - run: percy exec -- dotnet test -c Release -f net10.0 --filter Stage=Percy --no-build --collect:"XPlat Code Coverage" @@ -50,7 +50,7 @@ jobs: env: PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} - - uses: codecov/codecov-action@v5 + - uses: codecov/codecov-action@v7 if: matrix.os == 'ubuntu-latest' with: fail_ci_if_error: false @@ -62,7 +62,7 @@ jobs: - run: dotnet run -c Release --no-build -f net10.0 --project src/docfx -- docs/docfx.json - run: dotnet run -c Release --no-build -f net10.0 --project src/docfx -- samples/seed/docfx.json --output docs/_site/seed - - uses: actions/upload-pages-artifact@v4 + - uses: actions/upload-pages-artifact@v5 if: matrix.os == 'ubuntu-latest' with: path: docs/_site @@ -96,4 +96,4 @@ jobs: id-token: write steps: - id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml index 3693940df24..3bb479473a7 100644 --- a/.github/workflows/dependabot.yml +++ b/.github/workflows/dependabot.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Retrieve Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@21025c705c08248db411dc16f3619e6b5f9ea21a # v2.5.0 + uses: dependabot/fetch-metadata@25dd0e34f4fe68f24cc83900b1fe3fe149efef98 # v3.1.0 - name: Auto Approve PR run: gh pr review --approve "$PR_URL" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5c68f2041f5..e29bf64eab6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -17,9 +17,9 @@ jobs: if: github.event.pull_request.draft == false steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7 - - uses: actions/setup-dotnet@v5 + - uses: actions/setup-dotnet@v6 with: dotnet-version: 10.x diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index a56b7cca6ee..abcfddcadf7 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -16,12 +16,12 @@ jobs: packages: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - id: version - uses: paulhatch/semantic-version@v6.0.1 + uses: paulhatch/semantic-version@v6.0.2 with: version_format: ${major}.${minor}.${patch}-preview.${increment} @@ -53,7 +53,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Create NuGet.config shell: pwsh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3e42ab8f46b..18a97341fe1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: ./.github/actions/build @@ -45,7 +45,7 @@ jobs: permissions: id-token: write steps: - - uses: actions/setup-dotnet@v5 + - uses: actions/setup-dotnet@v6 with: dotnet-version: 10.x @@ -55,9 +55,9 @@ jobs: path: drop/nuget # Install `Sign CLI` to use Azure Key Vault (See: https://github.com/dotnet/sign/blob/main/docs/comparisons.md) - - run: dotnet tool install --tool-path . --prerelease sign + - run: dotnet tool install --tool-path . --version 1.1.5 sign - - uses: azure/login@v2 + - uses: azure/login@v3 with: allow-no-subscriptions: true client-id: ${{ secrets.SIGN_KEY_VAULT_CLIENT_ID }} @@ -86,7 +86,7 @@ jobs: contents: write id-token: write steps: - - uses: actions/setup-dotnet@v5 + - uses: actions/setup-dotnet@v6 with: dotnet-version: 10.x diff --git a/.github/workflows/reports.yml b/.github/workflows/reports.yml index dd9f3c59bba..7beb795a454 100644 --- a/.github/workflows/reports.yml +++ b/.github/workflows/reports.yml @@ -20,7 +20,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure' }} steps: - name: Create Test Report - uses: dorny/test-reporter@b082adf0eced0765477756c2a610396589b8c637 # v2.5.0 + uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0 id : test-reports with: artifact: /^logs-(.*)/ # Name of artifact to report diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml index b5076968ed4..7d1404e25de 100644 --- a/.github/workflows/snapshot.yml +++ b/.github/workflows/snapshot.yml @@ -19,7 +19,7 @@ jobs: actions: write # Required to invoke another workflow with `createWorkflowDispatch`. contents: write # Required to commit snapshot diffs. steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: ref: ${{ github.ref_name }} lfs: true @@ -52,7 +52,7 @@ jobs: commit_message: 'test(snapshot): update snapshots ${{ github.sha }}' # Invoke CI workflow if changes are committed. - - uses: actions/github-script@v8 + - uses: actions/github-script@v9 if: ${{ steps.auto-commit-action.outputs.changes_detected == 'true' }} with: script: | diff --git a/Directory.Packages.props b/Directory.Packages.props index ed77b003c32..86492e58bbf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,21 +5,21 @@ - - - - - + + + + + - + - - + + - - + + diff --git a/samples/seed/dotnet/project/Project/BuildFromProject.csproj b/samples/seed/dotnet/project/Project/BuildFromProject.csproj index 80f4c4cb801..814ee112bee 100644 --- a/samples/seed/dotnet/project/Project/BuildFromProject.csproj +++ b/samples/seed/dotnet/project/Project/BuildFromProject.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Docfx.Build.OverwriteDocuments/OverwriteDocumentModelCreator.cs b/src/Docfx.Build.OverwriteDocuments/OverwriteDocumentModelCreator.cs index 2d4bc3a3fa7..48392e3da22 100644 --- a/src/Docfx.Build.OverwriteDocuments/OverwriteDocumentModelCreator.cs +++ b/src/Docfx.Build.OverwriteDocuments/OverwriteDocumentModelCreator.cs @@ -4,6 +4,7 @@ using Docfx.Build.Common; using Docfx.Common; using Markdig.Syntax; +using YamlException = YamlDotNet.Core.YamlException; namespace Docfx.Build.OverwriteDocuments; @@ -47,8 +48,9 @@ internal static Dictionary ConvertYamlCodeBlock(string yamlCodeB } catch (Exception ex) { + var details = ex is YamlException yamlException ? yamlException.ToMessage() : ex.ToString(); throw new MarkdownFragmentsException( - $"Encountered an invalid YAML code block: {ex}", + $"Encountered an invalid YAML code block: {details}", yamlCodeBlockSource.Line, ex); } diff --git a/src/Docfx.Build.SchemaDriven/Validators/SchemaValidator.cs b/src/Docfx.Build.SchemaDriven/Validators/SchemaValidator.cs index 834edbc8631..c538e851e64 100644 --- a/src/Docfx.Build.SchemaDriven/Validators/SchemaValidator.cs +++ b/src/Docfx.Build.SchemaDriven/Validators/SchemaValidator.cs @@ -13,34 +13,41 @@ public class SchemaValidator private static readonly EvaluationOptions DefaultOptions = new() { - ValidateAgainstMetaSchema = false, + IncludeApplicatorErrors = false, OutputFormat = OutputFormat.List, }; static SchemaValidator() { - SchemaRegistry.Global.Register(new("http://dotnet.github.io/docfx/schemas/v1.0/schema.json#"), MetaSchemas.Draft7); - SchemaRegistry.Global.Register(new("https://dotnet.github.io/docfx/schemas/v1.0/schema.json#"), MetaSchemas.Draft7); + RegisterDialect(new("http://dotnet.github.io/docfx/schemas/v1.0/schema.json#")); + RegisterDialect(new("https://dotnet.github.io/docfx/schemas/v1.0/schema.json#")); + + static void RegisterDialect(Uri id) + { + SchemaRegistry.Global.Register(id, MetaSchemas.Draft7); + DialectRegistry.Global.Register(Dialect.Draft07.With([], id)); + } } public SchemaValidator(string json) { - _schema = JsonSchema.FromText(json, new() { AllowTrailingCommas = true }); + _schema = JsonSchema.FromText(json, jsonOptions: new() { AllowTrailingCommas = true }); } public void Validate(object obj) { var json = JsonSerializer.Serialize(obj); - var result = _schema.Evaluate(JsonDocument.Parse(json), DefaultOptions); + using var document = JsonDocument.Parse(json); + var result = _schema.Evaluate(document.RootElement, DefaultOptions); if (result.IsValid) return; foreach (var detail in result.Details) { - if (detail.HasErrors) + if (detail.Errors is { } errors) { - foreach (var (type, message) in detail.Errors) + foreach (var (type, message) in errors) { Logger.LogError($"[{detail.InstanceLocation}] {type}: {message} ", code: "ViolateSchema"); } diff --git a/src/Docfx.Build/TableOfContents/TocHelper.cs b/src/Docfx.Build/TableOfContents/TocHelper.cs index caadd3b1829..34103a8ded7 100644 --- a/src/Docfx.Build/TableOfContents/TocHelper.cs +++ b/src/Docfx.Build/TableOfContents/TocHelper.cs @@ -6,6 +6,7 @@ using Docfx.Common; using Docfx.DataContracts.Common; using Docfx.Plugins; +using YamlException = YamlDotNet.Core.YamlException; namespace Docfx.Build.TableOfContents; @@ -75,7 +76,8 @@ public static TocItemViewModel LoadSingleToc(string file) } catch (Exception e) { - var message = $"{file} is not a valid TOC File: {e}"; + var details = e is YamlException yamlException ? yamlException.ToMessage() : e.ToString(); + var message = $"{file} is not a valid TOC File: {details}"; Logger.LogError(message, code: ErrorCodes.Toc.InvalidTocFile); throw new DocumentException(message, e); } diff --git a/src/Docfx.DataContracts.Common/Docfx.DataContracts.Common.csproj b/src/Docfx.DataContracts.Common/Docfx.DataContracts.Common.csproj index ca8882932c0..620e8c4b71b 100644 --- a/src/Docfx.DataContracts.Common/Docfx.DataContracts.Common.csproj +++ b/src/Docfx.DataContracts.Common/Docfx.DataContracts.Common.csproj @@ -1,6 +1,6 @@ - + diff --git a/src/Docfx.DataContracts.RestApi/Docfx.DataContracts.RestApi.csproj b/src/Docfx.DataContracts.RestApi/Docfx.DataContracts.RestApi.csproj index bdc101b4bb7..e65e970fe74 100644 --- a/src/Docfx.DataContracts.RestApi/Docfx.DataContracts.RestApi.csproj +++ b/src/Docfx.DataContracts.RestApi/Docfx.DataContracts.RestApi.csproj @@ -1,6 +1,6 @@ - + diff --git a/src/Docfx.DataContracts.UniversalReference/Docfx.DataContracts.UniversalReference.csproj b/src/Docfx.DataContracts.UniversalReference/Docfx.DataContracts.UniversalReference.csproj index 9eeb6b8129c..17bc28342a6 100644 --- a/src/Docfx.DataContracts.UniversalReference/Docfx.DataContracts.UniversalReference.csproj +++ b/src/Docfx.DataContracts.UniversalReference/Docfx.DataContracts.UniversalReference.csproj @@ -1,6 +1,6 @@ - + diff --git a/src/Docfx.Dotnet/SymbolFormatter.Symbols.cs b/src/Docfx.Dotnet/SymbolFormatter.Symbols.cs index a918eea53ed..edc79e38809 100644 --- a/src/Docfx.Dotnet/SymbolFormatter.Symbols.cs +++ b/src/Docfx.Dotnet/SymbolFormatter.Symbols.cs @@ -368,6 +368,7 @@ public class MethodSymbol : IMethodSymbol public string GetDocumentationCommentXml(CultureInfo preferredCulture = null, bool expandIncludes = false, CancellationToken cancellationToken = default) => Inner.GetDocumentationCommentXml(preferredCulture, expandIncludes, cancellationToken); public ImmutableArray GetReturnTypeAttributes() => Inner.GetReturnTypeAttributes(); public ITypeSymbol GetTypeInferredDuringReduction(ITypeParameterSymbol reducedFromTypeParameter) => Inner.GetTypeInferredDuringReduction(reducedFromTypeParameter); + public IMethodSymbol ReduceExtensionMember(ITypeSymbol receiverType) => Inner.ReduceExtensionMember(receiverType); public IMethodSymbol ReduceExtensionMethod(ITypeSymbol receiverType) => Inner.ReduceExtensionMethod(receiverType); public IMethodSymbol ReduceExtensionMember(ITypeSymbol receiverType) => Inner.ReduceExtensionMember(receiverType); public ImmutableArray ToDisplayParts(SymbolDisplayFormat format = null) => Inner.ToDisplayParts(format); diff --git a/src/Docfx.Glob/Docfx.Glob.csproj b/src/Docfx.Glob/Docfx.Glob.csproj index ca8882932c0..620e8c4b71b 100644 --- a/src/Docfx.Glob/Docfx.Glob.csproj +++ b/src/Docfx.Glob/Docfx.Glob.csproj @@ -1,6 +1,6 @@ - + diff --git a/src/Docfx.MarkdigEngine/Docfx.MarkdigEngine.csproj b/src/Docfx.MarkdigEngine/Docfx.MarkdigEngine.csproj index 29457598388..b83a5da2377 100644 --- a/src/Docfx.MarkdigEngine/Docfx.MarkdigEngine.csproj +++ b/src/Docfx.MarkdigEngine/Docfx.MarkdigEngine.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs index 1dbbc65e60d..5d83a962152 100644 --- a/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs +++ b/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs @@ -117,6 +117,20 @@ public override string GetEnumValue(object enumValue) return valueText; } + public override bool HasParseMethod(Type type) => + type.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static, null, [typeof(string)], null) != null; + + public override object? Parse(string value, Type expectedType) + { + var method = expectedType.GetMethod("Parse", [typeof(string)]); + if (method == null) + { + throw new InvalidOperationException($"Type '{expectedType.FullName}' does not have a static Parse method."); + } + + return method.Invoke(null, [value]); + } + private sealed class CachingItem { private CachingItem() { } diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs index f7fa3fd3eaa..fc4f17b986b 100644 --- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs +++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs @@ -31,4 +31,10 @@ public override string GetEnumName(Type enumType, string name) => public override string GetEnumValue(object enumValue) => innerTypeDescriptor.GetEnumValue(enumValue); + + public override bool HasParseMethod(Type type) => + innerTypeDescriptor.HasParseMethod(type); + + public override object? Parse(string value, Type expectedType) => + innerTypeDescriptor.Parse(value, expectedType); } diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs index 01ad2ab9f38..6b85504ccca 100644 --- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs +++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs @@ -27,4 +27,10 @@ public override string GetEnumName(Type enumType, string name) => public override string GetEnumValue(object enumValue) => _innerTypeDescriptor.GetEnumValue(enumValue); + + public override bool HasParseMethod(Type type) => + _innerTypeDescriptor.HasParseMethod(type); + + public override object? Parse(string value, Type expectedType) => + _innerTypeDescriptor.Parse(value, expectedType); } diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs index 715bec3a57f..c897b198357 100644 --- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs +++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs @@ -64,4 +64,8 @@ public IPropertyDescriptor GetProperty(Type type, object? container, string name public abstract string GetEnumName(Type enumType, string name); public abstract string GetEnumValue(object enumValue); + + public abstract bool HasParseMethod(Type type); + + public abstract object? Parse(string value, Type expectedType); } diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs index 0fb61db306f..a24a7f70953 100644 --- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs +++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs @@ -54,4 +54,10 @@ public override string GetEnumName(Type enumType, string name) => public override string GetEnumValue(object enumValue) => innerTypeDescriptor.GetEnumValue(enumValue); + + public override bool HasParseMethod(Type type) => + innerTypeDescriptor.HasParseMethod(type); + + public override object? Parse(string value, Type expectedType) => + innerTypeDescriptor.Parse(value, expectedType); } diff --git a/src/Docfx.YamlSerialization/YamlDeserializer.cs b/src/Docfx.YamlSerialization/YamlDeserializer.cs index 9080bea8fe5..c4191d60e4f 100644 --- a/src/Docfx.YamlSerialization/YamlDeserializer.cs +++ b/src/Docfx.YamlSerialization/YamlDeserializer.cs @@ -65,6 +65,16 @@ public string GetEnumValue(object enumValue) { return TypeDescriptor.GetEnumValue(enumValue); } + + public bool HasParseMethod(Type type) + { + return TypeDescriptor.HasParseMethod(type); + } + + public object? Parse(string value, Type expectedType) + { + return TypeDescriptor.Parse(value, expectedType); + } } public YamlDeserializer( diff --git a/src/docfx/Models/BuildCommand.cs b/src/docfx/Models/BuildCommand.cs index 6f779889d9f..167a679857a 100644 --- a/src/docfx/Models/BuildCommand.cs +++ b/src/docfx/Models/BuildCommand.cs @@ -12,7 +12,7 @@ namespace Docfx; internal class BuildCommand : AsyncCommand { - public override Task ExecuteAsync(CommandContext context, BuildCommandOptions settings, CancellationToken cancellationToken) + protected override Task ExecuteAsync(CommandContext context, BuildCommandOptions settings, CancellationToken cancellationToken) { return CommandHelper.RunAsync(settings, async () => { diff --git a/src/docfx/Models/DefaultCommand.cs b/src/docfx/Models/DefaultCommand.cs index 47ee79c027f..0d530b704a0 100644 --- a/src/docfx/Models/DefaultCommand.cs +++ b/src/docfx/Models/DefaultCommand.cs @@ -20,7 +20,7 @@ internal class Options : BuildCommandOptions public bool Version { get; set; } } - public override int Execute(CommandContext context, Options options, CancellationToken cancellationToken) + protected override int Execute(CommandContext context, Options options, CancellationToken cancellationToken) { if (options.Version) { diff --git a/src/docfx/Models/DownloadCommand.cs b/src/docfx/Models/DownloadCommand.cs index bb2739eb12a..7ccee632900 100644 --- a/src/docfx/Models/DownloadCommand.cs +++ b/src/docfx/Models/DownloadCommand.cs @@ -10,7 +10,7 @@ namespace Docfx; internal class DownloadCommand : Command { - public override int Execute([NotNull] CommandContext context, [NotNull] DownloadCommandOptions options, CancellationToken cancellationToken) + protected override int Execute([NotNull] CommandContext context, [NotNull] DownloadCommandOptions options, CancellationToken cancellationToken) { return CommandHelper.Run(() => { diff --git a/src/docfx/Models/InitCommand.cs b/src/docfx/Models/InitCommand.cs index c8a245074ec..d44000bfe9a 100644 --- a/src/docfx/Models/InitCommand.cs +++ b/src/docfx/Models/InitCommand.cs @@ -13,7 +13,7 @@ namespace Docfx; class InitCommand : Command { - public override int Execute([NotNull] CommandContext context, [NotNull] InitCommandOptions options, CancellationToken cancellationToken) + protected override int Execute([NotNull] CommandContext context, [NotNull] InitCommandOptions options, CancellationToken cancellationToken) { WriteLine( """ diff --git a/src/docfx/Models/MergeCommand.cs b/src/docfx/Models/MergeCommand.cs index 52315ec2eb8..f22aaea0ab9 100644 --- a/src/docfx/Models/MergeCommand.cs +++ b/src/docfx/Models/MergeCommand.cs @@ -8,7 +8,7 @@ namespace Docfx; internal class MergeCommand : Command { - public override int Execute([NotNull] CommandContext context, [NotNull] MergeCommandOptions options, CancellationToken cancellationToken) + protected override int Execute([NotNull] CommandContext context, [NotNull] MergeCommandOptions options, CancellationToken cancellationToken) { return CommandHelper.Run(options, () => { diff --git a/src/docfx/Models/MetadataCommand.cs b/src/docfx/Models/MetadataCommand.cs index 8bd0b98823c..4019eefba4b 100644 --- a/src/docfx/Models/MetadataCommand.cs +++ b/src/docfx/Models/MetadataCommand.cs @@ -9,7 +9,7 @@ namespace Docfx; internal class MetadataCommand : AsyncCommand { - public override Task ExecuteAsync([NotNull] CommandContext context, [NotNull] MetadataCommandOptions options, CancellationToken cancellationToken) + protected override Task ExecuteAsync([NotNull] CommandContext context, [NotNull] MetadataCommandOptions options, CancellationToken cancellationToken) { return CommandHelper.RunAsync(options, async () => { diff --git a/src/docfx/Models/PdfCommand.cs b/src/docfx/Models/PdfCommand.cs index ba0829596fb..f559e9a81cd 100644 --- a/src/docfx/Models/PdfCommand.cs +++ b/src/docfx/Models/PdfCommand.cs @@ -10,7 +10,7 @@ namespace Docfx; internal class PdfCommand : AsyncCommand { - public override async Task ExecuteAsync(CommandContext context, PdfCommandOptions options, CancellationToken cancellationToken) + protected override async Task ExecuteAsync(CommandContext context, PdfCommandOptions options, CancellationToken cancellationToken) { return await CommandHelper.RunAsync(options, async () => { diff --git a/src/docfx/Models/ServeCommand.cs b/src/docfx/Models/ServeCommand.cs index 83d52a6f06a..3efa7e86d0d 100644 --- a/src/docfx/Models/ServeCommand.cs +++ b/src/docfx/Models/ServeCommand.cs @@ -33,7 +33,7 @@ internal class Settings : CommandSettings public string OpenFile { get; set; } } - public override int Execute([NotNull] CommandContext context, [NotNull] Settings options, CancellationToken cancellationToken) + protected override int Execute([NotNull] CommandContext context, [NotNull] Settings options, CancellationToken cancellationToken) { return CommandHelper.Run(() => RunServe.Exec(options.Folder, options.Host, options.Port, options.OpenBrowser, options.OpenFile)); } diff --git a/src/docfx/Models/TemplateCommand.cs b/src/docfx/Models/TemplateCommand.cs index fff7fb9c48b..7caf62fc902 100644 --- a/src/docfx/Models/TemplateCommand.cs +++ b/src/docfx/Models/TemplateCommand.cs @@ -12,7 +12,7 @@ internal class TemplateCommand { public class ListCommand : Command { - public override int Execute(CommandContext context, CancellationToken cancellationToken) + protected override int Execute(CommandContext context, CancellationToken cancellationToken) { foreach (var path in Directory.GetDirectories(GetTemplateBaseDirectory())) Console.WriteLine(Path.GetFileName(path)); @@ -38,7 +38,7 @@ internal class Options : CommandSettings public string OutputFolder { get; set; } } - public override int Execute(CommandContext context, Options options, CancellationToken cancellationToken) + protected override int Execute(CommandContext context, Options options, CancellationToken cancellationToken) { return CommandHelper.Run(() => { diff --git a/templates/.npmrc b/templates/.npmrc new file mode 100644 index 00000000000..100721e01a6 --- /dev/null +++ b/templates/.npmrc @@ -0,0 +1 @@ +omit-lockfile-registry-resolved=true diff --git a/templates/build.js b/templates/build.js index 4d3ec7d5d51..4fda66015b8 100644 --- a/templates/build.js +++ b/templates/build.js @@ -3,7 +3,6 @@ import esbuild from 'esbuild' import { sassPlugin } from 'esbuild-sass-plugin' -import bs from 'browser-sync' import { cpSync, rmSync } from 'fs' import { join } from 'path' import { spawnSync } from 'child_process' @@ -33,7 +32,7 @@ async function build() { copyToDist() if (watch) { - serve() + await serve() } } @@ -127,7 +126,8 @@ function buildContent() { } } -function serve() { +async function serve() { + const { default: bs } = await import('browser-sync') buildContent() return bs.create('docfx').init({ diff --git a/templates/default/layout/_master.tmpl b/templates/default/layout/_master.tmpl index 5fd904e1a1a..288b9cc9bc4 100644 --- a/templates/default/layout/_master.tmpl +++ b/templates/default/layout/_master.tmpl @@ -9,7 +9,7 @@ {{>partials/head}} {{^redirect_url}} - +
{{^_disableNavbar}} diff --git a/templates/default/partials/affix.tmpl.partial b/templates/default/partials/affix.tmpl.partial index 92d5d31f85b..6d7b26fdb29 100644 --- a/templates/default/partials/affix.tmpl.partial +++ b/templates/default/partials/affix.tmpl.partial @@ -1,6 +1,6 @@ {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}} -