Merge branch 'rel-3.1' into dev

pull/5303/head
Halil İbrahim Kalkan 5 years ago
commit 3857f501c0

@ -0,0 +1,41 @@
# Upgrading the ABP Framework
This document explains how to upgrade your existing solution when a new ABP Framework version is published.
## ABP UPDATE Command
ABP Framework & module ecosystem consist of hundreds of NuGet and NPM packages. It would be tedious to manually update all these packages to upgrade your application.
[ABP CLI](CLI.md) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command:
````bash
abp update
````
Run this command in the terminal while you are in the root folder of your solution.
> If your solution has the Angular UI, you probably have `aspnet-core` and `angular` folders in the solution. Run this command in the parent folder of these two folders.
## The Blog Posts
Sometimes we introduce new features/changes that requires to make changes in the startup template. We already implement the changes in the startup template for new applications. However, in some cases you need to manually make some minor changes in your solution.
Whenever you upgrade your solution, it is strongly suggested to check the [ABP BLOG](https://blog.abp.io/?_ga=2.177248992.411298747.1597771169-1910388957.1594128976) to learn the new features and changes coming with the new version. We regularly publish posts and write these kind of changes. If the changes are not trivial, we also provide migration guides.
## Semantic Versioning & Breaking Changes
We are working hard to keep the semantic versioning rules, so you don't get breaking changes for minor (feature) versions like 3.1, 3.2, 3.3...
However, there are some cases we may introduce breaking changes in feature versions too;
* ABP has many integration packages and sometimes the integrated libraries/frameworks releases major versions and makes breaking changes. In such cases, we carefully check these changes and decide to upgrade the integration package or not. If the impact of the change is relatively small, we update the integration package and explain the change in the release blog post. In such a case, if you've used this integration package, you should follow the instructions explained in the blog post. If the change may break many applications and not easy to fix, we decide to wait this upgrade until the next major ABP Framework release.
* Sometimes we have to make breaking change to fix a major bug or usage problem. In this case, we think that developer already can't properly use that feature, so no problem to fix it with a breaking change. In such cases, the feature will generally be a rarely used feature. Again, we try to keep the impact minimum.
## Preview Releases & Nightly Builds
Preview releases and nightly builds can help you to try new features and adapt your solution earlier than a new stable release.
* [Preview releases](Previews.md) are typically published ~2 weeks before a minor (feature) version (our minor version development cycle is about ~4 weeks).
* [Nightly builds](Nightly-Builds.md) are published in every night (except weekends) from the development branch. That means you can try the previous day's development.
Refer to the their documents to learn details about these kind of releases.

@ -684,6 +684,10 @@
"text": "Road Map", "text": "Road Map",
"path": "Road-Map.md" "path": "Road-Map.md"
}, },
{
"text": "Upgrading",
"path": "Upgrading.md"
},
{ {
"text": "Contribution Guide", "text": "Contribution Guide",
"path": "Contribution/Index.md" "path": "Contribution/Index.md"

@ -30,6 +30,7 @@
"@abp/ng.feature-management": "~3.1.0-rc.4", "@abp/ng.feature-management": "~3.1.0-rc.4",
"@abp/ng.identity": "~3.1.0-rc.4", "@abp/ng.identity": "~3.1.0-rc.4",
"@abp/ng.permission-management": "~3.1.0-rc.4", "@abp/ng.permission-management": "~3.1.0-rc.4",
"@abp/ng.schematics": "~3.1.0-rc.4",
"@abp/ng.setting-management": "~3.1.0-rc.4", "@abp/ng.setting-management": "~3.1.0-rc.4",
"@abp/ng.tenant-management": "~3.1.0-rc.4", "@abp/ng.tenant-management": "~3.1.0-rc.4",
"@abp/ng.theme.basic": "~3.1.0-rc.4", "@abp/ng.theme.basic": "~3.1.0-rc.4",

@ -133,8 +133,8 @@ export abstract class AbstractNavTreeService<T extends ABP.Nav> extends Abstract
readonly parentId = 'parentName'; readonly parentId = 'parentName';
readonly hide = (item: T) => item.invisible || !this.isGranted(item); readonly hide = (item: T) => item.invisible || !this.isGranted(item);
readonly sort = (a: T, b: T) => { readonly sort = (a: T, b: T) => {
if (!a.order) return 1; if (!Number.isInteger(a.order)) return 1;
if (!b.order) return -1; if (!Number.isInteger(b.order)) return -1;
return a.order - b.order; return a.order - b.order;
}; };

@ -19,10 +19,10 @@ import {
createImportRefToEnumMapper, createImportRefToEnumMapper,
createProxyConfigReader, createProxyConfigReader,
createProxyConfigWriterCreator, createProxyConfigWriterCreator,
createRootNamespaceGetter,
EnumGeneratorParams, EnumGeneratorParams,
generateProxyConfigJson, generateProxyConfigJson,
getEnumNamesFromImports, getEnumNamesFromImports,
getRootNamespace,
interpolate, interpolate,
ModelGeneratorParams, ModelGeneratorParams,
removeDefaultPlaceholders, removeDefaultPlaceholders,
@ -37,9 +37,10 @@ export default function(schema: GenerateProxySchema) {
return chain([ return chain([
async (tree: Tree, _context: SchematicContext) => { async (tree: Tree, _context: SchematicContext) => {
const source = await resolveProject(tree, params.source!); const getRootNamespace = createRootNamespaceGetter(params);
const solution = await getRootNamespace(tree);
const target = await resolveProject(tree, params.target!); const target = await resolveProject(tree, params.target!);
const solution = getRootNamespace(tree, source, moduleName);
const targetPath = buildDefaultPath(target.definition); const targetPath = buildDefaultPath(target.definition);
const readProxyConfig = createProxyConfigReader(targetPath); const readProxyConfig = createProxyConfigReader(targetPath);
const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath); const createProxyConfigWriter = createProxyConfigWriterCreator(targetPath);

@ -5,34 +5,40 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m", "description": "Backend module name",
"description": "Backend module to generate code for",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 0 "index": 0
}, },
"x-prompt": "Please enter name of the backend module you wish to generate proxies for. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"source": { "api-name": {
"alias": "s", "description": "Backend api name, a.k.a. remoteServiceName",
"description": "Angular project to resolve root namespace & API definition URL from",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 1
}, },
"x-prompt": "Plese enter Angular project name to resolve root namespace & API definition URL from. (default: workspace \"defaultProject\")" "x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
}, },
"target": { "source": {
"alias": "t", "description": "Source Angular project for API definition URL & root namespace resolution",
"description": "Angular project to generate code in",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 2
}, },
"x-prompt": "Plese enter Angular project name to place generated code in. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
},
"target": {
"description": "Target Angular project to place the generated code",
"type": "string",
"$default": {
"$source": "argv",
"index": 3
},
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }
}, },
"required": [] "required": []

@ -5,7 +5,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m",
"description": "Backend module name", "description": "Backend module name",
"type": "string", "type": "string",
"$default": { "$default": {
@ -14,23 +13,30 @@
}, },
"x-prompt": "Please enter backend module name. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"api-name": {
"description": "Backend api name, a.k.a. remoteServiceName",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
"x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
},
"source": { "source": {
"alias": "s",
"description": "Source Angular project for API definition URL & root namespace resolution", "description": "Source Angular project for API definition URL & root namespace resolution",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 2
}, },
"x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
}, },
"target": { "target": {
"alias": "t",
"description": "Target Angular project to place the generated code", "description": "Target Angular project to place the generated code",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 3
}, },
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }

@ -5,7 +5,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m",
"description": "Backend module name", "description": "Backend module name",
"type": "string", "type": "string",
"$default": { "$default": {
@ -14,23 +13,30 @@
}, },
"x-prompt": "Please enter backend module name. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"api-name": {
"description": "Backend api name, a.k.a. remoteServiceName",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
"x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
},
"source": { "source": {
"alias": "s",
"description": "Source Angular project for API definition URL & root namespace resolution", "description": "Source Angular project for API definition URL & root namespace resolution",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 2
}, },
"x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
}, },
"target": { "target": {
"alias": "t",
"description": "Target Angular project to place the generated code", "description": "Target Angular project to place the generated code",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 3
}, },
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }

@ -5,7 +5,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"module": { "module": {
"alias": "m",
"description": "Backend module name", "description": "Backend module name",
"type": "string", "type": "string",
"$default": { "$default": {
@ -14,23 +13,30 @@
}, },
"x-prompt": "Please enter backend module name. (default: \"app\")" "x-prompt": "Please enter backend module name. (default: \"app\")"
}, },
"api-name": {
"description": "Backend api name, a.k.a. remoteServiceName",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
"x-prompt": "Please enter backend api name, a.k.a. remoteServiceName. (default: \"default\")"
},
"source": { "source": {
"alias": "s",
"description": "Source Angular project for API definition URL & root namespace resolution", "description": "Source Angular project for API definition URL & root namespace resolution",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 1 "index": 2
}, },
"x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter source Angular project for API definition URL & root namespace resolution. (default: workspace \"defaultProject\")"
}, },
"target": { "target": {
"alias": "t",
"description": "Target Angular project to place the generated code", "description": "Target Angular project to place the generated code",
"type": "string", "type": "string",
"$default": { "$default": {
"$source": "argv", "$source": "argv",
"index": 2 "index": 3
}, },
"x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")" "x-prompt": "Plese enter target Angular project to place the generated code. (default: workspace \"defaultProject\")"
} }

@ -11,6 +11,6 @@ export const enum Exception {
NoTypeDefinition = '[Type Definition Not Found] There is no type definition for "{0}".', NoTypeDefinition = '[Type Definition Not Found] There is no type definition for "{0}".',
NoWorkspace = '[Workspace Not Found] Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.', NoWorkspace = '[Workspace Not Found] Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.',
NoEnvironment = '[Environment Not Found] An environment file cannot be located in "{0}" project.', NoEnvironment = '[Environment Not Found] An environment file cannot be located in "{0}" project.',
NoApiUrl = '[API URL Not Found] Cannot resolve API URL for "{1}" module from "{0}" project.', NoApiUrl = '[API URL Not Found] Cannot resolve API URL for "{1}" remote service name from "{0}" project.',
NoRootNamespace = '[Root Namespace Not Found] Cannot resolve root namespace for "{1}" module from "{0}" project.', NoRootNamespace = '[Root Namespace Not Found] Cannot resolve root namespace for "{1}" api from "{0}" project.',
} }

@ -4,6 +4,11 @@ export interface GenerateProxySchema {
*/ */
module?: string; module?: string;
/**
* Backend api name, a.k.a. remoteServiceName
*/
['api-name']?: string;
/** /**
* Source Angular project for API definition URL & root namespace resolution * Source Angular project for API definition URL & root namespace resolution
*/ */

@ -1,4 +1,3 @@
import { strings } from '@angular-devkit/core';
import { SchematicsException, Tree } from '@angular-devkit/schematics'; import { SchematicsException, Tree } from '@angular-devkit/schematics';
import got from 'got'; import got from 'got';
import { import {
@ -15,11 +14,11 @@ import { interpolate } from './common';
import { readEnvironment, resolveProject } from './workspace'; import { readEnvironment, resolveProject } from './workspace';
export function createApiDefinitionGetter(params: GenerateProxySchema) { export function createApiDefinitionGetter(params: GenerateProxySchema) {
const moduleName = strings.camelize(params.module || 'app'); const apiName = params['api-name'] || 'default';
return async (host: Tree) => { return async (host: Tree) => {
const source = await resolveProject(host, params.source!); const source = await resolveProject(host, params.source!);
const sourceUrl = getSourceUrl(host, source, moduleName); const sourceUrl = getSourceUrl(host, source, apiName);
return await getApiDefinition(sourceUrl); return await getApiDefinition(sourceUrl);
}; };
} }
@ -36,7 +35,7 @@ async function getApiDefinition(sourceUrl: string) {
})); }));
} catch ({ response }) { } catch ({ response }) {
// handle redirects // handle redirects
if (response.statusCode >= 400 || !response?.body) if (!response?.body || response.statusCode >= 400)
throw new SchematicsException(Exception.NoApi); throw new SchematicsException(Exception.NoApi);
body = response.body; body = response.body;
@ -45,48 +44,49 @@ async function getApiDefinition(sourceUrl: string) {
return body; return body;
} }
export function getRootNamespace(tree: Tree, project: Project, moduleName: string) { export function createRootNamespaceGetter(params: GenerateProxySchema) {
const environmentExpr = readEnvironment(tree, project.definition); const apiName = params['api-name'] || 'default';
if (!environmentExpr) return async (tree: Tree) => {
throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name)); const project = await resolveProject(tree, params.source!);
const environmentExpr = readEnvironment(tree, project.definition);
let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [ if (!environmentExpr)
'apis', throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name));
moduleName,
'rootNamespace',
]);
if (!assignment) let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [
assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [
'apis', 'apis',
'default', apiName,
'rootNamespace', 'rootNamespace',
]); ]);
if (!assignment) if (!assignment)
throw new SchematicsException(interpolate(Exception.NoRootNamespace, project.name, moduleName)); assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [
'apis',
'default',
'rootNamespace',
]);
return assignment.replace(/[`'"]/g, ''); if (!assignment)
throw new SchematicsException(interpolate(Exception.NoRootNamespace, project.name, apiName));
return assignment.replace(/[`'"]/g, '');
};
} }
export function getSourceUrl(tree: Tree, project: Project, moduleName: string) { export function getSourceUrl(tree: Tree, project: Project, apiName: string) {
const environmentExpr = readEnvironment(tree, project.definition); const environmentExpr = readEnvironment(tree, project.definition);
if (!environmentExpr) if (!environmentExpr)
throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name)); throw new SchematicsException(interpolate(Exception.NoEnvironment, project.name));
let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, [ let assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', apiName, 'url']);
'apis',
moduleName,
'url',
]);
if (!assignment) if (!assignment)
assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', 'default', 'url']); assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', 'default', 'url']);
if (!assignment) if (!assignment)
throw new SchematicsException(interpolate(Exception.NoApiUrl, project.name, moduleName)); throw new SchematicsException(interpolate(Exception.NoApiUrl, project.name, apiName));
return assignment.replace(/[`'"]/g, ''); return assignment.replace(/[`'"]/g, '');
} }

@ -13,6 +13,6 @@ export class RoutesComponent {
constructor(public readonly routes: RoutesService) {} constructor(public readonly routes: RoutesService) {}
isDropdown(node: TreeNode<ABP.Route>) { isDropdown(node: TreeNode<ABP.Route>) {
return !node.isLeaf || this.routes.hasChildren(node.name); return !node?.isLeaf || this.routes.hasChildren(node.name);
} }
} }

@ -2,20 +2,20 @@
# yarn lockfile v1 # yarn lockfile v1
"@abp/ng.account@~3.1.0-rc.3": "@abp/ng.account@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-3.1.0-rc.3.tgz#098a559e83d505b51f54343d6cd5be3e70b11869" resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-3.1.0-rc.4.tgz#af4039b286fe44929327e93dba9991cb273d5336"
integrity sha512-hFFWa0tBPlpVtLuZo7MRc+s0ODHEtJ8eQJc8H+TyFqTItk158XOjgHdKX0RYqt+Tn+0Iy/TJ1vKfupzuDqUBkg== integrity sha512-wYkSz1HlPwMPUMAfCe404LCb15ZDEV5GfNIZuHeyiNtC/AcvqZEbBBpM2xMZ3uMcvxH/72IrLFBpxemCY+6euw==
dependencies: dependencies:
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.core@~3.1.0-rc.3": "@abp/ng.core@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-3.1.0-rc.3.tgz#aefa4a2f7b418087f7a3c6c6faa9a936ce9011cb" resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-3.1.0-rc.4.tgz#cc0d237de4de5eac6006d1cdd2bb4014a7ecebb8"
integrity sha512-zU2jx9gTCwz26OW/umxGqSBluq1vnazYHqunnGFvH7wLcAoKHikpQv4kx4tR1dMn+7BZ1/MFwCYVxDYLtxWxdw== integrity sha512-H/kC8dLvbdHS/cEh2GHWw3vjjN2R5P0eAz+2bhC18kW/EQo6EgNckTbhgvYre9FtJPHbT2Prs1v1CWe1lB5Rnw==
dependencies: dependencies:
"@abp/utils" "^3.1.0-rc.2" "@abp/utils" "^3.1.0-rc.3"
"@angular/localize" "~10.0.10" "@angular/localize" "~10.0.10"
"@ngxs/router-plugin" "^3.6.2" "@ngxs/router-plugin" "^3.6.2"
"@ngxs/storage-plugin" "^3.6.2" "@ngxs/storage-plugin" "^3.6.2"
@ -27,62 +27,73 @@
ts-toolbelt "6.15.4" ts-toolbelt "6.15.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.feature-management@~3.1.0-rc.3": "@abp/ng.feature-management@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-3.1.0-rc.3.tgz#ed8a8e69d2ee69d07341c33e44e504b0638ad673" resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-3.1.0-rc.4.tgz#d9a85fbe8a780664c9474df9b0d2fe6874530781"
integrity sha512-KGykQd3AclkLTyQuSpVm3R6U2YD0pptF1A/rrdeA7BT5kQ3d/JgXboEkVrCyRnT4dTKWVjiweoXz1AaKj7HpzA== integrity sha512-y3xUFJSHmBCBivE6YRgUgA/XK/jIX1h+JdIsVwRQg9VoKq4Ba7xSF1uffYkbiZhELv9lUZ4t+r100nL64yj/kQ==
dependencies: dependencies:
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.identity@~3.1.0-rc.3": "@abp/ng.identity@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-3.1.0-rc.3.tgz#d32730f1968224f3d0e48bb44efafa6d01dfb330" resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-3.1.0-rc.4.tgz#6f04d8231fce78ee3a2de387e81aade5ac3fa9a3"
integrity sha512-YkPN4oYRhQ70N+LL890Yt99SIs874nn4MNWZbfm3JRlndT9gsvDLAZwqDtVbsqKanz7ymT4yCoa5t7Sakts2Tw== integrity sha512-mRI6uZ0PlbDhNNX1BGYECN5fDPyENnpudbo09SMSVGK99BSa+pJAvOMLWQTp8WJuo/C8kl/Mz17cAhp/EirgYQ==
dependencies: dependencies:
"@abp/ng.permission-management" "~3.1.0-rc.3" "@abp/ng.permission-management" "~3.1.0-rc.4"
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.permission-management@~3.1.0-rc.3": "@abp/ng.permission-management@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-3.1.0-rc.3.tgz#211c5ff854a62c924307dfbb8bdbb501479f1a86" resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-3.1.0-rc.4.tgz#b0415fc62ecfc03b57810e6a82fadeec887b64e4"
integrity sha512-nir4rYN2cWhwNPzLVT4TMhpVDkVJQJpp6B13YwjQ7O0B8rty/ongO343YcvbmkwwLqK9pBEjYTtXbuOnSLnvew== integrity sha512-/U5ehBn1dQYGcy++/EtciUlz69+WZ+ZXbxJ3MF7cNNy7BwZCyjKc7my2Uh2HrP+Ce3q1h11obX15KpB7uCggCg==
dependencies: dependencies:
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.setting-management@~3.1.0-rc.3": "@abp/ng.schematics@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-3.1.0-rc.3.tgz#539226e81f1d15a294ca7cdbb0b40cf94bc3d073" resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-3.1.0-rc.4.tgz#9f711466db0d46eb08ff14a19e930dbd7cb6aa59"
integrity sha512-kkumvT81zUUy44XLxX9qII2DXFoPl9gzXmJlAeCoh2cCofU5Ja4AxNkunZfzTTqLm6y/UDPjkzgYBa4KMOspdQ== integrity sha512-nn94E2JB0N5pcDNCh1JtyHV/ZhAnG+d+wKGzhZSOFEWZvPOREQs1OI4aKrBF94DYWy8yWxKZtPWEMwkmX+yXMg==
dependencies:
"@angular-devkit/core" "~10.0.3"
"@angular-devkit/schematics" "~10.0.3"
got "^11.5.2"
jsonc-parser "^2.3.0"
typescript "~3.9.2"
"@abp/ng.setting-management@~3.1.0-rc.4":
version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-3.1.0-rc.4.tgz#777b8487e6b6811c28375bf695d6db96ca59cc28"
integrity sha512-Mwx5nILDdqT7aEktv0gK1wxhtNuD9W67dlIcunwD/YD60hwAnRX3yFeg1aDHVF70EykY9UMerBGAG3J2Loclhg==
dependencies: dependencies:
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.tenant-management@~3.1.0-rc.3": "@abp/ng.tenant-management@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-3.1.0-rc.3.tgz#1678bae916387c99baa371d35a692197f719f278" resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-3.1.0-rc.4.tgz#c8ad9a927045599bec309408b3cdd741935fac7f"
integrity sha512-icvhvzSYjLH8dlrKL0HBtACkA0Q5JozILgYGEnUtPLuO4xpU3oiGGBA8AxB5gSkQ0C3/QiPRawQ9mhiTcnYoAQ== integrity sha512-DK5J0FjA9fR1crvaNa6o5WPjS8/8cDij65GHJb1RzXm8ZfpNoXlcZEUv3MXBJt4zIU3l5ZTDSH3skmNQaobosg==
dependencies: dependencies:
"@abp/ng.feature-management" "~3.1.0-rc.3" "@abp/ng.feature-management" "~3.1.0-rc.4"
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.theme.basic@~3.1.0-rc.3": "@abp/ng.theme.basic@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-3.1.0-rc.3.tgz#25654f6c55245645a4495c314cf575d159dd98d1" resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-3.1.0-rc.4.tgz#36a627ab520046f5978ec60ae9c03b723a879b66"
integrity sha512-ibfycWkE+7CnT/IafgoC89/w/kojp0ylw00kAm6toXTgRVE4eI2KmO1Wdc6Qyu5n/4SF3UnbH546odgUsjHvGA== integrity sha512-SJmc1KrLc3K1Njf+0UUXHB/ABdVbzIzYKT8GbCf0E/Nw6KgVufIpB+g92rqxkeqG9jKEASAnSomYRJeMJJ3bVQ==
dependencies: dependencies:
"@abp/ng.theme.shared" "~3.1.0-rc.3" "@abp/ng.theme.shared" "~3.1.0-rc.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.theme.shared@~3.1.0-rc.3": "@abp/ng.theme.shared@~3.1.0-rc.4":
version "3.1.0-rc.3" version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-3.1.0-rc.3.tgz#2fe6821f5aff7066d2a0a74296aeef205506d553" resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-3.1.0-rc.4.tgz#516a9d65229b1ddd1891edad8c1bd45ca3729228"
integrity sha512-Z7QbckMhc1j00iVYDUBqeCliTs0I1TxW1c6pgYdNXHKB4Djp9BBxw517Elj14zIhCQbnHUIcXDu2ZUTdx2hbMg== integrity sha512-wfMZSO0fwKDphAq8fWwvd7gxybY4LzQJNZdWYbBg12ePzXzRYCxxDg4xLzUetFYZQS+xSA9xoyGuCR8WT2OQEg==
dependencies: dependencies:
"@abp/ng.core" "~3.1.0-rc.3" "@abp/ng.core" "~3.1.0-rc.4"
"@fortawesome/fontawesome-free" "^5.14.0" "@fortawesome/fontawesome-free" "^5.14.0"
"@ng-bootstrap/ng-bootstrap" "^7.0.0" "@ng-bootstrap/ng-bootstrap" "^7.0.0"
"@ngx-validate/core" "^0.0.11" "@ngx-validate/core" "^0.0.11"
@ -91,13 +102,6 @@
chart.js "^2.9.3" chart.js "^2.9.3"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
dependencies:
just-compare "^1.3.0"
"@abp/utils@^3.1.0-rc.3": "@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3" version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a" resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
@ -105,6 +109,13 @@
dependencies: dependencies:
just-compare "^1.3.0" just-compare "^1.3.0"
"@abp/utils@^3.1.0-rc.4":
version "3.1.0-rc.4"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.4.tgz#e0d25d60b1806d4bee23e1c9c0ffa7855cdffc2a"
integrity sha512-qzUqqkLJcrQV3OngDyQ0S8hEh3D1MxvvlFLOo77ajnaTO2X8hgnFm9mgQ2QnvH2QbKttaWpaaTX7TCYu/d7nBg==
dependencies:
just-compare "^1.3.0"
"@angular-builders/jest@^10.0.0": "@angular-builders/jest@^10.0.0":
version "10.0.0" version "10.0.0"
resolved "https://registry.yarnpkg.com/@angular-builders/jest/-/jest-10.0.0.tgz#1d4f80c15544a2a13de9e335b0d2d8f076026388" resolved "https://registry.yarnpkg.com/@angular-builders/jest/-/jest-10.0.0.tgz#1d4f80c15544a2a13de9e335b0d2d8f076026388"
@ -232,6 +243,17 @@
rxjs "6.5.5" rxjs "6.5.5"
source-map "0.7.3" source-map "0.7.3"
"@angular-devkit/core@10.0.8", "@angular-devkit/core@~10.0.3":
version "10.0.8"
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.8.tgz#ca4ea9f464cfa7ff17e2dab3bcd4c59da1ea450d"
integrity sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==
dependencies:
ajv "6.12.3"
fast-json-stable-stringify "2.1.0"
magic-string "0.25.7"
rxjs "6.5.5"
source-map "0.7.3"
"@angular-devkit/core@8.3.29", "@angular-devkit/core@^8.0.3": "@angular-devkit/core@8.3.29", "@angular-devkit/core@^8.0.3":
version "8.3.29" version "8.3.29"
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.29.tgz#3477edd6458653f83e6d78684b100c1bef81382f" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.29.tgz#3477edd6458653f83e6d78684b100c1bef81382f"
@ -260,6 +282,15 @@
"@angular-devkit/core" "8.3.29" "@angular-devkit/core" "8.3.29"
rxjs "6.4.0" rxjs "6.4.0"
"@angular-devkit/schematics@~10.0.3":
version "10.0.8"
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.8.tgz#6064d6323a1c9abc195e67ae4c88e373ce36b5e2"
integrity sha512-p2PjvrExuzOe/azyOEcBeIgwZIk4D6VeLkJf/KVjhXOVu13pjIXHX7/qWl+IYnbtj3NZGHqXM5Cr8nxsJNIMpw==
dependencies:
"@angular-devkit/core" "10.0.8"
ora "4.0.4"
rxjs "6.5.5"
"@angular/animations@~10.0.10": "@angular/animations@~10.0.10":
version "10.0.10" version "10.0.10"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.10.tgz#c4f872e2917e9e7d4ffd04a64539e2aae67eef0c" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.10.tgz#c4f872e2917e9e7d4ffd04a64539e2aae67eef0c"
@ -13350,7 +13381,7 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^3.5.2, typescript@~3.9.5: typescript@^3.5.2, typescript@~3.9.2, typescript@~3.9.5:
version "3.9.7" version "3.9.7"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==

Loading…
Cancel
Save