@mikro-orm/decorators 7.0.0-dev.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +390 -0
- package/es/Check.d.ts +2 -0
- package/es/Check.js +8 -0
- package/es/CreateRequestContext.d.ts +3 -0
- package/es/CreateRequestContext.js +29 -0
- package/es/Embeddable.d.ts +2 -0
- package/es/Embeddable.js +12 -0
- package/es/Embedded.d.ts +2 -0
- package/es/Embedded.js +16 -0
- package/es/Entity.d.ts +2 -0
- package/es/Entity.js +12 -0
- package/es/Enum.d.ts +2 -0
- package/es/Enum.js +14 -0
- package/es/Filter.d.ts +2 -0
- package/es/Filter.js +7 -0
- package/es/Formula.d.ts +2 -0
- package/es/Formula.js +13 -0
- package/es/Indexed.d.ts +3 -0
- package/es/Indexed.js +17 -0
- package/es/ManyToMany.d.ts +2 -0
- package/es/ManyToMany.js +13 -0
- package/es/ManyToOne.d.ts +2 -0
- package/es/ManyToOne.js +12 -0
- package/es/OneToMany.d.ts +3 -0
- package/es/OneToMany.js +13 -0
- package/es/OneToOne.d.ts +2 -0
- package/es/OneToOne.js +14 -0
- package/es/PrimaryKey.d.ts +3 -0
- package/es/PrimaryKey.js +18 -0
- package/es/Property.d.ts +2 -0
- package/es/Property.js +32 -0
- package/es/Transactional.d.ts +15 -0
- package/es/Transactional.js +27 -0
- package/es/hooks.d.ts +16 -0
- package/es/hooks.js +45 -0
- package/es/index.d.ts +17 -0
- package/es/index.js +17 -0
- package/legacy/Check.d.ts +2 -0
- package/legacy/Check.js +12 -0
- package/legacy/CreateRequestContext.d.ts +3 -0
- package/legacy/CreateRequestContext.js +31 -0
- package/legacy/Embeddable.d.ts +2 -0
- package/legacy/Embeddable.js +11 -0
- package/legacy/Embedded.d.ts +2 -0
- package/legacy/Embedded.js +15 -0
- package/legacy/Entity.d.ts +2 -0
- package/legacy/Entity.js +12 -0
- package/legacy/Enum.d.ts +2 -0
- package/legacy/Enum.js +14 -0
- package/legacy/Filter.d.ts +2 -0
- package/legacy/Filter.js +7 -0
- package/legacy/Formula.d.ts +2 -0
- package/legacy/Formula.js +13 -0
- package/legacy/Indexed.d.ts +3 -0
- package/legacy/Indexed.js +19 -0
- package/legacy/ManyToMany.d.ts +2 -0
- package/legacy/ManyToMany.js +11 -0
- package/legacy/ManyToOne.d.ts +2 -0
- package/legacy/ManyToOne.js +11 -0
- package/legacy/OneToMany.d.ts +3 -0
- package/legacy/OneToMany.js +11 -0
- package/legacy/OneToOne.d.ts +2 -0
- package/legacy/OneToOne.js +13 -0
- package/legacy/PrimaryKey.d.ts +3 -0
- package/legacy/PrimaryKey.js +17 -0
- package/legacy/Property.d.ts +2 -0
- package/legacy/Property.js +29 -0
- package/legacy/ReflectMetadataProvider.d.ts +6 -0
- package/legacy/ReflectMetadataProvider.js +39 -0
- package/legacy/Transactional.d.ts +15 -0
- package/legacy/Transactional.js +29 -0
- package/legacy/hooks.d.ts +16 -0
- package/legacy/hooks.js +45 -0
- package/legacy/index.d.ts +18 -0
- package/legacy/index.js +18 -0
- package/package.json +66 -0
- package/utils.d.ts +38 -0
- package/utils.js +105 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { TransactionPropagation, RequestContext, TransactionContext } from '@mikro-orm/core';
|
|
2
|
+
import { resolveContextProvider } from '../utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* This decorator wraps the method with `em.transactional()`, so you can provide `TransactionOptions` just like with `em.transactional()`.
|
|
5
|
+
* The difference is that you can specify the context in which the transaction begins by providing `context` option,
|
|
6
|
+
* and if omitted, the transaction will begin in the current context implicitly.
|
|
7
|
+
* It works on async functions and can be nested with `em.transactional()`.
|
|
8
|
+
* Unlike `em.transactional()`, this decorator uses `REQUIRED` propagation by default, which means it will join existing transactions.
|
|
9
|
+
*/
|
|
10
|
+
export function Transactional(options = {}) {
|
|
11
|
+
return function (target, propertyKey, descriptor) {
|
|
12
|
+
const originalMethod = descriptor.value;
|
|
13
|
+
if (originalMethod.constructor.name !== 'AsyncFunction') {
|
|
14
|
+
throw new Error('@Transactional() should be use with async functions');
|
|
15
|
+
}
|
|
16
|
+
descriptor.value = async function (...args) {
|
|
17
|
+
const { context, contextName, ...txOptions } = options;
|
|
18
|
+
txOptions.propagation ??= TransactionPropagation.REQUIRED;
|
|
19
|
+
const em = (await resolveContextProvider(this, context))
|
|
20
|
+
|| TransactionContext.getEntityManager(contextName)
|
|
21
|
+
|| RequestContext.getEntityManager(contextName);
|
|
22
|
+
if (!em) {
|
|
23
|
+
throw new Error(`@Transactional() decorator can only be applied to methods of classes with \`orm: MikroORM\` property, \`em: EntityManager\` property, or with a callback parameter like \`@Transactional(() => orm)\` that returns one of those types. The parameter will contain a reference to current \`this\`. Returning an EntityRepository from it is also supported.`);
|
|
24
|
+
}
|
|
25
|
+
return em.transactional(() => originalMethod.apply(this, args), txOptions);
|
|
26
|
+
};
|
|
27
|
+
return descriptor;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function BeforeCreate(): (target: any, method: string) => void;
|
|
2
|
+
export declare function AfterCreate(): (target: any, method: string) => void;
|
|
3
|
+
export declare function BeforeUpdate(): (target: any, method: string) => void;
|
|
4
|
+
export declare function AfterUpdate(): (target: any, method: string) => void;
|
|
5
|
+
export declare function BeforeUpsert(): (target: any, method: string) => void;
|
|
6
|
+
export declare function AfterUpsert(): (target: any, method: string) => void;
|
|
7
|
+
export declare function OnInit(): (target: any, method: string) => void;
|
|
8
|
+
export declare function OnLoad(): (target: any, method: string) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Called before deleting entity, but only when providing initialized entity to EM#remove()
|
|
11
|
+
*/
|
|
12
|
+
export declare function BeforeDelete(): (target: any, method: string) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Called after deleting entity, but only when providing initialized entity to EM#remove()
|
|
15
|
+
*/
|
|
16
|
+
export declare function AfterDelete(): (target: any, method: string) => void;
|
package/legacy/hooks.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { EventType } from '@mikro-orm/core';
|
|
2
|
+
import { getMetadataFromDecorator } from '../utils.js';
|
|
3
|
+
function hook(type) {
|
|
4
|
+
return function (target, method) {
|
|
5
|
+
const meta = getMetadataFromDecorator(target.constructor);
|
|
6
|
+
meta.hooks[type] ??= [];
|
|
7
|
+
meta.hooks[type].push(method);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function BeforeCreate() {
|
|
11
|
+
return hook(EventType.beforeCreate);
|
|
12
|
+
}
|
|
13
|
+
export function AfterCreate() {
|
|
14
|
+
return hook(EventType.afterCreate);
|
|
15
|
+
}
|
|
16
|
+
export function BeforeUpdate() {
|
|
17
|
+
return hook(EventType.beforeUpdate);
|
|
18
|
+
}
|
|
19
|
+
export function AfterUpdate() {
|
|
20
|
+
return hook(EventType.afterUpdate);
|
|
21
|
+
}
|
|
22
|
+
export function BeforeUpsert() {
|
|
23
|
+
return hook(EventType.beforeUpsert);
|
|
24
|
+
}
|
|
25
|
+
export function AfterUpsert() {
|
|
26
|
+
return hook(EventType.afterUpsert);
|
|
27
|
+
}
|
|
28
|
+
export function OnInit() {
|
|
29
|
+
return hook(EventType.onInit);
|
|
30
|
+
}
|
|
31
|
+
export function OnLoad() {
|
|
32
|
+
return hook(EventType.onLoad);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Called before deleting entity, but only when providing initialized entity to EM#remove()
|
|
36
|
+
*/
|
|
37
|
+
export function BeforeDelete() {
|
|
38
|
+
return hook(EventType.beforeDelete);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Called after deleting entity, but only when providing initialized entity to EM#remove()
|
|
42
|
+
*/
|
|
43
|
+
export function AfterDelete() {
|
|
44
|
+
return hook(EventType.afterDelete);
|
|
45
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './PrimaryKey.js';
|
|
2
|
+
export * from './Entity.js';
|
|
3
|
+
export * from './OneToOne.js';
|
|
4
|
+
export * from './ManyToOne.js';
|
|
5
|
+
export * from './ManyToMany.js';
|
|
6
|
+
export * from './OneToMany.js';
|
|
7
|
+
export * from './Property.js';
|
|
8
|
+
export * from './Check.js';
|
|
9
|
+
export * from './Enum.js';
|
|
10
|
+
export * from './Formula.js';
|
|
11
|
+
export * from './Indexed.js';
|
|
12
|
+
export * from './Embeddable.js';
|
|
13
|
+
export * from './Embedded.js';
|
|
14
|
+
export * from './Filter.js';
|
|
15
|
+
export * from './CreateRequestContext.js';
|
|
16
|
+
export * from './hooks.js';
|
|
17
|
+
export * from './Transactional.js';
|
|
18
|
+
export * from './ReflectMetadataProvider.js';
|
package/legacy/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './PrimaryKey.js';
|
|
2
|
+
export * from './Entity.js';
|
|
3
|
+
export * from './OneToOne.js';
|
|
4
|
+
export * from './ManyToOne.js';
|
|
5
|
+
export * from './ManyToMany.js';
|
|
6
|
+
export * from './OneToMany.js';
|
|
7
|
+
export * from './Property.js';
|
|
8
|
+
export * from './Check.js';
|
|
9
|
+
export * from './Enum.js';
|
|
10
|
+
export * from './Formula.js';
|
|
11
|
+
export * from './Indexed.js';
|
|
12
|
+
export * from './Embeddable.js';
|
|
13
|
+
export * from './Embedded.js';
|
|
14
|
+
export * from './Filter.js';
|
|
15
|
+
export * from './CreateRequestContext.js';
|
|
16
|
+
export * from './hooks.js';
|
|
17
|
+
export * from './Transactional.js';
|
|
18
|
+
export * from './ReflectMetadataProvider.js';
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mikro-orm/decorators",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "7.0.0-dev.100",
|
|
5
|
+
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
|
|
6
|
+
"exports": {
|
|
7
|
+
"./package.json": "./package.json",
|
|
8
|
+
"./es": "./es/index.js",
|
|
9
|
+
"./legacy": "./legacy/index.js"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+ssh://git@github.com/mikro-orm/mikro-orm.git"
|
|
14
|
+
},
|
|
15
|
+
"funding": "https://github.com/sponsors/b4nan",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"orm",
|
|
18
|
+
"mongo",
|
|
19
|
+
"mongodb",
|
|
20
|
+
"mysql",
|
|
21
|
+
"mariadb",
|
|
22
|
+
"postgresql",
|
|
23
|
+
"sqlite",
|
|
24
|
+
"sqlite3",
|
|
25
|
+
"ts",
|
|
26
|
+
"typescript",
|
|
27
|
+
"js",
|
|
28
|
+
"javascript",
|
|
29
|
+
"entity",
|
|
30
|
+
"ddd",
|
|
31
|
+
"mikro-orm",
|
|
32
|
+
"unit-of-work",
|
|
33
|
+
"data-mapper",
|
|
34
|
+
"identity-map"
|
|
35
|
+
],
|
|
36
|
+
"author": "Martin Adámek",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/mikro-orm/mikro-orm/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://mikro-orm.io",
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">= 22.17.0"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "yarn clean && yarn compile && yarn copy",
|
|
47
|
+
"clean": "yarn run -T rimraf ./dist",
|
|
48
|
+
"compile": "yarn run -T tsc -p tsconfig.build.json",
|
|
49
|
+
"copy": "node ../../scripts/copy.mjs"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@mikro-orm/core": "^6.6.1"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@mikro-orm/core": "7.0.0-dev.100",
|
|
59
|
+
"reflect-metadata": "^0.1.0 || ^0.2.0"
|
|
60
|
+
},
|
|
61
|
+
"peerDependenciesMeta": {
|
|
62
|
+
"reflect-metadata": {
|
|
63
|
+
"optional": true
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
package/utils.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ReferenceKind, type EntityMetadata, type Dictionary, type MaybePromise, EntityManager, EntityRepository, MikroORM, MetadataStorage } from '@mikro-orm/core';
|
|
2
|
+
/**
|
|
3
|
+
* The type of context that the user intends to inject.
|
|
4
|
+
*/
|
|
5
|
+
export type ContextProvider<T> = MaybePromise<MikroORM> | ((type: T) => MaybePromise<MikroORM | EntityManager | EntityRepository<any> | {
|
|
6
|
+
getEntityManager(): EntityManager;
|
|
7
|
+
}>);
|
|
8
|
+
/**
|
|
9
|
+
* Find `EntityManager` in provided context, or else in instance's `orm` or `em` properties.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveContextProvider<T>(caller: T & {
|
|
12
|
+
orm?: MaybePromise<MikroORM>;
|
|
13
|
+
em?: MaybePromise<EntityManager>;
|
|
14
|
+
}, provider?: ContextProvider<T>): Promise<EntityManager | undefined>;
|
|
15
|
+
/**
|
|
16
|
+
* Relation decorators allow using two signatures
|
|
17
|
+
* - using first parameter as options object
|
|
18
|
+
* - using all parameters
|
|
19
|
+
*
|
|
20
|
+
* This function validates those two ways are not mixed and returns the final options object.
|
|
21
|
+
* If the second way is used, we always consider the last parameter as options object.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export declare function processDecoratorParameters<T>(params: Dictionary): T;
|
|
25
|
+
/**
|
|
26
|
+
* Validate there is only one property decorator. This disallows using `@Property()` together with e.g. `@ManyToOne()`
|
|
27
|
+
* on the same property. One should use only `@ManyToOne()` in such case.
|
|
28
|
+
* We allow the existence of the property in metadata if the reference type is the same, this should allow things like HMR to work.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateSingleDecorator(meta: EntityMetadata, propertyName: string, reference: ReferenceKind): void;
|
|
31
|
+
/**
|
|
32
|
+
* Uses some dark magic to get source path to caller where decorator is used.
|
|
33
|
+
* Analyzes stack trace of error created inside the function call.
|
|
34
|
+
*/
|
|
35
|
+
export declare function lookupPathFromDecorator(name: string, stack?: string[]): string;
|
|
36
|
+
export declare function getMetadataFromDecorator<T = any>(target: T & Dictionary & {
|
|
37
|
+
[MetadataStorage.PATH_SYMBOL]?: string;
|
|
38
|
+
}): EntityMetadata<T>;
|
package/utils.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Utils, EntityManager, EntityRepository, MikroORM, MetadataError, MetadataStorage, } from '@mikro-orm/core';
|
|
2
|
+
function getEntityManager(caller, context) {
|
|
3
|
+
if (context instanceof EntityManager) {
|
|
4
|
+
return context;
|
|
5
|
+
}
|
|
6
|
+
if (context instanceof EntityRepository) {
|
|
7
|
+
return context.getEntityManager();
|
|
8
|
+
}
|
|
9
|
+
if (context instanceof MikroORM) {
|
|
10
|
+
return context.em;
|
|
11
|
+
}
|
|
12
|
+
if (caller.em instanceof EntityManager) {
|
|
13
|
+
return caller.em;
|
|
14
|
+
}
|
|
15
|
+
if (caller.orm instanceof MikroORM) {
|
|
16
|
+
return caller.orm.em;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find `EntityManager` in provided context, or else in instance's `orm` or `em` properties.
|
|
22
|
+
*/
|
|
23
|
+
export async function resolveContextProvider(caller, provider) {
|
|
24
|
+
const context = typeof provider === 'function' ? await provider(caller) : await provider;
|
|
25
|
+
return getEntityManager({ orm: await caller.orm, em: await caller.em }, context);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Relation decorators allow using two signatures
|
|
29
|
+
* - using first parameter as options object
|
|
30
|
+
* - using all parameters
|
|
31
|
+
*
|
|
32
|
+
* This function validates those two ways are not mixed and returns the final options object.
|
|
33
|
+
* If the second way is used, we always consider the last parameter as options object.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export function processDecoratorParameters(params) {
|
|
37
|
+
const keys = Object.keys(params);
|
|
38
|
+
const values = Object.values(params);
|
|
39
|
+
if (!Utils.isPlainObject(values[0])) {
|
|
40
|
+
const lastKey = keys[keys.length - 1];
|
|
41
|
+
const last = params[lastKey];
|
|
42
|
+
delete params[lastKey];
|
|
43
|
+
return { ...last, ...params };
|
|
44
|
+
}
|
|
45
|
+
// validate only first parameter is used if its an option object
|
|
46
|
+
const empty = (v) => v == null || (Utils.isPlainObject(v) && !Utils.hasObjectKeys(v));
|
|
47
|
+
if (values.slice(1).some(v => !empty(v))) {
|
|
48
|
+
throw new Error('Mixing first decorator parameter as options object with other parameters is forbidden. ' +
|
|
49
|
+
'If you want to use the options parameter at first position, provide all options inside it.');
|
|
50
|
+
}
|
|
51
|
+
return values[0];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validate there is only one property decorator. This disallows using `@Property()` together with e.g. `@ManyToOne()`
|
|
55
|
+
* on the same property. One should use only `@ManyToOne()` in such case.
|
|
56
|
+
* We allow the existence of the property in metadata if the reference type is the same, this should allow things like HMR to work.
|
|
57
|
+
*/
|
|
58
|
+
export function validateSingleDecorator(meta, propertyName, reference) {
|
|
59
|
+
if (meta.properties[propertyName] && meta.properties[propertyName].kind !== reference) {
|
|
60
|
+
throw MetadataError.multipleDecorators(meta.className, propertyName);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Uses some dark magic to get source path to caller where decorator is used.
|
|
65
|
+
* Analyzes stack trace of error created inside the function call.
|
|
66
|
+
*/
|
|
67
|
+
export function lookupPathFromDecorator(name, stack) {
|
|
68
|
+
// use some dark magic to get source path to caller
|
|
69
|
+
stack = stack || new Error().stack.split('\n');
|
|
70
|
+
// In some situations (e.g. swc 1.3.4+), the presence of a source map can obscure the call to
|
|
71
|
+
// __decorate(), replacing it with the constructor name. To support these cases we look for
|
|
72
|
+
// Reflect.decorate() as well. Also when babel is used, we need to check
|
|
73
|
+
// the `_applyDecoratedDescriptor` method instead.
|
|
74
|
+
let line = stack.findIndex(line => line.match(/__decorate|Reflect\.decorate|_applyDecoratedDescriptor/));
|
|
75
|
+
// bun does not have those lines at all, only the DecorateProperty/DecorateConstructor,
|
|
76
|
+
// but those are also present in node, so we need to check this only if they weren't found.
|
|
77
|
+
if (line === -1) {
|
|
78
|
+
// here we handle bun which stack is different from nodejs so we search for reflect-metadata
|
|
79
|
+
// Different bun versions might have different stack traces. The "last index" works for both 1.2.6 and 1.2.7.
|
|
80
|
+
const reflectLine = stack.findLastIndex(line => Utils.normalizePath(line).includes('node_modules/reflect-metadata/Reflect.js'));
|
|
81
|
+
if (reflectLine === -1 || reflectLine + 2 >= stack.length || !stack[reflectLine + 1].includes('bun:wrap')) {
|
|
82
|
+
return name;
|
|
83
|
+
}
|
|
84
|
+
line = reflectLine + 2;
|
|
85
|
+
}
|
|
86
|
+
if (stack[line].includes('Reflect.decorate')) {
|
|
87
|
+
line++;
|
|
88
|
+
}
|
|
89
|
+
if (Utils.normalizePath(stack[line]).includes('node_modules/tslib/tslib')) {
|
|
90
|
+
line++;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const re = stack[line].match(/\(.+\)/i) ? /\((.*):\d+:\d+\)/ : /at\s*(.*):\d+:\d+$/;
|
|
94
|
+
return Utils.normalizePath(stack[line].match(re)[1]);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return name;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function getMetadataFromDecorator(target) {
|
|
101
|
+
if (!Object.hasOwn(target, MetadataStorage.PATH_SYMBOL)) {
|
|
102
|
+
Object.defineProperty(target, MetadataStorage.PATH_SYMBOL, { value: lookupPathFromDecorator(target.name), writable: true });
|
|
103
|
+
}
|
|
104
|
+
return MetadataStorage.getMetadata(target.name, target[MetadataStorage.PATH_SYMBOL]);
|
|
105
|
+
}
|