@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.
Files changed (41) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +385 -0
  3. package/dist/decoration.cjs +649 -0
  4. package/dist/decoration.esm.cjs +633 -0
  5. package/lib/constants.cjs +64 -0
  6. package/lib/constants.d.ts +58 -0
  7. package/lib/decoration/Decoration.cjs +270 -0
  8. package/lib/decoration/Decoration.d.ts +196 -0
  9. package/lib/decoration/index.cjs +19 -0
  10. package/lib/decoration/index.d.ts +2 -0
  11. package/lib/decoration/types.cjs +3 -0
  12. package/lib/decoration/types.d.ts +95 -0
  13. package/lib/decorators.cjs +97 -0
  14. package/lib/decorators.d.ts +57 -0
  15. package/lib/esm/constants.d.ts +58 -0
  16. package/lib/esm/constants.js +61 -0
  17. package/lib/esm/decoration/Decoration.d.ts +196 -0
  18. package/lib/esm/decoration/Decoration.js +266 -0
  19. package/lib/esm/decoration/index.d.ts +2 -0
  20. package/lib/esm/decoration/index.js +3 -0
  21. package/lib/esm/decoration/types.d.ts +95 -0
  22. package/lib/esm/decoration/types.js +2 -0
  23. package/lib/esm/decorators.d.ts +57 -0
  24. package/lib/esm/decorators.js +90 -0
  25. package/lib/esm/index.d.ts +21 -0
  26. package/lib/esm/index.js +22 -0
  27. package/lib/esm/metadata/Metadata.d.ts +99 -0
  28. package/lib/esm/metadata/Metadata.js +199 -0
  29. package/lib/esm/metadata/index.d.ts +2 -0
  30. package/lib/esm/metadata/index.js +3 -0
  31. package/lib/esm/metadata/types.d.ts +16 -0
  32. package/lib/esm/metadata/types.js +2 -0
  33. package/lib/index.cjs +39 -0
  34. package/lib/index.d.ts +21 -0
  35. package/lib/metadata/Metadata.cjs +203 -0
  36. package/lib/metadata/Metadata.d.ts +99 -0
  37. package/lib/metadata/index.cjs +19 -0
  38. package/lib/metadata/index.d.ts +2 -0
  39. package/lib/metadata/types.cjs +4 -0
  40. package/lib/metadata/types.d.ts +16 -0
  41. package/package.json +114 -0
@@ -0,0 +1,99 @@
1
+ import { BasicMetadata, Constructor } from "./types";
2
+ import { DecorationKeys } from "../constants";
3
+ import "reflect-metadata";
4
+ /**
5
+ * @description Centralized runtime metadata store bound to constructors
6
+ * @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.
7
+ * @template M The model type the metadata belongs to
8
+ * @template META Extends BasicMetadata<M> representing the metadata structure
9
+ * @class
10
+ * @example
11
+ * // Define and read metadata for a class
12
+ * class User { name!: string }
13
+ * Metadata.set(User, "description.class", "A user model");
14
+ * Metadata.set(User, "properties.name", String);
15
+ * const desc = Metadata.get(User, "description.class"); // "A user model"
16
+ * const type = Metadata.type(User, "name"); // String
17
+ * @mermaid
18
+ * sequenceDiagram
19
+ * participant C as Constructor
20
+ * participant S as Metadata (static)
21
+ * C->>S: set(User, "properties.name", String)
22
+ * C->>S: get(User, "properties.name")
23
+ * S-->>C: String
24
+ */
25
+ export declare class Metadata {
26
+ /**
27
+ * @description In-memory storage of metadata by constructor symbol
28
+ * @summary Maps a Symbol derived from the constructor to its metadata object, enabling efficient lookup.
29
+ */
30
+ private static _metadata;
31
+ /**
32
+ * @description Path delimiter for nested metadata keys
33
+ * @summary Used by get/set operations to navigate nested structures, defaults to ObjectKeySplitter.
34
+ */
35
+ static splitter: string;
36
+ /**
37
+ * @description Symbol key used to mirror metadata on the constructor
38
+ * @summary When mirroring is enabled, the metadata object is defined on the constructor under this non-enumerable key.
39
+ */
40
+ static baseKey: DecorationKeys;
41
+ /**
42
+ * @description Controls whether metadata is mirrored onto the constructor
43
+ * @summary When true, the metadata object is defined on the constructor under the non-enumerable baseKey.
44
+ */
45
+ static mirror: boolean;
46
+ private constructor();
47
+ /**
48
+ * @description Lists known property keys for a model
49
+ * @summary Reads the metadata entry and returns the names of properties that have recorded type information.
50
+ * @param {Constructor} model The target constructor
51
+ * @return {string[]|undefined} Array of property names or undefined if no metadata exists
52
+ */
53
+ static properties(model: Constructor): string[] | undefined;
54
+ /**
55
+ * @description Retrieves a human-readable description for a class or a property
56
+ * @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.
57
+ * @template M
58
+ * @param {Constructor<M>} model The target constructor whose description is being retrieved
59
+ * @param {string} [prop] Optional property key for which to fetch the description
60
+ * @return {string|undefined} The description text if present, otherwise undefined
61
+ */
62
+ static description<M>(model: Constructor<M>, prop?: keyof M): any;
63
+ /**
64
+ * @description Retrieves the recorded design type for a property
65
+ * @summary Reads the metadata entry under "properties.<prop>" to return the constructor recorded for the given property name.
66
+ * @param {Constructor} model The target constructor
67
+ * @param {string} prop The property name whose type should be returned
68
+ * @return {Constructor|undefined} The constructor reference of the property type or undefined if not available
69
+ */
70
+ static type(model: Constructor, prop: string): any;
71
+ /**
72
+ * @description Retrieves metadata for a model or a specific key within it
73
+ * @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.
74
+ * @template M
75
+ * @template META
76
+ * @param {Constructor<M>} model The target constructor used to locate the metadata record
77
+ * @return {META|undefined} The metadata object, the value at the key path, or undefined if nothing exists
78
+ */
79
+ static get<M, META extends BasicMetadata<M> = BasicMetadata<M>>(model: Constructor<M>): META | undefined;
80
+ /**
81
+ * @description Retrieves metadata for a model or a specific key within it
82
+ * @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.
83
+ * @template M
84
+ * @template META
85
+ * @param {Constructor<M>} model The target constructor used to locate the metadata record
86
+ * @param {string} key nested key path to fetch a specific value
87
+ * @return {META|*|undefined} The metadata object, the value at the key path, or undefined if nothing exists
88
+ */
89
+ static get(model: Constructor, key: string): any;
90
+ /**
91
+ * @description Writes a metadata value at a given nested key path
92
+ * @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.
93
+ * @param {Constructor} model The target constructor to which the metadata belongs
94
+ * @param {string} key The nested key path at which to store the value
95
+ * @param {*} value The value to store in the metadata
96
+ * @return {void}
97
+ */
98
+ static set(model: Constructor, key: string, value: any): void;
99
+ }
@@ -0,0 +1,199 @@
1
+ import { DecorationKeys, ObjectKeySplitter } from "./../constants.js";
2
+ import "reflect-metadata";
3
+ /**
4
+ * @description Retrieves a nested value from an object given a path
5
+ * @summary Walks an object structure using a splitter-delimited path and returns the value at that location or undefined if any key is missing.
6
+ * @param {Record<string, any>} obj The object to traverse
7
+ * @param {string} path The path to the desired value (e.g., "a.b.c")
8
+ * @param {string} [splitter=ObjectKeySplitter] The delimiter used to split the path
9
+ * @return {*} The resolved value at the given path or undefined if not found
10
+ * @function getValueBySplitter
11
+ * @mermaid
12
+ * sequenceDiagram
13
+ * participant C as Caller
14
+ * participant F as getValueBySplitter
15
+ * participant O as Object
16
+ * C->>F: (obj, path, splitter)
17
+ * F->>F: split path into keys
18
+ * loop for each key
19
+ * F->>O: access current[key]
20
+ * alt missing or nullish
21
+ * F-->>C: return undefined
22
+ * end
23
+ * end
24
+ * F-->>C: return final value
25
+ * @memberOf module:decoration
26
+ */
27
+ function getValueBySplitter(obj, path, splitter = ObjectKeySplitter) {
28
+ const keys = path.split(splitter);
29
+ let current = obj;
30
+ for (const key of keys) {
31
+ if (current === null ||
32
+ current === undefined ||
33
+ !Object.prototype.hasOwnProperty.call(current, key))
34
+ return undefined;
35
+ current = current[key];
36
+ }
37
+ return current;
38
+ }
39
+ /**
40
+ * @description Sets a nested value on an object given a path
41
+ * @summary Traverses or creates intermediate objects following a splitter-delimited path and assigns the provided value at the destination key.
42
+ * @param {Record<string, any>} obj The object to mutate
43
+ * @param {string} path The destination path (e.g., "a.b.c")
44
+ * @param {*} value The value to set at the destination
45
+ * @param {string} [splitter=ObjectKeySplitter] The delimiter used to split the path
46
+ * @return {void}
47
+ * @function setValueBySplitter
48
+ * @mermaid
49
+ * sequenceDiagram
50
+ * participant C as Caller
51
+ * participant F as setValueBySplitter
52
+ * participant O as Object
53
+ * C->>F: (obj, path, value, splitter)
54
+ * F->>F: split path into keys
55
+ * loop for each key
56
+ * alt key missing
57
+ * F->>O: create intermediate object
58
+ * else key exists
59
+ * F->>O: descend into existing object
60
+ * end
61
+ * end
62
+ * F-->>C: void
63
+ * @memberOf module:decoration
64
+ */
65
+ function setValueBySplitter(obj, path, value, splitter = ObjectKeySplitter) {
66
+ const keys = path.split(splitter).filter((k) => k.length > 0);
67
+ if (keys.length === 0)
68
+ return;
69
+ let current = obj;
70
+ for (let i = 0; i < keys.length - 1; i++) {
71
+ const key = keys[i];
72
+ if (current[key] === undefined ||
73
+ current[key] === null ||
74
+ typeof current[key] !== "object") {
75
+ current[key] = {};
76
+ }
77
+ current = current[key];
78
+ }
79
+ const lastKey = keys[keys.length - 1];
80
+ current[lastKey] = value;
81
+ }
82
+ /**
83
+ * @description Centralized runtime metadata store bound to constructors
84
+ * @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.
85
+ * @template M The model type the metadata belongs to
86
+ * @template META Extends BasicMetadata<M> representing the metadata structure
87
+ * @class
88
+ * @example
89
+ * // Define and read metadata for a class
90
+ * class User { name!: string }
91
+ * Metadata.set(User, "description.class", "A user model");
92
+ * Metadata.set(User, "properties.name", String);
93
+ * const desc = Metadata.get(User, "description.class"); // "A user model"
94
+ * const type = Metadata.type(User, "name"); // String
95
+ * @mermaid
96
+ * sequenceDiagram
97
+ * participant C as Constructor
98
+ * participant S as Metadata (static)
99
+ * C->>S: set(User, "properties.name", String)
100
+ * C->>S: get(User, "properties.name")
101
+ * S-->>C: String
102
+ */
103
+ export class Metadata {
104
+ /**
105
+ * @description In-memory storage of metadata by constructor symbol
106
+ * @summary Maps a Symbol derived from the constructor to its metadata object, enabling efficient lookup.
107
+ */
108
+ static { this._metadata = {}; }
109
+ /**
110
+ * @description Path delimiter for nested metadata keys
111
+ * @summary Used by get/set operations to navigate nested structures, defaults to ObjectKeySplitter.
112
+ */
113
+ static { this.splitter = ObjectKeySplitter; }
114
+ /**
115
+ * @description Symbol key used to mirror metadata on the constructor
116
+ * @summary When mirroring is enabled, the metadata object is defined on the constructor under this non-enumerable key.
117
+ */
118
+ static { this.baseKey = DecorationKeys.REFLECT; }
119
+ /**
120
+ * @description Controls whether metadata is mirrored onto the constructor
121
+ * @summary When true, the metadata object is defined on the constructor under the non-enumerable baseKey.
122
+ */
123
+ static { this.mirror = true; }
124
+ constructor() { }
125
+ /**
126
+ * @description Lists known property keys for a model
127
+ * @summary Reads the metadata entry and returns the names of properties that have recorded type information.
128
+ * @param {Constructor} model The target constructor
129
+ * @return {string[]|undefined} Array of property names or undefined if no metadata exists
130
+ */
131
+ static properties(model) {
132
+ const meta = this.get(model);
133
+ if (!meta)
134
+ return undefined;
135
+ return Object.keys(meta.properties);
136
+ }
137
+ /**
138
+ * @description Retrieves a human-readable description for a class or a property
139
+ * @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.
140
+ * @template M
141
+ * @param {Constructor<M>} model The target constructor whose description is being retrieved
142
+ * @param {string} [prop] Optional property key for which to fetch the description
143
+ * @return {string|undefined} The description text if present, otherwise undefined
144
+ */
145
+ static description(model, prop) {
146
+ return this.get(model, [DecorationKeys.DESCRIPTION, prop ? prop : DecorationKeys.CLASS].join(ObjectKeySplitter));
147
+ }
148
+ /**
149
+ * @description Retrieves the recorded design type for a property
150
+ * @summary Reads the metadata entry under "properties.<prop>" to return the constructor recorded for the given property name.
151
+ * @param {Constructor} model The target constructor
152
+ * @param {string} prop The property name whose type should be returned
153
+ * @return {Constructor|undefined} The constructor reference of the property type or undefined if not available
154
+ */
155
+ static type(model, prop) {
156
+ return this.get(model, `${DecorationKeys.PROPERTIES}.${prop}`);
157
+ }
158
+ /**
159
+ * @description Retrieves metadata for a model or a specific key within it
160
+ * @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.
161
+ * @template M
162
+ * @template META
163
+ * @param {Constructor<M>} model The target constructor used to locate the metadata record
164
+ * @param {string} [key] Optional nested key path to fetch a specific value
165
+ * @return {META|*|undefined} The metadata object, the value at the key path, or undefined if nothing exists
166
+ */
167
+ static get(model, key) {
168
+ const symbol = Symbol.for(model.toString());
169
+ if (!this._metadata[symbol])
170
+ return undefined;
171
+ if (!key)
172
+ return this._metadata[symbol];
173
+ return getValueBySplitter(this._metadata[symbol], key, this.splitter);
174
+ }
175
+ /**
176
+ * @description Writes a metadata value at a given nested key path
177
+ * @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.
178
+ * @param {Constructor} model The target constructor to which the metadata belongs
179
+ * @param {string} key The nested key path at which to store the value
180
+ * @param {*} value The value to store in the metadata
181
+ * @return {void}
182
+ */
183
+ static set(model, key, value) {
184
+ const symbol = Symbol.for(model.toString());
185
+ if (!this._metadata[symbol])
186
+ this._metadata[symbol] = {};
187
+ if (Metadata.mirror &&
188
+ !Object.prototype.hasOwnProperty.call(model, this.baseKey)) {
189
+ Object.defineProperty(model, this.baseKey, {
190
+ enumerable: false,
191
+ configurable: false,
192
+ writable: false,
193
+ value: this._metadata[symbol],
194
+ });
195
+ }
196
+ setValueBySplitter(this._metadata[symbol], key, value, this.splitter);
197
+ }
198
+ }
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0YWRhdGEvTWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSwwQkFBcUI7QUFDakUsT0FBTyxrQkFBa0IsQ0FBQztBQUUxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixHQUF3QixFQUN4QixJQUFZLEVBQ1osV0FBbUIsaUJBQWlCO0lBRXBDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBRWxCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFDRSxPQUFPLEtBQUssSUFBSTtZQUNoQixPQUFPLEtBQUssU0FBUztZQUNyQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBRW5ELE9BQU8sU0FBUyxDQUFDO1FBQ25CLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLEdBQXdCLEVBQ3hCLElBQVksRUFDWixLQUFVLEVBQ1YsUUFBUSxHQUFHLGlCQUFpQjtJQUU1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztR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QU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFTLENBQUM7UUFDaEUsSUFDRSxRQUFRLENBQUMsTUFBTTtZQUNmLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQzFELENBQUM7WUFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN6QyxVQUFVLEVBQUUsS0FBSztnQkFDakIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxLQUFLO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQzthQUM5QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0Qsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzaWNNZXRhZGF0YSwgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbktleXMsIE9iamVjdEtleVNwbGl0dGVyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBuZXN0ZWQgdmFsdWUgZnJvbSBhbiBvYmplY3QgZ2l2ZW4gYSBwYXRoXG4gKiBAc3VtbWFyeSBXYWxrcyBhbiBvYmplY3Qgc3RydWN0dXJlIHVzaW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIHJldHVybnMgdGhlIHZhbHVlIGF0IHRoYXQgbG9jYXRpb24gb3IgdW5kZWZpbmVkIGlmIGFueSBrZXkgaXMgbWlzc2luZy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIFRoZSBvYmplY3QgdG8gdHJhdmVyc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBkZXNpcmVkIHZhbHVlIChlLmcuLCBcImEuYi5jXCIpXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBUaGUgZGVsaW1pdGVyIHVzZWQgdG8gc3BsaXQgdGhlIHBhdGhcbiAqIEByZXR1cm4geyp9IFRoZSByZXNvbHZlZCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gKiBAZnVuY3Rpb24gZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCBzcGxpdHRlcilcbiAqICAgRi0+PkY6IHNwbGl0IHBhdGggaW50byBrZXlzXG4gKiAgIGxvb3AgZm9yIGVhY2gga2V5XG4gKiAgICAgRi0+Pk86IGFjY2VzcyBjdXJyZW50W2tleV1cbiAqICAgICBhbHQgbWlzc2luZyBvciBudWxsaXNoXG4gKiAgICAgICBGLS0+PkM6IHJldHVybiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+QzogcmV0dXJuIGZpbmFsIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVCeVNwbGl0dGVyKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgc3BsaXR0ZXI6IHN0cmluZyA9IE9iamVjdEtleVNwbGl0dGVyXG4pOiBhbnkge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcik7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoXG4gICAgICBjdXJyZW50ID09PSBudWxsIHx8XG4gICAgICBjdXJyZW50ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KVxuICAgIClcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIGEgbmVzdGVkIHZhbHVlIG9uIGFuIG9iamVjdCBnaXZlbiBhIHBhdGhcbiAqIEBzdW1tYXJ5IFRyYXZlcnNlcyBvciBjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzIGZvbGxvd2luZyBhIHNwbGl0dGVyLWRlbGltaXRlZCBwYXRoIGFuZCBhc3NpZ25zIHRoZSBwcm92aWRlZCB2YWx1ZSBhdCB0aGUgZGVzdGluYXRpb24ga2V5LlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogVGhlIG9iamVjdCB0byBtdXRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBkZXN0aW5hdGlvbiBwYXRoIChlLmcuLCBcImEuYi5jXCIpXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGRlc3RpbmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBUaGUgZGVsaW1pdGVyIHVzZWQgdG8gc3BsaXQgdGhlIHBhdGhcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCB2YWx1ZSwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIGFsdCBrZXkgbWlzc2luZ1xuICogICAgICAgRi0+Pk86IGNyZWF0ZSBpbnRlcm1lZGlhdGUgb2JqZWN0XG4gKiAgICAgZWxzZSBrZXkgZXhpc3RzXG4gKiAgICAgICBGLT4+TzogZGVzY2VuZCBpbnRvIGV4aXN0aW5nIG9iamVjdFxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRi0tPj5DOiB2b2lkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbiAgc3BsaXR0ZXIgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogdm9pZCB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKS5maWx0ZXIoKGspID0+IGsubGVuZ3RoID4gMCk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGxldCBjdXJyZW50OiBSZWNvcmQ8YW55LCBhbnk+ID0gb2JqO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnRba2V5XSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBjdXJyZW50W2tleV0gPT09IG51bGwgfHxcbiAgICAgIHR5cGVvZiBjdXJyZW50W2tleV0gIT09IFwib2JqZWN0XCJcbiAgICApIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgY29uc3QgbGFzdEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgY3VycmVudFtsYXN0S2V5XSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDZW50cmFsaXplZCBydW50aW1lIG1ldGFkYXRhIHN0b3JlIGJvdW5kIHRvIGNvbnN0cnVjdG9yc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgdXRpbGl0aWVzIHRvIHJlYWQgYW5kIHdyaXRlIHN0cnVjdHVyZWQgbWV0YWRhdGEgZm9yIGNsYXNzZXMgYW5kIHRoZWlyIG1lbWJlcnMsIHdpdGggb3B0aW9uYWwgbWlycm9yaW5nIG9udG8gdGhlIGNvbnN0cnVjdG9yIHZpYSBhIHdlbGwta25vd24gc3ltYm9sIGtleS4gU3VwcG9ydHMgbmVzdGVkIGtleSBwYXRocyB1c2luZyBhIGNvbmZpZ3VyYWJsZSBzcGxpdHRlciBhbmQgb2ZmZXJzIGJvdGggaW5zdGFuY2UgYW5kIHN0YXRpYyBBUElzLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhlIG1ldGFkYXRhIGJlbG9uZ3MgdG9cbiAqIEB0ZW1wbGF0ZSBNRVRBIEV4dGVuZHMgQmFzaWNNZXRhZGF0YTxNPiByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIHN0cnVjdHVyZVxuICogQGNsYXNzXG4gKiBAZXhhbXBsZVxuICogLy8gRGVmaW5lIGFuZCByZWFkIG1ldGFkYXRhIGZvciBhIGNsYXNzXG4gKiBjbGFzcyBVc2VyIHsgbmFtZSE6IHN0cmluZyB9XG4gKiBNZXRhZGF0YS5zZXQoVXNlciwgXCJkZXNjcmlwdGlvbi5jbGFzc1wiLCBcIkEgdXNlciBtb2RlbFwiKTtcbiAqIE1ldGFkYXRhLnNldChVc2VyLCBcInByb3BlcnRpZXMubmFtZVwiLCBTdHJpbmcpO1xuICogY29uc3QgZGVzYyA9IE1ldGFkYXRhLmdldChVc2VyLCBcImRlc2NyaXB0aW9uLmNsYXNzXCIpOyAvLyBcIkEgdXNlciBtb2RlbFwiXG4gKiBjb25zdCB0eXBlID0gTWV0YWRhdGEudHlwZShVc2VyLCBcIm5hbWVcIik7IC8vIFN0cmluZ1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnN0cnVjdG9yXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgTWV0YWRhdGEgKHN0YXRpYylcbiAqICAgQy0+PlM6IHNldChVc2VyLCBcInByb3BlcnRpZXMubmFtZVwiLCBTdHJpbmcpXG4gKiAgIEMtPj5TOiBnZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIilcbiAqICAgUy0tPj5DOiBTdHJpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbi1tZW1vcnkgc3RvcmFnZSBvZiBtZXRhZGF0YSBieSBjb25zdHJ1Y3RvciBzeW1ib2xcbiAgICogQHN1bW1hcnkgTWFwcyBhIFN5bWJvbCBkZXJpdmVkIGZyb20gdGhlIGNvbnN0cnVjdG9yIHRvIGl0cyBtZXRhZGF0YSBvYmplY3QsIGVuYWJsaW5nIGVmZmljaWVudCBsb29rdXAuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfbWV0YWRhdGE6IFJlY29yZDxzeW1ib2wsIGFueT4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdGggZGVsaW1pdGVyIGZvciBuZXN0ZWQgbWV0YWRhdGEga2V5c1xuICAgKiBAc3VtbWFyeSBVc2VkIGJ5IGdldC9zZXQgb3BlcmF0aW9ucyB0byBuYXZpZ2F0ZSBuZXN0ZWQgc3RydWN0dXJlcywgZGVmYXVsdHMgdG8gT2JqZWN0S2V5U3BsaXR0ZXIuXG4gICAqL1xuICBzdGF0aWMgc3BsaXR0ZXIgPSBPYmplY3RLZXlTcGxpdHRlcjtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTeW1ib2wga2V5IHVzZWQgdG8gbWlycm9yIG1ldGFkYXRhIG9uIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBAc3VtbWFyeSBXaGVuIG1pcnJvcmluZyBpcyBlbmFibGVkLCB0aGUgbWV0YWRhdGEgb2JqZWN0IGlzIGRlZmluZWQgb24gdGhlIGNvbnN0cnVjdG9yIHVuZGVyIHRoaXMgbm9uLWVudW1lcmFibGUga2V5LlxuICAgKi9cbiAgc3RhdGljIGJhc2VLZXkgPSBEZWNvcmF0aW9uS2V5cy5SRUZMRUNUO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgbWV0YWRhdGEgaXMgbWlycm9yZWQgb250byB0aGUgY29uc3RydWN0b3JcbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgbWV0YWRhdGEgb2JqZWN0IGlzIGRlZmluZWQgb24gdGhlIGNvbnN0cnVjdG9yIHVuZGVyIHRoZSBub24tZW51bWVyYWJsZSBiYXNlS2V5LlxuICAgKi9cbiAgc3RhdGljIG1pcnJvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyBrbm93biBwcm9wZXJ0eSBrZXlzIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSBhbmQgcmV0dXJucyB0aGUgbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGhhdmUgcmVjb3JkZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGhlIHRhcmdldCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIHVuZGVmaW5lZCBpZiBubyBtZXRhZGF0YSBleGlzdHNcbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5wcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIGEgY2xhc3Mgb3IgYSBwcm9wZXJ0eVxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCB0aGUgZGVzY3JpcHRpb24gc3RvcmVkIHVuZGVyIHRoZSBtZXRhZGF0YSBcImRlc2NyaXB0aW9uXCIgbWFwLiBJZiBhIHByb3BlcnR5IGtleSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgcHJvcGVydHkncyBkZXNjcmlwdGlvbjsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUaGUgdGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIGRlc2NyaXB0aW9uIGlzIGJlaW5nIHJldHJpZXZlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BdIE9wdGlvbmFsIHByb3BlcnR5IGtleSBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIGRlc2NyaXB0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IFRoZSBkZXNjcmlwdGlvbiB0ZXh0IGlmIHByZXNlbnQsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAgICovXG4gIHN0YXRpYyBkZXNjcmlwdGlvbjxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4sIHByb3A/OiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04sIHByb3AgPyBwcm9wIDogRGVjb3JhdGlvbktleXMuQ0xBU1NdLmpvaW4oXG4gICAgICAgIE9iamVjdEtleVNwbGl0dGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCBkZXNpZ24gdHlwZSBmb3IgYSBwcm9wZXJ0eVxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgXCJwcm9wZXJ0aWVzLjxwcm9wPlwiIHRvIHJldHVybiB0aGUgY29uc3RydWN0b3IgcmVjb3JkZWQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUaGUgdGFyZ2V0IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSBuYW1lIHdob3NlIHR5cGUgc2hvdWxkIGJlIHJldHVybmVkXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yfHVuZGVmaW5lZH0gVGhlIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBvZiB0aGUgcHJvcGVydHkgdHlwZSBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgKi9cbiAgc3RhdGljIHR5cGUobW9kZWw6IENvbnN0cnVjdG9yLCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQobW9kZWwsIGAke0RlY29yYXRpb25LZXlzLlBST1BFUlRJRVN9LiR7cHJvcH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdFxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRoZSB0YXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZFxuICAgKiBAcmV0dXJuIHtNRVRBfHVuZGVmaW5lZH0gVGhlIG1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgdW5kZWZpbmVkIGlmIG5vdGhpbmcgZXhpc3RzXG4gICAqL1xuICBzdGF0aWMgZ2V0PE0sIE1FVEEgZXh0ZW5kcyBCYXNpY01ldGFkYXRhPE0+ID0gQmFzaWNNZXRhZGF0YTxNPj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IE1FVEEgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdFxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRoZSB0YXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IG5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlXG4gICAqIEByZXR1cm4ge01FVEF8Knx1bmRlZmluZWR9IFRoZSBtZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBub3RoaW5nIGV4aXN0c1xuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleTogc3RyaW5nKTogYW55O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBtb2RlbCBvciBhIHNwZWNpZmljIGtleSB3aXRoaW4gaXRcbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUaGUgdGFyZ2V0IGNvbnN0cnVjdG9yIHVzZWQgdG8gbG9jYXRlIHRoZSBtZXRhZGF0YSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIE9wdGlvbmFsIG5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlXG4gICAqIEByZXR1cm4ge01FVEF8Knx1bmRlZmluZWR9IFRoZSBtZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBub3RoaW5nIGV4aXN0c1xuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleT86IHN0cmluZykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXTtcbiAgICByZXR1cm4gZ2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdGhpcy5zcGxpdHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdyaXRlcyBhIG1ldGFkYXRhIHZhbHVlIGF0IGEgZ2l2ZW4gbmVzdGVkIGtleSBwYXRoXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhlIG1ldGFkYXRhIHJlY29yZCBleGlzdHMgZm9yIHRoZSBjb25zdHJ1Y3RvciwgbWlycm9ycyBpdCBvbiB0aGUgY29uc3RydWN0b3Igd2hlbiBlbmFibGVkLCBhbmQgc2V0cyB0aGUgcHJvdmlkZWQgdmFsdWUgb24gdGhlIG5lc3RlZCBrZXkgcGF0aCB1c2luZyB0aGUgY29uZmlndXJlZCBzcGxpdHRlci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGhlIHRhcmdldCBjb25zdHJ1Y3RvciB0byB3aGljaCB0aGUgbWV0YWRhdGEgYmVsb25nc1xuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBuZXN0ZWQga2V5IHBhdGggYXQgd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBtZXRhZGF0YVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3IsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0gPSB7fSBhcyBhbnk7XG4gICAgaWYgKFxuICAgICAgTWV0YWRhdGEubWlycm9yICYmXG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCB0aGlzLmJhc2VLZXkpXG4gICAgKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIHRoaXMuYmFzZUtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB2YWx1ZSwgdGhpcy5zcGxpdHRlcik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from "./Metadata";
2
+ export * from "./types";
@@ -0,0 +1,3 @@
1
+ export * from "./Metadata.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0YWRhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQTJCO0FBQzNCLDJCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL01ldGFkYXRhXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuIl19
@@ -0,0 +1,16 @@
1
+ import { DecorationKeys } from "../constants";
2
+ export type BasicMetadata<M> = {
3
+ [DecorationKeys.CLASS]: Constructor<M>;
4
+ [DecorationKeys.DESCRIPTION]?: Record<keyof M | `${DecorationKeys.CLASS}`, string>;
5
+ [DecorationKeys.PROPERTIES]: Record<keyof M, Constructor<M> | undefined>;
6
+ };
7
+ /**
8
+ * @description Constructor type for creating instances of a given object type
9
+ * @summary Defines a generic constructor signature that can instantiate objects of type OBJ with any arguments.
10
+ * @template OBJ
11
+ * @typedef {Constructor<OBJ>} Constructor
12
+ * @memberOf module:decoration
13
+ */
14
+ export type Constructor<OBJ = any> = {
15
+ new (...args: any[]): OBJ;
16
+ };
@@ -0,0 +1,2 @@
1
+ import { DecorationKeys } from "./../constants.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0YWRhdGEvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSwwQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IHR5cGUgQmFzaWNNZXRhZGF0YTxNPiA9IHtcbiAgW0RlY29yYXRpb25LZXlzLkNMQVNTXTogQ29uc3RydWN0b3I8TT47XG4gIFtEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTl0/OiBSZWNvcmQ8XG4gICAga2V5b2YgTSB8IGAke0RlY29yYXRpb25LZXlzLkNMQVNTfWAsXG4gICAgc3RyaW5nXG4gID47XG4gIFtEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTXTogUmVjb3JkPGtleW9mIE0sIENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkPjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHR5cGUgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBhIGdpdmVuIG9iamVjdCB0eXBlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZ2VuZXJpYyBjb25zdHJ1Y3RvciBzaWduYXR1cmUgdGhhdCBjYW4gaW5zdGFudGlhdGUgb2JqZWN0cyBvZiB0eXBlIE9CSiB3aXRoIGFueSBhcmd1bWVudHMuXG4gKiBAdGVtcGxhdGUgT0JKXG4gKiBAdHlwZWRlZiB7Q29uc3RydWN0b3I8T0JKPn0gQ29uc3RydWN0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxPQkogPSBhbnk+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogT0JKIH07XG4iXX0=
package/lib/index.cjs ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * @description Root entry point for the decoration module
4
+ * @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:
5
+ * - Core builder: {@link Decoration}
6
+ * - Decorator utilities: {@link module:decoration | decorators in ./decorators}
7
+ * - Metadata utilities: {@link Metadata}
8
+ * - Constants and enums: {@link DecorationKeys}, {@link DefaultFlavour}
9
+ *
10
+ * @module decoration
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
24
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.VERSION = void 0;
28
+ __exportStar(require("./decoration/index.cjs"), exports);
29
+ __exportStar(require("./metadata/index.cjs"), exports);
30
+ __exportStar(require("./constants.cjs"), exports);
31
+ __exportStar(require("./decorators.cjs"), exports);
32
+ /**
33
+ * @description Current version of the reflection package
34
+ * @summary Stores the semantic version number of the package
35
+ * @const VERSION
36
+ * @memberOf module:decoration
37
+ */
38
+ exports.VERSION = "0.0.2";
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCx5REFBNkI7QUFDN0IsdURBQTJCO0FBQzNCLGtEQUE0QjtBQUM1QixtREFBNkI7QUFFN0I7Ozs7O0dBS0c7QUFDVSxRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSb290IGVudHJ5IHBvaW50IGZvciB0aGUgZGVjb3JhdGlvbiBtb2R1bGVcbiAqIEBzdW1tYXJ5IEFnZ3JlZ2F0ZXMgYW5kIHJlLWV4cG9ydHMgdGhlIHB1YmxpYyBBUEkgb2YgdGhlIGRlY29yYXRpb24gbGlicmFyeSwgaW5jbHVkaW5nIGNvcmUgY2xhc3NlcyBsaWtlIHtAbGluayBEZWNvcmF0aW9ufSwgdXRpbGl0eSBkZWNvcmF0b3JzLCBtZXRhZGF0YSBoZWxwZXJzLCBhbmQgY29uc3RhbnRzLiBUaGlzIG1vZHVsZSBpcyB0aGUgcHJpbWFyeSBpbXBvcnQgc3VyZmFjZSBmb3IgY29uc3VtZXJzIGFuZCBleHBvc2VzOlxuICogLSBDb3JlIGJ1aWxkZXI6IHtAbGluayBEZWNvcmF0aW9ufVxuICogLSBEZWNvcmF0b3IgdXRpbGl0aWVzOiB7QGxpbmsgbW9kdWxlOmRlY29yYXRpb24gfCBkZWNvcmF0b3JzIGluIC4vZGVjb3JhdG9yc31cbiAqIC0gTWV0YWRhdGEgdXRpbGl0aWVzOiB7QGxpbmsgTWV0YWRhdGF9XG4gKiAtIENvbnN0YW50cyBhbmQgZW51bXM6IHtAbGluayBEZWNvcmF0aW9uS2V5c30sIHtAbGluayBEZWZhdWx0Rmxhdm91cn1cbiAqXG4gKiBAbW9kdWxlIGRlY29yYXRpb25cbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
package/lib/index.d.ts ADDED
@@ -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";