typeomatica 0.3.55 → 0.3.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Type ø matica
1
+ # TypeØmatica
2
2
 
3
3
  [![Coverage Status](https://coveralls.io/repos/github/wentout/typeomatica/badge.svg?branch=main)](https://coveralls.io/github/wentout/typeomatica?branch=main)
4
4
 
@@ -8,37 +8,383 @@
8
8
 
9
9
  [**$ npm install <u>typeomatica</u>**](https://www.npmjs.com/package/typeomatica)
10
10
 
11
-
12
11
  This package is a part of [mnemonica](https://www.npmjs.com/package/mnemonica) project.
13
12
 
14
- Strict Types checker for objects which represent Data Types.
13
+ **Strict Runtime Type Checker for JavaScript Objects**
14
+
15
+ TypeØmatica uses JavaScript Proxies to enforce type safety at runtime, exactly as TypeScript expects at compile time. Once a property is assigned a value, its type is locked and cannot be changed.
16
+
17
+ ---
18
+
19
+ ## Quick Start
20
+
21
+ ```typescript
22
+ import { BaseClass } from 'typeomatica';
23
+
24
+ class User extends BaseClass {
25
+ name: string = 'default';
26
+ age: number = 0;
27
+ }
28
+
29
+ const user = new User();
30
+
31
+ // ✓ Valid assignments
32
+ user.name = 'John';
33
+ user.age = 25;
34
+
35
+ // ✗ Runtime error (even if TypeScript is bypassed with @ts-ignore)
36
+ user.age = '25'; // TypeError: Type Mismatch
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Table of Contents
42
+
43
+ - [What is TypeØmatica?](#what-is-typeomatica)
44
+ - [Installation](#installation)
45
+ - [Core Concepts](#core-concepts)
46
+ - [API Reference](#api-reference)
47
+ - [Usage Patterns](#usage-patterns)
48
+ - [Type Examples](#type-examples)
49
+ - [Working with Wrapped Values](#working-with-wrapped-values)
50
+ - [Error Reference](#error-reference)
51
+ - [Integration with Mnemonica](#integration-with-mnemonica)
52
+
53
+ ---
54
+
55
+ ## What is TypeØmatica?
56
+
57
+ TypeØmatica provides strict runtime type checking for JavaScript objects using Proxy-based interception. It ensures that once a property is initialized with a type, that type cannot be violated at runtime.
58
+
59
+ **Key Features:**
60
+ - Runtime type enforcement (complements TypeScript's compile-time checks)
61
+ - Proxy-based property interception
62
+ - Type locking after initial assignment
63
+ - Prevents prototype mutation, property redefinition, and deletion
64
+
65
+ ---
66
+
67
+ ## Installation
68
+
69
+ ```bash
70
+ npm install typeomatica
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Core Concepts
76
+
77
+ ### How It Works
78
+
79
+ TypeØmatica wraps objects with JavaScript Proxies that intercept:
80
+ - `get` - Property reads
81
+ - `set` - Property writes (with type validation)
82
+ - `setPrototypeOf` - Blocks prototype changes
83
+ - `defineProperty` - Blocks property redefinition
84
+ - `deleteProperty` - Blocks property deletion
85
+
86
+ ### Type Categories
87
+
88
+ | Category | Types | Behavior |
89
+ |----------|-------|----------|
90
+ | `primitives` | string, number, boolean, bigint, symbol, undefined | Type-locked accessors |
91
+ | `nullish` | null | Only null allowed |
92
+ | `objects` | object, arrays, dates | Same constructor type required |
93
+ | `functions` | methods | Restricted on data types |
94
+
95
+ ---
96
+
97
+ ## API Reference
98
+
99
+ ### BaseClass
100
+
101
+ The primary class for strict-type objects.
102
+
103
+ ```typescript
104
+ import { BaseClass } from 'typeomatica';
105
+
106
+ class MyClass extends BaseClass {
107
+ field: string = 'value';
108
+ constructor() {
109
+ super();
110
+ }
111
+ }
112
+ ```
113
+
114
+ ### BasePrototype
115
+
116
+ Functional equivalent of `BaseClass`.
117
+
118
+ ```typescript
119
+ import { BasePrototype } from 'typeomatica';
120
+
121
+ const Base = BasePrototype({ initialProp: 123 });
122
+ class MyClass extends Base { }
123
+ ```
124
+
125
+ ### @Strict() Decorator
126
+
127
+ Apply strict typing without extending BaseClass.
128
+
129
+ ```typescript
130
+ import { Strict } from 'typeomatica';
131
+
132
+ @Strict({ deep: true })
133
+ class MyClass {
134
+ field: number = 0;
135
+ }
136
+ ```
137
+
138
+ **Decorator Arguments:**
139
+ - First argument: Base prototype or options object
140
+ - Second argument: Options object
141
+
142
+ ### Options Interface
143
+
144
+ ```typescript
145
+ interface TypeomaticaOptions {
146
+ strictAccessCheck?: boolean; // default: false
147
+ }
148
+ ```
149
+
150
+ **Options:**
151
+ - `strictAccessCheck: true` - Enables strict receiver checking (throws `ACCESS_DENIED` error when property is accessed from wrong context)
152
+ - `deep: true` - Enable recursive property checking (when using BasePrototype with initial values)
153
+
154
+ ### Usage with Options
155
+
156
+ ```typescript
157
+ // With BaseClass - strict access checking enabled
158
+ class SecureData extends BaseClass {
159
+ secret: string = '';
160
+ constructor() {
161
+ super(undefined, { strictAccessCheck: true });
162
+ }
163
+ }
164
+
165
+ // With BasePrototype - strict access checking enabled
166
+ const SecureBase = BasePrototype({ data: '' }, { strictAccessCheck: true });
167
+ class User extends SecureBase {
168
+ name: string = '';
169
+ }
170
+
171
+ // With @Strict decorator - strict access checking enabled
172
+ @Strict(undefined, { strictAccessCheck: true })
173
+ class Product {
174
+ price: number = 0;
175
+ }
176
+ ```
177
+
178
+ ### Symbol Exports
179
+
180
+ ```typescript
181
+ import {
182
+ SymbolTypeomaticaProxyReference, // Access proxy internals
183
+ SymbolInitialValue // Access original values
184
+ } from 'typeomatica';
185
+ ```
186
+
187
+ ---
15
188
 
16
- # how it works
189
+ ## Usage Patterns
17
190
 
18
- see `test/index.ts`
191
+ ### Pattern 1: Extending BaseClass
19
192
 
20
- ```js
193
+ ```typescript
194
+ import { BaseClass } from 'typeomatica';
21
195
 
22
- class SimpleBase extends BasePrototype {
23
- stringProp = '123';
24
- };
196
+ class User extends BaseClass {
197
+ name: string = '';
198
+ age: number = 0;
199
+ active: boolean = true;
200
+ }
25
201
 
26
- // nect code line will work properly
27
- simpleInstance.stringProp = '321';
202
+ const user = new User();
203
+ user.name = 'John'; // ✓ Works
204
+ user.age = 25; // ✓ Works
28
205
 
29
- // but next code line will throw TypeError('Type Mismatch')
30
206
  // @ts-ignore
31
- simpleInstance.stringProp = 123;
207
+ user.age = '25'; // ✗ TypeError: Type Mismatch
208
+ ```
209
+
210
+ ### Pattern 2: @Strict Decorator
211
+
212
+ ```typescript
213
+ import { Strict } from 'typeomatica';
214
+
215
+ @Strict({ deep: true })
216
+ class Product {
217
+ id: number = 0;
218
+ title: string = '';
219
+ price: number = 0;
220
+ }
32
221
 
222
+ const product = new Product();
223
+ product.price = 29.99; // ✓ Works
224
+ // @ts-ignore
225
+ product.price = '$29.99'; // ✗ TypeError: Type Mismatch
33
226
  ```
34
227
 
35
- That is it. It will be impossible to assign anything else except of:
228
+ ### Pattern 3: BaseClass as Prototype
229
+
230
+ ```typescript
231
+ import { BaseClass } from 'typeomatica';
232
+
233
+ class UserData {
234
+ name: string = 'default';
235
+ age: number = 0;
236
+ }
237
+
238
+ // Inject type checking into prototype chain
239
+ Object.setPrototypeOf(UserData.prototype, new BaseClass({ deep: true }));
36
240
 
37
- ```js
38
- typeof something === 'string'
241
+ const user = new UserData();
242
+ user.name = 'John'; // ✓ Works
243
+ // @ts-ignore
244
+ user.name = 123; // ✗ TypeError: Type Mismatch
39
245
  ```
40
246
 
41
- to `stringProp` in runtime.
247
+ ---
248
+
249
+ ## Type Examples
250
+
251
+ ### Primitives
252
+
253
+ ```typescript
254
+ import { BaseClass } from 'typeomatica';
255
+
256
+ class Primitives extends BaseClass {
257
+ str: string = 'hello';
258
+ num: number = 42;
259
+ bool: boolean = true;
260
+ bigint: bigint = BigInt(100);
261
+ }
262
+
263
+ const p = new Primitives();
264
+ p.str = 'world'; // ✓ Works
265
+ p.num = 100; // ✓ Works
266
+ // @ts-ignore
267
+ p.str = 123; // ✗ TypeError: Type Mismatch
268
+ ```
269
+
270
+ ### Null and Undefined
271
+
272
+ ```typescript
273
+ class Nullable extends BaseClass {
274
+ nullValue: null = null;
275
+ undefinedValue: undefined = undefined;
276
+ }
277
+
278
+ const n = new Nullable();
279
+ n.nullValue = null; // ✓ Works
280
+ // @ts-ignore
281
+ n.nullValue = undefined; // ✗ TypeError: Type Mismatch
282
+ ```
283
+
284
+ ### Objects
285
+
286
+ ```typescript
287
+ class WithObject extends BaseClass {
288
+ data: object = {};
289
+ list: number[] = [];
290
+ }
291
+
292
+ const w = new WithObject();
293
+ w.data = { a: 1 }; // ✓ Works
294
+ w.list = [1, 2, 3]; // ✓ Works
295
+ // @ts-ignore
296
+ w.data = 123; // ✗ TypeError: Type Mismatch
297
+ // @ts-ignore
298
+ w.data = new Set(); // ✗ TypeError: Type Mismatch (Set !== Object)
299
+ ```
300
+
301
+ ---
302
+
303
+ ## Working with Wrapped Values
304
+
305
+ TypeØmatica wraps primitives to enforce type safety. Use `valueOf()` for operations.
306
+
307
+ ### Numeric Operations
308
+
309
+ ```typescript
310
+ class Calc extends BaseClass {
311
+ count: number = 10;
312
+ }
313
+
314
+ const calc = new Calc();
315
+
316
+ // ✗ Direct arithmetic throws
317
+ const result = calc.count + 5; // ReferenceError: Value Access Denied
318
+
319
+ // ✓ Use valueOf()
320
+ const result = calc.count.valueOf() + 5; // 15
321
+ const sum = 3 + +calc.count; // 13
322
+ ```
323
+
324
+ ### String Operations
325
+
326
+ ```typescript
327
+ class Text extends BaseClass {
328
+ message: string = 'hello';
329
+ }
330
+
331
+ const text = new Text();
332
+ text.message.valueOf().toUpperCase(); // 'HELLO'
333
+ text.message.valueOf().length; // 5
334
+ ```
335
+
336
+ ---
337
+
338
+ ## Error Reference
339
+
340
+ | Error Message | Error Type | When Thrown |
341
+ |---------------|------------|-------------|
342
+ | `Type Mismatch` | TypeError | Wrong type assigned to property |
343
+ | `Value Access Denied` | ReferenceError | Property accessed from wrong context (only when `strictAccessCheck: true`) |
344
+ | `Attempt to Access to Undefined Prop` | Error | Reading non-existent property |
345
+ | `Functions are Restricted` | TypeError | Function assigned to data property |
346
+ | `Re-Assirnment is Forbidden` | TypeError | Modifying read-only custom field |
347
+ | `Setting prototype is not allowed` | Error | Calling `Object.setPrototypeOf()` |
348
+ | `Defining new Properties is not allowed` | Error | Calling `Object.defineProperty()` |
349
+ | `Properties Deletion is not allowed` | Error | Calling `delete` on property |
350
+
351
+ ---
352
+
353
+ ## Integration with Mnemonica
354
+
355
+ TypeØmatica integrates seamlessly with [mnemonica](https://www.npmjs.com/package/mnemonica) for combined prototype inheritance and runtime type safety.
356
+
357
+ ```typescript
358
+ import { decorate } from 'mnemonica';
359
+ import { BaseClass, Strict } from 'typeomatica';
360
+
361
+ @decorate()
362
+ @Strict()
363
+ class Entity extends BaseClass {
364
+ id: string = '';
365
+ createdAt: Date = new Date();
366
+ }
367
+
368
+ // Works with mnemonica's inheritance system
369
+ const User = Entity.define('User', function(this: { email: string }) {
370
+ this.email = '';
371
+ });
372
+
373
+ const user = new User();
374
+ // @ts-ignore
375
+ user.email = 123; // ✗ TypeError: Type Mismatch
376
+ ```
377
+
378
+ **Decorator Order Matters:**
379
+ - `@Strict()` must come AFTER `@decorate()` (inner decorator)
380
+ - Decorators apply bottom-to-top
381
+
382
+ For complete integration documentation, see [mnemonica's TypeØmatica guide](https://github.com/wentout/mnemonica/blob/main/core/TypeØmatica.md).
383
+
384
+ ---
385
+
386
+ ## License
387
+
388
+ MIT
42
389
 
43
- As we describe Data Types &mdash; please take a peek for tests directory:
44
- [HERE](https://github.com/wentout/typeomatica/blob/main/test/index.ts).
390
+ Copyright (c) 2019-2024 https://github.com/wentout
package/lib/fields.js CHANGED
@@ -4,6 +4,7 @@ exports.FieldConstructor = void 0;
4
4
  const errors_1 = require("./errors");
5
5
  const SymbolInitialValue = Symbol('Initial Value');
6
6
  class FieldConstructor {
7
+ [SymbolInitialValue];
7
8
  get get() {
8
9
  const self = this;
9
10
  return function () {
@@ -25,4 +26,4 @@ class FieldConstructor {
25
26
  exports.FieldConstructor = FieldConstructor;
26
27
  Object.freeze(FieldConstructor.prototype);
27
28
  Object.seal(FieldConstructor.prototype);
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpZWxkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7OztBQUViLHFDQUF1QztBQUV2QyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQWVuRCxNQUFhLGdCQUFnQjtJQUU1QixJQUFXLEdBQUc7UUFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTztZQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQVcsR0FBRztRQUNiLE9BQU87WUFDTixNQUFNLElBQUksU0FBUyxDQUFDLG9CQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUNELFlBQWEsS0FBYztRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNELE1BQU0sS0FBSyxrQkFBa0I7UUFDNUIsT0FBTyxrQkFBa0IsQ0FBQztJQUMzQixDQUFDO0NBQ0Q7QUFuQkQsNENBbUJDO0FBb0NELE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHsgRXJyb3JzTmFtZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmNvbnN0IFN5bWJvbEluaXRpYWxWYWx1ZSA9IFN5bWJvbCgnSW5pdGlhbCBWYWx1ZScpO1xuXG5pbnRlcmZhY2UgRmllbGREZWZpbml0aW9uICB7XG5cdFtTeW1ib2xJbml0aWFsVmFsdWVdOiB1bmtub3duXG5cdC8vIGdldD86IHVua25vd25cblx0Ly8gc2V0PzogdW5rbm93blxuXHQvLyBjb25maWd1cmFibGU6IGJvb2xlYW4sXG5cdC8vIGVudW1lcmFibGU6IGJvb2xlYW4sXG5cdC8vIHdyaXRhYmxlOiBib29sZWFuXG59XG5cbi8vIGV4cG9ydCBjb25zdCBGaWVsZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKHRoaXM6IEZpZWxkRGVmaW5pdGlvbiwgdmFsdWU6IHVua25vd24pIHtcbi8vIFx0dGhpc1tTeW1ib2xJbml0aWFsVmFsdWVdID0gdmFsdWU7XG4vLyB9IGFzIE9iamVjdENvbnN0cnVjdG9yO1xuXG5leHBvcnQgY2xhc3MgRmllbGRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIEZpZWxkRGVmaW5pdGlvbiB7XG5cdFtTeW1ib2xJbml0aWFsVmFsdWVdOiB1bmtub3duO1xuXHRwdWJsaWMgZ2V0IGdldCAoKSB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uICgvKiB0aGlzOiBGaWVsZERlZmluaXRpb24gKi8pIHtcblx0XHRcdHJldHVybiBzZWxmW1N5bWJvbEluaXRpYWxWYWx1ZV07XG5cdFx0fTtcblx0fVxuXHRwdWJsaWMgZ2V0IHNldCAoKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoRXJyb3JzTmFtZXMuRk9SQklEREVOX1JFKTtcblx0XHR9O1xuXHR9XG5cdGNvbnN0cnVjdG9yICh2YWx1ZTogdW5rbm93bikge1xuXHRcdHRoaXNbU3ltYm9sSW5pdGlhbFZhbHVlXSA9IHZhbHVlO1xuXHR9XG5cdHN0YXRpYyBnZXQgU3ltYm9sSW5pdGlhbFZhbHVlICgpIHtcblx0XHRyZXR1cm4gU3ltYm9sSW5pdGlhbFZhbHVlO1xuXHR9XG59XG5cbi8vIE9iamVjdC5hc3NpZ24oRmllbGRDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcbi8vIFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8vIFx0ZW51bWVyYWJsZTogZmFsc2UsXG4vLyBcdC8vIHdyaXRhYmxlOiBmYWxzZVxuLy8gfSlcblxuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpZWxkQ29uc3RydWN0b3IucHJvdG90eXBlLCAnZ2V0Jywge1xuLy8gXHRnZXQoKSB7XG4vLyBcdFx0cmV0dXJuIHRoaXNbc3ltYm9sVmFsdWVdO1xuLy8gXHR9LFxuLy8gXHQvLyBAdHMtaWdub3JlXG4vLyBcdHNldCh2YWx1ZTogdW5rbm93bikge1xuLy8gXHRcdHRocm93IG5ldyBFcnJvcignYnJva2VuIGJlaGF2aW91cjogYXNzaWdubWVudCB0byBnZXR0ZXInKTtcbi8vIFx0fSxcbi8vIFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8vIFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8vIFx0Ly8gd3JpdGFibGU6IGZhbHNlXG4vLyB9KTtcblxuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpZWxkQ29uc3RydWN0b3IucHJvdG90eXBlLCAnc2V0Jywge1xuLy8gXHRnZXQoKSB7XG4vLyBcdFx0cmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBGaWVsZERlZmluaXRpb24sIHZhbHVlOiB1bmtub3duKSB7XG4vLyBcdFx0XHR0aGlzW3N5bWJvbFZhbHVlXSA9IHZhbHVlO1xuLy8gXHRcdH1cbi8vIFx0fSxcbi8vIFx0Ly8gQHRzLWlnbm9yZVxuLy8gXHRzZXQodmFsdWU6IHVua25vd24pIHtcbi8vIFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2Jyb2tlbiBiZWhhdmlvdXI6IGFzc2lnbm1lbnQgdG8gc2V0dGVyJyk7XG4vLyBcdH0sXG4vLyBcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vLyBcdGVudW1lcmFibGU6IHRydWUsXG4vLyBcdC8vIHdyaXRhYmxlOiBmYWxzZVxuLy8gfSk7XG5cbk9iamVjdC5mcmVlemUoRmllbGRDb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuT2JqZWN0LnNlYWwoRmllbGRDb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuIl19
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpZWxkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7OztBQUViLHFDQUF1QztBQUV2QyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQWVuRCxNQUFhLGdCQUFnQjtJQUM1QixDQUFDLGtCQUFrQixDQUFDLENBQVU7SUFDOUIsSUFBVyxHQUFHO1FBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU87WUFDTixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFXLEdBQUc7UUFDYixPQUFPO1lBQ04sTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQkFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFhLEtBQWM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxNQUFNLEtBQUssa0JBQWtCO1FBQzVCLE9BQU8sa0JBQWtCLENBQUM7SUFDM0IsQ0FBQztDQUNEO0FBbkJELDRDQW1CQztBQW9DRCxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7IEVycm9yc05hbWVzIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5jb25zdCBTeW1ib2xJbml0aWFsVmFsdWUgPSBTeW1ib2woJ0luaXRpYWwgVmFsdWUnKTtcblxuaW50ZXJmYWNlIEZpZWxkRGVmaW5pdGlvbiAge1xuXHRbU3ltYm9sSW5pdGlhbFZhbHVlXTogdW5rbm93blxuXHQvLyBnZXQ/OiB1bmtub3duXG5cdC8vIHNldD86IHVua25vd25cblx0Ly8gY29uZmlndXJhYmxlOiBib29sZWFuLFxuXHQvLyBlbnVtZXJhYmxlOiBib29sZWFuLFxuXHQvLyB3cml0YWJsZTogYm9vbGVhblxufVxuXG4vLyBleHBvcnQgY29uc3QgRmllbGRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICh0aGlzOiBGaWVsZERlZmluaXRpb24sIHZhbHVlOiB1bmtub3duKSB7XG4vLyBcdHRoaXNbU3ltYm9sSW5pdGlhbFZhbHVlXSA9IHZhbHVlO1xuLy8gfSBhcyBPYmplY3RDb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGNsYXNzIEZpZWxkQ29uc3RydWN0b3IgaW1wbGVtZW50cyBGaWVsZERlZmluaXRpb24ge1xuXHRbU3ltYm9sSW5pdGlhbFZhbHVlXTogdW5rbm93bjtcblx0cHVibGljIGdldCBnZXQgKCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdHJldHVybiBmdW5jdGlvbiAoLyogdGhpczogRmllbGREZWZpbml0aW9uICovKSB7XG5cdFx0XHRyZXR1cm4gc2VsZltTeW1ib2xJbml0aWFsVmFsdWVdO1xuXHRcdH07XG5cdH1cblx0cHVibGljIGdldCBzZXQgKCkge1xuXHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKEVycm9yc05hbWVzLkZPUkJJRERFTl9SRSk7XG5cdFx0fTtcblx0fVxuXHRjb25zdHJ1Y3RvciAodmFsdWU6IHVua25vd24pIHtcblx0XHR0aGlzW1N5bWJvbEluaXRpYWxWYWx1ZV0gPSB2YWx1ZTtcblx0fVxuXHRzdGF0aWMgZ2V0IFN5bWJvbEluaXRpYWxWYWx1ZSAoKSB7XG5cdFx0cmV0dXJuIFN5bWJvbEluaXRpYWxWYWx1ZTtcblx0fVxufVxuXG4vLyBPYmplY3QuYXNzaWduKEZpZWxkQ29uc3RydWN0b3IucHJvdG90eXBlLCB7XG4vLyBcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vLyBcdGVudW1lcmFibGU6IGZhbHNlLFxuLy8gXHQvLyB3cml0YWJsZTogZmFsc2Vcbi8vIH0pXG5cbi8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaWVsZENvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2dldCcsIHtcbi8vIFx0Z2V0KCkge1xuLy8gXHRcdHJldHVybiB0aGlzW3N5bWJvbFZhbHVlXTtcbi8vIFx0fSxcbi8vIFx0Ly8gQHRzLWlnbm9yZVxuLy8gXHRzZXQodmFsdWU6IHVua25vd24pIHtcbi8vIFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2Jyb2tlbiBiZWhhdmlvdXI6IGFzc2lnbm1lbnQgdG8gZ2V0dGVyJyk7XG4vLyBcdH0sXG4vLyBcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vLyBcdGVudW1lcmFibGU6IHRydWUsXG4vLyBcdC8vIHdyaXRhYmxlOiBmYWxzZVxuLy8gfSk7XG5cbi8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaWVsZENvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ3NldCcsIHtcbi8vIFx0Z2V0KCkge1xuLy8gXHRcdHJldHVybiBmdW5jdGlvbiAodGhpczogRmllbGREZWZpbml0aW9uLCB2YWx1ZTogdW5rbm93bikge1xuLy8gXHRcdFx0dGhpc1tzeW1ib2xWYWx1ZV0gPSB2YWx1ZTtcbi8vIFx0XHR9XG4vLyBcdH0sXG4vLyBcdC8vIEB0cy1pZ25vcmVcbi8vIFx0c2V0KHZhbHVlOiB1bmtub3duKSB7XG4vLyBcdFx0dGhyb3cgbmV3IEVycm9yKCdicm9rZW4gYmVoYXZpb3VyOiBhc3NpZ25tZW50IHRvIHNldHRlcicpO1xuLy8gXHR9LFxuLy8gXHRjb25maWd1cmFibGU6IGZhbHNlLFxuLy8gXHRlbnVtZXJhYmxlOiB0cnVlLFxuLy8gXHQvLyB3cml0YWJsZTogZmFsc2Vcbi8vIH0pO1xuXG5PYmplY3QuZnJlZXplKEZpZWxkQ29uc3RydWN0b3IucHJvdG90eXBlKTtcbk9iamVjdC5zZWFsKEZpZWxkQ29uc3RydWN0b3IucHJvdG90eXBlKTtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -1,11 +1,14 @@
1
+ export interface TypeomaticaOptions {
2
+ strictAccessCheck?: boolean;
3
+ }
1
4
  export declare const baseTarget: (_proto?: object) => any;
2
5
  export declare const SymbolTypeomaticaProxyReference: unique symbol;
3
6
  export declare const BaseConstructorPrototype: {
4
- new <T extends object | {}>(_target?: T): T;
5
- <T extends object | {}, S extends T>(_target?: S extends infer S_1 ? S_1 : {}): S;
7
+ new <T extends object | {}>(_target?: T, options?: TypeomaticaOptions): T;
8
+ <T extends object | {}, S extends T>(_target?: S extends infer S_1 ? S_1 : {}, options?: TypeomaticaOptions): S;
6
9
  };
7
10
  export declare class BaseClass {
8
- constructor(_target?: object);
11
+ constructor(_target?: object, options?: TypeomaticaOptions);
9
12
  }
10
13
  export declare const SymbolInitialValue: symbol;
11
- export declare const Strict: (_target?: object) => <T>(cstr: T) => T;
14
+ export declare const Strict: (_target?: object, options?: TypeomaticaOptions) => <T>(cstr: T) => T;
package/lib/index.js CHANGED
@@ -4,46 +4,54 @@ exports.Strict = exports.SymbolInitialValue = exports.BaseClass = exports.BaseCo
4
4
  const errors_1 = require("./errors");
5
5
  const types_1 = require("./types");
6
6
  const fields_1 = require("./fields");
7
- const resolver = Object.entries({
8
- primitives: types_1.primitives,
9
- special: types_1.special,
10
- nullish: types_1.nullish,
11
- objects: types_1.objects,
12
- functions: types_1.functions
13
- }).reduce((obj, [key, _handler]) => {
14
- obj[key] = function (initialValue, receiver) {
15
- const handler = _handler(initialValue);
16
- return {
17
- get() {
18
- const invocationThis = this;
19
- if (invocationThis !== receiver) {
20
- throw new ReferenceError(errors_1.ErrorsNames.ACCESS_DENIED);
7
+ const createResolver = (options = {}) => {
8
+ const { strictAccessCheck = false } = options;
9
+ return Object.entries({
10
+ primitives: types_1.primitives,
11
+ special: types_1.special,
12
+ nullish: types_1.nullish,
13
+ objects: types_1.objects,
14
+ functions: types_1.functions
15
+ }).reduce((obj, [key, _handler]) => {
16
+ obj[key] = function (initialValue, receiver) {
17
+ const handler = _handler(initialValue);
18
+ return {
19
+ get() {
20
+ const invocationThis = this;
21
+ if (strictAccessCheck && invocationThis !== receiver) {
22
+ throw new ReferenceError(errors_1.ErrorsNames.ACCESS_DENIED);
23
+ }
24
+ const result = handler.get();
25
+ return result;
26
+ },
27
+ set(replacementValue) {
28
+ const invocationThis = this;
29
+ if (strictAccessCheck && invocationThis !== receiver) {
30
+ throw new ReferenceError(errors_1.ErrorsNames.ACCESS_DENIED);
31
+ }
32
+ const result = handler.set(replacementValue);
33
+ return result;
21
34
  }
22
- const result = handler.get();
23
- return result;
24
- },
25
- set(replacementValue) {
26
- const invocationThis = this;
27
- if (invocationThis !== receiver) {
28
- throw new ReferenceError(errors_1.ErrorsNames.ACCESS_DENIED);
29
- }
30
- const result = handler.set(replacementValue);
31
- return result;
32
- }
35
+ };
33
36
  };
34
- };
35
- return obj;
36
- }, {});
37
- const createProperty = (propName, initialValue, receiver) => {
37
+ return obj;
38
+ }, {});
39
+ };
40
+ const createProperty = (propName, initialValue, receiver, options) => {
38
41
  const value = initialValue;
39
42
  const valueIsPrimitive = (0, types_1.isPrimitive)(initialValue);
40
43
  const isObject = typeof initialValue === 'object';
41
44
  const isFunction = initialValue instanceof Function;
42
45
  const isNull = initialValue === null;
43
46
  const types = valueIsPrimitive ? 'primitives' : (isObject ? (isNull ? 'nullish' : 'objects') : (isFunction ? 'functions' : 'special'));
47
+ const resolver = createResolver(options);
44
48
  const descriptor = (isObject && (value instanceof fields_1.FieldConstructor)) ?
45
49
  value
46
- : Object.assign({ enumerable: true }, resolver[types](value, receiver));
50
+ :
51
+ {
52
+ enumerable: true,
53
+ ...resolver[types](value, receiver),
54
+ };
47
55
  const result = Reflect.defineProperty(receiver, propName, descriptor);
48
56
  return result;
49
57
  };
@@ -57,7 +65,7 @@ const props2skip = new Set([
57
65
  const util = require('util');
58
66
  const hasNodeInspect = (util && util.inspect && util.inspect.custom);
59
67
  (hasNodeInspect && (props2skip.add(util.inspect.custom)));
60
- const handlers = {
68
+ const createHandlers = (options) => ({
61
69
  get(target, prop, receiver) {
62
70
  const result = Reflect.get(target, prop, receiver);
63
71
  if (result !== undefined) {
@@ -81,7 +89,7 @@ const handlers = {
81
89
  throw new Error(errorMessage);
82
90
  },
83
91
  set(_, prop, value, receiver) {
84
- const result = createProperty(prop, value, receiver);
92
+ const result = createProperty(prop, value, receiver, options);
85
93
  return result;
86
94
  },
87
95
  setPrototypeOf() {
@@ -93,8 +101,7 @@ const handlers = {
93
101
  deleteProperty() {
94
102
  throw new Error('Properties Deletion is not allowed!');
95
103
  },
96
- };
97
- Object.freeze(handlers);
104
+ });
98
105
  const baseTarget = (_proto) => {
99
106
  const proto = typeof _proto === 'object' ? _proto : null;
100
107
  const answer = Object.create(proto);
@@ -102,7 +109,7 @@ const baseTarget = (_proto) => {
102
109
  };
103
110
  exports.baseTarget = baseTarget;
104
111
  exports.SymbolTypeomaticaProxyReference = Symbol('TypeØmaticaProxyReference');
105
- const getTypeomaticaProxyReference = (_target) => {
112
+ const getTypeomaticaProxyReference = (_target, options) => {
106
113
  const target = Object.create(_target);
107
114
  const id = `TypeØmaticaProxyReference-${Math.random()}`;
108
115
  Object.defineProperty(target, exports.SymbolTypeomaticaProxyReference, {
@@ -110,12 +117,13 @@ const getTypeomaticaProxyReference = (_target) => {
110
117
  return id;
111
118
  }
112
119
  });
120
+ const handlers = createHandlers(options);
113
121
  const proxy = new Proxy(target, handlers);
114
122
  return proxy;
115
123
  };
116
- exports.BaseConstructorPrototype = function (_target) {
124
+ exports.BaseConstructorPrototype = function (_target, options) {
117
125
  if (!new.target) {
118
- const self = exports.BaseConstructorPrototype.bind(this, _target);
126
+ const self = exports.BaseConstructorPrototype.bind(this, _target, options);
119
127
  self.prototype = {
120
128
  constructor: exports.BaseConstructorPrototype
121
129
  };
@@ -125,7 +133,7 @@ exports.BaseConstructorPrototype = function (_target) {
125
133
  return this;
126
134
  }
127
135
  const target = (0, exports.baseTarget)(_target);
128
- const InstancePrototype = getTypeomaticaProxyReference(target);
136
+ const InstancePrototype = getTypeomaticaProxyReference(target, options);
129
137
  let proto;
130
138
  let protoPointer = this;
131
139
  let protoConstrcutor;
@@ -158,12 +166,12 @@ Object.defineProperty(module, 'exports', {
158
166
  enumerable: true
159
167
  });
160
168
  class BaseClass {
161
- constructor(_target) {
169
+ constructor(_target, options) {
162
170
  if (this[exports.SymbolTypeomaticaProxyReference]) {
163
171
  return this;
164
172
  }
165
173
  const target = (0, exports.baseTarget)(_target);
166
- const proxy = getTypeomaticaProxyReference(target);
174
+ const proxy = getTypeomaticaProxyReference(target, options);
167
175
  let proto = this;
168
176
  let protoPointer;
169
177
  let found = false;
@@ -179,13 +187,13 @@ class BaseClass {
179
187
  }
180
188
  }
181
189
  exports.BaseClass = BaseClass;
182
- const strict = function (_target) {
190
+ const strict = function (_target, options) {
183
191
  const decorator = function (cstr) {
184
192
  if (cstr.prototype[exports.SymbolTypeomaticaProxyReference]) {
185
193
  return cstr;
186
194
  }
187
195
  const target = (0, exports.baseTarget)(_target);
188
- const proxy = getTypeomaticaProxyReference(target);
196
+ const proxy = getTypeomaticaProxyReference(target, options);
189
197
  const _replacer = Object.create(proxy);
190
198
  Object.setPrototypeOf(cstr.prototype, _replacer);
191
199
  return cstr;
@@ -232,4 +240,4 @@ Object.defineProperty(module.exports, 'Strict', {
232
240
  });
233
241
  Object.freeze(exports.BaseConstructorPrototype);
234
242
  Object.freeze(exports.BaseConstructorPrototype.prototype);
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsWUFBWSxDQUFDOzs7QUFFYixxQ0FBdUM7QUFFdkMsbUNBT2lCO0FBRWpCLHFDQUE0QztBQUU1QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQy9CLFVBQVUsRUFBVixrQkFBVTtJQUNWLE9BQU8sRUFBUCxlQUFPO0lBQ1AsT0FBTyxFQUFQLGVBQU87SUFDUCxPQUFPLEVBQVAsZUFBTztJQUNQLFNBQVMsRUFBVCxpQkFBUztDQUNULENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtJQUUxQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxZQUFvQixFQUFFLFFBQWdCO1FBQzFELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxPQUFPO1lBQ04sR0FBRztnQkFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNqQyxNQUFNLElBQUksY0FBYyxDQUFDLG9CQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM3QixPQUFPLE1BQU0sQ0FBQztZQUNmLENBQUM7WUFDRCxHQUFHLENBQUMsZ0JBQXlCO2dCQUM1QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNqQyxNQUFNLElBQUksY0FBYyxDQUFDLG9CQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FB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RUFBRSxRQUFRLEVBQUU7SUFDL0MsR0FBRztRQUNGLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUNELFVBQVUsRUFBRSxJQUFJO0NBQ2hCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0NBQXdCLENBQUMsQ0FBQztBQUN4QyxNQUFNLENBQUMsTUFBTSxDQUFDLGdDQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gb3hsaW50LWRpc2FibGUgdHlwZXNjcmlwdC9uby10aGlzLWFsaWFzXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1kZWJ1Z2dlciAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4vZXJyb3JzJztcblxuaW1wb3J0IHtcblx0ZnVuY3Rpb25zLFxuXHRudWxsaXNoLFxuXHRvYmplY3RzLFxuXHRwcmltaXRpdmVzLFxuXHRzcGVjaWFsLFxuXHRpc1ByaW1pdGl2ZVxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgRmllbGRDb25zdHJ1Y3RvciB9IGZyb20gJy4vZmllbGRzJztcblxuY29uc3QgcmVzb2x2ZXIgPSBPYmplY3QuZW50cmllcyh7XG5cdHByaW1pdGl2ZXMsXG5cdHNwZWNpYWwsXG5cdG51bGxpc2gsXG5cdG9iamVjdHMsXG5cdGZ1bmN0aW9uc1xufSkucmVkdWNlKChvYmo6IG9iamVjdCwgW2tleSwgX2hhbmRsZXJdKSA9PiB7XG5cdC8vIEB0cy1pZ25vcmVcblx0b2JqW2tleV0gPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlOiBvYmplY3QsIHJlY2VpdmVyOiBvYmplY3QpIHtcblx0XHRjb25zdCBoYW5kbGVyID0gX2hhbmRsZXIoaW5pdGlhbFZhbHVlKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRjb25zdCBpbnZvY2F0aW9uVGhpcyA9IHRoaXM7XG5cdFx0XHRcdGlmIChpbnZvY2F0aW9uVGhpcyAhPT0gcmVjZWl2ZXIpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlci5nZXQoKTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogdW5rbm93bikge1xuXHRcdFx0XHRjb25zdCBpbnZvY2F0aW9uVGhpcyA9IHRoaXM7XG5cdFx0XHRcdGlmIChpbnZvY2F0aW9uVGhpcyAhPT0gcmVjZWl2ZXIpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlci5zZXQocmVwbGFjZW1lbnRWYWx1ZSk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG5jb25zdCBjcmVhdGVQcm9wZXJ0eSA9IChwcm9wTmFtZTogc3RyaW5nLCBpbml0aWFsVmFsdWU6IHVua25vd24sIHJlY2VpdmVyOiBvYmplY3QpID0+IHtcblxuXHRjb25zdCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTtcblx0Y29uc3QgdmFsdWVJc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IGlzT2JqZWN0ID0gdHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gJ29iamVjdCc7XG5cdGNvbnN0IGlzRnVuY3Rpb24gPSBpbml0aWFsVmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcblx0Y29uc3QgaXNOdWxsID0gaW5pdGlhbFZhbHVlID09PSBudWxsO1xuXG5cdC8qKlxuXHQgKiBzcGVjaWFsOiB1bmRlZmluZWQgb3IgQmlnSW50IG9yIFN5bWJvbFxuXHQgKiBcdG9yIG90aGVyIG5vbiBjb25zdHJ1Y3RpYmxlIHR5cGVcblx0ICovXG5cblx0Y29uc3QgdHlwZXMgPSB2YWx1ZUlzUHJpbWl0aXZlID8gJ3ByaW1pdGl2ZXMnIDogKFxuXHRcdGlzT2JqZWN0ID8gKFxuXHRcdFx0aXNOdWxsID8gJ251bGxpc2gnIDogJ29iamVjdHMnXG5cdFx0KSA6IChcblx0XHRcdGlzRnVuY3Rpb24gPyAnZnVuY3Rpb25zJyA6ICdzcGVjaWFsJ1xuXHRcdClcblx0KTtcblxuXHRjb25zdCBkZXNjcmlwdG9yID0gKGlzT2JqZWN0ICYmICh2YWx1ZSBpbnN0YW5jZW9mIEZpZWxkQ29uc3RydWN0b3IpKSA/XG5cdFx0dmFsdWVcblx0XHQ6XG5cdFx0e1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdC4uLnJlc29sdmVyW3R5cGVzXSh2YWx1ZSwgcmVjZWl2ZXIpLFxuXHRcdH07XG5cblx0Ly8gaWYgKHZhbHVlIGluc3RhbmNlb2YgRmllbGRDb25zdHJ1Y3Rvcikge1xuXHQvLyBcdGRlc2NyaXB0b3I7XG5cdC8vIFx0ZGVidWdnZXI7XG5cdC8vIH1cblxuXHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wTmFtZSwgZGVzY3JpcHRvcik7XG5cdHJldHVybiByZXN1bHQ7XG5cbn07XG5cbi8vIGxpbmUgYmVsb3cgJ2hyZWYnIGlzIGZvciB1dGlsLmluc3BlY3Qgd29ya3MsIHVzZWZ1bCBmb3IgdjI0XG5jb25zdCBwcm9wczJza2lwID0gbmV3IFNldChbXG5cdFN5bWJvbC50b1N0cmluZ1RhZyxcblx0U3ltYm9sLml0ZXJhdG9yLFxuXHQvLyBTeW1ib2wudG9QcmltaXRpdmUsXG5cdCd0b1N0cmluZycsXG5cdCd2YWx1ZU9mJyxcblx0J2hyZWYnXG5dKTtcbi8vIGNvbnN0IHByb3BzMnNraXAgPSBuZXcgU2V0KFtTeW1ib2wudG9TdHJpbmdUYWcsIFN5bWJvbC5pdGVyYXRvcl0pO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGhhc05vZGVJbnNwZWN0ID0gKHV0aWwgJiYgdXRpbC5pbnNwZWN0ICYmIHV0aWwuaW5zcGVjdC5jdXN0b20pO1xuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuKGhhc05vZGVJbnNwZWN0ICYmIChwcm9wczJza2lwLmFkZCh1dGlsLmluc3BlY3QuY3VzdG9tKSkpO1xuXG5jb25zdCBoYW5kbGVycyA9IHtcblx0Z2V0KHRhcmdldDogb2JqZWN0LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBvYmplY3QpIHtcblx0XHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcblx0XHRpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdGlmIChwcm9wID09PSAndG9KU09OJykge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKHRoaXM6IHR5cGVvZiB0YXJnZXQpIHtcblx0XHRcdFx0Y29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMpO1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW50cmllcy5yZWR1Y2UoKG9iaiwgW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdG9ialtrZXldID0gdmFsdWUudmFsdWVPZigpO1xuXHRcdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHRcdH0sIHt9KSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRjb25zdCB7IG5hbWUgfSA9IHJlY2VpdmVyLmNvbnN0cnVjdG9yO1xuXHRcdGlmIChwcm9wczJza2lwLmhhcyhwcm9wKSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGAke25hbWV9IGxhY2tzIGRlZmluaXRpb24gb2YgWyAke1N0cmluZyhwcm9wKS52YWx1ZU9mKCl9IF1gO1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdFx0fVxuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGAke0Vycm9yc05hbWVzLk1JU1NJTkdfUFJPUH06IFsgJHtTdHJpbmcocHJvcCkudmFsdWVPZigpfSBdIGZvciAke25hbWV9YDtcblx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcblx0fSxcblx0c2V0KF86IG9iamVjdCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNyZWF0ZVByb3BlcnR5KHByb3AsIHZhbHVlLCByZWNlaXZlcik7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblx0c2V0UHJvdG90eXBlT2YoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nIHByb3RvdHlwZSBpcyBub3QgYWxsb3dlZCEnKTtcblx0fSxcblx0Ly8gZGVmaW5lUHJvcGVydHkodGFyZ2V0OiBvYmplY3QsIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0ZGVmaW5lUHJvcGVydHkoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdEZWZpbmluZyBuZXcgUHJvcGVydGllcyBpcyBub3QgYWxsb3dlZCEnKTtcblx0XHQvLyBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcblx0fSxcblx0ZGVsZXRlUHJvcGVydHkoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0aWVzIERlbGV0aW9uIGlzIG5vdCBhbGxvd2VkIScpO1xuXHR9LFxuXHQvLyBnZXRQcm90b3R5cGVPZigpIHtcblx0Ly8gXHRkZWJ1Z2dlcjtcblx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ0dldHRpbmcgcHJvdG90eXBlIGlzIG5vdCBhbGxvd2VkJyk7XG5cdC8vIH0sXG59O1xuXG5PYmplY3QuZnJlZXplKGhhbmRsZXJzKTtcblxuLy8gdXNlciBoYXZlIHRvIHByZWNpc2VseSBkZWZpbmUgYWxsIHByb3BzXG5leHBvcnQgY29uc3QgYmFzZVRhcmdldCA9IChfcHJvdG8/OiBvYmplY3QpID0+IHtcblx0Y29uc3QgcHJvdG8gPSB0eXBlb2YgX3Byb3RvID09PSAnb2JqZWN0JyA/IF9wcm90byA6IG51bGw7XG5cdGNvbnN0IGFuc3dlciA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuXHRyZXR1cm4gYW5zd2VyO1xufTtcblxuZXhwb3J0IGNvbnN0IFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UgPSBTeW1ib2woJ1R5cGXDmG1hdGljYVByb3h5UmVmZXJlbmNlJyk7XG5jb25zdCBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlID0gKF90YXJnZXQ6IG9iamVjdCkgPT4ge1xuXHRjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKF90YXJnZXQpO1xuXHRjb25zdCBpZCA9IGBUeXBlw5htYXRpY2FQcm94eVJlZmVyZW5jZS0ke01hdGgucmFuZG9tKCl9YDtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSwge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpZDtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXJzKTtcblx0cmV0dXJuIHByb3h5O1xufTtcblxuXG5leHBvcnQgY29uc3QgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBUPih0aGlzOiBTIGV4dGVuZHMgVCA/IFMgOiB7fSwgX3RhcmdldD86IFQgKTogVCB7XG5cdGlmICghbmV3LnRhcmdldCkge1xuXG5cdFx0Y29uc3Qgc2VsZjoge1xuXHRcdFx0cHJvdG90eXBlOiB7XG5cdFx0XHRcdGNvbnN0cnVjdG9yOiB0eXBlb2YgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlXG5cdFx0XHR9XG5cdFx0XHQvL0B0cy1pZ25vcmVcblx0XHR9ID0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLmJpbmQodGhpcywgX3RhcmdldCk7XG5cblx0XHRzZWxmLnByb3RvdHlwZSA9IHtcblx0XHRcdGNvbnN0cnVjdG9yOiBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGVcblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiBzZWxmO1xuXG5cdH1cblxuXHQvLyBAdHMtaWdub3JlXG5cdGlmICh0aGlzW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KSBhcyBvYmplY3Q7XG5cblx0Y29uc3QgSW5zdGFuY2VQcm90b3R5cGUgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCk7XG5cblx0bGV0IHByb3RvO1xuXHRsZXQgcHJvdG9Qb2ludGVyID0gdGhpcyBhcyBvYmplY3Q7XG5cdGxldCBwcm90b0NvbnN0cmN1dG9yO1xuXG5cdGxldCBjb25zdHJ1Y3RvcnMgPSBmYWxzZTtcblxuXHQvLyBAdHMtaWdub3JlXG5cdC8vIGNvbnN0IGhhc1Byb3h5UmVmZXJlbmNlID0gcHJvdG9Qb2ludGVyW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblx0Ly8gaWYgKGhhc1Byb3h5UmVmZXJlbmNlKSB7XG5cdC8vIFx0dGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBUeXBlw5htYXRpY2EgaW5zdGFudGlhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgc2FtZSBQcm90b3R5cGUgQ2hhaW4hJyk7XG5cdC8vIH1cblxuXHRkbyB7XG5cdFx0cHJvdG8gPSBwcm90b1BvaW50ZXI7XG5cdFx0cHJvdG9Qb2ludGVyID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0XHRpZiAoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSA9PT0gcHJvdG9Qb2ludGVyKSB7XG5cdFx0XHRjb25zdHJ1Y3RvcnMgPSB0cnVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghcHJvdG9Qb2ludGVyKSBicmVhaztcblx0XHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG9Qb2ludGVyLCAnY29uc3RydWN0b3InKTtcblx0XHRpZiAoIWRlc2NyaXB0b3IpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbHVlID0gZGVzY3JpcHRvci52YWx1ZSB8fCBkZXNjcmlwdG9yLmdldDtcblx0XHQvLyBpZiAoIXZhbHVlKSBjb250aW51ZTtcblx0XHRwcm90b0NvbnN0cmN1dG9yID0gdmFsdWU7XG5cdH0gd2hpbGUgKHByb3RvQ29uc3RyY3V0b3IgIT09IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5cblx0aWYgKCFjb25zdHJ1Y3RvcnMgJiYgcHJvdG9Db25zdHJjdXRvciAhPT0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gc2V0dXAgVHlwZcOYbWF0aWNhIGhhbmRsZXIhJyk7XG5cdH1cblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIEluc3RhbmNlUHJvdG90eXBlKTtcblx0Ly8gQHRzLWlnbm9yZVxuXHRyZXR1cm4gdGhpcztcblxufSBhcyB7XG5cdG5ldzxUIGV4dGVuZHMgb2JqZWN0IHwge30+KF90YXJnZXQ/OiBUKTogVFxuXHQ8VCBleHRlbmRzIG9iamVjdCB8IHt9LCBTIGV4dGVuZHMgVD4oX3RhcmdldD86IFMgZXh0ZW5kcyBpbmZlciBTID8gUyA6IHt9KTogU1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlO1xuXHR9LFxuXHRlbnVtZXJhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IGNsYXNzIEJhc2VDbGFzcyB7XG5cdGNvbnN0cnVjdG9yKF90YXJnZXQ/OiBvYmplY3QpIHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXNbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCkgYXMgb2JqZWN0O1xuXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQpO1xuXHRcdGxldCBwcm90bzogb2JqZWN0IHwgbnVsbCA9IHRoaXM7XG5cdFx0bGV0IHByb3RvUG9pbnRlcjogb2JqZWN0IHwgbnVsbDtcblx0XHRsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRkbyB7XG5cdFx0XHRwcm90b1BvaW50ZXIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHRcdFx0Ly8gaWYgKHByb3RvUG9pbnRlcltTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlXSkge1xuXHRcdFx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBUeXBlw5htYXRpY2EgZXh0ZW5zaW9uIGlzIG5vdCBhbGxvd2VkIScpO1xuXHRcdFx0Ly8gfVxuXHRcdFx0aWYgKHByb3RvUG9pbnRlciA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuXHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdC8vIGl0IGNhbiBiZSwgdGhhdCBwcm90b1BvaW50ZXIgPT09IG51bGxcblx0XHRcdC8vIHRob3VnaCB0b28gaGFyZCB0byBpbXBsZW1lbnQgdGhpcyB0ZXN0XG5cdFx0XHQqL1xuXHRcdFx0cHJvdG8gPSBwcm90b1BvaW50ZXI7XG5cdFx0fSB3aGlsZSAoIWZvdW5kKTtcblx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIHByb3h5KTtcblx0fVxufVxuXG5cbmNvbnN0IHN0cmljdCA9IGZ1bmN0aW9uIChfdGFyZ2V0Pzogb2JqZWN0KSB7XG5cdGNvbnN0IGRlY29yYXRvciA9IGZ1bmN0aW9uPFQ+KGNzdHI6IFQpOiBUIHtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoY3N0ci5wcm90b3R5cGVbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdHJldHVybiBjc3RyO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCk7XG5cdFx0Y29uc3QgcHJveHkgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCk7XG5cdFx0Y29uc3QgX3JlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShwcm94eSk7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBfcmVwbGFjZXIpO1xuXG5cdFx0cmV0dXJuIGNzdHI7XG5cblxuXHRcdC8vIGNvbnN0IE15Q2xhc3NQcm94eSA9IG5ldyBQcm94eShjc3RyLCB7XG5cdFx0Ly8gXHRjb25zdHJ1Y3QoXywgYXJndW1lbnRzTGlzdCwgbmV3VGFyZ2V0KSB7XG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXHRcdC8vIFx0XHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpO1xuXHRcdC8vIFx0XHRjb25zdCBwcm94eSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0KTtcblx0XHQvLyBcdFx0Y29uc3QgX3JlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShwcm94eSk7XG5cblx0XHQvLyBcdFx0Y29uc3QgX3Byb3RvID0gY3N0ci5wcm90b3R5cGU7XG5cblx0XHQvLyBcdFx0Y29uc3QgcHJvdG8gPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihfcHJvdG8pKTtcblx0XHQvLyBcdFx0cHJvdG8uaUFtUHJvdG8gPSB0cnVlO1xuXG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgcHJvdG8pO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoX3Byb3RvKTtcblx0XHQvLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJvdG8sIGRlc2NyaXB0b3JzKTtcblxuXHRcdC8vIFx0XHRjb25zdCByZXBsYWNlciA9IE9iamVjdC5jcmVhdGUoX3JlcGxhY2VyKTtcblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKHByb3RvLCByZXBsYWNlcik7XG5cblxuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIHByb3RvKTtcblx0XHQvLyBcdFx0Y29uc3QgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoY3N0ciwgYXJndW1lbnRzTGlzdCwgbmV3VGFyZ2V0KTtcblxuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBfcHJvdG8pO1xuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblxuXHRcdC8vIFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdC8vIFx0fSxcblx0XHQvLyB9KTtcblx0XHQvLyByZXR1cm4gTXlDbGFzc1Byb3h5O1xuXHR9O1xuXG5cdHJldHVybiBkZWNvcmF0b3I7XG5cbn07XG5leHBvcnQgY29uc3QgeyBTeW1ib2xJbml0aWFsVmFsdWUgfSA9IEZpZWxkQ29uc3RydWN0b3I7XG5leHBvcnQgY29uc3QgU3RyaWN0ID0gc3RyaWN0O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdCYXNlQ2xhc3MnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gQmFzZUNsYXNzO1xuXHR9LFxuXHRlbnVtZXJhYmxlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ0ZpZWxkQ29uc3RydWN0b3InLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gRmllbGRDb25zdHJ1Y3Rvcjtcblx0fSxcblx0ZW51bWVyYWJsZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdTeW1ib2xJbml0aWFsVmFsdWUnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gU3ltYm9sSW5pdGlhbFZhbHVlO1xuXHR9LFxuXHRlbnVtZXJhYmxlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZTtcblx0fSxcblx0ZW51bWVyYWJsZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdiYXNlVGFyZ2V0Jywge1xuXHRnZXQoKSB7XG5cdFx0cmV0dXJuIGJhc2VUYXJnZXQ7XG5cdH0sXG5cdGVudW1lcmFibGU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnU3RyaWN0Jywge1xuXHRnZXQoKSB7XG5cdFx0cmV0dXJuIHN0cmljdDtcblx0fSxcblx0ZW51bWVyYWJsZTogdHJ1ZVxufSk7XG5cbk9iamVjdC5mcmVlemUoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcbk9iamVjdC5mcmVlemUoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSk7XG4iXX0=
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsWUFBWSxDQUFDOzs7QUFFYixxQ0FBdUM7QUFFdkMsbUNBT2lCO0FBRWpCLHFDQUE0QztBQU01QyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQThCLEVBQUUsRUFBRSxFQUFFO0lBQzNELE1BQU0sRUFBRSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3JCLFVBQVUsRUFBVixrQkFBVTtRQUNWLE9BQU8sRUFBUCxlQUFPO1FBQ1AsT0FBTyxFQUFQLGVBQU87UUFDUCxPQUFPLEVBQVAsZUFBTztRQUNQLFNBQVMsRUFBVCxpQkFBUztLQUNULENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUUxQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxZQUFvQixFQUFFLFFBQWdCO1lBQzFELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QyxPQUFPO2dCQUNOLEdBQUc7b0JBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUM1QixJQUFJLGlCQUFpQixJQUFJLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDdEQsTUFBTSxJQUFJLGNBQWMsQ0FBQyxvQkFBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyRCxDQUFDO29CQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDN0IsT0FBTyxNQUFNLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxHQUFHLENBQUMsZ0JBQXlCO29CQUM1QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQzVCLElBQUksaUJBQWlCLElBQUksY0FBYyxLQUFLLFFB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RUFBRSxJQUFJO0NBQ2hCLENBQUMsQ0FBQztBQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRTtJQUN4RSxHQUFHO1FBQ0YsT0FBTyx1Q0FBK0IsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsVUFBVSxFQUFFLElBQUk7Q0FDaEIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtJQUNuRCxHQUFHO1FBQ0YsT0FBTyxrQkFBVSxDQUFDO0lBQ25CLENBQUM7SUFDRCxVQUFVLEVBQUUsSUFBSTtDQUNoQixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO0lBQy9DLEdBQUc7UUFDRixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFDRCxVQUFVLEVBQUUsSUFBSTtDQUNoQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLGdDQUF3QixDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG94bGludC1kaXNhYmxlIHR5cGVzY3JpcHQvbm8tdGhpcy1hbGlhc1xuLyogZXNsaW50LWRpc2FibGUgbm8tZGVidWdnZXIgKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHsgRXJyb3JzTmFtZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmltcG9ydCB7XG5cdGZ1bmN0aW9ucyxcblx0bnVsbGlzaCxcblx0b2JqZWN0cyxcblx0cHJpbWl0aXZlcyxcblx0c3BlY2lhbCxcblx0aXNQcmltaXRpdmVcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IEZpZWxkQ29uc3RydWN0b3IgfSBmcm9tICcuL2ZpZWxkcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZW9tYXRpY2FPcHRpb25zIHtcblx0c3RyaWN0QWNjZXNzQ2hlY2s/OiBib29sZWFuO1xufVxuXG5jb25zdCBjcmVhdGVSZXNvbHZlciA9IChvcHRpb25zOiBUeXBlb21hdGljYU9wdGlvbnMgPSB7fSkgPT4ge1xuXHRjb25zdCB7IHN0cmljdEFjY2Vzc0NoZWNrID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFxuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMoe1xuXHRcdHByaW1pdGl2ZXMsXG5cdFx0c3BlY2lhbCxcblx0XHRudWxsaXNoLFxuXHRcdG9iamVjdHMsXG5cdFx0ZnVuY3Rpb25zXG5cdH0pLnJlZHVjZSgob2JqOiBvYmplY3QsIFtrZXksIF9oYW5kbGVyXSkgPT4ge1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRvYmpba2V5XSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWU6IG9iamVjdCwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdFx0Y29uc3QgaGFuZGxlciA9IF9oYW5kbGVyKGluaXRpYWxWYWx1ZSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXQoKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW52b2NhdGlvblRoaXMgPSB0aGlzO1xuXHRcdFx0XHRcdGlmIChzdHJpY3RBY2Nlc3NDaGVjayAmJiBpbnZvY2F0aW9uVGhpcyAhPT0gcmVjZWl2ZXIpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihFcnJvcnNOYW1lcy5BQ0NFU1NfREVOSUVEKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlci5nZXQoKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogdW5rbm93bikge1xuXHRcdFx0XHRcdGNvbnN0IGludm9jYXRpb25UaGlzID0gdGhpcztcblx0XHRcdFx0XHRpZiAoc3RyaWN0QWNjZXNzQ2hlY2sgJiYgaW52b2NhdGlvblRoaXMgIT09IHJlY2VpdmVyKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIuc2V0KHJlcGxhY2VtZW50VmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHJldHVybiBvYmo7XG5cdH0sIHt9KTtcbn07XG5cbmNvbnN0IGNyZWF0ZVByb3BlcnR5ID0gKHByb3BOYW1lOiBzdHJpbmcsIGluaXRpYWxWYWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4ge1xuXG5cdGNvbnN0IHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHRjb25zdCB2YWx1ZUlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgaXNPYmplY3QgPSB0eXBlb2YgaW5pdGlhbFZhbHVlID09PSAnb2JqZWN0Jztcblx0Y29uc3QgaXNGdW5jdGlvbiA9IGluaXRpYWxWYWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuXHRjb25zdCBpc051bGwgPSBpbml0aWFsVmFsdWUgPT09IG51bGw7XG5cblx0LyoqXG5cdCAqIHNwZWNpYWw6IHVuZGVmaW5lZCBvciBCaWdJbnQgb3IgU3ltYm9sXG5cdCAqIFx0b3Igb3RoZXIgbm9uIGNvbnN0cnVjdGlibGUgdHlwZVxuXHQgKi9cblxuXHRjb25zdCB0eXBlcyA9IHZhbHVlSXNQcmltaXRpdmUgPyAncHJpbWl0aXZlcycgOiAoXG5cdFx0aXNPYmplY3QgPyAoXG5cdFx0XHRpc051bGwgPyAnbnVsbGlzaCcgOiAnb2JqZWN0cydcblx0XHQpIDogKFxuXHRcdFx0aXNGdW5jdGlvbiA/ICdmdW5jdGlvbnMnIDogJ3NwZWNpYWwnXG5cdFx0KVxuXHQpO1xuXG5cdGNvbnN0IHJlc29sdmVyID0gY3JlYXRlUmVzb2x2ZXIob3B0aW9ucyk7XG5cblx0Y29uc3QgZGVzY3JpcHRvciA9IChpc09iamVjdCAmJiAodmFsdWUgaW5zdGFuY2VvZiBGaWVsZENvbnN0cnVjdG9yKSkgP1xuXHRcdHZhbHVlXG5cdFx0OlxuXHRcdHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHQuLi5yZXNvbHZlclt0eXBlc10odmFsdWUsIHJlY2VpdmVyKSxcblx0XHR9O1xuXG5cdC8vIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpZWxkQ29uc3RydWN0b3IpIHtcblx0Ly8gXHRkZXNjcmlwdG9yO1xuXHQvLyBcdGRlYnVnZ2VyO1xuXHQvLyB9XG5cblx0Y29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwgcHJvcE5hbWUsIGRlc2NyaXB0b3IpO1xuXHRyZXR1cm4gcmVzdWx0O1xuXG59O1xuXG4vLyBsaW5lIGJlbG93ICdocmVmJyBpcyBmb3IgdXRpbC5pbnNwZWN0IHdvcmtzLCB1c2VmdWwgZm9yIHYyNFxuY29uc3QgcHJvcHMyc2tpcCA9IG5ldyBTZXQoW1xuXHRTeW1ib2wudG9TdHJpbmdUYWcsXG5cdFN5bWJvbC5pdGVyYXRvcixcblx0Ly8gU3ltYm9sLnRvUHJpbWl0aXZlLFxuXHQndG9TdHJpbmcnLFxuXHQndmFsdWVPZicsXG5cdCdocmVmJ1xuXSk7XG4vLyBjb25zdCBwcm9wczJza2lwID0gbmV3IFNldChbU3ltYm9sLnRvU3RyaW5nVGFnLCBTeW1ib2wuaXRlcmF0b3JdKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBoYXNOb2RlSW5zcGVjdCA9ICh1dGlsICYmIHV0aWwuaW5zcGVjdCAmJiB1dGlsLmluc3BlY3QuY3VzdG9tKTtcbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbihoYXNOb2RlSW5zcGVjdCAmJiAocHJvcHMyc2tpcC5hZGQodXRpbC5pbnNwZWN0LmN1c3RvbSkpKTtcblxuY29uc3QgY3JlYXRlSGFuZGxlcnMgPSAob3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4gKHtcblx0Z2V0KHRhcmdldDogb2JqZWN0LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBvYmplY3QpIHtcblx0XHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcblx0XHRpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdGlmIChwcm9wID09PSAndG9KU09OJykge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKHRoaXM6IHR5cGVvZiB0YXJnZXQpIHtcblx0XHRcdFx0Y29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMpO1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW50cmllcy5yZWR1Y2UoKG9iaiwgW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdG9ialtrZXldID0gdmFsdWUudmFsdWVPZigpO1xuXHRcdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHRcdH0sIHt9KSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRjb25zdCB7IG5hbWUgfSA9IHJlY2VpdmVyLmNvbnN0cnVjdG9yO1xuXHRcdGlmIChwcm9wczJza2lwLmhhcyhwcm9wKSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGAke25hbWV9IGxhY2tzIGRlZmluaXRpb24gb2YgWyAke1N0cmluZyhwcm9wKS52YWx1ZU9mKCl9IF1gO1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdFx0fVxuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGAke0Vycm9yc05hbWVzLk1JU1NJTkdfUFJPUH06IFsgJHtTdHJpbmcocHJvcCkudmFsdWVPZigpfSBdIGZvciAke25hbWV9YDtcblx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcblx0fSxcblx0c2V0KF86IG9iamVjdCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNyZWF0ZVByb3BlcnR5KHByb3AsIHZhbHVlLCByZWNlaXZlciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblx0c2V0UHJvdG90eXBlT2YoKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmcgcHJvdG90eXBlIGlzIG5vdCBhbGxvd2VkIScpO1xuXHR9LFxuXHQvLyBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQ6IG9iamVjdCwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IG9iamVjdCkge1xuXHRkZWZpbmVQcm9wZXJ0eSgpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignRGVmaW5pbmcgbmV3IFByb3BlcnRpZXMgaXMgbm90IGFsbG93ZWQhJyk7XG5cdFx0Ly8gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG5cdH0sXG5cdGRlbGV0ZVByb3BlcnR5KCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0aWVzIERlbGV0aW9uIGlzIG5vdCBhbGxvd2VkIScpO1xuXHR9LFxuXHQvLyBnZXRQcm90b3R5cGVPZigpIHtcblx0Ly8gXHRkZWJ1Z2dlcjtcblx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ0dldHRpbmcgcHJvdG90eXBlIGlzIG5vdCBhbGxvd2VkJyk7XG5cdC8vIH0sXG59KTtcblxuLy8gdXNlciBoYXZlIHRvIHByZWNpc2VseSBkZWZpbmUgYWxsIHByb3BzXG5leHBvcnQgY29uc3QgYmFzZVRhcmdldCA9IChfcHJvdG8/OiBvYmplY3QpID0+IHtcblx0Y29uc3QgcHJvdG8gPSB0eXBlb2YgX3Byb3RvID09PSAnb2JqZWN0JyA/IF9wcm90byA6IG51bGw7XG5cdGNvbnN0IGFuc3dlciA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuXHRyZXR1cm4gYW5zd2VyO1xufTtcblxuZXhwb3J0IGNvbnN0IFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UgPSBTeW1ib2woJ1R5cGXDmG1hdGljYVByb3h5UmVmZXJlbmNlJyk7XG5jb25zdCBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlID0gKF90YXJnZXQ6IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKF90YXJnZXQpO1xuXHRjb25zdCBpZCA9IGBUeXBlw5htYXRpY2FQcm94eVJlZmVyZW5jZS0ke01hdGgucmFuZG9tKCl9YDtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSwge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpZDtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBoYW5kbGVycyA9IGNyZWF0ZUhhbmRsZXJzKG9wdGlvbnMpO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXJzKTtcblx0cmV0dXJuIHByb3h5O1xufTtcblxuXG5leHBvcnQgY29uc3QgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBUPih0aGlzOiBTIGV4dGVuZHMgVCA/IFMgOiB7fSwgX3RhcmdldD86IFQsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMgKTogVCB7XG5cdGlmICghbmV3LnRhcmdldCkge1xuXG5cdFx0Y29uc3Qgc2VsZjoge1xuXHRcdFx0cHJvdG90eXBlOiB7XG5cdFx0XHRcdGNvbnN0cnVjdG9yOiB0eXBlb2YgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlXG5cdFx0XHR9XG5cdFx0XHQvL0B0cy1pZ25vcmVcblx0XHR9ID0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLmJpbmQodGhpcywgX3RhcmdldCwgb3B0aW9ucyk7XG5cblx0XHRzZWxmLnByb3RvdHlwZSA9IHtcblx0XHRcdGNvbnN0cnVjdG9yOiBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGVcblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiBzZWxmO1xuXG5cdH1cblxuXHQvLyBAdHMtaWdub3JlXG5cdGlmICh0aGlzW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KSBhcyBvYmplY3Q7XG5cblx0Y29uc3QgSW5zdGFuY2VQcm90b3R5cGUgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCwgb3B0aW9ucyk7XG5cblx0bGV0IHByb3RvO1xuXHRsZXQgcHJvdG9Qb2ludGVyID0gdGhpcyBhcyBvYmplY3Q7XG5cdGxldCBwcm90b0NvbnN0cmN1dG9yO1xuXG5cdGxldCBjb25zdHJ1Y3RvcnMgPSBmYWxzZTtcblxuXHQvLyBAdHMtaWdub3JlXG5cdC8vIGNvbnN0IGhhc1Byb3h5UmVmZXJlbmNlID0gcHJvdG9Qb2ludGVyW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblx0Ly8gaWYgKGhhc1Byb3h5UmVmZXJlbmNlKSB7XG5cdC8vIFx0dGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBUeXBlw5htYXRpY2EgaW5zdGFudGlhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgc2FtZSBQcm90b3R5cGUgQ2hhaW4hJyk7XG5cdC8vIH1cblxuXHRkbyB7XG5cdFx0cHJvdG8gPSBwcm90b1BvaW50ZXI7XG5cdFx0cHJvdG9Qb2ludGVyID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0XHRpZiAoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSA9PT0gcHJvdG9Qb2ludGVyKSB7XG5cdFx0XHRjb25zdHJ1Y3RvcnMgPSB0cnVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghcHJvdG9Qb2ludGVyKSBicmVhaztcblx0XHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG9Qb2ludGVyLCAnY29uc3RydWN0b3InKTtcblx0XHRpZiAoIWRlc2NyaXB0b3IpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbHVlID0gZGVzY3JpcHRvci52YWx1ZSB8fCBkZXNjcmlwdG9yLmdldDtcblx0XHQvLyBpZiAoIXZhbHVlKSBjb250aW51ZTtcblx0XHRwcm90b0NvbnN0cmN1dG9yID0gdmFsdWU7XG5cdH0gd2hpbGUgKHByb3RvQ29uc3RyY3V0b3IgIT09IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5cblx0aWYgKCFjb25zdHJ1Y3RvcnMgJiYgcHJvdG9Db25zdHJjdXRvciAhPT0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gc2V0dXAgVHlwZcOYbWF0aWNhIGhhbmRsZXIhJyk7XG5cdH1cblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIEluc3RhbmNlUHJvdG90eXBlKTtcblx0Ly8gQHRzLWlnbm9yZVxuXHRyZXR1cm4gdGhpcztcblxufSBhcyB7XG5cdG5ldzxUIGV4dGVuZHMgb2JqZWN0IHwge30+KF90YXJnZXQ/OiBULCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKTogVFxuXHQ8VCBleHRlbmRzIG9iamVjdCB8IHt9LCBTIGV4dGVuZHMgVD4oX3RhcmdldD86IFMgZXh0ZW5kcyBpbmZlciBTID8gUyA6IHt9LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKTogU1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlO1xuXHR9LFxuXHRlbnVtZXJhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IGNsYXNzIEJhc2VDbGFzcyB7XG5cdGNvbnN0cnVjdG9yKF90YXJnZXQ/OiBvYmplY3QsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpIHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXNbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCkgYXMgb2JqZWN0O1xuXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQsIG9wdGlvbnMpO1xuXHRcdGxldCBwcm90bzogb2JqZWN0IHwgbnVsbCA9IHRoaXM7XG5cdFx0bGV0IHByb3RvUG9pbnRlcjogb2JqZWN0IHwgbnVsbDtcblx0XHRsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRkbyB7XG5cdFx0XHRwcm90b1BvaW50ZXIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHRcdFx0Ly8gaWYgKHByb3RvUG9pbnRlcltTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlXSkge1xuXHRcdFx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBUeXBlw5htYXRpY2EgZXh0ZW5zaW9uIGlzIG5vdCBhbGxvd2VkIScpO1xuXHRcdFx0Ly8gfVxuXHRcdFx0aWYgKHByb3RvUG9pbnRlciA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuXHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdC8vIGl0IGNhbiBiZSwgdGhhdCBwcm90b1BvaW50ZXIgPT09IG51bGxcblx0XHRcdC8vIHRob3VnaCB0b28gaGFyZCB0byBpbXBsZW1lbnQgdGhpcyB0ZXN0XG5cdFx0XHQqL1xuXHRcdFx0cHJvdG8gPSBwcm90b1BvaW50ZXI7XG5cdFx0fSB3aGlsZSAoIWZvdW5kKTtcblx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIHByb3h5KTtcblx0fVxufVxuXG5cbmNvbnN0IHN0cmljdCA9IGZ1bmN0aW9uIChfdGFyZ2V0Pzogb2JqZWN0LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSB7XG5cdGNvbnN0IGRlY29yYXRvciA9IGZ1bmN0aW9uPFQ+KGNzdHI6IFQpOiBUIHtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoY3N0ci5wcm90b3R5cGVbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdHJldHVybiBjc3RyO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCk7XG5cdFx0Y29uc3QgcHJveHkgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgX3JlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShwcm94eSk7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBfcmVwbGFjZXIpO1xuXG5cdFx0cmV0dXJuIGNzdHI7XG5cblxuXHRcdC8vIGNvbnN0IE15Q2xhc3NQcm94eSA9IG5ldyBQcm94eShjc3RyLCB7XG5cdFx0Ly8gXHRjb25zdHJ1Y3QoXywgYXJndW1lbnRzTGlzdCwgbmV3VGFyZ2V0KSB7XG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXHRcdC8vIFx0XHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpO1xuXHRcdC8vIFx0XHRjb25zdCBwcm94eSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0KTtcblx0XHQvLyBcdFx0Y29uc3QgX3JlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShwcm94eSk7XG5cblx0XHQvLyBcdFx0Y29uc3QgX3Byb3RvID0gY3N0ci5wcm90b3R5cGU7XG5cblx0XHQvLyBcdFx0Y29uc3QgcHJvdG8gPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihfcHJvdG8pKTtcblx0XHQvLyBcdFx0cHJvdG8uaUFtUHJvdG8gPSB0cnVlO1xuXG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgcHJvdG8pO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoX3Byb3RvKTtcblx0XHQvLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJvdG8sIGRlc2NyaXB0b3JzKTtcblxuXHRcdC8vIFx0XHRjb25zdCByZXBsYWNlciA9IE9iamVjdC5jcmVhdGUoX3JlcGxhY2VyKTtcblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKHByb3RvLCByZXBsYWNlcik7XG5cblxuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIHByb3RvKTtcblx0XHQvLyBcdFx0Y29uc3QgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoY3N0ciwgYXJndW1lbnRzTGlzdCwgbmV3VGFyZ2V0KTtcblxuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBfcHJvdG8pO1xuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblxuXHRcdC8vIFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdC8vIFx0fSxcblx0XHQvLyB9KTtcblx0XHQvLyByZXR1cm4gTXlDbGFzc1Byb3h5O1xuXHR9O1xuXG5cdHJldHVybiBkZWNvcmF0b3I7XG5cbn07XG5leHBvcnQgY29uc3QgeyBTeW1ib2xJbml0aWFsVmFsdWUgfSA9IEZpZWxkQ29uc3RydWN0b3I7XG5leHBvcnQgY29uc3QgU3RyaWN0ID0gc3RyaWN0O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdCYXNlQ2xhc3MnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gQmFzZUNsYXNzO1xuXHR9LFxuXHRlbnVtZXJhYmxlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ0ZpZWxkQ29uc3RydWN0b3InLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gRmllbGRDb25zdHJ1Y3Rvcjtcblx0fSxcblx0ZW51bWVyYWJsZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdTeW1ib2xJbml0aWFsVmFsdWUnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gU3ltYm9sSW5pdGlhbFZhbHVlO1xuXHR9LFxuXHRlbnVtZXJhYmxlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UnLCB7XG5cdGdldCgpIHtcblx0XHRyZXR1cm4gU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZTtcblx0fSxcblx0ZW51bWVyYWJsZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdiYXNlVGFyZ2V0Jywge1xuXHRnZXQoKSB7XG5cdFx0cmV0dXJuIGJhc2VUYXJnZXQ7XG5cdH0sXG5cdGVudW1lcmFibGU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnU3RyaWN0Jywge1xuXHRnZXQoKSB7XG5cdFx0cmV0dXJuIHN0cmljdDtcblx0fSxcblx0ZW51bWVyYWJsZTogdHJ1ZVxufSk7XG5cbk9iamVjdC5mcmVlemUoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcbk9iamVjdC5mcmVlemUoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSk7XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typeomatica",
3
- "version": "0.3.55",
3
+ "version": "0.3.57",
4
4
  "description": "type logic against javascript metaprogramming",
5
5
  "engines": {
6
6
  "node": ">=16"
@@ -24,12 +24,12 @@
24
24
  "build": "lib/"
25
25
  },
26
26
  "scripts": {
27
- "build": "rm -rf ./lib && npx tsc --target es6 --pretty",
27
+ "build": "rm -rf ./lib && npx tsc --target esnext --pretty",
28
28
  "lint:lib": "npx eslint --fix ./lib",
29
29
  "lint:src": "npx eslint --fix ./src",
30
30
  "test": "npx jest",
31
31
  "test:cov": "npx jest --collectCoverage",
32
- "test:addition": "npm run build && node --test --experimental-test-coverage ./test/addition.js",
32
+ "test:addition": "node --test --experimental-test-coverage ./test/noJest.ts",
33
33
  "debug:on-issues": "echo 'if debugger; command is not working try other Node.JS version'",
34
34
  "debug": "node --inspect-brk --nolazy node_modules/.bin/jest --runInBand --detectOpenHandles",
35
35
  "debug:jest": "node --nolazy --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --colors --verbose",