From 1b58c0a630785100c25dba4150a9ecf59c3879db Mon Sep 17 00:00:00 2001 From: jxnkwlp Date: Fri, 7 Jul 2023 11:27:51 +0800 Subject: [PATCH] initial --- .gitattributes | 1 + .gitignore | 265 ++ NuGet.Config | 5 + Sample.sln | 157 + Sample.sln.DotSettings | 23 + host/.prettierrc | 5 + host/common.props | 19 + .../SamplePermissionDefinitionProvider.cs | 20 + .../Permissions/SamplePermissions.cs | 9 + .../Sample.Application.Contracts.csproj | 25 + .../SampleApplicationContractsModule.cs | 28 + .../SampleDtoExtensions.cs | 28 + .../Properties/AssemblyInfo.cs | 2 + .../Sample.Application.csproj | 25 + .../Sample.Application/SampleAppService.cs | 17 + .../SampleApplicationAutoMapperProfile.cs | 13 + .../SampleApplicationModule.cs | 31 + .../DbMigratorHostedService.cs | 51 + host/src/Sample.DbMigrator/Logs/logs.txt | 6 + host/src/Sample.DbMigrator/Program.cs | 41 + .../Properties/launchSettings.json | 8 + .../Sample.DbMigrator.csproj | 45 + .../SampleDbMigratorModule.cs | 15 + host/src/Sample.DbMigrator/appsettings.json | 27 + .../appsettings.secrets.json | 2 + .../Localization/Sample/ar.json | 8 + .../Localization/Sample/cs.json | 8 + .../Localization/Sample/de.json | 8 + .../Localization/Sample/en-GB.json | 8 + .../Localization/Sample/en.json | 8 + .../Localization/Sample/es.json | 8 + .../Localization/Sample/fi.json | 8 + .../Localization/Sample/fr.json | 8 + .../Localization/Sample/hi.json | 8 + .../Localization/Sample/hr.json | 8 + .../Localization/Sample/hu.json | 8 + .../Localization/Sample/is.json | 8 + .../Localization/Sample/it.json | 8 + .../Localization/Sample/nl.json | 8 + .../Localization/Sample/pl-PL.json | 8 + .../Localization/Sample/pt-BR.json | 8 + .../Localization/Sample/ro-RO.json | 8 + .../Localization/Sample/ru.json | 8 + .../Localization/Sample/sk.json | 8 + .../Localization/Sample/sl.json | 8 + .../Localization/Sample/tr.json | 8 + .../Localization/Sample/vi.json | 8 + .../Localization/Sample/zh-Hans.json | 8 + .../Localization/Sample/zh-Hant.json | 8 + .../Localization/SampleResource.cs | 9 + .../MultiTenancy/MultiTenancyConsts.cs | 10 + .../Sample.Domain.Shared.csproj | 32 + .../SampleDomainErrorCodes.cs | 6 + .../SampleDomainSharedModule.cs | 58 + .../SampleGlobalFeatureConfigurator.cs | 22 + .../SampleModuleExtensionConfigurator.cs | 73 + .../Data/ISampleDbSchemaMigrator.cs | 8 + .../Data/NullSampleDbSchemaMigrator.cs | 15 + .../Data/SampleDbMigrationService.cs | 218 ++ .../OpenIddictDataSeedContributor.cs | 405 +++ .../Sample.Domain/Properties/AssemblyInfo.cs | 3 + host/src/Sample.Domain/Sample.Domain.csproj | 28 + host/src/Sample.Domain/SampleConsts.cs | 8 + host/src/Sample.Domain/SampleDomainModule.cs | 68 + .../SampleSettingDefinitionProvider.cs | 12 + .../Sample.Domain/Settings/SampleSettings.cs | 9 + ...tityFrameworkCoreSampleDbSchemaMigrator.cs | 34 + .../EntityFrameworkCore/SampleDbContext.cs | 86 + .../SampleDbContextFactory.cs | 33 + .../SampleEfCoreEntityExtensionMappings.cs | 44 + .../SampleEntityFrameworkCoreModule.cs | 54 + .../20230707030931_Initial.Designer.cs | 1870 ++++++++++++ .../Migrations/20230707030931_Initial.cs | 1084 +++++++ .../SampleDbContextModelSnapshot.cs | 1867 ++++++++++++ .../Properties/AssemblyInfo.cs | 2 + .../Sample.EntityFrameworkCore.csproj | 31 + .../Sample.HttpApi.Client.csproj | 29 + .../SampleHttpApiClientModule.cs | 38 + .../Controllers/HomeController.cs | 12 + host/src/Sample.HttpApi.Host/Program.cs | 56 + .../Properties/launchSettings.json | 27 + .../Sample.HttpApi.Host.csproj | 40 + .../SampleBrandingProvider.cs | 10 + .../SampleHttpApiHostModule.cs | 219 ++ .../abp.resourcemapping.js | 11 + .../appsettings.Development.json | 2 + host/src/Sample.HttpApi.Host/appsettings.json | 18 + .../appsettings.secrets.json | 2 + host/src/Sample.HttpApi.Host/package.json | 8 + host/src/Sample.HttpApi.Host/web.config | 18 + .../wwwroot/global-styles.css | 6 + .../logo/leptonx/logo-dark-thumbnail.png | Bin 0 -> 17592 bytes .../wwwroot/images/logo/leptonx/logo-dark.png | Bin 0 -> 47227 bytes .../logo/leptonx/logo-light-thumbnail.png | Bin 0 -> 13598 bytes .../images/logo/leptonx/logo-light.png | Bin 0 -> 38531 bytes host/src/Sample.HttpApi.Host/yarn.lock | 2574 +++++++++++++++++ .../Controllers/SampleController.cs | 14 + .../Sample.HttpApi/Models/Test/TestModel.cs | 10 + host/src/Sample.HttpApi/Sample.HttpApi.csproj | 24 + .../src/Sample.HttpApi/SampleHttpApiModule.cs | 41 + .../Sample.Application.Tests.csproj | 20 + .../SampleApplicationTestBase.cs | 6 + .../SampleApplicationTestModule.cs | 12 + .../Samples/SampleAppServiceTests.cs | 32 + .../Sample.Domain.Tests.csproj | 19 + .../SampleDomainTestBase.cs | 6 + .../SampleDomainTestModule.cs | 12 + .../Samples/SampleDomainTests.cs | 44 + .../SampleEntityFrameworkCoreTestBase.cs | 8 + .../SampleEntityFrameworkCoreTestModule.cs | 76 + .../Samples/SampleRepositoryTests.cs | 43 + .../Sample.EntityFrameworkCore.Tests.csproj | 21 + .../ClientDemoService.cs | 25 + .../ConsoleTestAppHostedService.cs | 40 + .../Program.cs | 22 + ...ample.HttpApi.Client.ConsoleTestApp.csproj | 33 + .../SampleConsoleApiClientModule.cs | 30 + .../appsettings.json | 17 + .../appsettings.secrets.json | 2 + .../Sample.TestBase/Sample.TestBase.csproj | 31 + host/test/Sample.TestBase/SampleTestBase.cs | 60 + .../Sample.TestBase/SampleTestBaseModule.cs | 52 + .../SampleTestDataSeedContributor.cs | 15 + .../Security/FakeCurrentPrincipalAccessor.cs | 25 + 124 files changed, 10959 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 NuGet.Config create mode 100644 Sample.sln create mode 100644 Sample.sln.DotSettings create mode 100644 host/.prettierrc create mode 100644 host/common.props create mode 100644 host/src/Sample.Application.Contracts/Permissions/SamplePermissionDefinitionProvider.cs create mode 100644 host/src/Sample.Application.Contracts/Permissions/SamplePermissions.cs create mode 100644 host/src/Sample.Application.Contracts/Sample.Application.Contracts.csproj create mode 100644 host/src/Sample.Application.Contracts/SampleApplicationContractsModule.cs create mode 100644 host/src/Sample.Application.Contracts/SampleDtoExtensions.cs create mode 100644 host/src/Sample.Application/Properties/AssemblyInfo.cs create mode 100644 host/src/Sample.Application/Sample.Application.csproj create mode 100644 host/src/Sample.Application/SampleAppService.cs create mode 100644 host/src/Sample.Application/SampleApplicationAutoMapperProfile.cs create mode 100644 host/src/Sample.Application/SampleApplicationModule.cs create mode 100644 host/src/Sample.DbMigrator/DbMigratorHostedService.cs create mode 100644 host/src/Sample.DbMigrator/Logs/logs.txt create mode 100644 host/src/Sample.DbMigrator/Program.cs create mode 100644 host/src/Sample.DbMigrator/Properties/launchSettings.json create mode 100644 host/src/Sample.DbMigrator/Sample.DbMigrator.csproj create mode 100644 host/src/Sample.DbMigrator/SampleDbMigratorModule.cs create mode 100644 host/src/Sample.DbMigrator/appsettings.json create mode 100644 host/src/Sample.DbMigrator/appsettings.secrets.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/ar.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/cs.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/de.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/en-GB.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/en.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/es.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/fi.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/fr.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/hi.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/hr.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/hu.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/is.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/it.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/nl.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/pl-PL.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/pt-BR.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/ro-RO.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/ru.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/sk.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/sl.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/tr.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/vi.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/zh-Hans.json create mode 100644 host/src/Sample.Domain.Shared/Localization/Sample/zh-Hant.json create mode 100644 host/src/Sample.Domain.Shared/Localization/SampleResource.cs create mode 100644 host/src/Sample.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs create mode 100644 host/src/Sample.Domain.Shared/Sample.Domain.Shared.csproj create mode 100644 host/src/Sample.Domain.Shared/SampleDomainErrorCodes.cs create mode 100644 host/src/Sample.Domain.Shared/SampleDomainSharedModule.cs create mode 100644 host/src/Sample.Domain.Shared/SampleGlobalFeatureConfigurator.cs create mode 100644 host/src/Sample.Domain.Shared/SampleModuleExtensionConfigurator.cs create mode 100644 host/src/Sample.Domain/Data/ISampleDbSchemaMigrator.cs create mode 100644 host/src/Sample.Domain/Data/NullSampleDbSchemaMigrator.cs create mode 100644 host/src/Sample.Domain/Data/SampleDbMigrationService.cs create mode 100644 host/src/Sample.Domain/OpenIddict/OpenIddictDataSeedContributor.cs create mode 100644 host/src/Sample.Domain/Properties/AssemblyInfo.cs create mode 100644 host/src/Sample.Domain/Sample.Domain.csproj create mode 100644 host/src/Sample.Domain/SampleConsts.cs create mode 100644 host/src/Sample.Domain/SampleDomainModule.cs create mode 100644 host/src/Sample.Domain/Settings/SampleSettingDefinitionProvider.cs create mode 100644 host/src/Sample.Domain/Settings/SampleSettings.cs create mode 100644 host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreSampleDbSchemaMigrator.cs create mode 100644 host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContext.cs create mode 100644 host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContextFactory.cs create mode 100644 host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEfCoreEntityExtensionMappings.cs create mode 100644 host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEntityFrameworkCoreModule.cs create mode 100644 host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.Designer.cs create mode 100644 host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.cs create mode 100644 host/src/Sample.EntityFrameworkCore/Migrations/SampleDbContextModelSnapshot.cs create mode 100644 host/src/Sample.EntityFrameworkCore/Properties/AssemblyInfo.cs create mode 100644 host/src/Sample.EntityFrameworkCore/Sample.EntityFrameworkCore.csproj create mode 100644 host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj create mode 100644 host/src/Sample.HttpApi.Client/SampleHttpApiClientModule.cs create mode 100644 host/src/Sample.HttpApi.Host/Controllers/HomeController.cs create mode 100644 host/src/Sample.HttpApi.Host/Program.cs create mode 100644 host/src/Sample.HttpApi.Host/Properties/launchSettings.json create mode 100644 host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj create mode 100644 host/src/Sample.HttpApi.Host/SampleBrandingProvider.cs create mode 100644 host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs create mode 100644 host/src/Sample.HttpApi.Host/abp.resourcemapping.js create mode 100644 host/src/Sample.HttpApi.Host/appsettings.Development.json create mode 100644 host/src/Sample.HttpApi.Host/appsettings.json create mode 100644 host/src/Sample.HttpApi.Host/appsettings.secrets.json create mode 100644 host/src/Sample.HttpApi.Host/package.json create mode 100644 host/src/Sample.HttpApi.Host/web.config create mode 100644 host/src/Sample.HttpApi.Host/wwwroot/global-styles.css create mode 100644 host/src/Sample.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark-thumbnail.png create mode 100644 host/src/Sample.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark.png create mode 100644 host/src/Sample.HttpApi.Host/wwwroot/images/logo/leptonx/logo-light-thumbnail.png create mode 100644 host/src/Sample.HttpApi.Host/wwwroot/images/logo/leptonx/logo-light.png create mode 100644 host/src/Sample.HttpApi.Host/yarn.lock create mode 100644 host/src/Sample.HttpApi/Controllers/SampleController.cs create mode 100644 host/src/Sample.HttpApi/Models/Test/TestModel.cs create mode 100644 host/src/Sample.HttpApi/Sample.HttpApi.csproj create mode 100644 host/src/Sample.HttpApi/SampleHttpApiModule.cs create mode 100644 host/test/Sample.Application.Tests/Sample.Application.Tests.csproj create mode 100644 host/test/Sample.Application.Tests/SampleApplicationTestBase.cs create mode 100644 host/test/Sample.Application.Tests/SampleApplicationTestModule.cs create mode 100644 host/test/Sample.Application.Tests/Samples/SampleAppServiceTests.cs create mode 100644 host/test/Sample.Domain.Tests/Sample.Domain.Tests.csproj create mode 100644 host/test/Sample.Domain.Tests/SampleDomainTestBase.cs create mode 100644 host/test/Sample.Domain.Tests/SampleDomainTestModule.cs create mode 100644 host/test/Sample.Domain.Tests/Samples/SampleDomainTests.cs create mode 100644 host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestBase.cs create mode 100644 host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestModule.cs create mode 100644 host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs create mode 100644 host/test/Sample.EntityFrameworkCore.Tests/Sample.EntityFrameworkCore.Tests.csproj create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/Program.cs create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/Sample.HttpApi.Client.ConsoleTestApp.csproj create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/SampleConsoleApiClientModule.cs create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.json create mode 100644 host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json create mode 100644 host/test/Sample.TestBase/Sample.TestBase.csproj create mode 100644 host/test/Sample.TestBase/SampleTestBase.cs create mode 100644 host/test/Sample.TestBase/SampleTestBaseModule.cs create mode 100644 host/test/Sample.TestBase/SampleTestDataSeedContributor.cs create mode 100644 host/test/Sample.TestBase/Security/FakeCurrentPrincipalAccessor.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c941e52 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +**/wwwroot/libs/** linguist-vendored diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..122cefe --- /dev/null +++ b/.gitignore @@ -0,0 +1,265 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# AbpSample +src/AbpSample.Web/Logs/* +src/AbpSample.Web.Host/Logs/* +src/AbpSample.AuthServer/Logs/* +src/AbpSample.HttpApi.Host/Logs/* +src/AbpSample.HttpApi.Host/Logs/* +src/AbpSample.DbMigrator/Logs/* +src/AbpSample.Blazor.Server/Logs/* +src/AbpSample.Blazor.Server.Tiered/Logs/* + +# Use abp install-libs to restore. +**/wwwroot/libs/* diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 0000000..bdc4519 --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Sample.sln b/Sample.sln new file mode 100644 index 0000000..a73f2af --- /dev/null +++ b/Sample.sln @@ -0,0 +1,157 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33723.286 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Domain", "host\src\Sample.Domain\Sample.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Application", "host\src\Sample.Application\Sample.Application.csproj", "{1A94A50E-06DC-43C1-80B5-B662820EC3EB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.EntityFrameworkCore", "host\src\Sample.EntityFrameworkCore\Sample.EntityFrameworkCore.csproj", "{C956DD76-69C8-4A9C-83EA-D17DF83340FD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "host", "host", "{CA9AC87F-097E-4F15-8393-4BC07735A5B0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Domain.Shared", "host\src\Sample.Domain.Shared\Sample.Domain.Shared.csproj", "{42F719ED-8413-4895-B5B4-5AB56079BC66}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Application.Contracts", "host\src\Sample.Application.Contracts\Sample.Application.Contracts.csproj", "{520659C8-C734-4298-A3DA-B539DB9DFC0B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.HttpApi", "host\src\Sample.HttpApi\Sample.HttpApi.csproj", "{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.HttpApi.Client", "host\src\Sample.HttpApi.Client\Sample.HttpApi.Client.csproj", "{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.DbMigrator", "host\src\Sample.DbMigrator\Sample.DbMigrator.csproj", "{AA94D832-1CCC-4715-95A9-A483F23A1A5D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.HttpApi.Host", "host\src\Sample.HttpApi.Host\Sample.HttpApi.Host.csproj", "{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{9EAC2FB6-A28A-4851-B809-BF8216AAAFE0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "file-management", "file-management", "{DB8C2DD9-8574-494D-9C22-28043410E149}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.Domain.Shared", "modules\file-management\src\Passingwind.Abp.FileManagement.Domain.Shared\Passingwind.Abp.FileManagement.Domain.Shared.csproj", "{D64C1577-4929-4B60-939E-96DE1534891A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.Domain", "modules\file-management\src\Passingwind.Abp.FileManagement.Domain\Passingwind.Abp.FileManagement.Domain.csproj", "{F2840BC7-0188-4606-9126-DADD0F5ABF7A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.Application.Contracts", "modules\file-management\src\Passingwind.Abp.FileManagement.Application.Contracts\Passingwind.Abp.FileManagement.Application.Contracts.csproj", "{BD65D04F-08D5-40C1-8C24-77CA0BACB877}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.Application", "modules\file-management\src\Passingwind.Abp.FileManagement.Application\Passingwind.Abp.FileManagement.Application.csproj", "{78040F9E-3501-4A40-82DF-00A597710F35}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.EntityFrameworkCore", "modules\file-management\src\Passingwind.Abp.FileManagement.EntityFrameworkCore\Passingwind.Abp.FileManagement.EntityFrameworkCore.csproj", "{0CE86223-D31D-4315-A1F5-87BA3EE1B844}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.MongoDB", "modules\file-management\src\Passingwind.Abp.FileManagement.MongoDB\Passingwind.Abp.FileManagement.MongoDB.csproj", "{F1C58097-4C08-4D88-8976-6B3389391481}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.HttpApi", "modules\file-management\src\Passingwind.Abp.FileManagement.HttpApi\Passingwind.Abp.FileManagement.HttpApi.csproj", "{077AA5F8-8B61-420C-A6B5-0150A66FDB34}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.HttpApi.Client", "modules\file-management\src\Passingwind.Abp.FileManagement.HttpApi.Client\Passingwind.Abp.FileManagement.HttpApi.Client.csproj", "{36E2735F-CEAB-44C8-A6D1-2CDAFF399751}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.FileManagement.Installer", "modules\file-management\src\Passingwind.Abp.FileManagement.Installer\Passingwind.Abp.FileManagement.Installer.csproj", "{BE39FD00-745B-4049-8161-FC129817CBE4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{099118E5-14DC-42A3-AC87-AECAFE06A1A9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.Build.0 = Release|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.Build.0 = Release|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.Build.0 = Release|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.Build.0 = Release|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.Build.0 = Release|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.Build.0 = Release|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.Build.0 = Release|Any CPU + {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA94D832-1CCC-4715-95A9-A483F23A1A5D}.Release|Any CPU.Build.0 = Release|Any CPU + {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.Build.0 = Release|Any CPU + {D64C1577-4929-4B60-939E-96DE1534891A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D64C1577-4929-4B60-939E-96DE1534891A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D64C1577-4929-4B60-939E-96DE1534891A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D64C1577-4929-4B60-939E-96DE1534891A}.Release|Any CPU.Build.0 = Release|Any CPU + {F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2840BC7-0188-4606-9126-DADD0F5ABF7A}.Release|Any CPU.Build.0 = Release|Any CPU + {BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD65D04F-08D5-40C1-8C24-77CA0BACB877}.Release|Any CPU.Build.0 = Release|Any CPU + {78040F9E-3501-4A40-82DF-00A597710F35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78040F9E-3501-4A40-82DF-00A597710F35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78040F9E-3501-4A40-82DF-00A597710F35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78040F9E-3501-4A40-82DF-00A597710F35}.Release|Any CPU.Build.0 = Release|Any CPU + {0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CE86223-D31D-4315-A1F5-87BA3EE1B844}.Release|Any CPU.Build.0 = Release|Any CPU + {F1C58097-4C08-4D88-8976-6B3389391481}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1C58097-4C08-4D88-8976-6B3389391481}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1C58097-4C08-4D88-8976-6B3389391481}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1C58097-4C08-4D88-8976-6B3389391481}.Release|Any CPU.Build.0 = Release|Any CPU + {077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {077AA5F8-8B61-420C-A6B5-0150A66FDB34}.Release|Any CPU.Build.0 = Release|Any CPU + {36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36E2735F-CEAB-44C8-A6D1-2CDAFF399751}.Release|Any CPU.Build.0 = Release|Any CPU + {BE39FD00-745B-4049-8161-FC129817CBE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE39FD00-745B-4049-8161-FC129817CBE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE39FD00-745B-4049-8161-FC129817CBE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE39FD00-745B-4049-8161-FC129817CBE4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {554AD327-6DBA-4F8F-96F8-81CE7A0C863F} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {1A94A50E-06DC-43C1-80B5-B662820EC3EB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {C956DD76-69C8-4A9C-83EA-D17DF83340FD} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {42F719ED-8413-4895-B5B4-5AB56079BC66} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {520659C8-C734-4298-A3DA-B539DB9DFC0B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {4164BDF7-F527-4E85-9CE6-E3C2D7426A27} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {3B5A0094-670D-4BB1-BFDD-61B88A8773DC} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {AA94D832-1CCC-4715-95A9-A483F23A1A5D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {DB8C2DD9-8574-494D-9C22-28043410E149} = {9EAC2FB6-A28A-4851-B809-BF8216AAAFE0} + {D64C1577-4929-4B60-939E-96DE1534891A} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {F2840BC7-0188-4606-9126-DADD0F5ABF7A} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {BD65D04F-08D5-40C1-8C24-77CA0BACB877} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {78040F9E-3501-4A40-82DF-00A597710F35} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {0CE86223-D31D-4315-A1F5-87BA3EE1B844} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {F1C58097-4C08-4D88-8976-6B3389391481} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {077AA5F8-8B61-420C-A6B5-0150A66FDB34} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {36E2735F-CEAB-44C8-A6D1-2CDAFF399751} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {BE39FD00-745B-4049-8161-FC129817CBE4} = {099118E5-14DC-42A3-AC87-AECAFE06A1A9} + {099118E5-14DC-42A3-AC87-AECAFE06A1A9} = {DB8C2DD9-8574-494D-9C22-28043410E149} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} + EndGlobalSection +EndGlobal diff --git a/Sample.sln.DotSettings b/Sample.sln.DotSettings new file mode 100644 index 0000000..cb0b2c9 --- /dev/null +++ b/Sample.sln.DotSettings @@ -0,0 +1,23 @@ + + True + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + Required + Required + Required + Required + False + True + False + False + True + False + False + SQL + \ No newline at end of file diff --git a/host/.prettierrc b/host/.prettierrc new file mode 100644 index 0000000..56af76b --- /dev/null +++ b/host/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "useTabs": false, + "tabWidth": 4 +} diff --git a/host/common.props b/host/common.props new file mode 100644 index 0000000..7e89c3a --- /dev/null +++ b/host/common.props @@ -0,0 +1,19 @@ + + + latest + 1.0.0 + $(NoWarn);CS1591 + app + + + + + $(NoWarn);0436 + + + + + + + + \ No newline at end of file diff --git a/host/src/Sample.Application.Contracts/Permissions/SamplePermissionDefinitionProvider.cs b/host/src/Sample.Application.Contracts/Permissions/SamplePermissionDefinitionProvider.cs new file mode 100644 index 0000000..c268d15 --- /dev/null +++ b/host/src/Sample.Application.Contracts/Permissions/SamplePermissionDefinitionProvider.cs @@ -0,0 +1,20 @@ +using Sample.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace Sample.Permissions; + +public class SamplePermissionDefinitionProvider : PermissionDefinitionProvider +{ + public override void Define(IPermissionDefinitionContext context) + { + var myGroup = context.AddGroup(SamplePermissions.GroupName); + //Define your own permissions here. Example: + //myGroup.AddPermission(SamplePermissions.MyPermission1, L("Permission:MyPermission1")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/host/src/Sample.Application.Contracts/Permissions/SamplePermissions.cs b/host/src/Sample.Application.Contracts/Permissions/SamplePermissions.cs new file mode 100644 index 0000000..511825b --- /dev/null +++ b/host/src/Sample.Application.Contracts/Permissions/SamplePermissions.cs @@ -0,0 +1,9 @@ +namespace Sample.Permissions; + +public static class SamplePermissions +{ + public const string GroupName = "Sample"; + + //Add your own permission names. Example: + //public const string MyPermission1 = GroupName + ".MyPermission1"; +} diff --git a/host/src/Sample.Application.Contracts/Sample.Application.Contracts.csproj b/host/src/Sample.Application.Contracts/Sample.Application.Contracts.csproj new file mode 100644 index 0000000..7405bd0 --- /dev/null +++ b/host/src/Sample.Application.Contracts/Sample.Application.Contracts.csproj @@ -0,0 +1,25 @@ + + + + + + netstandard2.0 + enable + Sample + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.Application.Contracts/SampleApplicationContractsModule.cs b/host/src/Sample.Application.Contracts/SampleApplicationContractsModule.cs new file mode 100644 index 0000000..eb9b083 --- /dev/null +++ b/host/src/Sample.Application.Contracts/SampleApplicationContractsModule.cs @@ -0,0 +1,28 @@ +using Volo.Abp.Account; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace Sample; + +[DependsOn( + typeof(SampleDomainSharedModule), + typeof(AbpAccountApplicationContractsModule), + typeof(AbpFeatureManagementApplicationContractsModule), + typeof(AbpIdentityApplicationContractsModule), + typeof(AbpPermissionManagementApplicationContractsModule), + typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpTenantManagementApplicationContractsModule), + typeof(AbpObjectExtendingModule) +)] +public class SampleApplicationContractsModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + SampleDtoExtensions.Configure(); + } +} diff --git a/host/src/Sample.Application.Contracts/SampleDtoExtensions.cs b/host/src/Sample.Application.Contracts/SampleDtoExtensions.cs new file mode 100644 index 0000000..ee55860 --- /dev/null +++ b/host/src/Sample.Application.Contracts/SampleDtoExtensions.cs @@ -0,0 +1,28 @@ +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace Sample; + +public static class SampleDtoExtensions +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can add extension properties to DTOs + * defined in the depended modules. + * + * Example: + * + * ObjectExtensionManager.Instance + * .AddOrUpdateProperty("Title"); + * + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Object-Extensions + */ + }); + } +} diff --git a/host/src/Sample.Application/Properties/AssemblyInfo.cs b/host/src/Sample.Application/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..efc7bb3 --- /dev/null +++ b/host/src/Sample.Application/Properties/AssemblyInfo.cs @@ -0,0 +1,2 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("Sample.Application.Tests")] diff --git a/host/src/Sample.Application/Sample.Application.csproj b/host/src/Sample.Application/Sample.Application.csproj new file mode 100644 index 0000000..a50e7a6 --- /dev/null +++ b/host/src/Sample.Application/Sample.Application.csproj @@ -0,0 +1,25 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.Application/SampleAppService.cs b/host/src/Sample.Application/SampleAppService.cs new file mode 100644 index 0000000..82a420c --- /dev/null +++ b/host/src/Sample.Application/SampleAppService.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Sample.Localization; +using Volo.Abp.Application.Services; + +namespace Sample; + +/* Inherit your application services from this class. + */ +public abstract class SampleAppService : ApplicationService +{ + protected SampleAppService() + { + LocalizationResource = typeof(SampleResource); + } +} diff --git a/host/src/Sample.Application/SampleApplicationAutoMapperProfile.cs b/host/src/Sample.Application/SampleApplicationAutoMapperProfile.cs new file mode 100644 index 0000000..a39676a --- /dev/null +++ b/host/src/Sample.Application/SampleApplicationAutoMapperProfile.cs @@ -0,0 +1,13 @@ +using AutoMapper; + +namespace Sample; + +public class SampleApplicationAutoMapperProfile : Profile +{ + public SampleApplicationAutoMapperProfile() + { + /* You can configure your AutoMapper mapping configuration here. + * Alternatively, you can split your mapping configurations + * into multiple profile classes for a better organization. */ + } +} diff --git a/host/src/Sample.Application/SampleApplicationModule.cs b/host/src/Sample.Application/SampleApplicationModule.cs new file mode 100644 index 0000000..fa81d66 --- /dev/null +++ b/host/src/Sample.Application/SampleApplicationModule.cs @@ -0,0 +1,31 @@ +using Volo.Abp.Account; +using Volo.Abp.AutoMapper; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace Sample; + +[DependsOn( + typeof(SampleDomainModule), + typeof(AbpAccountApplicationModule), + typeof(SampleApplicationContractsModule), + typeof(AbpIdentityApplicationModule), + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpTenantManagementApplicationModule), + typeof(AbpFeatureManagementApplicationModule), + typeof(AbpSettingManagementApplicationModule) + )] +public class SampleApplicationModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddMaps(); + }); + } +} diff --git a/host/src/Sample.DbMigrator/DbMigratorHostedService.cs b/host/src/Sample.DbMigrator/DbMigratorHostedService.cs new file mode 100644 index 0000000..2b9f1f3 --- /dev/null +++ b/host/src/Sample.DbMigrator/DbMigratorHostedService.cs @@ -0,0 +1,51 @@ +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Sample.Data; +using Serilog; +using Volo.Abp; +using Volo.Abp.Data; + +namespace Sample.DbMigrator; + +public class DbMigratorHostedService : IHostedService +{ + private readonly IHostApplicationLifetime _hostApplicationLifetime; + private readonly IConfiguration _configuration; + + public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, IConfiguration configuration) + { + _hostApplicationLifetime = hostApplicationLifetime; + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); + options.AddDataMigrationEnvironment(); + })) + { + await application.InitializeAsync(); + + await application + .ServiceProvider + .GetRequiredService() + .MigrateAsync(); + + await application.ShutdownAsync(); + + _hostApplicationLifetime.StopApplication(); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/host/src/Sample.DbMigrator/Logs/logs.txt b/host/src/Sample.DbMigrator/Logs/logs.txt new file mode 100644 index 0000000..0072980 --- /dev/null +++ b/host/src/Sample.DbMigrator/Logs/logs.txt @@ -0,0 +1,6 @@ +2023-07-07 11:13:55.907 +08:00 [INF] Started database migrations... +2023-07-07 11:13:55.911 +08:00 [INF] Migrating schema for host database... +2023-07-07 11:14:00.414 +08:00 [INF] Executing host database seed... +2023-07-07 11:14:02.583 +08:00 [INF] Successfully completed host database migrations. +2023-07-07 11:14:02.870 +08:00 [INF] Successfully completed all database migrations. +2023-07-07 11:14:02.870 +08:00 [INF] You can safely end this process... diff --git a/host/src/Sample.DbMigrator/Program.cs b/host/src/Sample.DbMigrator/Program.cs new file mode 100644 index 0000000..6b06943 --- /dev/null +++ b/host/src/Sample.DbMigrator/Program.cs @@ -0,0 +1,41 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; + +namespace Sample.DbMigrator; + +class Program +{ + static async Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) +#if DEBUG + .MinimumLevel.Override("Sample", LogEventLevel.Debug) +#else + .MinimumLevel.Override("Sample", LogEventLevel.Information) +#endif + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + .ConfigureLogging((context, logging) => logging.ClearProviders()) + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); +} diff --git a/host/src/Sample.DbMigrator/Properties/launchSettings.json b/host/src/Sample.DbMigrator/Properties/launchSettings.json new file mode 100644 index 0000000..33504c9 --- /dev/null +++ b/host/src/Sample.DbMigrator/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "WSL": { + "commandName": "WSL2", + "distributionName": "" + } + } +} \ No newline at end of file diff --git a/host/src/Sample.DbMigrator/Sample.DbMigrator.csproj b/host/src/Sample.DbMigrator/Sample.DbMigrator.csproj new file mode 100644 index 0000000..2537a01 --- /dev/null +++ b/host/src/Sample.DbMigrator/Sample.DbMigrator.csproj @@ -0,0 +1,45 @@ + + + + + + Exe + net7.0 + enable + + + + + + PreserveNewest + Always + + + + PreserveNewest + Always + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.DbMigrator/SampleDbMigratorModule.cs b/host/src/Sample.DbMigrator/SampleDbMigratorModule.cs new file mode 100644 index 0000000..b5c338b --- /dev/null +++ b/host/src/Sample.DbMigrator/SampleDbMigratorModule.cs @@ -0,0 +1,15 @@ +using Sample.EntityFrameworkCore; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace Sample.DbMigrator; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(SampleEntityFrameworkCoreModule), + typeof(SampleApplicationContractsModule) + )] +public class SampleDbMigratorModule : AbpModule +{ + +} diff --git a/host/src/Sample.DbMigrator/appsettings.json b/host/src/Sample.DbMigrator/appsettings.json new file mode 100644 index 0000000..e0e2903 --- /dev/null +++ b/host/src/Sample.DbMigrator/appsettings.json @@ -0,0 +1,27 @@ +{ + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=Sample;Trusted_Connection=True;TrustServerCertificate=True" + }, + "OpenIddict": { + "Applications": { + "Sample_Web": { + "ClientId": "Sample_Web", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44335" + }, + "Sample_App": { + "ClientId": "Sample_App", + "RootUrl": "http://localhost:4200" + }, + "Sample_BlazorServerTiered": { + "ClientId": "Sample_BlazorServerTiered", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44381" + }, + "Sample_Swagger": { + "ClientId": "Sample_Swagger", + "RootUrl": "https://localhost:44336" + } + } + } +} \ No newline at end of file diff --git a/host/src/Sample.DbMigrator/appsettings.secrets.json b/host/src/Sample.DbMigrator/appsettings.secrets.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/host/src/Sample.DbMigrator/appsettings.secrets.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/ar.json b/host/src/Sample.Domain.Shared/Localization/Sample/ar.json new file mode 100644 index 0000000..96bbf80 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/ar.json @@ -0,0 +1,8 @@ +{ + "culture": "ar", + "texts": { + "Menu:Home": "الرئيسية", + "Menu:Home": "الصفحة الرئيسية", + "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء تشغيل يعتمد على إطار عمل ABP. لمزيد من المعلومات ، يرجى زيارة abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/cs.json b/host/src/Sample.Domain.Shared/Localization/Sample/cs.json new file mode 100644 index 0000000..5a0bbf6 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/cs.json @@ -0,0 +1,8 @@ +{ + "culture": "cs", + "texts": { + "Menu:Home": "Úvod", + "Welcome": "Vítejte", + "LongWelcomeMessage": "Vítejte v aplikaci. Toto je startovací projekt založený na ABP frameworku. Pro více informací, navštivte abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/de.json b/host/src/Sample.Domain.Shared/Localization/Sample/de.json new file mode 100644 index 0000000..831493b --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/de.json @@ -0,0 +1,8 @@ +{ + "culture": "de", + "texts": { + "Menu:Home": "Home", + "Welcome": "Willkommen", + "LongWelcomeMessage": "Willkommen bei der Anwendung. Dies ist ein Startup-Projekt, das auf dem ABP-Framework basiert. Weitere Informationen finden Sie unter abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/en-GB.json b/host/src/Sample.Domain.Shared/Localization/Sample/en-GB.json new file mode 100644 index 0000000..d2ca079 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/en-GB.json @@ -0,0 +1,8 @@ +{ + "culture": "en-GB", + "texts": { + "Menu:Home": "Home", + "Welcome": "Welcome", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/en.json b/host/src/Sample.Domain.Shared/Localization/Sample/en.json new file mode 100644 index 0000000..d2a6a98 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/en.json @@ -0,0 +1,8 @@ +{ + "culture": "en", + "texts": { + "Menu:Home": "Home", + "Welcome": "Welcome", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/es.json b/host/src/Sample.Domain.Shared/Localization/Sample/es.json new file mode 100644 index 0000000..31b4b59 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/es.json @@ -0,0 +1,8 @@ +{ + "culture": "es", + "texts": { + "Menu:Home": "Inicio", + "Welcome": "Bienvenido", + "LongWelcomeMessage": "Bienvenido a la aplicación, este es un proyecto base basado en el framework ABP. Para más información, visita abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/fi.json b/host/src/Sample.Domain.Shared/Localization/Sample/fi.json new file mode 100644 index 0000000..a318859 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/fi.json @@ -0,0 +1,8 @@ +{ + "culture": "fi", + "texts": { + "Menu:Home": "Koti", + "Welcome": "Tervetuloa", + "LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/fr.json b/host/src/Sample.Domain.Shared/Localization/Sample/fr.json new file mode 100644 index 0000000..e76eac0 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/fr.json @@ -0,0 +1,8 @@ +{ + "culture": "fr", + "texts": { + "Menu:Home": "Accueil", + "Welcome": "Bienvenue", + "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/hi.json b/host/src/Sample.Domain.Shared/Localization/Sample/hi.json new file mode 100644 index 0000000..a1676bf --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/hi.json @@ -0,0 +1,8 @@ +{ + "culture": "hi", + "texts": { + "Menu:Home": "घर", + "Welcome": "स्वागत हे", + "LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए, abp.io पर जाएं।" + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/hr.json b/host/src/Sample.Domain.Shared/Localization/Sample/hr.json new file mode 100644 index 0000000..fa8efab --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/hr.json @@ -0,0 +1,8 @@ +{ + "culture": "hr", + "texts": { + "Menu:Home": "Početna", + "Welcome": "Dobrodošli", + "LongWelcomeMessage": "Dobrodošli u aplikaciju. Ovo je startup projekt temeljen na ABP framework-u. Za više informacija posjetite abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/hu.json b/host/src/Sample.Domain.Shared/Localization/Sample/hu.json new file mode 100644 index 0000000..c7b6a33 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/hu.json @@ -0,0 +1,8 @@ +{ + "culture": "hu", + "texts": { + "Menu:Home": "Kezdőlap", + "Welcome": "Üdvözlöm", + "LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információkért látogasson el az abp.io oldalra." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/is.json b/host/src/Sample.Domain.Shared/Localization/Sample/is.json new file mode 100644 index 0000000..190df90 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/is.json @@ -0,0 +1,8 @@ +{ + "culture": "is", + "texts": { + "Menu:Home": "Heim", + "Welcome": "Velkomin", + "LongWelcomeMessage": "Verið velkomin í forritið. Þetta er startup verkefni sem byggir á ABP. Nánari upplýsingar er að finna á abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/it.json b/host/src/Sample.Domain.Shared/Localization/Sample/it.json new file mode 100644 index 0000000..82ce42b --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/it.json @@ -0,0 +1,8 @@ +{ + "culture": "it", + "texts": { + "Menu:Home": "Home", + "Welcome": "Benvenuto", + "LongWelcomeMessage": "Benvenuto nell'applicazione. Questo è un progetto di avvio basato sul framework ABP. Per ulteriori informazioni, visita abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/nl.json b/host/src/Sample.Domain.Shared/Localization/Sample/nl.json new file mode 100644 index 0000000..9ba8da4 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/nl.json @@ -0,0 +1,8 @@ +{ + "culture": "nl", + "texts": { + "Menu:Home": "Home", + "Welcome": "Welkom", + "LongWelcomeMessage": "Welkom bij de applicatie. Dit is een startup-project gebaseerd op het ABP-framework. Bezoek abp.io voor meer informatie." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/pl-PL.json b/host/src/Sample.Domain.Shared/Localization/Sample/pl-PL.json new file mode 100644 index 0000000..33412f3 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/pl-PL.json @@ -0,0 +1,8 @@ +{ + "culture": "pl-PL", + "texts": { + "Menu:Home": "Home", + "Welcome": "Witaj", + "LongWelcomeMessage": "Witaj w aplikacji. To jest inicjalny projekt bazujący na ABP framework. Po więcej informacji odwiedź stronę abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/pt-BR.json b/host/src/Sample.Domain.Shared/Localization/Sample/pt-BR.json new file mode 100644 index 0000000..8c818a0 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/pt-BR.json @@ -0,0 +1,8 @@ +{ + "culture": "pt-BR", + "texts": { + "Menu:Home": "Principal", + "Welcome": "Seja bem-vindo!", + "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/ro-RO.json b/host/src/Sample.Domain.Shared/Localization/Sample/ro-RO.json new file mode 100644 index 0000000..1fe5601 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/ro-RO.json @@ -0,0 +1,8 @@ +{ + "culture": "ro-RO", + "texts": { + "Menu:Home": "Acasă", + "Welcome": "Bun venit", + "LongWelcomeMessage": "Bun venit la aplicaţie. Acesta este un proiect de pornire bazat pe framework-ul ABP. Pentru mai multe informaţii, vizitaţi, visit abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/ru.json b/host/src/Sample.Domain.Shared/Localization/Sample/ru.json new file mode 100644 index 0000000..8464e44 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/ru.json @@ -0,0 +1,8 @@ +{ + "culture": "ru", + "texts": { + "Menu:Home": "Главная", + "Welcome": "Добро пожаловать", + "LongWelcomeMessage": "Добро пожаловать в приложение. Этот запущенный проект основан на фреймворке ABP. Для получения дополнительной информации посетите сайт abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/sk.json b/host/src/Sample.Domain.Shared/Localization/Sample/sk.json new file mode 100644 index 0000000..4f35aaf --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/sk.json @@ -0,0 +1,8 @@ +{ + "culture": "sk", + "texts": { + "Menu:Home": "Domov", + "Welcome": "Vitajte", + "LongWelcomeMessage": "Vitajte v aplikácii. Toto je štartovací projekt založený na ABP frameworku. Viac informácií nájdete na stránke abp.io." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/sl.json b/host/src/Sample.Domain.Shared/Localization/Sample/sl.json new file mode 100644 index 0000000..a066ef2 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/sl.json @@ -0,0 +1,8 @@ +{ + "culture": "sl", + "texts": { + "Menu:Home": "Domov", + "Welcome": "Dobrodošli", + "LongWelcomeMessage": "Dobrodošli v aplikaciji. To je začetni projekt na osnovi okolja ABP. Za več informacij obiščite abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/tr.json b/host/src/Sample.Domain.Shared/Localization/Sample/tr.json new file mode 100644 index 0000000..2cc911e --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/tr.json @@ -0,0 +1,8 @@ +{ + "culture": "tr", + "texts": { + "Menu:Home": "Ana sayfa", + "Welcome": "Hoşgeldiniz", + "LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için abp.io adresini ziyaret edebilirsiniz." + } +} \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/vi.json b/host/src/Sample.Domain.Shared/Localization/Sample/vi.json new file mode 100644 index 0000000..c115a35 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/vi.json @@ -0,0 +1,8 @@ +{ + "culture": "vi", + "texts": { + "Menu:Home": "Trang chủ", + "Welcome": "Chào mừng bạn", + "LongWelcomeMessage": "Chào mừng bạn đến ứng dụng. Đây là một dự án khởi nghiệp dựa trên khung ABP. Để biết thêm thông tin, hãy truy cập abp.io." + } +} diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/zh-Hans.json b/host/src/Sample.Domain.Shared/Localization/Sample/zh-Hans.json new file mode 100644 index 0000000..23790bd --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/zh-Hans.json @@ -0,0 +1,8 @@ +{ + "culture": "zh-Hans", + "texts": { + "Menu:Home": "首页", + "Welcome": "欢迎", + "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 abp.io." + } + } \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/Sample/zh-Hant.json b/host/src/Sample.Domain.Shared/Localization/Sample/zh-Hant.json new file mode 100644 index 0000000..31e0ab5 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/Sample/zh-Hant.json @@ -0,0 +1,8 @@ +{ + "culture": "zh-Hant", + "texts": { + "Menu:Home": "首頁", + "Welcome": "歡迎", + "LongWelcomeMessage": "歡迎來到此應用程式. 這是一個基於ABP框架的起始專案. 有關更多訊息, 請瀏覽 abp.io." + } + } \ No newline at end of file diff --git a/host/src/Sample.Domain.Shared/Localization/SampleResource.cs b/host/src/Sample.Domain.Shared/Localization/SampleResource.cs new file mode 100644 index 0000000..c8a3547 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Localization/SampleResource.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Localization; + +namespace Sample.Localization; + +[LocalizationResourceName("Sample")] +public class SampleResource +{ + +} diff --git a/host/src/Sample.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs b/host/src/Sample.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs new file mode 100644 index 0000000..a2ecd64 --- /dev/null +++ b/host/src/Sample.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs @@ -0,0 +1,10 @@ +namespace Sample.MultiTenancy; + +public static class MultiTenancyConsts +{ + /* Enable/disable multi-tenancy easily in a single point. + * If you will never need to multi-tenancy, you can remove + * related modules and code parts, including this file. + */ + public const bool IsEnabled = true; +} diff --git a/host/src/Sample.Domain.Shared/Sample.Domain.Shared.csproj b/host/src/Sample.Domain.Shared/Sample.Domain.Shared.csproj new file mode 100644 index 0000000..70fa045 --- /dev/null +++ b/host/src/Sample.Domain.Shared/Sample.Domain.Shared.csproj @@ -0,0 +1,32 @@ + + + + + + netstandard2.0 + enable + Sample + true + + + + + + + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.Domain.Shared/SampleDomainErrorCodes.cs b/host/src/Sample.Domain.Shared/SampleDomainErrorCodes.cs new file mode 100644 index 0000000..7577685 --- /dev/null +++ b/host/src/Sample.Domain.Shared/SampleDomainErrorCodes.cs @@ -0,0 +1,6 @@ +namespace Sample; + +public static class SampleDomainErrorCodes +{ + /* You can add your business exception error codes here, as constants */ +} diff --git a/host/src/Sample.Domain.Shared/SampleDomainSharedModule.cs b/host/src/Sample.Domain.Shared/SampleDomainSharedModule.cs new file mode 100644 index 0000000..8ce9972 --- /dev/null +++ b/host/src/Sample.Domain.Shared/SampleDomainSharedModule.cs @@ -0,0 +1,58 @@ +using Sample.Localization; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; +using Volo.Abp.Validation.Localization; +using Volo.Abp.VirtualFileSystem; + +namespace Sample; + +[DependsOn( + typeof(AbpAuditLoggingDomainSharedModule), + typeof(AbpBackgroundJobsDomainSharedModule), + typeof(AbpFeatureManagementDomainSharedModule), + typeof(AbpIdentityDomainSharedModule), + typeof(AbpOpenIddictDomainSharedModule), + typeof(AbpPermissionManagementDomainSharedModule), + typeof(AbpSettingManagementDomainSharedModule), + typeof(AbpTenantManagementDomainSharedModule) + )] +public class SampleDomainSharedModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + SampleGlobalFeatureConfigurator.Configure(); + SampleModuleExtensionConfigurator.Configure(); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddBaseTypes(typeof(AbpValidationResource)) + .AddVirtualJson("/Localization/Sample"); + + options.DefaultResourceType = typeof(SampleResource); + }); + + Configure(options => + { + options.MapCodeNamespace("Sample", typeof(SampleResource)); + }); + } +} diff --git a/host/src/Sample.Domain.Shared/SampleGlobalFeatureConfigurator.cs b/host/src/Sample.Domain.Shared/SampleGlobalFeatureConfigurator.cs new file mode 100644 index 0000000..58227b6 --- /dev/null +++ b/host/src/Sample.Domain.Shared/SampleGlobalFeatureConfigurator.cs @@ -0,0 +1,22 @@ +using Volo.Abp.Threading; + +namespace Sample; + +public static class SampleGlobalFeatureConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can configure (enable/disable) global features of the used modules here. + * + * YOU CAN SAFELY DELETE THIS CLASS AND REMOVE ITS USAGES IF YOU DON'T NEED TO IT! + * + * Please refer to the documentation to lear more about the Global Features System: + * https://docs.abp.io/en/abp/latest/Global-Features + */ + }); + } +} diff --git a/host/src/Sample.Domain.Shared/SampleModuleExtensionConfigurator.cs b/host/src/Sample.Domain.Shared/SampleModuleExtensionConfigurator.cs new file mode 100644 index 0000000..35a86fe --- /dev/null +++ b/host/src/Sample.Domain.Shared/SampleModuleExtensionConfigurator.cs @@ -0,0 +1,73 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace Sample; + +public static class SampleModuleExtensionConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + ConfigureExistingProperties(); + ConfigureExtraProperties(); + }); + } + + private static void ConfigureExistingProperties() + { + /* You can change max lengths for properties of the + * entities defined in the modules used by your application. + * + * Example: Change user and role name max lengths + + IdentityUserConsts.MaxNameLength = 99; + IdentityRoleConsts.MaxNameLength = 99; + + * Notice: It is not suggested to change property lengths + * unless you really need it. Go with the standard values wherever possible. + * + * If you are using EF Core, you will need to run the add-migration command after your changes. + */ + } + + private static void ConfigureExtraProperties() + { + /* You can configure extra properties for the + * entities defined in the modules used by your application. + * + * This class can be used to define these extra properties + * with a high level, easy to use API. + * + * Example: Add a new property to the user entity of the identity module + + ObjectExtensionManager.Instance.Modules() + .ConfigureIdentity(identity => + { + identity.ConfigureUser(user => + { + user.AddOrUpdateProperty( //property type: string + "SocialSecurityNumber", //property name + property => + { + //validation rules + property.Attributes.Add(new RequiredAttribute()); + property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4}); + + property.Configuration[IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit] = true; + + //...other configurations for this property + } + ); + }); + }); + + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Module-Entity-Extensions + */ + } +} diff --git a/host/src/Sample.Domain/Data/ISampleDbSchemaMigrator.cs b/host/src/Sample.Domain/Data/ISampleDbSchemaMigrator.cs new file mode 100644 index 0000000..df36767 --- /dev/null +++ b/host/src/Sample.Domain/Data/ISampleDbSchemaMigrator.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Sample.Data; + +public interface ISampleDbSchemaMigrator +{ + Task MigrateAsync(); +} diff --git a/host/src/Sample.Domain/Data/NullSampleDbSchemaMigrator.cs b/host/src/Sample.Domain/Data/NullSampleDbSchemaMigrator.cs new file mode 100644 index 0000000..b9daf03 --- /dev/null +++ b/host/src/Sample.Domain/Data/NullSampleDbSchemaMigrator.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Sample.Data; + +/* This is used if database provider does't define + * ISampleDbSchemaMigrator implementation. + */ +public class NullSampleDbSchemaMigrator : ISampleDbSchemaMigrator, ITransientDependency +{ + public Task MigrateAsync() + { + return Task.CompletedTask; + } +} diff --git a/host/src/Sample.Domain/Data/SampleDbMigrationService.cs b/host/src/Sample.Domain/Data/SampleDbMigrationService.cs new file mode 100644 index 0000000..81b3187 --- /dev/null +++ b/host/src/Sample.Domain/Data/SampleDbMigrationService.cs @@ -0,0 +1,218 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.TenantManagement; + +namespace Sample.Data; + +public class SampleDbMigrationService : ITransientDependency +{ + public ILogger Logger { get; set; } + + private readonly IDataSeeder _dataSeeder; + private readonly IEnumerable _dbSchemaMigrators; + private readonly ITenantRepository _tenantRepository; + private readonly ICurrentTenant _currentTenant; + + public SampleDbMigrationService( + IDataSeeder dataSeeder, + IEnumerable dbSchemaMigrators, + ITenantRepository tenantRepository, + ICurrentTenant currentTenant) + { + _dataSeeder = dataSeeder; + _dbSchemaMigrators = dbSchemaMigrators; + _tenantRepository = tenantRepository; + _currentTenant = currentTenant; + + Logger = NullLogger.Instance; + } + + public async Task MigrateAsync() + { + var initialMigrationAdded = AddInitialMigrationIfNotExist(); + + if (initialMigrationAdded) + { + return; + } + + Logger.LogInformation("Started database migrations..."); + + await MigrateDatabaseSchemaAsync(); + await SeedDataAsync(); + + Logger.LogInformation($"Successfully completed host database migrations."); + + var tenants = await _tenantRepository.GetListAsync(includeDetails: true); + + var migratedDatabaseSchemas = new HashSet(); + foreach (var tenant in tenants) + { + using (_currentTenant.Change(tenant.Id)) + { + if (tenant.ConnectionStrings.Any()) + { + var tenantConnectionStrings = tenant.ConnectionStrings + .Select(x => x.Value) + .ToList(); + + if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) + { + await MigrateDatabaseSchemaAsync(tenant); + + migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); + } + } + + await SeedDataAsync(tenant); + } + + Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); + } + + Logger.LogInformation("Successfully completed all database migrations."); + Logger.LogInformation("You can safely end this process..."); + } + + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) + { + Logger.LogInformation( + $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); + + foreach (var migrator in _dbSchemaMigrators) + { + await migrator.MigrateAsync(); + } + } + + private async Task SeedDataAsync(Tenant? tenant = null) + { + Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); + + await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) + .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) + .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) + ); + } + + private bool AddInitialMigrationIfNotExist() + { + try + { + if (!DbMigrationsProjectExists()) + { + return false; + } + } + catch (Exception) + { + return false; + } + + try + { + if (!MigrationsFolderExists()) + { + AddInitialMigration(); + return true; + } + else + { + return false; + } + } + catch (Exception e) + { + Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); + return false; + } + } + + private bool DbMigrationsProjectExists() + { + var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + + return dbMigrationsProjectFolder != null; + } + + private bool MigrationsFolderExists() + { + var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + return dbMigrationsProjectFolder != null && Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); + } + + private void AddInitialMigration() + { + Logger.LogInformation("Creating initial migration..."); + + string argumentPrefix; + string fileName; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + argumentPrefix = "-c"; + fileName = "/bin/bash"; + } + else + { + argumentPrefix = "/C"; + fileName = "cmd.exe"; + } + + var procStartInfo = new ProcessStartInfo(fileName, + $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" + ); + + try + { + Process.Start(procStartInfo); + } + catch (Exception) + { + throw new Exception("Couldn't run ABP CLI..."); + } + } + + private string? GetEntityFrameworkCoreProjectFolderPath() + { + var slnDirectoryPath = GetSolutionDirectoryPath(); + + if (slnDirectoryPath == null) + { + throw new Exception("Solution folder not found!"); + } + + var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); + + return Directory.GetDirectories(srcDirectoryPath) + .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); + } + + private string? GetSolutionDirectoryPath() + { + var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); + + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) + { + currentDirectory = Directory.GetParent(currentDirectory.FullName); + + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + { + return currentDirectory.FullName; + } + } + + return null; + } +} diff --git a/host/src/Sample.Domain/OpenIddict/OpenIddictDataSeedContributor.cs b/host/src/Sample.Domain/OpenIddict/OpenIddictDataSeedContributor.cs new file mode 100644 index 0000000..f73b07c --- /dev/null +++ b/host/src/Sample.Domain/OpenIddict/OpenIddictDataSeedContributor.cs @@ -0,0 +1,405 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Localization; +using OpenIddict.Abstractions; +using Volo.Abp; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.OpenIddict.Applications; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; + +namespace Sample.OpenIddict; + +/* Creates initial data that is needed to property run the application + * and make client-to-server communication possible. + */ +public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IConfiguration _configuration; + private readonly IAbpApplicationManager _applicationManager; + private readonly IOpenIddictScopeManager _scopeManager; + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IStringLocalizer L; + + public OpenIddictDataSeedContributor( + IConfiguration configuration, + IAbpApplicationManager applicationManager, + IOpenIddictScopeManager scopeManager, + IPermissionDataSeeder permissionDataSeeder, + IStringLocalizer l) + { + _configuration = configuration; + _applicationManager = applicationManager; + _scopeManager = scopeManager; + _permissionDataSeeder = permissionDataSeeder; + L = l; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + await CreateScopesAsync(); + await CreateApplicationsAsync(); + } + + private async Task CreateScopesAsync() + { + if (await _scopeManager.FindByNameAsync("Sample") == null) + { + await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor + { + Name = "Sample", + DisplayName = "Sample API", + Resources = + { + "Sample" + } + }); + } + } + + private async Task CreateApplicationsAsync() + { + var commonScopes = new List + { + OpenIddictConstants.Permissions.Scopes.Address, + OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Phone, + OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Roles, + "Sample" + }; + + var configurationSection = _configuration.GetSection("OpenIddict:Applications"); + + //Web Client + var webClientId = configurationSection["Sample_Web:ClientId"]; + if (!webClientId.IsNullOrWhiteSpace()) + { + var webClientRootUrl = configurationSection["Sample_Web:RootUrl"].EnsureEndsWith('/'); + + /* Sample_Web client is only needed if you created a tiered + * solution. Otherwise, you can delete this client. */ + await CreateApplicationAsync( + name: webClientId!, + type: OpenIddictConstants.ClientTypes.Confidential, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Web Application", + secret: configurationSection["Sample_Web:ClientSecret"] ?? "1q2w3e*", + grantTypes: new List //Hybrid flow + { + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.Implicit + }, + scopes: commonScopes, + redirectUri: $"{webClientRootUrl}signin-oidc", + clientUri: webClientRootUrl, + postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc" + ); + } + + //Console Test / Angular Client + var consoleAndAngularClientId = configurationSection["Sample_App:ClientId"]; + if (!consoleAndAngularClientId.IsNullOrWhiteSpace()) + { + var consoleAndAngularClientRootUrl = configurationSection["Sample_App:RootUrl"]?.TrimEnd('/'); + await CreateApplicationAsync( + name: consoleAndAngularClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Console Test / Angular Application", + secret: null, + grantTypes: new List + { + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.Password, + OpenIddictConstants.GrantTypes.ClientCredentials, + OpenIddictConstants.GrantTypes.RefreshToken + }, + scopes: commonScopes, + redirectUri: consoleAndAngularClientRootUrl, + clientUri: consoleAndAngularClientRootUrl, + postLogoutRedirectUri: consoleAndAngularClientRootUrl + ); + } + + // Blazor Client + var blazorClientId = configurationSection["Sample_Blazor:ClientId"]; + if (!blazorClientId.IsNullOrWhiteSpace()) + { + var blazorRootUrl = configurationSection["Sample_Blazor:RootUrl"]?.TrimEnd('/'); + + await CreateApplicationAsync( + name: blazorClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Blazor Application", + secret: null, + grantTypes: new List + { + OpenIddictConstants.GrantTypes.AuthorizationCode, + }, + scopes: commonScopes, + redirectUri: $"{blazorRootUrl}/authentication/login-callback", + clientUri: blazorRootUrl, + postLogoutRedirectUri: $"{blazorRootUrl}/authentication/logout-callback" + ); + } + + // Blazor Server Tiered Client + var blazorServerTieredClientId = configurationSection["Sample_BlazorServerTiered:ClientId"]; + if (!blazorServerTieredClientId.IsNullOrWhiteSpace()) + { + var blazorServerTieredRootUrl = configurationSection["Sample_BlazorServerTiered:RootUrl"].EnsureEndsWith('/'); + + await CreateApplicationAsync( + name: blazorServerTieredClientId!, + type: OpenIddictConstants.ClientTypes.Confidential, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Blazor Server Application", + secret: configurationSection["Sample_BlazorServerTiered:ClientSecret"] ?? "1q2w3e*", + grantTypes: new List //Hybrid flow + { + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.Implicit + }, + scopes: commonScopes, + redirectUri: $"{blazorServerTieredRootUrl}signin-oidc", + clientUri: blazorServerTieredRootUrl, + postLogoutRedirectUri: $"{blazorServerTieredRootUrl}signout-callback-oidc" + ); + } + + // Swagger Client + var swaggerClientId = configurationSection["Sample_Swagger:ClientId"]; + if (!swaggerClientId.IsNullOrWhiteSpace()) + { + var swaggerRootUrl = configurationSection["Sample_Swagger:RootUrl"]?.TrimEnd('/'); + + await CreateApplicationAsync( + name: swaggerClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Swagger Application", + secret: null, + grantTypes: new List + { + OpenIddictConstants.GrantTypes.AuthorizationCode, + }, + scopes: commonScopes, + redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html", + clientUri: swaggerRootUrl + ); + } + } + + private async Task CreateApplicationAsync( + [NotNull] string name, + [NotNull] string type, + [NotNull] string consentType, + string displayName, + string? secret, + List grantTypes, + List scopes, + string? clientUri = null, + string? redirectUri = null, + string? postLogoutRedirectUri = null, + List? permissions = null) + { + if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + throw new BusinessException(L["NoClientSecretCanBeSetForPublicApplications"]); + } + + if (string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Confidential, StringComparison.OrdinalIgnoreCase)) + { + throw new BusinessException(L["TheClientSecretIsRequiredForConfidentialApplications"]); + } + + if (!string.IsNullOrEmpty(name) && await _applicationManager.FindByClientIdAsync(name) != null) + { + return; + //throw new BusinessException(L["TheClientIdentifierIsAlreadyTakenByAnotherApplication"]); + } + + var client = await _applicationManager.FindByClientIdAsync(name); + if (client == null) + { + var application = new AbpApplicationDescriptor + { + ClientId = name, + Type = type, + ClientSecret = secret, + ConsentType = consentType, + DisplayName = displayName, + ClientUri = clientUri, + }; + + Check.NotNullOrEmpty(grantTypes, nameof(grantTypes)); + Check.NotNullOrEmpty(scopes, nameof(scopes)); + + if (new [] { OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit }.All(grantTypes.Contains)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken); + + if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeToken); + } + } + + if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + } + + var buildInGrantTypes = new [] + { + OpenIddictConstants.GrantTypes.Implicit, + OpenIddictConstants.GrantTypes.Password, + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.ClientCredentials, + OpenIddictConstants.GrantTypes.DeviceCode, + OpenIddictConstants.GrantTypes.RefreshToken + }; + + foreach (var grantType in grantTypes) + { + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Code); + } + + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Authorization); + } + + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || + grantType == OpenIddictConstants.GrantTypes.ClientCredentials || + grantType == OpenIddictConstants.GrantTypes.Password || + grantType == OpenIddictConstants.GrantTypes.RefreshToken || + grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); + } + + if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.ClientCredentials); + } + + if (grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Implicit); + } + + if (grantType == OpenIddictConstants.GrantTypes.Password) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Password); + } + + if (grantType == OpenIddictConstants.GrantTypes.RefreshToken) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); + } + + if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + } + + if (grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); + if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Token); + } + } + + if (!buildInGrantTypes.Contains(grantType)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.GrantType + grantType); + } + } + + var buildInScopes = new [] + { + OpenIddictConstants.Permissions.Scopes.Address, + OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Phone, + OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Roles + }; + + foreach (var scope in scopes) + { + if (buildInScopes.Contains(scope)) + { + application.Permissions.Add(scope); + } + else + { + application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.Scope + scope); + } + } + + if (redirectUri != null) + { + if (!redirectUri.IsNullOrEmpty()) + { + if (!Uri.TryCreate(redirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) + { + throw new BusinessException(L["InvalidRedirectUri", redirectUri]); + } + + if (application.RedirectUris.All(x => x != uri)) + { + application.RedirectUris.Add(uri); + } + } + } + + if (postLogoutRedirectUri != null) + { + if (!postLogoutRedirectUri.IsNullOrEmpty()) + { + if (!Uri.TryCreate(postLogoutRedirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) + { + throw new BusinessException(L["InvalidPostLogoutRedirectUri", postLogoutRedirectUri]); + } + + if (application.PostLogoutRedirectUris.All(x => x != uri)) + { + application.PostLogoutRedirectUris.Add(uri); + } + } + } + + if (permissions != null) + { + await _permissionDataSeeder.SeedAsync( + ClientPermissionValueProvider.ProviderName, + name, + permissions, + null + ); + } + + await _applicationManager.CreateAsync(application); + } + } +} diff --git a/host/src/Sample.Domain/Properties/AssemblyInfo.cs b/host/src/Sample.Domain/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ee174f1 --- /dev/null +++ b/host/src/Sample.Domain/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("Sample.Domain.Tests")] +[assembly:InternalsVisibleToAttribute("Sample.TestBase")] diff --git a/host/src/Sample.Domain/Sample.Domain.csproj b/host/src/Sample.Domain/Sample.Domain.csproj new file mode 100644 index 0000000..791f1f3 --- /dev/null +++ b/host/src/Sample.Domain/Sample.Domain.csproj @@ -0,0 +1,28 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.Domain/SampleConsts.cs b/host/src/Sample.Domain/SampleConsts.cs new file mode 100644 index 0000000..e5d6320 --- /dev/null +++ b/host/src/Sample.Domain/SampleConsts.cs @@ -0,0 +1,8 @@ +namespace Sample; + +public static class SampleConsts +{ + public const string DbTablePrefix = "App"; + + public const string DbSchema = null; +} diff --git a/host/src/Sample.Domain/SampleDomainModule.cs b/host/src/Sample.Domain/SampleDomainModule.cs new file mode 100644 index 0000000..1990591 --- /dev/null +++ b/host/src/Sample.Domain/SampleDomainModule.cs @@ -0,0 +1,68 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Sample.MultiTenancy; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.Emailing; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.OpenIddict; +using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.PermissionManagement.OpenIddict; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace Sample; + +[DependsOn( + typeof(SampleDomainSharedModule), + typeof(AbpAuditLoggingDomainModule), + typeof(AbpBackgroundJobsDomainModule), + typeof(AbpFeatureManagementDomainModule), + typeof(AbpIdentityDomainModule), + typeof(AbpOpenIddictDomainModule), + typeof(AbpPermissionManagementDomainOpenIddictModule), + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpSettingManagementDomainModule), + typeof(AbpTenantManagementDomainModule), + typeof(AbpEmailingModule) +)] +public class SampleDomainModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Languages.Add(new LanguageInfo("ar", "ar", "العربية", "ae")); + options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); + options.Languages.Add(new LanguageInfo("en", "en", "English", "gb")); + options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); + options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); + options.Languages.Add(new LanguageInfo("hr", "hr", "Croatian")); + options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish", "fi")); + options.Languages.Add(new LanguageInfo("fr", "fr", "Français", "fr")); + options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in")); + options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it")); + options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); + options.Languages.Add(new LanguageInfo("ru", "ru", "Русский", "ru")); + options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak", "sk")); + options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe", "tr")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); + options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de")); + options.Languages.Add(new LanguageInfo("es", "es", "Español")); + }); + + Configure(options => + { + options.IsEnabled = MultiTenancyConsts.IsEnabled; + }); + +#if DEBUG + context.Services.Replace(ServiceDescriptor.Singleton()); +#endif + } +} diff --git a/host/src/Sample.Domain/Settings/SampleSettingDefinitionProvider.cs b/host/src/Sample.Domain/Settings/SampleSettingDefinitionProvider.cs new file mode 100644 index 0000000..a32730e --- /dev/null +++ b/host/src/Sample.Domain/Settings/SampleSettingDefinitionProvider.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Settings; + +namespace Sample.Settings; + +public class SampleSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + //Define your own settings here. Example: + //context.Add(new SettingDefinition(SampleSettings.MySetting1)); + } +} diff --git a/host/src/Sample.Domain/Settings/SampleSettings.cs b/host/src/Sample.Domain/Settings/SampleSettings.cs new file mode 100644 index 0000000..1d233ee --- /dev/null +++ b/host/src/Sample.Domain/Settings/SampleSettings.cs @@ -0,0 +1,9 @@ +namespace Sample.Settings; + +public static class SampleSettings +{ + private const string Prefix = "Sample"; + + //Add your own setting names here. Example: + //public const string MySetting1 = Prefix + ".MySetting1"; +} diff --git a/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreSampleDbSchemaMigrator.cs b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreSampleDbSchemaMigrator.cs new file mode 100644 index 0000000..498f3fd --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreSampleDbSchemaMigrator.cs @@ -0,0 +1,34 @@ +using System; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Sample.Data; +using Volo.Abp.DependencyInjection; + +namespace Sample.EntityFrameworkCore; + +public class EntityFrameworkCoreSampleDbSchemaMigrator + : ISampleDbSchemaMigrator, ITransientDependency +{ + private readonly IServiceProvider _serviceProvider; + + public EntityFrameworkCoreSampleDbSchemaMigrator( + IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task MigrateAsync() + { + /* We intentionally resolving the SampleDbContext + * from IServiceProvider (instead of directly injecting it) + * to properly get the connection string of the current tenant in the + * current scope. + */ + + await _serviceProvider + .GetRequiredService() + .Database + .MigrateAsync(); + } +} diff --git a/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContext.cs b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContext.cs new file mode 100644 index 0000000..d345e4b --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContext.cs @@ -0,0 +1,86 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Identity; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TenantManagement; +using Volo.Abp.TenantManagement.EntityFrameworkCore; + +namespace Sample.EntityFrameworkCore; + +[ReplaceDbContext(typeof(IIdentityDbContext))] +[ReplaceDbContext(typeof(ITenantManagementDbContext))] +[ConnectionStringName("Default")] +public class SampleDbContext : + AbpDbContext, + IIdentityDbContext, + ITenantManagementDbContext +{ + /* Add DbSet properties for your Aggregate Roots / Entities here. */ + + #region Entities from the modules + + /* Notice: We only implemented IIdentityDbContext and ITenantManagementDbContext + * and replaced them for this DbContext. This allows you to perform JOIN + * queries for the entities of these modules over the repositories easily. You + * typically don't need that for other modules. But, if you need, you can + * implement the DbContext interface of the needed module and use ReplaceDbContext + * attribute just like IIdentityDbContext and ITenantManagementDbContext. + * + * More info: Replacing a DbContext of a module ensures that the related module + * uses this DbContext on runtime. Otherwise, it will use its own DbContext class. + */ + + //Identity + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + public DbSet ClaimTypes { get; set; } + public DbSet OrganizationUnits { get; set; } + public DbSet SecurityLogs { get; set; } + public DbSet LinkUsers { get; set; } + public DbSet UserDelegations { get; set; } + + // Tenant Management + public DbSet Tenants { get; set; } + public DbSet TenantConnectionStrings { get; set; } + + #endregion + + public SampleDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + builder.ConfigurePermissionManagement(); + builder.ConfigureSettingManagement(); + builder.ConfigureBackgroundJobs(); + builder.ConfigureAuditLogging(); + builder.ConfigureIdentity(); + builder.ConfigureOpenIddict(); + builder.ConfigureFeatureManagement(); + builder.ConfigureTenantManagement(); + + /* Configure your own tables/entities inside here */ + + //builder.Entity(b => + //{ + // b.ToTable(SampleConsts.DbTablePrefix + "YourEntities", SampleConsts.DbSchema); + // b.ConfigureByConvention(); //auto configure for the base class props + // //... + //}); + } +} diff --git a/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContextFactory.cs b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContextFactory.cs new file mode 100644 index 0000000..61c7ce7 --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleDbContextFactory.cs @@ -0,0 +1,33 @@ +using System; +using System.IO; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace Sample.EntityFrameworkCore; + +/* This class is needed for EF Core console commands + * (like Add-Migration and Update-Database commands) */ +public class SampleDbContextFactory : IDesignTimeDbContextFactory +{ + public SampleDbContext CreateDbContext(string[] args) + { + SampleEfCoreEntityExtensionMappings.Configure(); + + var configuration = BuildConfiguration(); + + var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); + + return new SampleDbContext(builder.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Sample.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false); + + return builder.Build(); + } +} diff --git a/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEfCoreEntityExtensionMappings.cs b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEfCoreEntityExtensionMappings.cs new file mode 100644 index 0000000..88f78c2 --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEfCoreEntityExtensionMappings.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace Sample.EntityFrameworkCore; + +public static class SampleEfCoreEntityExtensionMappings +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + SampleGlobalFeatureConfigurator.Configure(); + SampleModuleExtensionConfigurator.Configure(); + + OneTimeRunner.Run(() => + { + /* You can configure extra properties for the + * entities defined in the modules used by your application. + * + * This class can be used to map these extra properties to table fields in the database. + * + * USE THIS CLASS ONLY TO CONFIGURE EF CORE RELATED MAPPING. + * USE SampleModuleExtensionConfigurator CLASS (in the Domain.Shared project) + * FOR A HIGH LEVEL API TO DEFINE EXTRA PROPERTIES TO ENTITIES OF THE USED MODULES + * + * Example: Map a property to a table field: + + ObjectExtensionManager.Instance + .MapEfCoreProperty( + "MyProperty", + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(128); + } + ); + + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities + */ + }); + } +} diff --git a/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEntityFrameworkCoreModule.cs b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEntityFrameworkCoreModule.cs new file mode 100644 index 0000000..9daee47 --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/EntityFrameworkCore/SampleEntityFrameworkCoreModule.cs @@ -0,0 +1,54 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Uow; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TenantManagement.EntityFrameworkCore; + +namespace Sample.EntityFrameworkCore; + +[DependsOn( + typeof(SampleDomainModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCoreSqlServerModule), + typeof(AbpBackgroundJobsEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpTenantManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule) + )] +public class SampleEntityFrameworkCoreModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + SampleEfCoreEntityExtensionMappings.Configure(); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(options => + { + /* Remove "includeAllEntities: true" to create + * default repositories only for aggregate roots */ + options.AddDefaultRepositories(includeAllEntities: true); + }); + + Configure(options => + { + /* The main point to change your DBMS. + * See also SampleMigrationsDbContextFactory for EF Core tooling. */ + options.UseSqlServer(); + }); + + } +} diff --git a/host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.Designer.cs b/host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.Designer.cs new file mode 100644 index 0000000..8baae25 --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.Designer.cs @@ -0,0 +1,1870 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sample.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Sample.Migrations +{ + [DbContext(typeof(SampleDbContext))] + [Migration("20230707030931_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "7.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.cs b/host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.cs new file mode 100644 index 0000000..733aa68 --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/Migrations/20230707030931_Initial.cs @@ -0,0 +1,1084 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Sample.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(max)", nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpBackgroundJobs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + JobName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + JobArgs = table.Column(type: "nvarchar(max)", maxLength: 1048576, nullable: false), + TryCount = table.Column(type: "smallint", nullable: false, defaultValue: (short)0), + CreationTime = table.Column(type: "datetime2", nullable: false), + NextTryTime = table.Column(type: "datetime2", nullable: false), + LastTryTime = table.Column(type: "datetime2", nullable: true), + IsAbandoned = table.Column(type: "bit", nullable: false, defaultValue: false), + Priority = table.Column(type: "tinyint", nullable: false, defaultValue: (byte)15), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatures", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + DefaultValue = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + IsVisibleToClients = table.Column(type: "bit", nullable: false), + IsAvailableToHost = table.Column(type: "bit", nullable: false), + AllowedProviders = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatures", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + IsActive = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + LastPasswordChangeTime = table.Column(type: "datetimeoffset", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictApplications", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientSecret = table.Column(type: "nvarchar(max)", nullable: true), + ConsentType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + Permissions = table.Column(type: "nvarchar(max)", nullable: true), + PostLogoutRedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Requirements = table.Column(type: "nvarchar(max)", nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ClientUri = table.Column(type: "nvarchar(max)", nullable: true), + LogoUri = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictScopes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(max)", nullable: true), + Descriptions = table.Column(type: "nvarchar(max)", nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Resources = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictAuthorizations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Scopes = table.Column(type: "nvarchar(max)", nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictTokens", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + AuthorizationId = table.Column(type: "uniqueidentifier", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + ExpirationDate = table.Column(type: "datetime2", nullable: true), + Payload = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedemptionDate = table.Column(type: "datetime2", nullable: true), + ReferenceId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", + column: x => x.AuthorizationId, + principalTable: "OpenIddictAuthorizations", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", + table: "AbpBackgroundJobs", + columns: new[] { "IsAbandoned", "NextTryTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureGroups_Name", + table: "AbpFeatureGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_GroupName", + table: "AbpFeatures", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_Name", + table: "AbpFeatures", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[TenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictApplications_ClientId", + table: "OpenIddictApplications", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", + table: "OpenIddictAuthorizations", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictScopes_Name", + table: "OpenIddictScopes", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", + table: "OpenIddictTokens", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_AuthorizationId", + table: "OpenIddictTokens", + column: "AuthorizationId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ReferenceId", + table: "OpenIddictTokens", + column: "ReferenceId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpBackgroundJobs"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureGroups"); + + migrationBuilder.DropTable( + name: "AbpFeatures"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "OpenIddictScopes"); + + migrationBuilder.DropTable( + name: "OpenIddictTokens"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "OpenIddictAuthorizations"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + + migrationBuilder.DropTable( + name: "OpenIddictApplications"); + } + } +} diff --git a/host/src/Sample.EntityFrameworkCore/Migrations/SampleDbContextModelSnapshot.cs b/host/src/Sample.EntityFrameworkCore/Migrations/SampleDbContextModelSnapshot.cs new file mode 100644 index 0000000..c7db469 --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/Migrations/SampleDbContextModelSnapshot.cs @@ -0,0 +1,1867 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sample.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Sample.Migrations +{ + [DbContext(typeof(SampleDbContext))] + partial class SampleDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "7.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/host/src/Sample.EntityFrameworkCore/Properties/AssemblyInfo.cs b/host/src/Sample.EntityFrameworkCore/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4118e4e --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/Properties/AssemblyInfo.cs @@ -0,0 +1,2 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("Sample.EntityFrameworkCore.Tests")] diff --git a/host/src/Sample.EntityFrameworkCore/Sample.EntityFrameworkCore.csproj b/host/src/Sample.EntityFrameworkCore/Sample.EntityFrameworkCore.csproj new file mode 100644 index 0000000..24fd3dd --- /dev/null +++ b/host/src/Sample.EntityFrameworkCore/Sample.EntityFrameworkCore.csproj @@ -0,0 +1,31 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + diff --git a/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj b/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj new file mode 100644 index 0000000..012fa56 --- /dev/null +++ b/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj @@ -0,0 +1,29 @@ + + + + + + netstandard2.0 + enable + Sample + + + + + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.HttpApi.Client/SampleHttpApiClientModule.cs b/host/src/Sample.HttpApi.Client/SampleHttpApiClientModule.cs new file mode 100644 index 0000000..7d512f0 --- /dev/null +++ b/host/src/Sample.HttpApi.Client/SampleHttpApiClientModule.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Account; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.TenantManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.VirtualFileSystem; + +namespace Sample; + +[DependsOn( + typeof(SampleApplicationContractsModule), + typeof(AbpAccountHttpApiClientModule), + typeof(AbpIdentityHttpApiClientModule), + typeof(AbpPermissionManagementHttpApiClientModule), + typeof(AbpTenantManagementHttpApiClientModule), + typeof(AbpFeatureManagementHttpApiClientModule), + typeof(AbpSettingManagementHttpApiClientModule) +)] +public class SampleHttpApiClientModule : AbpModule +{ + public const string RemoteServiceName = "Default"; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpClientProxies( + typeof(SampleApplicationContractsModule).Assembly, + RemoteServiceName + ); + + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + } +} diff --git a/host/src/Sample.HttpApi.Host/Controllers/HomeController.cs b/host/src/Sample.HttpApi.Host/Controllers/HomeController.cs new file mode 100644 index 0000000..dfc907e --- /dev/null +++ b/host/src/Sample.HttpApi.Host/Controllers/HomeController.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; + +namespace Sample.Controllers; + +public class HomeController : AbpController +{ + public ActionResult Index() + { + return Redirect("~/swagger"); + } +} diff --git a/host/src/Sample.HttpApi.Host/Program.cs b/host/src/Sample.HttpApi.Host/Program.cs new file mode 100644 index 0000000..d6d1a52 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/Program.cs @@ -0,0 +1,56 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Serilog; +using Serilog.Events; + +namespace Sample; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() +#if DEBUG + .MinimumLevel.Debug() +#else + .MinimumLevel.Information() +#endif + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + try + { + Log.Information("Starting Sample.HttpApi.Host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.AddApplicationAsync(); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); + return 0; + } + catch (Exception ex) + { + if (ex is HostAbortedException) + { + throw; + } + + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } +} diff --git a/host/src/Sample.HttpApi.Host/Properties/launchSettings.json b/host/src/Sample.HttpApi.Host/Properties/launchSettings.json new file mode 100644 index 0000000..807cf72 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44336", + "sslPort": 44336 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Sample.HttpApi.Host": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:44336", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj b/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj new file mode 100644 index 0000000..e177a28 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj @@ -0,0 +1,40 @@ + + + + + + net7.0 + enable + Sample + true + Sample-4681b4fd-151f-4221-84a4-929d86723e4c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.HttpApi.Host/SampleBrandingProvider.cs b/host/src/Sample.HttpApi.Host/SampleBrandingProvider.cs new file mode 100644 index 0000000..1961ea4 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/SampleBrandingProvider.cs @@ -0,0 +1,10 @@ +using Volo.Abp.DependencyInjection; +using Volo.Abp.Ui.Branding; + +namespace Sample; + +[Dependency(ReplaceServices = true)] +public class SampleBrandingProvider : DefaultBrandingProvider +{ + public override string AppName => "Sample"; +} diff --git a/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs b/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs new file mode 100644 index 0000000..78a92ad --- /dev/null +++ b/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs @@ -0,0 +1,219 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Sample.EntityFrameworkCore; +using Sample.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling; +using Microsoft.OpenApi.Models; +using OpenIddict.Validation.AspNetCore; +using Volo.Abp; +using Volo.Abp.Account; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.Swashbuckle; +using Volo.Abp.UI.Navigation.Urls; +using Volo.Abp.VirtualFileSystem; + +namespace Sample; + +[DependsOn( + typeof(SampleHttpApiModule), + typeof(AbpAutofacModule), + typeof(AbpAspNetCoreMultiTenancyModule), + typeof(SampleApplicationModule), + typeof(SampleEntityFrameworkCoreModule), + typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), + typeof(AbpAccountWebOpenIddictModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpSwashbuckleModule) +)] +public class SampleHttpApiHostModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("Sample"); + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + ConfigureAuthentication(context); + ConfigureBundles(); + ConfigureUrls(configuration); + ConfigureConventionalControllers(); + ConfigureVirtualFileSystem(context); + ConfigureCors(context, configuration); + ConfigureSwaggerServices(context, configuration); + } + + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + + private void ConfigureBundles() + { + Configure(options => + { + options.StyleBundles.Configure( + LeptonXLiteThemeBundles.Styles.Global, + bundle => + { + bundle.AddFiles("/global-styles.css"); + } + ); + }); + } + + private void ConfigureUrls(IConfiguration configuration) + { + Configure(options => + { + options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); + + options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; + options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; + }); + } + + private void ConfigureVirtualFileSystem(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + if (hostingEnvironment.IsDevelopment()) + { + Configure(options => + { + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}Sample.Domain.Shared")); + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}Sample.Domain")); + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}Sample.Application.Contracts")); + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}Sample.Application")); + }); + } + } + + private void ConfigureConventionalControllers() + { + Configure(options => + { + options.ConventionalControllers.Create(typeof(SampleApplicationModule).Assembly); + }); + } + + private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddAbpSwaggerGenWithOAuth( + configuration["AuthServer:Authority"], + new Dictionary + { + {"Sample", "Sample API"} + }, + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "Sample API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + }); + } + + private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddCors(options => + { + options.AddDefaultPolicy(builder => + { + builder + .WithOrigins(configuration["App:CorsOrigins"]? + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() ?? Array.Empty()) + .WithAbpExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAbpRequestLocalization(); + + if (!env.IsDevelopment()) + { + app.UseErrorPage(); + } + + app.UseCorrelationId(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseCors(); + app.UseAuthentication(); + app.UseAbpOpenIddictValidation(); + + if (MultiTenancyConsts.IsEnabled) + { + app.UseMultiTenancy(); + } + + app.UseUnitOfWork(); + app.UseAuthorization(); + + app.UseSwagger(); + app.UseAbpSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "Sample API"); + + var configuration = context.ServiceProvider.GetRequiredService(); + c.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); + c.OAuthScopes("Sample"); + }); + + app.UseAuditing(); + app.UseAbpSerilogEnrichers(); + app.UseConfiguredEndpoints(); + } +} diff --git a/host/src/Sample.HttpApi.Host/abp.resourcemapping.js b/host/src/Sample.HttpApi.Host/abp.resourcemapping.js new file mode 100644 index 0000000..4a2ad45 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/abp.resourcemapping.js @@ -0,0 +1,11 @@ +module.exports = { + aliases: { + + }, + clean: [ + + ], + mappings: { + + } +}; diff --git a/host/src/Sample.HttpApi.Host/appsettings.Development.json b/host/src/Sample.HttpApi.Host/appsettings.Development.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/appsettings.Development.json @@ -0,0 +1,2 @@ +{ +} diff --git a/host/src/Sample.HttpApi.Host/appsettings.json b/host/src/Sample.HttpApi.Host/appsettings.json new file mode 100644 index 0000000..57713e1 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/appsettings.json @@ -0,0 +1,18 @@ +{ + "App": { + "SelfUrl": "https://localhost:44336", + "CorsOrigins": "https://*.Sample.com", + "RedirectAllowedUrls": "" + }, + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=Sample;Trusted_Connection=True;TrustServerCertificate=True" + }, + "AuthServer": { + "Authority": "https://localhost:44336", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "Sample_Swagger" + }, + "StringEncryption": { + "DefaultPassPhrase": "Lf2SdWI7UfbOGeK7" + } +} diff --git a/host/src/Sample.HttpApi.Host/appsettings.secrets.json b/host/src/Sample.HttpApi.Host/appsettings.secrets.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/appsettings.secrets.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/host/src/Sample.HttpApi.Host/package.json b/host/src/Sample.HttpApi.Host/package.json new file mode 100644 index 0000000..af06796 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/package.json @@ -0,0 +1,8 @@ +{ + "version": "1.0.0", + "name": "my-app", + "private": true, + "dependencies": { + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.2.1" + } +} diff --git a/host/src/Sample.HttpApi.Host/web.config b/host/src/Sample.HttpApi.Host/web.config new file mode 100644 index 0000000..2809077 --- /dev/null +++ b/host/src/Sample.HttpApi.Host/web.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.HttpApi.Host/wwwroot/global-styles.css b/host/src/Sample.HttpApi.Host/wwwroot/global-styles.css new file mode 100644 index 0000000..74db4bd --- /dev/null +++ b/host/src/Sample.HttpApi.Host/wwwroot/global-styles.css @@ -0,0 +1,6 @@ +/* Your Global Styles */ + +:root .lpx-brand-logo { + --lpx-logo: url('/images/logo/leptonx/logo-light.png'); + --lpx-logo-icon: url('/images/logo/leptonx/logo-light-thumbnail.png'); +} \ No newline at end of file diff --git a/host/src/Sample.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark-thumbnail.png b/host/src/Sample.HttpApi.Host/wwwroot/images/logo/leptonx/logo-dark-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..621596bb5c1a301136d9ee2af5ffe1391a4af776 GIT binary patch literal 17592 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.4.0 <4.0.0" + +bootstrap-daterangepicker@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8" + integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g== + dependencies: + jquery ">=1.10" + moment "^2.9.0" + +bootstrap@^5.1.3: + version "5.3.0" + resolved "https://registry.npmmirror.com/bootstrap/-/bootstrap-5.3.0.tgz#0718a7cc29040ee8dbf1bd652b896f3436a87c29" + integrity sha512-UnBV3E3v4STVNQdms6jSGO2CvOkjUMdDAVR2V5N4uCMdaIkaQjbcEAMqRimDHIs4uqBYzDAKCQwCB+97tJgHQw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== + +chokidar@^2.0.0: + version "2.1.8" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g== + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag== + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmmirror.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA== + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +copy-props@^2.0.1: + version "2.0.5" + resolved "https://registry.npmmirror.com/copy-props/-/copy-props-2.0.5.tgz#03cf9ae328d4ebb36f8f1d804448a6af9ee3f2d2" + integrity sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw== + dependencies: + each-props "^1.3.2" + is-plain-object "^5.0.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +datatables.net-bs5@^1.11.4: + version "1.13.5" + resolved "https://registry.npmmirror.com/datatables.net-bs5/-/datatables.net-bs5-1.13.5.tgz#38bdaec42f9fa08c5ac9cb9a7c51d3efafeafa69" + integrity sha512-q+/CSEPYULV6//8kvrjaAH/rVkoLOP9s6z+ajEbgNC/6b3WRbCbcifPXRp6XVZ94VapaqtZKveS1s2eeqZMr1g== + dependencies: + datatables.net ">=1.13.4" + jquery ">=1.7" + +datatables.net@>=1.13.4, datatables.net@^1.11.4: + version "1.13.5" + resolved "https://registry.npmmirror.com/datatables.net/-/datatables.net-1.13.5.tgz#790a3d70d5e103f5465ed8c52a50eb242e1e2dc4" + integrity sha512-XoCQHkUM5MwbC3Wx7WpVvt4i880J8pIFDA9HIKD4GhvtalryBfmdd+bZvrc/rEbraZS7U4eR2k8/wFY0NeHVqQ== + dependencies: + jquery ">=1.7" + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ== + +define-properties@^1.1.4: + version "1.2.0" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-props@^1.3.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.npmmirror.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend-object@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/extend-object/-/extend-object-1.0.0.tgz#42514f84015d1356caf5187969dfb2bc1bda0823" + integrity sha512-0dHDIXC7y7LDmCh/lp1oYkmv73K25AMugQI07r8eFopkW6f7Ufn1q+ETMsJjnV9Am14SlElkqy3O92r6xEaxPw== + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.npmmirror.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-levenshtein@^1.0.0: + version "1.1.4" + resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9" + integrity sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g== + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== + dependencies: + for-in "^1.0.1" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ== + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw== + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob-watcher@^5.0.3: + version "5.0.5" + resolved "https://registry.npmmirror.com/glob-watcher/-/glob-watcher-5.0.5.tgz#aa6bce648332924d9a8489be41e3e5c52d4186dc" + integrity sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw== + dependencies: + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + normalize-path "^3.0.0" + object.defaults "^1.1.0" + +glob@^7.1.1, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +glogg@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + dependencies: + sparkles "^1.0.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.11" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gulp-cli@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" + integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.4.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.2.0" + yargs "^7.1.0" + +gulp@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" + integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== + dependencies: + glob-watcher "^5.0.3" + gulp-cli "^2.2.0" + undertaker "^1.2.1" + vinyl-fs "^3.0.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw== + dependencies: + glogg "^1.0.0" + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA== + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jquery-form@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" + integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== + dependencies: + jquery ">=1.7.2" + +jquery-mousewheel@>=3.0.6: + version "3.1.13" + resolved "https://registry.npmmirror.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" + integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== + +jquery-validation-unobtrusive@^3.2.12: + version "3.2.12" + resolved "https://registry.npmmirror.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.12.tgz#1d52841f653e516525c251e494b042e664dad8af" + integrity sha512-kPixGhVcuat7vZXngGFfSIksy4VlzZcHyRgnBIZdsfVneCU+D5sITC8T8dD/9c9K/Q+qkMlgp7ufJHz93nKSuQ== + dependencies: + jquery "^3.5.1" + jquery-validation ">=1.16" + +jquery-validation@>=1.16, jquery-validation@^1.19.3: + version "1.19.5" + resolved "https://registry.npmmirror.com/jquery-validation/-/jquery-validation-1.19.5.tgz#557495b7cad79716897057c4447ad3cd76fda811" + integrity sha512-X2SmnPq1mRiDecVYL8edWx+yTBZDyC8ohWXFhXdtqFHgU9Wd4KHkvcbCoIZ0JaSaumzS8s2gXSkP8F7ivg/8ZQ== + +jquery@>=1.10, jquery@>=1.12.0, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.5.1: + version "3.7.0" + resolved "https://registry.npmmirror.com/jquery/-/jquery-3.7.0.tgz#fe2c01a05da500709006d8790fe21c8a39d75612" + integrity sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ== + +jquery@~3.6.0: + version "3.6.4" + resolved "https://registry.npmmirror.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" + integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +just-compare@^1.3.0: + version "1.5.1" + resolved "https://registry.npmmirror.com/just-compare/-/just-compare-1.5.1.tgz#aed7e93e6bae9c3b69d79aea7805684132a0c0c5" + integrity sha512-xDEEFHNIyJNmN4uo/2RVeUcay9THtN/5ka/iw98Y/gsa8w9KXZQuyaf5eFUY6VlntA2+G+bdPmdhqqTs7T+BRw== + +just-debounce@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/just-debounce/-/just-debounce-1.1.0.tgz#2f81a3ad4121a76bc7cb45dbf704c0d76a8e5ddf" + integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ== + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + +lazystream@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow== + dependencies: + flush-write-stream "^1.0.2" + +liftoff@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + dependencies: + extend "^3.0.0" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +luxon@^2.3.0: + version "2.5.2" + resolved "https://registry.npmmirror.com/luxon/-/luxon-2.5.2.tgz#17ed497f0277e72d58a4756d6a9abee4681457b6" + integrity sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA== + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +malihu-custom-scrollbar-plugin@^3.1.5: + version "3.1.5" + resolved "https://registry.npmmirror.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef" + integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ== + dependencies: + jquery-mousewheel ">=3.0.6" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA== + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +moment@^2.9.0: + version "2.29.4" + resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + +nan@^2.12.1: + version "2.17.0" + resolved "https://registry.npmmirror.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.4, object.assign@^4.1.0: + version "4.1.4" + resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.defaults@^1.0.0, object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA== + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w== + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw== + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw== + dependencies: + readable-stream "^2.0.1" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== + dependencies: + lcid "^1.0.0" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA== + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +replace-ext@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== + +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg== + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A== + dependencies: + value-or-function "^3.0.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.4.0: + version "1.22.2" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +select2@^4.0.13: + version "4.0.13" + resolved "https://registry.npmmirror.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d" + integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw== + +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ== + dependencies: + sver-compat "^1.5.0" + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.13" + resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== + dependencies: + is-utf8 "^0.2.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg== + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +sweetalert2@^11.3.6: + version "11.7.12" + resolved "https://registry.npmmirror.com/sweetalert2/-/sweetalert2-11.7.12.tgz#3ac15a3138159ccdcd2ec55ea7abe749cd528a80" + integrity sha512-TQJy8mQymJLzqWPQOMQErd81Zd/rSYr0UL4pEc7bqEihtjS+zt7LWJXLhfPp93e+Hf3Z2FHMB6QGNskAMCsdTg== + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== + +timeago@^1.6.7: + version "1.6.7" + resolved "https://registry.npmmirror.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5" + integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ== + dependencies: + jquery ">=1.5.0 <4.0" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA== + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q== + dependencies: + through2 "^2.0.3" + +toastr@^2.1.4: + version "2.1.4" + resolved "https://registry.npmmirror.com/toastr/-/toastr-2.1.4.tgz#8b43be64fb9d0c414871446f2db8e8ca4e95f181" + integrity sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA== + dependencies: + jquery ">=1.12.0" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== + +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw== + +undertaker@^1.2.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/undertaker/-/undertaker-1.3.0.tgz#363a6e541f27954d5791d6fa3c1d321666f86d18" + integrity sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg== + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + fast-levenshtein "^1.0.0" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8flags@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + dependencies: + homedir-polyfill "^1.0.1" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg== + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.npmmirror.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA== + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl@^2.0.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== + +which@^1.2.14: + version "1.3.1" + resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.npmmirror.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +yargs-parser@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-5.0.1.tgz#7ede329c1d8cdbbe209bd25cdb990e9b1ebbb394" + integrity sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA== + dependencies: + camelcase "^3.0.0" + object.assign "^4.1.0" + +yargs@^7.1.0: + version "7.1.2" + resolved "https://registry.npmmirror.com/yargs/-/yargs-7.1.2.tgz#63a0a5d42143879fdbb30370741374e0641d55db" + integrity sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA== + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.1" diff --git a/host/src/Sample.HttpApi/Controllers/SampleController.cs b/host/src/Sample.HttpApi/Controllers/SampleController.cs new file mode 100644 index 0000000..9de3176 --- /dev/null +++ b/host/src/Sample.HttpApi/Controllers/SampleController.cs @@ -0,0 +1,14 @@ +using Sample.Localization; +using Volo.Abp.AspNetCore.Mvc; + +namespace Sample.Controllers; + +/* Inherit your controllers from this class. + */ +public abstract class SampleController : AbpControllerBase +{ + protected SampleController() + { + LocalizationResource = typeof(SampleResource); + } +} diff --git a/host/src/Sample.HttpApi/Models/Test/TestModel.cs b/host/src/Sample.HttpApi/Models/Test/TestModel.cs new file mode 100644 index 0000000..b55a566 --- /dev/null +++ b/host/src/Sample.HttpApi/Models/Test/TestModel.cs @@ -0,0 +1,10 @@ +using System; + +namespace Sample.Models.Test; + +public class TestModel +{ + public string Name { get; set; } + + public DateTime BirthDate { get; set; } +} diff --git a/host/src/Sample.HttpApi/Sample.HttpApi.csproj b/host/src/Sample.HttpApi/Sample.HttpApi.csproj new file mode 100644 index 0000000..be0110b --- /dev/null +++ b/host/src/Sample.HttpApi/Sample.HttpApi.csproj @@ -0,0 +1,24 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + + + + + diff --git a/host/src/Sample.HttpApi/SampleHttpApiModule.cs b/host/src/Sample.HttpApi/SampleHttpApiModule.cs new file mode 100644 index 0000000..cd48d86 --- /dev/null +++ b/host/src/Sample.HttpApi/SampleHttpApiModule.cs @@ -0,0 +1,41 @@ +using Localization.Resources.AbpUi; +using Sample.Localization; +using Volo.Abp.Account; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.HttpApi; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace Sample; + +[DependsOn( + typeof(SampleApplicationContractsModule), + typeof(AbpAccountHttpApiModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpTenantManagementHttpApiModule), + typeof(AbpFeatureManagementHttpApiModule), + typeof(AbpSettingManagementHttpApiModule) + )] +public class SampleHttpApiModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + ConfigureLocalization(); + } + + private void ConfigureLocalization() + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpUiResource) + ); + }); + } +} diff --git a/host/test/Sample.Application.Tests/Sample.Application.Tests.csproj b/host/test/Sample.Application.Tests/Sample.Application.Tests.csproj new file mode 100644 index 0000000..189a3d2 --- /dev/null +++ b/host/test/Sample.Application.Tests/Sample.Application.Tests.csproj @@ -0,0 +1,20 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + diff --git a/host/test/Sample.Application.Tests/SampleApplicationTestBase.cs b/host/test/Sample.Application.Tests/SampleApplicationTestBase.cs new file mode 100644 index 0000000..3ae5613 --- /dev/null +++ b/host/test/Sample.Application.Tests/SampleApplicationTestBase.cs @@ -0,0 +1,6 @@ +namespace Sample; + +public abstract class SampleApplicationTestBase : SampleTestBase +{ + +} diff --git a/host/test/Sample.Application.Tests/SampleApplicationTestModule.cs b/host/test/Sample.Application.Tests/SampleApplicationTestModule.cs new file mode 100644 index 0000000..9466a23 --- /dev/null +++ b/host/test/Sample.Application.Tests/SampleApplicationTestModule.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Modularity; + +namespace Sample; + +[DependsOn( + typeof(SampleApplicationModule), + typeof(SampleDomainTestModule) + )] +public class SampleApplicationTestModule : AbpModule +{ + +} diff --git a/host/test/Sample.Application.Tests/Samples/SampleAppServiceTests.cs b/host/test/Sample.Application.Tests/Samples/SampleAppServiceTests.cs new file mode 100644 index 0000000..80fce7a --- /dev/null +++ b/host/test/Sample.Application.Tests/Samples/SampleAppServiceTests.cs @@ -0,0 +1,32 @@ +using Shouldly; +using System.Threading.Tasks; +using Volo.Abp.Identity; +using Xunit; + +namespace Sample.Samples; + +/* This is just an example test class. + * Normally, you don't test code of the modules you are using + * (like IIdentityUserAppService here). + * Only test your own application services. + */ +public class SampleAppServiceTests : SampleApplicationTestBase +{ + private readonly IIdentityUserAppService _userAppService; + + public SampleAppServiceTests() + { + _userAppService = GetRequiredService(); + } + + [Fact] + public async Task Initial_Data_Should_Contain_Admin_User() + { + //Act + var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(u => u.UserName == "admin"); + } +} diff --git a/host/test/Sample.Domain.Tests/Sample.Domain.Tests.csproj b/host/test/Sample.Domain.Tests/Sample.Domain.Tests.csproj new file mode 100644 index 0000000..93a6185 --- /dev/null +++ b/host/test/Sample.Domain.Tests/Sample.Domain.Tests.csproj @@ -0,0 +1,19 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + diff --git a/host/test/Sample.Domain.Tests/SampleDomainTestBase.cs b/host/test/Sample.Domain.Tests/SampleDomainTestBase.cs new file mode 100644 index 0000000..4e37546 --- /dev/null +++ b/host/test/Sample.Domain.Tests/SampleDomainTestBase.cs @@ -0,0 +1,6 @@ +namespace Sample; + +public abstract class SampleDomainTestBase : SampleTestBase +{ + +} diff --git a/host/test/Sample.Domain.Tests/SampleDomainTestModule.cs b/host/test/Sample.Domain.Tests/SampleDomainTestModule.cs new file mode 100644 index 0000000..f47a9cc --- /dev/null +++ b/host/test/Sample.Domain.Tests/SampleDomainTestModule.cs @@ -0,0 +1,12 @@ +using Sample.EntityFrameworkCore; +using Volo.Abp.Modularity; + +namespace Sample; + +[DependsOn( + typeof(SampleEntityFrameworkCoreTestModule) + )] +public class SampleDomainTestModule : AbpModule +{ + +} diff --git a/host/test/Sample.Domain.Tests/Samples/SampleDomainTests.cs b/host/test/Sample.Domain.Tests/Samples/SampleDomainTests.cs new file mode 100644 index 0000000..1d4b8f9 --- /dev/null +++ b/host/test/Sample.Domain.Tests/Samples/SampleDomainTests.cs @@ -0,0 +1,44 @@ +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Identity; +using Xunit; + +namespace Sample.Samples; + +/* This is just an example test class. + * Normally, you don't test code of the modules you are using + * (like IdentityUserManager here). + * Only test your own domain services. + */ +public class SampleDomainTests : SampleDomainTestBase +{ + private readonly IIdentityUserRepository _identityUserRepository; + private readonly IdentityUserManager _identityUserManager; + + public SampleDomainTests() + { + _identityUserRepository = GetRequiredService(); + _identityUserManager = GetRequiredService(); + } + + [Fact] + public async Task Should_Set_Email_Of_A_User() + { + IdentityUser adminUser; + + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + await WithUnitOfWorkAsync(async () => + { + adminUser = await _identityUserRepository + .FindByNormalizedUserNameAsync("ADMIN"); + + await _identityUserManager.SetEmailAsync(adminUser, "newemail@abp.io"); + await _identityUserRepository.UpdateAsync(adminUser); + }); + + adminUser = await _identityUserRepository.FindByNormalizedUserNameAsync("ADMIN"); + adminUser.Email.ShouldBe("newemail@abp.io"); + } +} diff --git a/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestBase.cs b/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestBase.cs new file mode 100644 index 0000000..1aed07d --- /dev/null +++ b/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestBase.cs @@ -0,0 +1,8 @@ +using Volo.Abp; + +namespace Sample.EntityFrameworkCore; + +public abstract class SampleEntityFrameworkCoreTestBase : SampleTestBase +{ + +} diff --git a/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestModule.cs b/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestModule.cs new file mode 100644 index 0000000..9576a16 --- /dev/null +++ b/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/SampleEntityFrameworkCoreTestModule.cs @@ -0,0 +1,76 @@ +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Sqlite; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; + +namespace Sample.EntityFrameworkCore; + +[DependsOn( + typeof(SampleEntityFrameworkCoreModule), + typeof(SampleTestBaseModule), + typeof(AbpEntityFrameworkCoreSqliteModule) + )] +public class SampleEntityFrameworkCoreTestModule : AbpModule +{ + private SqliteConnection? _sqliteConnection; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.SaveStaticFeaturesToDatabase = false; + options.IsDynamicFeatureStoreEnabled = false; + }); + Configure(options => + { + options.SaveStaticPermissionsToDatabase = false; + options.IsDynamicPermissionStoreEnabled = false; + }); + context.Services.AddAlwaysDisableUnitOfWorkTransaction(); + + ConfigureInMemorySqlite(context.Services); + } + + private void ConfigureInMemorySqlite(IServiceCollection services) + { + _sqliteConnection = CreateDatabaseAndGetConnection(); + + services.Configure(options => + { + options.Configure(context => + { + context.DbContextOptions.UseSqlite(_sqliteConnection); + }); + }); + } + + public override void OnApplicationShutdown(ApplicationShutdownContext context) + { + _sqliteConnection?.Dispose(); + } + + private static SqliteConnection CreateDatabaseAndGetConnection() + { + var connection = new SqliteConnection("Data Source=:memory:"); + connection.Open(); + + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + using (var context = new SampleDbContext(options)) + { + context.GetService().CreateTables(); + } + + return connection; + } +} diff --git a/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs b/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs new file mode 100644 index 0000000..09705d7 --- /dev/null +++ b/host/test/Sample.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs @@ -0,0 +1,43 @@ +using Microsoft.EntityFrameworkCore; +using Shouldly; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; +using Xunit; + +namespace Sample.EntityFrameworkCore.Samples; + +/* This is just an example test class. + * Normally, you don't test ABP framework code + * (like default AppUser repository IRepository here). + * Only test your custom repository methods. + */ +public class SampleRepositoryTests : SampleEntityFrameworkCoreTestBase +{ + private readonly IRepository _appUserRepository; + + public SampleRepositoryTests() + { + _appUserRepository = GetRequiredService>(); + } + + [Fact] + public async Task Should_Query_AppUser() + { + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + await WithUnitOfWorkAsync(async () => + { + //Act + var adminUser = await (await _appUserRepository.GetQueryableAsync()) + .Where(u => u.UserName == "admin") + .FirstOrDefaultAsync(); + + //Assert + adminUser.ShouldNotBeNull(); + }); + } +} diff --git a/host/test/Sample.EntityFrameworkCore.Tests/Sample.EntityFrameworkCore.Tests.csproj b/host/test/Sample.EntityFrameworkCore.Tests/Sample.EntityFrameworkCore.Tests.csproj new file mode 100644 index 0000000..ad67fa6 --- /dev/null +++ b/host/test/Sample.EntityFrameworkCore.Tests/Sample.EntityFrameworkCore.Tests.csproj @@ -0,0 +1,21 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + + diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs b/host/test/Sample.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs new file mode 100644 index 0000000..7306ee7 --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Account; +using Volo.Abp.DependencyInjection; + +namespace Sample.HttpApi.Client.ConsoleTestApp; + +public class ClientDemoService : ITransientDependency +{ + private readonly IProfileAppService _profileAppService; + + public ClientDemoService(IProfileAppService profileAppService) + { + _profileAppService = profileAppService; + } + + public async Task RunAsync() + { + var output = await _profileAppService.GetAsync(); + Console.WriteLine($"UserName : {output.UserName}"); + Console.WriteLine($"Email : {output.Email}"); + Console.WriteLine($"Name : {output.Name}"); + Console.WriteLine($"Surname : {output.Surname}"); + } +} diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs b/host/test/Sample.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs new file mode 100644 index 0000000..3119d91 --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Hosting; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; + +namespace Sample.HttpApi.Client.ConsoleTestApp; + +public class ConsoleTestAppHostedService : IHostedService +{ + private readonly IConfiguration _configuration; + + public ConsoleTestAppHostedService(IConfiguration configuration) + { + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + })) + { + await application.InitializeAsync(); + + var demo = application.ServiceProvider.GetRequiredService(); + await demo.RunAsync(); + + await application.ShutdownAsync(); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/Program.cs b/host/test/Sample.HttpApi.Client.ConsoleTestApp/Program.cs new file mode 100644 index 0000000..f14d6de --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/Program.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Sample.HttpApi.Client.ConsoleTestApp; + +class Program +{ + static async Task Main(string[] args) + { + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); +} diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/Sample.HttpApi.Client.ConsoleTestApp.csproj b/host/test/Sample.HttpApi.Client.ConsoleTestApp/Sample.HttpApi.Client.ConsoleTestApp.csproj new file mode 100644 index 0000000..30c511c --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/Sample.HttpApi.Client.ConsoleTestApp.csproj @@ -0,0 +1,33 @@ + + + + Exe + net7.0 + enable + + + + + + PreserveNewest + Always + + + + PreserveNewest + Always + + + + + + + + + + + + + + + diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/SampleConsoleApiClientModule.cs b/host/test/Sample.HttpApi.Client.ConsoleTestApp/SampleConsoleApiClientModule.cs new file mode 100644 index 0000000..7629cde --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/SampleConsoleApiClientModule.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Polly; +using Volo.Abp.Autofac; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.IdentityModel; +using Volo.Abp.Modularity; + +namespace Sample.HttpApi.Client.ConsoleTestApp; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(SampleHttpApiClientModule), + typeof(AbpHttpClientIdentityModelModule) + )] +public class SampleConsoleApiClientModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) => + { + clientBuilder.AddTransientHttpErrorPolicy( + policyBuilder => policyBuilder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))) + ); + }); + }); + } +} diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.json b/host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.json new file mode 100644 index 0000000..9d7da0b --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.json @@ -0,0 +1,17 @@ +{ + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44336" + } + }, + "IdentityClients": { + "Default": { + "GrantType": "password", + "ClientId": "Sample_App", + "UserName": "admin", + "UserPassword": "1q2w3E*", + "Authority": "https://localhost:44336", + "Scope": "Sample" + } + } +} diff --git a/host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json b/host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/host/test/Sample.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/host/test/Sample.TestBase/Sample.TestBase.csproj b/host/test/Sample.TestBase/Sample.TestBase.csproj new file mode 100644 index 0000000..2ae579f --- /dev/null +++ b/host/test/Sample.TestBase/Sample.TestBase.csproj @@ -0,0 +1,31 @@ + + + + + + net7.0 + enable + Sample + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + diff --git a/host/test/Sample.TestBase/SampleTestBase.cs b/host/test/Sample.TestBase/SampleTestBase.cs new file mode 100644 index 0000000..bf60177 --- /dev/null +++ b/host/test/Sample.TestBase/SampleTestBase.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; +using Volo.Abp.Testing; + +namespace Sample; + +/* All test classes are derived from this class, directly or indirectly. + */ +public abstract class SampleTestBase : AbpIntegratedTest + where TStartupModule : IAbpModule +{ + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + await action(); + + await uow.CompleteAsync(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = await func(); + await uow.CompleteAsync(); + return result; + } + } + } +} diff --git a/host/test/Sample.TestBase/SampleTestBaseModule.cs b/host/test/Sample.TestBase/SampleTestBaseModule.cs new file mode 100644 index 0000000..b9a9d4c --- /dev/null +++ b/host/test/Sample.TestBase/SampleTestBaseModule.cs @@ -0,0 +1,52 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Authorization; +using Volo.Abp.Autofac; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.Data; +using Volo.Abp.Modularity; +using Volo.Abp.Threading; + +namespace Sample; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(AbpTestBaseModule), + typeof(AbpAuthorizationModule), + typeof(SampleDomainModule) + )] +public class SampleTestBaseModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.IsJobExecutionEnabled = false; + }); + + context.Services.AddAlwaysAllowAuthorization(); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + SeedTestData(context); + } + + private static void SeedTestData(ApplicationInitializationContext context) + { + AsyncHelper.RunSync(async () => + { + using (var scope = context.ServiceProvider.CreateScope()) + { + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); + } + }); + } +} diff --git a/host/test/Sample.TestBase/SampleTestDataSeedContributor.cs b/host/test/Sample.TestBase/SampleTestDataSeedContributor.cs new file mode 100644 index 0000000..5915573 --- /dev/null +++ b/host/test/Sample.TestBase/SampleTestDataSeedContributor.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Sample; + +public class SampleTestDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + public Task SeedAsync(DataSeedContext context) + { + /* Seed additional test data... */ + + return Task.CompletedTask; + } +} diff --git a/host/test/Sample.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/host/test/Sample.TestBase/Security/FakeCurrentPrincipalAccessor.cs new file mode 100644 index 0000000..7b30664 --- /dev/null +++ b/host/test/Sample.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Security.Claims; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Security.Claims; + +namespace Sample.Security; + +[Dependency(ReplaceServices = true)] +public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor +{ + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return GetPrincipal(); + } + + private ClaimsPrincipal GetPrincipal() + { + return new ClaimsPrincipal(new ClaimsIdentity(new List + { + new Claim(AbpClaimTypes.UserId, "2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), + new Claim(AbpClaimTypes.UserName, "admin"), + new Claim(AbpClaimTypes.Email, "admin@abp.io") + })); + } +}