@decaf-ts/decoration 0.0.24 → 0.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 +3 -1
- package/dist/decoration.cjs +2 -999
- package/dist/decoration.cjs.map +1 -0
- package/dist/decoration.js +2 -0
- package/dist/decoration.js.map +1 -0
- package/lib/constants.cjs +1 -0
- package/lib/constants.js.map +1 -0
- package/lib/decoration/Decoration.cjs +1 -0
- package/lib/decoration/Decoration.js.map +1 -0
- package/lib/decoration/index.cjs +1 -0
- package/lib/decoration/index.js.map +1 -0
- package/lib/decoration/types.cjs +1 -0
- package/lib/decoration/types.js.map +1 -0
- package/lib/decorators.cjs +1 -0
- package/lib/decorators.js.map +1 -0
- package/lib/esm/constants.js +1 -0
- package/lib/esm/constants.js.map +1 -0
- package/lib/esm/decoration/Decoration.js +1 -0
- package/lib/esm/decoration/Decoration.js.map +1 -0
- package/lib/esm/decoration/index.js +1 -0
- package/lib/esm/decoration/index.js.map +1 -0
- package/lib/esm/decoration/types.js +1 -0
- package/lib/esm/decoration/types.js.map +1 -0
- package/lib/esm/decorators.js +1 -0
- package/lib/esm/decorators.js.map +1 -0
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +2 -1
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/metadata/Metadata.js +1 -0
- package/lib/esm/metadata/Metadata.js.map +1 -0
- package/lib/esm/metadata/index.js +1 -0
- package/lib/esm/metadata/index.js.map +1 -0
- package/lib/esm/metadata/types.js +1 -0
- package/lib/esm/metadata/types.js.map +1 -0
- package/lib/index.cjs +2 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js.map +1 -0
- package/lib/metadata/Metadata.cjs +1 -0
- package/lib/metadata/Metadata.js.map +1 -0
- package/lib/metadata/index.cjs +1 -0
- package/lib/metadata/index.js.map +1 -0
- package/lib/metadata/types.cjs +1 -0
- package/lib/metadata/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/decoration.esm.cjs +0 -977
package/dist/decoration.cjs
CHANGED
|
@@ -1,999 +1,2 @@
|
|
|
1
|
-
(function (
|
|
2
|
-
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'reflect-metadata'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.decoration = {}));
|
|
5
|
-
})(this, (function (exports) { 'use strict';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @description Default flavour identifier for the decorator system.
|
|
9
|
-
* @summary Defines the fallback flavour used when no specific value is provided, ensuring consistent decorator selection across the library.
|
|
10
|
-
* @type {string}
|
|
11
|
-
* @const DefaultFlavour
|
|
12
|
-
* @memberOf module:decoration
|
|
13
|
-
*/
|
|
14
|
-
const DefaultFlavour = "decaf";
|
|
15
|
-
/**
|
|
16
|
-
* @description Character used to split nested metadata keys.
|
|
17
|
-
* @summary Defines the delimiter applied by the metadata store when traversing nested object paths for read and write operations.
|
|
18
|
-
* @type {string}
|
|
19
|
-
* @const ObjectKeySplitter
|
|
20
|
-
* @memberOf module:decoration
|
|
21
|
-
*/
|
|
22
|
-
const ObjectKeySplitter = ".";
|
|
23
|
-
/**
|
|
24
|
-
* @description Metadata token registry for the decoration system.
|
|
25
|
-
* @summary Enumerates the keys used during reflection and metadata storage for classes, properties, methods, descriptions, and registered libraries.
|
|
26
|
-
* @enum {string}
|
|
27
|
-
* @readonly
|
|
28
|
-
* @const DecorationKeys
|
|
29
|
-
* @memberOf module:decoration
|
|
30
|
-
*/
|
|
31
|
-
exports.DecorationKeys = void 0;
|
|
32
|
-
(function (DecorationKeys) {
|
|
33
|
-
/** @description Storage bucket for decoration-aware library registrations. */
|
|
34
|
-
DecorationKeys["LIBRARIES"] = "libraries";
|
|
35
|
-
/** @description Storage key mirrored on constructors that holds runtime metadata. */
|
|
36
|
-
DecorationKeys["REFLECT"] = "__decaf";
|
|
37
|
-
/** @description Container of reflected property metadata for a model. */
|
|
38
|
-
DecorationKeys["PROPERTIES"] = "properties";
|
|
39
|
-
/** @description Container of reflected method metadata for a model. */
|
|
40
|
-
DecorationKeys["METHODS"] = "methods";
|
|
41
|
-
/** @description Key under which the model constructor reference is persisted. */
|
|
42
|
-
DecorationKeys["CLASS"] = "class";
|
|
43
|
-
/** @description Human-readable descriptions for classes and members. */
|
|
44
|
-
DecorationKeys["DESCRIPTION"] = "description";
|
|
45
|
-
/** @description Storage slot tracking the original constructor when overridden. */
|
|
46
|
-
DecorationKeys["CONSTRUCTOR"] = "__original";
|
|
47
|
-
/** @description Collected parameter metadata for configured decorators. */
|
|
48
|
-
DecorationKeys["PARAMETERS"] = "parameters";
|
|
49
|
-
/** @description Reflect metadata key for a property's design type. */
|
|
50
|
-
DecorationKeys["DESIGN_TYPE"] = "design:type";
|
|
51
|
-
/** @description Reflect metadata key for recorded constructor parameter types. */
|
|
52
|
-
DecorationKeys["DESIGN_PARAMS"] = "design:paramtypes";
|
|
53
|
-
/** @description Reflect metadata key for a method's return type. */
|
|
54
|
-
DecorationKeys["DESIGN_RETURN"] = "design:returntype";
|
|
55
|
-
})(exports.DecorationKeys || (exports.DecorationKeys = {}));
|
|
56
|
-
/**
|
|
57
|
-
* @description Default metadata instance.
|
|
58
|
-
* @summary Provides the default metadata shape used when initialising new metadata entries for a model.
|
|
59
|
-
* @type {module:decoration.BasicMetadata<any>}
|
|
60
|
-
* @const DefaultMetadata
|
|
61
|
-
* @memberOf module:decoration
|
|
62
|
-
*/
|
|
63
|
-
const DefaultMetadata = {
|
|
64
|
-
[exports.DecorationKeys.PROPERTIES]: [],
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* @description Retrieves a nested value from an object given a path.
|
|
69
|
-
* @summary Walks an object structure using a splitter-delimited path and returns the value at that location or `undefined` if any key is missing.
|
|
70
|
-
* @param {Record<string, any>} obj Object to traverse for the lookup.
|
|
71
|
-
* @param {string} path Splitter-delimited path to the desired value (e.g., "a.b.c").
|
|
72
|
-
* @param {string} [splitter=ObjectKeySplitter] Delimiter used to separate the path segments.
|
|
73
|
-
* @return {any|undefined} Value resolved at the given path or `undefined` when not found.
|
|
74
|
-
* @function getValueBySplitter
|
|
75
|
-
* @mermaid
|
|
76
|
-
* sequenceDiagram
|
|
77
|
-
* participant C as Caller
|
|
78
|
-
* participant F as getValueBySplitter
|
|
79
|
-
* participant O as Object
|
|
80
|
-
* C->>F: (obj, path, splitter)
|
|
81
|
-
* F->>F: split path into keys
|
|
82
|
-
* loop for each key
|
|
83
|
-
* F->>O: access current[key]
|
|
84
|
-
* alt missing or nullish
|
|
85
|
-
* F-->>C: return undefined
|
|
86
|
-
* end
|
|
87
|
-
* end
|
|
88
|
-
* F-->>C: return final value
|
|
89
|
-
* @memberOf module:decoration
|
|
90
|
-
*/
|
|
91
|
-
function getValueBySplitter(obj, path, splitter = ObjectKeySplitter) {
|
|
92
|
-
const keys = path.split(splitter);
|
|
93
|
-
let current = obj;
|
|
94
|
-
for (const key of keys) {
|
|
95
|
-
if (current === null ||
|
|
96
|
-
current === undefined ||
|
|
97
|
-
!Object.prototype.hasOwnProperty.call(current, key))
|
|
98
|
-
return undefined;
|
|
99
|
-
current = current[key];
|
|
100
|
-
}
|
|
101
|
-
return current;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* @description Sets a nested value on an object given a path.
|
|
105
|
-
* @summary Traverses or creates intermediate objects following a splitter-delimited path and assigns the provided value at the destination key.
|
|
106
|
-
* @param {Record<string, any>} obj Object to mutate while drilling into nested keys.
|
|
107
|
-
* @param {string} path Splitter-delimited destination path (e.g., "a.b.c").
|
|
108
|
-
* @param {any} value Value to set at the destination node.
|
|
109
|
-
* @param {string} [splitter=ObjectKeySplitter] Delimiter used to separate the path segments.
|
|
110
|
-
* @return {void}
|
|
111
|
-
* @function setValueBySplitter
|
|
112
|
-
* @mermaid
|
|
113
|
-
* sequenceDiagram
|
|
114
|
-
* participant C as Caller
|
|
115
|
-
* participant F as setValueBySplitter
|
|
116
|
-
* participant O as Object
|
|
117
|
-
* C->>F: (obj, path, value, splitter)
|
|
118
|
-
* F->>F: split path into keys
|
|
119
|
-
* loop for each key
|
|
120
|
-
* alt key missing
|
|
121
|
-
* F->>O: create intermediate object
|
|
122
|
-
* else key exists
|
|
123
|
-
* F->>O: descend into existing object
|
|
124
|
-
* end
|
|
125
|
-
* end
|
|
126
|
-
* F-->>C: void
|
|
127
|
-
* @memberOf module:decoration
|
|
128
|
-
*/
|
|
129
|
-
function setValueBySplitter(obj, path, value, splitter = ObjectKeySplitter) {
|
|
130
|
-
const keys = path.split(splitter).filter((k) => k.length > 0);
|
|
131
|
-
if (keys.length === 0)
|
|
132
|
-
return;
|
|
133
|
-
let current = obj;
|
|
134
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
135
|
-
const key = keys[i];
|
|
136
|
-
if (current[key] === undefined ||
|
|
137
|
-
current[key] === null ||
|
|
138
|
-
typeof current[key] !== "object") {
|
|
139
|
-
current[key] = {};
|
|
140
|
-
}
|
|
141
|
-
current = current[key];
|
|
142
|
-
}
|
|
143
|
-
const lastKey = keys[keys.length - 1];
|
|
144
|
-
current[lastKey] = value;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* @description Centralized runtime metadata store bound to constructors.
|
|
148
|
-
* @summary Provides utilities to read and write structured metadata for classes and their members, with optional mirroring onto the constructor via a well-known symbol key. Supports nested key paths using a configurable splitter and offers both instance and static APIs.
|
|
149
|
-
* @template M The model type the metadata belongs to.
|
|
150
|
-
* @template META Extends BasicMetadata<M> representing the metadata structure.
|
|
151
|
-
* @param {string} [flavour=DefaultFlavour] Optional flavour identifier applied when instantiating helper builders.
|
|
152
|
-
* @class
|
|
153
|
-
* @example
|
|
154
|
-
* // Define and read metadata for a class
|
|
155
|
-
* class User { name!: string }
|
|
156
|
-
* Metadata.set(User, "description.class", "A user model");
|
|
157
|
-
* Metadata.set(User, "properties.name", String);
|
|
158
|
-
* const desc = Metadata.get(User, "description.class"); // "A user model"
|
|
159
|
-
* const type = Metadata.type(User, "name"); // String
|
|
160
|
-
* @mermaid
|
|
161
|
-
* sequenceDiagram
|
|
162
|
-
* participant C as Constructor
|
|
163
|
-
* participant S as Metadata (static)
|
|
164
|
-
* C->>S: set(User, "properties.name", String)
|
|
165
|
-
* C->>S: get(User, "properties.name")
|
|
166
|
-
* S-->>C: String
|
|
167
|
-
*/
|
|
168
|
-
class Metadata {
|
|
169
|
-
/**
|
|
170
|
-
* @description In-memory storage of metadata by constructor symbol
|
|
171
|
-
* @summary Maps a Symbol derived from the constructor to its metadata object, enabling efficient lookup.
|
|
172
|
-
*/
|
|
173
|
-
static { this._metadata = {}; }
|
|
174
|
-
/**
|
|
175
|
-
* @description Path delimiter for nested metadata keys
|
|
176
|
-
* @summary Used by get/set operations to navigate nested structures, defaults to ObjectKeySplitter.
|
|
177
|
-
*/
|
|
178
|
-
static { this.splitter = ObjectKeySplitter; }
|
|
179
|
-
/**
|
|
180
|
-
* @description Symbol key used to mirror metadata on the constructor
|
|
181
|
-
* @summary When mirroring is enabled, the metadata object is defined on the constructor under this non-enumerable key.
|
|
182
|
-
*/
|
|
183
|
-
static { this.baseKey = exports.DecorationKeys.REFLECT; }
|
|
184
|
-
/**
|
|
185
|
-
* @description Controls whether metadata is mirrored onto the constructor
|
|
186
|
-
* @summary When true, the metadata object is defined on the constructor under the non-enumerable baseKey.
|
|
187
|
-
*/
|
|
188
|
-
static { this.mirror = true; }
|
|
189
|
-
constructor() { }
|
|
190
|
-
static Symbol(obj) {
|
|
191
|
-
return Symbol.for([obj.toString(), obj.name].join(" - "));
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* @description Lists known property keys for a model.
|
|
195
|
-
* @summary Reads the metadata entry and returns the names of properties that have recorded type information.
|
|
196
|
-
* @param {Constructor} model Target constructor whose property metadata should be inspected.
|
|
197
|
-
* @return {string[]|undefined} Array of property names or `undefined` if no metadata exists.
|
|
198
|
-
*/
|
|
199
|
-
static properties(model) {
|
|
200
|
-
const meta = this.get(model);
|
|
201
|
-
if (!meta)
|
|
202
|
-
return undefined;
|
|
203
|
-
return Object.keys(meta.properties);
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* @description Lists known methods for a model.
|
|
207
|
-
* @summary Reads the metadata entry and returns the method names that have recorded signature metadata for the provided constructor.
|
|
208
|
-
* @param {Constructor} model Target constructor whose method metadata should be inspected.
|
|
209
|
-
* @return {string[]|undefined} Array of method names or `undefined` if no metadata exists.
|
|
210
|
-
*/
|
|
211
|
-
static methods(model) {
|
|
212
|
-
const meta = this.get(model, exports.DecorationKeys.METHODS);
|
|
213
|
-
if (!meta)
|
|
214
|
-
return undefined;
|
|
215
|
-
return Object.keys(meta);
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* @description Retrieves a human-readable description for a class or a property.
|
|
219
|
-
* @summary Looks up the description stored under the metadata "description" map. If a property key is provided, returns the property's description; otherwise returns the class description.
|
|
220
|
-
* @template M
|
|
221
|
-
* @param {Constructor<M>} model Target constructor whose description is being retrieved.
|
|
222
|
-
* @param {string} [prop] Optional property key (typed as `keyof M`) for which to fetch the description.
|
|
223
|
-
* @return {string|undefined} Description text if present, otherwise `undefined`.
|
|
224
|
-
*/
|
|
225
|
-
static description(model, prop) {
|
|
226
|
-
return this.get(model, this.key(exports.DecorationKeys.DESCRIPTION, (prop ? prop : exports.DecorationKeys.CLASS)));
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* @description Retrieves the recorded params for a method.
|
|
230
|
-
* @summary Reads the metadata entry under `methods.<prop>.design:paramtypes` to return the parameter constructors for the given method.
|
|
231
|
-
* @template M
|
|
232
|
-
* @param {Constructor<M>} model Target constructor owning the method metadata.
|
|
233
|
-
* @param {string} prop Method name whose parameters should be fetched.
|
|
234
|
-
* @return {any[]|undefined} Array of constructor references describing each parameter or `undefined` when not available.
|
|
235
|
-
*/
|
|
236
|
-
static params(model, prop) {
|
|
237
|
-
return this.get(model, this.key(exports.DecorationKeys.METHODS, prop, exports.DecorationKeys.DESIGN_PARAMS));
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* @description Retrieves a single recorded parameter type for a method.
|
|
241
|
-
* @summary Looks up the parameter metadata for the provided index, enforcing bounds and returning the constructor reference for that argument.
|
|
242
|
-
* @template M
|
|
243
|
-
* @param {Constructor<M>} model Target constructor owning the method metadata.
|
|
244
|
-
* @param {string} prop Method name whose parameter should be returned.
|
|
245
|
-
* @param {number} index Zero-based index of the desired parameter metadata.
|
|
246
|
-
* @return {any|undefined} Constructor reference for the parameter or `undefined` if not recorded.
|
|
247
|
-
*/
|
|
248
|
-
static param(model, prop, index) {
|
|
249
|
-
const params = this.params(model, prop);
|
|
250
|
-
if (!params)
|
|
251
|
-
return undefined;
|
|
252
|
-
if (index > params.length - 1)
|
|
253
|
-
throw new Error(`Parameter index ${index} out of range for ${String(prop)}`);
|
|
254
|
-
return params[index];
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* @description Retrieves the recorded return type for a method.
|
|
258
|
-
* @summary Reads the metadata entry under `methods.<prop>.design:returntype` to return the return type for the given method.
|
|
259
|
-
* @template M
|
|
260
|
-
* @param {Constructor<M>} model Target constructor whose method metadata should be inspected.
|
|
261
|
-
* @param {string} prop Method name whose return type should be fetched.
|
|
262
|
-
* @return {any|undefined} Constructor reference for the return type or `undefined` when not available.
|
|
263
|
-
*/
|
|
264
|
-
static return(model, prop) {
|
|
265
|
-
return this.get(model, this.key(exports.DecorationKeys.METHODS, prop, exports.DecorationKeys.DESIGN_RETURN));
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* @description Retrieves the recorded design type for a property.
|
|
269
|
-
* @summary Reads the metadata entry under `properties.<prop>` to return the constructor recorded for the given property name.
|
|
270
|
-
* @param {Constructor} model Target constructor whose property metadata should be inspected.
|
|
271
|
-
* @param {string} prop Property name whose type metadata should be returned.
|
|
272
|
-
* @return {Constructor|undefined} Constructor reference for the property type or `undefined` if not available.
|
|
273
|
-
*/
|
|
274
|
-
static type(model, prop) {
|
|
275
|
-
return this.get(model, this.key(exports.DecorationKeys.PROPERTIES, prop));
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* @description Resolves the canonical constructor associated with the provided model handle and metadata.
|
|
279
|
-
* @summary Returns the stored constructor reference when the provided model is a proxy or reduced value. Falls back to the original model when no constructor metadata has been recorded yet.
|
|
280
|
-
* @template M
|
|
281
|
-
* @param {Constructor<M>} model Model used when recording metadata.
|
|
282
|
-
* @return {Constructor<M>} Canonical constructor if stored, otherwise the provided one`.
|
|
283
|
-
*/
|
|
284
|
-
static constr(model) {
|
|
285
|
-
return model[exports.DecorationKeys.CONSTRUCTOR] || model;
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* @description Retrieves metadata for a model or a specific key within it.
|
|
289
|
-
* @summary When called with a constructor only, returns the entire metadata object associated with the model. When a key path is provided, returns the value stored at that nested key.
|
|
290
|
-
* @template M
|
|
291
|
-
* @template META
|
|
292
|
-
* @param {Constructor<M>|string} model Target constructor used to locate the metadata record or a pre-resolved symbol identifier.
|
|
293
|
-
* @param {string} [key] Optional nested key path to fetch a specific value.
|
|
294
|
-
* @return {META|*|undefined} Metadata object, the value at the key path, or `undefined` if nothing exists.
|
|
295
|
-
*/
|
|
296
|
-
static get(model, key) {
|
|
297
|
-
if (key === exports.DecorationKeys.CONSTRUCTOR)
|
|
298
|
-
return this.constr(model);
|
|
299
|
-
const resolvedModel = this.constr(model);
|
|
300
|
-
const constructors = this.collectConstructorChain(resolvedModel);
|
|
301
|
-
if (constructors.length === 0) {
|
|
302
|
-
const fallbackSymbol = Symbol.for(resolvedModel.toString());
|
|
303
|
-
return this.innerGet(fallbackSymbol, key);
|
|
304
|
-
}
|
|
305
|
-
const collectedValues = constructors
|
|
306
|
-
.map((ctor) => this.innerGet(this.Symbol(ctor), key))
|
|
307
|
-
.filter((value) => value !== undefined);
|
|
308
|
-
if (collectedValues.length === 0)
|
|
309
|
-
return undefined;
|
|
310
|
-
return this.mergeMetadataChain(collectedValues);
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* @description Retrieves metadata stored under a symbol key.
|
|
314
|
-
* @summary Internal helper that resolves and optionally drills into the in-memory metadata map for the provided symbol and key path.
|
|
315
|
-
* @param {symbol} symbol Symbol representing the metadata bucket.
|
|
316
|
-
* @param {string|symbol} [key] Optional nested key referencing a specific metadata entry.
|
|
317
|
-
* @return {any} Stored metadata object or value for the provided key, or `undefined` when absent.
|
|
318
|
-
*/
|
|
319
|
-
static innerGet(symbol, key) {
|
|
320
|
-
if (!this._metadata[symbol])
|
|
321
|
-
return undefined;
|
|
322
|
-
if (!key)
|
|
323
|
-
return this._metadata[symbol];
|
|
324
|
-
if (typeof key === "string")
|
|
325
|
-
return getValueBySplitter(this._metadata[symbol], key, this.splitter);
|
|
326
|
-
return this._metadata[symbol][key];
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* @description Builds the inheritance chain for a constructor, ordered from base to most-specific class.
|
|
330
|
-
* @summary Walks the prototype chain starting from the provided constructor until reaching Function/Object and returns the collected constructors.
|
|
331
|
-
* @param {Constructor} model Constructor whose chain should be collected.
|
|
332
|
-
* @return {Constructor[]} Array of constructors ordered from base to leaf.
|
|
333
|
-
*/
|
|
334
|
-
static collectConstructorChain(model) {
|
|
335
|
-
const chain = [];
|
|
336
|
-
let current = model;
|
|
337
|
-
while (typeof current === "function" && current !== Function) {
|
|
338
|
-
chain.push(current);
|
|
339
|
-
const parent = Object.getPrototypeOf(current);
|
|
340
|
-
if (!parent || parent === Function || parent === Object)
|
|
341
|
-
break;
|
|
342
|
-
current = parent;
|
|
343
|
-
}
|
|
344
|
-
return chain.reverse();
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* @description Merges metadata values collected across the inheritance chain.
|
|
348
|
-
* @summary Performs a deep merge for plain objects while letting non-object values override earlier ones to preserve child metadata precedence.
|
|
349
|
-
* @param {any[]} values Metadata values gathered from base to child.
|
|
350
|
-
* @return {any} Aggregated metadata value respecting inheritance precedence.
|
|
351
|
-
*/
|
|
352
|
-
static mergeMetadataChain(values) {
|
|
353
|
-
let acc = undefined;
|
|
354
|
-
for (const value of values) {
|
|
355
|
-
if (acc === undefined) {
|
|
356
|
-
acc = this.cloneMetadataValue(value);
|
|
357
|
-
continue;
|
|
358
|
-
}
|
|
359
|
-
if (this.isPlainObject(acc) && this.isPlainObject(value)) {
|
|
360
|
-
acc = this.mergePlainObjects(acc, value);
|
|
361
|
-
continue;
|
|
362
|
-
}
|
|
363
|
-
acc = this.cloneMetadataValue(value);
|
|
364
|
-
}
|
|
365
|
-
return acc;
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* @description Produces a deep clone of a metadata value when necessary.
|
|
369
|
-
* @summary Arrays are shallow-cloned, plain objects are deep-cloned, and primitive/function values are returned as-is.
|
|
370
|
-
* @param {any} value Metadata value to clone.
|
|
371
|
-
* @return {any} Cloned metadata value preventing mutation of the backing store.
|
|
372
|
-
*/
|
|
373
|
-
static cloneMetadataValue(value) {
|
|
374
|
-
if (Array.isArray(value))
|
|
375
|
-
return [...value];
|
|
376
|
-
if (this.isPlainObject(value))
|
|
377
|
-
return this.mergePlainObjects({}, value);
|
|
378
|
-
return value;
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* @description Deeply merges two plain metadata objects.
|
|
382
|
-
* @summary Recursively merges nested plain objects while cloning arrays; values from `source` override those from `target` when conflicts occur.
|
|
383
|
-
* @param {Record<string, any>} target Base object to merge into.
|
|
384
|
-
* @param {Record<string, any>} source Object providing overriding metadata.
|
|
385
|
-
* @return {Record<string, any>} Newly merged metadata object.
|
|
386
|
-
*/
|
|
387
|
-
static mergePlainObjects(target, source) {
|
|
388
|
-
const result = { ...target };
|
|
389
|
-
for (const key of Object.keys(source)) {
|
|
390
|
-
const sourceValue = source[key];
|
|
391
|
-
const targetValue = result[key];
|
|
392
|
-
if (this.isPlainObject(sourceValue)) {
|
|
393
|
-
result[key] = this.isPlainObject(targetValue)
|
|
394
|
-
? this.mergePlainObjects(targetValue, sourceValue)
|
|
395
|
-
: this.mergePlainObjects({}, sourceValue);
|
|
396
|
-
continue;
|
|
397
|
-
}
|
|
398
|
-
if (Array.isArray(sourceValue)) {
|
|
399
|
-
result[key] = [...sourceValue];
|
|
400
|
-
continue;
|
|
401
|
-
}
|
|
402
|
-
result[key] = sourceValue;
|
|
403
|
-
}
|
|
404
|
-
return result;
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* @description Checks if a value is a plain object suitable for deep merging.
|
|
408
|
-
* @summary Ensures arrays and null are excluded while accepting objects created via literal/class syntax.
|
|
409
|
-
* @param {any} value Value to inspect.
|
|
410
|
-
* @return {boolean} True when the value is a plain object.
|
|
411
|
-
*/
|
|
412
|
-
static isPlainObject(value) {
|
|
413
|
-
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
414
|
-
return false;
|
|
415
|
-
const proto = Object.getPrototypeOf(value);
|
|
416
|
-
return proto === Object.prototype || proto === null;
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* @description Writes metadata under a symbol key.
|
|
420
|
-
* @summary Internal helper that ensures the metadata bucket exists for the provided symbol and persists the given value, drilling into nested structures when the key is a string path.
|
|
421
|
-
* @param {symbol} symbol Symbol representing the metadata bucket.
|
|
422
|
-
* @param {string|symbol} key Nested key path or direct symbol under which to store the metadata value.
|
|
423
|
-
* @param {any} value Value persisted in the metadata store.
|
|
424
|
-
* @return {void}
|
|
425
|
-
*/
|
|
426
|
-
static innerSet(symbol, key, value) {
|
|
427
|
-
if (!this._metadata[symbol])
|
|
428
|
-
this._metadata[symbol] = {};
|
|
429
|
-
if (typeof key === "string")
|
|
430
|
-
return setValueBySplitter(this._metadata[symbol], key, value, this.splitter);
|
|
431
|
-
this._metadata[symbol][key] = value;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* @description Writes a metadata value at a given nested key path.
|
|
435
|
-
* @summary Ensures the metadata record exists for the constructor, mirrors it on the constructor when enabled, and sets the provided value on the nested key path using the configured splitter.
|
|
436
|
-
* @template M
|
|
437
|
-
* @param {Constructor<M>|string} model Target constructor to which the metadata belongs or a direct identifier string.
|
|
438
|
-
* @param {string} key Nested key path at which to store the value.
|
|
439
|
-
* @param {any} value Value to store in the metadata.
|
|
440
|
-
* @return {void}
|
|
441
|
-
*/
|
|
442
|
-
static set(model, key, value) {
|
|
443
|
-
if (key === exports.DecorationKeys.CONSTRUCTOR) {
|
|
444
|
-
Object.defineProperty(model, exports.DecorationKeys.CONSTRUCTOR, {
|
|
445
|
-
enumerable: false,
|
|
446
|
-
configurable: false,
|
|
447
|
-
writable: false,
|
|
448
|
-
value: value,
|
|
449
|
-
});
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
if (typeof model !== "string")
|
|
453
|
-
model = this.constr(model) || model;
|
|
454
|
-
const symbol = typeof model === "string" ? Symbol.for(model) : this.Symbol(model);
|
|
455
|
-
this.innerSet(symbol, key, value);
|
|
456
|
-
if (typeof model !== "string" &&
|
|
457
|
-
Metadata.mirror &&
|
|
458
|
-
!Object.prototype.hasOwnProperty.call(model, this.baseKey)) {
|
|
459
|
-
Object.defineProperty(model, this.baseKey, {
|
|
460
|
-
enumerable: false,
|
|
461
|
-
configurable: false,
|
|
462
|
-
writable: false,
|
|
463
|
-
value: this._metadata[symbol],
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* @description Registers a decoration-aware library and its version.
|
|
469
|
-
* @summary Stores the version string for an integrating library under the shared libraries metadata symbol, preventing duplicate registrations for the same library identifier.
|
|
470
|
-
* @param {string} library Package name or identifier to register.
|
|
471
|
-
* @param {string} version Semantic version string associated with the library.
|
|
472
|
-
* @return {void}
|
|
473
|
-
* @throws {Error} If the library has already been registered.
|
|
474
|
-
*/
|
|
475
|
-
static registerLibrary(library, version) {
|
|
476
|
-
const symbol = Symbol.for(exports.DecorationKeys.LIBRARIES);
|
|
477
|
-
const lib = this.innerGet(symbol, library);
|
|
478
|
-
if (lib)
|
|
479
|
-
throw new Error(`Library already ${library} registered with version ${version}`);
|
|
480
|
-
this.innerSet(symbol, library, version);
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* @description Lists registered decoration-aware libraries.
|
|
484
|
-
* @summary Returns the in-memory map of library identifiers to semantic versions that have been registered with the Decoration metadata store.
|
|
485
|
-
* @return {Record<string, string>} Map of registered library identifiers to their version strings.
|
|
486
|
-
*/
|
|
487
|
-
static libraries() {
|
|
488
|
-
const symbol = Symbol.for(exports.DecorationKeys.LIBRARIES);
|
|
489
|
-
return this.innerGet(symbol) || {};
|
|
490
|
-
}
|
|
491
|
-
/**
|
|
492
|
-
* @description Joins path segments using the current splitter.
|
|
493
|
-
* @summary Constructs a nested metadata key by concatenating string segments with the configured splitter for use with the metadata store.
|
|
494
|
-
* @param {...string} strs Key segments to join into a full metadata path.
|
|
495
|
-
* @return {string} Splitter-joined metadata key.
|
|
496
|
-
*/
|
|
497
|
-
static key(...strs) {
|
|
498
|
-
return strs.join(this.splitter);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* @description Default resolver that returns the current default flavour.
|
|
504
|
-
* @summary Resolves the flavour for a given target by always returning the library's `DefaultFlavour` value.
|
|
505
|
-
* @param {object} target Target object being decorated.
|
|
506
|
-
* @return {string} Resolved flavour identifier.
|
|
507
|
-
* @function defaultFlavourResolver
|
|
508
|
-
* @memberOf module:decoration
|
|
509
|
-
*/
|
|
510
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
511
|
-
function defaultFlavourResolver(target) {
|
|
512
|
-
return DefaultFlavour;
|
|
513
|
-
}
|
|
514
|
-
/**
|
|
515
|
-
* @description A decorator management class that handles flavoured decorators.
|
|
516
|
-
* @summary The Decoration class provides a builder pattern for creating and managing decorators with different flavours. It supports registering, extending, and applying decorators with context-aware flavour resolution, allowing framework-specific implementations while maintaining a consistent API.
|
|
517
|
-
* @template T Type of the decorator (ClassDecorator | PropertyDecorator | MethodDecorator).
|
|
518
|
-
* @param {string} [flavour=DefaultFlavour] Optional flavour parameter for the decorator context.
|
|
519
|
-
* @class
|
|
520
|
-
* @example
|
|
521
|
-
* ```typescript
|
|
522
|
-
* // Create a new decoration for 'component' with default flavour
|
|
523
|
-
* const componentDecorator = new Decoration()
|
|
524
|
-
* .for('component')
|
|
525
|
-
* .define(customComponentDecorator);
|
|
526
|
-
*
|
|
527
|
-
* // Create a flavoured decoration
|
|
528
|
-
* const vueComponent = new Decoration('vue')
|
|
529
|
-
* .for('component')
|
|
530
|
-
* .define(vueComponentDecorator);
|
|
531
|
-
*
|
|
532
|
-
* // Apply the decoration
|
|
533
|
-
* @componentDecorator
|
|
534
|
-
* class MyComponent {}
|
|
535
|
-
* ```
|
|
536
|
-
* @mermaid
|
|
537
|
-
* sequenceDiagram
|
|
538
|
-
* participant C as Client
|
|
539
|
-
* participant D as Decoration
|
|
540
|
-
* participant R as FlavourResolver
|
|
541
|
-
* participant F as DecoratorFactory
|
|
542
|
-
*
|
|
543
|
-
* C->>D: new Decoration(flavour)
|
|
544
|
-
* C->>D: for(key)
|
|
545
|
-
* C->>D: define(decorators)
|
|
546
|
-
* D->>D: register(key, flavour, decorators)
|
|
547
|
-
* D->>F: decoratorFactory(key, flavour)
|
|
548
|
-
* F->>R: resolve(target)
|
|
549
|
-
* R-->>F: resolved flavour
|
|
550
|
-
* F->>F: apply decorators
|
|
551
|
-
* F-->>C: decorated target
|
|
552
|
-
*/
|
|
553
|
-
class Decoration {
|
|
554
|
-
/**
|
|
555
|
-
* @description Static map of registered decorators.
|
|
556
|
-
* @summary Stores all registered decorators organised by key and flavour.
|
|
557
|
-
*/
|
|
558
|
-
static { this.decorators = {}; }
|
|
559
|
-
/**
|
|
560
|
-
* @description Function to resolve flavour from a target.
|
|
561
|
-
* @summary Resolver function that determines the appropriate flavour for a given target.
|
|
562
|
-
*/
|
|
563
|
-
static { this.flavourResolver = defaultFlavourResolver; }
|
|
564
|
-
constructor(flavour = DefaultFlavour) {
|
|
565
|
-
this.flavour = flavour;
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* @description Sets the key for the decoration builder.
|
|
569
|
-
* @summary Initialises a new decoration chain with the specified key.
|
|
570
|
-
* @param {string} key Identifier for the decorator.
|
|
571
|
-
* @return {DecorationBuilderMid} Builder instance for method chaining.
|
|
572
|
-
*/
|
|
573
|
-
for(key) {
|
|
574
|
-
this.key = key;
|
|
575
|
-
return this;
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* @description Adds decorators to the current context.
|
|
579
|
-
* @summary Internal method to add decorators with addon support.
|
|
580
|
-
* @param {boolean} [addon=false] Indicates whether the decorators are additive extras.
|
|
581
|
-
* @param {...DecoratorData} decorators Decorators to register for the configured key.
|
|
582
|
-
* @return {this} Current instance for chaining.
|
|
583
|
-
*/
|
|
584
|
-
decorate(addon = false, ...decorators) {
|
|
585
|
-
if (!this.key)
|
|
586
|
-
throw new Error("key must be provided before decorators can be added");
|
|
587
|
-
if ((!decorators || !decorators.length) &&
|
|
588
|
-
!addon &&
|
|
589
|
-
this.flavour !== DefaultFlavour)
|
|
590
|
-
throw new Error("Must provide overrides or addons to override or extend decaf's decorators");
|
|
591
|
-
this[addon ? "extras" : "decorators"] = new Set([
|
|
592
|
-
...(this[addon ? "extras" : "decorators"] || new Set()).values(),
|
|
593
|
-
...decorators,
|
|
594
|
-
]);
|
|
595
|
-
return this;
|
|
596
|
-
}
|
|
597
|
-
/**
|
|
598
|
-
* @description Defines the base decorators.
|
|
599
|
-
* @summary Sets the primary decorators for the current context.
|
|
600
|
-
* @param {...DecoratorData} decorators Decorators to define.
|
|
601
|
-
* @return {DecorationBuilderEnd} Builder instance for finishing the chain (also implements DecorationBuilderBuild).
|
|
602
|
-
*/
|
|
603
|
-
define(...decorators) {
|
|
604
|
-
if (decorators.find((d) => typeof d === "object") &&
|
|
605
|
-
decorators.length !== 1)
|
|
606
|
-
throw new Error(`When using an overridable decorator, only one is allowed`);
|
|
607
|
-
return this.decorate(false, ...decorators);
|
|
608
|
-
}
|
|
609
|
-
/**
|
|
610
|
-
* @description Extends existing decorators.
|
|
611
|
-
* @summary Adds additional decorators to the current context.
|
|
612
|
-
* @param {...DecoratorData} decorators Additional decorators to register as addons.
|
|
613
|
-
* @return {DecorationBuilderBuild} Builder instance for building the decorator.
|
|
614
|
-
*/
|
|
615
|
-
extend(...decorators) {
|
|
616
|
-
if (decorators.find((d) => typeof d === "object") &&
|
|
617
|
-
decorators.length !== 1)
|
|
618
|
-
throw new Error(`When extending using an overridable decorator, only one is allowed`);
|
|
619
|
-
return this.decorate(true, ...decorators);
|
|
620
|
-
}
|
|
621
|
-
/**
|
|
622
|
-
* @description Factory that creates a context-aware decorator for a key/flavour.
|
|
623
|
-
* @summary Produces a decorator function bound to the provided key and flavour. The resulting decorator resolves the actual decorators to apply at invocation time based on the target's resolved flavour and the registered base and extra decorators.
|
|
624
|
-
* @param {string} key Decoration key used to look up registered decorators.
|
|
625
|
-
* @param {string} [f=DefaultFlavour] Explicit flavour to bind the factory to.
|
|
626
|
-
* @return {ClassDecorator|MethodDecorator|PropertyDecorator|ParameterDecorator} Decorator function that applies the resolved decorators.
|
|
627
|
-
* @mermaid
|
|
628
|
-
* sequenceDiagram
|
|
629
|
-
* participant U as User Code
|
|
630
|
-
* participant B as Decoration (builder)
|
|
631
|
-
* participant F as decoratorFactory(key, f)
|
|
632
|
-
* participant R as flavourResolver
|
|
633
|
-
* participant A as Applied Decorators
|
|
634
|
-
* U->>B: define()/extend() and apply()
|
|
635
|
-
* B->>F: create context decorator
|
|
636
|
-
* F->>R: resolve(target)
|
|
637
|
-
* R-->>F: flavour
|
|
638
|
-
* F->>A: collect base + extras
|
|
639
|
-
* loop each decorator
|
|
640
|
-
* A->>U: invoke decorator(target, key?, desc?)
|
|
641
|
-
* end
|
|
642
|
-
*/
|
|
643
|
-
decoratorFactory(key, f = DefaultFlavour) {
|
|
644
|
-
function contextDecorator(target, propertyKey, descriptor) {
|
|
645
|
-
const flavour = Decoration.flavourResolver(target);
|
|
646
|
-
const cache = Decoration.decorators[key];
|
|
647
|
-
let decorators;
|
|
648
|
-
const extras = cache[flavour]
|
|
649
|
-
? cache[flavour].extras
|
|
650
|
-
: cache[DefaultFlavour].extras;
|
|
651
|
-
if (cache &&
|
|
652
|
-
cache[flavour] &&
|
|
653
|
-
cache[flavour].decorators &&
|
|
654
|
-
cache[flavour].decorators.size) {
|
|
655
|
-
decorators = cache[flavour].decorators;
|
|
656
|
-
}
|
|
657
|
-
else {
|
|
658
|
-
decorators = cache[DefaultFlavour].decorators;
|
|
659
|
-
}
|
|
660
|
-
const baseDecoratorsList = [...(decorators ? decorators.values() : [])];
|
|
661
|
-
const defaultDecoratorsList = [
|
|
662
|
-
...(cache[DefaultFlavour]?.decorators || new Set()).values(),
|
|
663
|
-
];
|
|
664
|
-
const baseArgsByIndex = baseDecoratorsList.reduce((accum, entry, index) => {
|
|
665
|
-
if (typeof entry === "object" &&
|
|
666
|
-
"args" in entry &&
|
|
667
|
-
Array.isArray(entry.args)) {
|
|
668
|
-
accum[index] = entry.args;
|
|
669
|
-
}
|
|
670
|
-
return accum;
|
|
671
|
-
}, {});
|
|
672
|
-
const defaultArgsByIndex = defaultDecoratorsList.reduce((accum, entry, index) => {
|
|
673
|
-
if (typeof entry === "object" &&
|
|
674
|
-
"args" in entry &&
|
|
675
|
-
Array.isArray(entry.args)) {
|
|
676
|
-
accum[index] = entry.args;
|
|
677
|
-
}
|
|
678
|
-
return accum;
|
|
679
|
-
}, {});
|
|
680
|
-
const toApply = [
|
|
681
|
-
...baseDecoratorsList,
|
|
682
|
-
...(extras ? extras.values() : []),
|
|
683
|
-
];
|
|
684
|
-
const baseLength = baseDecoratorsList.length;
|
|
685
|
-
return toApply.reduce((_, d, index) => {
|
|
686
|
-
switch (typeof d) {
|
|
687
|
-
case "object": {
|
|
688
|
-
const entry = d;
|
|
689
|
-
const candidateIndex = index < baseLength ? index : 0;
|
|
690
|
-
const args = "args" in entry && Array.isArray(entry.args)
|
|
691
|
-
? entry.args
|
|
692
|
-
: (baseArgsByIndex[candidateIndex] ??
|
|
693
|
-
defaultArgsByIndex[candidateIndex] ??
|
|
694
|
-
defaultArgsByIndex[0] ??
|
|
695
|
-
[]);
|
|
696
|
-
return entry.decorator(...args)(target, propertyKey, descriptor);
|
|
697
|
-
}
|
|
698
|
-
case "function":
|
|
699
|
-
return d(target, propertyKey, descriptor);
|
|
700
|
-
default:
|
|
701
|
-
throw new Error(`Unexpected decorator type: ${typeof d}`);
|
|
702
|
-
}
|
|
703
|
-
}, { target, propertyKey, descriptor });
|
|
704
|
-
}
|
|
705
|
-
Object.defineProperty(contextDecorator, "name", {
|
|
706
|
-
value: [f, key].join("_decorator_for_"),
|
|
707
|
-
writable: false,
|
|
708
|
-
});
|
|
709
|
-
return contextDecorator;
|
|
710
|
-
}
|
|
711
|
-
/**
|
|
712
|
-
* @description Creates the final decorator function.
|
|
713
|
-
* @summary Builds and returns the decorator factory function.
|
|
714
|
-
* @return {ClassDecorator|MethodDecorator|PropertyDecorator|ParameterDecorator} Generated decorator function ready for application.
|
|
715
|
-
*/
|
|
716
|
-
apply() {
|
|
717
|
-
if (!this.key)
|
|
718
|
-
throw new Error("No key provided for the decoration builder");
|
|
719
|
-
const existingDecorators = Decoration.decorators[this.key]?.[this.flavour]?.decorators;
|
|
720
|
-
const decoratorsToRegister = this.decorators || existingDecorators || new Set();
|
|
721
|
-
Decoration.register(this.key, this.flavour, decoratorsToRegister, this.extras);
|
|
722
|
-
return this.decoratorFactory(this.key, this.flavour);
|
|
723
|
-
}
|
|
724
|
-
/**
|
|
725
|
-
* @description Registers decorators for a specific key and flavour.
|
|
726
|
-
* @summary Internal method to store decorators in the static registry.
|
|
727
|
-
* @param {string} key Decorator key.
|
|
728
|
-
* @param {string} flavour Decorator flavour.
|
|
729
|
-
* @param {Set<DecoratorData>} [decorators] Primary decorators registered for the key.
|
|
730
|
-
* @param {Set<DecoratorData>} [extras] Additional decorators registered as flavour-specific addons.
|
|
731
|
-
* @return {void}
|
|
732
|
-
*/
|
|
733
|
-
static register(key, flavour, decorators, extras) {
|
|
734
|
-
if (!key) {
|
|
735
|
-
throw new Error("No key provided for the decoration builder");
|
|
736
|
-
}
|
|
737
|
-
if (!decorators)
|
|
738
|
-
throw new Error("No decorators provided for the decoration builder");
|
|
739
|
-
if (!flavour)
|
|
740
|
-
throw new Error("No flavour provided for the decoration builder");
|
|
741
|
-
if (!Decoration.decorators[key])
|
|
742
|
-
Decoration.decorators[key] = {};
|
|
743
|
-
if (!Decoration.decorators[key][flavour])
|
|
744
|
-
Decoration.decorators[key][flavour] = {};
|
|
745
|
-
if (decorators)
|
|
746
|
-
Decoration.decorators[key][flavour].decorators = decorators;
|
|
747
|
-
if (extras)
|
|
748
|
-
Decoration.decorators[key][flavour].extras = extras;
|
|
749
|
-
}
|
|
750
|
-
/**
|
|
751
|
-
* @description Sets the global flavour resolver.
|
|
752
|
-
* @summary Configures the function used to determine decorator flavours.
|
|
753
|
-
* @param {FlavourResolver} resolver Function to resolve flavours.
|
|
754
|
-
* @return {void}
|
|
755
|
-
*/
|
|
756
|
-
static setFlavourResolver(resolver) {
|
|
757
|
-
Decoration.flavourResolver = resolver;
|
|
758
|
-
}
|
|
759
|
-
/**
|
|
760
|
-
* @description Convenience static entry to start a decoration builder.
|
|
761
|
-
* @summary Creates a new Decoration instance and initiates the builder chain with the provided key.
|
|
762
|
-
* @param {string} key Decoration key to configure.
|
|
763
|
-
* @return {DecorationBuilderMid} Builder instance for chaining definitions.
|
|
764
|
-
*/
|
|
765
|
-
static for(key) {
|
|
766
|
-
return new Decoration().for(key);
|
|
767
|
-
}
|
|
768
|
-
/**
|
|
769
|
-
* @description Starts a builder for a specific flavour.
|
|
770
|
-
* @summary Convenience method to begin a Decoration builder chain bound to the given flavour identifier, allowing registration of flavour-specific decorators.
|
|
771
|
-
* @param {string} flavour Flavour name to bind to the builder.
|
|
772
|
-
* @return {DecorationBuilderStart} Builder start interface to continue configuration.
|
|
773
|
-
*/
|
|
774
|
-
static flavouredAs(flavour) {
|
|
775
|
-
return new Decoration(flavour);
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
/**
|
|
780
|
-
* @description Assigns arbitrary metadata to a target using a string key.
|
|
781
|
-
* @summary Decorator factory that stores a key/value pair in the central metadata store for the provided class or member.
|
|
782
|
-
* @param {string} key Metadata key to associate with the target.
|
|
783
|
-
* @param {any} value Metadata value to store under the given key.
|
|
784
|
-
* @return {ClassDecorator|MethodDecorator|PropertyDecorator|ParameterDecorator} Decorator that writes the metadata when applied.
|
|
785
|
-
* @function metadata
|
|
786
|
-
* @category Decorators
|
|
787
|
-
*/
|
|
788
|
-
function metadata(key, value) {
|
|
789
|
-
return function metadata(model, prop,
|
|
790
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
791
|
-
descriptor) {
|
|
792
|
-
Metadata.set(prop ? model.constructor : model, key, value);
|
|
793
|
-
};
|
|
794
|
-
}
|
|
795
|
-
/**
|
|
796
|
-
* @description Captures and stores a property's design type.
|
|
797
|
-
* @summary Decorator factory that reads the reflected `design:type` for a property and registers it in the metadata store under the properties map.
|
|
798
|
-
* @return {PropertyDecorator} Decorator that records the property's type metadata when applied.
|
|
799
|
-
* @function prop
|
|
800
|
-
* @category Property Decorators
|
|
801
|
-
*/
|
|
802
|
-
function prop() {
|
|
803
|
-
function innerProp() {
|
|
804
|
-
return function innerProp(model, prop) {
|
|
805
|
-
const designType = Reflect.getOwnMetadata(exports.DecorationKeys.DESIGN_TYPE, model, prop);
|
|
806
|
-
return metadata(Metadata.key(exports.DecorationKeys.PROPERTIES, prop), designType)(model, prop);
|
|
807
|
-
};
|
|
808
|
-
}
|
|
809
|
-
return Decoration.for(exports.DecorationKeys.PROPERTIES)
|
|
810
|
-
.define({
|
|
811
|
-
decorator: innerProp,
|
|
812
|
-
args: [],
|
|
813
|
-
})
|
|
814
|
-
.apply();
|
|
815
|
-
}
|
|
816
|
-
/**
|
|
817
|
-
* @description Captures a single parameter type for the decorated method.
|
|
818
|
-
* @summary Decorator factory that ensures the method metadata is initialised and stores the reflected parameter constructor at the provided index.
|
|
819
|
-
* @return {ParameterDecorator} Decorator that records the parameter type when applied.
|
|
820
|
-
* @function param
|
|
821
|
-
* @category Parameter Decorators
|
|
822
|
-
* @mermaid
|
|
823
|
-
* sequenceDiagram
|
|
824
|
-
* participant U as User Code
|
|
825
|
-
* participant P as param()
|
|
826
|
-
* participant M as Metadata
|
|
827
|
-
* U->>P: param()(target, key, index)
|
|
828
|
-
* P->>U: method()(target, key, descriptor)
|
|
829
|
-
* P->>M: params(constructor, key)
|
|
830
|
-
* M-->>P: parameter constructors[]
|
|
831
|
-
* P->>M: set(methods.key.index, constructor)
|
|
832
|
-
* P-->>U: parameter recorded
|
|
833
|
-
*/
|
|
834
|
-
function param() {
|
|
835
|
-
return function param(model, prop, index) {
|
|
836
|
-
if (!prop)
|
|
837
|
-
throw new Error(`The @param decorator can only be applied to methods`);
|
|
838
|
-
method()(model, prop, Object.getOwnPropertyDescriptor(model, prop));
|
|
839
|
-
const paramTpes = Metadata.params(model.constructor, prop);
|
|
840
|
-
if (!paramTpes)
|
|
841
|
-
throw new Error(`Missing parameter types for ${String(prop)}`);
|
|
842
|
-
if (index >= paramTpes.length)
|
|
843
|
-
throw new Error(`Parameter index ${index} out of range for ${String(prop)}`);
|
|
844
|
-
metadata(Metadata.key(exports.DecorationKeys.METHODS, prop, index.toString()), paramTpes[index])(model, prop);
|
|
845
|
-
};
|
|
846
|
-
}
|
|
847
|
-
/**
|
|
848
|
-
* @description Extends a parameter decorator with additional metadata.
|
|
849
|
-
* @summary Applies the default `param()` decorator and augments the stored metadata with an arbitrary key/value pair.
|
|
850
|
-
* @param {string} key Metadata key to associate with the parameter.
|
|
851
|
-
* @param {any} value Metadata value persisted under the given key.
|
|
852
|
-
* @return {ParameterDecorator} Decorator that records both the parameter design type and additional metadata.
|
|
853
|
-
* @function paramMetadata
|
|
854
|
-
* @category Parameter Decorators
|
|
855
|
-
*/
|
|
856
|
-
function paramMetadata(key, value) {
|
|
857
|
-
return function paramMetadata(target, prop, index) {
|
|
858
|
-
return apply(param(), metadata(Metadata.key(exports.DecorationKeys.METHODS, prop, key), value))(target, prop, index);
|
|
859
|
-
};
|
|
860
|
-
}
|
|
861
|
-
/**
|
|
862
|
-
* @description Records method design-time metadata.
|
|
863
|
-
* @summary Decorator factory that captures a method's reflected parameter and return types, storing them under the appropriate metadata keys so they can be inspected at runtime.
|
|
864
|
-
* @return {MethodDecorator} Decorator that persists the method's signature information into the metadata store when applied.
|
|
865
|
-
* @function method
|
|
866
|
-
* @mermaid
|
|
867
|
-
* sequenceDiagram
|
|
868
|
-
* participant U as User Code
|
|
869
|
-
* participant F as method()
|
|
870
|
-
* participant M as Metadata
|
|
871
|
-
* U->>F: method()(target, key, descriptor)
|
|
872
|
-
* F->>U: Reflect.getOwnMetadata(design:paramtypes)
|
|
873
|
-
* F->>U: Reflect.getOwnMetadata(design:returntype)
|
|
874
|
-
* F->>M: set(methods.key.design:paramtypes, params)
|
|
875
|
-
* F->>M: set(methods.key.design:returntype, returnType)
|
|
876
|
-
* F-->>U: decorated function
|
|
877
|
-
* @category Method Decorators
|
|
878
|
-
*/
|
|
879
|
-
function method() {
|
|
880
|
-
return function method(obj, prop, descriptor) {
|
|
881
|
-
const designParams = Reflect.getOwnMetadata(exports.DecorationKeys.DESIGN_PARAMS, obj, prop);
|
|
882
|
-
const designReturn = Reflect.getOwnMetadata(exports.DecorationKeys.DESIGN_RETURN, obj, prop);
|
|
883
|
-
return apply(metadata(Metadata.key(exports.DecorationKeys.METHODS, prop, exports.DecorationKeys.DESIGN_PARAMS), designParams), metadata(Metadata.key(exports.DecorationKeys.METHODS, prop, exports.DecorationKeys.DESIGN_RETURN), designReturn))(obj, prop, descriptor);
|
|
884
|
-
};
|
|
885
|
-
}
|
|
886
|
-
/**
|
|
887
|
-
* @description Decorator factory that applies multiple decorators to a single target.
|
|
888
|
-
* @summary Creates a composite decorator that applies multiple decorators in sequence, correctly handling class, method, property, and parameter decorators.
|
|
889
|
-
* @param {Array<ClassDecorator|MethodDecorator|PropertyDecorator|ParameterDecorator>} decorators Collection of decorators to apply.
|
|
890
|
-
* @return {ClassDecorator|MethodDecorator|PropertyDecorator|ParameterDecorator} Decorator function that applies all provided decorators to the target.
|
|
891
|
-
* @function apply
|
|
892
|
-
* @mermaid
|
|
893
|
-
* sequenceDiagram
|
|
894
|
-
* participant U as User Code
|
|
895
|
-
* participant A as apply(...decorators)
|
|
896
|
-
* participant D as Decorator
|
|
897
|
-
* U->>A: get decorator(...decorators)
|
|
898
|
-
* A->>U: returns (target, key?, desc?) => void
|
|
899
|
-
* U->>A: invoke on target
|
|
900
|
-
* loop for each decorator
|
|
901
|
-
* A->>D: invoke appropriate decorator type
|
|
902
|
-
* end
|
|
903
|
-
* @category Decorators
|
|
904
|
-
*/
|
|
905
|
-
function apply(...decorators) {
|
|
906
|
-
return (target, propertyKey, descriptor) => {
|
|
907
|
-
for (const decorator of decorators) {
|
|
908
|
-
if (target instanceof Function && !descriptor) {
|
|
909
|
-
decorator(target);
|
|
910
|
-
continue;
|
|
911
|
-
}
|
|
912
|
-
decorator(target, propertyKey, descriptor);
|
|
913
|
-
}
|
|
914
|
-
};
|
|
915
|
-
}
|
|
916
|
-
/**
|
|
917
|
-
* @description Creates a property metadata decorator.
|
|
918
|
-
* @summary Convenience factory that combines `metadata(key, value)` and `prop()` to both set an arbitrary metadata key and record the property's design type.
|
|
919
|
-
* @param {string} key Metadata key to set for the property.
|
|
920
|
-
* @param {any} value Metadata value to associate with the key.
|
|
921
|
-
* @return {PropertyDecorator} Decorator that sets the metadata and captures the property's type.
|
|
922
|
-
* @function propMetadata
|
|
923
|
-
* @category Property Decorators
|
|
924
|
-
*/
|
|
925
|
-
function propMetadata(key, value) {
|
|
926
|
-
return apply(metadata(key, value), prop());
|
|
927
|
-
}
|
|
928
|
-
/**
|
|
929
|
-
* @description Creates a method metadata decorator.
|
|
930
|
-
* @summary Convenience factory that combines `metadata(key, value)` and `method()` to both set an arbitrary metadata key and record the method's design return and param types.
|
|
931
|
-
* @param {string} key Metadata key to set for the property.
|
|
932
|
-
* @param {any} value Metadata value to associate with the key.
|
|
933
|
-
* @return {MethodDecorator} Decorator that sets the metadata and captures the method's signature metadata.
|
|
934
|
-
* @function methodMetadata
|
|
935
|
-
* @category Method Decorators
|
|
936
|
-
*/
|
|
937
|
-
function methodMetadata(key, value) {
|
|
938
|
-
return apply(metadata(key, value), method());
|
|
939
|
-
}
|
|
940
|
-
/**
|
|
941
|
-
* @description Attaches a human-readable description to a class or member.
|
|
942
|
-
* @summary Decorator factory that stores a textual description in the metadata store under the appropriate description key for a class or its property.
|
|
943
|
-
* @param {string} desc Descriptive text to associate with the class or property.
|
|
944
|
-
* @return {ClassDecorator|MethodDecorator|PropertyDecorator} Decorator that records the description when applied.
|
|
945
|
-
* @function description
|
|
946
|
-
* @category Decorators
|
|
947
|
-
*/
|
|
948
|
-
function description(desc) {
|
|
949
|
-
function innerDescription(desc) {
|
|
950
|
-
return function innerDescription(original, prop, descriptor) {
|
|
951
|
-
return metadata([
|
|
952
|
-
exports.DecorationKeys.DESCRIPTION,
|
|
953
|
-
prop ? prop.toString() : exports.DecorationKeys.CLASS,
|
|
954
|
-
].join(Metadata.splitter), desc)(original, prop, descriptor);
|
|
955
|
-
};
|
|
956
|
-
}
|
|
957
|
-
return Decoration.for(exports.DecorationKeys.DESCRIPTION)
|
|
958
|
-
.define({
|
|
959
|
-
decorator: innerDescription,
|
|
960
|
-
args: [desc],
|
|
961
|
-
})
|
|
962
|
-
.apply();
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
/**
|
|
966
|
-
* @description Root entry point for the decoration package.
|
|
967
|
-
* @summary Re-exports the builder API, decorator helpers, metadata utilities, and shared constants so consumers can import {@link Decoration}, {@link Metadata}, {@link DecorationKeys}, and {@link DefaultFlavour} from a single surface.
|
|
968
|
-
* @module decoration
|
|
969
|
-
*/
|
|
970
|
-
/**
|
|
971
|
-
* @description Current version of the decoration package.
|
|
972
|
-
* @summary Stores the semantic version string registered through {@link Metadata.registerLibrary}.
|
|
973
|
-
* @type {string}
|
|
974
|
-
* @const VERSION
|
|
975
|
-
* @memberOf module:decoration
|
|
976
|
-
*/
|
|
977
|
-
const VERSION = "0.0.23";
|
|
978
|
-
Metadata.registerLibrary("@decaf-ts/decoration", VERSION);
|
|
979
|
-
|
|
980
|
-
exports.Decoration = Decoration;
|
|
981
|
-
exports.DefaultFlavour = DefaultFlavour;
|
|
982
|
-
exports.DefaultMetadata = DefaultMetadata;
|
|
983
|
-
exports.Metadata = Metadata;
|
|
984
|
-
exports.ObjectKeySplitter = ObjectKeySplitter;
|
|
985
|
-
exports.VERSION = VERSION;
|
|
986
|
-
exports.apply = apply;
|
|
987
|
-
exports.description = description;
|
|
988
|
-
exports.getValueBySplitter = getValueBySplitter;
|
|
989
|
-
exports.metadata = metadata;
|
|
990
|
-
exports.method = method;
|
|
991
|
-
exports.methodMetadata = methodMetadata;
|
|
992
|
-
exports.param = param;
|
|
993
|
-
exports.paramMetadata = paramMetadata;
|
|
994
|
-
exports.prop = prop;
|
|
995
|
-
exports.propMetadata = propMetadata;
|
|
996
|
-
exports.setValueBySplitter = setValueBySplitter;
|
|
997
|
-
|
|
998
|
-
}));
|
|
999
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvbWV0YWRhdGEvTWV0YWRhdGEudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi9EZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLCJuYW1lcyI6WyJEZWNvcmF0aW9uS2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBRUE7Ozs7OztJQU1HO0FBQ0ksVUFBTSxjQUFjLEdBQUcsUUFBUTtJQUV0Qzs7Ozs7O0lBTUc7QUFDSSxVQUFNLGlCQUFpQixHQUFHLElBQUk7SUFFckM7Ozs7Ozs7SUFPRztBQUNTQSxvQ0F1Qlg7SUF2QkQsQ0FBQSxVQUFZLGNBQWMsRUFBQTs7SUFFeEIsSUFBQSxjQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsV0FBdUIsQ0FBQTs7SUFFdkIsSUFBQSxjQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBK0IsQ0FBQTs7SUFFL0IsSUFBQSxjQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsWUFBeUIsQ0FBQTs7SUFFekIsSUFBQSxjQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUIsQ0FBQTs7SUFFbkIsSUFBQSxjQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZSxDQUFBOztJQUVmLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCLENBQUE7O0lBRTNCLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLFlBQTBCLENBQUE7O0lBRTFCLElBQUEsY0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCLENBQUE7O0lBRXpCLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCLENBQUE7O0lBRTNCLElBQUEsY0FBQSxDQUFBLGVBQUEsQ0FBQSxHQUFBLG1CQUFtQyxDQUFBOztJQUVuQyxJQUFBLGNBQUEs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
|
|
1
|
+
var t,e;t=this,e=function(t){"use strict";const e="decaf",r=".";var o;t.DecorationKeys=void 0,(o=t.DecorationKeys||(t.DecorationKeys={})).LIBRARIES="libraries",o.REFLECT="__decaf",o.PROPERTIES="properties",o.METHODS="methods",o.CLASS="class",o.DESCRIPTION="description",o.CONSTRUCTOR="__original",o.PARAMETERS="parameters",o.DESIGN_TYPE="design:type",o.DESIGN_PARAMS="design:paramtypes",o.DESIGN_RETURN="design:returntype";const i={[t.DecorationKeys.PROPERTIES]:[]};function a(t,e,o=r){const i=e.split(o);let a=t;for(const t of i){if(null==a||!Object.prototype.hasOwnProperty.call(a,t))return;a=a[t]}return a}function s(t,e,o,i=r){const a=e.split(i).filter(t=>t.length>0);if(0===a.length)return;let s=t;for(let t=0;t<a.length-1;t++){const e=a[t];void 0!==s[e]&&null!==s[e]&&"object"==typeof s[e]||(s[e]={}),s=s[e]}s[a[a.length-1]]=o}class n{static{this._metadata={}}static{this.splitter=r}static{this.baseKey=t.DecorationKeys.REFLECT}static{this.mirror=!0}constructor(){}static Symbol(t){return Symbol.for([t.toString(),t.name].join(" - "))}static properties(t){const e=this.get(t);if(e)return Object.keys(e.properties)}static methods(e){const r=this.get(e,t.DecorationKeys.METHODS);if(r)return Object.keys(r)}static description(e,r){return this.get(e,this.key(t.DecorationKeys.DESCRIPTION,r||t.DecorationKeys.CLASS))}static params(e,r){return this.get(e,this.key(t.DecorationKeys.METHODS,r,t.DecorationKeys.DESIGN_PARAMS))}static param(t,e,r){const o=this.params(t,e);if(o){if(r>o.length-1)throw Error(`Parameter index ${r} out of range for ${e+""}`);return o[r]}}static return(e,r){return this.get(e,this.key(t.DecorationKeys.METHODS,r,t.DecorationKeys.DESIGN_RETURN))}static type(e,r){return this.get(e,this.key(t.DecorationKeys.PROPERTIES,r))}static constr(e){return e[t.DecorationKeys.CONSTRUCTOR]||e}static get(e,r){if(r===t.DecorationKeys.CONSTRUCTOR)return this.constr(e);const o=this.constr(e),i=this.collectConstructorChain(o);if(0===i.length){const t=Symbol.for(o.toString());return this.innerGet(t,r)}const a=i.map(t=>this.innerGet(this.Symbol(t),r)).filter(t=>void 0!==t);return 0!==a.length?this.mergeMetadataChain(a):void 0}static innerGet(t,e){if(this._metadata[t])return e?"string"==typeof e?a(this._metadata[t],e,this.splitter):this._metadata[t][e]:this._metadata[t]}static collectConstructorChain(t){const e=[];let r=t;for(;"function"==typeof r&&r!==Function;){e.push(r);const t=Object.getPrototypeOf(r);if(!t||t===Function||t===Object)break;r=t}return e.reverse()}static mergeMetadataChain(t){let e;for(const r of t)e=void 0!==e&&this.isPlainObject(e)&&this.isPlainObject(r)?this.mergePlainObjects(e,r):this.cloneMetadataValue(r);return e}static cloneMetadataValue(t){return Array.isArray(t)?[...t]:this.isPlainObject(t)?this.mergePlainObjects({},t):t}static mergePlainObjects(t,e){const r={...t};for(const t of Object.keys(e)){const o=e[t],i=r[t];this.isPlainObject(o)?r[t]=this.isPlainObject(i)?this.mergePlainObjects(i,o):this.mergePlainObjects({},o):r[t]=Array.isArray(o)?[...o]:o}return r}static isPlainObject(t){if(null===t||"object"!=typeof t||Array.isArray(t))return!1;const e=Object.getPrototypeOf(t);return e===Object.prototype||null===e}static innerSet(t,e,r){if(this._metadata[t]||(this._metadata[t]={}),"string"==typeof e)return s(this._metadata[t],e,r,this.splitter);this._metadata[t][e]=r}static set(e,r,o){if(r===t.DecorationKeys.CONSTRUCTOR)return void Object.defineProperty(e,t.DecorationKeys.CONSTRUCTOR,{enumerable:!1,configurable:!1,writable:!1,value:o});"string"!=typeof e&&(e=this.constr(e)||e);const i="string"==typeof e?Symbol.for(e):this.Symbol(e);this.innerSet(i,r,o),"string"!=typeof e&&n.mirror&&!Object.prototype.hasOwnProperty.call(e,this.baseKey)&&Object.defineProperty(e,this.baseKey,{enumerable:!1,configurable:!1,writable:!1,value:this._metadata[i]})}static registerLibrary(e,r){const o=Symbol.for(t.DecorationKeys.LIBRARIES);if(this.innerGet(o,e))throw Error(`Library already ${e} registered with version ${r}`);this.innerSet(o,e,r)}static libraries(){const e=Symbol.for(t.DecorationKeys.LIBRARIES);return this.innerGet(e)||{}}static key(...t){return t.join(this.splitter)}}function c(t){return e}class d{static{this.decorators={}}static{this.flavourResolver=c}constructor(t=e){this.flavour=t}for(t){return this.key=t,this}decorate(t=!1,...r){if(!this.key)throw Error("key must be provided before decorators can be added");if(!(r&&r.length||t||this.flavour===e))throw Error("Must provide overrides or addons to override or extend decaf's decorators");return this[t?"extras":"decorators"]=new Set([...(this[t?"extras":"decorators"]||new Set).values(),...r]),this}define(...t){if(t.find(t=>"object"==typeof t)&&1!==t.length)throw Error("When using an overridable decorator, only one is allowed");return this.decorate(!1,...t)}extend(...t){if(t.find(t=>"object"==typeof t)&&1!==t.length)throw Error("When extending using an overridable decorator, only one is allowed");return this.decorate(!0,...t)}decoratorFactory(t,r=e){function o(r,o,i){const a=d.flavourResolver(r),s=d.decorators[t];let n;const c=s[a]?s[a].extras:s[e].extras;n=s&&s[a]&&s[a].decorators&&s[a].decorators.size?s[a].decorators:s[e].decorators;const l=[...n?n.values():[]],y=[...(s[e]?.decorators||new Set).values()],f=l.reduce((t,e,r)=>("object"==typeof e&&"args"in e&&Array.isArray(e.args)&&(t[r]=e.args),t),{}),h=y.reduce((t,e,r)=>("object"==typeof e&&"args"in e&&Array.isArray(e.args)&&(t[r]=e.args),t),{}),u=[...l,...c?c.values():[]],p=l.length;return u.reduce((t,e,a)=>{switch(typeof e){case"object":{const t=e,s=p>a?a:0,n="args"in t&&Array.isArray(t.args)?t.args:f[s]??h[s]??h[0]??[];return t.decorator(...n)(r,o,i)}case"function":return e(r,o,i);default:throw Error("Unexpected decorator type: "+typeof e)}},{target:r,propertyKey:o,descriptor:i})}return Object.defineProperty(o,"name",{value:[r,t].join("_decorator_for_"),writable:!1}),o}apply(){if(!this.key)throw Error("No key provided for the decoration builder");const t=d.decorators[this.key]?.[this.flavour]?.decorators,e=this.decorators||t||new Set;return d.register(this.key,this.flavour,e,this.extras),this.decoratorFactory(this.key,this.flavour)}static register(t,e,r,o){if(!t)throw Error("No key provided for the decoration builder");if(!r)throw Error("No decorators provided for the decoration builder");if(!e)throw Error("No flavour provided for the decoration builder");d.decorators[t]||(d.decorators[t]={}),d.decorators[t][e]||(d.decorators[t][e]={}),r&&(d.decorators[t][e].decorators=r),o&&(d.decorators[t][e].extras=o)}static setFlavourResolver(t){d.flavourResolver=t}static for(t){return(new d).for(t)}static flavouredAs(t){return new d(t)}}function l(t,e){return(r,o,i)=>{n.set(o?r.constructor:r,t,e)}}function y(){return d.for(t.DecorationKeys.PROPERTIES).define({decorator:()=>(e,r)=>{const o=Reflect.getOwnMetadata(t.DecorationKeys.DESIGN_TYPE,e,r);return l(n.key(t.DecorationKeys.PROPERTIES,r),o)(e,r)},args:[]}).apply()}function f(){return(e,r,o)=>{if(!r)throw Error("The @param decorator can only be applied to methods");h()(e,r,Object.getOwnPropertyDescriptor(e,r));const i=n.params(e.constructor,r);if(!i)throw Error("Missing parameter types for "+r);if(o>=i.length)throw Error(`Parameter index ${o} out of range for ${r+""}`);l(n.key(t.DecorationKeys.METHODS,r,o.toString()),i[o])(e,r)}}function h(){return(e,r,o)=>{const i=Reflect.getOwnMetadata(t.DecorationKeys.DESIGN_PARAMS,e,r),a=Reflect.getOwnMetadata(t.DecorationKeys.DESIGN_RETURN,e,r);return u(l(n.key(t.DecorationKeys.METHODS,r,t.DecorationKeys.DESIGN_PARAMS),i),l(n.key(t.DecorationKeys.METHODS,r,t.DecorationKeys.DESIGN_RETURN),a))(e,r,o)}}function u(...t){return(e,r,o)=>{for(const i of t)e instanceof Function&&!o?i(e):i(e,r,o)}}const p="##VERSION##";n.registerLibrary("@decaf-ts/decoration",p),t.Decoration=d,t.DefaultFlavour=e,t.DefaultMetadata=i,t.Metadata=n,t.ObjectKeySplitter=r,t.VERSION=p,t.apply=u,t.description=e=>d.for(t.DecorationKeys.DESCRIPTION).define({decorator:e=>(r,o,i)=>l([t.DecorationKeys.DESCRIPTION,o?o.toString():t.DecorationKeys.CLASS].join(n.splitter),e)(r,o,i),args:[e]}).apply(),t.getValueBySplitter=a,t.metadata=l,t.method=h,t.methodMetadata=(t,e)=>u(l(t,e),h()),t.param=f,t.paramMetadata=(e,r)=>(o,i,a)=>u(f(),l(n.key(t.DecorationKeys.METHODS,i,e),r))(o,i,a),t.prop=y,t.propMetadata=(t,e)=>u(l(t,e),y()),t.setValueBySplitter=s},"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("reflect-metadata")):"function"==typeof define&&define.amd?define(["exports","reflect-metadata"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).decoration={});
|
|
2
|
+
//# sourceMappingURL=decoration.cjs.map
|