Browse Source

Merge branch 'dev' into EngincanV-berkan/design-localization

pull/11356/head
berkansasmaz 5 years ago
parent
commit
fe23f23d3f
No known key found for this signature in database GPG Key ID: 884D815C3F32BE00
  1. 16
      .github/workflows/auto-pr.yml
  2. 1
      .gitignore
  3. 2
      common.props
  4. 35
      deploy/7-new-github-release__NOT_ACTIVE_USE_MANUAL_WAY.ps1
  5. 86
      deploy/7-publish-github-release.ps1
  6. 43
      deploy/_run_all.ps1
  7. 149
      docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md
  8. BIN
      docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/abp-community-talks-2022-1.png
  9. BIN
      docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/leptonx-dash.gif
  10. BIN
      docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/new-abp-io-design.png
  11. BIN
      docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/url-forward.png
  12. 111
      docs/en/Community-Articles/2022-01-10-How-to-test-Blazor-components-in-ABP/POST.md
  13. 70
      docs/en/Entity-Framework-Core.md
  14. 12
      docs/en/Tutorials/Part-10.md
  15. 2
      docs/zh-Hans/Entities.md
  16. 1211
      docs/zh-Hans/Tutorials/Part-10.md
  17. 2
      docs/zh-Hans/Tutorials/Part-2.md
  18. 4
      docs/zh-Hans/Tutorials/Part-3.md
  19. 2
      docs/zh-Hans/Tutorials/Part-4.md
  20. 2
      docs/zh-Hans/Tutorials/Part-5.md
  21. 2
      docs/zh-Hans/Tutorials/Part-6.md
  22. 4
      docs/zh-Hans/Tutorials/Part-8.md
  23. 2
      docs/zh-Hans/Tutorials/Part-9.md
  24. BIN
      docs/zh-Hans/Tutorials/images/blazor-bookstore-book-list-with-authors.png
  25. BIN
      docs/zh-Hans/Tutorials/images/book-create-modal-with-author.png
  26. BIN
      docs/zh-Hans/Tutorials/images/bookstore-angular-author-selection.png
  27. BIN
      docs/zh-Hans/Tutorials/images/bookstore-books-with-authorname-angular.png
  28. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js
  29. 15
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs
  30. 89
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs
  31. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs
  32. 8
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/Events/ModuleInstallingProgressEvent.cs
  33. 40
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
  34. 43
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
  35. 1
      framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs
  36. 9
      framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/PostgreSql/AbpEntityFrameworkCorePostgreSqlModule.cs
  37. 8
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  38. 23
      framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs
  39. 6
      framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs
  40. 6
      framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs
  41. 6
      framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs
  42. 6
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs
  43. 33
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs
  44. 52
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventHandlerInvoker.cs
  45. 8
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventHandlerInvokerCacheItem.cs
  46. 34
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventHandlerMethodExecutor.cs
  47. 9
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandlerInvoker.cs
  48. 5
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs
  49. 132
      framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
  50. 5
      framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelDiscoveryDocumentCacheItem.cs
  51. 128
      framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/EventHandlerInvoker_Tests.cs
  52. 4
      modules/account/Volo.Abp.Account.abpmdl.json
  53. 11
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.analyze.json
  54. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json
  55. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de-DE.json
  56. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json
  57. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json
  58. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json
  59. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json
  60. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json
  61. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json
  62. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json
  63. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json
  64. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json
  65. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json
  66. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json
  67. 1
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json
  68. 49
      modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.analyze.json
  69. 11
      modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.analyze.json
  70. 11
      modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.analyze.json
  71. 1
      modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.abppkg.json
  72. 11
      modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.analyze.json
  73. 4
      modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json
  74. 11
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.analyze.json
  75. 41
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.analyze.json
  76. 39
      modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.analyze.json
  77. 1
      modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.abppkg.json
  78. 24
      modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.analyze.json
  79. 4
      modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json
  80. 4
      modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json
  81. 11
      modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.analyze.json
  82. 35
      modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.analyze.json
  83. 24
      modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.analyze.json
  84. 1
      modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.abppkg.json
  85. 24
      modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.analyze.json
  86. 4
      modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json
  87. 4
      modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json
  88. 1
      modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.abppkg.json
  89. 2
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json
  90. 10
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/abp/jquery/abp.jquery.js
  91. 224
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock
  92. 4
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json
  93. 10
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/jquery/abp.jquery.js
  94. 256
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock
  95. 4
      modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json
  96. 11
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.analyze.json
  97. 59
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.analyze.json
  98. 29
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.analyze.json
  99. 1
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.abppkg.json
  100. 29
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.analyze.json

16
.github/workflows/auto-pr.yml

@ -1,10 +1,10 @@
name: Merge branch dev with rel-5.0
name: Merge branch dev with rel-5.1
on:
push:
branches:
- rel-5.0
- rel-5.1
jobs:
merge-dev-with-rel-5-0:
merge-dev-with-rel-5-1:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
@ -12,13 +12,13 @@ jobs:
ref: dev
- name: Reset promotion branch
run: |
git fetch origin rel-5.0:rel-5.0
git reset --hard rel-5.0
git fetch origin rel-5.1:rel-5.1
git reset --hard rel-5.1
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
branch: auto-merge/rel-5-0/${{github.run_number}}
title: Merge branch dev with rel-5.0
body: This PR generated automatically to merge dev with rel-5.0. Please review the changed files before merging to prevent any errors that may occur.
branch: auto-merge/rel-5-1/${{github.run_number}}
title: Merge branch dev with rel-5.1
body: This PR generated automatically to merge dev with rel-5.1. Please review the changed files before merging to prevent any errors that may occur.
reviewers: ${{github.actor}}
token: ${{ github.token }}

1
.gitignore

@ -321,3 +321,4 @@ appsettings.secrets.json
deploy/nuget-api-key.txt
deploy/npm-auth-token.txt
deploy/ssh-password.txt
deploy/github-api-key.txt

2
common.props

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>5.1.0</Version>
<Version>5.2.0</Version>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl>

35
deploy/7-new-github-release__NOT_ACTIVE_USE_MANUAL_WAY.ps1

@ -1,35 +0,0 @@
#THIS IS NOT BEING USED CURRENTLY. RELEASE GITHUB MANUALLY
# Import the module dynamically from the PowerShell Gallery. Use CurrentUser scope to avoid having to run as admin.
Import-Module -Name new-github-release-function.psm1
# Specify the parameters required to create the release. Do it as a hash table for easier readability.
$newGitHubReleaseParameters =
@{
GitHubUsername = 'abpframework'
GitHubRepositoryName = 'abp'
GitHubAccessToken = '*******************'
ReleaseName = "5.0.0-rc.2"
TagName = "5.0.0-rc.2"
ReleaseNotes = "N/A"
#AssetFilePaths = @('C:\MyProject\Installer.exe','C:\MyProject\Documentation.md')
IsPreRelease = $true
IsDraft = $true # Set to true when testing so we don't publish a real release (visible to everyone) by accident.
}
# Try to create the Release on GitHub and save the results.
$result = New-GitHubRelease @newGitHubReleaseParameters
# Provide some feedback to the user based on the results.
if ($result.Succeeded -eq $true)
{
Write-Output "Release published successfully! View it at $($result.ReleaseUrl)"
}
elseif ($result.ReleaseCreationSucceeded -eq $false)
{
Write-Error "The release was not created. Error message is: $($result.ErrorMessage)"
}
elseif ($result.AllAssetUploadsSucceeded -eq $false)
{
Write-Error "The release was created, but not all of the assets were uploaded to it. View it at $($result.ReleaseUrl). Error message is: $($result.ErrorMessage)"
}

86
deploy/7-publish-github-release.ps1

@ -0,0 +1,86 @@
param(
[string]$branchName,
[string]$version,
[string]$isRcVersion,
[string]$isDraft,
[string]$gitHubApiKey
)
. ..\nupkg\common.ps1
Write-Info "Publishing GitHub Release..." ## Further info see https://docs.github.com/en/rest/reference/releases
if ($isRcVersion -eq "")
{
$isRcVersion = Read-Host "Is this a RC/Preview version? (y/n)"
}
if ($gitHubApiKey -eq "")
{
$gitHubApiKey = Read-File "github-api-key.txt"
echo "GitHub API Key assigned from github-api-key.txt"
}
if(!$gitHubApiKey)
{
$gitHubApiKey = Read-Host "Enter the GitHub API Key"
}
if ($version -eq "")
{
$version = Get-Current-Version # The version number for this release
}
if ($branchName -eq "")
{
$branchName = Get-Current-Branch # The branch name also the tag name
}
if ($isDraft -eq "")
{
$draft = $FALSE
}
else
{
$draft = [boolean]::Parse($isDraft)
}
##############################################################################
$preRelease = ( ($isRcVersion -eq "true") -or ($isRcVersion -eq "y") -or ($isRcVersion -eq "rc") ) # Set to true to mark this as a pre-release version
$gitHubUsername = 'abpframework' # The github username
$gitHubRepository = 'abp' # The github repository name
$releaseNotes = '' # The notes to accompany this release, uses the commit message in this case
##############################################################################
echo "Current version: $version"
echo "Current branch: $branchName"
echo "Preview version: $preRelease"
echo "Draft: $draft"
##############################################################################
$releaseData = @{
tag_name = $version;
target_commitish = $branchName;
name = $version;
body = $releaseNotes;
draft = $draft;
prerelease = $preRelease;
}
$releaseParams = @{
Uri = "https://api.github.com/repos/$gitHubUsername/$gitHubRepository/releases";
Method = 'POST';
Headers = @{
Authorization = 'Basic ' + [Convert]::ToBase64String(
[Text.Encoding]::ASCII.GetBytes($gitHubApiKey + ":x-oauth-basic"));
}
ContentType = 'application/json';
Body = (ConvertTo-Json $releaseData -Compress)
}
$response = Invoke-RestMethod @releaseParams
echo "---------------------------------------------"
echo "$version has been successfully released."

43
deploy/_run_all.ps1

@ -0,0 +1,43 @@
param(
[string]$branch,
[string]$newVersion,
[string]$isRcVersion
)
. ..\nupkg\common.ps1
if (!$branch)
{
$branch = Read-Host "Enter the branch name"
}
if (!$newVersion)
{
$currentVersion = Get-Current-Version
$newVersion = Read-Host "Current version is '$currentVersion'. Enter the new version (empty for no change) "
if($newVersion -eq "")
{
$newVersion = $currentVersion
}
}
if ($isRcVersion -eq "")
{
$isRcVersion = Read-Host "Is this a RC/Preview version? (y/n)"
}
$publishGithubReleaseParams = @{
branchName=$branch
isRcVersion=$isRcVersion
}
./1-fetch-and-build.ps1 $branch $newVersion
./2-nuget-pack.ps1
./3-nuget-push.ps1
./4-npm-publish-mvc.ps1
./5-npm-publish-angular.ps1
./6-git-commit.ps1
./7-publish-github-release.ps1 @publishGithubReleaseParams
./8-download-release-zip.ps1

149
docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md

@ -0,0 +1,149 @@
# ABP.IO Platform 5.1 Has Been Released
Today, we are releasing the [ABP Framework](https://abp.io/) and the [ABP Commercial](https://commercial.abp.io/) version 5.1 (with a version number `5.1.1`). This blog post introduces the new features and important changes in this new version.
> **Warning**
>
> For a long time we were releasing RC (Release Candidate) versions a few weeks before every minor and major release. **This version has been released without a preview version.** This is because we've accidently released all the packages with a stable version number, without a `-rc.1` suffix and there is no clear way to unpublish all the NuGet and NPM packages. Sorry about that. However, it doesn't mean that this release is buggy. We've already resolved known problems. We will publish one or more patch releases if needed. You can follow [this milestone](https://github.com/abpframework/abp/milestone/64?closed=1) for known problems or submit your own bug report. If you are worried about its stability, you can wait for the next patch release.
## Get Started with the 5.1
follow the steps below to try the version 5.1 today;
1) **Upgrade** the ABP CLI to the latest version using a command line terminal:
````bash
dotnet tool update Volo.Abp.Cli -g
````
**or install** if you haven't installed before:
````bash
dotnet tool install Volo.Abp.Cli -g
````
2) Create a **new application**:
````bash
abp new BookStore
````
See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options.
> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page.
You can use any IDE that supports .NET 6.x development (e.g. [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)).
### Migration Notes & Breaking Changes
This is an minor feature release, mostly with enhancements and improvements based on the [version 5.0](https://blog.abp.io/abp/ABP-IO-Platform-5-0-Final-Has-Been-Released). There is no breaking change except the Angular UI upgrade. ABP 5.1 startup templates use **Angular 13**.
### Angular UI
**If you want to upgrade ABP Framework but want to continue with Angular 12**, add the following section to `package.json` file of the Angular project:
````json
"resolutions": {
"ng-zorro-antd": "^12.1.1",
"@ng-bootstrap/ng-bootstrap": "11.0.0-beta.2"
}
````
## What's new with ABP Framework 5.1?
In this section, I will introduce some major features released with this version.
### The new hosting model
ABP startup application template now uses the new ASP.NET Core hosting APIs ([see the Microsoft's minimal APIs document](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0)) on application startup ([see the exact place in the ABP startup template](https://github.com/abpframework/abp/blob/46cdfbe7b06c93690181633be4e96bf62e7f34e2/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs#L33-L40)). So, the `Startup.cs` file has been removed.
Old-style hosting logic will continue to work as long as ASP.NET Core supports it. It is recommended to switch to the new model if possible for your solution. See [this guide](https://docs.abp.io/en/abp/latest/Migration-Guides/Upgrading-Startup-Template) if you need to know how you can to do that.
### Asynchronous startup lifecycle methods
The new hosting model allows us to execute asynchronous code on application initialization in [ABP module](https://docs.abp.io/en/abp/latest/Module-Development-Basics) classes. If you are using the new hosting model (which is default with 5.1 startup templates), you can override the `Async` versions of the module lifecycle methods.
For example, you can now override the `ConfigureServicesAsync` (instead of `ConfigureServices`) or `OnApplicationInitializationAsync` (instead of `OnApplicationInitialization`) as shown in the following code block:
````csharp
public class MyModule : AbpModule
{
public override async Task ConfigureServicesAsync(ServiceConfigurationContext context)
{
/* You can use await here and safely execute other async methods */
}
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
/* You can use await here and safely execute other async methods */
}
}
````
If you override both of asynchronous and synchronous versions of the same method, only the asynchronous one will be executed. So, override only one of them based on your needs.
### eShopOnABP is getting mature
Our team is working to finalize the [eShopOnAbp](https://github.com/abpframework/eShopOnAbp) example solution, which is a reference **microservice solution** built with the ABP Framework. They will explain the project status and show what's done in the next **ABP Community Talks** meeting (see the *ABP Community Talks 2021.1* section below in this post).
### The new ABP.IO design!
We were working on a new design for the [abp.io](https://abp.io/) websites for a while. We are making the final touches; the new design will be live very soon. Here a screenshot from the design work:
![new-abp-io-design](new-abp-io-design.png)
[ABP Commercial](https://commercial.abp.io/) and [ABP Community](https://community.abp.io/) websites will also have new designs as a part of this update.
### Other changes
Here some other notable changes that come with this release:
* Support markdown in [CMS-Kit comments ](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Comments)feature ([#10792](https://github.com/abpframework/abp/pull/10792))
* Used file scoped namespaces for all the ABP Framework source code :) ([#10552](https://github.com/abpframework/abp/pull/10696))
All issues & PRs in [5.1 milesone](https://github.com/abpframework/abp/milestone/60?closed=1).
### About the ABP Commercial
The core team is also working on the ABP Commercial (which provides pre-built modules, themes, tooling and support on top of the ABP Framework). We've done a lot of minor improvements and fixes to the modules and tooling.
One exiting new is about the **LeptonX theme**; We are working on to make it available in **MVC (Razor Pages)** and **Blazor** UI options too (in addition to the Angular UI). We are also adding more components, layout options, demo pages, etc... We are planning to release a beta version in the next weeks. Here an animated GIF from the dashboard we've prepared as a demonstration:
![leptonx-dash](leptonx-dash.gif)
If you are wondering what is the LeptonX project, please see [that blog post](https://blog.abp.io/abp/LeptonX-Theme-for-ABP-Framework-Alpha-Release).
As another visible functionality, we've added a new feature to the [CMS Kit Pro](https://docs.abp.io/en/commercial/latest/modules/cms-kit/index) module that is used to forward a URL to another URL. This is a screenshot from the management UI:
![url-forward](url-forward.png)
This feature can be used to create short URLs in your application (like URL shortening services provide) or forward old pages to their new URLs.
In addition to the new features shipped in every minor version, we are working on long-term projects for ABP.IO Platform and ABP Commercial (a little secret for now :). We will have announcements once these projects get mature.
## Community News
### ABP Community Talks 2021.1
![abp-community-talks-2022-1](abp-community-talks-2022-1.png)
This is the second episode of the ABP Community Talks and we are talking about microservice development with the ABP Framework, based on the [eShopOnAbp](https://github.com/abpframework/eShopOnAbp) reference solution. We will also briefly talk about the changes that come with ABP version 5.1. This **live meeting** will be at **January 20, 2022, 17:00 (UTC)** on YouTube.
**Join this event on the Kommunity platform: https://kommunity.com/volosoft/events/abp-community-talks-20221-microservice-development-acd0f44b**
You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel/UCO3XKlpvq8CA5MQNVS6b3dQ) for reminders for further ABP events and videos.
### New ABP Community posts
Here, some of the recent posts added to the [ABP community](https://community.abp.io/):
* [Minimal API development with the ABP Framework](https://community.abp.io/articles/minimal-api-with-abp-hello-world-part-1-sg5i44p8) by [@antosubash](https://github.com/antosubash) (three parts, video tutorial).
* [Integrating the Syncfusion MVC Components to the ABP MVC UI](https://community.abp.io/articles/integrating-the-syncfusion-mvc-components-to-the-abp-mvc-ui-0gpkr1if) by [@EngincanV](https://github.com/EngincanV).
* [Add Tailwind CSS to your ABP Blazor UI](https://community.abp.io/articles/add-tailwindcss-to-your-abp-blazor-ui-vidiwzcy) by [@antosubash](https://github.com/antosubash) (video tutorial).
* [Import external users into the users Table from an ABP Framework application](https://community.abp.io/articles/import-external-users-into-the-users-table-from-an-abp-framework-application-7lnyw415) by [@bartvanhoey](https://github.com/bartvanhoey).
Thanks to the ABP Community for all the contents they have published. You can also [post your ABP and .NET related (text or video) contents](https://community.abp.io/articles/submit) to the ABP Community.
## Conclusion
In this blog post, I summarized the news about that new version and the ABP Community. Please try it and provide feedback by opening issues on [the GitHub repository](https://github.com/abpframework/abp). Thank you all!

BIN
docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/abp-community-talks-2022-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 KiB

BIN
docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/leptonx-dash.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

BIN
docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/new-abp-io-design.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

BIN
docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/url-forward.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

111
docs/en/Community-Articles/2022-01-10-How-to-test-Blazor-components-in-ABP/POST.md

@ -0,0 +1,111 @@
# How to Test Blazor Components in ABP
## Source Code
You can find the source of the example solution used in this article [here](https://github.com/abpframework/abp-samples/tree/master/BlazorPageUniTest).
In this article, I will use [bUnit](https://github.com/bUnit-dev/bUnit) for a simple test of a Blazor component.
## Getting Started
Use the ABP CLI to create a blazor app
`abp new BookStore -t app -u blazor`
Then add the `BookStore.Blazor.Tests` xunit test project to the solution, and add [bUnit](https://github.com/bUnit-dev/bUnit) package and `ProjectReference` to the test project.
The contents of `BookStore.Blazor.Tests.csproj`
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="bunit" Version="1.2.49" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="Volo.Abp.Authorization.Abstractions" Version="5.0.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\BookStore.Blazor\BookStore.Blazor.csproj" />
<ProjectReference Include="..\BookStore.EntityFrameworkCore.Tests\BookStore.EntityFrameworkCore.Tests.csproj" />
</ItemGroup>
</Project>
```
Create `BookStoreBlazorTestModule` that depends on `AbpAspNetCoreComponentsModule` and `BookStoreEntityFrameworkCoreTestModule`.
```cs
[DependsOn(
typeof(AbpAspNetCoreComponentsModule),
typeof(BookStoreEntityFrameworkCoreTestModule)
)]
public class BookStoreBlazorTestModule : AbpModule
{
}
```
Create a `BookStoreBlazorTestBase` class and add the `CreateTestContext` method. The `CreateTestContext` have key code.
It uses ABP's `ServiceProvider` as a fallback `ServiceProvider` and add all ABP's services to the `TestContext`.
```cs
public abstract class BookStoreBlazorTestBase : BookStoreTestBase<BookStoreBlazorTestModule>
{
protected virtual TestContext CreateTestContext()
{
var testContext = new TestContext();
testContext.Services.AddFallbackServiceProvider(ServiceProvider);
foreach (var service in ServiceProvider.GetRequiredService<IAbpApplicationWithExternalServiceProvider>().Services)
{
testContext.Services.Add(service);
}
testContext.Services.AddBlazorise().AddBootstrap5Providers().AddFontAwesomeIcons();
return testContext;
}
}
```
Finally, we add an `Index_Tests` class to test the `Index` component.
```cs
public class Index_Tests : BookStoreBlazorTestBase
{
[Fact]
public void Index_Test()
{
using (var ctx = CreateTestContext())
{
// Act
var cut = ctx.RenderComponent<BookStore.Blazor.Pages.Index>();
// Assert
cut.Find(".lead").InnerHtml.Contains("Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.").ShouldBeTrue();
cut.Find("#username").InnerHtml.Contains("Welcome admin").ShouldBeTrue();
}
}
}
```
## Reference document
https://github.com/bUnit-dev/bUnit
https://docs.microsoft.com/en-us/aspnet/core/blazor/test

70
docs/en/Entity-Framework-Core.md

@ -4,7 +4,7 @@ This document explains how to integrate EF Core as an ORM provider to ABP based
## Installation
`Volo.Abp.EntityFrameworkCore` is the main nuget package for the EF Core integration. Install it to your project (for a layered application, to your data/infrastructure layer):
`Volo.Abp.EntityFrameworkCore` is the main NuGet package for the EF Core integration. Install it to your project (for a layered application, to your data/infrastructure layer):
```` shell
Install-Package Volo.Abp.EntityFrameworkCore
@ -30,15 +30,13 @@ namespace MyCompany.MyProject
### Database Management System Selection
Entity Framework Core supports various database management systems ([see all](https://docs.microsoft.com/en-us/ef/core/providers/)). ABP framework and this document doesn't depend on any specific DBMS.
Entity Framework Core supports various database management systems ([see all](https://docs.microsoft.com/en-us/ef/core/providers/)). ABP framework and this document don't depend on any specific DBMS. If you are creating a [reusable application module](Modules/Index.md), avoid to depend on a specific DBMS package. However, in a final application you eventually will select a DBMS.
If you are creating a [reusable application module](Modules/Index.md), avoid to depend on a specific DBMS package. However, in a final application you eventually will select a DBMS.
See [Switch to Another DBMS for Entity Framework Core](Entity-Framework-Core-Other-DBMS.md) document to learn how to switch the DBMS.
> See [Switch to Another DBMS for Entity Framework Core](Entity-Framework-Core-Other-DBMS.md) document to learn how to switch the DBMS.
## Creating DbContext
You can create your DbContext as you normally do. It should be derived from `AbpDbContext<T>` as shown below:
Your `DbContext` class should be derived from `AbpDbContext<T>` as shown below:
````C#
using Microsoft.EntityFrameworkCore;
@ -107,7 +105,7 @@ protected override void OnModelCreating(ModelBuilder builder)
### Configure the Connection String Selection
If you have multiple databases in your application, you can configure the connection string name for your DbContext using the `[ConnectionStringName]` attribute. Example:
If you have multiple databases in your application, you can configure the connection string name for your `DbContext` using the `[ConnectionStringName]` attribute. Example:
```csharp
[ConnectionStringName("MySecondConnString")]
@ -119,9 +117,65 @@ public class MyDbContext : AbpDbContext<MyDbContext>
If you don't configure, the `Default` connection string is used. If you configure a specific connection string name, but not define this connection string name in the application configuration then it fallbacks to the `Default` connection string (see [the connection strings document](Connection-Strings.md) for more information).
### AbpDbContextOptions
`AbpDbContextOptions` is used to configure the `DbContext` options. When you create a new solution with the ABP's application startup template, you will see a simple configuration (in the `EntityFrameworkCore` integration project's module class) as shown below:
````csharp
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer();
});
````
That configuration configures the default DBMS as SQL Server for all the `DbContext`s of the application. That configuration was a shorthand notation and it can be done with the following code block:
````csharp
Configure<AbpDbContextOptions>(options =>
{
options.Configure(opts =>
{
opts.UseSqlServer();
});
});
````
`options.Configure(...)` method has more options to configure. For example, you can set `DbContextOptions` (EF Core's native options) as shown below:
````csharp
Configure<AbpDbContextOptions>(options =>
{
options.Configure(opts =>
{
opts.DbContextOptions.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
});
});
````
If you have a single `DbContext` or you have multiple `DbContext`s but want to use the same DBMS and configuration for all, you can leave it as is. However, if you need to configure a different DBMS or customize the configuration for a specific `DbContext`, you can specify it as shown below:
````csharp
Configure<AbpDbContextOptions>(options =>
{
// Default configuration for all DbContexts
options.Configure(opts =>
{
opts.UseSqlServer();
});
// Customized configuration for a specific DbContext
options.Configure<MyOtherDbContext>(opts =>
{
opts.UseMySQL();
});
});
````
> See [Switch to Another DBMS for Entity Framework Core](Entity-Framework-Core-Other-DBMS.md) document to learn how to configure the DBMS.
## Registering DbContext To Dependency Injection
Use `AddAbpDbContext` method in your module to register your DbContext class for [dependency injection](Dependency-Injection.md) system.
Use `AddAbpDbContext` method in your module to register your `DbContext` class for [dependency injection](Dependency-Injection.md) system.
````C#
using Microsoft.Extensions.DependencyInjection;

12
docs/en/Tutorials/Part-10.md

@ -325,7 +325,7 @@ This new method will be used from the UI to get a list of authors and fill a dro
### BookAppService
Open the `BookAppService` interface in the `Books` folder of the `Acme.BookStore.Application` project and replace the file content with the following code:
Open the `BookAppService` class in the `Books` folder of the `Acme.BookStore.Application` project and replace the file content with the following code:
{{if DB=="EF"}}
@ -377,7 +377,7 @@ namespace Acme.BookStore.Books
//Prepare a query to join books and authors
var query = from book in queryable
join author in _authorRepository on book.AuthorId equals author.Id
join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id
where book.Id == id
select new { book, author };
@ -400,7 +400,7 @@ namespace Acme.BookStore.Books
//Prepare a query to join books and authors
var query = from book in queryable
join author in _authorRepository on book.AuthorId equals author.Id
join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id
select new {book, author};
//Paging
@ -449,7 +449,7 @@ namespace Acme.BookStore.Books
{
return sorting.Replace(
"authorName",
"author.Name",
"author.Name",
StringComparison.OrdinalIgnoreCase
);
}
@ -533,7 +533,7 @@ namespace Acme.BookStore.Books
{
input.Sorting = nameof(Book.Name);
}
//Get the IQueryable<Book> from the repository
var queryable = await Repository.GetQueryableAsync();
@ -582,7 +582,7 @@ namespace Acme.BookStore.Books
.ToArray();
var queryable = await _authorRepository.GetQueryableAsync();
var authors = await AsyncExecuter.ToListAsync(
queryable.Where(a => authorIds.Contains(a.Id))
);

2
docs/zh-Hans/Entities.md

@ -26,7 +26,7 @@ public class Book : Entity<Guid>
如果你的实体Id类型为 `Guid`,有一些好的实践可以实现:
* 创建一个构造函数,获取ID作为参数传递给基类.
* 如果没有为GUID Id值,**ABP框架会在保存时设置它**,但是在将实体保存到数据库之前最好在实体上有一个有效的Id.
* 如果没有为GUID Id值,**ABP框架会在保存时设置它**,但是在将实体保存到数据库之前最好在实体上有一个有效的Id.
* 如果使用带参数的构造函数创建实体,那么还要创建一个 `private``protected` 构造函数. 当数据库提供程序从数据库读取你的实体时(反序列化时)将使用它.
* 不要使用 `Guid.NewGuid()` 来设置Id! 在创建实体的代码中**使用[`IGuidGenerator`服务](Guid-Generation.md)**传递Id参数. `IGuidGenerator`经过优化可以产生连续的GUID.这对于关系数据库中的聚集索引非常重要.

1211
docs/zh-Hans/Tutorials/Part-10.md

File diff suppressed because it is too large

2
docs/zh-Hans/Tutorials/Part-2.md

@ -16,7 +16,7 @@
本教程分为以下部分:
- [Part 1: 创建服务端](Part-1.md)
- **Part 2: 图书列表页面**(本章)
- **Part 2: 图书列表页面 (本章)**
- [Part 3: 创建,更新和删除图书](Part-3.md)
- [Part 4: 集成测试](Part-4.md)
- [Part 5: 授权](Part-5.md)

4
docs/zh-Hans/Tutorials/Part-3.md

@ -17,7 +17,7 @@
- [Part 1: 创建服务端](Part-1.md)
- [Part 2: 图书列表页面](Part-2.md)
- **Part 3: 创建,更新和删除图书**(本章)
- **Part 3: 创建,更新和删除图书 (本章)**
- [Part 4: 集成测试](Part-4.md)
- [Part 5: 授权](Part-5.md)
- [Part 6: 作者: 领域层](Part-6.md)
@ -1596,4 +1596,4 @@ namespace Acme.BookStore.Blazor
## 下一章
查看本教程的[下一章](Part-4.md).
查看本教程的[下一章](Part-4.md).

2
docs/zh-Hans/Tutorials/Part-4.md

@ -18,7 +18,7 @@
- [Part 1: 创建服务端](Part-1.md)
- [Part 2: 图书列表页面](Part-2.md)
- [Part 3: 创建,更新和删除图书](Part-3.md)
- **Part 4: 集成测试**(本章)
- **Part 4: 集成测试 (本章)**
- [Part 5: 授权](Part-5.md)
- [Part 6: 作者: 领域层](Part-6.md)
- [Part 7: 作者: 数据库集成](Part-7.md)

2
docs/zh-Hans/Tutorials/Part-5.md

@ -19,7 +19,7 @@
- [Part 2: 图书列表页面](Part-2.md)
- [Part 3: 创建,更新和删除图书](Part-2.md)
- [Part 4: 集成测试](Part-4.md)
- **Part 5: 授权**(本章)
- **Part 5: 授权 (本章)**
- [Part 6: 作者: 领域层](Part-6.md)
- [Part 7: 作者: 数据库集成](Part-7.md)
- [Part 8: 作者: 应用服务层](Part-8.md)

2
docs/zh-Hans/Tutorials/Part-6.md

@ -20,7 +20,7 @@
- [Part 3: 创建,更新和删除图书](Part-2.md)
- [Part 4: 集成测试](Part-4.md)
- [Part 5: 授权](Part-5.md)
- **Part 6: 作者: 领域层**(本章)
- **Part 6: 作者: 领域层 (本章)**
- [Part 7: 作者: 数据库集成](Part-7.md)
- [Part 8: 作者: 应用服务层](Part-8.md)
- [Part 9: 作者: 用户页面](Part-9.md)

4
docs/zh-Hans/Tutorials/Part-8.md

@ -22,7 +22,7 @@
- [Part 5: 授权](Part-5.md)
- [Part 6: 作者: 领域层](Part-6.md)
- [Part 7: 作者: 数据库集成](Part-7.md)
- [Part 8: 作者: 应用服务层](本章)
- **Part 8: 作者: 应用服务层 (本章)**
- [Part 9: 作者: 用户页面](Part-9.md)
- [Part 10: 图书到作者的关系](Part-10.md)
@ -391,7 +391,7 @@ authorsPermission.AddChild(
CreateMap<Author, AuthorDto>();
````
## 种子数据
## 数据种子
如同图书管理部分所做的, 在数据库中生成一些初始作者实体. 不仅当第一次运行应用程序时是有用的, 对自动化测试也是很有用的.

2
docs/zh-Hans/Tutorials/Part-9.md

@ -23,7 +23,7 @@
- [Part 6: 作者: 领域层](Part-6.md)
- [Part 7: 作者: 数据库集成](Part-7.md)
- [Part 8: 作者: 应用服务层](Part-8.md)
- [Part 9: 作者: 用户页面](本章)
- **Part 9: 作者: 用户页面 (本章)**
- [Part 10: 图书到作者的关系](Part-10.md)
## 下载源码

BIN
docs/zh-Hans/Tutorials/images/blazor-bookstore-book-list-with-authors.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
docs/zh-Hans/Tutorials/images/book-create-modal-with-author.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/zh-Hans/Tutorials/images/bookstore-angular-author-selection.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/zh-Hans/Tutorials/images/bookstore-books-with-authorname-angular.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js

@ -100,10 +100,11 @@ var abp = abp || {};
abp.event.on('abp.configurationInitialized', function () {
var l = abp.localization.getResource('AbpUi');
abp.libs.sweetAlert.config.default.confirmButtonText = l('Yes');
abp.libs.sweetAlert.config.default.confirmButtonText = l('Ok');
abp.libs.sweetAlert.config.default.denyButtonText = l('No');
abp.libs.sweetAlert.config.default.cancelButtonText = l('Cancel');
abp.libs.sweetAlert.config.confirm.title = l('AreYouSure');
abp.libs.sweetAlert.config.confirm.confirmButtonText = l('Yes');
abp.libs.sweetAlert.config.confirm.showCancelButton = true;
abp.libs.sweetAlert.config.confirm.reverseButtons = true;
});

15
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs

@ -92,6 +92,21 @@ public class AuthService : IAuthService, ITransientDependency
File.WriteAllText(CliPaths.AccessToken, accessToken, Encoding.UTF8);
}
public async Task DeviceLoginAsync()
{
var configuration = new IdentityClientConfiguration(
CliUrls.AccountAbpIo,
"role email abpio abpio_www abpio_commercial openid offline_access",
"abp-cli",
"1q2w3e*",
OidcConstants.GrantTypes.DeviceCode
);
var accessToken = await AuthenticationService.GetAccessTokenAsync(configuration);
File.WriteAllText(CliPaths.AccessToken, accessToken, Encoding.UTF8);
}
public async Task LogoutAsync()
{
string accessToken = null;

89
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs

@ -42,52 +42,70 @@ public class LoginCommand : IConsoleCommand, ITransientDependency
public async Task ExecuteAsync(CommandLineArgs commandLineArgs)
{
if (commandLineArgs.Target.IsNullOrEmpty())
if (!commandLineArgs.Options.ContainsKey("device"))
{
throw new CliUsageException(
"Username name is missing!" +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
var organization = commandLineArgs.Options.GetOrNull(Options.Organization.Short, Options.Organization.Long);
if (await HasMultipleOrganizationAndThisNotSpecified(commandLineArgs, organization))
{
return;
}
var password = commandLineArgs.Options.GetOrNull(Options.Password.Short, Options.Password.Long);
if (password == null)
{
Console.Write("Password: ");
password = ConsoleHelper.ReadSecret();
if (password.IsNullOrWhiteSpace())
if (commandLineArgs.Target.IsNullOrEmpty())
{
throw new CliUsageException(
"Password is missing!" +
"Username name is missing!" +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
}
try
{
await AuthService.LoginAsync(
commandLineArgs.Target,
password,
organization
);
var organization = commandLineArgs.Options.GetOrNull(Options.Organization.Short, Options.Organization.Long);
if (await HasMultipleOrganizationAndThisNotSpecified(commandLineArgs, organization))
{
return;
}
var password = commandLineArgs.Options.GetOrNull(Options.Password.Short, Options.Password.Long);
if (password == null)
{
Console.Write("Password: ");
password = ConsoleHelper.ReadSecret();
if (password.IsNullOrWhiteSpace())
{
throw new CliUsageException(
"Password is missing!" +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
}
try
{
await AuthService.LoginAsync(
commandLineArgs.Target,
password,
organization
);
}
catch (Exception ex)
{
LogCliError(ex, commandLineArgs);
return;
}
Logger.LogInformation($"Successfully logged in as '{commandLineArgs.Target}'");
}
catch (Exception ex)
else
{
LogCliError(ex, commandLineArgs);
return;
}
try
{
await AuthService.DeviceLoginAsync();
}
catch (Exception ex)
{
LogCliError(ex, commandLineArgs);
return;
}
Logger.LogInformation($"Successfully logged in as '{commandLineArgs.Target}'");
var loginInfo = await AuthService.GetLoginInfoAsync();
Logger.LogInformation($"Successfully logged in as '{loginInfo.Username}'");
}
}
private async Task<bool> HasMultipleOrganizationAndThisNotSpecified(CommandLineArgs commandLineArgs, string organization)
@ -178,6 +196,7 @@ public class LoginCommand : IConsoleCommand, ITransientDependency
sb.AppendLine("Usage:");
sb.AppendLine(" abp login <username>");
sb.AppendLine(" abp login <username> -p <password>");
sb.AppendLine(" abp login <username> --device");
sb.AppendLine("");
sb.AppendLine("Example:");
sb.AppendLine("");

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs

@ -182,6 +182,7 @@ public abstract class AppTemplateBase : TemplateInfo
}
else
{
context.Symbols.Add("PUBLIC-REDIS");
context.Symbols.Add("public-website");
}

8
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/Events/ModuleInstallingProgressEvent.cs

@ -0,0 +1,8 @@
namespace Volo.Abp.Cli.ProjectModification.Events;
public class ModuleInstallingProgressEvent
{
public int CurrentStep { get; set; }
public string Message { get; set; }
}

40
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs

@ -121,7 +121,6 @@ public class NpmPackagesUpdater : ITransientDependency
{
var fileName = Path.Combine(directoryName, ".npmrc");
var abpRegistry = "@abp:registry=https://www.myget.org/F/abp-nightly/npm";
var voloRegistry = await GetVoloRegistryAsync();
if (await NpmrcFileExistAsync(directoryName))
{
@ -132,11 +131,6 @@ public class NpmPackagesUpdater : ITransientDependency
fileContent += Environment.NewLine + abpRegistry;
}
if (!fileContent.Contains(voloRegistry))
{
fileContent += Environment.NewLine + voloRegistry;
}
File.WriteAllText(fileName, fileContent);
return;
@ -145,42 +139,10 @@ public class NpmPackagesUpdater : ITransientDependency
using var fs = File.Create(fileName);
var content = new UTF8Encoding(true)
.GetBytes(abpRegistry + Environment.NewLine + voloRegistry);
.GetBytes(abpRegistry);
fs.Write(content, 0, content.Length);
}
private async Task<string> GetVoloRegistryAsync()
{
var apikey = await GetApiKeyAsync();
if (string.IsNullOrWhiteSpace(apikey))
{
return "";
}
return "@volo:registry=https://www.myget.org/F/abp-commercial/auth/" + apikey + "/npm/";
}
public async Task<string> GetApiKeyAsync()
{
try
{
var client = _cliHttpClientFactory.CreateClient();
using (var response = await client.GetHttpResponseMessageWithRetryAsync(
url: $"{CliUrls.WwwAbpIo}api/myget/apikey/",
cancellationToken: CancellationTokenProvider.Token,
logger: Logger
))
{
return Encoding.Default.GetString(await response.Content.ReadAsByteArrayAsync());
}
}
catch (Exception)
{
return string.Empty;
}
}
private static bool IsAngularProject(string fileDirectory)
{
return File.Exists(Path.Combine(fileDirectory, "angular.json"));

43
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs

@ -17,8 +17,10 @@ using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectModification.Events;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Json;
namespace Volo.Abp.Cli.ProjectModification;
@ -33,6 +35,7 @@ public class SolutionModuleAdder : ITransientDependency
public NewCommand NewCommand { get; }
public BundleCommand BundleCommand { get; }
public ICmdHelper CmdHelper { get; }
public ILocalEventBus LocalEventBus { get; }
protected IJsonSerializer JsonSerializer { get; }
protected ProjectNugetPackageAdder ProjectNugetPackageAdder { get; }
@ -62,7 +65,8 @@ public class SolutionModuleAdder : ITransientDependency
NewCommand newCommand,
BundleCommand bundleCommand,
CliHttpClientFactory cliHttpClientFactory,
ICmdHelper cmdHelper)
ICmdHelper cmdHelper,
ILocalEventBus localEventBus)
{
JsonSerializer = jsonSerializer;
ProjectNugetPackageAdder = projectNugetPackageAdder;
@ -79,6 +83,7 @@ public class SolutionModuleAdder : ITransientDependency
NewCommand = newCommand;
BundleCommand = bundleCommand;
CmdHelper = cmdHelper;
LocalEventBus = localEventBus;
_cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger<SolutionModuleAdder>.Instance;
}
@ -95,7 +100,11 @@ public class SolutionModuleAdder : ITransientDependency
Check.NotNull(solutionFile, nameof(solutionFile));
Check.NotNull(moduleName, nameof(moduleName));
await PublishEventAsync(1, "Retriving module info...");
var module = await GetModuleInfoAsync(moduleName, newTemplate, newProTemplate);
await PublishEventAsync(2, "Removing incompatible packages from module...");
module = RemoveIncompatiblePackages(module, version);
Logger.LogInformation($"Installing module '{module.Name}' to the solution '{Path.GetFileNameWithoutExtension(solutionFile)}'");
@ -107,14 +116,20 @@ public class SolutionModuleAdder : ITransientDependency
if (withSourceCode || newTemplate || newProTemplate)
{
var modulesFolderInSolution = Path.Combine(Path.GetDirectoryName(solutionFile), "modules");
await PublishEventAsync(5, $"Downloading source code of {moduleName}");
await DownloadSourceCodesToSolutionFolder(module, modulesFolderInSolution, version, newTemplate, newProTemplate);
await PublishEventAsync(6, $"Deleting incompatible projects from the module source code");
await RemoveUnnecessaryProjectsAsync(Path.GetDirectoryName(solutionFile), module, projectFiles);
if (addSourceCodeToSolutionFile)
{
await PublishEventAsync(7, $"Adding module to solution file");
await SolutionFileModifier.AddModuleToSolutionFileAsync(module, solutionFile);
}
await PublishEventAsync(8, $"Changing nuget references to local references");
if (newTemplate || newProTemplate)
{
await NugetPackageToLocalReferenceConverter.Convert(module, solutionFile, $"{module.Name}.");
@ -133,7 +148,7 @@ public class SolutionModuleAdder : ITransientDependency
await RunBundleForBlazorAsync(projectFiles, module);
ModifyDbContext(projectFiles, module, skipDbMigrations);
await ModifyDbContext(projectFiles, module, skipDbMigrations);
var documentationLink = module.GetFirstDocumentationLinkOrNull();
if (documentationLink != null)
@ -144,6 +159,14 @@ public class SolutionModuleAdder : ITransientDependency
return module;
}
private async Task PublishEventAsync(int currentStep, string message)
{
await LocalEventBus.PublishAsync(new ModuleInstallingProgressEvent {
CurrentStep = currentStep,
Message = message
}, false);
}
private ModuleWithMastersInfo RemoveIncompatiblePackages(ModuleWithMastersInfo module, string version)
{
module.NugetPackages.RemoveAll(np => IsPackageInCompatible(np.MinVersion, np.MaxVersion, version));
@ -195,6 +218,8 @@ public class SolutionModuleAdder : ITransientDependency
return;
}
await PublishEventAsync(10, $"Running bundle command for Blazor");
var args = new CommandLineArgs("bundle");
args.Options.Add(BundleCommand.Options.WorkingDirectory.Short, Path.GetDirectoryName(blazorProject));
@ -381,6 +406,8 @@ public class SolutionModuleAdder : ITransientDependency
if (!angularPackages.IsNullOrEmpty())
{
await PublishEventAsync(5, $"Adding angular package reference");
foreach (var npmPackage in angularPackages)
{
await ProjectNpmPackageAdder.AddAngularPackageAsync(angularPath, npmPackage);
@ -398,6 +425,8 @@ public class SolutionModuleAdder : ITransientDependency
return;
}
await PublishEventAsync(9, $"Adding angular source code");
if (newTemplate)
{
MoveAngularFolderInNewTemplate(modulesFolderInSolution, moduleName);
@ -517,6 +546,7 @@ public class SolutionModuleAdder : ITransientDependency
{
var webPackagesWillBeAddedToBlazorServerProject = SouldWebPackagesBeAddedToBlazorServerProject(module, projectFiles);
await PublishEventAsync(3, "Adding nuget package references");
foreach (var nugetPackage in module.NugetPackages)
{
var isProjectTiered = await IsProjectTiered(projectFiles);
@ -553,9 +583,12 @@ public class SolutionModuleAdder : ITransientDependency
if (!mvcNpmPackages.IsNullOrEmpty())
{
var targetProjects = ProjectFinder.FindNpmTargetProjectFile(projectFiles);
if (targetProjects.Any())
{
await PublishEventAsync(4, "Adding npm package references for MVC");
NpmGlobalPackagesChecker.Check();
foreach (var targetProject in targetProjects)
@ -586,7 +619,7 @@ public class SolutionModuleAdder : ITransientDependency
return isBlazorServerProject && module.NugetPackages.All(np => np.Target != NuGetPackageTarget.BlazorServer && np.TieredTarget != NuGetPackageTarget.BlazorServer);
}
protected void ModifyDbContext(string[] projectFiles, ModuleInfo module, bool skipDbMigrations = false)
protected async Task ModifyDbContext(string[] projectFiles, ModuleInfo module, bool skipDbMigrations = false)
{
if (string.IsNullOrWhiteSpace(module.EfCoreConfigureMethodName))
{
@ -622,6 +655,8 @@ public class SolutionModuleAdder : ITransientDependency
return;
}
await PublishEventAsync(10, $"Adding Configuration to EfCore DbContext");
var addedNewBuilder =
DbContextFileBuilderConfigureAdder.Add(dbContextFile, module.EfCoreConfigureMethodName);
@ -629,9 +664,11 @@ public class SolutionModuleAdder : ITransientDependency
{
if (addedNewBuilder)
{
await PublishEventAsync(11, $"Creating a new migration");
EfCoreMigrationManager.AddMigration(dbMigrationsProject, module.Name);
}
await PublishEventAsync(12, $"Running migrator");
RunMigrator(projectFiles);
}
}

1
framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs

@ -18,6 +18,7 @@ public class Program
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning)
.MinimumLevel.Override("System.Net.Http.HttpClient", LogEventLevel.Warning)
.MinimumLevel.Override("Volo.Abp.IdentityModel", LogEventLevel.Information)
#if DEBUG
.MinimumLevel.Override("Volo.Abp.Cli", LogEventLevel.Debug)
#else

9
framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/PostgreSql/AbpEntityFrameworkCorePostgreSqlModule.cs

@ -1,5 +1,4 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore.DistributedEvents;
using Volo.Abp.Guids;
using Volo.Abp.Modularity;
@ -11,12 +10,6 @@ namespace Volo.Abp.EntityFrameworkCore.PostgreSql;
)]
public class AbpEntityFrameworkCorePostgreSqlModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
// https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpSequentialGuidGeneratorOptions>(options =>

8
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs

@ -122,6 +122,12 @@ public abstract class AbpDbContext<TDbContext> : DbContext, IAbpEfCoreDbContext,
if (provider != null)
{
modelBuilder.SetDatabaseProvider(provider.Value);
if (provider.Value == EfCoreDatabaseProvider.PostgreSql)
{
// https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
}
}
}
@ -486,7 +492,7 @@ public abstract class AbpDbContext<TDbContext> : DbContext, IAbpEfCoreDbContext,
entry.Reload();
entry.Entity.As<ISoftDelete>().IsDeleted = true;
entry.State = EntityState.Modified;
SetDeletionAuditProperties(entry);
}
protected virtual bool IsHardDeleted(EntityEntry entry)

23
framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs

@ -39,13 +39,15 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen
IOptions<AbpAzureEventBusOptions> abpAzureEventBusOptions,
IAzureServiceBusSerializer serializer,
IAzureServiceBusMessageConsumerFactory messageConsumerFactory,
IPublisherPool publisherPool)
IPublisherPool publisherPool,
IEventHandlerInvoker eventHandlerInvoker)
: base(serviceScopeFactory,
currentTenant,
unitOfWorkManager,
abpDistributedEventBusOptions,
guidGenerator,
clock)
clock,
eventHandlerInvoker)
{
_options = abpAzureEventBusOptions.Value;
_serializer = serializer;
@ -87,7 +89,7 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen
public override async Task PublishFromOutboxAsync(OutgoingEventInfo outgoingEvent, OutboxConfig outboxConfig)
{
await PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData);
await PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData, outgoingEvent.Id);
}
public override async Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig)
@ -188,15 +190,28 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen
unitOfWork.AddOrReplaceDistributedEvent(eventRecord);
}
protected virtual async Task PublishAsync(string eventName, object eventData)
protected virtual Task PublishAsync(string eventName, object eventData)
{
var body = _serializer.Serialize(eventData);
return PublishAsync(eventName, body, null);
}
protected virtual async Task PublishAsync(
string eventName,
byte[] body,
Guid? eventId)
{
var message = new ServiceBusMessage(body)
{
Subject = eventName
};
if (message.MessageId.IsNullOrWhiteSpace())
{
message.MessageId = (eventId ?? GuidGenerator.Create()).ToString("N");
}
var publisher = await _publisherPool.GetAsync(
_options.TopicName,
_options.ConnectionName);

6
framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs

@ -39,14 +39,16 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen
IKafkaSerializer serializer,
IProducerPool producerPool,
IGuidGenerator guidGenerator,
IClock clock)
IClock clock,
IEventHandlerInvoker eventHandlerInvoker)
: base(
serviceScopeFactory,
currentTenant,
unitOfWorkManager,
abpDistributedEventBusOptions,
guidGenerator,
clock)
clock,
eventHandlerInvoker)
{
AbpKafkaEventBusOptions = abpKafkaEventBusOptions.Value;
MessageConsumerFactory = messageConsumerFactory;

6
framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs

@ -44,14 +44,16 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager,
IGuidGenerator guidGenerator,
IClock clock)
IClock clock,
IEventHandlerInvoker eventHandlerInvoker)
: base(
serviceScopeFactory,
currentTenant,
unitOfWorkManager,
distributedEventBusOptions,
guidGenerator,
clock)
clock,
eventHandlerInvoker)
{
ConnectionPool = connectionPool;
Serializer = serializer;

6
framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs

@ -38,14 +38,16 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen
IOptions<AbpRebusEventBusOptions> abpEventBusRebusOptions,
IRebusSerializer serializer,
IGuidGenerator guidGenerator,
IClock clock) :
IClock clock,
IEventHandlerInvoker eventHandlerInvoker) :
base(
serviceScopeFactory,
currentTenant,
unitOfWorkManager,
abpDistributedEventBusOptions,
guidGenerator,
clock)
clock,
eventHandlerInvoker)
{
Rebus = rebus;
Serializer = serializer;

6
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs

@ -22,11 +22,13 @@ public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventB
IUnitOfWorkManager unitOfWorkManager,
IOptions<AbpDistributedEventBusOptions> abpDistributedEventBusOptions,
IGuidGenerator guidGenerator,
IClock clock
IClock clock,
IEventHandlerInvoker eventHandlerInvoker
) : base(
serviceScopeFactory,
currentTenant,
unitOfWorkManager)
unitOfWorkManager,
eventHandlerInvoker)
{
GuidGenerator = guidGenerator;
Clock = clock;

33
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs

@ -22,14 +22,18 @@ public abstract class EventBusBase : IEventBus
protected IUnitOfWorkManager UnitOfWorkManager { get; }
protected IEventHandlerInvoker EventHandlerInvoker { get; }
protected EventBusBase(
IServiceScopeFactory serviceScopeFactory,
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager)
IUnitOfWorkManager unitOfWorkManager,
IEventHandlerInvoker eventHandlerInvoker)
{
ServiceScopeFactory = serviceScopeFactory;
CurrentTenant = currentTenant;
UnitOfWorkManager = unitOfWorkManager;
EventHandlerInvoker = eventHandlerInvoker;
}
/// <inheritdoc/>
@ -210,32 +214,7 @@ public abstract class EventBusBase : IEventBus
using (CurrentTenant.Change(GetEventDataTenantId(eventData)))
{
if (ReflectionHelper.IsAssignableToGenericType(handlerType, typeof(ILocalEventHandler<>)))
{
var method = typeof(ILocalEventHandler<>)
.MakeGenericType(eventType)
.GetMethod(
nameof(ILocalEventHandler<object>.HandleEventAsync),
new[] { eventType }
);
await ((Task)method.Invoke(eventHandlerWrapper.EventHandler, new[] { eventData }));
}
else if (ReflectionHelper.IsAssignableToGenericType(handlerType, typeof(IDistributedEventHandler<>)))
{
var method = typeof(IDistributedEventHandler<>)
.MakeGenericType(eventType)
.GetMethod(
nameof(IDistributedEventHandler<object>.HandleEventAsync),
new[] { eventType }
);
await ((Task)method.Invoke(eventHandlerWrapper.EventHandler, new[] { eventData }));
}
else
{
throw new AbpException("The object instance is not an event handler. Object type: " + handlerType.AssemblyQualifiedName);
}
await EventHandlerInvoker.InvokeAsync(eventHandlerWrapper.EventHandler, eventData, eventType);
}
}
catch (TargetInvocationException ex)

52
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventHandlerInvoker.cs

@ -0,0 +1,52 @@
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
namespace Volo.Abp.EventBus;
public class EventHandlerInvoker : IEventHandlerInvoker, ISingletonDependency
{
private readonly ConcurrentDictionary<string, EventHandlerInvokerCacheItem> _cache;
public EventHandlerInvoker()
{
_cache = new ConcurrentDictionary<string, EventHandlerInvokerCacheItem>();
}
public async Task InvokeAsync(IEventHandler eventHandler, object eventData, Type eventType)
{
var cacheItem = _cache.GetOrAdd($"{eventHandler.GetType().FullName}-{eventType.FullName}", _ =>
{
var item = new EventHandlerInvokerCacheItem();
if (typeof(ILocalEventHandler<>).MakeGenericType(eventType).IsInstanceOfType(eventHandler))
{
item.Local = (IEventHandlerMethodExecutor)Activator.CreateInstance(typeof(LocalEventHandlerMethodExecutor<>).MakeGenericType(eventType));
}
if (typeof(IDistributedEventHandler<>).MakeGenericType(eventType).IsInstanceOfType(eventHandler))
{
item.Distributed = (IEventHandlerMethodExecutor)Activator.CreateInstance(typeof(DistributedEventHandlerMethodExecutor<>).MakeGenericType(eventType));
}
return item;
});
if (cacheItem.Local != null)
{
await cacheItem.Local.ExecutorAsync(eventHandler, eventData);
}
if (cacheItem.Distributed != null)
{
await cacheItem.Distributed.ExecutorAsync(eventHandler, eventData);
}
if (cacheItem.Local == null && cacheItem.Distributed == null)
{
throw new AbpException("The object instance is not an event handler. Object type: " + eventHandler.GetType().AssemblyQualifiedName);
}
}
}

8
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventHandlerInvokerCacheItem.cs

@ -0,0 +1,8 @@
namespace Volo.Abp.EventBus;
public class EventHandlerInvokerCacheItem
{
public IEventHandlerMethodExecutor Local { get; set; }
public IEventHandlerMethodExecutor Distributed { get; set; }
}

34
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventHandlerMethodExecutor.cs

@ -0,0 +1,34 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.EventBus.Distributed;
namespace Volo.Abp.EventBus;
public delegate Task EventHandlerMethodExecutorAsync(IEventHandler target, object parameter);
public interface IEventHandlerMethodExecutor
{
EventHandlerMethodExecutorAsync ExecutorAsync { get; }
}
public class LocalEventHandlerMethodExecutor<TEvent> : IEventHandlerMethodExecutor
where TEvent : class
{
public EventHandlerMethodExecutorAsync ExecutorAsync => (target, parameter) => target.As<ILocalEventHandler<TEvent>>().HandleEventAsync(parameter.As<TEvent>());
public Task ExecuteAsync(IEventHandler target, TEvent parameters)
{
return ExecutorAsync(target, parameters);
}
}
public class DistributedEventHandlerMethodExecutor<TEvent> : IEventHandlerMethodExecutor
where TEvent : class
{
public EventHandlerMethodExecutorAsync ExecutorAsync => (target, parameter) => target.As<IDistributedEventHandler<TEvent>>().HandleEventAsync(parameter.As<TEvent>());
public Task ExecuteAsync(IEventHandler target, TEvent parameters)
{
return ExecutorAsync(target, parameters);
}
}

9
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandlerInvoker.cs

@ -0,0 +1,9 @@
using System;
using System.Threading.Tasks;
namespace Volo.Abp.EventBus;
public interface IEventHandlerInvoker
{
Task InvokeAsync(IEventHandler eventHandler, object eventData, Type eventType);
}

5
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs

@ -33,8 +33,9 @@ public class LocalEventBus : EventBusBase, ILocalEventBus, ISingletonDependency
IOptions<AbpLocalEventBusOptions> options,
IServiceScopeFactory serviceScopeFactory,
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager)
: base(serviceScopeFactory, currentTenant, unitOfWorkManager)
IUnitOfWorkManager unitOfWorkManager,
IEventHandlerInvoker eventHandlerInvoker)
: base(serviceScopeFactory, currentTenant, unitOfWorkManager, eventHandlerInvoker)
{
Options = options.Value;
Logger = NullLogger<LocalEventBus>.Instance;

132
framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs

@ -5,7 +5,6 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
@ -114,22 +113,34 @@ public class IdentityModelAuthenticationService : IIdentityModelAuthenticationSe
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
}
protected virtual async Task<string> GetTokenEndpoint(IdentityClientConfiguration configuration)
protected virtual async Task<IdentityModelDiscoveryDocumentCacheItem> GetDiscoveryResponse(IdentityClientConfiguration configuration)
{
//TODO: Can use (configuration.Authority + /connect/token) directly?
var tokenEndpointUrlCacheKey = CalculateDiscoveryDocumentCacheKey(configuration);
var discoveryDocumentCacheItem = await DiscoveryDocumentCache.GetAsync(tokenEndpointUrlCacheKey);
if (discoveryDocumentCacheItem == null)
{
var discoveryResponse = await GetDiscoveryResponse(configuration);
DiscoveryDocumentResponse discoveryResponse;
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
{
var request = new DiscoveryDocumentRequest
{
Address = configuration.Authority,
Policy =
{
RequireHttps = configuration.RequireHttps
}
};
IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request);
discoveryResponse = await httpClient.GetDiscoveryDocumentAsync(request);
}
if (discoveryResponse.IsError)
{
throw new AbpException($"Could not retrieve the OpenId Connect discovery document! " +
$"ErrorType: {discoveryResponse.ErrorType}. Error: {discoveryResponse.Error}");
}
discoveryDocumentCacheItem = new IdentityModelDiscoveryDocumentCacheItem(discoveryResponse.TokenEndpoint);
discoveryDocumentCacheItem = new IdentityModelDiscoveryDocumentCacheItem(discoveryResponse.TokenEndpoint, discoveryResponse.DeviceAuthorizationEndpoint);
await DiscoveryDocumentCache.SetAsync(tokenEndpointUrlCacheKey, discoveryDocumentCacheItem,
new DistributedCacheEntryOptions
{
@ -137,30 +148,11 @@ public class IdentityModelAuthenticationService : IIdentityModelAuthenticationSe
});
}
return discoveryDocumentCacheItem.TokenEndpoint;
}
protected virtual async Task<DiscoveryDocumentResponse> GetDiscoveryResponse(IdentityClientConfiguration configuration)
{
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
{
var request = new DiscoveryDocumentRequest
{
Address = configuration.Authority,
Policy =
{
RequireHttps = configuration.RequireHttps
}
};
IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request);
return await httpClient.GetDiscoveryDocumentAsync(request);
}
return discoveryDocumentCacheItem;
}
protected virtual async Task<TokenResponse> GetTokenResponse(IdentityClientConfiguration configuration)
{
var tokenEndpoint = await GetTokenEndpoint(configuration);
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
{
AddHeaders(httpClient);
@ -169,25 +161,30 @@ public class IdentityModelAuthenticationService : IIdentityModelAuthenticationSe
{
case OidcConstants.GrantTypes.ClientCredentials:
return await httpClient.RequestClientCredentialsTokenAsync(
await CreateClientCredentialsTokenRequestAsync(tokenEndpoint, configuration),
await CreateClientCredentialsTokenRequestAsync(configuration),
CancellationTokenProvider.Token
);
case OidcConstants.GrantTypes.Password:
return await httpClient.RequestPasswordTokenAsync(
await CreatePasswordTokenRequestAsync(tokenEndpoint, configuration),
await CreatePasswordTokenRequestAsync(configuration),
CancellationTokenProvider.Token
);
case OidcConstants.GrantTypes.DeviceCode:
return await RequestDeviceAuthorizationAsync(httpClient, configuration);
default:
throw new AbpException("Grant type was not implemented: " + configuration.GrantType);
}
}
}
protected virtual Task<PasswordTokenRequest> CreatePasswordTokenRequestAsync(string tokenEndpoint, IdentityClientConfiguration configuration)
protected virtual async Task<PasswordTokenRequest> CreatePasswordTokenRequestAsync(IdentityClientConfiguration configuration)
{
var discoveryResponse = await GetDiscoveryResponse(configuration);
var request = new PasswordTokenRequest
{
Address = tokenEndpoint,
Address = discoveryResponse.TokenEndpoint,
Scope = configuration.Scope,
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret,
@ -197,27 +194,90 @@ public class IdentityModelAuthenticationService : IIdentityModelAuthenticationSe
IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request);
AddParametersToRequestAsync(configuration, request);
await AddParametersToRequestAsync(configuration, request);
return Task.FromResult(request);
return request;
}
protected virtual Task<ClientCredentialsTokenRequest> CreateClientCredentialsTokenRequestAsync(string tokenEndpoint, IdentityClientConfiguration configuration)
protected virtual async Task<ClientCredentialsTokenRequest> CreateClientCredentialsTokenRequestAsync(IdentityClientConfiguration configuration)
{
var discoveryResponse = await GetDiscoveryResponse(configuration);
var request = new ClientCredentialsTokenRequest
{
Address = tokenEndpoint,
Address = discoveryResponse.TokenEndpoint,
Scope = configuration.Scope,
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret
};
IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request);
AddParametersToRequestAsync(configuration, request);
await AddParametersToRequestAsync(configuration, request);
return request;
}
protected virtual async Task<TokenResponse> RequestDeviceAuthorizationAsync(HttpClient httpClient, IdentityClientConfiguration configuration)
{
var discoveryResponse = await GetDiscoveryResponse(configuration);
var request = new DeviceAuthorizationRequest()
{
Address = discoveryResponse.DeviceAuthorizationEndpoint,
Scope = configuration.Scope,
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret,
};
IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request);
await AddParametersToRequestAsync(configuration, request);
var response = await httpClient.RequestDeviceAuthorizationAsync(request);
if (response.IsError)
{
throw new AbpException(response.ErrorDescription);
}
Logger.LogInformation($"First copy your one-time code: {response.UserCode}");
Logger.LogInformation($"Open {response.VerificationUri} in your browser...");
for (var i = 0; i < ((response.ExpiresIn ?? 300) / response.Interval + 1); i++)
{
await Task.Delay(response.Interval * 1000);
var tokenResponse = await httpClient.RequestDeviceTokenAsync(new DeviceTokenRequest
{
Address = discoveryResponse.TokenEndpoint,
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret,
DeviceCode = response.DeviceCode
});
return Task.FromResult(request);
if (tokenResponse.IsError)
{
switch (tokenResponse.Error)
{
case "slow_down":
case "authorization_pending":
break;
case "expired_token":
throw new AbpException("This 'device_code' has expired. (expired_token)");
case "access_denied":
throw new AbpException("User denies the request(access_denied)");
}
}
if (!tokenResponse.IsError)
{
return tokenResponse;
}
}
throw new AbpException("Timeout!");
}
protected virtual Task AddParametersToRequestAsync(IdentityClientConfiguration configuration, ProtocolRequest request)
{
foreach (var pair in configuration.Where(p => p.Key.StartsWith("[o]", StringComparison.OrdinalIgnoreCase)))

5
framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelDiscoveryDocumentCacheItem.cs

@ -9,14 +9,17 @@ public class IdentityModelDiscoveryDocumentCacheItem
{
public string TokenEndpoint { get; set; }
public string DeviceAuthorizationEndpoint { get; set; }
public IdentityModelDiscoveryDocumentCacheItem()
{
}
public IdentityModelDiscoveryDocumentCacheItem(string tokenEndpoint)
public IdentityModelDiscoveryDocumentCacheItem(string tokenEndpoint, string deviceAuthorizationEndpoint)
{
TokenEndpoint = tokenEndpoint;
DeviceAuthorizationEndpoint = deviceAuthorizationEndpoint;
}
public static string CalculateCacheKey(IdentityClientConfiguration configuration)

128
framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/EventHandlerInvoker_Tests.cs

@ -0,0 +1,128 @@
using System;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.EventBus.Local;
using Xunit;
namespace Volo.Abp.EventBus;
public class EventHandlerInvoker_Tests : EventBusTestBase
{
private readonly IEventHandlerInvoker _eventHandlerInvoker;
public EventHandlerInvoker_Tests()
{
_eventHandlerInvoker = GetRequiredService<IEventHandlerInvoker>();
}
[Fact]
public async Task Should_Invoke_LocalEventHandler_With_MyEventData()
{
var localHandler = new MyLocalEventHandler();
var eventData = new MyEventData();
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType());
localHandler.MyEventDataCount.ShouldBe(2);
localHandler.EntityChangedEventDataCount.ShouldBe(0);
localHandler.EntityChangedEventDataCount.ShouldBe(0);
}
[Fact]
public async Task Should_Invoke_LocalEventHandler_Created_And_Changed_Once()
{
var localHandler = new MyLocalEventHandler();
var eventData = new EntityCreatedEventData<MyEntity>(new MyEntity());
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType());
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, typeof(EntityChangedEventData<MyEntity>));
localHandler.MyEventDataCount.ShouldBe(0);
localHandler.EntityChangedEventDataCount.ShouldBe(1);
localHandler.EntityChangedEventDataCount.ShouldBe(1);
}
[Fact]
public async Task Should_Invoke_DistributedEventHandler_With_MyEventData()
{
var localHandler = new MyDistributedEventHandler();
var eventData = new MyEventData();
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType());
localHandler.MyEventDataCount.ShouldBe(1);
localHandler.EntityCreatedCount.ShouldBe(0);
}
[Fact]
public async Task Should_Invoke_DistributedEventHandler_With_EntityCreatedEto()
{
var localHandler = new MyDistributedEventHandler();
var eventData = new EntityCreatedEto<MyEntity>(new MyEntity());
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType());
localHandler.MyEventDataCount.ShouldBe(0);
localHandler.EntityCreatedCount.ShouldBe(1);
}
public class MyEventData
{
}
public class MyEntity : Entity<Guid>
{
}
public class MyDistributedEventHandler : IDistributedEventHandler<MyEventData>,
IDistributedEventHandler<EntityCreatedEto<MyEntity>>
{
public int MyEventDataCount { get; set; }
public int EntityCreatedCount { get; set; }
public Task HandleEventAsync(MyEventData eventData)
{
MyEventDataCount++;
return Task.CompletedTask;
}
public Task HandleEventAsync(EntityCreatedEto<MyEntity> eventData)
{
EntityCreatedCount++;
return Task.CompletedTask;
}
}
public class MyLocalEventHandler : ILocalEventHandler<MyEventData>,
IDistributedEventHandler<MyEventData>,
IDistributedEventHandler<EntityCreatedEventData<MyEntity>>,
IDistributedEventHandler<EntityChangedEventData<MyEntity>>
{
public int MyEventDataCount { get; set; }
public int EntityCreatedEventDataCount { get; set; }
public int EntityChangedEventDataCount { get; set; }
public Task HandleEventAsync(MyEventData eventData)
{
MyEventDataCount++;
return Task.CompletedTask;
}
public Task HandleEventAsync(EntityCreatedEventData<MyEntity> eventData)
{
EntityCreatedEventDataCount++;
return Task.CompletedTask;
}
public Task HandleEventAsync(EntityChangedEventData<MyEntity> eventData)
{
EntityChangedEventDataCount++;
return Task.CompletedTask;
}
}
}

4
modules/account/Volo.Abp.Account.abpmdl.json

@ -37,6 +37,10 @@
"Volo.Abp.Account.Blazor": {
"path": "src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json",
"folder": "src"
},
"Volo.Abp.Account.Installer": {
"path": "src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.abppkg.json",
"folder": "src"
}
}
}

11
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.Account.Application.Contracts",
"hash": "eda5b3412f7e1dd8dc07761a04f3a064",
"contents": [
{
"namespace": "Volo.Abp.Account",
"contentType": "abpModule",
"name": "AbpAccountApplicationContractsModule"
}
]
}

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json

@ -1,6 +1,7 @@
{
"culture": "ar",
"texts": {
"Menu:Account": "حساب",
"UserName": "اسم المستخدم",
"EmailAddress": "البريد الإلكتروني",
"UserNameOrEmailAddress": "اسم المستخدم أو البريد الإلكتروني",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de-DE.json

@ -1,6 +1,7 @@
{
"culture": "de-DE",
"texts": {
"Menu:Account": "Account",
"UserName": "Benutzername",
"EmailAddress": "E-Mail-Adresse",
"UserNameOrEmailAddress": "Benutzername oder E-Mail-Adresse",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json

@ -1,6 +1,7 @@
{
"culture": "en",
"texts": {
"Menu:Account": "Account",
"UserName": "Username",
"EmailAddress": "Email address",
"UserNameOrEmailAddress": "Username or email address",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json

@ -1,6 +1,7 @@
{
"culture": "es",
"texts": {
"Menu:Account": "Cuenta",
"UserName": "Nombre de usuario",
"EmailAddress": "Dirección de correo electrónico",
"UserNameOrEmailAddress": "Nombre de usuario o dirección de correo electrónico",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json

@ -1,6 +1,7 @@
{
"culture": "fi",
"texts": {
"Menu:Account": "Tili",
"UserName": "Käyttäjätunnus",
"EmailAddress": "Sähköpostiosoite",
"UserNameOrEmailAddress": "Käyttäjänimi tai Sähköpostiosoite",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json

@ -1,6 +1,7 @@
{
"culture": "fr",
"texts": {
"Menu:Account": "Compte",
"UserName": "Nom d'utilisateur",
"EmailAddress": "Adresse e-mail",
"UserNameOrEmailAddress": "Nom d'utilisateur ou adresse e-mail",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json

@ -1,6 +1,7 @@
{
"culture": "hi",
"texts": {
"Menu:Account": "लेखा",
"UserName": "उपयोगकर्ता नाम",
"EmailAddress": "ईमेल पता",
"UserNameOrEmailAddress": "उपयोगकर्ता का नाम या ईमेल पता",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json

@ -1,6 +1,7 @@
{
"culture": "it",
"texts": {
"Menu:Account": "Account",
"UserName": "Nome utente",
"EmailAddress": "Indirizzo e-mail",
"UserNameOrEmailAddress": "Username o Indirizzo e-mail",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json

@ -1,6 +1,7 @@
{
"culture": "pt-BR",
"texts": {
"Menu:Account": "Conta",
"UserName": "Usuário",
"EmailAddress": "E-mail",
"UserNameOrEmailAddress": "Usuário ou e-mail",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json

@ -1,6 +1,7 @@
{
"culture": "sk",
"texts": {
"Menu:Account": "Účet",
"UserName": "Používateľské meno",
"EmailAddress": "Emailová adresa",
"UserNameOrEmailAddress": "Používateľské meno alebo emailová adresa",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json

@ -1,6 +1,7 @@
{
"culture": "sl",
"texts": {
"Menu:Account": "Račun",
"UserName": "Uporabniško ime",
"EmailAddress": "E-poštni naslov",
"UserNameOrEmailAddress": "Uporabniško ime ali e-poštni naslov",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json

@ -1,6 +1,7 @@
{
"culture": "tr",
"texts": {
"Menu:Account": "Hesap",
"UserName": "Kullanıcı adı",
"EmailAddress": "E-posta adresi",
"UserNameOrEmailAddress": "Kullanıcı adı veya e-posta",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json

@ -1,6 +1,7 @@
{
"culture": "zh-Hans",
"texts": {
"Menu:Account": "账户",
"UserName": "用户名称",
"EmailAddress": "邮箱地址",
"UserNameOrEmailAddress": "用户名称或邮箱地址",

1
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json

@ -1,6 +1,7 @@
{
"culture": "zh-Hant",
"texts": {
"Menu:Account": "帳號",
"UserName": "使用者名稱",
"EmailAddress": "電子信箱地址",
"UserNameOrEmailAddress": "使用者名稱或電子信箱地址",

49
modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.analyze.json

@ -0,0 +1,49 @@
{
"name": "Volo.Abp.Account.Application",
"hash": "7fb9c3f35b18f2e9a0577d571fccf9df",
"contents": [
{
"namespace": "Volo.Abp.Account",
"contentType": "abpModule",
"name": "AbpAccountApplicationModule"
},
{
"namespace": "Volo.Abp.Account",
"summary": null,
"implementingInterfaces": [
"Volo.Abp.Account.IAccountAppService"
],
"contentType": "applicationService",
"name": "AccountAppService"
},
{
"namespace": "Volo.Abp.Account",
"summary": null,
"implementingInterfaces": [
"Volo.Abp.Account.IProfileAppService"
],
"contentType": "applicationService",
"name": "ProfileAppService"
},
{
"defaultValue": "true",
"displayName": "Is self-registration enabled",
"description": "Whether a user can register the account by him or herself.",
"isVisibleToClient": true,
"isInherited": true,
"isEncrypted": false,
"contentType": "setting",
"name": "Abp.Account.IsSelfRegistrationEnabled"
},
{
"defaultValue": "true",
"displayName": "Authenticate with a local account",
"description": "Indicates if the server will allow users to authenticate with a local account.",
"isVisibleToClient": true,
"isInherited": true,
"isEncrypted": false,
"contentType": "setting",
"name": "Abp.Account.EnableLocalLogin"
}
]
}

11
modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.Account.HttpApi.Client",
"hash": "ca67872e6cd8c25508461f7d171a8f04",
"contents": [
{
"namespace": "Volo.Abp.Account",
"contentType": "abpModule",
"name": "AbpAccountHttpApiClientModule"
}
]
}

11
modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.Account.HttpApi",
"hash": "b178895fe2a7f470f36c4fd121b7c07a",
"contents": [
{
"namespace": "Volo.Abp.Account",
"contentType": "abpModule",
"name": "AbpAccountHttpApiModule"
}
]
}

1
modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.abppkg.json

@ -0,0 +1 @@
{}

11
modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.Account.Web",
"hash": "5fb2aa05261d4febe7ea7083d80fea74",
"contents": [
{
"namespace": "Volo.Abp.Account.Web",
"contentType": "abpModule",
"name": "AbpAccountWebModule"
}
]
}

4
modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json

@ -37,6 +37,10 @@
"Volo.Abp.AuditLogging.MongoDB.Tests": {
"path": "test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json",
"folder": "test"
},
"Volo.Abp.AuditLogging.Installer": {
"path": "src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.abppkg.json",
"folder": "src"
}
}
}

11
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.AuditLogging.Domain.Shared",
"hash": "91305b5b9fa1cd0a8a9adc6a0e54877b",
"contents": [
{
"namespace": "Volo.Abp.AuditLogging",
"contentType": "abpModule",
"name": "AbpAuditLoggingDomainSharedModule"
}
]
}

41
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.analyze.json

@ -0,0 +1,41 @@
{
"name": "Volo.Abp.AuditLogging.Domain",
"hash": "df19d27b7da103de2da1826c6ba8e161",
"contents": [
{
"namespace": "Volo.Abp.AuditLogging",
"contentType": "abpModule",
"name": "AbpAuditLoggingDomainModule"
},
{
"namespace": "Volo.Abp.AuditLogging",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [
"Volo.Abp.AuditLogging.EntityChange",
"Volo.Abp.AuditLogging.AuditLogAction"
],
"navigationProperties": [],
"contentType": "aggregateRoot",
"name": "AuditLog"
},
{
"namespace": "Volo.Abp.AuditLogging",
"summary": null,
"entityModel": {
"namespace": "Volo.Abp.AuditLogging",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [
"Volo.Abp.AuditLogging.EntityChange",
"Volo.Abp.AuditLogging.AuditLogAction"
],
"navigationProperties": [],
"contentType": "entity",
"name": "AuditLog"
},
"contentType": "repositoryInterface",
"name": "IAuditLogRepository"
}
]
}

39
modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.analyze.json

@ -0,0 +1,39 @@
{
"name": "Volo.Abp.AuditLogging.EntityFrameworkCore",
"hash": "0495e8cfba68a55319b3774882939845",
"contents": [
{
"namespace": "Volo.Abp.AuditLogging.EntityFrameworkCore",
"contentType": "abpModule",
"name": "AbpAuditLoggingEntityFrameworkCoreModule"
},
{
"namespace": "Volo.Abp.AuditLogging.EntityFrameworkCore",
"connectionStringName": "AbpAuditLogging",
"databaseTables": [
{
"entityFullName": "Volo.Abp.AuditLogging.AuditLog",
"contentType": "databaseTable",
"name": "AbpAuditLogs"
},
{
"entityFullName": "Volo.Abp.AuditLogging.AuditLogAction",
"contentType": "databaseTable",
"name": "AbpAuditLogActions"
},
{
"entityFullName": "Volo.Abp.AuditLogging.EntityChange",
"contentType": "databaseTable",
"name": "AbpEntityChanges"
},
{
"entityFullName": "Volo.Abp.AuditLogging.EntityPropertyChange",
"contentType": "databaseTable",
"name": "AbpEntityPropertyChanges"
}
],
"contentType": "efCoreDbContext",
"name": "AbpAuditLoggingDbContext"
}
]
}

1
modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.abppkg.json

@ -0,0 +1 @@
{}

24
modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.analyze.json

@ -0,0 +1,24 @@
{
"name": "Volo.Abp.AuditLogging.MongoDB",
"hash": "e87142d2a7e24741c98d02daa9005ac1",
"contents": [
{
"namespace": "Volo.Abp.AuditLogging.MongoDB",
"contentType": "abpModule",
"name": "AbpAuditLoggingMongoDbModule"
},
{
"namespace": "Volo.Abp.AuditLogging.MongoDB",
"connectionStringName": "AbpAuditLogging",
"databaseCollections": [
{
"entityFullName": "Volo.Abp.AuditLogging.AuditLog",
"contentType": "databaseCollection",
"name": "AbpAuditLogs"
}
],
"contentType": "mongoDbContext",
"name": "AuditLoggingMongoDbContext"
}
]
}

4
modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json

@ -1 +1,3 @@
{}
{
"role": "lib.test"
}

4
modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json

@ -58,6 +58,10 @@
"Volo.Abp.BackgroundJobs.DemoApp.Quartz": {
"path": "app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json",
"folder": "app"
},
"Volo.Abp.BackgroundJobs.Installer": {
"path": "src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.abppkg.json",
"folder": "src"
}
}
}

11
modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.BackgroundJobs.Domain.Shared",
"hash": "d48277ec610b23392edcb12ae3e29175",
"contents": [
{
"namespace": "Volo.Abp.BackgroundJobs",
"contentType": "abpModule",
"name": "AbpBackgroundJobsDomainSharedModule"
}
]
}

35
modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.analyze.json

@ -0,0 +1,35 @@
{
"name": "Volo.Abp.BackgroundJobs.Domain",
"hash": "1398bbe3f228b2bfd0baec6a64c03b43",
"contents": [
{
"namespace": "Volo.Abp.BackgroundJobs",
"contentType": "abpModule",
"name": "AbpBackgroundJobsDomainModule"
},
{
"namespace": "Volo.Abp.BackgroundJobs",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [],
"navigationProperties": [],
"contentType": "aggregateRoot",
"name": "BackgroundJobRecord"
},
{
"namespace": "Volo.Abp.BackgroundJobs",
"summary": null,
"entityModel": {
"namespace": "Volo.Abp.BackgroundJobs",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [],
"navigationProperties": [],
"contentType": "entity",
"name": "BackgroundJobRecord"
},
"contentType": "repositoryInterface",
"name": "IBackgroundJobRepository"
}
]
}

24
modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.analyze.json

@ -0,0 +1,24 @@
{
"name": "Volo.Abp.BackgroundJobs.EntityFrameworkCore",
"hash": "f3bf7c7db2ab764d6421df0b88ea535b",
"contents": [
{
"namespace": "Volo.Abp.BackgroundJobs.EntityFrameworkCore",
"contentType": "abpModule",
"name": "AbpBackgroundJobsEntityFrameworkCoreModule"
},
{
"namespace": "Volo.Abp.BackgroundJobs.EntityFrameworkCore",
"connectionStringName": "AbpBackgroundJobs",
"databaseTables": [
{
"entityFullName": "Volo.Abp.BackgroundJobs.BackgroundJobRecord",
"contentType": "databaseTable",
"name": "AbpBackgroundJobs"
}
],
"contentType": "efCoreDbContext",
"name": "BackgroundJobsDbContext"
}
]
}

1
modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.abppkg.json

@ -0,0 +1 @@
{}

24
modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.analyze.json

@ -0,0 +1,24 @@
{
"name": "Volo.Abp.BackgroundJobs.MongoDB",
"hash": "def047f007cc2f8c9a74459f1df01330",
"contents": [
{
"namespace": "Volo.Abp.BackgroundJobs.MongoDB",
"contentType": "abpModule",
"name": "AbpBackgroundJobsMongoDbModule"
},
{
"namespace": "Volo.Abp.BackgroundJobs.MongoDB",
"connectionStringName": "AbpBackgroundJobs",
"databaseCollections": [
{
"entityFullName": "Volo.Abp.BackgroundJobs.BackgroundJobRecord",
"contentType": "databaseCollection",
"name": "AbpBackgroundJobs"
}
],
"contentType": "mongoDbContext",
"name": "BackgroundJobsMongoDbContext"
}
]
}

4
modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json

@ -1 +1,3 @@
{}
{
"role": "lib.test"
}

4
modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json

@ -33,6 +33,10 @@
"Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests": {
"path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.abppkg.json",
"folder": "test"
},
"Volo.Abp.BasicTheme.Installer": {
"path": "src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.abppkg.json",
"folder": "src"
}
}
}

1
modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.abppkg.json

@ -0,0 +1 @@
{}

2
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json

@ -3,7 +3,7 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^5.0.1",
"@abp/aspnetcore.mvc.ui.theme.shared": "^5.1.1",
"highlight.js": "^9.13.1"
},
"devDependencies": {}

10
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/abp/jquery/abp.jquery.js

@ -205,14 +205,16 @@ var abp = abp || {};
handleAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
var messagePromise = null;
var responseJSON = jqXHR.responseJSON ? jqXHR.responseJSON : JSON.parse(jqXHR.responseText);
if (userOptions.abpHandleError !== false) {
messagePromise = abp.ajax.showError(jqXHR.responseJSON.error);
messagePromise = abp.ajax.showError(responseJSON.error);
}
abp.ajax.logError(jqXHR.responseJSON.error);
abp.ajax.logError(responseJSON.error);
$dfd && $dfd.reject(jqXHR.responseJSON.error, jqXHR);
userOptions.error && userOptions.error(jqXHR.responseJSON.error, jqXHR);
$dfd && $dfd.reject(responseJSON.error, jqXHR);
userOptions.error && userOptions.error(responseJSON.error, jqXHR);
if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
abp.ajax.handleUnAuthorizedRequest(messagePromise);

224
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock

@ -2,30 +2,30 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.shared@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.0.1.tgz#77a4900424603e0be048f3507aa852701f3139a2"
integrity sha512-mn9HEOHBkmBr7d/VUt0bfg9K58IyRDb7j3ZiDoHo263WLXJkf0+C7MEbv/zxfDHW4NeztsNCd3ugA7PdTxPzmA==
dependencies:
"@abp/aspnetcore.mvc.ui" "~5.0.1"
"@abp/bootstrap" "~5.0.1"
"@abp/bootstrap-datepicker" "~5.0.1"
"@abp/datatables.net-bs5" "~5.0.1"
"@abp/font-awesome" "~5.0.1"
"@abp/jquery-form" "~5.0.1"
"@abp/jquery-validation-unobtrusive" "~5.0.1"
"@abp/lodash" "~5.0.1"
"@abp/luxon" "~5.0.1"
"@abp/malihu-custom-scrollbar-plugin" "~5.0.1"
"@abp/select2" "~5.0.1"
"@abp/sweetalert2" "~5.0.1"
"@abp/timeago" "~5.0.1"
"@abp/toastr" "~5.0.1"
"@abp/aspnetcore.mvc.ui@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.0.1.tgz#f5aa4e0dcc10878f590e30836887f3f9861e91e3"
integrity sha512-bN15UcNhTqeo0RXlIYws7Jd8ZfSBsVM6Y5wiAqbq1Q3Lvs1uLmryhZpn6sHmKw2Z3Lnhec7VjnZN0FwNpzEqUw==
"@abp/aspnetcore.mvc.ui.theme.shared@^5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.1.1.tgz#c5c77ccb44c32a073d59d559db72d852484e6a38"
integrity sha512-/cqeWfBdJQuMlSObdSH+IbrJhXuPtwLyHIHJt0LmEGeawAQfHSRQjp5ZaezIbcLHB7ATC3W9yiX3unMyQMWDrg==
dependencies:
"@abp/aspnetcore.mvc.ui" "~5.1.1"
"@abp/bootstrap" "~5.1.1"
"@abp/bootstrap-datepicker" "~5.1.1"
"@abp/datatables.net-bs5" "~5.1.1"
"@abp/font-awesome" "~5.1.1"
"@abp/jquery-form" "~5.1.1"
"@abp/jquery-validation-unobtrusive" "~5.1.1"
"@abp/lodash" "~5.1.1"
"@abp/luxon" "~5.1.1"
"@abp/malihu-custom-scrollbar-plugin" "~5.1.1"
"@abp/select2" "~5.1.1"
"@abp/sweetalert2" "~5.1.1"
"@abp/timeago" "~5.1.1"
"@abp/toastr" "~5.1.1"
"@abp/aspnetcore.mvc.ui@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.1.1.tgz#507acc3edc1067dd2f1e5ec3b21bc5ad5946d7c5"
integrity sha512-3nv/r5IFzic6ryl9d4FW/iuto7sJAJidx2UGorhcoMbmxL4x6HCKz81oj1qQhvnunyCi/UfUPUCB5dWsa3A2IQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -34,145 +34,145 @@
merge-stream "^2.0.0"
micromatch "^4.0.2"
"@abp/bootstrap-datepicker@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.0.1.tgz#52116a154e343d84c87257ad1ef10b54012f4c33"
integrity sha512-ZJWaZKzGzshBAfyBqaUScfWqeBVfWGbZIwIplF8VKtDGcyI8R54bqDsydhS88CCnolRz4+tfq3QY6yAXrUEKAw==
"@abp/bootstrap-datepicker@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.1.1.tgz#1e546c889206bde155338063b7e0bf92beab9457"
integrity sha512-oYvyWjoXFuTvUDmSh2kpRkwdF1OyNYuyr1g/7QeCvZO/gCQZ2wWB5TfUp3j3beQntk1HV7frfuTyzodELOKBRg==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.0.1.tgz#d542a8fd7151e22eda1643e313a67f9892c50533"
integrity sha512-wyVAp6a4OIwlqK7AZozs7wpsBZgzG55EKeChBBfUXloJPuirQHxccFNE41aAYWfKur+wj25WD5NBnzFuKyNYiQ==
"@abp/bootstrap@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.1.1.tgz#f8bc53ead0aaf21b665b0bc7f59d2fc2422d6ab8"
integrity sha512-J69hA4zOHtNoZ+4IbvhRm/WbLuPwQ5zFLnI7Iz5YlEaXPnqmyI4hkWinyEGj0DwTzdnUUh7VUKk3khFdm4/9uQ==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
bootstrap "^5.1.0"
bootstrap-v4-rtl "4.6.0-1"
"@abp/core@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.0.1.tgz#904fa2c22bcbf42deb56abf772c3a53362807a2f"
integrity sha512-QzX35Oa+Vncu2OP1tXvGjAVFznmD1tZRn4tlDQgn36B2MU06UEO0JSx7JVedPvhzQZceUe5+WWMfuYNM2xeBTw==
"@abp/core@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.1.1.tgz#91d67d6844947e84eee9603fe72d64c0f46d3e92"
integrity sha512-whbkIGQt6bFqjnciFhRjr6fRE7gC6nwORfcof68C5ylZozQJ7JHdLluPeSrU/dpfng+OTBRFdhS3CC8pC7+CjA==
dependencies:
"@abp/utils" "~5.0.1"
"@abp/utils" "~5.1.1"
"@abp/datatables.net-bs5@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.0.1.tgz#b8afa2255e374c86c50e57bd57c2b36a86d6a890"
integrity sha512-1fuCk+K4xW3XnDFo2+kPXHMoOTol4HLRcWVRELjoBQ5YbTxEPsbrhfNUeUsECDAmkxoqY7G3MEdtIVwmy5NPpg==
"@abp/datatables.net-bs5@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.1.1.tgz#c044d00f8072fba9a8de02c0847f6c969abd712f"
integrity sha512-5TQaciBoDA2Lm9SQhK+HB/k7gvQAX+xomz/hOoWckKHv4qaiaCPYYRl+a4Rh3WZeV2gGeYKjAV04BMQJEU7tyw==
dependencies:
"@abp/datatables.net" "~5.0.1"
"@abp/datatables.net" "~5.1.1"
datatables.net-bs5 "^1.10.25"
"@abp/datatables.net@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.0.1.tgz#0ce5bdf7aa5bf224b93a22758a016c50562d6569"
integrity sha512-x9D2YNtnOJRrKXi2Pwrqzz9sIOrn3o6x2c8ZxjyC54vh+SLQtLycAzQw7OyaZGdbFkudlJiCuME/FiuZvht8Og==
"@abp/datatables.net@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.1.1.tgz#6772a1ef844270a96f2b52087d74fb8becab7f46"
integrity sha512-CfNoDqP9mgMr7gMGWSnbV3vckeJ2bV8qOYq2TciMCugta8yfGC0uLkwQQSpkKJPfyXsd9sv49EppQdZBu8zfaQ==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
datatables.net "^1.10.21"
"@abp/font-awesome@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.0.1.tgz#661753403499925661f880c53214841dd34f5210"
integrity sha512-C+alReNvHZzST55ITBTyFqhdTehPo5ondzfqc9QlyB3Kwk1DIq0CaLqfS2xU5glYGDSqKi7xfkyQnJdwu2hKRA==
"@abp/font-awesome@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.1.1.tgz#49e7a7852cb8f83d8f6b9e247c60c1d7e183338c"
integrity sha512-pBVm+0ZdxMbFxYmH+ye8Y0t+Bo+7x3y1PYYb1NGgZMTh2ru9//gyPnz6Ui7yUH3NlIxoC70i1S7Vfil6GlLfWQ==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.0.1.tgz#20fa51946f68a7acd6ef3dd3d8d1349307f681b4"
integrity sha512-Q7GG0+XFXs7pDoa4p3r7vm8+sUh5ohwovedPNVghtX8Rm2I1sfVfJKamPr24PCAyJcFVntU1WCt/CngneES3pw==
"@abp/jquery-form@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.1.1.tgz#de5c2272182eda101f41c35947ad996225b9e3e3"
integrity sha512-eC514cnCUoZCy/sMqnnFg2XlKILFqfaFeL9FRq0/ejnN3P5V393UaL5zelJGwkTrUQtYuhQyooyVboBe5K43oQ==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.0.1.tgz#50798d3c087d0b103944b3a9e7c39a1f51db9fdc"
integrity sha512-w5SAYB0EZRbOhIFcCUXWvoGB/dWj3zyQOarbvzJ9LelgrXvvoissaaSSqq6BySjr1UigIWBCVuruAQssizmXBQ==
"@abp/jquery-validation-unobtrusive@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.1.1.tgz#f89f13d292cd733a0853347b69c4e73cc6cacc01"
integrity sha512-tD9QI+LHZUkBalUktp/r/rMrraJYf65sEMopUUYfamW6k2Ens6hXZTkpISjuxp4hAo+pNgqaMAwOEY8PlVBISg==
dependencies:
"@abp/jquery-validation" "~5.0.1"
"@abp/jquery-validation" "~5.1.1"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.0.1.tgz#5932060d1fdf04a81e998caac959188aefdf1669"
integrity sha512-T5p0U2cWh6Jov55AiUxJYRw92L6ubFXfqL0EkaePV5AnoetVXheluhq9gQAKnwVAqtc/3Rxkr/lO047catUkjw==
"@abp/jquery-validation@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.1.1.tgz#926ec0ba268a4877e409f97ff80f5d97be7d4a88"
integrity sha512-Jp2Q3TWRrt8rYehak5qp1VbInVBFc+/Zf7DtHoQJAC/dl3rfbEe9oJHGv3hiPTXt8/20HzIOnVOk8hk9BuCeSQ==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
jquery-validation "^1.19.2"
"@abp/jquery@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.0.1.tgz#1522ba1e0c488bffdc30a230ab35e225ae32d028"
integrity sha512-AacK4cy/RpzBfRYf7Jjn+TmVm72TW0jEjRoQ3TOXmlOrunRph05mQm72Ux2o8+Z1lOwxJKRz5gKSbRTfa6Tgpw==
"@abp/jquery@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.1.1.tgz#aaaa5d258aef2d73150514d24016bfec17548d79"
integrity sha512-cYbEBgrMefUPQOP/YMNlimQ6xfC9jjQLZpZZrDwfoTOiVXL/I+4NoYSopsPS4bZN0zqp/c61IOTzx2hFBoWsQg==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
jquery "~3.6.0"
"@abp/lodash@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.0.1.tgz#ad22895772ce65e52941dddb84d0a7d26c521d59"
integrity sha512-r1QqZCXfDd0YQnE4MkcY291H5jWFdZtGeYmwjIkn7aeOZ0PP9qsDPkWTwPwbpfmnz4DhmIdO5a1rveWz/J5ZwQ==
"@abp/lodash@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.1.1.tgz#45fa137f4bd9c26553b4cd8f95bf156e8dd48350"
integrity sha512-lPfl2VRZxYysoILMkg8fcsD4pwCJHNp8si/iQxcDBfez1Cky0jKLcEkv5SIE81jfEhVCjNAC+xdSEgdV/2Z3Rg==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
lodash "^4.17.15"
"@abp/luxon@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.0.1.tgz#7930e30db60e63b486a51030c60e09b54bcb3867"
integrity sha512-cXbnyAI9Gn2bZBQuCN46UFOkzb+djA3LMgpeMlTTv0aA87PrjzT60EPQ4a9FLovESqNnblaQ9Je43QwoGH8kZA==
"@abp/luxon@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.1.1.tgz#e5e39b4edb0cd210bb6ad939af470cb0b40f5ecd"
integrity sha512-mpB17+mR/EPRoHRsZ146OLtPM+RnjIpAsFWb8cePqGgUBji6PvlfcxBvU+eCpaTIlxwXQKwjUa83NNXTlAcbXw==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.0.1.tgz#268ec30eef8ba72a0c8cb997e55d48a1508b2719"
integrity sha512-mqF6OizoWp6kg5pztNfF78+mbfyX3JAXDfv+ZUCvjtAqllIzyOUIqRSXULDkAcDeCC1+PluRsd+uSltIppC5hA==
"@abp/malihu-custom-scrollbar-plugin@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.1.1.tgz#2389f4d1283756c689e09d8660dfe9ec3c33a84d"
integrity sha512-J+rMAccHv7zqb7KwMXhGkEzcpJM6vP1xDThijIh/4lBUypWf8cA+vXbYvono2e9AhLfldbNafIgvRNFJx8XE9w==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.0.1.tgz#644c46c7c942a6b9d36bc76c7132f32ad577933b"
integrity sha512-FHVqEebQS3XiYn5TMEhGaQJOAYnPqxivKpeOB0F0F2bEDGqt3OXh05KcQBOm+sDSScq3c7T7HLr9mMzlYtyHXw==
"@abp/select2@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.1.1.tgz#983d9cc3715a71016aea28eecb75ea63a80253b0"
integrity sha512-qrJb6JpwgTVSgkQhPEdr/6INbh5yb4txlhI63Z0oDpayIJEA2+DSFRPVfnwJ9vOULyAA1/DMJfZGzcO9dWmFbw==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
select2 "^4.0.13"
"@abp/sweetalert2@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.0.1.tgz#acf2acfc04619c7907237238bfaeb63f2d75fb22"
integrity sha512-CPqXIaHK7Ff6i8gNhxoZ9r3te9LIEiDCUpdHNtgRVMCaLbywfkiLyirlfRIB6lxRWSw8BZ+M/azdp5uzidW8Vw==
"@abp/sweetalert2@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.1.1.tgz#b254667a44feb7ec21a621fd6b8e9613985c7480"
integrity sha512-oLzanHOU24weeUC2jw2RBu0WrJR2tphpIu5Y2HySWOtaFVY/os9ih98oj1f9qumnoklx0FofrcQzYMrhF5c8jg==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
sweetalert2 "^11.0.18"
"@abp/timeago@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.0.1.tgz#09ca6302304de09baa5ac8c72b950515ab0d0451"
integrity sha512-6onXho8R6eiWfncONZFBn18OwgQPKIaRM73rVevpRGJTf2pylcHtCp4uHGsoqgCc+TQU7FyoKTTkg4lfvCQa0A==
"@abp/timeago@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.1.1.tgz#bf3645746b49696c829f6f80b7f8478ccde88a82"
integrity sha512-r0lTsFG54G27pzBLbkAT2ZX3agR5kY5Up7UKqX+PCray30yTAed+MVvBqjNkRuRoDmPOcI/2hm8pmx8jMgUa3g==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
timeago "^1.6.7"
"@abp/toastr@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.0.1.tgz#a3959df1de0c4640fabf508da9ccd3ed37ae2b03"
integrity sha512-ndL1uj2ce4PbGDzxh+QCIWYu+GAmW1Xwma4aJcq5zKo+xhlLJJnTe6QFGKr7wSsTVZMB7z1Pp2olvXH6an82+g==
"@abp/toastr@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.1.1.tgz#1acec48e00dbdfc88b0083b30be6b4848cbf35c6"
integrity sha512-SKHqpDnvpTTFPoIk9wnOAvA0VcITA6LzW6nbQjjrmmXNtkrwMIY+OZYv/flcDhTD2vKsb6TwWdJ93Z3ulhLQyw==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
toastr "^2.1.4"
"@abp/utils@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.0.1.tgz#57934383004a21172bf7e08130813c08946894fb"
integrity sha512-WLCWe7iJ8krxsz8Z7E+8GDaGZuG/6PZDdqPcMIh95opi0kvcLxb+mjPXXpiXdtFzW7O09a+NaNOxorsEFxjoKw==
"@abp/utils@~5.1.1":
version "5.1.10"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.1.10.tgz#4512d09d374503c33872b7f68d8d3bc9c00f7ad9"
integrity sha512-M6cTrx9vneyo4xNcHhMdtabajRWORs720zqaAnaIRfQP5YW60bEZZcUW0GgDTjLJ7Bb0A08A6yt4+OHoJTmpgQ==
dependencies:
just-compare "^1.3.0"

4
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json

@ -3,8 +3,8 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^5.0.1",
"@abp/prismjs": "^5.0.1"
"@abp/aspnetcore.mvc.ui.theme.basic": "^5.1.1",
"@abp/prismjs": "^5.1.1"
},
"devDependencies": {}
}

10
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/jquery/abp.jquery.js

@ -205,14 +205,16 @@ var abp = abp || {};
handleAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
var messagePromise = null;
var responseJSON = jqXHR.responseJSON ? jqXHR.responseJSON : JSON.parse(jqXHR.responseText);
if (userOptions.abpHandleError !== false) {
messagePromise = abp.ajax.showError(jqXHR.responseJSON.error);
messagePromise = abp.ajax.showError(responseJSON.error);
}
abp.ajax.logError(jqXHR.responseJSON.error);
abp.ajax.logError(responseJSON.error);
$dfd && $dfd.reject(jqXHR.responseJSON.error, jqXHR);
userOptions.error && userOptions.error(jqXHR.responseJSON.error, jqXHR);
$dfd && $dfd.reject(responseJSON.error, jqXHR);
userOptions.error && userOptions.error(responseJSON.error, jqXHR);
if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
abp.ajax.handleUnAuthorizedRequest(messagePromise);

256
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.0.1.tgz#884a4bc9ea043654891be56cd7e7c7bbf9bbad8c"
integrity sha512-JGTQyg3Zyfda84yg/Geq6rGuBN2SX4gIOaFL2h8BX9bA8CVuBC+zcwfO1bBsP89xfTyPvdSAGBvSfhCjPwsukQ==
"@abp/aspnetcore.mvc.ui.theme.basic@^5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.1.1.tgz#cd3fd659aa27eb3a348db6aa30eed2688c913522"
integrity sha512-PeJ4LlS8zZzKUh9y1Jj3KCo+KcSUtJm8KYbmueMuJgbtSq07uvVbPt2E/my1gOl58JvRTPeonO14PtIPL31faA==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~5.0.1"
"@abp/aspnetcore.mvc.ui.theme.shared" "~5.1.1"
"@abp/aspnetcore.mvc.ui.theme.shared@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.0.1.tgz#77a4900424603e0be048f3507aa852701f3139a2"
integrity sha512-mn9HEOHBkmBr7d/VUt0bfg9K58IyRDb7j3ZiDoHo263WLXJkf0+C7MEbv/zxfDHW4NeztsNCd3ugA7PdTxPzmA==
dependencies:
"@abp/aspnetcore.mvc.ui" "~5.0.1"
"@abp/bootstrap" "~5.0.1"
"@abp/bootstrap-datepicker" "~5.0.1"
"@abp/datatables.net-bs5" "~5.0.1"
"@abp/font-awesome" "~5.0.1"
"@abp/jquery-form" "~5.0.1"
"@abp/jquery-validation-unobtrusive" "~5.0.1"
"@abp/lodash" "~5.0.1"
"@abp/luxon" "~5.0.1"
"@abp/malihu-custom-scrollbar-plugin" "~5.0.1"
"@abp/select2" "~5.0.1"
"@abp/sweetalert2" "~5.0.1"
"@abp/timeago" "~5.0.1"
"@abp/toastr" "~5.0.1"
"@abp/aspnetcore.mvc.ui@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.0.1.tgz#f5aa4e0dcc10878f590e30836887f3f9861e91e3"
integrity sha512-bN15UcNhTqeo0RXlIYws7Jd8ZfSBsVM6Y5wiAqbq1Q3Lvs1uLmryhZpn6sHmKw2Z3Lnhec7VjnZN0FwNpzEqUw==
"@abp/aspnetcore.mvc.ui.theme.shared@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.1.1.tgz#c5c77ccb44c32a073d59d559db72d852484e6a38"
integrity sha512-/cqeWfBdJQuMlSObdSH+IbrJhXuPtwLyHIHJt0LmEGeawAQfHSRQjp5ZaezIbcLHB7ATC3W9yiX3unMyQMWDrg==
dependencies:
"@abp/aspnetcore.mvc.ui" "~5.1.1"
"@abp/bootstrap" "~5.1.1"
"@abp/bootstrap-datepicker" "~5.1.1"
"@abp/datatables.net-bs5" "~5.1.1"
"@abp/font-awesome" "~5.1.1"
"@abp/jquery-form" "~5.1.1"
"@abp/jquery-validation-unobtrusive" "~5.1.1"
"@abp/lodash" "~5.1.1"
"@abp/luxon" "~5.1.1"
"@abp/malihu-custom-scrollbar-plugin" "~5.1.1"
"@abp/select2" "~5.1.1"
"@abp/sweetalert2" "~5.1.1"
"@abp/timeago" "~5.1.1"
"@abp/toastr" "~5.1.1"
"@abp/aspnetcore.mvc.ui@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.1.1.tgz#507acc3edc1067dd2f1e5ec3b21bc5ad5946d7c5"
integrity sha512-3nv/r5IFzic6ryl9d4FW/iuto7sJAJidx2UGorhcoMbmxL4x6HCKz81oj1qQhvnunyCi/UfUPUCB5dWsa3A2IQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,162 +41,162 @@
merge-stream "^2.0.0"
micromatch "^4.0.2"
"@abp/bootstrap-datepicker@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.0.1.tgz#52116a154e343d84c87257ad1ef10b54012f4c33"
integrity sha512-ZJWaZKzGzshBAfyBqaUScfWqeBVfWGbZIwIplF8VKtDGcyI8R54bqDsydhS88CCnolRz4+tfq3QY6yAXrUEKAw==
"@abp/bootstrap-datepicker@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.1.1.tgz#1e546c889206bde155338063b7e0bf92beab9457"
integrity sha512-oYvyWjoXFuTvUDmSh2kpRkwdF1OyNYuyr1g/7QeCvZO/gCQZ2wWB5TfUp3j3beQntk1HV7frfuTyzodELOKBRg==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.0.1.tgz#d542a8fd7151e22eda1643e313a67f9892c50533"
integrity sha512-wyVAp6a4OIwlqK7AZozs7wpsBZgzG55EKeChBBfUXloJPuirQHxccFNE41aAYWfKur+wj25WD5NBnzFuKyNYiQ==
"@abp/bootstrap@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.1.1.tgz#f8bc53ead0aaf21b665b0bc7f59d2fc2422d6ab8"
integrity sha512-J69hA4zOHtNoZ+4IbvhRm/WbLuPwQ5zFLnI7Iz5YlEaXPnqmyI4hkWinyEGj0DwTzdnUUh7VUKk3khFdm4/9uQ==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
bootstrap "^5.1.0"
bootstrap-v4-rtl "4.6.0-1"
"@abp/clipboard@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.0.1.tgz#1730d4faa7c2fd218369d7963d15c8c6df49f588"
integrity sha512-e6QMRKk4okl0UW6RbUqGF0kPc5tbpZZVYw0RQm3gpZm3W4BZ6ZEU5DDoirEBX6Rjemx/yle8RaBBXXSjmD+/VA==
"@abp/clipboard@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.1.1.tgz#840da09d6a36ca7aed9d93514135d75bf61be988"
integrity sha512-atGPqGLkQRMgU7hy6w1OPULVQ0eUggTLkAkfB9fueuobu6+T8HyOX4La3FdDem2+dTu1RfODuOo9qwg/DJWa1g==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
clipboard "^2.0.6"
"@abp/core@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.0.1.tgz#904fa2c22bcbf42deb56abf772c3a53362807a2f"
integrity sha512-QzX35Oa+Vncu2OP1tXvGjAVFznmD1tZRn4tlDQgn36B2MU06UEO0JSx7JVedPvhzQZceUe5+WWMfuYNM2xeBTw==
"@abp/core@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.1.1.tgz#91d67d6844947e84eee9603fe72d64c0f46d3e92"
integrity sha512-whbkIGQt6bFqjnciFhRjr6fRE7gC6nwORfcof68C5ylZozQJ7JHdLluPeSrU/dpfng+OTBRFdhS3CC8pC7+CjA==
dependencies:
"@abp/utils" "~5.0.1"
"@abp/utils" "~5.1.1"
"@abp/datatables.net-bs5@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.0.1.tgz#b8afa2255e374c86c50e57bd57c2b36a86d6a890"
integrity sha512-1fuCk+K4xW3XnDFo2+kPXHMoOTol4HLRcWVRELjoBQ5YbTxEPsbrhfNUeUsECDAmkxoqY7G3MEdtIVwmy5NPpg==
"@abp/datatables.net-bs5@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.1.1.tgz#c044d00f8072fba9a8de02c0847f6c969abd712f"
integrity sha512-5TQaciBoDA2Lm9SQhK+HB/k7gvQAX+xomz/hOoWckKHv4qaiaCPYYRl+a4Rh3WZeV2gGeYKjAV04BMQJEU7tyw==
dependencies:
"@abp/datatables.net" "~5.0.1"
"@abp/datatables.net" "~5.1.1"
datatables.net-bs5 "^1.10.25"
"@abp/datatables.net@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.0.1.tgz#0ce5bdf7aa5bf224b93a22758a016c50562d6569"
integrity sha512-x9D2YNtnOJRrKXi2Pwrqzz9sIOrn3o6x2c8ZxjyC54vh+SLQtLycAzQw7OyaZGdbFkudlJiCuME/FiuZvht8Og==
"@abp/datatables.net@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.1.1.tgz#6772a1ef844270a96f2b52087d74fb8becab7f46"
integrity sha512-CfNoDqP9mgMr7gMGWSnbV3vckeJ2bV8qOYq2TciMCugta8yfGC0uLkwQQSpkKJPfyXsd9sv49EppQdZBu8zfaQ==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
datatables.net "^1.10.21"
"@abp/font-awesome@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.0.1.tgz#661753403499925661f880c53214841dd34f5210"
integrity sha512-C+alReNvHZzST55ITBTyFqhdTehPo5ondzfqc9QlyB3Kwk1DIq0CaLqfS2xU5glYGDSqKi7xfkyQnJdwu2hKRA==
"@abp/font-awesome@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.1.1.tgz#49e7a7852cb8f83d8f6b9e247c60c1d7e183338c"
integrity sha512-pBVm+0ZdxMbFxYmH+ye8Y0t+Bo+7x3y1PYYb1NGgZMTh2ru9//gyPnz6Ui7yUH3NlIxoC70i1S7Vfil6GlLfWQ==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.0.1.tgz#20fa51946f68a7acd6ef3dd3d8d1349307f681b4"
integrity sha512-Q7GG0+XFXs7pDoa4p3r7vm8+sUh5ohwovedPNVghtX8Rm2I1sfVfJKamPr24PCAyJcFVntU1WCt/CngneES3pw==
"@abp/jquery-form@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.1.1.tgz#de5c2272182eda101f41c35947ad996225b9e3e3"
integrity sha512-eC514cnCUoZCy/sMqnnFg2XlKILFqfaFeL9FRq0/ejnN3P5V393UaL5zelJGwkTrUQtYuhQyooyVboBe5K43oQ==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.0.1.tgz#50798d3c087d0b103944b3a9e7c39a1f51db9fdc"
integrity sha512-w5SAYB0EZRbOhIFcCUXWvoGB/dWj3zyQOarbvzJ9LelgrXvvoissaaSSqq6BySjr1UigIWBCVuruAQssizmXBQ==
"@abp/jquery-validation-unobtrusive@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.1.1.tgz#f89f13d292cd733a0853347b69c4e73cc6cacc01"
integrity sha512-tD9QI+LHZUkBalUktp/r/rMrraJYf65sEMopUUYfamW6k2Ens6hXZTkpISjuxp4hAo+pNgqaMAwOEY8PlVBISg==
dependencies:
"@abp/jquery-validation" "~5.0.1"
"@abp/jquery-validation" "~5.1.1"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.0.1.tgz#5932060d1fdf04a81e998caac959188aefdf1669"
integrity sha512-T5p0U2cWh6Jov55AiUxJYRw92L6ubFXfqL0EkaePV5AnoetVXheluhq9gQAKnwVAqtc/3Rxkr/lO047catUkjw==
"@abp/jquery-validation@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.1.1.tgz#926ec0ba268a4877e409f97ff80f5d97be7d4a88"
integrity sha512-Jp2Q3TWRrt8rYehak5qp1VbInVBFc+/Zf7DtHoQJAC/dl3rfbEe9oJHGv3hiPTXt8/20HzIOnVOk8hk9BuCeSQ==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
jquery-validation "^1.19.2"
"@abp/jquery@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.0.1.tgz#1522ba1e0c488bffdc30a230ab35e225ae32d028"
integrity sha512-AacK4cy/RpzBfRYf7Jjn+TmVm72TW0jEjRoQ3TOXmlOrunRph05mQm72Ux2o8+Z1lOwxJKRz5gKSbRTfa6Tgpw==
"@abp/jquery@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.1.1.tgz#aaaa5d258aef2d73150514d24016bfec17548d79"
integrity sha512-cYbEBgrMefUPQOP/YMNlimQ6xfC9jjQLZpZZrDwfoTOiVXL/I+4NoYSopsPS4bZN0zqp/c61IOTzx2hFBoWsQg==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
jquery "~3.6.0"
"@abp/lodash@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.0.1.tgz#ad22895772ce65e52941dddb84d0a7d26c521d59"
integrity sha512-r1QqZCXfDd0YQnE4MkcY291H5jWFdZtGeYmwjIkn7aeOZ0PP9qsDPkWTwPwbpfmnz4DhmIdO5a1rveWz/J5ZwQ==
"@abp/lodash@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.1.1.tgz#45fa137f4bd9c26553b4cd8f95bf156e8dd48350"
integrity sha512-lPfl2VRZxYysoILMkg8fcsD4pwCJHNp8si/iQxcDBfez1Cky0jKLcEkv5SIE81jfEhVCjNAC+xdSEgdV/2Z3Rg==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
lodash "^4.17.15"
"@abp/luxon@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.0.1.tgz#7930e30db60e63b486a51030c60e09b54bcb3867"
integrity sha512-cXbnyAI9Gn2bZBQuCN46UFOkzb+djA3LMgpeMlTTv0aA87PrjzT60EPQ4a9FLovESqNnblaQ9Je43QwoGH8kZA==
"@abp/luxon@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.1.1.tgz#e5e39b4edb0cd210bb6ad939af470cb0b40f5ecd"
integrity sha512-mpB17+mR/EPRoHRsZ146OLtPM+RnjIpAsFWb8cePqGgUBji6PvlfcxBvU+eCpaTIlxwXQKwjUa83NNXTlAcbXw==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.0.1.tgz#268ec30eef8ba72a0c8cb997e55d48a1508b2719"
integrity sha512-mqF6OizoWp6kg5pztNfF78+mbfyX3JAXDfv+ZUCvjtAqllIzyOUIqRSXULDkAcDeCC1+PluRsd+uSltIppC5hA==
"@abp/malihu-custom-scrollbar-plugin@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.1.1.tgz#2389f4d1283756c689e09d8660dfe9ec3c33a84d"
integrity sha512-J+rMAccHv7zqb7KwMXhGkEzcpJM6vP1xDThijIh/4lBUypWf8cA+vXbYvono2e9AhLfldbNafIgvRNFJx8XE9w==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/prismjs@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.0.1.tgz#5154eeaeffed5c0cde6cfbf9891cc78ff6d5e309"
integrity sha512-JUrZleJPQBT0RHk3nRcNkEEib98p3l0Vhr8Ip4zrFbbx4uUNCkucHrZb1sBodPjWVLhi+BI2z7bMrkUe4eSiHw==
"@abp/prismjs@^5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.1.1.tgz#35f7527e330b1aed2310ea67061cfc77025e2c88"
integrity sha512-pDkmUGsay+8A0OVHZlrYMLiv+C0SeklQZHT/hr03/iVmc9bOkFhHSy6AiSfntTOAVJrs+bWdu6tRlD9Ni0L8Yg==
dependencies:
"@abp/clipboard" "~5.0.1"
"@abp/core" "~5.0.1"
"@abp/clipboard" "~5.1.1"
"@abp/core" "~5.1.1"
prismjs "^1.20.0"
"@abp/select2@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.0.1.tgz#644c46c7c942a6b9d36bc76c7132f32ad577933b"
integrity sha512-FHVqEebQS3XiYn5TMEhGaQJOAYnPqxivKpeOB0F0F2bEDGqt3OXh05KcQBOm+sDSScq3c7T7HLr9mMzlYtyHXw==
"@abp/select2@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.1.1.tgz#983d9cc3715a71016aea28eecb75ea63a80253b0"
integrity sha512-qrJb6JpwgTVSgkQhPEdr/6INbh5yb4txlhI63Z0oDpayIJEA2+DSFRPVfnwJ9vOULyAA1/DMJfZGzcO9dWmFbw==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
select2 "^4.0.13"
"@abp/sweetalert2@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.0.1.tgz#acf2acfc04619c7907237238bfaeb63f2d75fb22"
integrity sha512-CPqXIaHK7Ff6i8gNhxoZ9r3te9LIEiDCUpdHNtgRVMCaLbywfkiLyirlfRIB6lxRWSw8BZ+M/azdp5uzidW8Vw==
"@abp/sweetalert2@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.1.1.tgz#b254667a44feb7ec21a621fd6b8e9613985c7480"
integrity sha512-oLzanHOU24weeUC2jw2RBu0WrJR2tphpIu5Y2HySWOtaFVY/os9ih98oj1f9qumnoklx0FofrcQzYMrhF5c8jg==
dependencies:
"@abp/core" "~5.0.1"
"@abp/core" "~5.1.1"
sweetalert2 "^11.0.18"
"@abp/timeago@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.0.1.tgz#09ca6302304de09baa5ac8c72b950515ab0d0451"
integrity sha512-6onXho8R6eiWfncONZFBn18OwgQPKIaRM73rVevpRGJTf2pylcHtCp4uHGsoqgCc+TQU7FyoKTTkg4lfvCQa0A==
"@abp/timeago@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.1.1.tgz#bf3645746b49696c829f6f80b7f8478ccde88a82"
integrity sha512-r0lTsFG54G27pzBLbkAT2ZX3agR5kY5Up7UKqX+PCray30yTAed+MVvBqjNkRuRoDmPOcI/2hm8pmx8jMgUa3g==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
timeago "^1.6.7"
"@abp/toastr@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.0.1.tgz#a3959df1de0c4640fabf508da9ccd3ed37ae2b03"
integrity sha512-ndL1uj2ce4PbGDzxh+QCIWYu+GAmW1Xwma4aJcq5zKo+xhlLJJnTe6QFGKr7wSsTVZMB7z1Pp2olvXH6an82+g==
"@abp/toastr@~5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.1.1.tgz#1acec48e00dbdfc88b0083b30be6b4848cbf35c6"
integrity sha512-SKHqpDnvpTTFPoIk9wnOAvA0VcITA6LzW6nbQjjrmmXNtkrwMIY+OZYv/flcDhTD2vKsb6TwWdJ93Z3ulhLQyw==
dependencies:
"@abp/jquery" "~5.0.1"
"@abp/jquery" "~5.1.1"
toastr "^2.1.4"
"@abp/utils@~5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.0.1.tgz#57934383004a21172bf7e08130813c08946894fb"
integrity sha512-WLCWe7iJ8krxsz8Z7E+8GDaGZuG/6PZDdqPcMIh95opi0kvcLxb+mjPXXpiXdtFzW7O09a+NaNOxorsEFxjoKw==
"@abp/utils@~5.1.1":
version "5.1.10"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.1.10.tgz#4512d09d374503c33872b7f68d8d3bc9c00f7ad9"
integrity sha512-M6cTrx9vneyo4xNcHhMdtabajRWORs720zqaAnaIRfQP5YW60bEZZcUW0GgDTjLJ7Bb0A08A6yt4+OHoJTmpgQ==
dependencies:
just-compare "^1.3.0"

4
modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json

@ -50,6 +50,10 @@
"BlobStoring.Database.Host.ConsoleApp.ConsoleApp": {
"path": "host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json",
"folder": "host/BlobStoring.Database.Host.ConsoleApp/src"
},
"Volo.Abp.BlobStoring.Database.Installer": {
"path": "src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.abppkg.json",
"folder": "src"
}
}
}

11
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.analyze.json

@ -0,0 +1,11 @@
{
"name": "Volo.Abp.BlobStoring.Database.Domain.Shared",
"hash": "eed9ff456824aac8ba0fe73baa6cf288",
"contents": [
{
"namespace": "Volo.Abp.BlobStoring.Database",
"contentType": "abpModule",
"name": "BlobStoringDatabaseDomainSharedModule"
}
]
}

59
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.analyze.json

@ -0,0 +1,59 @@
{
"name": "Volo.Abp.BlobStoring.Database.Domain",
"hash": "744c78df1c9addf5e9f6657295f0529c",
"contents": [
{
"namespace": "Volo.Abp.BlobStoring.Database",
"contentType": "abpModule",
"name": "BlobStoringDatabaseDomainModule"
},
{
"namespace": "Volo.Abp.BlobStoring.Database",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [],
"navigationProperties": [],
"contentType": "aggregateRoot",
"name": "DatabaseBlob"
},
{
"namespace": "Volo.Abp.BlobStoring.Database",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [],
"navigationProperties": [],
"contentType": "aggregateRoot",
"name": "DatabaseBlobContainer"
},
{
"namespace": "Volo.Abp.BlobStoring.Database",
"summary": null,
"entityModel": {
"namespace": "Volo.Abp.BlobStoring.Database",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [],
"navigationProperties": [],
"contentType": "entity",
"name": "DatabaseBlobContainer"
},
"contentType": "repositoryInterface",
"name": "IDatabaseBlobContainerRepository"
},
{
"namespace": "Volo.Abp.BlobStoring.Database",
"summary": null,
"entityModel": {
"namespace": "Volo.Abp.BlobStoring.Database",
"primaryKeyType": "Guid",
"summary": null,
"collectionProperties": [],
"navigationProperties": [],
"contentType": "entity",
"name": "DatabaseBlob"
},
"contentType": "repositoryInterface",
"name": "IDatabaseBlobRepository"
}
]
}

29
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.analyze.json

@ -0,0 +1,29 @@
{
"name": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore",
"hash": "91e3a724f35375f79d9505ca0e950b9e",
"contents": [
{
"namespace": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore",
"contentType": "abpModule",
"name": "BlobStoringDatabaseEntityFrameworkCoreModule"
},
{
"namespace": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore",
"connectionStringName": "AbpBlobStoring",
"databaseTables": [
{
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlob",
"contentType": "databaseTable",
"name": "AbpBlobs"
},
{
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlobContainer",
"contentType": "databaseTable",
"name": "AbpBlobContainers"
}
],
"contentType": "efCoreDbContext",
"name": "BlobStoringDbContext"
}
]
}

1
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.abppkg.json

@ -0,0 +1 @@
{}

29
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.analyze.json

@ -0,0 +1,29 @@
{
"name": "Volo.Abp.BlobStoring.Database.MongoDB",
"hash": "4c911e5e8a2e8c4630d12f394a157819",
"contents": [
{
"namespace": "Volo.Abp.BlobStoring.Database.MongoDB",
"contentType": "abpModule",
"name": "BlobStoringDatabaseMongoDbModule"
},
{
"namespace": "Volo.Abp.BlobStoring.Database.MongoDB",
"connectionStringName": "AbpBlobStoring",
"databaseCollections": [
{
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlobContainer",
"contentType": "databaseCollection",
"name": "AbpBlobContainers"
},
{
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlob",
"contentType": "databaseCollection",
"name": "AbpBlobs"
}
],
"contentType": "mongoDbContext",
"name": "BlobStoringMongoDbContext"
}
]
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save