From 0b87b773244154ae1f85e73064137c64dda25f43 Mon Sep 17 00:00:00 2001 From: jcdcdev Date: Fri, 25 Aug 2023 23:44:04 +0100 Subject: [PATCH] first release --- .github/CONTRIBUTING.md | 5 + .github/ISSUE_TEMPLATE/bug.yml | 52 ++ .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.yml | 22 + .github/workflows/build.yml | 22 + .github/workflows/release.yml | 67 +++ .gitignore | 357 +++++++++++++ LICENSE | 21 + docs/README_nuget.md | 7 + src/jcdcdev.Umbraco.Core.TestSite/.gitignore | 481 ++++++++++++++++++ src/jcdcdev.Umbraco.Core.TestSite/Program.cs | 19 + .../Properties/launchSettings.json | 29 ++ src/jcdcdev.Umbraco.Core.TestSite/Startup.cs | 74 +++ .../Views/_ViewImports.cshtml | 9 + .../appsettings.Development.json | 34 ++ .../appsettings.json | 27 + .../jcdcdev.Umbraco.Core.TestSite.csproj | 39 ++ .../wwwroot/favicon.ico | Bin 0 -> 15406 bytes src/jcdcdev.Umbraco.Core.sln | 43 ++ .../AccessRule/AccessRuleBuilder.cs | 39 ++ .../AccessRule/IAccessRuleBuilder.cs | 17 + .../AccessRule/SimpleAccessRule.cs | 46 ++ .../ContentApp/ContentAppBadges.cs | 23 + src/jcdcdev.Umbraco.Core/icon.png | Bin 0 -> 20004 bytes .../jcdcdev.Umbraco.Core.csproj | 40 ++ 25 files changed, 1474 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 docs/README_nuget.md create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/.gitignore create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/Program.cs create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/Properties/launchSettings.json create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/Startup.cs create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/Views/_ViewImports.cshtml create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/appsettings.Development.json create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/appsettings.json create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/jcdcdev.Umbraco.Core.TestSite.csproj create mode 100644 src/jcdcdev.Umbraco.Core.TestSite/wwwroot/favicon.ico create mode 100644 src/jcdcdev.Umbraco.Core.sln create mode 100644 src/jcdcdev.Umbraco.Core/AccessRule/AccessRuleBuilder.cs create mode 100644 src/jcdcdev.Umbraco.Core/AccessRule/IAccessRuleBuilder.cs create mode 100644 src/jcdcdev.Umbraco.Core/AccessRule/SimpleAccessRule.cs create mode 100644 src/jcdcdev.Umbraco.Core/ContentApp/ContentAppBadges.cs create mode 100644 src/jcdcdev.Umbraco.Core/icon.png create mode 100644 src/jcdcdev.Umbraco.Core/jcdcdev.Umbraco.Core.csproj diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..fdadad7 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,5 @@ +# Contributing Guidelines + +Contributions to this package are most welcome! + +There is a test site in the solution to make working with this repository easier. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..0483504 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,52 @@ +name: "Bug report" +description: "File a bug report to help improve this package." +labels: "bug" +body: +- type: markdown + attributes: + value: | + Thanks for taking the time to report this issue as thoroughly as possible. +- type: input + id: "PackageVersion" + attributes: + label: "Which jcdcdev.Umbraco.Core version are you using?" + description: "Leave blank if you're not sure: the latest version will be assumed." + validations: + required: false +- type: input + id: "umbracoVersion" + attributes: + label: "Which Umbraco version are you using? For example: 10.4.0 - don't just write v10" + description: "Use the help icon in the Umbraco backoffice to find the version you're using." + validations: + required: true +- type: textarea + id: "summary" + attributes: + label: "Bug summary" + description: "Write a summary of the bug." + description: "Remember that you can format code and logs nicely with the `<>` button" + placeholder: > + Try to pinpoint it as much as possible. + + Try to state the actual problem, and not just what you think the solution might be. + validations: + required: true +- type: textarea + attributes: + label: "Steps to reproduce" + id: "reproduction" + description: "How can we reproduce the problem on a clean AdminOnlyPackage + Umbraco install?" + placeholder: > + Please include any links, screenshots, stack-traces, etc. + validations: + required: true +- type: textarea + attributes: + label: "Expected result / actual result" + id: "result" + description: "What did you expect that would happen on your Umbraco site and what is the actual result of the above steps?" + placeholder: > + Describe the intended/desired outcome after you did the steps mentioned. + + Describe the behaviour of the bug \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..ec4bb38 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..eb959da --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,22 @@ +name: "Feature request" +description: "Suggest an idea for this package." +labels: "enhancement" +body: +- type: markdown + attributes: + value: | + Thanks for taking the time to suggest this feature request! +- type: textarea + id: "summary" + attributes: + label: "Feature summary" + description: "Write a brief summary of the feature" + validations: + required: true +- type: textarea + id: "details" + attributes: + label: "Additional details" + description: "Provide any additional details or comments about the feature you are suggesting" + validations: + required: false \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a68b89f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,22 @@ +name: Build Package + +on: + pull_request: + branches: "*" +jobs: + build: + + runs-on: windows-latest + + steps: + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup .NET + uses: actions/setup-dotnet@v2 + with: + dotnet-version: 6.0.x + + - name: Build project + run: dotnet build src\jcdcdev.Umbraco.Core\jcdcdev.Umbraco.Core.csproj --configuration Release \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..9dfc396 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,67 @@ +name: Release Package +run-name: > + push NuGet ${{ github.repository}} #${{ github.run_number }} +on: + pull_request: + branches: + - main + types: [closed] + workflow_dispatch: +jobs: + determine-version: + runs-on: ubuntu-latest + outputs: + semVer: ${{ steps.gitversion.outputs.semVer }} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Install GitVersion + uses: gittools/actions/gitversion/setup@v0 + with: + versionSpec: '5.x' + - name: Determine Version + id: gitversion # id to later be referenced + uses: gittools/actions/gitversion/execute@v0 + build: + name: push ${{ needs.determine-version.outputs.semVer }} + runs-on: windows-latest + needs: determine-version + env: + SEMVER: ${{ needs.determine-version.outputs.semVer }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v2 + with: + dotnet-version: 6.0.x + - name: Build project + run: dotnet build src\jcdcdev.Umbraco.Core\jcdcdev.Umbraco.Core.csproj --configuration Release -p:Version=${{ env.SEMVER }} + + - name: Pack + run: dotnet pack src\jcdcdev.Umbraco.Core\jcdcdev.Umbraco.Core.csproj --configuration Release -p:Version=${{ env.SEMVER }} --no-build --output . + + - name: Push to NuGet + run: dotnet nuget push **\*.nupkg -k ${{secrets.NUGET_API_KEY}} -s https://api.nuget.org/v3/index.json + post-deploy: + runs-on: ubuntu-latest + needs: + - determine-version + - build + env: + SEMVER: ${{ needs.determine-version.outputs.semVer }} + name: post-deploy ${{ needs.determine-version.outputs.semVer }} + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + - name: Tag commit + env: + TAG: ${{ env.SEMVER }} + MESSAGE: "" + run: | + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + git tag -a "${TAG}" -m "${MESSAGE}" + git push origin "${TAG}" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0545d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,357 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Git +*.orig + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Rider +src/.idea +*.sqlite.db* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4892155 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 James Carter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/README_nuget.md b/docs/README_nuget.md new file mode 100644 index 0000000..f1fb94f --- /dev/null +++ b/docs/README_nuget.md @@ -0,0 +1,7 @@ +# jcdcdev.Umbraco.Core + +[![Downloads](https://img.shields.io/nuget/dt/jcdcdev.Umbraco.Core?color=cc9900)](https://www.nuget.org/packages/jcdcdev.Umbraco.Core/) +[![NuGet](https://img.shields.io/nuget/vpre/jcdcdev.Umbraco.Core?color=0273B3)](https://www.nuget.org/packages/jcdcdev.Umbraco.Core) +[![GitHub license](https://img.shields.io/github/license/jcdcdev/jcdcdev.Umbraco.Core?color=8AB803)](https://github.com/jcdcdev/jcdcdev.Umbraco.Core/blob/main/LICENSE) + +Core functionality used by my packages and projects \ No newline at end of file diff --git a/src/jcdcdev.Umbraco.Core.TestSite/.gitignore b/src/jcdcdev.Umbraco.Core.TestSite/.gitignore new file mode 100644 index 0000000..0a60fe5 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/.gitignore @@ -0,0 +1,481 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +## +## Umbraco CMS +## + +# JSON schema file for appsettings.json +appsettings-schema.json + +# Packages created from the backoffice (package.xml/package.zip) +/umbraco/Data/CreatedPackages/ + +# Temp folder containing Examine indexes, NuCache, MediaCache, etc. +/umbraco/Data/TEMP/ + +# SQLite database files - enable if you don't want to commit your test DB to the repo +#/umbraco/Data/*.sqlite.db +#/umbraco/Data/*.sqlite.db-shm +#/umbraco/Data/*.sqlite.db-wal + +# Log files +/umbraco/Logs/ + +# Media files +/wwwroot/media/ + +# Test Site App_Plugins packages folder (exclude here as in jcdcdev.Umbraco.Core project) +/App_Plugins/jcdcdev.Umbraco.Core/ diff --git a/src/jcdcdev.Umbraco.Core.TestSite/Program.cs b/src/jcdcdev.Umbraco.Core.TestSite/Program.cs new file mode 100644 index 0000000..4cb83bd --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/Program.cs @@ -0,0 +1,19 @@ +namespace jcdcdev.Umbraco.Core.TestSite +{ + public class Program + { + public static void Main(string[] args) + => CreateHostBuilder(args) + .Build() + .Run(); + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureUmbracoDefaults() + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStaticWebAssets(); + webBuilder.UseStartup(); + }); + } +} diff --git a/src/jcdcdev.Umbraco.Core.TestSite/Properties/launchSettings.json b/src/jcdcdev.Umbraco.Core.TestSite/Properties/launchSettings.json new file mode 100644 index 0000000..cfa1ef6 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:59495", + "sslPort": 44315 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Umbraco.Web.UI": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:44315;http://localhost:59495", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/jcdcdev.Umbraco.Core.TestSite/Startup.cs b/src/jcdcdev.Umbraco.Core.TestSite/Startup.cs new file mode 100644 index 0000000..59fa1dc --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/Startup.cs @@ -0,0 +1,74 @@ +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Extensions; + +namespace jcdcdev.Umbraco.Core.TestSite +{ + public class Startup + { + private readonly IWebHostEnvironment _env; + private readonly IConfiguration _config; + + /// + /// Initializes a new instance of the class. + /// + /// The web hosting environment. + /// The configuration. + /// + /// Only a few services are possible to be injected here https://github.com/dotnet/aspnetcore/issues/9337. + /// + public Startup(IWebHostEnvironment webHostEnvironment, IConfiguration config) + { + _env = webHostEnvironment ?? throw new ArgumentNullException(nameof(webHostEnvironment)); + _config = config ?? throw new ArgumentNullException(nameof(config)); + } + + /// + /// Configures the services. + /// + /// The services. + /// + /// This method gets called by the runtime. Use this method to add services to the container. + /// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940. + /// + public void ConfigureServices(IServiceCollection services) + { + services.AddUmbraco(_env, _config) + .AddBackOffice() + .AddWebsite() + .AddComposers() + .Build(); + } + + /// + /// Configures the application. + /// + /// The application builder. + /// The web hosting environment. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseUmbraco() + .WithMiddleware(u => + { + u.UseBackOffice(); + u.UseWebsite(); + }) + .WithEndpoints(u => + { + u.UseInstallerEndpoints(); + u.UseBackOfficeEndpoints(); + u.UseWebsiteEndpoints(); + }); + } + } +} diff --git a/src/jcdcdev.Umbraco.Core.TestSite/Views/_ViewImports.cshtml b/src/jcdcdev.Umbraco.Core.TestSite/Views/_ViewImports.cshtml new file mode 100644 index 0000000..091f249 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/Views/_ViewImports.cshtml @@ -0,0 +1,9 @@ +@using Umbraco.Extensions +@using jcdcdev.Umbraco.Core.TestSite +@using Umbraco.Cms.Web.Common.PublishedModels +@using Umbraco.Cms.Web.Common.Views +@using Umbraco.Cms.Core.Models.PublishedContent +@using Microsoft.AspNetCore.Html +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Smidge +@inject Smidge.SmidgeHelper SmidgeHelper diff --git a/src/jcdcdev.Umbraco.Core.TestSite/appsettings.Development.json b/src/jcdcdev.Umbraco.Core.TestSite/appsettings.Development.json new file mode 100644 index 0000000..91cd2da --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/appsettings.Development.json @@ -0,0 +1,34 @@ +{ + "$schema": "./appsettings-schema.json", + "Serilog": { + "MinimumLevel": { + "Default": "Information" + }, + "WriteTo": [ + { + "Name": "Async", + "Args": { + "configure": [ + { + "Name": "Console" + } + ] + } + } + ] + }, + "Umbraco": { + "CMS": { + "Content": { + "MacroErrors": "Throw" + }, + "Hosting": { + "Debug": true + }, + "RuntimeMinification": { + "UseInMemoryCache": true, + "CacheBuster": "Timestamp" + } + } + } +} diff --git a/src/jcdcdev.Umbraco.Core.TestSite/appsettings.json b/src/jcdcdev.Umbraco.Core.TestSite/appsettings.json new file mode 100644 index 0000000..156b6d0 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/appsettings.json @@ -0,0 +1,27 @@ +{ + "$schema": "./appsettings-schema.json", + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information", + "System": "Warning" + } + } + }, + "Umbraco": { + "CMS": { + "Global": { + "Id": "12890910-b1c3-4bba-9544-a9beeb851ed0", + "SanitizeTinyMce": true + }, + "Content": { + "AllowEditInvariantFromNonDefault": true, + "ContentVersionCleanupPolicy": { + "EnableCleanup": true + } + } + } + }, +} \ No newline at end of file diff --git a/src/jcdcdev.Umbraco.Core.TestSite/jcdcdev.Umbraco.Core.TestSite.csproj b/src/jcdcdev.Umbraco.Core.TestSite/jcdcdev.Umbraco.Core.TestSite.csproj new file mode 100644 index 0000000..9a5af15 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.TestSite/jcdcdev.Umbraco.Core.TestSite.csproj @@ -0,0 +1,39 @@ + + + net6.0 + enable + enable + + + + + + + + + + + + + + + true + + + + + false + false + + + + + + + + + appsettings.json + + + + \ No newline at end of file diff --git a/src/jcdcdev.Umbraco.Core.TestSite/wwwroot/favicon.ico b/src/jcdcdev.Umbraco.Core.TestSite/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c0749ddf7f1b68606b0672aa8d709779d6b0817a GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/src/jcdcdev.Umbraco.Core.sln b/src/jcdcdev.Umbraco.Core.sln new file mode 100644 index 0000000..0b3cda6 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core.sln @@ -0,0 +1,43 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33020.496 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5A6D3C2C-E986-4648-ABD7-ED442746EEBC}" + ProjectSection(SolutionItems) = preProject + ..\LICENSE = ..\LICENSE + ..\.github\README.md = ..\.github\README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jcdcdev.Umbraco.Core", "jcdcdev.Umbraco.Core\jcdcdev.Umbraco.Core.csproj", "{EC825C30-A30B-4ABF-AD64-FCA92C9EA75C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jcdcdev.Umbraco.Core.TestSite", "jcdcdev.Umbraco.Core.TestSite\jcdcdev.Umbraco.Core.TestSite.csproj", "{989D710F-EC50-4EFF-AE9D-26A68694FDB5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EC825C30-A30B-4ABF-AD64-FCA92C9EA75C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC825C30-A30B-4ABF-AD64-FCA92C9EA75C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC825C30-A30B-4ABF-AD64-FCA92C9EA75C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC825C30-A30B-4ABF-AD64-FCA92C9EA75C}.Release|Any CPU.Build.0 = Release|Any CPU + {989D710F-EC50-4EFF-AE9D-26A68694FDB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {989D710F-EC50-4EFF-AE9D-26A68694FDB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {989D710F-EC50-4EFF-AE9D-26A68694FDB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {989D710F-EC50-4EFF-AE9D-26A68694FDB5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6F07004F-9903-4AEB-9ED0-BE57A0326D20} + EndGlobalSection +EndGlobal +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Github", "Github", "{5830A86F-99DA-459D-82FD-A24613A9F22F}" + ProjectSection(SolutionItems) = preProject + ..\.github\workflows\release.yml = ..\.github\workflows\release.yml + ..\.github\workflows\build.yml = ..\.github\workflows\build.yml + EndProjectSection +EndProject diff --git a/src/jcdcdev.Umbraco.Core/AccessRule/AccessRuleBuilder.cs b/src/jcdcdev.Umbraco.Core/AccessRule/AccessRuleBuilder.cs new file mode 100644 index 0000000..b5c2a24 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core/AccessRule/AccessRuleBuilder.cs @@ -0,0 +1,39 @@ +using Umbraco.Cms.Core.Dashboards; + +namespace jcdcdev.Umbraco.Core.AccessRule; + +public class AccessRuleBuilder : IAccessRuleBuilder +{ + private readonly global::Umbraco.Cms.Core.Dashboards.AccessRule _rule; + private readonly bool _allow; + + public static IAccessRuleUserGroupBuilder Deny() + { + return new AccessRuleBuilder(false); + } + + public static IAccessRuleBuilder Allow() + { + return new AccessRuleBuilder(); + } + + private AccessRuleBuilder(bool allow = true) + { + _rule = new global::Umbraco.Cms.Core.Dashboards.AccessRule(); + _allow = allow; + } + + public IAccessRule Section(string section) + { + _rule.Type = _allow ? AccessRuleType.GrantBySection : AccessRuleType.Deny; + _rule.Value = section; + return _rule; + } + + public IAccessRule UserGroup(string userGroup) + { + _rule.Type = _allow ? AccessRuleType.Grant : AccessRuleType.Deny; + _rule.Value = userGroup; + return _rule; + } +} diff --git a/src/jcdcdev.Umbraco.Core/AccessRule/IAccessRuleBuilder.cs b/src/jcdcdev.Umbraco.Core/AccessRule/IAccessRuleBuilder.cs new file mode 100644 index 0000000..9400d4d --- /dev/null +++ b/src/jcdcdev.Umbraco.Core/AccessRule/IAccessRuleBuilder.cs @@ -0,0 +1,17 @@ +using Umbraco.Cms.Core.Dashboards; + +namespace jcdcdev.Umbraco.Core.AccessRule; + +public interface IAccessRuleUserGroupBuilder +{ + IAccessRule UserGroup(string userGroup); +} + +public interface IAccessRuleSectionBuilder +{ + IAccessRule Section(string section); +} + +public interface IAccessRuleBuilder : IAccessRuleUserGroupBuilder +{ +} diff --git a/src/jcdcdev.Umbraco.Core/AccessRule/SimpleAccessRule.cs b/src/jcdcdev.Umbraco.Core/AccessRule/SimpleAccessRule.cs new file mode 100644 index 0000000..2b95cfc --- /dev/null +++ b/src/jcdcdev.Umbraco.Core/AccessRule/SimpleAccessRule.cs @@ -0,0 +1,46 @@ +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Dashboards; + +namespace jcdcdev.Umbraco.Core.AccessRule; + +public static class SimpleAccessRule +{ + public static IAccessRule GrantByUserGroup(string groupAlias) + { + return new global::Umbraco.Cms.Core.Dashboards.AccessRule { Type = AccessRuleType.Grant, Value = groupAlias }; + } + + public static IAccessRule GrantBySection(string section) + { + return new global::Umbraco.Cms.Core.Dashboards.AccessRule { Type = AccessRuleType.GrantBySection, Value = section }; + } + + public static IAccessRuleBuilder Allow() + { + return AccessRuleBuilder.Allow(); + } + + public static IAccessRule DenyUserGroup(string userGroup) + { + return AccessRuleBuilder.Deny().UserGroup(userGroup); + } + + public static IAccessRule AllowEditorGroup => GrantByUserGroup(Constants.Security.EditorGroupAlias); + public static IAccessRule AllowAdminGroup => GrantByUserGroup(Constants.Security.AdminGroupAlias); + public static IAccessRule AllowTranslatorGroup => GrantByUserGroup(Constants.Security.TranslatorGroupAlias); + public static IAccessRule AllowWriterGroup => GrantByUserGroup(Constants.Security.WriterGroupAlias); + + public static IAccessRule AllowContentSection => GrantBySection(Constants.Applications.Content); + public static IAccessRule AllowUsersSection => GrantBySection(Constants.Applications.Users); + public static IAccessRule AllowFormsSection => GrantBySection(Constants.Applications.Forms); + public static IAccessRule AllowMediaSection => GrantBySection(Constants.Applications.Media); + public static IAccessRule AllowMembersSection => GrantBySection(Constants.Applications.Members); + public static IAccessRule AllowPackagesSection => GrantBySection(Constants.Applications.Packages); + public static IAccessRule AllowSettingsSection => GrantBySection(Constants.Applications.Settings); + public static IAccessRule AllowTranslationSection => GrantBySection(Constants.Applications.Translation); + + public static IAccessRule DenyEditorGroup => DenyUserGroup(Constants.Security.EditorGroupAlias); + public static IAccessRule DenyAdminGroup => DenyUserGroup(Constants.Security.AdminGroupAlias); + public static IAccessRule DenyTranslatorGroup => DenyUserGroup(Constants.Security.TranslatorGroupAlias); + public static IAccessRule DenyWriterGroup => DenyUserGroup(Constants.Security.WriterGroupAlias); +} \ No newline at end of file diff --git a/src/jcdcdev.Umbraco.Core/ContentApp/ContentAppBadges.cs b/src/jcdcdev.Umbraco.Core/ContentApp/ContentAppBadges.cs new file mode 100644 index 0000000..9f0cdd6 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core/ContentApp/ContentAppBadges.cs @@ -0,0 +1,23 @@ +using Umbraco.Cms.Core.Models.ContentEditing; + +namespace jcdcdev.Umbraco.Core.ContentApp; + +public static class ContentAppBadges +{ + public static ContentAppBadge Default(int count) + { + return new ContentAppBadge { Count = count, Type = ContentAppBadgeType.Default }; + } + + public static ContentAppBadge Warning(int count) + { + return new ContentAppBadge { Count = count, Type = ContentAppBadgeType.Warning }; + } + + public static ContentAppBadge Alert(int count) + { + return new ContentAppBadge { Count = count, Type = ContentAppBadgeType.Alert }; + } + + public static ContentAppBadge? None => null; +} diff --git a/src/jcdcdev.Umbraco.Core/icon.png b/src/jcdcdev.Umbraco.Core/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..37736004dc0af5955fcb4deaa6d527d6c94aada4 GIT binary patch literal 20004 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 literal 0 HcmV?d00001 diff --git a/src/jcdcdev.Umbraco.Core/jcdcdev.Umbraco.Core.csproj b/src/jcdcdev.Umbraco.Core/jcdcdev.Umbraco.Core.csproj new file mode 100644 index 0000000..42b0e01 --- /dev/null +++ b/src/jcdcdev.Umbraco.Core/jcdcdev.Umbraco.Core.csproj @@ -0,0 +1,40 @@ + + + net6.0 + 10 + true + enable + enable + / + . + jcdcdev.Umbraco.Core + jcdcdev.Umbraco.Core + jcdcdev.Umbraco.Core + Core functionality used by my packages and projects + umbraco + James Carter + $([System.DateTime]::UtcNow.ToString(`yyyy`)) © James Carter + https://github.com/jcdcdev/jcdcdev.Umbraco.Core + https://github.com/jcdcdev/jcdcdev.Umbraco.Core + README_nuget.md + git + MIT + images\icon.png + + + + + + + + + + + + + + True + \ + + +