@decaf-ts/decoration 0.0.2
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.md +21 -0
- package/README.md +385 -0
- package/dist/decoration.cjs +649 -0
- package/dist/decoration.esm.cjs +633 -0
- package/lib/constants.cjs +64 -0
- package/lib/constants.d.ts +58 -0
- package/lib/decoration/Decoration.cjs +270 -0
- package/lib/decoration/Decoration.d.ts +196 -0
- package/lib/decoration/index.cjs +19 -0
- package/lib/decoration/index.d.ts +2 -0
- package/lib/decoration/types.cjs +3 -0
- package/lib/decoration/types.d.ts +95 -0
- package/lib/decorators.cjs +97 -0
- package/lib/decorators.d.ts +57 -0
- package/lib/esm/constants.d.ts +58 -0
- package/lib/esm/constants.js +61 -0
- package/lib/esm/decoration/Decoration.d.ts +196 -0
- package/lib/esm/decoration/Decoration.js +266 -0
- package/lib/esm/decoration/index.d.ts +2 -0
- package/lib/esm/decoration/index.js +3 -0
- package/lib/esm/decoration/types.d.ts +95 -0
- package/lib/esm/decoration/types.js +2 -0
- package/lib/esm/decorators.d.ts +57 -0
- package/lib/esm/decorators.js +90 -0
- package/lib/esm/index.d.ts +21 -0
- package/lib/esm/index.js +22 -0
- package/lib/esm/metadata/Metadata.d.ts +99 -0
- package/lib/esm/metadata/Metadata.js +199 -0
- package/lib/esm/metadata/index.d.ts +2 -0
- package/lib/esm/metadata/index.js +3 -0
- package/lib/esm/metadata/types.d.ts +16 -0
- package/lib/esm/metadata/types.js +2 -0
- package/lib/index.cjs +39 -0
- package/lib/index.d.ts +21 -0
- package/lib/metadata/Metadata.cjs +203 -0
- package/lib/metadata/Metadata.d.ts +99 -0
- package/lib/metadata/index.cjs +19 -0
- package/lib/metadata/index.d.ts +2 -0
- package/lib/metadata/types.cjs +4 -0
- package/lib/metadata/types.d.ts +16 -0
- package/package.json +114 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { DefaultFlavour } from "./../constants.js";
|
|
2
|
+
/**
|
|
3
|
+
* @description Default resolver that returns the current default flavour
|
|
4
|
+
* @summary Resolves the flavour for a given target by always returning the library's DefaultFlavour value.
|
|
5
|
+
* @param {object} target The target object being decorated
|
|
6
|
+
* @return {string} The resolved flavour identifier
|
|
7
|
+
* @function defaultFlavourResolver
|
|
8
|
+
* @memberOf module:decoration
|
|
9
|
+
*/
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
|
+
function defaultFlavourResolver(target) {
|
|
12
|
+
return DefaultFlavour;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @description A decorator management class that handles flavoured decorators
|
|
16
|
+
* @summary The Decoration class provides a builder pattern for creating and managing decorators with different flavours.
|
|
17
|
+
* It supports registering, extending, and applying decorators with context-aware flavour resolution.
|
|
18
|
+
* The class implements a fluent interface for defining, extending, and applying decorators with different flavours,
|
|
19
|
+
* allowing for framework-specific decorator implementations while maintaining a consistent API.
|
|
20
|
+
* @template T Type of the decorator (ClassDecorator | PropertyDecorator | MethodDecorator)
|
|
21
|
+
* @param {string} [flavour] Optional flavour parameter for the decorator context
|
|
22
|
+
* @class
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Create a new decoration for 'component' with default flavour
|
|
26
|
+
* const componentDecorator = new Decoration()
|
|
27
|
+
* .for('component')
|
|
28
|
+
* .define(customComponentDecorator);
|
|
29
|
+
*
|
|
30
|
+
* // Create a flavoured decoration
|
|
31
|
+
* const vueComponent = new Decoration('vue')
|
|
32
|
+
* .for('component')
|
|
33
|
+
* .define(vueComponentDecorator);
|
|
34
|
+
*
|
|
35
|
+
* // Apply the decoration
|
|
36
|
+
* @componentDecorator
|
|
37
|
+
* class MyComponent {}
|
|
38
|
+
* ```
|
|
39
|
+
* @mermaid
|
|
40
|
+
* sequenceDiagram
|
|
41
|
+
* participant C as Client
|
|
42
|
+
* participant D as Decoration
|
|
43
|
+
* participant R as FlavourResolver
|
|
44
|
+
* participant F as DecoratorFactory
|
|
45
|
+
*
|
|
46
|
+
* C->>D: new Decoration(flavour)
|
|
47
|
+
* C->>D: for(key)
|
|
48
|
+
* C->>D: define(decorators)
|
|
49
|
+
* D->>D: register(key, flavour, decorators)
|
|
50
|
+
* D->>F: decoratorFactory(key, flavour)
|
|
51
|
+
* F->>R: resolve(target)
|
|
52
|
+
* R-->>F: resolved flavour
|
|
53
|
+
* F->>F: apply decorators
|
|
54
|
+
* F-->>C: decorated target
|
|
55
|
+
*/
|
|
56
|
+
export class Decoration {
|
|
57
|
+
/**
|
|
58
|
+
* @description Static map of registered decorators
|
|
59
|
+
* @summary Stores all registered decorators organized by key and flavour
|
|
60
|
+
*/
|
|
61
|
+
static { this.decorators = {}; }
|
|
62
|
+
/**
|
|
63
|
+
* @description Function to resolve flavour from a target
|
|
64
|
+
* @summary Resolver function that determines the appropriate flavour for a given target
|
|
65
|
+
*/
|
|
66
|
+
static { this.flavourResolver = defaultFlavourResolver; }
|
|
67
|
+
constructor(flavour = DefaultFlavour) {
|
|
68
|
+
this.flavour = flavour;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @description Sets the key for the decoration builder
|
|
72
|
+
* @summary Initializes a new decoration chain with the specified key
|
|
73
|
+
* @param {string} key The identifier for the decorator
|
|
74
|
+
* @return {DecorationBuilderMid} Builder instance for method chaining
|
|
75
|
+
*/
|
|
76
|
+
for(key) {
|
|
77
|
+
this.key = key;
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @description Adds decorators to the current context
|
|
82
|
+
* @summary Internal method to add decorators with addon support
|
|
83
|
+
* @param {boolean} [addon=false] Whether the decorators are addons
|
|
84
|
+
* @param decorators Array of decorators
|
|
85
|
+
* @return {this} Current instance for chaining
|
|
86
|
+
*/
|
|
87
|
+
decorate(addon = false, ...decorators) {
|
|
88
|
+
if (!this.key)
|
|
89
|
+
throw new Error("key must be provided before decorators can be added");
|
|
90
|
+
if ((!decorators || !decorators.length) &&
|
|
91
|
+
!addon &&
|
|
92
|
+
this.flavour !== DefaultFlavour)
|
|
93
|
+
throw new Error("Must provide overrides or addons to override or extend decaf's decorators");
|
|
94
|
+
if (this.flavour === DefaultFlavour && addon)
|
|
95
|
+
throw new Error("Default flavour cannot be extended");
|
|
96
|
+
this[addon ? "extras" : "decorators"] = new Set([
|
|
97
|
+
...(this[addon ? "extras" : "decorators"] || new Set()).values(),
|
|
98
|
+
...decorators,
|
|
99
|
+
]);
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @description Defines the base decorators
|
|
104
|
+
* @summary Sets the primary decorators for the current context
|
|
105
|
+
* @param decorators Decorators to define
|
|
106
|
+
* @return Builder instance for finishing the chain
|
|
107
|
+
*/
|
|
108
|
+
define(...decorators) {
|
|
109
|
+
return this.decorate(false, ...decorators);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* @description Extends existing decorators
|
|
113
|
+
* @summary Adds additional decorators to the current context
|
|
114
|
+
* @param decorators Additional decorators
|
|
115
|
+
* @return {DecorationBuilderBuild} Builder instance for building the decorator
|
|
116
|
+
*/
|
|
117
|
+
extend(...decorators) {
|
|
118
|
+
return this.decorate(true, ...decorators);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* @description Factory that creates a context-aware decorator for a key/flavour
|
|
122
|
+
* @summary Produces a decorator function bound to the provided key and flavour. The resulting decorator resolves the actual
|
|
123
|
+
* decorators to apply at invocation time based on the target's resolved flavour and the registered base and extra decorators.
|
|
124
|
+
* @param {string} key The decoration key used to look up registered decorators
|
|
125
|
+
* @param {string} [f=DefaultFlavour] Optional explicit flavour to bind the factory to
|
|
126
|
+
* @return {function(object, any, TypedPropertyDescriptor<any>): any} A decorator function that applies the resolved decorators
|
|
127
|
+
* @mermaid
|
|
128
|
+
* sequenceDiagram
|
|
129
|
+
* participant U as User Code
|
|
130
|
+
* participant B as Decoration (builder)
|
|
131
|
+
* participant F as decoratorFactory(key, f)
|
|
132
|
+
* participant R as flavourResolver
|
|
133
|
+
* participant A as Applied Decorators
|
|
134
|
+
* U->>B: define()/extend() and apply()
|
|
135
|
+
* B->>F: create context decorator
|
|
136
|
+
* F->>R: resolve(target)
|
|
137
|
+
* R-->>F: flavour
|
|
138
|
+
* F->>A: collect base + extras
|
|
139
|
+
* loop each decorator
|
|
140
|
+
* A->>U: invoke decorator(target, key?, desc?)
|
|
141
|
+
* end
|
|
142
|
+
*/
|
|
143
|
+
decoratorFactory(key, f = DefaultFlavour) {
|
|
144
|
+
function contextDecorator(target, propertyKey, descriptor) {
|
|
145
|
+
const flavour = Decoration.flavourResolver(target);
|
|
146
|
+
const cache = Decoration.decorators[key];
|
|
147
|
+
let decorators;
|
|
148
|
+
const extras = cache[flavour]
|
|
149
|
+
? cache[flavour].extras
|
|
150
|
+
: cache[DefaultFlavour].extras;
|
|
151
|
+
const extraArgs = [
|
|
152
|
+
...(cache[DefaultFlavour].extras
|
|
153
|
+
? cache[DefaultFlavour].extras.values()
|
|
154
|
+
: []),
|
|
155
|
+
].reduce((accum, e, i) => {
|
|
156
|
+
if (e.args)
|
|
157
|
+
accum[i] = e.args;
|
|
158
|
+
return accum;
|
|
159
|
+
}, {});
|
|
160
|
+
if (cache &&
|
|
161
|
+
cache[flavour] &&
|
|
162
|
+
cache[flavour].decorators &&
|
|
163
|
+
cache[flavour].decorators.size) {
|
|
164
|
+
decorators = cache[flavour].decorators;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
decorators = cache[DefaultFlavour].decorators;
|
|
168
|
+
}
|
|
169
|
+
const decoratorArgs = [
|
|
170
|
+
...cache[DefaultFlavour].decorators.values(),
|
|
171
|
+
].reduce((accum, e, i) => {
|
|
172
|
+
if (e.args)
|
|
173
|
+
accum[i] = e.args;
|
|
174
|
+
return accum;
|
|
175
|
+
}, {});
|
|
176
|
+
const toApply = [
|
|
177
|
+
...(decorators ? decorators.values() : []),
|
|
178
|
+
...(extras ? extras.values() : []),
|
|
179
|
+
];
|
|
180
|
+
return toApply.reduce((_, d, i) => {
|
|
181
|
+
switch (typeof d) {
|
|
182
|
+
case "object": {
|
|
183
|
+
const { decorator, args } = d;
|
|
184
|
+
const argz = args || i < (decorators ? decorators.size : 0)
|
|
185
|
+
? decoratorArgs[i]
|
|
186
|
+
: extraArgs[i - (decorators ? decorators.size : 0)] ||
|
|
187
|
+
(decorators ? decoratorArgs[i - decorators.size] : []);
|
|
188
|
+
return decorator(...(argz || []))(target, propertyKey, descriptor);
|
|
189
|
+
}
|
|
190
|
+
case "function":
|
|
191
|
+
return d(target, propertyKey, descriptor);
|
|
192
|
+
default:
|
|
193
|
+
throw new Error(`Unexpected decorator type: ${typeof d}`);
|
|
194
|
+
}
|
|
195
|
+
}, { target, propertyKey, descriptor });
|
|
196
|
+
}
|
|
197
|
+
Object.defineProperty(contextDecorator, "name", {
|
|
198
|
+
value: [f, key].join("_decorator_for_"),
|
|
199
|
+
writable: false,
|
|
200
|
+
});
|
|
201
|
+
return contextDecorator;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* @description Creates the final decorator function
|
|
205
|
+
* @summary Builds and returns the decorator factory function
|
|
206
|
+
* @return {function(any, any?, TypedPropertyDescriptor?): any} The generated decorator function
|
|
207
|
+
*/
|
|
208
|
+
apply() {
|
|
209
|
+
if (!this.key)
|
|
210
|
+
throw new Error("No key provided for the decoration builder");
|
|
211
|
+
Decoration.register(this.key, this.flavour, this.decorators || new Set(), this.extras);
|
|
212
|
+
return this.decoratorFactory(this.key, this.flavour);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* @description Registers decorators for a specific key and flavour
|
|
216
|
+
* @summary Internal method to store decorators in the static registry
|
|
217
|
+
* @param {string} key Decorator key
|
|
218
|
+
* @param {string} flavour Decorator flavour
|
|
219
|
+
* @param [decorators] Primary decorators
|
|
220
|
+
* @param [extras] Additional decorators
|
|
221
|
+
*/
|
|
222
|
+
static register(key, flavour, decorators, extras) {
|
|
223
|
+
if (!key) {
|
|
224
|
+
throw new Error("No key provided for the decoration builder");
|
|
225
|
+
}
|
|
226
|
+
if (!decorators)
|
|
227
|
+
throw new Error("No decorators provided for the decoration builder");
|
|
228
|
+
if (!flavour)
|
|
229
|
+
throw new Error("No flavour provided for the decoration builder");
|
|
230
|
+
if (!Decoration.decorators[key])
|
|
231
|
+
Decoration.decorators[key] = {};
|
|
232
|
+
if (!Decoration.decorators[key][flavour])
|
|
233
|
+
Decoration.decorators[key][flavour] = {};
|
|
234
|
+
if (decorators)
|
|
235
|
+
Decoration.decorators[key][flavour].decorators = decorators;
|
|
236
|
+
if (extras)
|
|
237
|
+
Decoration.decorators[key][flavour].extras = extras;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* @description Sets the global flavour resolver
|
|
241
|
+
* @summary Configures the function used to determine decorator flavours
|
|
242
|
+
* @param {FlavourResolver} resolver Function to resolve flavours
|
|
243
|
+
*/
|
|
244
|
+
static setFlavourResolver(resolver) {
|
|
245
|
+
Decoration.flavourResolver = resolver;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* @description Convenience static entry to start a decoration builder
|
|
249
|
+
* @summary Creates a new Decoration instance and initiates the builder chain with the provided key.
|
|
250
|
+
* @param {string} key The decoration key to configure
|
|
251
|
+
* @return {DecorationBuilderMid} A builder instance for chaining definitions
|
|
252
|
+
*/
|
|
253
|
+
static for(key) {
|
|
254
|
+
return new Decoration().for(key);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* @description Starts a builder for a specific flavour
|
|
258
|
+
* @summary Convenience method to begin a Decoration builder chain bound to the given flavour identifier, allowing registration of flavour-specific decorators.
|
|
259
|
+
* @param {string} flavour The flavour name to bind to the builder
|
|
260
|
+
* @return {DecorationBuilderStart} A builder start interface to continue configuration
|
|
261
|
+
*/
|
|
262
|
+
static flavouredAs(flavour) {
|
|
263
|
+
return new Decoration(flavour);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjb3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0aW9uL0RlY29yYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLGNBQWMsRUFBRSwwQkFBcUI7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILDZEQUE2RDtBQUM3RCxTQUFTLHNCQUFzQixDQUFDLE1BQWM7SUFDNUMsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQTJDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNyQjs7O09BR0c7YUFDWSxlQUFVLEdBU3JCLEVBQUUsQ0FBQztJQUVQOzs7T0FHRzthQUNZLG9CQUFlLEdBQW9CLHNCQUFzQixDQUFDO0lBaUJ6RSxZQUFvQixVQUFrQixjQUFjO1FBQWhDLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQUcsQ0FBQztJQUV4RDs7Ozs7T0FLRztJQUNILEdBQUcsQ0FBQyxHQUFXO1FBQ2IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxRQUFRLENBQ2QsUUFBaUIsS0FBSyxFQUN0QixHQUFHLFVBQTJCO1FBRTlCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUN6RSxJQUNFLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ25DLENBQUMsS0FBSztZQUNOLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYztZQUUvQixNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxDQUM1RSxDQUFDO1FBQ0osSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGNBQWMsSUFBSSxLQUFLO1lBQzFDLE1BQU0sSUFBSSxL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QU87WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3RDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksVUFBVTtZQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM1RSxJQUFJLE1BQU07WUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBeUI7UUFDakQsVUFBVSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFlO1FBQ2hDLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCByZXNvbHZlciB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBmbGF2b3VyXG4gKiBAc3VtbWFyeSBSZXNvbHZlcyB0aGUgZmxhdm91ciBmb3IgYSBnaXZlbiB0YXJnZXQgYnkgYWx3YXlzIHJldHVybmluZyB0aGUgbGlicmFyeSdzIERlZmF1bHRGbGF2b3VyIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBiZWluZyBkZWNvcmF0ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIGZsYXZvdXIgaWRlbnRpZmllclxuICogQGZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdHlwZSBjb3ZlcmluZyBzdXBwb3J0ZWQgZGVjb3JhdG9yIGtpbmRzXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBvZiB0aGUgc3RhbmRhcmQgVHlwZVNjcmlwdCBkZWNvcmF0b3Igc2lnbmF0dXJlcyAoY2xhc3MsIHByb3BlcnR5LCBvciBtZXRob2QpLCBlbmFibGluZyBmbGV4aWJsZSByZWdpc3RyYXRpb24gYW5kIGFwcGxpY2F0aW9uIHdpdGhpbiB0aGUgRGVjb3JhdGlvbiBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVEZWYgRGVjb3JhdG9yVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JUeXBlcyA9XG4gIHwgQ2xhc3NEZWNvcmF0b3JcbiAgfCBQcm9wZXJ0eURlY29yYXRvclxuICB8IE1ldGhvZERlY29yYXRvcjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBhIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyYml0cmFyeSBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBjb25jcmV0ZSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYmUgYXBwbGllZCB0byBhIHRhcmdldC5cbiAqIEB0ZW1wbGF0ZSBBXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRmFjdG9yeSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gRGVjb3JhdG9yVHlwZXM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFyZ3VtZW50IGJ1bmRsZSBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeVxuICogQHN1bW1hcnkgT2JqZWN0IGZvcm0gdXNlZCB0byBkZWZlciBkZWNvcmF0b3IgY3JlYXRpb24sIGNhcnJ5aW5nIGJvdGggdGhlIGZhY3RvcnkgZnVuY3Rpb24gYW5kIGl0cyBhcmd1bWVudCBsaXN0IHRvIGJlIGludm9rZWQgbGF0ZXIgZHVyaW5nIGFwcGxpY2F0aW9uLlxuICogQHR5cGVEZWYgRGVjb3JhdG9yRmFjdG9yeUFyZ3NcbiAqIEBwcm9wZXJ0eSB7RGVjb3JhdG9yRmFjdG9yeX0gZGVjb3JhdG9yIFRoZSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBkZWNvcmF0b3Igd2hlbiBpbnZva2VkXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgbGlzdCBvZiBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZGVjb3JhdG9yIGZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5QXJncyA9IHtcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JGYWN0b3J5O1xuICBhcmdzPzogYW55W107XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVbmlvbiB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGEgcmVhZHktdG8tYXBwbHkgZGVjb3JhdG9yIG9yIGEgZmFjdG9yeSB3aXRoIGFyZ3VtZW50c1xuICogQHN1bW1hcnkgQWxsb3dzIHJlZ2lzdGVyaW5nIGRlY29yYXRvcnMgaW4gdHdvIGZvcm1zOiBhcyBkaXJlY3QgZGVjb3JhdG9yIGZ1bmN0aW9ucyBvciBhcyBkZWZlcnJlZCBmYWN0b3JpZXMgcGFpcmVkIHdpdGggdGhlaXIgYXJndW1lbnQgbGlzdHMgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24uXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JEYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvclR5cGVzIHwgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgVGhlIERlY29yYXRpb24gY2xhc3MgcHJvdmlkZXMgYSBidWlsZGVyIHBhdHRlcm4gZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLlxuICogSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbi5cbiAqIFRoZSBjbGFzcyBpbXBsZW1lbnRzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgZGVmaW5pbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMsXG4gKiBhbGxvd2luZyBmb3IgZnJhbWV3b3JrLXNwZWNpZmljIGRlY29yYXRvciBpbXBsZW1lbnRhdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgYSBjb25zaXN0ZW50IEFQSS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGRlY29yYXRvciAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dFxuICogQGNsYXNzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IGRlY29yYXRpb24gZm9yICdjb21wb25lbnQnIHdpdGggZGVmYXVsdCBmbGF2b3VyXG4gKiBjb25zdCBjb21wb25lbnREZWNvcmF0b3IgPSBuZXcgRGVjb3JhdGlvbigpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUoY3VzdG9tQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBmbGF2b3VyZWQgZGVjb3JhdGlvblxuICogY29uc3QgdnVlQ29tcG9uZW50ID0gbmV3IERlY29yYXRpb24oJ3Z1ZScpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUodnVlQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBBcHBseSB0aGUgZGVjb3JhdGlvblxuICogQGNvbXBvbmVudERlY29yYXRvclxuICogY2xhc3MgTXlDb21wb25lbnQge31cbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRpb25cbiAqICAgcGFydGljaXBhbnQgUiBhcyBGbGF2b3VyUmVzb2x2ZXJcbiAqICAgcGFydGljaXBhbnQgRiBhcyBEZWNvcmF0b3JGYWN0b3J5XG4gKlxuICogICBDLT4+RDogbmV3IERlY29yYXRpb24oZmxhdm91cilcbiAqICAgQy0+PkQ6IGZvcihrZXkpXG4gKiAgIEMtPj5EOiBkZWZpbmUoZGVjb3JhdG9ycylcbiAqICAgRC0+PkQ6IHJlZ2lzdGVyKGtleSwgZmxhdm91ciwgZGVjb3JhdG9ycylcbiAqICAgRC0+PkY6IGRlY29yYXRvckZhY3Rvcnkoa2V5LCBmbGF2b3VyKVxuICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gKiAgIFItLT4+RjogcmVzb2x2ZWQgZmxhdm91clxuICogICBGLT4+RjogYXBwbHkgZGVjb3JhdG9yc1xuICogICBGLS0+PkM6IGRlY29yYXRlZCB0YXJnZXRcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29yYXRpb24gaW1wbGVtZW50cyBJRGVjb3JhdGlvbkJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtYXAgb2YgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyBhbGwgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzIG9yZ2FuaXplZCBieSBrZXkgYW5kIGZsYXZvdXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29yYXRvcnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAge1xuICAgICAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgICBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXIgZnJvbSBhIHRhcmdldFxuICAgKiBAc3VtbWFyeSBSZXNvbHZlciBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmbGF2b3VyUmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlciA9IGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGRlY29yYXRvciBrZXlcbiAgICovXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmxhdm91cjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBrZXkgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3JcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZG9uPWZhbHNlXSBXaGV0aGVyIHRoZSBkZWNvcmF0b3JzIGFyZSBhZGRvbnNcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQXJyYXkgb2YgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHt0aGlzfSBDdXJyZW50IGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0ZShcbiAgICBhZGRvbjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5IG11c3QgYmUgcHJvdmlkZWQgYmVmb3JlIGRlY29yYXRvcnMgY2FuIGJlIGFkZGVkXCIpO1xuICAgIGlmIChcbiAgICAgICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpICYmXG4gICAgICAhYWRkb24gJiZcbiAgICAgIHRoaXMuZmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXJcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTXVzdCBwcm92aWRlIG92ZXJyaWRlcyBvciBhZGRvbnMgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGRlY2FmJ3MgZGVjb3JhdG9yc1wiXG4gICAgICApO1xuICAgIGlmICh0aGlzLmZsYXZvdXIgPT09IERlZmF1bHRGbGF2b3VyICYmIGFkZG9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmYXVsdCBmbGF2b3VyIGNhbm5vdCBiZSBleHRlbmRlZFwiKTtcblxuICAgIHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdID0gbmV3IFNldChbXG4gICAgICAuLi4odGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgYmFzZSBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIGRlZmluZVxuICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGZpbmlzaGluZyB0aGUgY2hhaW5cbiAgICovXG4gIGRlZmluZShcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBBZGRzIGFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yXG4gICAqL1xuICBleHRlbmQoLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgY29udGV4dC1hd2FyZSBkZWNvcmF0b3IgZm9yIGEga2V5L2ZsYXZvdXJcbiAgICogQHN1bW1hcnkgUHJvZHVjZXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gYm91bmQgdG8gdGhlIHByb3ZpZGVkIGtleSBhbmQgZmxhdm91ci4gVGhlIHJlc3VsdGluZyBkZWNvcmF0b3IgcmVzb2x2ZXMgdGhlIGFjdHVhbFxuICAgKiBkZWNvcmF0b3JzIHRvIGFwcGx5IGF0IGludm9jYXRpb24gdGltZSBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgcmVzb2x2ZWQgZmxhdm91ciBhbmQgdGhlIHJlZ2lzdGVyZWQgYmFzZSBhbmQgZXh0cmEgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgZGVjb3JhdGlvbiBrZXkgdXNlZCB0byBsb29rIHVwIHJlZ2lzdGVyZWQgZGVjb3JhdG9yc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Y9RGVmYXVsdEZsYXZvdXJdIE9wdGlvbmFsIGV4cGxpY2l0IGZsYXZvdXIgdG8gYmluZCB0aGUgZmFjdG9yeSB0b1xuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihvYmplY3QsIGFueSwgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55Pik6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIHRoZSByZXNvbHZlZCBkZWNvcmF0b3JzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBEZWNvcmF0aW9uIChidWlsZGVyKVxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgZGVjb3JhdG9yRmFjdG9yeShrZXksIGYpXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBmbGF2b3VyUmVzb2x2ZXJcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFwcGxpZWQgRGVjb3JhdG9yc1xuICAgKiAgIFUtPj5COiBkZWZpbmUoKS9leHRlbmQoKSBhbmQgYXBwbHkoKVxuICAgKiAgIEItPj5GOiBjcmVhdGUgY29udGV4dCBkZWNvcmF0b3JcbiAgICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gICAqICAgUi0tPj5GOiBmbGF2b3VyXG4gICAqICAgRi0+PkE6IGNvbGxlY3QgYmFzZSArIGV4dHJhc1xuICAgKiAgIGxvb3AgZWFjaCBkZWNvcmF0b3JcbiAgICogICAgIEEtPj5VOiBpbnZva2UgZGVjb3JhdG9yKHRhcmdldCwga2V5PywgZGVzYz8pXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBmdW5jdGlvbiBjb250ZXh0RGVjb3JhdG9yKFxuICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICAgKSB7XG4gICAgICBjb25zdCBmbGF2b3VyID0gRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIodGFyZ2V0KTtcbiAgICAgIGNvbnN0IGNhY2hlID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV07XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IGNhY2hlW2ZsYXZvdXJdXG4gICAgICAgID8gY2FjaGVbZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcbiAgICAgIGNvbnN0IGV4dHJhQXJncyA9IFtcbiAgICAgICAgLi4uKChjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5leHRyYXNcbiAgICAgICAgICA/IChjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5leHRyYXMudmFsdWVzKClcbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0ucmVkdWNlKChhY2N1bTogUmVjb3JkPG51bWJlciwgYW55PiwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZS5hcmdzKSBhY2N1bVtpXSA9IGUuYXJncztcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwge30pO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycy5zaXplXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvckFyZ3MgPSBbXG4gICAgICAgIC4uLihjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5kZWNvcmF0b3JzLnZhbHVlcygpLFxuICAgICAgXS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8bnVtYmVyLCBhbnk+LCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlLmFyZ3MpIGFjY3VtW2ldID0gZS5hcmdzO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGNvbnN0IHRvQXBwbHkgPSBbXG4gICAgICAgIC4uLihkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiB0b0FwcGx5LnJlZHVjZShcbiAgICAgICAgKF8sIGQsIGkpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkKSB7XG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBkZWNvcmF0b3IsIGFyZ3MgfSA9IGQgYXMgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3ogPVxuICAgICAgICAgICAgICAgIGFyZ3MgfHwgaSA8IChkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy5zaXplIDogMClcbiAgICAgICAgICAgICAgICAgID8gZGVjb3JhdG9yQXJnc1tpXVxuICAgICAgICAgICAgICAgICAgOiBleHRyYUFyZ3NbaSAtIChkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy5zaXplIDogMCldIHx8XG4gICAgICAgICAgICAgICAgICAgIChkZWNvcmF0b3JzID8gZGVjb3JhdG9yQXJnc1tpIC0gZGVjb3JhdG9ycy5zaXplXSA6IFtdKTtcblxuICAgICAgICAgICAgICByZXR1cm4gKGRlY29yYXRvciguLi4oYXJneiB8fCBbXSkpIGFzIGFueSkoXG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICByZXR1cm4gKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkZWNvcmF0b3IgdHlwZTogJHt0eXBlb2YgZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciB9XG4gICAgICApO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dERlY29yYXRvciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBbZiwga2V5XS5qb2luKFwiX2RlY29yYXRvcl9mb3JfXCIpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZXh0RGVjb3JhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBmaW5hbCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvblxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueT8sIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPyk6IGFueX0gVGhlIGdlbmVyYXRlZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKFxuICAgICAgdGhpcy5rZXksXG4gICAgICB0aGlzLmZsYXZvdXIsXG4gICAgICB0aGlzLmRlY29yYXRvcnMgfHwgbmV3IFNldCgpLFxuICAgICAgdGhpcy5leHRyYXNcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRvckZhY3RvcnkodGhpcy5rZXksIHRoaXMuZmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBkZWNvcmF0b3JzIGZvciBhIHNwZWNpZmljIGtleSBhbmQgZmxhdm91clxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBEZWNvcmF0b3IgZmxhdm91clxuICAgKiBAcGFyYW0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9yc1xuICAgKiBAcGFyYW0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPixcbiAgICBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvcmF0b3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGVjb3JhdG9ycyBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBmbGF2b3VyIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuXG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSkgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gPSB7fTtcbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdKVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gPSB7fTtcbiAgICBpZiAoZGVjb3JhdG9ycykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgaWYgKGV4dHJhcykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzID0gZXh0cmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBnbG9iYWwgZmxhdm91ciByZXNvbHZlclxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBkZWNvcmF0b3IgZmxhdm91cnNcbiAgICogQHBhcmFtIHtGbGF2b3VyUmVzb2x2ZXJ9IHJlc29sdmVyIEZ1bmN0aW9uIHRvIHJlc29sdmUgZmxhdm91cnNcbiAgICovXG4gIHN0YXRpYyBzZXRGbGF2b3VyUmVzb2x2ZXIocmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlcikge1xuICAgIERlY29yYXRpb24uZmxhdm91clJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIHN0YXRpYyBlbnRyeSB0byBzdGFydCBhIGRlY29yYXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IERlY29yYXRpb24gaW5zdGFuY2UgYW5kIGluaXRpYXRlcyB0aGUgYnVpbGRlciBjaGFpbiB3aXRoIHRoZSBwcm92aWRlZCBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGRlY29yYXRpb24ga2V5IHRvIGNvbmZpZ3VyZVxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZyBkZWZpbml0aW9uc1xuICAgKi9cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIGEgYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBmbGF2b3VyXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0byBiZWdpbiBhIERlY29yYXRpb24gYnVpbGRlciBjaGFpbiBib3VuZCB0byB0aGUgZ2l2ZW4gZmxhdm91ciBpZGVudGlmaWVyLCBhbGxvd2luZyByZWdpc3RyYXRpb24gb2YgZmxhdm91ci1zcGVjaWZpYyBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBUaGUgZmxhdm91ciBuYW1lIHRvIGJpbmQgdG8gdGhlIGJ1aWxkZXJcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJTdGFydH0gQSBidWlsZGVyIHN0YXJ0IGludGVyZmFjZSB0byBjb250aW51ZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from "./Decoration.js";
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FBNkI7QUFDN0IsMkJBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vRGVjb3JhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbiJdfQ==
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { DecoratorData } from "./Decoration";
|
|
2
|
+
/**
|
|
3
|
+
* @description Interface for the final stage of the decoration builder pattern
|
|
4
|
+
* @summary Represents the build stage of the decoration builder, providing the ability to apply
|
|
5
|
+
* the configured decorator to a target. This is the final stage in the builder chain.
|
|
6
|
+
*
|
|
7
|
+
* @interface DecorationBuilderBuild
|
|
8
|
+
*/
|
|
9
|
+
export interface DecorationBuilderBuild {
|
|
10
|
+
/**
|
|
11
|
+
* @description Creates and returns the decorator function
|
|
12
|
+
* @summary Finalizes the builder process and returns a decorator function that can be applied to a class,
|
|
13
|
+
* property, or method.
|
|
14
|
+
*
|
|
15
|
+
* @returns {function} A decorator function that can be applied to a target
|
|
16
|
+
*/
|
|
17
|
+
apply(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @description Interface for the extension stage of the decoration builder pattern
|
|
21
|
+
* @summary Represents the extension stage of the decoration builder, providing the ability to add
|
|
22
|
+
* additional decorators to the existing configuration.
|
|
23
|
+
*
|
|
24
|
+
* @interface DecorationBuilderEnd
|
|
25
|
+
* @memberOf module:decoration
|
|
26
|
+
*/
|
|
27
|
+
export interface DecorationBuilderEnd {
|
|
28
|
+
/**
|
|
29
|
+
* @description Adds additional decorators to the existing configuration
|
|
30
|
+
* @summary Extends the current decorator configuration with additional decorators.
|
|
31
|
+
* This is useful for adding behavior to existing decorators.
|
|
32
|
+
*
|
|
33
|
+
* @param {...(ClassDecorator|PropertyDecorator|MethodDecorator)} decorators - Additional decorators to add
|
|
34
|
+
* @returns {DecorationBuilderBuild} The build stage of the builder pattern
|
|
35
|
+
*/
|
|
36
|
+
extend(...decorators: DecoratorData[]): DecorationBuilderBuild;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @description Interface for the middle stage of the decoration builder pattern
|
|
40
|
+
* @summary Represents the middle stage of the decoration builder, extending the end stage
|
|
41
|
+
* and providing the ability to define the primary decorators for the configuration.
|
|
42
|
+
*
|
|
43
|
+
* @interface DecorationBuilderMid
|
|
44
|
+
* @memberOf module:decoration
|
|
45
|
+
*/
|
|
46
|
+
export interface DecorationBuilderMid extends DecorationBuilderEnd {
|
|
47
|
+
/**
|
|
48
|
+
* @description Defines the primary decorators for the configuration
|
|
49
|
+
* @summary Sets the main decorators for the current context. This is typically
|
|
50
|
+
* called after specifying the key with the 'for' method.
|
|
51
|
+
*/
|
|
52
|
+
define(...decorators: DecoratorData[]): DecorationBuilderEnd & DecorationBuilderBuild;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @description Interface for the starting stage of the decoration builder pattern
|
|
56
|
+
* @summary Represents the initial stage of the decoration builder, providing the entry point
|
|
57
|
+
* for the builder pattern by specifying the key for the decorator.
|
|
58
|
+
*
|
|
59
|
+
* @interface DecorationBuilderStart
|
|
60
|
+
* @memberOf module:decoration
|
|
61
|
+
*/
|
|
62
|
+
export interface DecorationBuilderStart {
|
|
63
|
+
/**
|
|
64
|
+
* @description Specifies the key for the decorator
|
|
65
|
+
* @summary Sets the identifier for the decorator, which is used to register and retrieve
|
|
66
|
+
* the decorator in the decoration registry.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} id - The identifier for the decorator
|
|
69
|
+
* @return {DecorationBuilderMid} The middle stage of the builder pattern
|
|
70
|
+
*/
|
|
71
|
+
for(id: string): DecorationBuilderMid;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @description Comprehensive interface for the complete decoration builder pattern
|
|
75
|
+
* @summary A unified interface that combines all stages of the decoration builder pattern,
|
|
76
|
+
* providing a complete API for creating, configuring, and applying decorators.
|
|
77
|
+
* This interface is implemented by the Decoration class.
|
|
78
|
+
*
|
|
79
|
+
* @interface IDecorationBuilder
|
|
80
|
+
* @memberOf module:decoration
|
|
81
|
+
*/
|
|
82
|
+
export interface IDecorationBuilder extends DecorationBuilderStart, DecorationBuilderMid, DecorationBuilderEnd, DecorationBuilderBuild {
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* @description Type definition for a function that resolves the flavour for a target
|
|
86
|
+
* @summary Defines a function type that determines the appropriate flavour for a given target object.
|
|
87
|
+
* This is used by the Decoration class to resolve which flavour of decorator to apply based on the target.
|
|
88
|
+
*
|
|
89
|
+
* @typedef {function(object): string} FlavourResolver
|
|
90
|
+
*
|
|
91
|
+
* @param {object} target - The target object to resolve the flavour for
|
|
92
|
+
* @return {string} The resolved flavour identifier
|
|
93
|
+
* @memberOf module:decoration
|
|
94
|
+
*/
|
|
95
|
+
export type FlavourResolver = (target: object) => string;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdGlvbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb3JhdG9yRGF0YSB9IGZyb20gXCIuL0RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciB0aGUgZmluYWwgc3RhZ2Ugb2YgdGhlIGRlY29yYXRpb24gYnVpbGRlciBwYXR0ZXJuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBidWlsZCBzdGFnZSBvZiB0aGUgZGVjb3JhdGlvbiBidWlsZGVyLCBwcm92aWRpbmcgdGhlIGFiaWxpdHkgdG8gYXBwbHlcbiAqIHRoZSBjb25maWd1cmVkIGRlY29yYXRvciB0byBhIHRhcmdldC4gVGhpcyBpcyB0aGUgZmluYWwgc3RhZ2UgaW4gdGhlIGJ1aWxkZXIgY2hhaW4uXG4gKlxuICogQGludGVyZmFjZSBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyB0aGUgYnVpbGRlciBwcm9jZXNzIGFuZCByZXR1cm5zIGEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyxcbiAgICogcHJvcGVydHksIG9yIG1ldGhvZC5cbiAgICpcbiAgICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgdGFyZ2V0XG4gICAqL1xuICBhcHBseSgpOiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKSA9PiBhbnk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3IgdGhlIGV4dGVuc2lvbiBzdGFnZSBvZiB0aGUgZGVjb3JhdGlvbiBidWlsZGVyIHBhdHRlcm5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgdGhlIGV4dGVuc2lvbiBzdGFnZSBvZiB0aGUgZGVjb3JhdGlvbiBidWlsZGVyLCBwcm92aWRpbmcgdGhlIGFiaWxpdHkgdG8gYWRkXG4gKiBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQGludGVyZmFjZSBEZWNvcmF0aW9uQnVpbGRlckVuZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGlvbkJ1aWxkZXJFbmQge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uXG4gICAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGN1cnJlbnQgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24gd2l0aCBhZGRpdGlvbmFsIGRlY29yYXRvcnMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhZGRpbmcgYmVoYXZpb3IgdG8gZXhpc3RpbmcgZGVjb3JhdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi4oQ2xhc3NEZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yKX0gZGVjb3JhdG9ycyAtIEFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byBhZGRcbiAgICogQHJldHVybnMge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IFRoZSBidWlsZCBzdGFnZSBvZiB0aGUgYnVpbGRlciBwYXR0ZXJuXG4gICAqL1xuICBleHRlbmQoLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciB0aGUgbWlkZGxlIHN0YWdlIG9mIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXIgcGF0dGVyblxuICogQHN1bW1hcnkgUmVwcmVzZW50cyB0aGUgbWlkZGxlIHN0YWdlIG9mIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXIsIGV4dGVuZGluZyB0aGUgZW5kIHN0YWdlXG4gKiBhbmQgcHJvdmlkaW5nIHRoZSBhYmlsaXR5IHRvIGRlZmluZSB0aGUgcHJpbWFyeSBkZWNvcmF0b3JzIGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAaW50ZXJmYWNlIERlY29yYXRpb25CdWlsZGVyTWlkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWNvcmF0aW9uQnVpbGRlck1pZCBleHRlbmRzIERlY29yYXRpb25CdWlsZGVyRW5kIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIG1haW4gZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC4gVGhpcyBpcyB0eXBpY2FsbHlcbiAgICogY2FsbGVkIGFmdGVyIHNwZWNpZnlpbmcgdGhlIGtleSB3aXRoIHRoZSAnZm9yJyBtZXRob2QuXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdXG4gICk6IERlY29yYXRpb25CdWlsZGVyRW5kICYgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciB0aGUgc3RhcnRpbmcgc3RhZ2Ugb2YgdGhlIGRlY29yYXRpb24gYnVpbGRlciBwYXR0ZXJuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBpbml0aWFsIHN0YWdlIG9mIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXIsIHByb3ZpZGluZyB0aGUgZW50cnkgcG9pbnRcbiAqIGZvciB0aGUgYnVpbGRlciBwYXR0ZXJuIGJ5IHNwZWNpZnlpbmcgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRvci5cbiAqXG4gKiBAaW50ZXJmYWNlIERlY29yYXRpb25CdWlsZGVyU3RhcnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlY29yYXRpb25CdWlsZGVyU3RhcnQge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUga2V5IGZvciB0aGUgZGVjb3JhdG9yXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3IsIHdoaWNoIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW5kIHJldHJpZXZlXG4gICAqIHRoZSBkZWNvcmF0b3IgaW4gdGhlIGRlY29yYXRpb24gcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBUaGUgbWlkZGxlIHN0YWdlIG9mIHRoZSBidWlsZGVyIHBhdHRlcm5cbiAgICovXG4gIGZvcihpZDogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXByZWhlbnNpdmUgaW50ZXJmYWNlIGZvciB0aGUgY29tcGxldGUgZGVjb3JhdGlvbiBidWlsZGVyIHBhdHRlcm5cbiAqIEBzdW1tYXJ5IEEgdW5pZmllZCBpbnRlcmZhY2UgdGhhdCBjb21iaW5lcyBhbGwgc3RhZ2VzIG9mIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXIgcGF0dGVybixcbiAqIHByb3ZpZGluZyBhIGNvbXBsZXRlIEFQSSBmb3IgY3JlYXRpbmcsIGNvbmZpZ3VyaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycy5cbiAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBEZWNvcmF0aW9uIGNsYXNzLlxuICpcbiAqIEBpbnRlcmZhY2UgSURlY29yYXRpb25CdWlsZGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvbkJ1aWxkZXJcbiAgZXh0ZW5kcyBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0LFxuICAgIERlY29yYXRpb25CdWlsZGVyTWlkLFxuICAgIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICAgIERlY29yYXRpb25CdWlsZGVyQnVpbGQge31cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIGZsYXZvdXIgZm9yIGEgdGFyZ2V0XG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGRldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0IG9iamVjdC5cbiAqIFRoaXMgaXMgdXNlZCBieSB0aGUgRGVjb3JhdGlvbiBjbGFzcyB0byByZXNvbHZlIHdoaWNoIGZsYXZvdXIgb2YgZGVjb3JhdG9yIHRvIGFwcGx5IGJhc2VkIG9uIHRoZSB0YXJnZXQuXG4gKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKG9iamVjdCk6IHN0cmluZ30gRmxhdm91clJlc29sdmVyXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHJlc29sdmUgdGhlIGZsYXZvdXIgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZXNvbHZlZCBmbGF2b3VyIGlkZW50aWZpZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBGbGF2b3VyUmVzb2x2ZXIgPSAodGFyZ2V0OiBvYmplY3QpID0+IHN0cmluZztcbiJdfQ==
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Assigns arbitrary metadata to a target using a string key
|
|
3
|
+
* @summary Decorator factory that stores a key/value pair in the central Metadata store for the provided class or member.
|
|
4
|
+
* @param {string} key The metadata key to associate with the target
|
|
5
|
+
* @param {*} value The metadata value to store under the given key
|
|
6
|
+
* @return A decorator that writes the metadata when applied
|
|
7
|
+
* @function metadata
|
|
8
|
+
* @category Decorators
|
|
9
|
+
*/
|
|
10
|
+
export declare function metadata(key: string, value: any): (model: any, prop?: any, descriptor?: PropertyDescriptor) => void;
|
|
11
|
+
/**
|
|
12
|
+
* @description Captures and stores a property's design type
|
|
13
|
+
* @summary Decorator factory that reads the reflected design:type for a property and registers it in the Metadata store under the properties map.
|
|
14
|
+
* @return A decorator that records the property's type metadata when applied
|
|
15
|
+
* @function prop
|
|
16
|
+
* @category Property Decorators
|
|
17
|
+
*/
|
|
18
|
+
export declare function prop(): (model: object, prop: any) => void;
|
|
19
|
+
/**
|
|
20
|
+
* @description Decorator factory that applies multiple decorators to a single target
|
|
21
|
+
* @summary Creates a composite decorator that applies multiple decorators in sequence, correctly handling class, method, and property decorators.
|
|
22
|
+
* @param {Array<ClassDecorator | MethodDecorator | PropertyDecorator>} decorators - Array of decorators to apply
|
|
23
|
+
* @return {Function} A decorator function that applies all provided decorators to the target
|
|
24
|
+
* @function apply
|
|
25
|
+
* @mermaid
|
|
26
|
+
* sequenceDiagram
|
|
27
|
+
* participant U as User Code
|
|
28
|
+
* participant A as apply(...decorators)
|
|
29
|
+
* participant D as Decorator
|
|
30
|
+
* U->>A: get decorator(...decorators)
|
|
31
|
+
* A->>U: returns (target, key?, desc?) => void
|
|
32
|
+
* U->>A: invoke on target
|
|
33
|
+
* loop for each decorator
|
|
34
|
+
* A->>D: invoke appropriate decorator type
|
|
35
|
+
* end
|
|
36
|
+
* @category Decorators
|
|
37
|
+
*/
|
|
38
|
+
export declare function apply(...decorators: Array<ClassDecorator | MethodDecorator | PropertyDecorator>): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
|
|
39
|
+
/**
|
|
40
|
+
* @description Creates a property metadata decorator
|
|
41
|
+
* @summary Convenience factory that combines metadata(key, value) and prop() to both set an arbitrary metadata key and record the property's design type.
|
|
42
|
+
* @param {string} key The metadata key to set for the property
|
|
43
|
+
* @param {*} value The metadata value to associate with the key
|
|
44
|
+
* @return A decorator that sets the metadata and captures the property's type
|
|
45
|
+
* @function propMetadata
|
|
46
|
+
* @category Property Decorators
|
|
47
|
+
*/
|
|
48
|
+
export declare function propMetadata(key: string, value: any): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
|
|
49
|
+
/**
|
|
50
|
+
* @description Attaches a human-readable description to a class or member
|
|
51
|
+
* @summary Decorator factory that stores a textual description in the Metadata store under the appropriate description key for a class or its property.
|
|
52
|
+
* @param {string} desc The descriptive text to associate with the class or property
|
|
53
|
+
* @return A decorator that records the description when applied
|
|
54
|
+
* @function description
|
|
55
|
+
* @category Decorators
|
|
56
|
+
*/
|
|
57
|
+
export declare function description(desc: string): (original: any, prop: any, descriptor?: any) => void;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Metadata } from "./metadata/Metadata.js";
|
|
2
|
+
import { DecorationKeys, ObjectKeySplitter } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* @description Assigns arbitrary metadata to a target using a string key
|
|
5
|
+
* @summary Decorator factory that stores a key/value pair in the central Metadata store for the provided class or member.
|
|
6
|
+
* @param {string} key The metadata key to associate with the target
|
|
7
|
+
* @param {*} value The metadata value to store under the given key
|
|
8
|
+
* @return A decorator that writes the metadata when applied
|
|
9
|
+
* @function metadata
|
|
10
|
+
* @category Decorators
|
|
11
|
+
*/
|
|
12
|
+
export function metadata(key, value) {
|
|
13
|
+
return function metadata(model, prop,
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
15
|
+
descriptor) {
|
|
16
|
+
Metadata.set(prop ? model.constructor : model, key, value);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @description Captures and stores a property's design type
|
|
21
|
+
* @summary Decorator factory that reads the reflected design:type for a property and registers it in the Metadata store under the properties map.
|
|
22
|
+
* @return A decorator that records the property's type metadata when applied
|
|
23
|
+
* @function prop
|
|
24
|
+
* @category Property Decorators
|
|
25
|
+
*/
|
|
26
|
+
export function prop() {
|
|
27
|
+
return function prop(model, prop) {
|
|
28
|
+
const designType = Reflect.getOwnMetadata(DecorationKeys.DESIGN_TYPE, model, prop);
|
|
29
|
+
return metadata(`${DecorationKeys.PROPERTIES}.${prop}`, designType)(model, prop);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @description Decorator factory that applies multiple decorators to a single target
|
|
34
|
+
* @summary Creates a composite decorator that applies multiple decorators in sequence, correctly handling class, method, and property decorators.
|
|
35
|
+
* @param {Array<ClassDecorator | MethodDecorator | PropertyDecorator>} decorators - Array of decorators to apply
|
|
36
|
+
* @return {Function} A decorator function that applies all provided decorators to the target
|
|
37
|
+
* @function apply
|
|
38
|
+
* @mermaid
|
|
39
|
+
* sequenceDiagram
|
|
40
|
+
* participant U as User Code
|
|
41
|
+
* participant A as apply(...decorators)
|
|
42
|
+
* participant D as Decorator
|
|
43
|
+
* U->>A: get decorator(...decorators)
|
|
44
|
+
* A->>U: returns (target, key?, desc?) => void
|
|
45
|
+
* U->>A: invoke on target
|
|
46
|
+
* loop for each decorator
|
|
47
|
+
* A->>D: invoke appropriate decorator type
|
|
48
|
+
* end
|
|
49
|
+
* @category Decorators
|
|
50
|
+
*/
|
|
51
|
+
export function apply(...decorators) {
|
|
52
|
+
return (target, propertyKey, descriptor) => {
|
|
53
|
+
for (const decorator of decorators) {
|
|
54
|
+
if (target instanceof Function && !descriptor) {
|
|
55
|
+
decorator(target);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
decorator(target, propertyKey, descriptor);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @description Creates a property metadata decorator
|
|
64
|
+
* @summary Convenience factory that combines metadata(key, value) and prop() to both set an arbitrary metadata key and record the property's design type.
|
|
65
|
+
* @param {string} key The metadata key to set for the property
|
|
66
|
+
* @param {*} value The metadata value to associate with the key
|
|
67
|
+
* @return A decorator that sets the metadata and captures the property's type
|
|
68
|
+
* @function propMetadata
|
|
69
|
+
* @category Property Decorators
|
|
70
|
+
*/
|
|
71
|
+
export function propMetadata(key, value) {
|
|
72
|
+
return apply(metadata(key, value), prop());
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @description Attaches a human-readable description to a class or member
|
|
76
|
+
* @summary Decorator factory that stores a textual description in the Metadata store under the appropriate description key for a class or its property.
|
|
77
|
+
* @param {string} desc The descriptive text to associate with the class or property
|
|
78
|
+
* @return A decorator that records the description when applied
|
|
79
|
+
* @function description
|
|
80
|
+
* @category Decorators
|
|
81
|
+
*/
|
|
82
|
+
export function description(desc) {
|
|
83
|
+
return function description(original, prop, descriptor) {
|
|
84
|
+
return metadata([
|
|
85
|
+
DecorationKeys.DESCRIPTION,
|
|
86
|
+
prop ? prop.toString() : DecorationKeys.CLASS,
|
|
87
|
+
].join(ObjectKeySplitter), desc)(original, prop, descriptor);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsK0JBQTRCO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsdUJBQW9CO0FBRWhFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFXLEVBQUUsS0FBVTtJQUM5QyxPQUFPLFNBQVMsUUFBUSxDQUN0QixLQUFVLEVBRVYsSUFBVTtJQUNWLDZEQUE2RDtJQUM3RCxVQUErQjtRQUUvQixRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLElBQUk7SUFDbEIsT0FBTyxTQUFTLElBQUksQ0FBQyxLQUFhLEVBQUUsSUFBUztRQUMzQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN2QyxjQUFjLENBQUMsV0FBVyxFQUMxQixLQUFLLEVBQ0wsSUFBSSxDQUNMLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQ2pFLEtBQUssRUFDTCxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FDbkIsR0FBRyxVQUF1RTtJQUUxRSxPQUFPLENBQ0wsTUFBYyxFQUNkLFdBQXVDLEVBQ3ZDLFVBQStCLEVBQy9CLEVBQUU7UUFDRixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksTUFBTSxZQUFZLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3QyxTQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxTQUFTO1lBQ1gsQ0FBQztZQUNBLFNBQWlELENBQ2hELE1BQU0sRUFDTixXQUE4QixFQUM5QixVQUE4QyxDQUMvQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBVyxFQUFFLEtBQVU7SUFDbEQsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFZO0lBQ3RDLE9BQU8sU0FBUyxXQUFXLENBQUMsUUFBYSxFQUFFLElBQVMsRUFBRSxVQUFnQjtRQUNwRSxPQUFPLFFBQVEsQ0FDYjtZQUNFLGNBQWMsQ0FBQyxXQUFXO1lBQzFCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSztTQUM5QyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUN6QixJQUFJLENBQ0wsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhL01ldGFkYXRhXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cywgT2JqZWN0S2V5U3BsaXR0ZXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXNzaWducyBhcmJpdHJhcnkgbWV0YWRhdGEgdG8gYSB0YXJnZXQgdXNpbmcgYSBzdHJpbmcga2V5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHN0b3JlcyBhIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjZW50cmFsIE1ldGFkYXRhIHN0b3JlIGZvciB0aGUgcHJvdmlkZWQgY2xhc3Mgb3IgbWVtYmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgbWV0YWRhdGEga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0YXJnZXRcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIG1ldGFkYXRhIHZhbHVlIHRvIHN0b3JlIHVuZGVyIHRoZSBnaXZlbiBrZXlcbiAqIEByZXR1cm4gQSBkZWNvcmF0b3IgdGhhdCB3cml0ZXMgdGhlIG1ldGFkYXRhIHdoZW4gYXBwbGllZFxuICogQGZ1bmN0aW9uIG1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1ldGFkYXRhKFxuICAgIG1vZGVsOiBhbnksXG5cbiAgICBwcm9wPzogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIE1ldGFkYXRhLnNldChwcm9wID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbCwga2V5LCB2YWx1ZSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhcHR1cmVzIGFuZCBzdG9yZXMgYSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHJlYWRzIHRoZSByZWZsZWN0ZWQgZGVzaWduOnR5cGUgZm9yIGEgcHJvcGVydHkgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgTWV0YWRhdGEgc3RvcmUgdW5kZXIgdGhlIHByb3BlcnRpZXMgbWFwLlxuICogQHJldHVybiBBIGRlY29yYXRvciB0aGF0IHJlY29yZHMgdGhlIHByb3BlcnR5J3MgdHlwZSBtZXRhZGF0YSB3aGVuIGFwcGxpZWRcbiAqIEBmdW5jdGlvbiBwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByb3AobW9kZWw6IG9iamVjdCwgcHJvcDogYW55KSB7XG4gICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fVFlQRSxcbiAgICAgIG1vZGVsLFxuICAgICAgcHJvcFxuICAgICk7XG4gICAgcmV0dXJuIG1ldGFkYXRhKGAke0RlY29yYXRpb25LZXlzLlBST1BFUlRJRVN9LiR7cHJvcH1gLCBkZXNpZ25UeXBlKShcbiAgICAgIG1vZGVsLFxuICAgICAgcHJvcFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmYWN0b3J5IHRoYXQgYXBwbGllcyBtdWx0aXBsZSBkZWNvcmF0b3JzIHRvIGEgc2luZ2xlIHRhcmdldFxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGNvbXBvc2l0ZSBkZWNvcmF0b3IgdGhhdCBhcHBsaWVzIG11bHRpcGxlIGRlY29yYXRvcnMgaW4gc2VxdWVuY2UsIGNvcnJlY3RseSBoYW5kbGluZyBjbGFzcywgbWV0aG9kLCBhbmQgcHJvcGVydHkgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7QXJyYXk8Q2xhc3NEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvcj59IGRlY29yYXRvcnMgLSBBcnJheSBvZiBkZWNvcmF0b3JzIHRvIGFwcGx5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGFsbCBwcm92aWRlZCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXRcbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBBIGFzIGFwcGx5KC4uLmRlY29yYXRvcnMpXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIFUtPj5BOiBnZXQgZGVjb3JhdG9yKC4uLmRlY29yYXRvcnMpXG4gKiAgIEEtPj5VOiByZXR1cm5zICh0YXJnZXQsIGtleT8sIGRlc2M/KSA9PiB2b2lkXG4gKiAgIFUtPj5BOiBpbnZva2Ugb24gdGFyZ2V0XG4gKiAgIGxvb3AgZm9yIGVhY2ggZGVjb3JhdG9yXG4gKiAgICAgQS0+PkQ6IGludm9rZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgdHlwZVxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseShcbiAgLi4uZGVjb3JhdG9yczogQXJyYXk8Q2xhc3NEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvcj5cbikge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sIHwgdW5rbm93bixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiAhZGVzY3JpcHRvcikge1xuICAgICAgICAoZGVjb3JhdG9yIGFzIENsYXNzRGVjb3JhdG9yKSh0YXJnZXQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIChkZWNvcmF0b3IgYXMgTWV0aG9kRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IpKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgZGVzY3JpcHRvciBhcyBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm9wZXJ0eSBtZXRhZGF0YSBkZWNvcmF0b3JcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIGZhY3RvcnkgdGhhdCBjb21iaW5lcyBtZXRhZGF0YShrZXksIHZhbHVlKSBhbmQgcHJvcCgpIHRvIGJvdGggc2V0IGFuIGFyYml0cmFyeSBtZXRhZGF0YSBrZXkgYW5kIHJlY29yZCB0aGUgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIG1ldGFkYXRhIGtleSB0byBzZXQgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgbWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGtleVxuICogQHJldHVybiBBIGRlY29yYXRvciB0aGF0IHNldHMgdGhlIG1ldGFkYXRhIGFuZCBjYXB0dXJlcyB0aGUgcHJvcGVydHkncyB0eXBlXG4gKiBAZnVuY3Rpb24gcHJvcE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShrZXksIHZhbHVlKSwgcHJvcCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXR0YWNoZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiB0byBhIGNsYXNzIG9yIG1lbWJlclxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBzdG9yZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGluIHRoZSBNZXRhZGF0YSBzdG9yZSB1bmRlciB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRpb24ga2V5IGZvciBhIGNsYXNzIG9yIGl0cyBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjIFRoZSBkZXNjcmlwdGl2ZSB0ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjbGFzcyBvciBwcm9wZXJ0eVxuICogQHJldHVybiBBIGRlY29yYXRvciB0aGF0IHJlY29yZHMgdGhlIGRlc2NyaXB0aW9uIHdoZW4gYXBwbGllZFxuICogQGZ1bmN0aW9uIGRlc2NyaXB0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb24oZGVzYzogc3RyaW5nKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkZXNjcmlwdGlvbihvcmlnaW5hbDogYW55LCBwcm9wOiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpIHtcbiAgICByZXR1cm4gbWV0YWRhdGEoXG4gICAgICBbXG4gICAgICAgIERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OLFxuICAgICAgICBwcm9wID8gcHJvcC50b1N0cmluZygpIDogRGVjb3JhdGlvbktleXMuQ0xBU1MsXG4gICAgICBdLmpvaW4oT2JqZWN0S2V5U3BsaXR0ZXIpLFxuICAgICAgZGVzY1xuICAgICkob3JpZ2luYWwsIHByb3AsIGRlc2NyaXB0b3IpO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Root entry point for the decoration module
|
|
3
|
+
* @summary Aggregates and re-exports the public API of the decoration library, including core classes like {@link Decoration}, utility decorators, metadata helpers, and constants. This module is the primary import surface for consumers and exposes:
|
|
4
|
+
* - Core builder: {@link Decoration}
|
|
5
|
+
* - Decorator utilities: {@link module:decoration | decorators in ./decorators}
|
|
6
|
+
* - Metadata utilities: {@link Metadata}
|
|
7
|
+
* - Constants and enums: {@link DecorationKeys}, {@link DefaultFlavour}
|
|
8
|
+
*
|
|
9
|
+
* @module decoration
|
|
10
|
+
*/
|
|
11
|
+
export * from "./decoration";
|
|
12
|
+
export * from "./metadata";
|
|
13
|
+
export * from "./constants";
|
|
14
|
+
export * from "./decorators";
|
|
15
|
+
/**
|
|
16
|
+
* @description Current version of the reflection package
|
|
17
|
+
* @summary Stores the semantic version number of the package
|
|
18
|
+
* @const VERSION
|
|
19
|
+
* @memberOf module:decoration
|
|
20
|
+
*/
|
|
21
|
+
export declare const VERSION = "0.0.2";
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Root entry point for the decoration module
|
|
3
|
+
* @summary Aggregates and re-exports the public API of the decoration library, including core classes like {@link Decoration}, utility decorators, metadata helpers, and constants. This module is the primary import surface for consumers and exposes:
|
|
4
|
+
* - Core builder: {@link Decoration}
|
|
5
|
+
* - Decorator utilities: {@link module:decoration | decorators in ./decorators}
|
|
6
|
+
* - Metadata utilities: {@link Metadata}
|
|
7
|
+
* - Constants and enums: {@link DecorationKeys}, {@link DefaultFlavour}
|
|
8
|
+
*
|
|
9
|
+
* @module decoration
|
|
10
|
+
*/
|
|
11
|
+
export * from "./decoration/index.js";
|
|
12
|
+
export * from "./metadata/index.js";
|
|
13
|
+
export * from "./constants.js";
|
|
14
|
+
export * from "./decorators.js";
|
|
15
|
+
/**
|
|
16
|
+
* @description Current version of the reflection package
|
|
17
|
+
* @summary Stores the semantic version number of the package
|
|
18
|
+
* @const VERSION
|
|
19
|
+
* @memberOf module:decoration
|
|
20
|
+
*/
|
|
21
|
+
export const VERSION = "0.0.2";
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsc0NBQTZCO0FBQzdCLG9DQUEyQjtBQUMzQiwrQkFBNEI7QUFDNUIsZ0NBQTZCO0FBRTdCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFJvb3QgZW50cnkgcG9pbnQgZm9yIHRoZSBkZWNvcmF0aW9uIG1vZHVsZVxuICogQHN1bW1hcnkgQWdncmVnYXRlcyBhbmQgcmUtZXhwb3J0cyB0aGUgcHVibGljIEFQSSBvZiB0aGUgZGVjb3JhdGlvbiBsaWJyYXJ5LCBpbmNsdWRpbmcgY29yZSBjbGFzc2VzIGxpa2Uge0BsaW5rIERlY29yYXRpb259LCB1dGlsaXR5IGRlY29yYXRvcnMsIG1ldGFkYXRhIGhlbHBlcnMsIGFuZCBjb25zdGFudHMuIFRoaXMgbW9kdWxlIGlzIHRoZSBwcmltYXJ5IGltcG9ydCBzdXJmYWNlIGZvciBjb25zdW1lcnMgYW5kIGV4cG9zZXM6XG4gKiAtIENvcmUgYnVpbGRlcjoge0BsaW5rIERlY29yYXRpb259XG4gKiAtIERlY29yYXRvciB1dGlsaXRpZXM6IHtAbGluayBtb2R1bGU6ZGVjb3JhdGlvbiB8IGRlY29yYXRvcnMgaW4gLi9kZWNvcmF0b3JzfVxuICogLSBNZXRhZGF0YSB1dGlsaXRpZXM6IHtAbGluayBNZXRhZGF0YX1cbiAqIC0gQ29uc3RhbnRzIGFuZCBlbnVtczoge0BsaW5rIERlY29yYXRpb25LZXlzfSwge0BsaW5rIERlZmF1bHRGbGF2b3VyfVxuICpcbiAqIEBtb2R1bGUgZGVjb3JhdGlvblxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFkYXRhXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZWZsZWN0aW9uIHBhY2thZ2VcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXX0=
|