Browse Source

Merge remote-tracking branch 'abpframework/dev' into docs

pull/3228/head
liangshiwei 6 years ago
parent
commit
aed51f29f0
  1. 2
      common.props
  2. 26
      docs/en/CLI.md
  3. 188
      docs/en/UI/AspNetCore/Tag-Helpers/Cards.md
  4. 4
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController.cs
  5. 83
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
  6. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs
  7. 731
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs
  8. 31
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  9. 29
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveRootFolderStep.cs
  10. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs
  11. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
  12. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageInfo.cs
  13. 18
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFileNameHelper.cs
  14. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs
  15. 13
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
  16. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs
  17. 1
      framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj
  18. 16
      framework/src/Volo.Abp.Core/System/AbpTypeExtensions.cs
  19. 4
      framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs
  20. 56
      framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs
  21. 7
      framework/src/Volo.Abp.Core/Volo/Abp/Threading/AsyncHelper.cs
  22. 4
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
  23. 6
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs
  24. 7
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModelRequestDto.cs
  25. 8
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerApiDescriptionModel.cs
  26. 4
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerInterfaceApiDescriptionModel.cs
  27. 2
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/IApiDescriptionModelProvider.cs
  28. 8
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/MethodParameterApiDescriptionModel.cs
  29. 127
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModelingTypeHelper.cs
  30. 7
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ParameterApiDescriptionModel.cs
  31. 46
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/PropertyApiDescriptionModel.cs
  32. 9
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ReturnValueApiDescriptionModel.cs
  33. 54
      framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/TypeApiDescriptionModel.cs
  34. 4
      framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs
  35. 2
      framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs
  36. 12
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController_Tests.cs
  37. 2
      framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectFinder_Tests.cs
  38. 56
      framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeHelper_Tests.cs
  39. 2
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs
  40. 11
      npm/get-version.js
  41. 2
      npm/lerna.json
  42. 2
      npm/ng-packs/lerna.version.json
  43. 2
      npm/ng-packs/package.json
  44. 2
      npm/ng-packs/packages/account-config/package.json
  45. 6
      npm/ng-packs/packages/account/package.json
  46. 2
      npm/ng-packs/packages/core/package.json
  47. 124
      npm/ng-packs/packages/core/src/lib/models/dtos.ts
  48. 1
      npm/ng-packs/packages/core/src/lib/models/index.ts
  49. 4
      npm/ng-packs/packages/feature-management/package.json
  50. 2
      npm/ng-packs/packages/identity-config/package.json
  51. 8
      npm/ng-packs/packages/identity/package.json
  52. 4
      npm/ng-packs/packages/permission-management/package.json
  53. 2
      npm/ng-packs/packages/setting-management-config/package.json
  54. 6
      npm/ng-packs/packages/setting-management/package.json
  55. 2
      npm/ng-packs/packages/tenant-management-config/package.json
  56. 8
      npm/ng-packs/packages/tenant-management/package.json
  57. 20
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html
  58. 15
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts
  59. 5
      npm/ng-packs/packages/tenant-management/src/lib/models/tenant-management.ts
  60. 24
      npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts
  61. 4
      npm/ng-packs/packages/theme-basic/package.json
  62. 4
      npm/ng-packs/packages/theme-shared/package.json
  63. 2
      npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts
  64. 181
      npm/ng-packs/yarn.lock
  65. 2
      npm/package-lock.json
  66. 6
      npm/packs/anchor-js/package.json
  67. 6
      npm/packs/aspnetcore.mvc.ui.theme.basic/package.json
  68. 32
      npm/packs/aspnetcore.mvc.ui.theme.shared/package.json
  69. 4
      npm/packs/aspnetcore.mvc.ui/package.json
  70. 10
      npm/packs/blogging/package.json
  71. 4
      npm/packs/bootstrap-datepicker/package.json
  72. 6
      npm/packs/bootstrap/package.json
  73. 4
      npm/packs/chart.js/package.json
  74. 6
      npm/packs/clipboard/package.json
  75. 6
      npm/packs/codemirror/package.json
  76. 4
      npm/packs/core/package.json
  77. 6
      npm/packs/datatables.net-bs4/package.json
  78. 6
      npm/packs/datatables.net/package.json
  79. 14
      npm/packs/docs/package.json
  80. 4
      npm/packs/flag-icon-css/package.json
  81. 6
      npm/packs/font-awesome/package.json
  82. 6
      npm/packs/highlight.js/package.json
  83. 6
      npm/packs/jquery-form/package.json
  84. 6
      npm/packs/jquery-validation-unobtrusive/package.json
  85. 6
      npm/packs/jquery-validation/package.json
  86. 6
      npm/packs/jquery/package.json
  87. 6
      npm/packs/lodash/package.json
  88. 4
      npm/packs/luxon/package.json
  89. 6
      npm/packs/malihu-custom-scrollbar-plugin/package.json
  90. 6
      npm/packs/markdown-it/package.json
  91. 6
      npm/packs/owl.carousel/package.json
  92. 6
      npm/packs/popper.js/package.json
  93. 6
      npm/packs/prismjs/package.json
  94. 6
      npm/packs/select2/package.json
  95. 6
      npm/packs/sweetalert/package.json
  96. 6
      npm/packs/timeago/package.json
  97. 6
      npm/packs/toastr/package.json
  98. 12
      npm/packs/tui-editor/package.json
  99. 1
      npm/preview-publish.ps1
  100. 1
      nupkg/common.ps1

2
common.props

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

26
docs/en/CLI.md

@ -59,6 +59,7 @@ abp new Acme.BookStore
* `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory.
* `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version.
* `--template-source` or `-ts`: Specifies a custom template source to use to build the project. Local and network sources can be used(Like `D\localTemplate` or `https://<your url>.zip`).
* `--create-solution-folder` or `-csf`: Specifies if the project will be in a new folder in the output folder or directly the output folder.
### add-package
@ -177,6 +178,29 @@ Logs you out by removing the session token from your computer.
abp logout
```
### generate-proxy
Generates typescript service proxies and DTOs
Basic usage:
````bash
abp generate-proxy [options]
````
Example:
````bash
abp generate-proxy --apiUrl https://localhost:44305 --ui angular --module all
````
#### Options
* `--apiUrl` or `-a`: If you don't give this option, the default api url in your environment.ts file is used, but you can always use a specific api source with this option.
* `--ui` or `-u`: Specifies the UI framework. Default framework is angular. Currently there is only angular option, but we will increase the options with our new cli updates. Stay tuned!
* `--module` or `-m`: Specifies the module name. Default module name is app. If you want to all modules. You can give `--module all` command.
### help
Writes basic usage information of the CLI.
@ -192,4 +216,4 @@ Examples:
````bash
abp help # Shows a general help.
abp help new # Shows help about the "new" command.
````
````

188
docs/en/UI/AspNetCore/Tag-Helpers/Cards.md

@ -0,0 +1,188 @@
# Cards
## Introduction
`abp-card` is a content container derived from bootstrap card element.
Basic usage:
````xml
<abp-card style="width: 18rem;">
<img abp-card-image="Top" src="~/imgs/demo/300x200.png"/>
<abp-card-body>
<abp-card-title>Card Title</abp-card-title>
<abp-card-text>Some quick example text to build on the card title and make up the bulk of the card's content.</abp-card-text>
<a abp-button="Primary" href="#"> Go somewhere</a>
</abp-card-body>
</abp-card>
````
##### Using Titles, Text and Links:
Following tags can be used under main `abp-card` tag
* `abp-card-title`
* `abp-card-subtitle`
* `a abp-card-link`
Sample:
````xml
<abp-card style="width: 18rem;">
<abp-card-body>
<abp-card-title>Card title</abp-card-title>
<abp-card-subtitle class="mb-2 text-muted">Card subtitle</abp-card-subtitle>
<abp-card-text>Some quick example text to build on the card title and make up the bulk of the card's content.</abp-card-text>
<a abp-card-link href="#">Card link</a>
<a abp-card-link href="#">Another link</a>
</abp-card-body>
</abp-card>
````
##### Using List Groups:
* `abp-list-group flush="true"` : `flush` attribute renders into bootstrap `list-group-flush` class which is used for removing borders and rounded corners to render list group items edge to edge in a parent container.
* `abp-list-group-item`
Kitchen Sink Sample:
````xml
<abp-card style="width: 18rem;">
<img abp-card-image="Top" src="~/imgs/demo/300x200.png" />
<abp-card-body>
<abp-card-title>Card Title</abp-card-title>
<abp-card-text>Some quick example text to build on the card title and make up the bulk of the card's content.</abp-card-text>
</abp-card-body>
<abp-list-group flush="true">
<abp-list-group-item>Cras justo odio</abp-list-group-item>
<abp-list-group-item>Dapibus ac facilisis in</abp-list-group-item>
<abp-list-group-item>Vestibulum at eros</abp-list-group-item>
</abp-list-group>
<abp-card-body>
<a abp-card-link href="#">Card link</a>
<a abp-card-link href="#">Another link</a>
</abp-card-body>
</abp-card>
````
##### Using Header, Footer and Blockquote:
* `abp-card-header`
* `abp-card-footer`
* `abp-blockquote`
Sample:
```xml
<abp-card style="width: 18rem;">
<abp-card-header>Featured</abp-card-header>
<abp-card-body>
<abp-card-title> Special title treatment</abp-card-title>
<abp-card-text>With supporting text below as a natural lead-in to additional content.</abp-card-text>
<a abp-button="Primary" href="#"> Go somewhere</a>
</abp-card-body>
</abp-card>
```
Quote Sample:
```xml
<abp-card>
<abp-card-header>Quote</abp-card-header>
<abp-card-body>
<abp-blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
<footer>Someone famous in Source Title</footer>
</abp-blockquote>
</abp-card-body>
</abp-card>
```
Footer Sample:
```xml
<abp-card class="text-center">
<abp-card-header>Featured</abp-card-header>
<abp-card-body>
<abp-blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
<footer>Someone famous in Source Title</footer>
</abp-blockquote>
</abp-card-body>
<abp-card-footer class="text-muted"> 2 days ago</abp-card-footer>
</abp-card>
```
## Demo
See the [cards demo page](https://bootstrap-taghelpers.abp.io/Components/Cards) to see it in action.
## abp-card Attributes
- **background:** A value indicates the background color of the card.
- **text-color**: A value indicates the color of the text inside the card.
- **border:** A value indicates the color of the border inside the card.
Should be one of the following values:
* `Default` (default value)
* `Primary`
* `Secondary`
* `Success`
* `Danger`
* `Warning`
* `Info`
* `Light`
* `Dark`
Example:
````xml
<abp-card background="Success" text-color="Danger" border="Dark">
````
### sizing
Cards has default 100% with and can be changed with custom CSS, grid classes, grid Sass mixins or [utilities](https://getbootstrap.com/docs/4.0/utilities/sizing/).
````xml
<abp-card style="width: 18rem;">
````
### card-deck and card-columns
`abp-card` can be used inside `card-deck` or `card-columns` aswell.
````xml
<div class="card-deck">
<abp-card background="Primary">
<abp-card-header>First Deck</abp-card-header>
<abp-card-body>
<abp-card-title> Ace </abp-card-title>
<abp-card-text>Here is the content for Ace.</abp-card-text>
</abp-card-body>
</abp-card>
<abp-card background="Info">
<abp-card-header>Second Deck</abp-card-header>
<abp-card-body>
<abp-card-title> Beta </abp-card-title>
<abp-card-text>Beta content.</abp-card-text>
</abp-card-body>
</abp-card>
<abp-card background="Warning">
<abp-card-header>Third Deck</abp-card-header>
<abp-card-body>
<abp-card-title> Epsilon </abp-card-title>
<abp-card-text>Content for Epsilon.</abp-card-text>
</abp-card-body>
</abp-card>
</div>
````

4
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController.cs

@ -14,9 +14,9 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring
}
[HttpGet]
public ApplicationApiDescriptionModel Get()
public ApplicationApiDescriptionModel Get(ApplicationApiDescriptionModelRequestDto model)
{
return _modelProvider.CreateApiModel();
return _modelProvider.CreateApiModel(model);
}
}
}

83
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
@ -12,10 +13,13 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Mvc.ApiExploring;
using Volo.Abp.AspNetCore.Mvc.Conventions;
using Volo.Abp.AspNetCore.Mvc.Utils;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
using Volo.Abp.Reflection;
using Volo.Abp.Threading;
namespace Volo.Abp.AspNetCore.Mvc
{
@ -39,7 +43,7 @@ namespace Volo.Abp.AspNetCore.Mvc
Logger = NullLogger<AspNetCoreApiDescriptionModelProvider>.Instance;
}
public ApplicationApiDescriptionModel CreateApiModel()
public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input)
{
//TODO: Can cache the model?
@ -54,19 +58,22 @@ namespace Volo.Abp.AspNetCore.Mvc
continue;
}
AddApiDescriptionToModel(apiDescription, model);
AddApiDescriptionToModel(apiDescription, model, input);
}
}
return model;
}
private void AddApiDescriptionToModel(ApiDescription apiDescription, ApplicationApiDescriptionModel model)
private void AddApiDescriptionToModel(
ApiDescription apiDescription,
ApplicationApiDescriptionModel applicationModel,
ApplicationApiDescriptionModelRequestDto input)
{
var controllerType = apiDescription.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType();
var setting = FindSetting(controllerType);
var moduleModel = model.GetOrAddModule(GetRootPath(controllerType, setting));
var moduleModel = applicationModel.GetOrAddModule(GetRootPath(controllerType, setting));
var controllerModel = moduleModel.GetOrAddController(controllerType.FullName, CalculateControllerName(controllerType, setting), controllerType, _modelOptions.IgnoredInterfaces);
@ -80,6 +87,7 @@ namespace Volo.Abp.AspNetCore.Mvc
}
Logger.LogDebug($"ActionApiDescriptionModel.Create: {controllerModel.ControllerName}.{uniqueMethodName}");
var actionModel = controllerModel.AddAction(uniqueMethodName, ActionApiDescriptionModel.Create(
uniqueMethodName,
method,
@ -88,6 +96,11 @@ namespace Volo.Abp.AspNetCore.Mvc
GetSupportedVersions(controllerType, method, setting)
));
if (input.IncludeTypes)
{
AddCustomTypesToModel(applicationModel, method);
}
AddParameterDescriptionsToModel(actionModel, method, apiDescription);
}
@ -149,6 +162,68 @@ namespace Volo.Abp.AspNetCore.Mvc
return supportedVersions.Select(v => v.ToString()).Distinct().ToList();
}
private void AddCustomTypesToModel(ApplicationApiDescriptionModel applicationModel, MethodInfo method)
{
foreach (var parameterInfo in method.GetParameters())
{
AddCustomTypesToModel(applicationModel, parameterInfo.ParameterType);
}
AddCustomTypesToModel(applicationModel, method.ReturnType);
}
private static void AddCustomTypesToModel(ApplicationApiDescriptionModel applicationModel, [CanBeNull] Type type)
{
if (type == null)
{
return;
}
type = AsyncHelper.UnwrapTask(type);
if (type == typeof(object) ||
type == typeof(void) ||
type == typeof(Enum) ||
type == typeof(ValueType) ||
TypeHelper.IsPrimitiveExtended(type))
{
return;
}
if (TypeHelper.IsEnumerable(type, out var itemType))
{
AddCustomTypesToModel(applicationModel, itemType);
return;
}
if (TypeHelper.IsDictionary(type, out var keyType, out var valueType))
{
AddCustomTypesToModel(applicationModel, keyType);
AddCustomTypesToModel(applicationModel, valueType);
return;
}
/* TODO: Add interfaces
*/
var typeName = ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(type);
if (applicationModel.Types.ContainsKey(typeName))
{
return;
}
var typeModel = TypeApiDescriptionModel.Create(type);
applicationModel.Types[typeName] = typeModel;
AddCustomTypesToModel(applicationModel, type.BaseType);
foreach (var propertyInfo in type.GetProperties())
{
AddCustomTypesToModel(applicationModel, propertyInfo.PropertyType);
}
}
private void AddParameterDescriptionsToModel(ActionApiDescriptionModel actionModel, MethodInfo method, ApiDescription apiDescription)
{
if (!apiDescription.ParameterDescriptions.Any())

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs

@ -28,10 +28,11 @@ namespace Volo.Abp.Cli
options.Commands["add-package"] = typeof(AddPackageCommand);
options.Commands["add-module"] = typeof(AddModuleCommand);
options.Commands["login"] = typeof(LoginCommand);
options.Commands["logout"] = typeof(LogoutCommand);
options.Commands["logout"] = typeof(LogoutCommand);
options.Commands["generate-proxy"] = typeof(GenerateProxyCommand);
options.Commands["suite"] = typeof(SuiteCommand);
options.Commands["switch-to-preview"] = typeof(SwitchNightlyPreviewCommand);
options.Commands["switch-to-stable"] = typeof(SwitchStableCommand);
options.Commands["switch-to-stable"] = typeof(SwitchStableCommand);
});
}
}

731
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs

@ -0,0 +1,731 @@
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.DependencyInjection;
using System.Collections.Generic;
using System.Linq;
using System.Net;
namespace Volo.Abp.Cli.Commands
{
public class GenerateProxyCommand : IConsoleCommand, ITransientDependency
{
public static Dictionary<string, Dictionary<string, string>> propertyList = new Dictionary<string, Dictionary<string, string>>();
public ILogger<GenerateProxyCommand> Logger { get; set; }
protected TemplateProjectBuilder TemplateProjectBuilder { get; }
public GenerateProxyCommand(TemplateProjectBuilder templateProjectBuilder)
{
TemplateProjectBuilder = templateProjectBuilder;
Logger = NullLogger<GenerateProxyCommand>.Instance;
}
public async Task ExecuteAsync(CommandLineArgs commandLineArgs)
{
var angularPath = $"angular.json";
if (!File.Exists(angularPath))
{
throw new CliUsageException(
"angular.json file not found. You must run this command in angular folder." +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
var module = commandLineArgs.Options.GetOrNull(Options.Module.Short, Options.Module.Long);
module = module == null ? "app" : module.ToLower();
var apiUrl = commandLineArgs.Options.GetOrNull(Options.ApiUrl.Short, Options.ApiUrl.Long);
if (string.IsNullOrWhiteSpace(apiUrl))
{
var environmentJson = File.ReadAllText("src/environments/environment.ts").Split("export const environment = ")[1].Replace(";", " ");
var environment = JObject.Parse(environmentJson);
apiUrl = environment["apis"]["default"]["url"].ToString();
}
apiUrl += "/api/abp/api-definition?IncludeTypes=true";
var uiFramework = GetUiFramework(commandLineArgs);
WebClient client = new WebClient();
string json = client.DownloadString(apiUrl);
//var sr = File.OpenText("api-definition.json");
//var json = sr.ReadToEnd();
Logger.LogInformation("Downloading api definition...");
Logger.LogInformation("Api Url: " + apiUrl);
var data = JObject.Parse(json);
Logger.LogInformation("Modules are combining");
var moduleList = GetCombinedModules(data, module);
if (moduleList.Count < 1)
{
throw new CliUsageException(
"Module can not find!" +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
Logger.LogInformation("Modules and types are creating");
foreach (var moduleItem in moduleList)
{
var moduleValue = JObject.Parse(moduleItem.Value);
var rootPath = moduleItem.Key;
Logger.LogInformation($"{rootPath} directory is creating");
Directory.CreateDirectory($"src/app/{rootPath}/shared/models");
Directory.CreateDirectory($"src/app/{rootPath}/shared/services");
var serviceIndexList = new List<string>();
var modelIndexList = new List<string>();
foreach (var controller in moduleValue.Root.ToList().Select(item => item.First))
{
var serviceFileText = new StringBuilder();
serviceFileText.AppendLine("[firstTypeList]");
serviceFileText.AppendLine("import { Injectable } from '@angular/core';");
serviceFileText.AppendLine("import { Observable } from 'rxjs';");
serviceFileText.AppendLine("[secondTypeList]");
serviceFileText.AppendLine("");
serviceFileText.AppendLine("@Injectable({providedIn: 'root'})");
serviceFileText.AppendLine("export class [controllerName]Service {");
serviceFileText.AppendLine(" constructor(private restService: RestService) {}");
serviceFileText.AppendLine("");
var firstTypeList = new List<string>();
var secondTypeList = new List<string>();
var controllerName = (string)controller["controllerName"];
var controllerServiceName = controllerName.PascalToKebabCase() + ".service.ts";
foreach (var actionItem in controller["actions"])
{
var action = actionItem.First;
var actionName = (string)action["uniqueName"];
actionName = (char.ToLower(actionName[0]) + actionName.Substring(1)).Replace("Async", "").Replace("Controller", "");
var returnValueType = (string)action["returnValue"]["type"];
var parameters = action["parameters"];
var parametersText = new StringBuilder();
var parametersIndex = 0;
var bodyExtra = "";
var modelBindingExtra = "";
var modelBindingExtraList = new List<string>();
var parameterModel = new List<ParameterModel>();
foreach (var parameter in parameters.OrderBy(p => p["bindingSourceId"]))
{
var bindingSourceId = (string)parameter["bindingSourceId"];
bindingSourceId = char.ToLower(bindingSourceId[0]) + bindingSourceId.Substring(1);
var name = (string)parameter["name"];
var typeSimple = (string)parameter["typeSimple"];
var typeArray = ((string)parameter["type"]).Split(".");
var type = (typeArray[typeArray.Length - 1]).TrimEnd('>');
var isOptional = (bool)parameter["isOptional"];
var defaultValue = (string)parameter["defaultValue"];
var modelIndex = CreateType(data, (string)parameter["type"], rootPath, modelIndexList);
if (!string.IsNullOrWhiteSpace(modelIndex))
{
modelIndexList.Add(modelIndex);
}
if (bindingSourceId == "body")
{
bodyExtra = ", body";
parameterModel = AddParameter(bindingSourceId, type, isOptional, defaultValue, bindingSourceId, parameterModel);
}
else if (bindingSourceId == "path")
{
parameterModel = AddParameter(name, typeSimple, isOptional, defaultValue, bindingSourceId, parameterModel);
}
else if (bindingSourceId == "modelBinding")
{
var parameterNameOnMethod = (string)parameter["nameOnMethod"];
var parametersOnMethod = action["parametersOnMethod"];
foreach (var parameterOnMethod in parametersOnMethod)
{
var parametersOnMethodName = (string)parameterOnMethod["name"];
if (parametersOnMethodName == parameterNameOnMethod)
{
typeSimple = (string)parameterOnMethod["typeSimple"];
typeArray = ((string)parameterOnMethod["type"]).Split(".");
type = typeArray[typeArray.Length - 1];
isOptional = (bool)parameterOnMethod["isOptional"];
defaultValue = (string)parameterOnMethod["defaultValue"];
if (typeSimple == "string" || typeSimple == "boolean" || typeSimple == "number")
{
parameterModel = AddParameter(name, typeSimple, isOptional, defaultValue, bindingSourceId, parameterModel);
}
modelIndex = CreateType(data, (string)parameterOnMethod["type"], rootPath, modelIndexList);
if (!string.IsNullOrWhiteSpace(modelIndex))
{
modelIndexList.Add(modelIndex);
}
}
}
if (typeSimple != "string" && typeSimple != "boolean" && typeSimple != "number")
{
parametersText.Append($"params = {{}} as {type}");
modelBindingExtra = ", params";
if (!string.IsNullOrWhiteSpace(modelIndex))
{
secondTypeList.Add(type);
}
else {
firstTypeList.Add(type);
}
break;
}
}
}
if (parameterModel != null && parameterModel.Count > 0)
{
foreach (var parameterItem in parameterModel.OrderBy(p => p.DisplayOrder))
{
var parameterItemModelName = parameterItem.Type.PascalToKebabCase() + ".ts";
var parameterItemModelPath = $"src/app/{rootPath}/shared/models/{parameterItemModelName}";
if (parameterItem.BindingSourceId == "body" && !File.Exists(parameterItemModelPath))
{
parameterItem.Type = "any";
}
parametersIndex++;
if (parametersIndex > 1)
{
parametersText.Append(", ");
}
parametersText.Append(parameterItem.Name + (parameterItem.IsOptional ? "?" : "") + ": " + parameterItem.Type + (parameterItem.Value != null ? (" = " + (string.IsNullOrWhiteSpace(parameterItem.Value) ? "''" : parameterItem.Value)) : ""));
if (parameterItem.BindingSourceId == "modelBinding")
{
modelBindingExtraList.Add(parameterItem.Name);
}
else if (parameterItem.BindingSourceId == "body" && File.Exists(parameterItemModelPath))
{
secondTypeList.Add(parameterItem.Type);
}
}
}
if (returnValueType != null)
{
if (returnValueType.IndexOf('<') > -1)
{
var firstTypeArray = returnValueType.Split("<")[0].Split(".");
var firstType = firstTypeArray[firstTypeArray.Length - 1];
var secondTypeArray = returnValueType.Split("<")[1].Split(".");
var secondType = secondTypeArray[secondTypeArray.Length - 1].TrimEnd('>');
var secondTypeModelName = secondType.PascalToKebabCase() + ".ts";
var secondTypeModelPath = $"src/app/{rootPath}/shared/models/{secondTypeModelName}";
if (firstType == "List" && !File.Exists(secondTypeModelPath))
{
secondType = "any";
}
serviceFileText.AppendLine(
firstType == "List"
? $" {actionName}({parametersText}): Observable<{secondType}[]> {{"
: $" {actionName}({parametersText}): Observable<{firstType}<{secondType}>> {{");
if (firstType != "List")
{
firstTypeList.Add(firstType);
}
if (secondType != "any")
{
secondTypeList.Add(secondType);
}
}
else
{
var typeArray = returnValueType.Split(".");
var type = typeArray[typeArray.Length - 1].TrimEnd('>');
type = type switch
{
"Void" => "void",
"String" => "string",
"IActionResult" => "void",
"ActionResult" => "void",
_ => type
};
serviceFileText.AppendLine(
$" {actionName}({parametersText}): Observable<{type}> {{");
if (type != "void" && type != "string")
{
secondTypeList.Add(type);
}
}
var modelIndex = CreateType(data, returnValueType, rootPath, modelIndexList);
if (!string.IsNullOrWhiteSpace(modelIndex))
{
modelIndexList.Add(modelIndex);
}
}
if (modelBindingExtraList != null && modelBindingExtraList.Count > 0)
{
modelBindingExtra = ", params: { " + string.Join(", ", modelBindingExtraList.ToArray()) + " }";
}
var url = ((string)action["url"]).Replace("/{", "/${");
var httpMethod = (string)action["httpMethod"];
serviceFileText.AppendLine(
url.Contains("${")
? $" return this.restService.request({{ url: `/{url}`, method: '{httpMethod}'{bodyExtra}{modelBindingExtra} }});"
: $" return this.restService.request({{ url: '/{url}', method: '{httpMethod}'{bodyExtra}{modelBindingExtra} }});");
serviceFileText.AppendLine(" }");
}
serviceIndexList.Add(controllerServiceName.Replace(".ts", ""));
if (firstTypeList != null && firstTypeList.Count > 0)
{
var firstTypeListDistinct = ", " + string.Join(", ", firstTypeList.Where(p => p != "void").Distinct().ToArray());
serviceFileText.Replace("[firstTypeList]",
$"import {{ RestService {firstTypeListDistinct}}} from '@abp/ng.core';");
}
else
{
serviceFileText.Replace("[firstTypeList]",
$"import {{ RestService }} from '@abp/ng.core';");
}
if (secondTypeList != null && secondTypeList.Count > 0)
{
var secondTypeListDistinct = string.Join(", ", secondTypeList.Where(p => p != "void").Distinct().ToArray());
serviceFileText.Replace("[secondTypeList]",
$"import {{{secondTypeListDistinct}}} from '../models';");
}
else
{
serviceFileText.Replace("[secondTypeList]", "");
}
serviceFileText.AppendLine("}");
serviceFileText.Replace("[controllerName]", controllerName);
File.WriteAllText($"src/app/{rootPath}/shared/services/{controllerServiceName}", serviceFileText.ToString());
}
var serviceIndexFileText = new StringBuilder();
foreach (var serviceIndexItem in serviceIndexList.Distinct())
{
serviceIndexFileText.AppendLine($"export * from './{serviceIndexItem}';");
}
File.WriteAllText($"src/app/{rootPath}/shared/services/index.ts", serviceIndexFileText.ToString());
var modelIndexFileText = new StringBuilder();
foreach (var modelIndexItem in modelIndexList.Distinct())
{
modelIndexFileText.AppendLine($"export * from './{modelIndexItem}';");
}
File.WriteAllText($"src/app/{rootPath}/shared/models/index.ts", modelIndexFileText.ToString());
}
Logger.LogInformation("Completed!");
}
private Dictionary<string, string> GetCombinedModules(JToken data, string module)
{
var moduleList = new Dictionary<string, string>();
foreach (var moduleItem in data["modules"])
{
var rootPath = ((string)moduleItem.First["rootPath"]).ToLower();
if (moduleList.Any(p => p.Key == rootPath))
{
var value = moduleList[rootPath];
moduleList[rootPath] = value.TrimEnd('}') + "," + moduleItem.First["controllers"].ToString().TrimStart('{');
}
else
{
moduleList.Add(rootPath, moduleItem.First["controllers"].ToString());
}
}
if (module != "all")
{
moduleList = moduleList.Where(p => p.Key.ToLower() == module).ToDictionary(p => p.Key, s => s.Value);
}
return moduleList;
}
private static string CreateType(JObject data, string returnValueType, string rootPath, List<string> modelIndexList)
{
var type = data["types"][returnValueType];
if (type == null)
{
return null;
}
if (returnValueType.StartsWith("Volo.Abp.Application.Dtos")
|| returnValueType.StartsWith("System.Collections")
|| returnValueType == "System.String"
|| returnValueType == "System.Void"
|| returnValueType.Contains("System.Net.HttpStatusCode?")
|| returnValueType.Contains("IActionResult")
|| returnValueType.Contains("ActionResult")
|| returnValueType.Contains("IStringValueType")
|| returnValueType.Contains("IValueValidator")
)
{
return null;
}
var typeNameSplit = returnValueType.Split(".");
var typeName = typeNameSplit[typeNameSplit.Length - 1];
if (typeName.Contains("HttpStatusCode"))
{
}
var typeModelName = typeName.Replace("<", "").Replace(">", "").Replace("?","").PascalToKebabCase() + ".ts";
var path = $"src/app/{rootPath}/shared/models/{typeModelName}";
var modelFileText = new StringBuilder();
var baseType = (string)type["baseType"];
var extends = "";
var customBaseTypeName = "";
var baseTypeName = "";
if (!string.IsNullOrWhiteSpace(baseType))
{
var baseTypeSplit = baseType.Split(".");
baseTypeName = baseTypeSplit[baseTypeSplit.Length - 1].Replace("<", "").Replace(">", "");
var baseTypeKebabCase = "./" + baseTypeName.PascalToKebabCase();
if (baseType != "System.Enum")
{
if (baseType.Contains("Volo.Abp.Application.Dtos"))
{
baseTypeKebabCase = "@abp/ng.core";
baseTypeName = baseType.Split("Volo.Abp.Application.Dtos")[1].Split("<")[0].TrimStart('.');
customBaseTypeName = baseType.Split("Volo.Abp.Application.Dtos")[1].Replace("System.Guid", "string").TrimStart('.');
}
if (baseTypeName.Contains("guid") || baseTypeName.Contains("Guid"))
{
baseTypeName = "string";
}
modelFileText.AppendLine($"import {{ {baseTypeName} }} from '{baseTypeKebabCase}';");
extends = "extends " + (!string.IsNullOrWhiteSpace(customBaseTypeName) ? customBaseTypeName : baseTypeName);
var modelIndex = CreateType(data, baseType, rootPath, modelIndexList);
if (!string.IsNullOrWhiteSpace(modelIndex))
{
modelIndexList.Add(modelIndex);
}
}
}
if (baseType == "System.Enum" && (bool)type["isEnum"])
{
modelFileText.AppendLine($"export enum {typeName} {{");
var enumNameList = type["enumNames"].ToArray();
var enumValueList = type["enumValues"].ToArray();
for (var i = 0; i < enumNameList.Length; i++)
{
modelFileText.AppendLine($" {enumNameList[i]} = {enumValueList[i]},");
}
modelFileText.AppendLine("}");
}
else
{
modelFileText.AppendLine("");
modelFileText.AppendLine($"export class {typeName} {extends} {{");
foreach (var property in type["properties"])
{
var propertyName = (string)property["name"];
propertyName = (char.ToLower(propertyName[0]) + propertyName.Substring(1));
var typeSimple = (string)property["typeSimple"];
var modelIndex = CreateType(data, (string)property["type"], rootPath, modelIndexList);
if (typeSimple.IndexOf("[") > -1 && typeSimple.IndexOf("]") > -1)
{
typeSimple = typeSimple.Replace("[", "").Replace("]", "") + "[]";
}
if (typeSimple.StartsWith("Volo.Abp"))
{
var typeSimpleSplit = typeSimple.Split(".");
typeSimple = typeSimpleSplit[typeSimpleSplit.Length - 1];
}
if (typeSimple.StartsWith("System.Object"))
{
typeSimple = typeSimple.Replace("System.Object", "object");
}
if (typeSimple.Contains("?"))
{
typeSimple = typeSimple.Replace("?", "");
propertyName += "?";
}
if (typeSimple != "boolean"
&& typeSimple != "string"
&& typeSimple != "number"
&& typeSimple != "boolean[]"
&& typeSimple != "string[]"
&& typeSimple != "number[]"
)
{
var typeSimpleModelName = typeSimple.PascalToKebabCase() + ".ts";
var modelPath = $"src/app/{rootPath}/shared/models/{typeSimpleModelName}";
if (!File.Exists(modelPath))
{
typeSimple = "any" + (typeSimple.Contains("[]") ? "[]" : "");
}
}
if (propertyList.Any(p => p.Key == baseTypeName && p.Value.Any(q => q.Key == propertyName && q.Value == typeSimple)))
{
continue;
}
if (!string.IsNullOrWhiteSpace(modelIndex))
{
var propertyTypeSplit = ((string)property["type"]).Split(".");
var propertyType = propertyTypeSplit[propertyTypeSplit.Length - 1];
modelFileText.Insert(0, "");
modelFileText.Insert(0, $"import {{ {propertyType} }} from '../models';");
modelFileText.Insert(0, "");
modelIndexList.Add(modelIndex);
}
if (propertyList.Any(p => p.Key == typeName && !p.Value.Any(q => q.Key == propertyName)))
{
propertyList[typeName].Add(propertyName, typeSimple);
}
else if (!propertyList.Any(p => p.Key == typeName))
{
var newProperty = new Dictionary<string, string>();
newProperty.Add(propertyName, typeSimple);
propertyList.Add(typeName, newProperty);
}
modelFileText.AppendLine($" {propertyName}: {typeSimple};");
}
modelFileText.AppendLine("");
modelFileText.AppendLine($" constructor(initialValues: Partial<{typeName}> = {{}}) {{");
if (!string.IsNullOrWhiteSpace(baseType))
{
modelFileText.AppendLine(" super(initialValues);");
modelFileText.AppendLine(" }");
}
else
{
modelFileText.AppendLine(" if (initialValues) {");
modelFileText.AppendLine(" for (const key in initialValues) {");
modelFileText.AppendLine(" if (initialValues.hasOwnProperty(key)) {");
modelFileText.AppendLine(" this[key] = initialValues[key];");
modelFileText.AppendLine(" }");
modelFileText.AppendLine(" }");
modelFileText.AppendLine(" }");
modelFileText.AppendLine(" }");
}
modelFileText.AppendLine("}");
}
File.WriteAllText($"src/app/{rootPath}/shared/models/{typeModelName}", modelFileText.ToString());
return typeModelName.Replace(".ts", "");
}
private static List<ParameterModel> AddParameter(string parameterName, string type, bool parameterIsOptional, string parameterDefaultValue, string bindingSourceId, List<ParameterModel> parameterModel)
{
if (parameterDefaultValue != "null")
{
parameterModel.Add(new ParameterModel
{
DisplayOrder = 3,
Name = parameterName,
Type = type,
Value = parameterDefaultValue,
BindingSourceId = bindingSourceId
});
}
else if (parameterDefaultValue == "null" && parameterIsOptional)
{
parameterModel.Add(new ParameterModel
{
DisplayOrder = 2,
Name = parameterName,
IsOptional = true,
Type = type,
BindingSourceId = bindingSourceId
});
}
else
{
parameterModel.Add(new ParameterModel
{
DisplayOrder = 1,
Name = parameterName,
Type = type,
BindingSourceId = bindingSourceId
});
}
return parameterModel;
}
public string GetUsageInfo()
{
var sb = new StringBuilder();
sb.AppendLine("");
sb.AppendLine("Usage:");
sb.AppendLine("");
sb.AppendLine(" abp generate-proxy [options]");
sb.AppendLine("");
sb.AppendLine("Options:");
sb.AppendLine("");
sb.AppendLine("-a|--apiUrl <api-url> (default: environment.ts>apis>default>url)");
sb.AppendLine("-u|--ui <ui-framework> (default: angular)");
sb.AppendLine("-m|--module <module> (default: app)");
sb.AppendLine("");
sb.AppendLine("Examples:");
sb.AppendLine("");
sb.AppendLine(" abp generate-proxy --apiUrl https://www.volosoft.com");
sb.AppendLine("");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
return sb.ToString();
}
public string GetShortDescription()
{
return "Generates typescript service proxies and DTOs";
}
private UiFramework GetUiFramework(CommandLineArgs commandLineArgs)
{
var optionValue = commandLineArgs.Options.GetOrNull(Options.UiFramework.Short, Options.UiFramework.Long);
switch (optionValue)
{
case "none":
return UiFramework.None;
case "mvc":
return UiFramework.Mvc;
case "angular":
return UiFramework.Angular;
default:
return UiFramework.Angular;
}
}
public static class Options
{
public static class Module
{
public const string Short = "m";
public const string Long = "module";
}
public static class ApiUrl
{
public const string Short = "a";
public const string Long = "apiUrl";
}
public static class UiFramework
{
public const string Short = "u";
public const string Long = "ui";
}
}
}
public static class StringExtensions
{
public static string PascalToKebabCase(this string value)
{
if (string.IsNullOrEmpty(value))
{
return value;
}
return Regex.Replace(
value,
"(?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z])",
"-$1",
RegexOptions.Compiled)
.Trim()
.ToLower();
}
}
public class ParameterModel
{
public int DisplayOrder { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public string Type { get; set; }
public bool IsOptional { get; set; }
public string BindingSourceId { get; set; }
}
}

31
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -85,10 +85,25 @@ namespace Volo.Abp.Cli.Commands
Logger.LogInformation("Template Source: " + templateSource);
}
var createSolutionFolder = (commandLineArgs.Options.GetOrNull(Options.CreateSolutionFolder.Short, Options.CreateSolutionFolder.Long) ?? "true").ToLowerInvariant() != "false";
if (!createSolutionFolder)
{
Logger.LogInformation("Create Solution Folder: false");
}
var outputFolder = commandLineArgs.Options.GetOrNull(Options.OutputFolder.Short, Options.OutputFolder.Long);
outputFolder = Path.Combine(outputFolder != null ? Path.GetFullPath(outputFolder) : Directory.GetCurrentDirectory(),
SolutionName.Parse(projectName).FullName);
var outputFolderRoot =
outputFolder != null ? Path.GetFullPath(outputFolder) : Directory.GetCurrentDirectory();
if (createSolutionFolder)
{
outputFolder = Path.Combine(outputFolderRoot, SolutionName.Parse(projectName).FullName);
}
else
{
outputFolder = outputFolderRoot;
}
if (!Directory.Exists(outputFolder))
{
@ -120,6 +135,12 @@ namespace Volo.Abp.Cli.Commands
var zipEntry = zipInputStream.GetNextEntry();
while (zipEntry != null)
{
if (string.IsNullOrWhiteSpace(zipEntry.Name))
{
zipEntry = zipInputStream.GetNextEntry();
continue;
}
var fullZipToPath = Path.Combine(outputFolder, zipEntry.Name);
var directoryName = Path.GetDirectoryName(fullZipToPath);
@ -289,6 +310,12 @@ namespace Volo.Abp.Cli.Commands
public const string Short = "ts";
public const string Long = "template-source";
}
public static class CreateSolutionFolder
{
public const string Short = "csf";
public const string Long = "create-solution-folder";
}
}
}
}

29
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveRootFolderStep.cs

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class RemoveRootFolderStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
foreach (var file in context.Files)
{
file.SetName(RemoveRootFolder(file.Name));
}
}
private string RemoveRootFolder(string fileName)
{
if (!fileName.Contains('/'))
{
return fileName;
}
return string.Join("/", fileName.Split('/').Skip(1));
}
}
}

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs

@ -23,6 +23,11 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
pipeline.Steps.Add(new LicenseCodeReplaceStep());
}
if (context.BuildArgs.UiFramework == UiFramework.Mvc && context.BuildArgs.MobileApp == MobileApp.None)
{
pipeline.Steps.Add(new RemoveRootFolderStep());
}
pipeline.Steps.Add(new CreateProjectResultZipStep());
return pipeline;

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

@ -99,26 +99,21 @@ namespace Volo.Abp.Cli.ProjectModification
protected virtual async Task<bool> TryUpdatePackage(string file, JProperty package,
bool includePreviews = false, bool switchToStable = false)
{
var updated = false;
var currentVersion = (string)package.Value;
var version = await GetLatestVersion(package, currentVersion, includePreviews, switchToStable);
var versionWithPrefix = $"^{version}";
var versionWithPrefix = $"~{version}";
if (versionWithPrefix == currentVersion)
{
return false;
}
else
{
updated = true;
}
package.Value.Replace(versionWithPrefix);
Logger.LogInformation($"Updated {package.Name} to {version} in {file.Replace(Directory.GetCurrentDirectory(), "")}.");
return updated;
return true;
}
protected virtual async Task<string> GetLatestVersion(JProperty package, string currentVersion,

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageInfo.cs

@ -7,5 +7,7 @@
public string ModuleClass { get; set; }
public NuGetPackageTarget Target { get; set; }
public NuGetPackageTarget TieredTarget { get; set; }
}
}

18
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFileNameHelper.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Volo.Abp.Cli.ProjectModification
{
public static class ProjectFileNameHelper
{
public static string GetAssemblyNameFromProjectPath(string projectFile)
{
return projectFile
.Substring(projectFile.LastIndexOf(Path.DirectorySeparatorChar) + 1)
.RemovePostFix(StringComparison.OrdinalIgnoreCase, ".csproj");
}
}
}

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs

@ -94,14 +94,7 @@ namespace Volo.Abp.Cli.ProjectModification
public static string[] GetAssemblyNames(string[] projectFiles)
{
return projectFiles.Select(GetAssemblyName).ToArray();
}
public static string GetAssemblyName(string projectFile)
{
return projectFile
.Substring(projectFile.LastIndexOf(Path.DirectorySeparatorChar) + 1)
.RemovePostFix(StringComparison.OrdinalIgnoreCase, ".csproj");
return projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath).ToArray();
}
private static string FindProjectEndsWith(

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

@ -143,7 +143,12 @@ namespace Volo.Abp.Cli.ProjectModification
{
foreach (var nugetPackage in module.NugetPackages)
{
var targetProjectFile = ProjectFinder.FindNuGetTargetProjectFile(projectFiles, nugetPackage.Target);
var nugetTarget =
await IsProjectTiered(projectFiles) && nugetPackage.TieredTarget != NuGetPackageTarget.Undefined
? nugetPackage.TieredTarget
: nugetPackage.Target;
var targetProjectFile = ProjectFinder.FindNuGetTargetProjectFile(projectFiles, nugetTarget);
if (targetProjectFile == null)
{
Logger.LogDebug($"Target project is not available for this NuGet package '{nugetPackage.Name}'");
@ -234,5 +239,11 @@ namespace Volo.Abp.Cli.ProjectModification
return JsonSerializer.Deserialize<ModuleWithMastersInfo>(responseContent);
}
}
protected virtual async Task<bool> IsProjectTiered(string[] projectFiles)
{
return projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath)
.Any(p => p.EndsWith(".IdentityServer") || p.EndsWith(".HttpApi.Host"));
}
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs

@ -65,6 +65,8 @@ namespace Volo.Abp.Cli.Utils
}
}
process.WaitForExit();
exitCode = process.ExitCode;
}

1
framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj

@ -12,6 +12,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="NETStandard.Library" Version="2.0.3" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />

16
framework/src/Volo.Abp.Core/System/AbpTypeExtensions.cs

@ -1,5 +1,6 @@
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp;
namespace System
{
@ -17,8 +18,10 @@ namespace System
/// Internally uses <see cref="Type.IsAssignableFrom"/>.
/// </summary>
/// <typeparam name="TTarget">Target type</typeparam> (as reverse).
public static bool IsAssignableTo<TTarget>(this Type type)
public static bool IsAssignableTo<TTarget>([NotNull] this Type type)
{
Check.NotNull(type, nameof(type));
return type.IsAssignableTo(typeof(TTarget));
}
@ -30,8 +33,11 @@ namespace System
/// </summary>
/// <param name="type">this type</param>
/// <param name="targetType">Target type</param>
public static bool IsAssignableTo(this Type type, Type targetType)
public static bool IsAssignableTo([NotNull] this Type type, [NotNull] Type targetType)
{
Check.NotNull(type, nameof(type));
Check.NotNull(targetType, nameof(targetType));
return targetType.IsAssignableFrom(type);
}
@ -40,8 +46,10 @@ namespace System
/// </summary>
/// <param name="type">The type to get its base classes.</param>
/// <param name="includeObject">True, to include the standard <see cref="object"/> type in the returned array.</param>
public static Type[] GetBaseClasses(this Type type, bool includeObject = true)
public static Type[] GetBaseClasses([NotNull] this Type type, bool includeObject = true)
{
Check.NotNull(type, nameof(type));
var types = new List<Type>();
AddTypeAndBaseTypesRecursively(types, type.BaseType, includeObject);
return types.ToArray();
@ -52,6 +60,8 @@ namespace System
[CanBeNull] Type type,
bool includeObject)
{
Check.NotNull(types, nameof(types));
if (type == null)
{
return;

4
framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs

@ -53,14 +53,14 @@ namespace Volo.Abp.Reflection
if (givenTypeInfo.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
{
result.Add(givenType);
result.AddIfNotContains(givenType);
}
foreach (var interfaceType in givenTypeInfo.GetInterfaces())
{
if (interfaceType.GetTypeInfo().IsGenericType && interfaceType.GetGenericTypeDefinition() == genericType)
{
result.Add(interfaceType);
result.AddIfNotContains(interfaceType);
}
}

56
framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs

@ -1,4 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
@ -54,6 +57,59 @@ namespace Volo.Abp.Reflection
return t;
}
public static bool IsEnumerable(Type type, out Type itemType, bool includePrimitives = true)
{
if (!includePrimitives && IsPrimitiveExtended(type))
{
itemType = null;
return false;
}
var enumerableTypes = ReflectionHelper.GetImplementedGenericTypes(type, typeof(IEnumerable<>));
if (enumerableTypes.Count == 1)
{
itemType = enumerableTypes[0].GenericTypeArguments[0];
return true;
}
if (typeof(IEnumerable).IsAssignableFrom(type))
{
itemType = typeof(object);
return true;
}
itemType = null;
return false;
}
public static bool IsDictionary(Type type, out Type keyType, out Type valueType)
{
var dictionaryTypes = ReflectionHelper
.GetImplementedGenericTypes(
type,
typeof(IDictionary<,>)
);
if (dictionaryTypes.Count == 1)
{
keyType = dictionaryTypes[0].GenericTypeArguments[0];
valueType = dictionaryTypes[0].GenericTypeArguments[1];
return true;
}
if (typeof(IDictionary).IsAssignableFrom(type))
{
keyType = typeof(object);
valueType = typeof(object);
return true;
}
keyType = null;
valueType = null;
return false;
}
private static bool IsPrimitiveExtendedInternal(Type type, bool includeEnums)
{
if (type.IsPrimitive)

7
framework/src/Volo.Abp.Core/Volo/Abp/Threading/AsyncHelper.cs

@ -27,6 +27,11 @@ namespace Volo.Abp.Threading
return type == typeof(Task) || (type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Task<>));
}
public static bool IsTaskOfT([NotNull] this Type type)
{
return type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Task<>);
}
/// <summary>
/// Returns void if given type is Task.
/// Return T, if given type is Task{T}.
@ -41,7 +46,7 @@ namespace Volo.Abp.Threading
return typeof(void);
}
if (type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Task<>))
if (type.IsTaskOfT())
{
return type.GenericTypeArguments[0];
}

4
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs

@ -56,8 +56,8 @@ namespace Volo.Abp.Http.Client.DynamicProxying
var found = true;
for (int i = 0; i < methodParameters.Length; i++)
{
if (!TypeMatches(action.ParametersOnMethod[i], methodParameters[i]))
{
if (!TypeMatches(action.ParametersOnMethod[i], methodParameters[i]))
{
found = false;
break;

6
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs

@ -10,6 +10,8 @@ namespace Volo.Abp.Http.Modeling
{
public IDictionary<string, ModuleApiDescriptionModel> Modules { get; set; }
public IDictionary<string, TypeApiDescriptionModel> Types { get; set; }
private ApplicationApiDescriptionModel()
{
@ -19,8 +21,8 @@ namespace Volo.Abp.Http.Modeling
{
return new ApplicationApiDescriptionModel
{
//TODO: Why ConcurrentDictionary?
Modules = new ConcurrentDictionary<string, ModuleApiDescriptionModel>()
Modules = new ConcurrentDictionary<string, ModuleApiDescriptionModel>(), //TODO: Why ConcurrentDictionary?
Types = new Dictionary<string, TypeApiDescriptionModel>()
};
}

7
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModelRequestDto.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.Http.Modeling
{
public class ApplicationApiDescriptionModelRequestDto
{
public bool IncludeTypes { get; set; }
}
}

8
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerApiDescriptionModel.cs

@ -10,7 +10,7 @@ namespace Volo.Abp.Http.Modeling
{
public string ControllerName { get; set; }
public string TypeAsString { get; set; }
public string Type { get; set; }
public List<ControllerInterfaceApiDescriptionModel> Interfaces { get; set; }
@ -26,7 +26,7 @@ namespace Volo.Abp.Http.Modeling
return new ControllerApiDescriptionModel
{
ControllerName = controllerName,
TypeAsString = type.GetFullNameWithAssemblyName(),
Type = type.FullName,
Actions = new Dictionary<string, ActionApiDescriptionModel>(),
Interfaces = type
.GetInterfaces()
@ -52,7 +52,7 @@ namespace Volo.Abp.Http.Modeling
{
var subModel = new ControllerApiDescriptionModel
{
TypeAsString = TypeAsString,
Type = Type,
Interfaces = Interfaces,
ControllerName = ControllerName,
Actions = new Dictionary<string, ActionApiDescriptionModel>()
@ -71,7 +71,7 @@ namespace Volo.Abp.Http.Modeling
public bool Implements(Type interfaceType)
{
return Interfaces.Any(i => i.TypeAsString == interfaceType.GetFullNameWithAssemblyName());
return Interfaces.Any(i => i.Type == interfaceType.FullName);
}
public override string ToString()

4
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerInterfaceApiDescriptionModel.cs

@ -5,7 +5,7 @@ namespace Volo.Abp.Http.Modeling
[Serializable]
public class ControllerInterfaceApiDescriptionModel
{
public string TypeAsString { get; set; }
public string Type { get; set; }
private ControllerInterfaceApiDescriptionModel()
{
@ -16,7 +16,7 @@ namespace Volo.Abp.Http.Modeling
{
return new ControllerInterfaceApiDescriptionModel
{
TypeAsString = type.GetFullNameWithAssemblyName()
Type = type.FullName
};
}
}

2
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/IApiDescriptionModelProvider.cs

@ -2,6 +2,6 @@ namespace Volo.Abp.Http.Modeling
{
public interface IApiDescriptionModelProvider
{
ApplicationApiDescriptionModel CreateApiModel();
ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input);
}
}

8
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/MethodParameterApiDescriptionModel.cs

@ -10,13 +10,17 @@ namespace Volo.Abp.Http.Modeling
public string TypeAsString { get; set; }
public string Type { get; set; }
public string TypeSimple { get; set; }
public bool IsOptional { get; set; }
public object DefaultValue { get; set; }
private MethodParameterApiDescriptionModel()
{
}
public static MethodParameterApiDescriptionModel Create(ParameterInfo parameterInfo)
@ -25,6 +29,8 @@ namespace Volo.Abp.Http.Modeling
{
Name = parameterInfo.Name,
TypeAsString = parameterInfo.ParameterType.GetFullNameWithAssemblyName(),
Type = parameterInfo.ParameterType != null ? ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(parameterInfo.ParameterType) : null,
TypeSimple = parameterInfo.ParameterType != null ? ModelingTypeHelper.GetSimplifiedName(parameterInfo.ParameterType) : null,
IsOptional = parameterInfo.IsOptional,
DefaultValue = parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : null
};

127
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModelingTypeHelper.cs

@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
namespace Volo.Abp.Http.Modeling
{
public static class ModelingTypeHelper
{
public static string GetFullNameHandlingNullableAndGenerics([NotNull] Type type)
{
Check.NotNull(type, nameof(type));
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return type.GenericTypeArguments[0].FullName + "?";
}
if (type.IsGenericType)
{
var genericType = type.GetGenericTypeDefinition();
return $"{genericType.FullName.Left(genericType.FullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetFullNameHandlingNullableAndGenerics).JoinAsString(",")}>";
}
return type.FullName;
}
public static string GetSimplifiedName([NotNull] Type type)
{
Check.NotNull(type, nameof(type));
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return GetSimplifiedName(type.GenericTypeArguments[0]) + "?";
}
if (type.IsGenericType)
{
var genericType = type.GetGenericTypeDefinition();
return $"{genericType.FullName.Left(genericType.FullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetSimplifiedName).JoinAsString(",")}>";
}
if (type == typeof(string))
{
return "string";
}
else if (type == typeof(int))
{
return "number";
}
else if (type == typeof(long))
{
return "number";
}
else if (type == typeof(bool))
{
return "boolean";
}
else if (type == typeof(char))
{
return "string";
}
else if (type == typeof(double))
{
return "number";
}
else if (type == typeof(float))
{
return "number";
}
else if (type == typeof(decimal))
{
return "number";
}
else if (type == typeof(DateTime))
{
return "string";
}
else if (type == typeof(DateTimeOffset))
{
return "string";
}
else if (type == typeof(TimeSpan))
{
return "string";
}
else if (type == typeof(Guid))
{
return "string";
}
else if (type == typeof(byte))
{
return "number";
}
else if (type == typeof(sbyte))
{
return "number";
}
else if (type == typeof(short))
{
return "number";
}
else if (type == typeof(ushort))
{
return "number";
}
else if (type == typeof(uint))
{
return "number";
}
else if (type == typeof(ulong))
{
return "number";
}
else if (type == typeof(IntPtr))
{
return "number";
}
else if (type == typeof(UIntPtr))
{
return "number";
}
return type.FullName;
}
}
}

7
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ParameterApiDescriptionModel.cs

@ -9,7 +9,9 @@ namespace Volo.Abp.Http.Modeling
public string Name { get; set; }
public string TypeAsString { get; set; }
public string Type { get; set; }
public string TypeSimple { get; set; }
public bool IsOptional { get; set; }
@ -32,7 +34,8 @@ namespace Volo.Abp.Http.Modeling
{
Name = name,
NameOnMethod = nameOnMethod,
TypeAsString = type?.GetFullNameWithAssemblyName(),
Type = type != null ? ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(type) : null,
TypeSimple = type != null ? ModelingTypeHelper.GetSimplifiedName(type) : null,
IsOptional = isOptional,
DefaultValue = defaultValue,
ConstraintTypes = constraintTypes,

46
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/PropertyApiDescriptionModel.cs

@ -0,0 +1,46 @@
using System;
using System.Reflection;
using Volo.Abp.Reflection;
namespace Volo.Abp.Http.Modeling
{
[Serializable]
public class PropertyApiDescriptionModel
{
public string Name { get; set; }
public string Type { get; set; }
public string TypeSimple { get; set; }
//TODO: Validation rules for this property
public static PropertyApiDescriptionModel Create(PropertyInfo propertyInfo)
{
string typeName;
string simpleTypeName;
if (TypeHelper.IsEnumerable(propertyInfo.PropertyType, out var itemType, includePrimitives: false))
{
typeName = $"[{ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(itemType)}]";
simpleTypeName = $"[{ModelingTypeHelper.GetSimplifiedName(itemType)}]";
}
else if (TypeHelper.IsDictionary(propertyInfo.PropertyType, out var keyType, out var valueType))
{
typeName = $"{{{ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(keyType)}:{ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(valueType)}}}";
simpleTypeName = $"{{{ModelingTypeHelper.GetSimplifiedName(keyType)}:{ModelingTypeHelper.GetSimplifiedName(valueType)}}}";
}
else
{
typeName = ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(propertyInfo.PropertyType);
simpleTypeName = ModelingTypeHelper.GetSimplifiedName(propertyInfo.PropertyType);
}
return new PropertyApiDescriptionModel
{
Name = propertyInfo.Name,
Type = typeName,
TypeSimple = simpleTypeName
};
}
}
}

9
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ReturnValueApiDescriptionModel.cs

@ -6,7 +6,9 @@ namespace Volo.Abp.Http.Modeling
[Serializable]
public class ReturnValueApiDescriptionModel
{
public string TypeAsString { get; set; }
public string Type { get; set; }
public string TypeSimple { get; set; }
private ReturnValueApiDescriptionModel()
{
@ -15,9 +17,12 @@ namespace Volo.Abp.Http.Modeling
public static ReturnValueApiDescriptionModel Create(Type type)
{
var unwrappedType = AsyncHelper.UnwrapTask(type);
return new ReturnValueApiDescriptionModel
{
TypeAsString = AsyncHelper.UnwrapTask(type).GetFullNameWithAssemblyName()
Type = ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(unwrappedType),
TypeSimple = ModelingTypeHelper.GetSimplifiedName(unwrappedType)
};
}
}

54
framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/TypeApiDescriptionModel.cs

@ -0,0 +1,54 @@
using System;
using System.Linq;
namespace Volo.Abp.Http.Modeling
{
[Serializable]
public class TypeApiDescriptionModel
{
public string BaseType { get; set; }
public bool IsEnum { get; set; }
public string[] EnumNames { get; set; }
public object[] EnumValues { get; set; }
public PropertyApiDescriptionModel[] Properties { get; set; }
private TypeApiDescriptionModel()
{
}
public static TypeApiDescriptionModel Create(Type type)
{
var baseType = type.BaseType;
if (baseType == typeof(object))
{
baseType = null;
}
var typeModel = new TypeApiDescriptionModel
{
IsEnum = type.IsEnum,
BaseType = baseType != null ? ModelingTypeHelper.GetFullNameHandlingNullableAndGenerics(baseType) : null
};
if (typeModel.IsEnum)
{
typeModel.EnumNames = type.GetEnumNames();
typeModel.EnumValues = type.GetEnumValues().Cast<object>().ToArray();
}
else
{
typeModel.Properties = type
.GetProperties()
.Select(PropertyApiDescriptionModel.Create)
.ToArray();
}
return typeModel;
}
}
}

4
framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs

@ -56,7 +56,7 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery
private static void AddControllerScript(StringBuilder script, ControllerApiDescriptionModel controller)
{
var controllerName = GetNormalizedTypeName(controller.TypeAsString);
var controllerName = GetNormalizedTypeName(controller.Type);
script.AppendLine($" // controller {controllerName}");
script.AppendLine();
@ -129,7 +129,7 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery
script.AppendLine(" url: abp.appPath + '" + ProxyScriptingHelper.GenerateUrlWithParameters(action) + "',");
script.Append(" type: '" + httpMethod + "'");
if (action.ReturnValue.TypeAsString == typeof(void).GetFullNameWithAssemblyName())
if (action.ReturnValue.Type == typeof(void).FullName)
{
script.AppendLine(",");
script.Append(" dataType: null");

2
framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs

@ -49,7 +49,7 @@ namespace Volo.Abp.Http.ProxyScripting
private string CreateScript(ProxyScriptingModel scriptingModel)
{
var apiModel = _modelProvider.CreateApiModel();
var apiModel = _modelProvider.CreateApiModel(new ApplicationApiDescriptionModelRequestDto {IncludeTypes = false});
if (scriptingModel.IsPartialRequest())
{

12
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController_Tests.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Http.Modeling;
using Xunit;
@ -12,6 +13,15 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring
{
var model = await GetResponseAsObjectAsync<ApplicationApiDescriptionModel>("/api/abp/api-definition");
model.ShouldNotBeNull();
model.Types.IsNullOrEmpty().ShouldBeTrue();
}
[Fact]
public async Task GetAsync_IncludeTypes()
{
var model = await GetResponseAsObjectAsync<ApplicationApiDescriptionModel>("/api/abp/api-definition?includeTypes=true");
model.ShouldNotBeNull();
model.Types.IsNullOrEmpty().ShouldBeFalse();
}
}
}

2
framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectFinder_Tests.cs

@ -29,7 +29,7 @@ namespace Volo.Abp.Cli
[Fact]
public void GetAssemblyName_Tests()
{
var assemblyName = ProjectFinder.GetAssemblyName(
var assemblyName = ProjectFileNameHelper.GetAssemblyNameFromProjectPath(
GetNormalizedPath(
@"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj"
)

56
framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeHelper_Tests.cs

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Text;
using Shouldly;
using Xunit;
@ -16,5 +15,60 @@ namespace Volo.Abp.Reflection
guidType.ShouldBe(typeof(Guid));
}
[Fact]
public void IsEnumerable()
{
TypeHelper.IsEnumerable(
typeof(IEnumerable<string>),
out var itemType
).ShouldBeTrue();
itemType.ShouldBe(typeof(string));
TypeHelper.IsEnumerable(
typeof(List<TypeHelper_Tests>),
out itemType
).ShouldBeTrue();
itemType.ShouldBe(typeof(TypeHelper_Tests));
TypeHelper.IsEnumerable(
typeof(TypeHelper_Tests),
out itemType
).ShouldBeFalse();
}
[Fact]
public void IsDictionary()
{
//Dictionary<string, int>
TypeHelper.IsDictionary(
typeof(Dictionary<string, int>),
out var keyType,
out var valueType
).ShouldBeTrue();
keyType.ShouldBe(typeof(string));
valueType.ShouldBe(typeof(int));
//MyDictionary
TypeHelper.IsDictionary(
typeof(MyDictionary),
out keyType,
out valueType
).ShouldBeTrue();
keyType.ShouldBe(typeof(bool));
valueType.ShouldBe(typeof(TypeHelper_Tests));
//TypeHelper_Tests
TypeHelper.IsDictionary(
typeof(TypeHelper_Tests),
out keyType,
out valueType
).ShouldBeFalse();
}
public class MyDictionary : Dictionary<bool, TypeHelper_Tests>
{
}
}
}

2
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs

@ -147,7 +147,7 @@ namespace Volo.Abp.Account.Web.Pages.Account
var properties = SignInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
properties.Items["scheme"] = provider;
return Challenge(properties, provider);
return await Task.FromResult(Challenge(properties, provider));
}
[UnitOfWork]

11
npm/get-version.js

@ -1,3 +1,10 @@
const fse = require("fs-extra");
const fse = require('fs-extra');
console.log(fse.readJSONSync("package.json").version);
const commonProps = fse.readFileSync('../common.props').toString();
const versionTag = '<Version>';
const versionEndTag = '</Version>';
const first = commonProps.indexOf(versionTag) + versionTag.length;
const last = commonProps.indexOf(versionEndTag);
console.log(commonProps.substring(first, last));

2
npm/lerna.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"packages": [
"packs/*"
],

2
npm/ng-packs/lerna.version.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"packages": [
"packages/*"
],

2
npm/ng-packs/package.json

@ -14,7 +14,7 @@
"lint": "ng lint",
"scripts:build": "cd scripts && yarn && yarn build",
"prepare:workspace": "yarn scripts:build",
"ci": "yarn prepare:workspace && yarn ci:test && yarn ng lint && yarn ci:build",
"ci": "yarn ng lint && yarn prepare:workspace && yarn ci:test && yarn ci:build",
"ci:test": "ng test --coverage=false",
"ci:build": "cd scripts && yarn build:prod",
"lerna": "lerna",

2
npm/ng-packs/packages/account-config/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/ng.account.config",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",

6
npm/ng-packs/packages/account/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.account",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.account.config": "~2.2.0",
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.account.config": "^2.3.0",
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

2
npm/ng-packs/packages/core/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/ng.core",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",

124
npm/ng-packs/packages/core/src/lib/models/dtos.ts

@ -0,0 +1,124 @@
export class ListResultDto<T> {
items?: T[];
constructor(initialValues: Partial<ListResultDto<T>> = {}) {
for (const key in initialValues) {
if (initialValues.hasOwnProperty(key)) {
this[key] = initialValues[key];
}
}
}
}
export class PagedResultDto<T> extends ListResultDto<T> {
totalCount?: number;
constructor(initialValues: Partial<PagedResultDto<T>> = {}) {
super(initialValues);
}
}
export class LimitedResultRequestDto {
maxResultCount = 10;
constructor(initialValues: Partial<LimitedResultRequestDto> = {}) {
for (const key in initialValues) {
if (initialValues.hasOwnProperty(key)) {
this[key] = initialValues[key];
}
}
}
}
export class PagedResultRequestDto extends LimitedResultRequestDto {
skipCount?: number;
constructor(initialValues: Partial<PagedResultRequestDto> = {}) {
super(initialValues);
}
}
export class PagedAndSortedResultRequestDto extends PagedResultRequestDto {
sorting?: string;
constructor(initialValues: Partial<PagedAndSortedResultRequestDto> = {}) {
super(initialValues);
}
}
export class EntityDto<TKey = string> {
id?: TKey;
constructor(initialValues: Partial<EntityDto<TKey>> = {}) {
for (const key in initialValues) {
if (initialValues.hasOwnProperty(key)) {
this[key] = initialValues[key];
}
}
}
}
export class CreationAuditedEntityDto<TPrimaryKey = string> extends EntityDto<TPrimaryKey> {
creationTime?: string | Date;
creatorId?: string;
constructor(initialValues: Partial<CreationAuditedEntityDto<TPrimaryKey>> = {}) {
super(initialValues);
}
}
export class CreationAuditedEntityWithUserDto<
TUserDto,
TPrimaryKey = string
> extends CreationAuditedEntityDto<TPrimaryKey> {
creator?: TUserDto;
constructor(
initialValues: Partial<CreationAuditedEntityWithUserDto<TUserDto, TPrimaryKey>> = {},
) {
super(initialValues);
}
}
export class AuditedEntityDto<TPrimaryKey = string> extends CreationAuditedEntityDto<TPrimaryKey> {
lastModificationTime?: string | Date;
lastModifierId?: string;
constructor(initialValues: Partial<AuditedEntityDto<TPrimaryKey>> = {}) {
super(initialValues);
}
}
export class AuditedEntityWithUserDto<TUserDto, TPrimaryKey = string> extends AuditedEntityDto<
TPrimaryKey
> {
creator?: TUserDto;
lastModifier?: TUserDto;
constructor(initialValues: Partial<AuditedEntityWithUserDto<TUserDto, TPrimaryKey>> = {}) {
super(initialValues);
}
}
export class FullAuditedEntityDto<TPrimaryKey = string> extends AuditedEntityDto<TPrimaryKey> {
isDeleted?: boolean;
deleterId?: string;
deletionTime?: Date | string;
constructor(initialValues: Partial<FullAuditedEntityDto<TPrimaryKey>> = {}) {
super(initialValues);
}
}
export class FullAuditedEntityWithUserDto<
TUserDto,
TPrimaryKey = string
> extends FullAuditedEntityDto<TPrimaryKey> {
creator?: TUserDto;
lastModifier?: TUserDto;
deleter?: TUserDto;
constructor(initialValues: Partial<FullAuditedEntityWithUserDto<TUserDto, TPrimaryKey>> = {}) {
super(initialValues);
}
}

1
npm/ng-packs/packages/core/src/lib/models/index.ts

@ -1,6 +1,7 @@
export * from './application-configuration';
export * from './common';
export * from './config';
export * from './dtos';
export * from './profile';
export * from './replaceable-components';
export * from './rest';

4
npm/ng-packs/packages/feature-management/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.feature-management",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

2
npm/ng-packs/packages/identity-config/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/ng.identity.config",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",

8
npm/ng-packs/packages/identity/package.json

@ -1,15 +1,15 @@
{
"name": "@abp/ng.identity",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.identity.config": "~2.2.0",
"@abp/ng.permission-management": "~2.2.0",
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.identity.config": "^2.3.0",
"@abp/ng.permission-management": "^2.3.0",
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

4
npm/ng-packs/packages/permission-management/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.permission-management",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

2
npm/ng-packs/packages/setting-management-config/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/ng.setting-management.config",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",

6
npm/ng-packs/packages/setting-management/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.setting-management",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.setting-management.config": "~2.2.0",
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.setting-management.config": "^2.3.0",
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

2
npm/ng-packs/packages/tenant-management-config/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/ng.tenant-management.config",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",

8
npm/ng-packs/packages/tenant-management/package.json

@ -1,15 +1,15 @@
{
"name": "@abp/ng.tenant-management",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.feature-management": "~2.2.0",
"@abp/ng.tenant-management.config": "~2.2.0",
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.feature-management": "^2.3.0",
"@abp/ng.tenant-management.config": "^2.3.0",
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

20
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html

@ -140,6 +140,26 @@
<label for="name">{{ 'AbpTenantManagement::TenantName' | abpLocalization }}</label>
<input type="text" id="name" class="form-control" formControlName="name" autofocus />
</div>
<div class="form-group" *ngIf="tenantForm.controls.adminEmailAddress">
<label for="name">{{ 'AbpTenantManagement::DisplayName:AdminEmailAddress' | abpLocalization }}</label>
<input
autocomplete="email"
type="email"
id="admin-email-address"
class="form-control"
formControlName="adminEmailAddress"
/>
</div>
<div class="form-group" *ngIf="tenantForm.controls.adminPassword">
<label for="name">{{ 'AbpTenantManagement::DisplayName:AdminPassword' | abpLocalization }}</label>
<input
autocomplete="new-password"
type="password"
id="admin-password"
class="form-control"
formControlName="adminPassword"
/>
</div>
</div>
</form>
</ng-template>

15
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts

@ -60,6 +60,10 @@ export class TenantsComponent implements OnInit {
sortKey = '';
get hasSelectedTenant(): boolean {
return Boolean(this.selected.id);
}
get useSharedDatabase(): boolean {
return this.defaultConnectionStringForm.get('useSharedDatabase').value;
}
@ -115,9 +119,18 @@ export class TenantsComponent implements OnInit {
}
private createTenantForm() {
this.tenantForm = this.fb.group({
const tenantForm = this.fb.group({
name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]],
adminEmailAddress: [null, [Validators.required, Validators.maxLength(256), Validators.email]],
adminPassword: [null, [Validators.required]],
});
if (this.hasSelectedTenant) {
tenantForm.removeControl('adminEmailAddress');
tenantForm.removeControl('adminPassword');
}
this.tenantForm = tenantForm;
}
private createDefaultConnectionStringForm() {

5
npm/ng-packs/packages/tenant-management/src/lib/models/tenant-management.ts

@ -14,11 +14,14 @@ export namespace TenantManagement {
}
export interface AddRequest {
adminEmailAddress: string;
adminPassword: string;
name: string;
}
export interface UpdateRequest extends AddRequest {
export interface UpdateRequest {
id: string;
name: string;
}
export interface DefaultConnectionStringRequest {

24
npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts

@ -4,7 +4,7 @@ import { RestService, Rest, ABP } from '@abp/ng.core';
import { TenantManagement } from '../models/tenant-management';
@Injectable({
providedIn: 'root'
providedIn: 'root',
})
export class TenantManagementService {
constructor(private rest: RestService) {}
@ -13,7 +13,7 @@ export class TenantManagementService {
const request: Rest.Request<null> = {
method: 'GET',
url: '/api/multi-tenancy/tenants',
params
params,
};
return this.rest.request<null, TenantManagement.Response>(request);
@ -22,7 +22,7 @@ export class TenantManagementService {
getTenantById(id: string): Observable<ABP.BasicItem> {
const request: Rest.Request<null> = {
method: 'GET',
url: `/api/multi-tenancy/tenants/${id}`
url: `/api/multi-tenancy/tenants/${id}`,
};
return this.rest.request<null, ABP.BasicItem>(request);
@ -31,7 +31,7 @@ export class TenantManagementService {
deleteTenant(id: string): Observable<null> {
const request: Rest.Request<null> = {
method: 'DELETE',
url: `/api/multi-tenancy/tenants/${id}`
url: `/api/multi-tenancy/tenants/${id}`,
};
return this.rest.request<null, null>(request);
@ -41,7 +41,7 @@ export class TenantManagementService {
const request: Rest.Request<TenantManagement.AddRequest> = {
method: 'POST',
url: '/api/multi-tenancy/tenants',
body
body,
};
return this.rest.request<TenantManagement.AddRequest, ABP.BasicItem>(request);
@ -54,10 +54,10 @@ export class TenantManagementService {
const request: Rest.Request<TenantManagement.UpdateRequest> = {
method: 'PUT',
url,
body
body,
};
return this.rest.request<TenantManagement.AddRequest, ABP.BasicItem>(request);
return this.rest.request<TenantManagement.UpdateRequest, ABP.BasicItem>(request);
}
getDefaultConnectionString(id: string): Observable<string> {
@ -66,18 +66,20 @@ export class TenantManagementService {
const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = {
method: 'GET',
responseType: Rest.ResponseType.Text,
url
url,
};
return this.rest.request<TenantManagement.DefaultConnectionStringRequest, string>(request);
}
updateDefaultConnectionString(payload: TenantManagement.DefaultConnectionStringRequest): Observable<any> {
updateDefaultConnectionString(
payload: TenantManagement.DefaultConnectionStringRequest,
): Observable<any> {
const url = `/api/multi-tenancy/tenants/${payload.id}/default-connection-string`;
const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = {
method: 'PUT',
url,
params: { defaultConnectionString: payload.defaultConnectionString }
params: { defaultConnectionString: payload.defaultConnectionString },
};
return this.rest.request<TenantManagement.DefaultConnectionStringRequest, any>(request);
}
@ -87,7 +89,7 @@ export class TenantManagementService {
const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = {
method: 'DELETE',
url
url,
};
return this.rest.request<TenantManagement.DefaultConnectionStringRequest, any>(request);
}

4
npm/ng-packs/packages/theme-basic/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.theme.basic",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.theme.shared": "~2.2.0"
"@abp/ng.theme.shared": "^2.3.0"
},
"publishConfig": {
"access": "public"

4
npm/ng-packs/packages/theme-shared/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.theme.shared",
"version": "2.2.0",
"version": "2.3.0",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.core": "~2.2.0",
"@abp/ng.core": "^2.3.0",
"@fortawesome/fontawesome-free": "^5.12.1",
"@ng-bootstrap/ng-bootstrap": "^5.3.0",
"@ngx-validate/core": "^0.0.7",

2
npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts

@ -22,7 +22,7 @@ export namespace Toaster {
export type Severity = 'neutral' | 'success' | 'info' | 'warning' | 'error';
/**
* @deprecated Status will be removed from toaster model in v2.2
* @deprecated Status will be removed from toaster model in v3.0
*/
export enum Status {
confirm = 'confirm',

181
npm/ng-packs/yarn.lock

@ -2,125 +2,122 @@
# yarn lockfile v1
"@abp/ng.account.config@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.1.0.tgz#3ee7cdf6a3d72db90c55f2dc775c402d5be63b29"
integrity sha512-6kCMRy+HLZqM5wKhSDfwc71Ei6MdQ502jOSWCpIPt2wgo8hGnRbht0hdUbT0XgY3qebRA14wXSh59DzLLhPW+A==
"@abp/ng.account.config@^2.2.0", "@abp/ng.account.config@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.2.0.tgz#420396fc55eadd9a5c179e87075a51437ebc964c"
integrity sha512-5BpxFnXCeCDR+m3qGMKn8rSMGwBb4mkwtejVAJXCVYoMXL8x2J9uRgDf9fkdudqpls+BIgB8BX1tRyJiY+Bg8Q==
dependencies:
tslib "^1.9.0"
"@abp/ng.account@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.1.0.tgz#20a702e0901f1402eb9a4fe1fbb7d326ad4664ae"
integrity sha512-Ql6U9D+r34xCSvZpDTy7R/jYf9zt9Rx+0Dgsro4JRII+rKHtS8r3+aLPD3PMSNwjKBsCwj6dl+GUYbICbxhHiQ==
"@abp/ng.account@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.2.0.tgz#3a200a46f83c36ae89a6724a6a2226a5f846641b"
integrity sha512-OwTOxXDI3BJ1MrlR6WtvDmNIkqi1OCWlq7MvUhuFPVmIIUI3OjxHNASk1NfWMSlu6amXDxuFEey4ItrMKnAJog==
dependencies:
"@abp/ng.account.config" "^2.1.0"
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.account.config" "^2.2.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.core@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.1.0.tgz#70d47b81e7bbf1fa6d38e557c2aef26c9611458a"
integrity sha512-BJquoWQbH/lJmXeBKcOQfUTLkeGvTTgeq+ZRIngm7qGnbM5oeS3LPo6rTopP1ELHWzfkRMthx3HHJF4xqMpmaQ==
"@abp/ng.core@^2.2.0", "@abp/ng.core@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.2.0.tgz#a553e845f7bc43838704eb15d8684869dfcb053b"
integrity sha512-HtyHJYPY6kKqySt/afgFT5j6yaN7Bx4MMvIGWHqFqZsQChWceagLk5SBFTOjCE1FgsewX2a7OT452bKjgsWsrg==
dependencies:
"@ngxs/router-plugin" "^3.5.1"
"@ngxs/storage-plugin" "^3.5.1"
"@ngxs/store" "^3.5.1"
"@angular/localize" "~9.0.2"
"@ngxs/router-plugin" "^3.6.2"
"@ngxs/storage-plugin" "^3.6.2"
"@ngxs/store" "^3.6.2"
angular-oauth2-oidc "^8.0.4"
just-clone "3.1.0"
just-compare "^1.3.0"
snq "^1.0.3"
tslib "^1.9.0"
"@abp/ng.feature-management@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.1.0.tgz#914bafbbb16e7080a519b081e830c7e6dec1e948"
integrity sha512-9geOnDrmZyVD9VRVkLD+Az5zVjw2K/t1znq2IE6aZN9XUmCkvu7Rsao0OwPeMZDcFHqe2MlrLSa/RkxOpwX5Og==
"@abp/ng.feature-management@^2.2.0", "@abp/ng.feature-management@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.2.0.tgz#04f959ddb62a0abd99a84fb4e6ec935a796418d4"
integrity sha512-Cw0GRi+6LX5oKDwEvJJyUoh7M4hvaUE5TsuP1E3Hicg/1mMSyUDXVrLBOvAeWWolyfFTpFKLppAvoEEMpUt2eg==
dependencies:
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.identity.config@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.1.0.tgz#2ea5ba58fc2d882166a076d32eb1b1835b9d9f78"
integrity sha512-irg2ey/LEIHeOkq/ZnNSAncq69AxYYt4Cm4xTT+sNgjyN2hrqpj+NBx6hjOnLci0ZB69o08/o1NgVdHRwgk9WQ==
"@abp/ng.identity.config@^2.2.0", "@abp/ng.identity.config@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.2.0.tgz#ac050ed632624c490d8957a18606622637d1d6f3"
integrity sha512-sHRG0iRFrGtF2pNnKcjBaeupg39V8easzUFPU42/SVPi0XyAumrOZRbKkN2CBl0WYedqARTZxE5/nejRMXX4Fg==
dependencies:
tslib "^1.9.0"
"@abp/ng.identity@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.1.0.tgz#ee5646b7538619735548cd6e8db3bcdeedf1e21e"
integrity sha512-4aRtveWZ0J0zSfVuNR9t8EIsujLrI0Zudg9/iagbA37Q018rJIiRX58zuOfcfoBojk8y9Ul0ceviaWbH4DLoYg==
"@abp/ng.identity@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.2.0.tgz#1cc7ffa4e2aae462d8ce2399f94cf5ad047fefae"
integrity sha512-G/hrMg/PaN0tA871D52AuKlUhsLWfWSblK0XqQiRmMp/ozsEYSvAV91n/pEScm7qx0RF01K0J5K5V8Cjb4LTyA==
dependencies:
"@abp/ng.identity.config" "^2.1.0"
"@abp/ng.permission-management" "^2.1.0"
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.identity.config" "^2.2.0"
"@abp/ng.permission-management" "^2.2.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.permission-management@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.1.0.tgz#e5e561d4a9d6e7f46a681860836a3094eedf9b08"
integrity sha512-qXVFaenKikcu6WRJFt6BIIiCtdxuVirgwvo6hoILzfuDeNn0Kl6qqpjMAe2Rpeltm5hBj5Xurm2WFsAQMJeu2w==
"@abp/ng.permission-management@^2.2.0", "@abp/ng.permission-management@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.2.0.tgz#56bece037aa094400f8d5585db0bfd5718437ae0"
integrity sha512-OeUZzZV+2TTWOhmpwFTvar9/4IpKz5EhI/6uabu3pOtIsU2Ms2OBbjwVUSKbhLT7e0+z5MM1nPCDoXIlYv22wA==
dependencies:
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.setting-management.config@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.1.0.tgz#aba507be43f6cef3e03fc65d2f361fd6fc375801"
integrity sha512-L7iJ9E+qIsylz0cLuiabZJrTl4pMs8H7cx7ZL7aNGcwMqULSSpI1DYZ7HbodNxZetpL2R1AO6mTEHU+Y3YtaLw==
"@abp/ng.setting-management.config@^2.2.0", "@abp/ng.setting-management.config@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.2.0.tgz#31cf94a785fc2d5c3f1bcfe2c79afc0f1ab419ee"
integrity sha512-vZhBvKFZ6puWwujkzEEhqyQiMKdTmAeJjSxlUPRyIuwowrZhPnUk1r0ghyOLTC5fC1TDaUXF1mZ2UsBFMDvuiw==
dependencies:
tslib "^1.9.0"
"@abp/ng.setting-management@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.1.0.tgz#5a44da7615c93ecce51ff0df137df00bc1611964"
integrity sha512-Ri3YBn484PU0U1ffp8Hwyq/Do4hajMIk7K70R985vOhzyq9jPzBS4hOoBP+C9Xl/Cn6H0mfMiyr25NNUk7at+w==
"@abp/ng.setting-management@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.2.0.tgz#e1c976bf69bbfaa452489b8968b8669c3fba7710"
integrity sha512-LL6CUi0qpS0+9kPz/T0n1U+Kpu9gwI49+d/+xVDG+lIziGqukgwgoUwlEv+Lk0ak+RC5noLurvvJaaKd3l3mPw==
dependencies:
"@abp/ng.setting-management.config" "^2.1.0"
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.setting-management.config" "^2.2.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.tenant-management.config@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.1.0.tgz#8dd5c32fdca0c679b2534cb4b4025fb5de1532ee"
integrity sha512-A9ucsNiLsAA/bANJGX4mi2DThR7jiNFb9u4aGdwcphZw5l2DyDqJdcXkOHMQU3S4KwVBCzQbOY1FHdNTqnTPSQ==
"@abp/ng.tenant-management.config@^2.2.0", "@abp/ng.tenant-management.config@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.2.0.tgz#16d87f31ec069e1f3a8351ef3be9a05a3002ed26"
integrity sha512-lfW9lGERn9PBIRseJajQ0GSxo1+wfRxO7Ic/lSSPxhUbsmwg6afquYTcGiU0d+4QQOBY47ga3n0IVrNqWq1pmw==
dependencies:
tslib "^1.9.0"
"@abp/ng.tenant-management@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.1.0.tgz#908b421a4a1c91348bb9576a2f2f9db610de3977"
integrity sha512-5vMqpmcRiRpnUOVhknJc9T2mUzwB+j4vfJGBxxeLpSd9oMpausvL44waMvpyGJGtXNJaiDkeE0ef7EycSwpD0Q==
"@abp/ng.tenant-management@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.2.0.tgz#0ce498eaf9f65ef0255fc23949a47f8ae36cf5c8"
integrity sha512-v9Y5F9fm2EXYteCWKI8QODN4ETmSdh6K7gC5Y3+/N+QaUAod8JxFNX0EIXzFGnSLbiZ0O1xA/TRJruQTv1m3SA==
dependencies:
"@abp/ng.feature-management" "^2.1.0"
"@abp/ng.tenant-management.config" "^2.1.0"
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.feature-management" "^2.2.0"
"@abp/ng.tenant-management.config" "^2.2.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.theme.basic@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.1.0.tgz#9b1d9cbf47f01bbe93db57312bc685dfabfd2a92"
integrity sha512-yjUbFlGPe85hndiCJ9ZefN3JZyItXeKFhGOFbNclTuN8owW21fVrQsk9V6cGN0Jtt1AQr1TDZ0Qr2tVnKEthlQ==
"@abp/ng.theme.basic@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.2.0.tgz#7a086a27daa3bec16962dd62dfb2f39a1538e82f"
integrity sha512-fpdDjjhEQZtaZvFkVi5uhqZoYyrxCWJeQgGFvLS36TqYqvJVyoMeJBlVw0CgbY3F+u5V/GmZSVxvZAAJDpUYhg==
dependencies:
"@abp/ng.theme.shared" "^2.1.0"
"@abp/ng.theme.shared" "^2.2.0"
tslib "^1.9.0"
"@abp/ng.theme.shared@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.1.0.tgz#60655b94f755ccd6af3d51061d15547bb216c2ab"
integrity sha512-6PFEVIg2hST8ZVOaR8xHNiEwd9S5AEQ+S2eQRBs7eptN75WYL7CGQTjVGIsphB2g1TYA3256k0shxyOR6iw63g==
"@abp/ng.theme.shared@^2.2.0", "@abp/ng.theme.shared@~2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.2.0.tgz#438f77498df3e2f25a1ecf9adb77a9ee5a71d2c5"
integrity sha512-w7TnDbdHpOFcT12wt/9nZDH9PkyZdTP6W+tJIGeH6zOgWC8V4MDX8Ulc9e/ZvQ8u0qRLOEmk3aE5odFQUHSlJw==
dependencies:
"@abp/ng.core" "^2.1.0"
"@angular/cdk" "^8.2.3"
"@fortawesome/fontawesome-free" "^5.11.2"
"@ng-bootstrap/ng-bootstrap" "^5.1.4"
"@abp/ng.core" "^2.2.0"
"@fortawesome/fontawesome-free" "^5.12.1"
"@ng-bootstrap/ng-bootstrap" "^5.3.0"
"@ngx-validate/core" "^0.0.7"
bootstrap "^4.3.1"
chart.js "^2.9.2"
font-awesome "^4.7.0"
primeicons "^2.0.0"
primeng "^8.1.1"
bootstrap "^4.4.1"
chart.js "^2.9.3"
tslib "^1.9.0"
"@angular-builders/jest@^8.2.0":
@ -274,15 +271,6 @@
dependencies:
tslib "^1.9.0"
"@angular/cdk@^8.2.3":
version "8.2.3"
resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-8.2.3.tgz#16b96ffa935cbf5a646757ecaf2b19c434678f72"
integrity sha512-ZwO5Sn720RA2YvBqud0JAHkZXjmjxM0yNzCO8RVtRE9i8Gl26Wk0j0nQeJkVm4zwv2QO8MwbKUKGTMt8evsokA==
dependencies:
tslib "^1.7.1"
optionalDependencies:
parse5 "^5.0.0"
"@angular/cli@~8.3.21":
version "8.3.25"
resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.3.25.tgz#2802291f83a88f334336a1482c8ee63a69cabad7"
@ -1232,7 +1220,7 @@
unique-filename "^1.1.1"
which "^1.3.1"
"@fortawesome/fontawesome-free@^5.11.2", "@fortawesome/fontawesome-free@^5.12.1":
"@fortawesome/fontawesome-free@^5.12.1":
version "5.12.1"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.12.1.tgz#2a98fea9fbb8a606ddc79a4680034e9d5591c550"
integrity sha512-ZtjIIFplxncqxvogq148C3hBLQE+W3iJ8E4UvJ09zIJUgzwLcROsWwFDErVSXY2Plzao5J9KUYNHKHMEUYDMKw==
@ -2083,7 +2071,7 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
"@ng-bootstrap/ng-bootstrap@^5.1.4", "@ng-bootstrap/ng-bootstrap@^5.3.0":
"@ng-bootstrap/ng-bootstrap@^5.3.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-5.3.0.tgz#4d624dd70a93f99c38bc35b1d3e00afc490155fc"
integrity sha512-oNg1sgT+XXxwSBX9oF4AeCHrq+Nm1CvukfVT/NPuYiuNAoTeVOdXc5bJHTLd+cCwoZ1OPZN/yZT+1BcW1KCksQ==
@ -2133,21 +2121,21 @@
dependencies:
tslib "^1.9.0"
"@ngxs/router-plugin@^3.5.1", "@ngxs/router-plugin@^3.6.2":
"@ngxs/router-plugin@^3.6.2":
version "3.6.2"
resolved "https://registry.yarnpkg.com/@ngxs/router-plugin/-/router-plugin-3.6.2.tgz#058b09565011203bbf52294f16f29f9337aeaa27"
integrity sha512-5J3G9+Qsy/s7iqFivzAN1S6EmaZYTb9hqz7Xjn3c0u3Y44VMP5VWiz77jZ/eowXX0slJywcMxk6oCEFPwz4lXQ==
dependencies:
tslib "^1.9.0"
"@ngxs/storage-plugin@^3.5.1", "@ngxs/storage-plugin@^3.6.2":
"@ngxs/storage-plugin@^3.6.2":
version "3.6.2"
resolved "https://registry.yarnpkg.com/@ngxs/storage-plugin/-/storage-plugin-3.6.2.tgz#6fe2168891382c635406df02308f67b585efc60a"
integrity sha512-x9CATYmXDH9bWmKW4uQxt5xxb51naSAmMkhvv1QHIrE9hG4uYNqiV3ERAM1wZvZbu2MJB9iXEN0cBziTgrwe2Q==
dependencies:
tslib "^1.9.0"
"@ngxs/store@^3.5.1", "@ngxs/store@^3.6.2":
"@ngxs/store@^3.6.2":
version "3.6.2"
resolved "https://registry.yarnpkg.com/@ngxs/store/-/store-3.6.2.tgz#cfba63dc1e5bd422e89e54b3332cd69818510624"
integrity sha512-al7GU618SAuz2Ul4rFYVDgS1DM0gHReGOGvbnE7LBt4Etz3gsJERNYXPp2bSA7lZGaRPRaFfIHJN+Lm/GikFJw==
@ -3274,7 +3262,7 @@ bonjour@^3.5.0:
multicast-dns "^6.0.1"
multicast-dns-service-types "^1.1.0"
bootstrap@^4.3.1, bootstrap@^4.4.1:
bootstrap@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01"
integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==
@ -3696,7 +3684,7 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
chart.js@^2.9.2, chart.js@^2.9.3:
chart.js@^2.9.3:
version "2.9.3"
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7"
integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==
@ -9595,11 +9583,6 @@ primeicons@^2.0.0:
resolved "https://registry.yarnpkg.com/primeicons/-/primeicons-2.0.0.tgz#ec3e5a8d4d04a09309225a5a57deb911e08dc0d3"
integrity sha512-GJTCeMSQU8UU1GqbsaDrg/IH+b/vSinJQl52NVpdJ7sShYLZA8Eq6jLF48Ye3N/dQloGrE07i7XsZvxQ9pNbqg==
primeng@^8.1.1:
version "8.1.4"
resolved "https://registry.yarnpkg.com/primeng/-/primeng-8.1.4.tgz#aa98de9b3a4f8bd669da6011c0abde6892110fe5"
integrity sha512-UHZ10i551zS3+g5GAADI99JhWriYs25QvYYh8wm3twi9HuCVpmRdpULqbsY6gIhvcl0qnPyVTLQM/XII//tVUg==
private@^0.1.6:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@ -11712,7 +11695,7 @@ tslib@1.10.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.0.tgz#f1f3528301621a53220d58373ae510ff747a66bc"
integrity sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==

2
npm/package-lock.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

6
npm/packs/anchor-js/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/anchor-js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"anchor-js": "^4.2.2"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/aspnetcore.mvc.ui.theme.basic/package.json

@ -1,11 +1,11 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/aspnetcore.mvc.ui.theme.basic",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.2.0"
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.3.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

32
npm/packs/aspnetcore.mvc.ui.theme.shared/package.json

@ -1,24 +1,24 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/aspnetcore.mvc.ui.theme.shared",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui": "^2.2.0",
"@abp/bootstrap": "^2.2.0",
"@abp/bootstrap-datepicker": "^2.2.0",
"@abp/datatables.net-bs4": "^2.2.0",
"@abp/font-awesome": "^2.2.0",
"@abp/jquery-form": "^2.2.0",
"@abp/jquery-validation-unobtrusive": "^2.2.0",
"@abp/lodash": "^2.2.0",
"@abp/luxon": "^2.2.0",
"@abp/malihu-custom-scrollbar-plugin": "^2.2.0",
"@abp/select2": "^2.2.0",
"@abp/sweetalert": "^2.2.0",
"@abp/timeago": "^2.2.0",
"@abp/toastr": "^2.2.0"
"@abp/aspnetcore.mvc.ui": "^2.3.0",
"@abp/bootstrap": "^2.3.0",
"@abp/bootstrap-datepicker": "^2.3.0",
"@abp/datatables.net-bs4": "^2.3.0",
"@abp/font-awesome": "^2.3.0",
"@abp/jquery-form": "^2.3.0",
"@abp/jquery-validation-unobtrusive": "^2.3.0",
"@abp/lodash": "^2.3.0",
"@abp/luxon": "^2.3.0",
"@abp/malihu-custom-scrollbar-plugin": "^2.3.0",
"@abp/select2": "^2.3.0",
"@abp/sweetalert": "^2.3.0",
"@abp/timeago": "^2.3.0",
"@abp/toastr": "^2.3.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

4
npm/packs/aspnetcore.mvc.ui/package.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/aspnetcore.mvc.ui",
"publishConfig": {
"access": "public"
@ -12,5 +12,5 @@
"path": "^0.12.7",
"rimraf": "^3.0.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

10
npm/packs/blogging/package.json

@ -1,13 +1,13 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/blogging",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.2.0",
"@abp/owl.carousel": "^2.2.0",
"@abp/tui-editor": "^2.2.0"
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.3.0",
"@abp/owl.carousel": "^2.3.0",
"@abp/tui-editor": "^2.3.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

4
npm/packs/bootstrap-datepicker/package.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/bootstrap-datepicker",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"bootstrap-datepicker": "^1.9.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/bootstrap/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/bootstrap",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"bootstrap": "^4.3.1"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

4
npm/packs/chart.js/package.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/chart.js",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"chart.js": "^2.9.3"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/clipboard/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/clipboard",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"clipboard": "^2.0.4"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/codemirror/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/codemirror",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"codemirror": "^5.49.2"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

4
npm/packs/core/package.json

@ -1,8 +1,8 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/core",
"publishConfig": {
"access": "public"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/datatables.net-bs4/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/datatables.net-bs4",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/datatables.net": "^2.2.0",
"@abp/datatables.net": "^2.3.0",
"datatables.net-bs4": "^1.10.20"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/datatables.net/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/datatables.net",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"datatables.net": "^1.10.20"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

14
npm/packs/docs/package.json

@ -1,15 +1,15 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/docs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/anchor-js": "^2.2.0",
"@abp/clipboard": "^2.2.0",
"@abp/malihu-custom-scrollbar-plugin": "^2.2.0",
"@abp/popper.js": "^2.2.0",
"@abp/prismjs": "^2.2.0"
"@abp/anchor-js": "^2.3.0",
"@abp/clipboard": "^2.3.0",
"@abp/malihu-custom-scrollbar-plugin": "^2.3.0",
"@abp/popper.js": "^2.3.0",
"@abp/prismjs": "^2.3.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

4
npm/packs/flag-icon-css/package.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/flag-icon-css",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"flag-icon-css": "^3.4.5"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/font-awesome/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/font-awesome",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"@fortawesome/fontawesome-free": "^5.11.2"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/highlight.js/package.json

@ -1,11 +1,11 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/highlight.js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0"
"@abp/core": "^2.3.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/jquery-form/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/jquery-form",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.2.0",
"@abp/jquery": "^2.3.0",
"jquery-form": "^4.2.2"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/jquery-validation-unobtrusive/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/jquery-validation-unobtrusive",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery-validation": "^2.2.0",
"@abp/jquery-validation": "^2.3.0",
"jquery-validation-unobtrusive": "^3.2.11"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/jquery-validation/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/jquery-validation",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.2.0",
"@abp/jquery": "^2.3.0",
"jquery-validation": "^1.19.1"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/jquery/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/jquery",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"jquery": "^3.4.1"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/lodash/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/lodash",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"lodash": "^4.17.15"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

4
npm/packs/luxon/package.json

@ -1,5 +1,5 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/luxon",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"luxon": "^1.21.3"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/malihu-custom-scrollbar-plugin/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/malihu-custom-scrollbar-plugin",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"malihu-custom-scrollbar-plugin": "^3.1.5"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/markdown-it/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/markdown-it",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"markdown-it": "^10.0.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/owl.carousel/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/owl.carousel",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"owl.carousel": "^2.3.4"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/popper.js/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/popper.js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"popper.js": "^1.16.0"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/prismjs/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/prismjs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"prismjs": "^1.17.1"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/select2/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/select2",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"select2": "^4.0.12"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/sweetalert/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/sweetalert",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.2.0",
"@abp/core": "^2.3.0",
"sweetalert": "^2.1.2"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/timeago/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/timeago",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.2.0",
"@abp/jquery": "^2.3.0",
"timeago": "^1.6.7"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

6
npm/packs/toastr/package.json

@ -1,12 +1,12 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/toastr",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.2.0",
"@abp/jquery": "^2.3.0",
"toastr": "^2.1.4"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

12
npm/packs/tui-editor/package.json

@ -1,15 +1,15 @@
{
"version": "2.2.0",
"version": "2.3.0",
"name": "@abp/tui-editor",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/codemirror": "^2.2.0",
"@abp/highlight.js": "^2.2.0",
"@abp/jquery": "^2.2.0",
"@abp/markdown-it": "^2.2.0",
"@abp/codemirror": "^2.3.0",
"@abp/highlight.js": "^2.3.0",
"@abp/jquery": "^2.3.0",
"@abp/markdown-it": "^2.3.0",
"tui-editor": "^1.4.8"
},
"gitHead": "d5707967977fb14328661ae403c41eaa679ee263"
"gitHead": "e5aead708928c668494ed0dbd7e8ae5c5ef9b9e7"
}

1
npm/preview-publish.ps1

@ -20,7 +20,6 @@ $Registry = "http://localhost:4873";
}
$commands = (
"npm-cli-login -u $User -p $Pass -e $Email -r $Registry",
"cd ng-packs\scripts",
"npm install",
"npm run publish-packages -- --nextVersion $Version --preview",

1
nupkg/common.ps1

@ -92,6 +92,7 @@ $projects = (
"framework/src/Volo.Abp.MultiTenancy",
"framework/src/Volo.Abp.Minify",
"framework/src/Volo.Abp.ObjectMapping",
"framework/src/Volo.Abp.Quartz",
"framework/src/Volo.Abp.RabbitMQ",
"framework/src/Volo.Abp.Security",
"framework/src/Volo.Abp.Serialization",

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

Loading…
Cancel
Save