@ibyar/decorators 1.0.0 → 1.1.0

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/README.md CHANGED
@@ -29,3 +29,12 @@ yarn add @ibyar/decorators
29
29
  ```
30
30
 
31
31
  Create you decorator that is aware of metadata context for [proposal-decorator-metadata](https://github.com/tc39/proposal-decorator-metadata)
32
+
33
+
34
+ ## Compatibility
35
+
36
+ | Version | TS Version |
37
+ |---------|--------------|
38
+ | 1.0.0 | 5.0.0, 5.1.0 |
39
+ | 1.1.0 | 5.2.0, ... |
40
+
@@ -11,34 +11,18 @@ declare global {
11
11
  */
12
12
  readonly metadata: unique symbol;
13
13
  }
14
- interface ClassDecoratorContext<Class extends abstract new (...args: any) => any = abstract new (...args: any) => any> {
15
- metadata: MetadataContext;
16
- }
17
- interface ClassMethodDecoratorContext {
18
- metadata: MetadataContext;
19
- }
20
- interface ClassGetterDecoratorContext {
21
- metadata: MetadataContext;
22
- }
23
- interface ClassFieldDecoratorContext {
24
- metadata: MetadataContext;
25
- }
26
- interface ClassSetterDecoratorContext {
27
- metadata: MetadataContext;
28
- }
29
- interface ClassAccessorDecoratorContext {
30
- metadata: MetadataContext;
31
- }
32
14
  }
33
- export declare class MetadataContext {
34
- static create(): MetadataContext;
35
- static inherits(context: MetadataContext): MetadataContext;
36
- static assign(previous: MetadataContext, next: MetadataContext): MetadataContext;
37
- static merge(previous: MetadataContext, next: MetadataContext): MetadataContext;
15
+ declare class ContextService {
16
+ private contextMap;
17
+ constructor(contextMap: WeakMap<Record<any, any>, Record<any, any>>);
18
+ has(key: Record<any, any>): boolean;
19
+ get(key: Record<any, any>): Record<any, any> | undefined;
20
+ getOrCreate(key: Record<any, any>): any;
21
+ private clone;
38
22
  }
39
- export declare function getCurrentMetadata(): MetadataContext;
40
- export declare function updateCurrentMetadata(context?: MetadataContext): void;
41
- export declare function makeClassDecorator<V, Type = any>(decorator?: (param: V, constructor: Type, context: ClassDecoratorContext<new (...args: any) => any>) => void): (param: V) => (constructor: any, context: ClassDecoratorContext<new (...args: any) => any>) => any;
23
+ export declare const metadataHoler: ContextService;
24
+ export declare function makeClassDecorator<V, Type = any>(decorator?: (param: V, constructor: Type, context: ClassDecoratorContext<new (...args: any) => any>, metadata: MetadataContext) => void): (param: V) => (constructor: any, context: ClassDecoratorContext<new (...args: any) => any>) => any;
42
25
  export declare const Metadata: (param: void) => (constructor: any, context: ClassDecoratorContext<new (...args: any) => any>) => any;
43
- export declare function makeClassMemberDecorator<Value, Context extends ClassMemberDecoratorContext = ClassMemberDecoratorContext>(decorator?: (value: Value | undefined, context: Context) => void): (value: Value, context: Context) => void;
26
+ export declare function makeClassMemberDecorator<Value, Context extends ClassMemberDecoratorContext = ClassMemberDecoratorContext>(decorator?: (value: Value | undefined, context: Context, metadata: MetadataContext) => void): (value: Value, context: Context) => void;
27
+ export {};
44
28
  //# sourceMappingURL=metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/decorators/decorator/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;IAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC;AAE1G,MAAM,WAAW,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC;CAEhE;AAED,OAAO,CAAC,MAAM,CAAC;IAEd,UAAU,iBAAiB;QAC1B;;WAEG;QACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,MAAM,CAAC;KACjC;IAED,UAAU,qBAAqB,CAAC,KAAK,SAAS,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG;QACpH,QAAQ,EAAE,eAAe,CAAC;KAC1B;IAED,UAAU,2BAA2B;QACpC,QAAQ,EAAE,eAAe,CAAC;KAC1B;IAED,UAAU,2BAA2B;QACpC,QAAQ,EAAE,eAAe,CAAC;KAC1B;IAED,UAAU,0BAA0B;QACnC,QAAQ,EAAE,eAAe,CAAC;KAC1B;IAED,UAAU,2BAA2B;QACpC,QAAQ,EAAE,eAAe,CAAC;KAC1B;IAED,UAAU,6BAA6B;QACtC,QAAQ,EAAE,eAAe,CAAC;KAC1B;CACD;AAWD,qBAAa,eAAe;IAE3B,MAAM,CAAC,MAAM,IAAI,eAAe;IAIhC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe;IAI1D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,GAAG,eAAe;IAIhF,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,GAAG,eAAe;CAkB/E;AAID,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAErE;AAmBD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,EAC/C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,WAC7F,CAAC,mBAEM,GAAG,+CAA+C,GAAG,KAAK,GAAG,UAWnF;AAED,eAAO,MAAM,QAAQ,iCAbE,GAAG,+CAA+C,GAAG,KAAK,GAAG,SAalC,CAAC;AAEnD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,WAC3K,KAAK,WAAW,OAAO,UAMtC"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/decorators/decorator/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;IAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC;AAE1G,MAAM,WAAW,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC;CAEhE;AAED,OAAO,CAAC,MAAM,CAAC;IAEd,UAAU,iBAAiB;QAC1B;;WAEG;QACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,MAAM,CAAC;KACjC;CACD;AAYD,cAAM,cAAc;IACP,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE3E,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;IAIzB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;IAcjC,OAAO,CAAC,KAAK;CAcb;AAGD,eAAO,MAAM,aAAa,gBAAiC,CAAC;AAG5D,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,EAC/C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAe,KAAK,IAAI,WAExH,CAAC,mBACM,GAAG,+CAA+C,GAAG,KAAK,GAAG,UAMnF;AAED,eAAO,MAAM,QAAQ,iCARE,GAAG,+CAA+C,GAAG,KAAK,GAAG,SAQlC,CAAC;AAEnD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,EACxH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,KAAK,IAAI,WAE5E,KAAK,WAAW,OAAO,UAItC"}
@@ -3,75 +3,58 @@ if (!Symbol.metadata) {
3
3
  configurable: false,
4
4
  enumerable: false,
5
5
  writable: false,
6
- value: Symbol('metadata'),
6
+ value: Symbol('Symbol.metadata'),
7
7
  });
8
8
  }
9
- export class MetadataContext {
10
- static create() {
11
- return new MetadataContext();
9
+ class ContextService {
10
+ contextMap;
11
+ constructor(contextMap) {
12
+ this.contextMap = contextMap;
12
13
  }
13
- static inherits(context) {
14
- return Object.assign(MetadataContext.create(), context);
14
+ has(key) {
15
+ return this.contextMap.has(key);
15
16
  }
16
- static assign(previous, next) {
17
- return Object.assign(previous, next);
17
+ get(key) {
18
+ return this.contextMap.get(key);
18
19
  }
19
- static merge(previous, next) {
20
- for (const key in next) {
21
- const previousValue = previous[key];
22
- const nextValue = next[key];
23
- if (typeof previousValue === 'object' && typeof nextValue === 'object') {
24
- if (Array.isArray(previousValue) && Array.isArray(nextValue)) {
25
- previous[key] = previousValue.concat(nextValue)
26
- .filter((value, index, array) => index === array.indexOf(value));
27
- }
28
- else {
29
- previous[key] = Object.assign(previousValue, nextValue);
30
- }
31
- }
32
- else {
33
- previous[key] = nextValue;
34
- }
20
+ getOrCreate(key) {
21
+ if (this.contextMap.has(key)) {
22
+ return this.contextMap.get(key);
35
23
  }
36
- return previous;
37
- }
38
- }
39
- let currentContext = MetadataContext.create();
40
- export function getCurrentMetadata() {
41
- return currentContext;
42
- }
43
- export function updateCurrentMetadata(context) {
44
- currentContext = context ?? MetadataContext.create();
45
- }
46
- function updateConstructorMetadata(constructor) {
47
- const pConstr = constructor.prototype?.constructor?.[Symbol.metadata];
48
- if (pConstr) {
49
- if (!constructor.hasOwnProperty(Symbol.metadata)) {
50
- constructor[Symbol.metadata] = MetadataContext.inherits(pConstr);
24
+ const value = Object.create(null);
25
+ const prototype = Object.getPrototypeOf(key);
26
+ if (this.contextMap.has(prototype)) {
27
+ const parent = this.contextMap.get(prototype);
28
+ parent && this.clone(value, parent);
51
29
  }
52
- MetadataContext.merge(constructor[Symbol.metadata], getCurrentMetadata());
30
+ this.contextMap.set(key, value);
31
+ return value;
53
32
  }
54
- else {
55
- if (constructor[Symbol.metadata]) {
56
- MetadataContext.merge(constructor[Symbol.metadata], getCurrentMetadata());
57
- }
58
- else {
59
- constructor[Symbol.metadata] = getCurrentMetadata();
33
+ clone(child, parent) {
34
+ for (const property in parent) {
35
+ const parentValue = parent[property];
36
+ if (Array.isArray(parentValue)) {
37
+ child[property] = [...parentValue];
38
+ }
39
+ else if (typeof parentValue === 'undefined' || parentValue === null) {
40
+ child[property] = parentValue;
41
+ }
42
+ else if (typeof parentValue === 'object') {
43
+ child[property] = Object.assign(Object.create(null), parentValue);
44
+ }
45
+ else {
46
+ child[property] = parentValue;
47
+ }
60
48
  }
61
49
  }
62
- return constructor[Symbol.metadata];
63
50
  }
51
+ const contextMap = new WeakMap();
52
+ export const metadataHoler = new ContextService(contextMap);
64
53
  export function makeClassDecorator(decorator) {
65
54
  return (param) => {
66
- updateCurrentMetadata();
67
55
  return (constructor, context) => {
68
- if (typeof context.metadata !== 'object') {
69
- context.metadata = updateConstructorMetadata(constructor);
70
- context.addInitializer(() => {
71
- updateCurrentMetadata();
72
- });
73
- }
74
- decorator?.(param, constructor, context);
56
+ const metadata = metadataHoler.getOrCreate(context.metadata);
57
+ decorator?.(param, constructor, context, metadata);
75
58
  return constructor;
76
59
  };
77
60
  };
@@ -79,10 +62,8 @@ export function makeClassDecorator(decorator) {
79
62
  export const Metadata = makeClassDecorator();
80
63
  export function makeClassMemberDecorator(decorator) {
81
64
  return (value, context) => {
82
- if (typeof context.metadata !== 'object') {
83
- context.metadata = getCurrentMetadata();
84
- }
85
- decorator?.(value, context);
65
+ const metadata = metadataHoler.getOrCreate(context.metadata);
66
+ decorator?.(value, context, metadata);
86
67
  };
87
68
  }
88
69
  //# sourceMappingURL=metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/decorators/decorator/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["export type MetadataClass<T = any> = { new(...args: any): T;[Symbol.metadata]: Record<PropertyKey, any> };\n\nexport interface MetadataContext extends Record<PropertyKey, any> {\n\n}\n\ndeclare global {\n\n\tinterface SymbolConstructor {\n\t\t/**\n\t\t * metadata symbol\n\t\t */\n\t\treadonly metadata: unique symbol;\n\t}\n\n\tinterface ClassDecoratorContext<Class extends abstract new (...args: any) => any = abstract new (...args: any) => any,> {\n\t\tmetadata: MetadataContext;\n\t}\n\n\tinterface ClassMethodDecoratorContext {\n\t\tmetadata: MetadataContext;\n\t}\n\n\tinterface ClassGetterDecoratorContext {\n\t\tmetadata: MetadataContext;\n\t}\n\n\tinterface ClassFieldDecoratorContext {\n\t\tmetadata: MetadataContext;\n\t}\n\n\tinterface ClassSetterDecoratorContext {\n\t\tmetadata: MetadataContext;\n\t}\n\n\tinterface ClassAccessorDecoratorContext {\n\t\tmetadata: MetadataContext;\n\t}\n}\n\nif (!Symbol.metadata) {\n\tObject.defineProperty(Symbol, 'metadata', {\n\t\tconfigurable: false,\n\t\tenumerable: false,\n\t\twritable: false,\n\t\tvalue: Symbol('metadata'),\n\t});\n}\n\nexport class MetadataContext {\n\n\tstatic create(): MetadataContext {\n\t\treturn new MetadataContext();\n\t}\n\n\tstatic inherits(context: MetadataContext): MetadataContext {\n\t\treturn Object.assign(MetadataContext.create(), context);\n\t}\n\n\tstatic assign(previous: MetadataContext, next: MetadataContext): MetadataContext {\n\t\treturn Object.assign(previous, next);\n\t}\n\n\tstatic merge(previous: MetadataContext, next: MetadataContext): MetadataContext {\n\t\tfor (const key in next) {\n\t\t\tconst previousValue = previous[key];\n\t\t\tconst nextValue = next[key];\n\t\t\tif (typeof previousValue === 'object' && typeof nextValue === 'object') {\n\t\t\t\tif (Array.isArray(previousValue) && Array.isArray(nextValue)) {\n\t\t\t\t\tprevious[key] = previousValue.concat(nextValue)\n\t\t\t\t\t\t.filter((value, index, array) => index === array.indexOf(value));\n\t\t\t\t} else {\n\t\t\t\t\tprevious[key] = Object.assign(previousValue, nextValue);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tprevious[key] = nextValue;\n\t\t\t}\n\t\t}\n\t\treturn previous;\n\t}\n\n}\n\nlet currentContext: MetadataContext = MetadataContext.create();\n\nexport function getCurrentMetadata(): MetadataContext {\n\treturn currentContext;\n}\n\nexport function updateCurrentMetadata(context?: MetadataContext): void {\n\tcurrentContext = context ?? MetadataContext.create();\n}\n\nfunction updateConstructorMetadata(constructor: MetadataClass): MetadataContext {\n\tconst pConstr = constructor.prototype?.constructor?.[Symbol.metadata];\n\tif (pConstr) {\n\t\tif (!constructor.hasOwnProperty(Symbol.metadata)) {\n\t\t\tconstructor[Symbol.metadata] = MetadataContext.inherits(pConstr);\n\t\t}\n\t\tMetadataContext.merge(constructor[Symbol.metadata], getCurrentMetadata());\n\t} else {\n\t\tif (constructor[Symbol.metadata]) {\n\t\t\tMetadataContext.merge(constructor[Symbol.metadata], getCurrentMetadata());\n\t\t} else {\n\t\t\tconstructor[Symbol.metadata] = getCurrentMetadata();\n\t\t}\n\t}\n\treturn constructor[Symbol.metadata];\n}\n\nexport function makeClassDecorator<V, Type = any>(\n\tdecorator?: (param: V, constructor: Type, context: ClassDecoratorContext<new (...args: any) => any>) => void) {\n\treturn (param: V) => {\n\t\tupdateCurrentMetadata();\n\t\treturn (constructor: any, context: ClassDecoratorContext<new (...args: any) => any>) => {\n\t\t\tif (typeof context.metadata !== 'object') {\n\t\t\t\tcontext.metadata = updateConstructorMetadata(constructor as any as MetadataClass);\n\t\t\t\tcontext.addInitializer(() => {\n\t\t\t\t\tupdateCurrentMetadata();\n\t\t\t\t});\n\t\t\t}\n\t\t\tdecorator?.(param, constructor, context);\n\t\t\treturn constructor;\n\t\t};\n\t};\n}\n\nexport const Metadata = makeClassDecorator<void>();\n\nexport function makeClassMemberDecorator<Value, Context extends ClassMemberDecoratorContext = ClassMemberDecoratorContext>(decorator?: (value: Value | undefined, context: Context) => void) {\n\treturn (value: Value, context: Context) => {\n\t\tif (typeof context.metadata !== 'object') {\n\t\t\tcontext.metadata = getCurrentMetadata();\n\t\t}\n\t\tdecorator?.(value, context);\n\t};\n}\n"]}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/decorators/decorator/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["export type MetadataClass<T = any> = { new(...args: any): T;[Symbol.metadata]: Record<PropertyKey, any> };\n\nexport interface MetadataContext extends Record<PropertyKey, any> {\n\n}\n\ndeclare global {\n\n\tinterface SymbolConstructor {\n\t\t/**\n\t\t * metadata symbol\n\t\t */\n\t\treadonly metadata: unique symbol;\n\t}\n}\n\nif (!Symbol.metadata) {\n\tObject.defineProperty(Symbol, 'metadata', {\n\t\tconfigurable: false,\n\t\tenumerable: false,\n\t\twritable: false,\n\t\tvalue: Symbol('Symbol.metadata'),\n\t});\n}\n\n\nclass ContextService {\n\tconstructor(private contextMap: WeakMap<Record<any, any>, Record<any, any>>) { }\n\n\thas(key: Record<any, any>) {\n\t\treturn this.contextMap.has(key);\n\t}\n\n\tget(key: Record<any, any>) {\n\t\treturn this.contextMap.get(key);\n\t}\n\n\tgetOrCreate(key: Record<any, any>) {\n\t\tif (this.contextMap.has(key)) {\n\t\t\treturn this.contextMap.get(key);\n\t\t}\n\t\tconst value = Object.create(null);\n\t\tconst prototype = Object.getPrototypeOf(key);\n\t\tif (this.contextMap.has(prototype)) {\n\t\t\tconst parent = this.contextMap.get(prototype);\n\t\t\tparent && this.clone(value, parent);\n\t\t}\n\t\tthis.contextMap.set(key, value);\n\t\treturn value;\n\t}\n\n\tprivate clone(child: MetadataContext, parent: MetadataContext): void {\n\t\tfor (const property in parent) {\n\t\t\tconst parentValue = parent[property];\n\t\t\tif (Array.isArray(parentValue)) {\n\t\t\t\tchild[property] = [...parentValue];\n\t\t\t} else if (typeof parentValue === 'undefined' || parentValue === null) {\n\t\t\t\tchild[property] = parentValue;\n\t\t\t} else if (typeof parentValue === 'object') {\n\t\t\t\tchild[property] = Object.assign(Object.create(null), parentValue);\n\t\t\t} else {\n\t\t\t\tchild[property] = parentValue;\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst contextMap = new WeakMap<Record<any, any>, Record<any, any>>();\nexport const metadataHoler = new ContextService(contextMap);\n\n\nexport function makeClassDecorator<V, Type = any>(\n\tdecorator?: (param: V, constructor: Type, context: ClassDecoratorContext<new (...args: any) => any>, metadata: MetadataContext) => void\n) {\n\treturn (param: V) => {\n\t\treturn (constructor: any, context: ClassDecoratorContext<new (...args: any) => any>) => {\n\t\t\tconst metadata = metadataHoler.getOrCreate(context.metadata);\n\t\t\tdecorator?.(param, constructor, context, metadata);\n\t\t\treturn constructor;\n\t\t};\n\t};\n}\n\nexport const Metadata = makeClassDecorator<void>();\n\nexport function makeClassMemberDecorator<Value, Context extends ClassMemberDecoratorContext = ClassMemberDecoratorContext>(\n\tdecorator?: (value: Value | undefined, context: Context, metadata: MetadataContext) => void\n) {\n\treturn (value: Value, context: Context) => {\n\t\tconst metadata = metadataHoler.getOrCreate(context.metadata);\n\t\tdecorator?.(value, context, metadata);\n\t};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibyar/decorators",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Ibyar Decorators is implementations for proposal-decorator-metadata",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ibyar/aurora/tree/dev/packages/decorators",
@@ -33,10 +33,10 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "tslib": "^2.5.0"
36
+ "tslib": "^2.6.2"
37
37
  },
38
38
  "devDependencies": {
39
- "typescript": "^5.0.4"
39
+ "typescript": "^5.2.2"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsc --build --verbose"
@@ -48,5 +48,5 @@
48
48
  "typescript",
49
49
  "front-end"
50
50
  ],
51
- "gitHead": "f7c358a00514b4fad30772373e34ea6b6a7a8972"
51
+ "gitHead": "9427f428b9783263536b896d363bd10a59b380de"
52
52
  }