@decaf-ts/ui-decorators 0.5.14 → 0.5.16

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.
@@ -1,3 +1,4 @@
1
+ import { UIMediaBreakPoints } from "../ui/types";
1
2
  /**
2
3
  * @description Decorator that tags a class as a UI model
3
4
  * @summary Adds rendering capabilities to a model class by providing a render method
@@ -121,4 +122,116 @@ export declare function renderedBy(engine: string): (target: object, propertyKey
121
122
  * RenderingEngine->>System: renders with list item styling
122
123
  */
123
124
  export declare function uilistitem(tag?: string, props?: Record<string, any>): (original: any, propertyKey?: any) => void;
125
+ /**
126
+ * @description Decorator that adds event handlers to a UI model
127
+ * @summary Specifies event handlers that should be attached to the rendered model
128
+ * This decorator allows you to define event handlers that will be automatically
129
+ * attached to the rendered UI element. The handlers are passed as properties
130
+ * to the rendering engine.
131
+ *
132
+ * @param {Record<string, any>} [props] Object containing event handler functions and other properties
133
+ * @return {Function} A class decorator function
134
+ *
135
+ * @function uihandlers
136
+ * @category Class Decorators
137
+ *
138
+ * @example
139
+ * // Add event handlers to a model
140
+ * @uimodel('button')
141
+ * @uihandlers({
142
+ * onClick: (event) => console.log('Button clicked'),
143
+ * onMouseOver: (event) => console.log('Mouse over button'),
144
+ * disabled: false
145
+ * })
146
+ * class ClickableButton extends Model {
147
+ * @attribute()
148
+ * label: string;
149
+ * }
150
+ *
151
+ * // Add form submission handlers
152
+ * @uimodel('form')
153
+ * @uihandlers({
154
+ * onSubmit: (event) => {
155
+ * event.preventDefault();
156
+ * console.log('Form submitted');
157
+ * },
158
+ * onReset: (event) => console.log('Form reset')
159
+ * })
160
+ * class ContactForm extends Model {
161
+ * @attribute()
162
+ * email: string;
163
+ * }
164
+ *
165
+ * @mermaid
166
+ * sequenceDiagram
167
+ * participant System
168
+ * participant uihandlers
169
+ * participant Model
170
+ * participant RenderingEngine
171
+ * participant UI
172
+ * System->>uihandlers: apply to Model
173
+ * uihandlers->>Model: adds handler metadata
174
+ * Model->>RenderingEngine: requests rendering with handlers
175
+ * RenderingEngine->>UI: renders element with event handlers attached
176
+ * UI->>Model: triggers handlers on events
177
+ */
124
178
  export declare function uihandlers(props?: Record<string, any>): (original: any) => void;
179
+ /**
180
+ * @description Decorator that creates a layout container with grid specifications
181
+ * @summary Combines UI model functionality with layout grid configuration
182
+ * This decorator creates a UI model that acts as a layout container with specified
183
+ * column and row configurations. It's a convenience decorator that combines
184
+ * @uimodel with layout-specific properties for responsive grid layouts.
185
+ *
186
+ * @param {string} tag The HTML tag to use for the layout container
187
+ * @param {number} [cols=1] Number of columns in the grid layout
188
+ * @param {number|string[]} [rows=1] Number of rows or array of row definitions
189
+ * @param {UIMediaBreakPoints} [breakpoint='m'] Media breakpoint for responsive behavior
190
+ * @return {Function} A class decorator function
191
+ *
192
+ * @function uilayout
193
+ * @category Class Decorators
194
+ *
195
+ * @example
196
+ * // Create a simple 2-column layout
197
+ * @uilayout('div', 2, 3)
198
+ * class TwoColumnLayout extends Model {
199
+ * @attribute()
200
+ * @uilayoutitem(1, 1)
201
+ * header: string;
202
+ *
203
+ * @attribute()
204
+ * @uilayoutitem(1, 2)
205
+ * leftContent: string;
206
+ *
207
+ * @attribute()
208
+ * @uilayoutitem(2, 2)
209
+ * rightContent: string;
210
+ * }
211
+ *
212
+ * // Create a responsive layout with custom breakpoint
213
+ * @uilayout('section', 3, 2, 'l')
214
+ * class ResponsiveLayout extends Model {
215
+ * @attribute()
216
+ * @uilayoutitem(1, 1)
217
+ * title: string;
218
+ *
219
+ * @attribute()
220
+ * @uilayoutitem(2, 1)
221
+ * subtitle: string;
222
+ * }
223
+ *
224
+ * @mermaid
225
+ * sequenceDiagram
226
+ * participant System
227
+ * participant uilayout
228
+ * participant uimodel
229
+ * participant Model
230
+ * participant RenderingEngine
231
+ * System->>uilayout: apply to Model
232
+ * uilayout->>uimodel: call with layout props
233
+ * uimodel->>Model: adds model metadata with layout config
234
+ * Model->>RenderingEngine: requests rendering as layout container
235
+ * RenderingEngine->>System: renders grid layout with specified dimensions
236
+ */
237
+ export declare function uilayout(tag: string, cols?: number, rows?: number | string[], breakpoint?: UIMediaBreakPoints): (original: any, propertyKey?: any) => void;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQnVpbGRlclJlZ2lzdHJ5LFxuICBDb21wYXJhYmxlLFxuICBDb25zdHJ1Y3RvcixcbiAgSGFzaGFibGUsXG4gIE1vZGVsQXJnLFxuICBNb2RlbEJ1aWxkZXJGdW5jdGlvbixcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgU2VyaWFsaXphYmxlLFxuICBWYWxpZGF0YWJsZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVuZGVyYWJsZSB9IGZyb20gXCIuL1JlbmRlcmFibGVcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIE1vZGVsXG4gICAgaW1wbGVtZW50c1xuICAgICAgVmFsaWRhdGFibGUsXG4gICAgICBTZXJpYWxpemFibGUsXG4gICAgICBIYXNoYWJsZSxcbiAgICAgIENvbXBhcmFibGU8TW9kZWw+LFxuICAgICAgUmVuZGVyYWJsZVxuICB7XG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPE1vZGVsPik7XG5cbiAgICBoYXNFcnJvcnMoLi4uZXhjbHVzaW9uczogYW55W10pOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcbiAgICBoYXNFcnJvcnMoXG4gICAgICBwcmV2aW91c1ZlcnNpb24/OiBNb2RlbCB8IGFueSxcbiAgICAgIC4uLmV4Y2x1c2lvbnM6IGFueVtdXG4gICAgKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcGFyZXMgdGhpcyBtb2RlbCB3aXRoIGFub3RoZXIgb2JqZWN0IGZvciBlcXVhbGl0eVxuICAgICAqIEBzdW1tYXJ5IENvbXBhcmUgb2JqZWN0IGVxdWFsaXR5IHJlY3Vyc2l2ZWx5LCBjaGVja2luZyBhbGwgcHJvcGVydGllc1xuICAgICAqIEBwYXJhbSB7YW55fSBvYmogLSBPYmplY3QgdG8gY29tcGFyZSB0b1xuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBleGNlcHRpb25zIC0gUHJvcGVydHkgbmFtZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvblxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGVxdWFscyhvYmo6IGFueSwgLi4uZXhjZXB0aW9uczogc3RyaW5nW10pOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHRoZSBtb2RlbCB0byBhIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgc2VyaWFsaXplZCBtb2RlbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnRseSBkZWZpbmVkIHtAbGluayBTZXJpYWxpemVyfVxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gU2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICAgKi9cbiAgICBzZXJpYWxpemUoKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgICAqIEBzdW1tYXJ5IE92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgSmF2YVNjcmlwdCdzIGRlZmF1bHQgdG9TdHJpbmcoKSBtZXRob2RcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgaGFzaCBjb2RlIGZvciB0aGUgbW9kZWxcbiAgICAgKiBAc3VtbWFyeSBEZWZpbmVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igb2JqZWN0IGhhc2ggYmFzZWQgb24gSmF2YSdzIHN0cmluZyBoYXNoIGFsZ29yaXRobVxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gSGFzaCBjb2RlIGZvciB0aGUgbW9kZWxcbiAgICAgKi9cbiAgICBoYXNoKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHNlcmlhbGl6ZWQgc3RyaW5nIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgICAqIEBzdW1tYXJ5IERlc2VyaWFsaXplcyBhIE1vZGVsIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc2VyaWFsaXplZCBzdHJpbmcgdG8gZGVzZXJpYWxpemVcbiAgICAgKiBAcmV0dXJuIHthbnl9IFRoZSBkZXNlcmlhbGl6ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgaWYgaXQgZmFpbHMgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogYW55O1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEl0ZXJhdGVzIGFsbCBjb21tb24gcHJvcGVydGllcyBvZiBvYmogKGlmIGV4aXN0aW5nKSBhbmQgc2VsZiwgYW5kIGNvcGllcyB0aGVtIG9udG8gc2VsZlxuICAgICAqIEBzdW1tYXJ5IFJlcG9wdWxhdGVzIHRoZSBPYmplY3QgcHJvcGVydGllcyB3aXRoIHRoZSBvbmVzIGZyb20gdGhlIG5ldyBvYmplY3RcbiAgICAgKiBAdGVtcGxhdGUgVCAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAgICogQHBhcmFtIHtUfSBzZWxmIC0gVGhlIHRhcmdldCBtb2RlbCBpbnN0YW5jZSB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge1R8UmVjb3JkPHN0cmluZywgYW55Pn0gW29ial0gLSBUaGUgc291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICAgICAqIEByZXR1cm4ge1R9IFRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGZyb21PYmplY3Q8VCBleHRlbmRzIE1vZGVsPihcbiAgICAgIHNlbGY6IFQsXG4gICAgICBvYmo/OiBUIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICk6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gSXRlcmF0ZXMgYWxsIGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG9iaiAoaWYgZXhpc3RpbmcpIGFuZCBzZWxmLCBhbmQgY29waWVzIHRoZW0gb250byBzZWxmLiBJcyBhd2FyZSBvZiBuZXN0ZWQgTW9kZWwgT2JqZWN0cyBhbmQgcmVidWlsZHMgdGhlbSBhbHNvLiBXaGVuIExpc3QgcHJvcGVydGllcyBhcmUgZGVjb3JhdGVkIHdpdGgge0BsaW5rIGxpc3R9LCB0aGUgbGlzdCBpdGVtcyB3aWxsIGFsc28gYmUgcmVidWlsdFxuICAgICAqIEBzdW1tYXJ5IFJlcG9wdWxhdGVzIHRoZSBpbnN0YW5jZSB3aXRoIHByb3BlcnRpZXMgZnJvbSB0aGUgbmV3IE1vZGVsIE9iamVjdCwgaGFuZGxpbmcgbmVzdGVkIG1vZGVsc1xuICAgICAqIEB0ZW1wbGF0ZSBUIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICAgKiBAcGFyYW0ge1R9IHNlbGYgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7VHxSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb2JqXSAtIFRoZSBzb3VyY2UgbW9kZWwgb3Igb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gICAgICogQHJldHVybiB7VH0gVGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBzZWxmOiBULFxuICAgICAgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICApOiBUO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgdGhlIGdsb2JhbCBtb2RlbCBidWlsZGVyIGZ1bmN0aW9uIHVzZWQgZm9yIGNyZWF0aW5nIG1vZGVsIGluc3RhbmNlc1xuICAgICAqIEBzdW1tYXJ5IFNldHMgdGhlIEdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IHVzZWQgZm9yIG1vZGVsIGNvbnN0cnVjdGlvblxuICAgICAqIEBwYXJhbSB7TW9kZWxCdWlsZGVyRnVuY3Rpb259IFtidWlsZGVyXSAtIFRoZSBidWlsZGVyIGZ1bmN0aW9uIHRvIHNldCwgb3IgdW5kZWZpbmVkIHRvIHJlc2V0XG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0QnVpbGRlcihidWlsZGVyPzogTW9kZWxCdWlsZGVyRnVuY3Rpb24pOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGdsb2JhbCBtb2RlbCBidWlsZGVyIGZ1bmN0aW9uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IGdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IHVzZWQgZm9yIG1vZGVsIGNvbnN0cnVjdGlvblxuICAgICAqIEByZXR1cm4ge01vZGVsQnVpbGRlckZ1bmN0aW9ufHVuZGVmaW5lZH0gVGhlIGN1cnJlbnQgYnVpbGRlciBmdW5jdGlvbiBvciB1bmRlZmluZWQgaWYgbm90IHNldFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRCdWlsZGVyKCk6IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudCBtb2RlbCByZWdpc3RyeSBpbnN0YW5jZVxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQge0BsaW5rIE1vZGVsUmVnaXN0cnlNYW5hZ2VyfSB1c2VkIGZvciBtb2RlbCByZWdpc3RyYXRpb25cbiAgICAgKiBAcmV0dXJuIHtCdWlsZGVyUmVnaXN0cnk8YW55Pn0gTW9kZWxSZWdpc3RyeSBpbnN0YW5jZSwgZGVmYXVsdHMgdG8ge0BsaW5rIE1vZGVsUmVnaXN0cnlNYW5hZ2VyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbW9kZWwgcmVnaXN0cnkgdG8gYmUgdXNlZCBmb3IgbW9kZWwgcmVnaXN0cmF0aW9uIGFuZCByZXRyaWV2YWxcbiAgICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBjdXJyZW50IG1vZGVsIHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uXG4gICAgICogQHBhcmFtIHtCdWlsZGVyUmVnaXN0cnk8YW55Pn0gbW9kZWxSZWdpc3RyeSAtIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0UmVnaXN0cnkobW9kZWxSZWdpc3RyeTogQnVpbGRlclJlZ2lzdHJ5PGFueT4pOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG1vZGVsIGNvbnN0cnVjdG9yIHdpdGggdGhlIG1vZGVsIHJlZ2lzdHJ5XG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIG5ldyBNb2RlbHMgZm9yIGxhdGVyIHJldHJpZXZhbCBhbmQgaW5zdGFudGlhdGlvblxuICAgICAqIEB0ZW1wbGF0ZSBUIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICAgKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8VD59IGNvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIE9wdGlvbmFsIG5hbWUgZm9yIHJlZ2lzdHJhdGlvbiwgZGVmYXVsdHMgdG8gY29uc3RydWN0b3IgbmFtZVxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvcjxUPixcbiAgICAgIG5hbWU/OiBzdHJpbmdcbiAgICApOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBtb2RlbCBjb25zdHJ1Y3RvciBieSBuYW1lXG4gICAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9IGZyb20gdGhlIHJlZ2lzdHJ5XG4gICAgICogQHRlbXBsYXRlIFQgLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHRvIHJldHJpZXZlXG4gICAgICogQHJldHVybiB7TW9kZWxDb25zdHJ1Y3RvcjxUPnx1bmRlZmluZWR9IFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAgICovXG4gICAgc3RhdGljIGdldDxUIGV4dGVuZHMgTW9kZWw+KG5hbWU6IHN0cmluZyk6IE1vZGVsQ29uc3RydWN0b3I8VD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgcGxhaW4gb2JqZWN0XG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgdGhlIHJlZ2lzdGVyZWQgY29uc3RydWN0b3JcbiAgICAgKiBAdGVtcGxhdGUgVCAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb2JqXSAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJ1aWxkIGZyb21cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXp6XSAtIE9wdGlvbmFsIGNsYXNzIG5hbWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY29uc3RydWN0b3JcbiAgICAgKiBAcmV0dXJuIHtUfSBUaGUgYnVpbHQgbW9kZWwgaW5zdGFuY2VcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIE1vZGVsPihvYmo/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjbGF6ej86IHN0cmluZyk6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsIGluc3RhbmNlXG4gICAgICogQHN1bW1hcnkgR2V0cyB0aGUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gYSBtb2RlbFxuICAgICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICAgKiBAcGFyYW0ge1Z9IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGdldCBtZXRhZGF0YSBmcm9tXG4gICAgICogQHJldHVybiB7YW55fSBUaGUgbW9kZWwncyBtZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRNZXRhZGF0YTxWIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBWKTogYW55O1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbGwgYXR0cmlidXRlIG5hbWVzIGRlZmluZWQgb24gYSBtb2RlbFxuICAgICAqIEBzdW1tYXJ5IEdldHMgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgYSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZVxuICAgICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICAgKiBAcGFyYW0geyhDb25zdHJ1Y3RvcjxWPnxWKX0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3Igb3IgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzXG4gICAgICovXG4gICAgc3RhdGljIGdldEF0dHJpYnV0ZXM8ViBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8Vj4gfCBWKTogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcGFyZXMgdHdvIG1vZGVsIGluc3RhbmNlcyBmb3IgZXF1YWxpdHlcbiAgICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRvIGNoZWNrIGlmIHR3byBtb2RlbCBpbnN0YW5jZXMgYXJlIGVxdWFsXG4gICAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgICAqIEBwYXJhbSB7TX0gb2JqMSAtIEZpcnN0IG1vZGVsIGluc3RhbmNlIHRvIGNvbXBhcmVcbiAgICAgKiBAcGFyYW0ge019IG9iajIgLSBTZWNvbmQgbW9kZWwgaW5zdGFuY2UgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB7YW55W119IGV4Y2VwdGlvbnMgLSBQcm9wZXJ0aWVzIHRvIGV4Y2x1ZGUgZnJvbSBjb21wYXJpc29uXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb2RlbHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZXF1YWxzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBvYmoxOiBNLFxuICAgICAgb2JqMjogTSxcbiAgICAgIC4uLmV4Y2VwdGlvbnM6IGFueVtdXG4gICAgKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgYSBtb2RlbCBhbmQgY2hlY2tzIGZvciBlcnJvcnNcbiAgICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRvIHZhbGlkYXRlIGEgbW9kZWwgaW5zdGFuY2VcbiAgICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzVG9JZ25vcmUgLSBQcm9wZXJ0aWVzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gICAgICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb258dW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzRXJyb3JzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBtb2RlbDogTSxcbiAgICAgIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4gICAgKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VyaWFsaXplcyBhIG1vZGVsIGluc3RhbmNlIHRvIGEgc3RyaW5nXG4gICAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0byBjb252ZXJ0IGEgbW9kZWwgdG8gaXRzIHNlcmlhbGl6ZWQgZm9ybVxuICAgICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKTogYW55O1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGhhc2ggY29kZSBmb3IgYSBtb2RlbCBpbnN0YW5jZVxuICAgICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIGEgaGFzaCBjb2RlIGZvciBhIG1vZGVsXG4gICAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gaGFzaFxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhhc2ggY29kZSBmb3IgdGhlIG1vZGVsXG4gICAgICovXG4gICAgc3RhdGljIGhhc2g8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSk6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBtZXRhZGF0YSBrZXkgZm9yIHJlZmxlY3Rpb25cbiAgICAgKiBAc3VtbWFyeSBDb25jYXRlbmF0ZXMgdGhlIG1vZGVsIHJlZmxlY3Rpb24gcHJlZml4IHdpdGggdGhlIHByb3ZpZGVkIGtleSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIGtleSBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSByZWZsZWN0aW9uIHByZWZpeFxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleVxuICAgICAqL1xuICAgIHN0YXRpYyBrZXkoc3RyOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgYSBtb2RlbCBpbnN0YW5jZSBvciBoYXMgbW9kZWwgbWV0YWRhdGFcbiAgICAgKiBAc3VtbWFyeSBDaGVja3Mgd2hldGhlciBhIGdpdmVuIG9iamVjdCBpcyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIE1vZGVsIGNsYXNzIG9yXG4gICAgICogaGFzIG1vZGVsIG1ldGFkYXRhIGF0dGFjaGVkIHRvIGl0LiBUaGlzIGZ1bmN0aW9uIGlzIGVzc2VudGlhbCBmb3Igc2VyaWFsaXphdGlvbiBhbmRcbiAgICAgKiBkZXNlcmlhbGl6YXRpb24gcHJvY2Vzc2VzLCBhcyBpdCBoZWxwcyBpZGVudGlmeSBtb2RlbCBvYmplY3RzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLlxuICAgICAqIEl0IHNhZmVseSBoYW5kbGVzIHBvdGVudGlhbCBlcnJvcnMgZHVyaW5nIG1ldGFkYXRhIHJldHJpZXZhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdGFyZ2V0IC0gVGhlIG9iamVjdCB0byBjaGVja1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBtb2RlbFxuICAgICAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IG5hbWU6IFwiSm9oblwiIH0pO1xuICAgICAqIGNvbnN0IGlzVXNlck1vZGVsID0gaXNNb2RlbCh1c2VyKTsgLy8gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gQ2hlY2sgYSBwbGFpbiBvYmplY3RcbiAgICAgKiBjb25zdCBwbGFpbk9iamVjdCA9IHsgbmFtZTogXCJKb2huXCIgfTtcbiAgICAgKiBjb25zdCBpc1BsYWluT2JqZWN0TW9kZWwgPSBpc01vZGVsKHBsYWluT2JqZWN0KTsgLy8gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNNb2RlbCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHByb3BlcnR5IG9mIGEgbW9kZWwgaXMgaXRzZWxmIGEgbW9kZWwgb3IgaGFzIGEgbW9kZWwgdHlwZVxuICAgICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgbW9kZWwgaW5zdGFuY2UgaXMgZWl0aGVyIGEgbW9kZWwgaW5zdGFuY2VcbiAgICAgKiBvciBoYXMgYSB0eXBlIHRoYXQgaXMgcmVnaXN0ZXJlZCBhcyBhIG1vZGVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1vZGVsIHNlcmlhbGl6YXRpb25cbiAgICAgKiBhbmQgZGVzZXJpYWxpemF0aW9uIHRvIHByb3Blcmx5IGhhbmRsZSBuZXN0ZWQgbW9kZWxzLlxuICAgICAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMge0BsaW5rIE1vZGVsfVxuICAgICAqIEBwYXJhbSB7TX0gdGFyZ2V0IC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrXG4gICAgICogQHJldHVybiB7Ym9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZH0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIG1vZGVsIGluc3RhbmNlLFxuICAgICAqIHRoZSBtb2RlbCBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYSBtb2RlbCB0eXBlLCBvciB1bmRlZmluZWQgaWYgbm90IGEgbW9kZWxcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNQcm9wZXJ0eU1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICB0YXJnZXQ6IE0sXG4gICAgICBhdHRyaWJ1dGU6IHN0cmluZ1xuICAgICk6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgcHJvcGVydHkgb2YgYSBtb2RlbCBpcyBpdHNlbGYgYSBtb2RlbCBvciBoYXMgYSBtb2RlbCB0eXBlXG4gICAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3BlY2lmaWMgcHJvcGVydHkgb2YgYSBtb2RlbCBpbnN0YW5jZSBpcyBlaXRoZXIgYSBtb2RlbCBpbnN0YW5jZVxuICAgICAqIG9yIGhhcyBhIHR5cGUgdGhhdCBpcyByZWdpc3RlcmVkIGFzIGEgbW9kZWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbW9kZWwgc2VyaWFsaXphdGlvblxuICAgICAqIGFuZCBkZXNlcmlhbGl6YXRpb24gdG8gcHJvcGVybHkgaGFuZGxlIG5lc3RlZCBtb2RlbHMuXG4gICAgICogQHRlbXBsYXRlIFIgdGhlIGV4cGVjdGVkIFVJIGNvZGUgYWNjb3JkaW5nIHRvIGVhY2ggcmVuZGVyaW5nIGVuZ2luZVxuICAgICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBvcHRpb25hbCBlbmdpbmUgc3BlY2lmaWMgYXJnc1xuICAgICAqL1xuICAgIHJlbmRlcjxSPiguLi5hcmdzOiBhbnlbXSk6IFI7XG4gIH1cbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tIFwiLi9SZW5kZXJhYmxlXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgZGVjbGFyZSBpbnRlcmZhY2UgTW9kZWwgZXh0ZW5kcyBSZW5kZXJhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgcHJvcGVydHkgb2YgYSBtb2RlbCBpcyBpdHNlbGYgYSBtb2RlbCBvciBoYXMgYSBtb2RlbCB0eXBlXG4gICAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3BlY2lmaWMgcHJvcGVydHkgb2YgYSBtb2RlbCBpbnN0YW5jZSBpcyBlaXRoZXIgYSBtb2RlbCBpbnN0YW5jZVxuICAgICAqIG9yIGhhcyBhIHR5cGUgdGhhdCBpcyByZWdpc3RlcmVkIGFzIGEgbW9kZWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbW9kZWwgc2VyaWFsaXphdGlvblxuICAgICAqIGFuZCBkZXNlcmlhbGl6YXRpb24gdG8gcHJvcGVybHkgaGFuZGxlIG5lc3RlZCBtb2RlbHMuXG4gICAgICogQHRlbXBsYXRlIFIgdGhlIGV4cGVjdGVkIFVJIGNvZGUgYWNjb3JkaW5nIHRvIGVhY2ggcmVuZGVyaW5nIGVuZ2luZVxuICAgICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBvcHRpb25hbCBlbmdpbmUgc3BlY2lmaWMgYXJnc1xuICAgICAqL1xuICAgIHJlbmRlcjxSPiguLi5hcmdzOiBhbnlbXSk6IFI7XG4gIH1cbn1cbiJdfQ==
@@ -1,213 +1,6 @@
1
- import { ModelErrorDefinition } from "@decaf-ts/decorator-validation";
2
- import { BuilderRegistry, Comparable, Constructor, Hashable, ModelArg, ModelBuilderFunction, ModelConstructor, Serializable, Validatable } from "@decaf-ts/decorator-validation";
3
1
  import { Renderable } from "./Renderable";
4
2
  declare module "@decaf-ts/decorator-validation" {
5
- abstract class Model implements Validatable, Serializable, Hashable, Comparable<Model>, Renderable {
6
- protected constructor(arg?: ModelArg<Model>);
7
- hasErrors(...exclusions: any[]): ModelErrorDefinition | undefined;
8
- hasErrors(previousVersion?: Model | any, ...exclusions: any[]): ModelErrorDefinition | undefined;
9
- /**
10
- * @description Compares this model with another object for equality
11
- * @summary Compare object equality recursively, checking all properties
12
- * @param {any} obj - Object to compare to
13
- * @param {...string} exceptions - Property names to be excluded from the comparison
14
- * @return {boolean} True if objects are equal, false otherwise
15
- */
16
- equals(obj: any, ...exceptions: string[]): boolean;
17
- /**
18
- * @description Converts the model to a serialized string representation
19
- * @summary Returns the serialized model according to the currently defined {@link Serializer}
20
- * @return {string} Serialized representation of the model
21
- */
22
- serialize(): string;
23
- /**
24
- * @description Provides a string representation of the model
25
- * @summary Override the implementation for JavaScript's default toString() method
26
- * @return {string} String representation of the model
27
- * @override
28
- */
29
- toString(): string;
30
- /**
31
- * @description Generates a hash code for the model
32
- * @summary Defines a default implementation for object hash based on Java's string hash algorithm
33
- * @return {string} Hash code for the model
34
- */
35
- hash(): string;
36
- /**
37
- * @description Converts a serialized string back to a model instance
38
- * @summary Deserializes a Model from its string representation
39
- * @param {string} str - The serialized string to deserialize
40
- * @return {any} The deserialized model instance
41
- * @throws {Error} If it fails to parse the string, or if it fails to build the model
42
- */
43
- static deserialize(str: string): any;
44
- /**
45
- * @description Iterates all common properties of obj (if existing) and self, and copies them onto self
46
- * @summary Repopulates the Object properties with the ones from the new object
47
- * @template T - Type extending Model
48
- * @param {T} self - The target model instance to update
49
- * @param {T|Record<string, any>} [obj] - The source object to copy properties from
50
- * @return {T} The updated model instance
51
- */
52
- static fromObject<T extends Model>(self: T, obj?: T | Record<string, any>): T;
53
- /**
54
- * @description Iterates all common properties of obj (if existing) and self, and copies them onto self. Is aware of nested Model Objects and rebuilds them also. When List properties are decorated with {@link list}, the list items will also be rebuilt
55
- * @summary Repopulates the instance with properties from the new Model Object, handling nested models
56
- * @template T - Type extending Model
57
- * @param {T} self - The target model instance to update
58
- * @param {T|Record<string, any>} [obj] - The source model or object to copy properties from
59
- * @return {T} The updated model instance
60
- */
61
- static fromModel<T extends Model>(self: T, obj?: T | Record<string, any>): T;
62
- /**
63
- * @description Configures the global model builder function used for creating model instances
64
- * @summary Sets the Global {@link ModelBuilderFunction} used for model construction
65
- * @param {ModelBuilderFunction} [builder] - The builder function to set, or undefined to reset
66
- * @return {void}
67
- */
68
- static setBuilder(builder?: ModelBuilderFunction): void;
69
- /**
70
- * @description Returns the currently configured global model builder function
71
- * @summary Retrieves the current global {@link ModelBuilderFunction} used for model construction
72
- * @return {ModelBuilderFunction|undefined} The current builder function or undefined if not set
73
- */
74
- static getBuilder(): ModelBuilderFunction | undefined;
75
- /**
76
- * @description Retrieves the current model registry instance
77
- * @summary Returns the current {@link ModelRegistryManager} used for model registration
78
- * @return {BuilderRegistry<any>} ModelRegistry instance, defaults to {@link ModelRegistryManager}
79
- * @private
80
- */
81
- private static getRegistry;
82
- /**
83
- * @description Sets the model registry to be used for model registration and retrieval
84
- * @summary Configures the current model registry implementation
85
- * @param {BuilderRegistry<any>} modelRegistry - The new implementation of Registry to use
86
- * @return {void}
87
- */
88
- static setRegistry(modelRegistry: BuilderRegistry<any>): void;
89
- /**
90
- * @description Registers a model constructor with the model registry
91
- * @summary Registers new Models for later retrieval and instantiation
92
- * @template T - Type extending Model
93
- * @param {ModelConstructor<T>} constructor - The model constructor to register
94
- * @param {string} [name] - Optional name for registration, defaults to constructor name
95
- * @return {void}
96
- * @see ModelRegistry
97
- */
98
- static register<T extends Model>(constructor: ModelConstructor<T>, name?: string): void;
99
- /**
100
- * @description Retrieves a previously registered model constructor by name
101
- * @summary Gets a registered Model {@link ModelConstructor} from the registry
102
- * @template T - Type extending Model
103
- * @param {string} name - The name of the model to retrieve
104
- * @return {ModelConstructor<T>|undefined} The model constructor or undefined if not found
105
- * @see ModelRegistry
106
- */
107
- static get<T extends Model>(name: string): ModelConstructor<T> | undefined;
108
- /**
109
- * @description Creates a new model instance from a plain object
110
- * @summary Builds a model instance using the registered constructor
111
- * @template T - Type extending Model
112
- * @param {Record<string, any>} [obj] - The source object to build from
113
- * @param {string} [clazz] - Optional class name to find the matching constructor
114
- * @return {T} The built model instance
115
- * @throws {Error} If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
116
- * @see ModelRegistry
117
- */
118
- static build<T extends Model>(obj?: Record<string, any>, clazz?: string): T;
119
- /**
120
- * @description Retrieves metadata associated with a model instance
121
- * @summary Gets the metadata attached to a model
122
- * @template V - Type extending Model
123
- * @param {V} model - The model instance to get metadata from
124
- * @return {any} The model's metadata
125
- */
126
- static getMetadata<V extends Model>(model: V): any;
127
- /**
128
- * @description Retrieves all attribute names defined on a model
129
- * @summary Gets the list of attributes for a model class or instance
130
- * @template V - Type extending Model
131
- * @param {(Constructor<V>|V)} model - The model constructor or instance
132
- * @return {string[]} Array of attribute names
133
- */
134
- static getAttributes<V extends Model>(model: Constructor<V> | V): string[];
135
- /**
136
- * @description Compares two model instances for equality
137
- * @summary Static method to check if two model instances are equal
138
- * @template M - Type extending Model
139
- * @param {M} obj1 - First model instance to compare
140
- * @param {M} obj2 - Second model instance to compare
141
- * @param {any[]} exceptions - Properties to exclude from comparison
142
- * @return {boolean} True if models are equal, false otherwise
143
- */
144
- static equals<M extends Model>(obj1: M, obj2: M, ...exceptions: any[]): boolean;
145
- /**
146
- * @description Validates a model and checks for errors
147
- * @summary Static method to validate a model instance
148
- * @template M - Type extending Model
149
- * @param {M} model - The model instance to validate
150
- * @param {string[]} propsToIgnore - Properties to exclude from validation
151
- * @return {ModelErrorDefinition|undefined} Error definition if validation fails, undefined otherwise
152
- */
153
- static hasErrors<M extends Model>(model: M, ...propsToIgnore: string[]): ModelErrorDefinition | undefined;
154
- /**
155
- * @description Serializes a model instance to a string
156
- * @summary Static method to convert a model to its serialized form
157
- * @template M - Type extending Model
158
- * @param {M} model - The model instance to serialize
159
- * @return {string} The serialized representation of the model
160
- */
161
- static serialize<M extends Model>(model: M): any;
162
- /**
163
- * @description Generates a hash code for a model instance
164
- * @summary Static method to create a hash code for a model
165
- * @template M - Type extending Model
166
- * @param {M} model - The model instance to hash
167
- * @return {string} The hash code for the model
168
- */
169
- static hash<M extends Model>(model: M): any;
170
- /**
171
- * @description Builds a metadata key for reflection
172
- * @summary Concatenates the model reflection prefix with the provided key string
173
- * @param {string} str - The key string to append to the reflection prefix
174
- * @return {string} The complete metadata key
175
- */
176
- static key(str: string): string;
177
- /**
178
- * @description Determines if an object is a model instance or has model metadata
179
- * @summary Checks whether a given object is either an instance of the Model class or
180
- * has model metadata attached to it. This function is essential for serialization and
181
- * deserialization processes, as it helps identify model objects that need special handling.
182
- * It safely handles potential errors during metadata retrieval.
183
- *
184
- * @param {Record<string, any>} target - The object to check
185
- * @return {boolean} True if the object is a model instance or has model metadata, false otherwise
186
- *
187
- * @example
188
- * ```typescript
189
- * // Check if an object is a model
190
- * const user = new User({ name: "John" });
191
- * const isUserModel = isModel(user); // true
192
- *
193
- * // Check a plain object
194
- * const plainObject = { name: "John" };
195
- * const isPlainObjectModel = isModel(plainObject); // false
196
- * ```
197
- */
198
- static isModel(target: Record<string, any>): boolean;
199
- /**
200
- * @description Checks if a property of a model is itself a model or has a model type
201
- * @summary Determines whether a specific property of a model instance is either a model instance
202
- * or has a type that is registered as a model. This function is used for model serialization
203
- * and deserialization to properly handle nested models.
204
- * @template M extends {@link Model}
205
- * @param {M} target - The model instance to check
206
- * @param {string} attribute - The property name to check
207
- * @return {boolean | string | undefined} Returns true if the property is a model instance,
208
- * the model name if the property has a model type, or undefined if not a model
209
- */
210
- static isPropertyModel<M extends Model>(target: M, attribute: string): boolean | string | undefined;
3
+ interface Model extends Renderable {
211
4
  /**
212
5
  * @description Checks if a property of a model is itself a model or has a model type
213
6
  * @summary Determines whether a specific property of a model instance is either a model instance