mol_crypto_lib 0.0.414 → 0.0.415

Sign up to get free protection for your applications and to get access to all the features.
package/node.test.js CHANGED
@@ -21,242 +21,176 @@ module.exports = $;
21
21
  //mam.ts
22
22
  ;
23
23
  "use strict";
24
+ //node/node.ts
25
+ ;
26
+ "use strict";
27
+ var $node = new Proxy({ require }, {
28
+ get(target, name, wrapper) {
29
+ if (target[name])
30
+ return target[name];
31
+ const mod = target.require('module');
32
+ if (mod.builtinModules.indexOf(name) >= 0)
33
+ return target.require(name);
34
+ if (name[0] === '.')
35
+ return target.require(name);
36
+ const path = target.require('path');
37
+ const fs = target.require('fs');
38
+ let dir = path.resolve('.');
39
+ const suffix = `./node_modules/${name}`;
40
+ const $$ = $;
41
+ while (!fs.existsSync(path.join(dir, suffix))) {
42
+ const parent = path.resolve(dir, '..');
43
+ if (parent === dir) {
44
+ $$.$mol_exec('.', 'npm', 'install', '--omit=dev', name);
45
+ try {
46
+ $$.$mol_exec('.', 'npm', 'install', '--omit=dev', '@types/' + name);
47
+ }
48
+ catch { }
49
+ break;
50
+ }
51
+ else {
52
+ dir = parent;
53
+ }
54
+ }
55
+ return target.require(name);
56
+ },
57
+ set(target, name, value) {
58
+ target[name] = value;
59
+ return true;
60
+ },
61
+ });
62
+ require = (req => Object.assign(function require(name) {
63
+ return $node[name];
64
+ }, req))(require);
65
+ //node/node.node.ts
66
+ ;
67
+ "use strict";
24
68
  var $;
25
69
  (function ($) {
26
- const algorithm = {
27
- name: 'AES-GCM',
28
- length: 128,
29
- tagLength: 32,
30
- };
31
- class $mol_crypto_secret extends Object {
32
- native;
33
- static size = 16;
34
- static extra = 4;
35
- constructor(native) {
36
- super();
37
- this.native = native;
38
- }
39
- static async generate() {
40
- return new this(await crypto.subtle.generateKey(algorithm, true, ['encrypt', 'decrypt']));
41
- }
42
- static async from(serial) {
43
- return new this(await crypto.subtle.importKey('raw', serial, algorithm, true, ['encrypt', 'decrypt']));
44
- }
45
- async serial() {
46
- return await crypto.subtle.exportKey('raw', this.native);
47
- }
48
- async encrypt(open, salt) {
49
- return await crypto.subtle.encrypt({
50
- ...algorithm,
51
- iv: salt,
52
- }, this.native, open);
53
- }
54
- async decrypt(closed, salt) {
55
- return await crypto.subtle.decrypt({
56
- ...algorithm,
57
- iv: salt,
58
- }, this.native, closed);
59
- }
70
+ function $mol_log3_area_lazy(event) {
71
+ const self = this;
72
+ const stack = self.$mol_log3_stack;
73
+ const deep = stack.length;
74
+ let logged = false;
75
+ stack.push(() => {
76
+ logged = true;
77
+ self.$mol_log3_area.call(self, event);
78
+ });
79
+ return () => {
80
+ if (logged)
81
+ self.console.groupEnd();
82
+ if (stack.length > deep)
83
+ stack.length = deep;
84
+ };
60
85
  }
61
- $.$mol_crypto_secret = $mol_crypto_secret;
86
+ $.$mol_log3_area_lazy = $mol_log3_area_lazy;
87
+ $.$mol_log3_stack = [];
62
88
  })($ || ($ = {}));
63
- //mol/crypto/secret/secret.ts
89
+ //mol/log3/log3.ts
64
90
  ;
65
91
  "use strict";
66
92
  var $;
67
93
  (function ($) {
68
- const algorithm = {
69
- name: 'RSA-OAEP',
70
- modulusLength: 1024,
71
- publicExponent: new Uint8Array([1, 0, 1]),
72
- hash: 'SHA-1',
73
- };
74
- async function $mol_crypto_cipher_pair() {
75
- const pair = await $.crypto.subtle.generateKey(algorithm, true, ['encrypt', 'decrypt']);
76
- return {
77
- public: new $mol_crypto_cipher_public(pair.publicKey),
78
- private: new $mol_crypto_cipher_private(pair.privateKey),
79
- };
80
- }
81
- $.$mol_crypto_cipher_pair = $mol_crypto_cipher_pair;
82
- class $mol_crypto_cipher_public extends Object {
83
- native;
84
- static size = 162;
85
- constructor(native) {
86
- super();
87
- this.native = native;
88
- }
89
- static async from(serial) {
90
- return new this(await crypto.subtle.importKey('spki', serial, algorithm, true, ['encrypt']));
91
- }
92
- async serial() {
93
- return await crypto.subtle.exportKey('spki', this.native);
94
- }
95
- async encrypt(data) {
96
- return await crypto.subtle.encrypt(algorithm, this.native, data);
97
- }
98
- }
99
- $.$mol_crypto_cipher_public = $mol_crypto_cipher_public;
100
- class $mol_crypto_cipher_private extends Object {
101
- native;
102
- constructor(native) {
103
- super();
104
- this.native = native;
105
- }
106
- static async from(serial) {
107
- return new this(await crypto.subtle.importKey('pkcs8', serial, algorithm, true, ['decrypt']));
108
- }
109
- async serial() {
110
- return await crypto.subtle.exportKey('pkcs8', this.native);
111
- }
112
- async decrypt(data) {
113
- return await crypto.subtle.decrypt(algorithm, this.native, data);
114
- }
94
+ $.$mol_ambient_ref = Symbol('$mol_ambient_ref');
95
+ function $mol_ambient(overrides) {
96
+ return Object.setPrototypeOf(overrides, this || $);
115
97
  }
116
- $.$mol_crypto_cipher_private = $mol_crypto_cipher_private;
117
- $.$mol_crypto_cipher_ecrypted_size = 128;
98
+ $.$mol_ambient = $mol_ambient;
118
99
  })($ || ($ = {}));
119
- //mol/crypto/cipher/cipher.ts
100
+ //mol/ambient/ambient.ts
120
101
  ;
121
102
  "use strict";
122
103
  var $;
123
104
  (function ($) {
124
- const algorithm = {
125
- name: 'RSA-PSS',
126
- modulusLength: 256,
127
- publicExponent: new Uint8Array([1, 0, 1]),
128
- hash: 'SHA-1',
129
- saltLength: 8,
130
- };
131
- async function $mol_crypto_auditor_pair() {
132
- const pair = await $.crypto.subtle.generateKey(algorithm, true, ['sign', 'verify']);
133
- return {
134
- public: new $mol_crypto_auditor_public(pair.publicKey),
135
- private: new $mol_crypto_auditor_private(pair.privateKey),
136
- };
137
- }
138
- $.$mol_crypto_auditor_pair = $mol_crypto_auditor_pair;
139
- class $mol_crypto_auditor_public extends Object {
140
- native;
141
- static size = 62;
142
- constructor(native) {
143
- super();
144
- this.native = native;
145
- }
146
- static async from(serial) {
147
- return new this(await crypto.subtle.importKey('spki', serial, algorithm, true, ['verify']));
148
- }
149
- async serial() {
150
- return await crypto.subtle.exportKey('spki', this.native);
151
- }
152
- async verify(data, sign) {
153
- return await crypto.subtle.verify(algorithm, this.native, sign, data);
154
- }
155
- }
156
- $.$mol_crypto_auditor_public = $mol_crypto_auditor_public;
157
- class $mol_crypto_auditor_private extends Object {
158
- native;
159
- static size = 200;
160
- constructor(native) {
161
- super();
162
- this.native = native;
163
- }
164
- static async from(serial) {
165
- return new this(await crypto.subtle.importKey('pkcs8', serial, algorithm, true, ['sign']));
166
- }
167
- async serial() {
168
- return await crypto.subtle.exportKey('pkcs8', this.native);
169
- }
170
- async sign(data) {
171
- return await crypto.subtle.sign(algorithm, this.native, data);
172
- }
105
+ const instances = new WeakSet();
106
+ function $mol_delegate(proto, target) {
107
+ const proxy = new Proxy(proto, {
108
+ get: (_, field) => {
109
+ const obj = target();
110
+ let val = Reflect.get(obj, field);
111
+ if (typeof val === 'function') {
112
+ val = val.bind(obj);
113
+ }
114
+ return val;
115
+ },
116
+ has: (_, field) => Reflect.has(target(), field),
117
+ set: (_, field, value) => Reflect.set(target(), field, value),
118
+ getOwnPropertyDescriptor: (_, field) => Reflect.getOwnPropertyDescriptor(target(), field),
119
+ ownKeys: () => Reflect.ownKeys(target()),
120
+ getPrototypeOf: () => Reflect.getPrototypeOf(target()),
121
+ setPrototypeOf: (_, donor) => Reflect.setPrototypeOf(target(), donor),
122
+ isExtensible: () => Reflect.isExtensible(target()),
123
+ preventExtensions: () => Reflect.preventExtensions(target()),
124
+ apply: (_, self, args) => Reflect.apply(target(), self, args),
125
+ construct: (_, args, retarget) => Reflect.construct(target(), args, retarget),
126
+ defineProperty: (_, field, descr) => Reflect.defineProperty(target(), field, descr),
127
+ deleteProperty: (_, field) => Reflect.deleteProperty(target(), field),
128
+ });
129
+ instances.add(proxy);
130
+ return proxy;
173
131
  }
174
- $.$mol_crypto_auditor_private = $mol_crypto_auditor_private;
175
- $.$mol_crypto_auditor_sign_size = 32;
132
+ $.$mol_delegate = $mol_delegate;
133
+ Reflect.defineProperty($mol_delegate, Symbol.hasInstance, {
134
+ value: (obj) => instances.has(obj),
135
+ });
176
136
  })($ || ($ = {}));
177
- //mol/crypto/auditor/auditor.ts
137
+ //mol/delegate/delegate.ts
178
138
  ;
179
139
  "use strict";
180
140
  var $;
181
141
  (function ($) {
182
- let sponge = new Uint32Array(80);
183
- function $mol_crypto_hash(data) {
184
- const bits = data.byteLength << 3;
185
- const kbits = bits >> 5;
186
- const kword = 0x80 << (24 - bits & 0b11111);
187
- const bytes = 16 + (bits + 64 >>> 9 << 4);
188
- const klens = bytes - 1;
189
- const words = new Int32Array(data.buffer, data.byteOffset, data.byteLength >> 2);
190
- let tail = 0;
191
- for (let i = words.length * 4; i < data.length; ++i) {
192
- tail |= data[i] << (i << 3 & 0b11000);
142
+ $.$mol_owning_map = new WeakMap();
143
+ function $mol_owning_allow(having) {
144
+ try {
145
+ if (!having)
146
+ return false;
147
+ if (typeof having !== 'object')
148
+ return false;
149
+ if (having instanceof $mol_delegate)
150
+ return false;
151
+ if (typeof having['destructor'] !== 'function')
152
+ return false;
153
+ return true;
193
154
  }
194
- const hash = new Int32Array([1732584193, -271733879, -1732584194, 271733878, -1009589776]);
195
- for (let i = 0; i < bytes; i += 16) {
196
- let h0 = hash[0];
197
- let h1 = hash[1];
198
- let h2 = hash[2];
199
- let h3 = hash[3];
200
- let h4 = hash[4];
201
- for (let j = 0; j < 80; ++j) {
202
- let turn;
203
- if (j < 16) {
204
- const k = i + j;
205
- if (k === klens) {
206
- sponge[j] = bits;
207
- }
208
- else {
209
- let word = k === words.length ? tail :
210
- k > words.length ? 0 :
211
- words[k];
212
- word = word << 24 | word << 8 & 0xFF0000 | word >>> 8 & 0xFF00 | word >>> 24 & 0xFF;
213
- if (k === kbits)
214
- word |= kword;
215
- sponge[j] = word;
216
- }
217
- turn = (h1 & h2 | ~h1 & h3) + 1518500249;
218
- }
219
- else {
220
- const shuffle = sponge[j - 3] ^ sponge[j - 8] ^ sponge[j - 14] ^ sponge[j - 16];
221
- sponge[j] = shuffle << 1 | shuffle >>> 31;
222
- turn =
223
- j < 20 ? (h1 & h2 | ~h1 & h3) + 1518500249 :
224
- j < 40 ? (h1 ^ h2 ^ h3) + 1859775393 :
225
- j < 60 ? (h1 & h2 | h1 & h3 | h2 & h3) - 1894007588 :
226
- (h1 ^ h2 ^ h3) - 899497514;
227
- }
228
- const next = turn + h4 + (sponge[j] >>> 0) + ((h0 << 5) | (h0 >>> 27));
229
- h4 = h3;
230
- h3 = h2;
231
- h2 = (h1 << 30) | (h1 >>> 2);
232
- h1 = h0;
233
- h0 = next;
234
- }
235
- hash[0] += h0;
236
- hash[1] += h1;
237
- hash[2] += h2;
238
- hash[3] += h3;
239
- hash[4] += h4;
155
+ catch {
156
+ return false;
240
157
  }
241
- for (let i = 0; i < 20; ++i) {
242
- const word = hash[i];
243
- hash[i] = word << 24 | word << 8 & 0xFF0000 | word >>> 8 & 0xFF00 | word >>> 24 & 0xFF;
158
+ }
159
+ $.$mol_owning_allow = $mol_owning_allow;
160
+ function $mol_owning_get(having, Owner) {
161
+ if (!$mol_owning_allow(having))
162
+ return null;
163
+ while (true) {
164
+ const owner = $.$mol_owning_map.get(having);
165
+ if (!owner)
166
+ return owner;
167
+ if (!Owner)
168
+ return owner;
169
+ if (owner instanceof Owner)
170
+ return owner;
171
+ having = owner;
244
172
  }
245
- return new Uint8Array(hash.buffer);
246
173
  }
247
- $.$mol_crypto_hash = $mol_crypto_hash;
248
- })($ || ($ = {}));
249
- //mol/crypto/hash/hash.ts
250
- ;
251
- "use strict";
252
- var $;
253
- (function ($) {
254
- function $mol_crypto_salt() {
255
- return crypto.getRandomValues(new Uint8Array(8));
174
+ $.$mol_owning_get = $mol_owning_get;
175
+ function $mol_owning_check(owner, having) {
176
+ if (!$mol_owning_allow(having))
177
+ return false;
178
+ if ($.$mol_owning_map.get(having) !== owner)
179
+ return false;
180
+ return true;
256
181
  }
257
- $.$mol_crypto_salt = $mol_crypto_salt;
182
+ $.$mol_owning_check = $mol_owning_check;
183
+ function $mol_owning_catch(owner, having) {
184
+ if (!$mol_owning_allow(having))
185
+ return false;
186
+ if ($.$mol_owning_map.get(having))
187
+ return false;
188
+ $.$mol_owning_map.set(having, owner);
189
+ return true;
190
+ }
191
+ $.$mol_owning_catch = $mol_owning_catch;
258
192
  })($ || ($ = {}));
259
- //mol/crypto/salt/salt.ts
193
+ //mol/owning/owning.ts
260
194
  ;
261
195
  "use strict";
262
196
  var $;
@@ -279,1566 +213,1635 @@ var $;
279
213
  //mol/fail/hidden/hidden.ts
280
214
  ;
281
215
  "use strict";
282
- var $;
283
- (function ($) {
284
- function $mol_test_complete() {
285
- process.exit(0);
286
- }
287
- $.$mol_test_complete = $mol_test_complete;
288
- })($ || ($ = {}));
289
- //mol/test/test.node.test.ts
216
+ //mol/type/writable/writable.ts
290
217
  ;
291
218
  "use strict";
292
219
  var $;
293
- (function ($_1) {
294
- function $mol_test(set) {
295
- for (let name in set) {
296
- const code = set[name];
297
- const test = (typeof code === 'string') ? new Function('', code) : code;
298
- $_1.$mol_test_all.push(test);
220
+ (function ($) {
221
+ class $mol_object2 {
222
+ static $ = $;
223
+ [$mol_ambient_ref] = null;
224
+ get $() {
225
+ if (this[$mol_ambient_ref])
226
+ return this[$mol_ambient_ref];
227
+ const owner = $mol_owning_get(this);
228
+ return this[$mol_ambient_ref] = owner?.$ || $mol_object2.$;
299
229
  }
300
- $mol_test_schedule();
301
- }
302
- $_1.$mol_test = $mol_test;
303
- $_1.$mol_test_mocks = [];
304
- $_1.$mol_test_all = [];
305
- async function $mol_test_run() {
306
- for (var test of $_1.$mol_test_all) {
307
- let context = Object.create($$);
308
- for (let mock of $_1.$mol_test_mocks)
309
- await mock(context);
310
- const res = test(context);
311
- if (res instanceof Promise) {
312
- await new Promise((done, fail) => {
313
- res.then(done, fail);
314
- setTimeout(() => fail(new Error('Test timeout: ' + test.name)), 1000);
315
- });
316
- }
230
+ set $(next) {
231
+ if (this[$mol_ambient_ref])
232
+ $mol_fail_hidden(new Error('Context already defined'));
233
+ this[$mol_ambient_ref] = next;
317
234
  }
318
- $$.$mol_log3_done({
319
- place: '$mol_test',
320
- message: 'All tests passed',
321
- count: $_1.$mol_test_all.length,
322
- });
323
- }
324
- $_1.$mol_test_run = $mol_test_run;
325
- let scheduled = false;
326
- function $mol_test_schedule() {
327
- if (scheduled)
328
- return;
329
- scheduled = true;
330
- setTimeout(async () => {
331
- scheduled = false;
332
- try {
333
- await $mol_test_run();
334
- }
335
- finally {
336
- $$.$mol_test_complete();
337
- }
338
- }, 0);
339
- }
340
- $_1.$mol_test_schedule = $mol_test_schedule;
341
- $_1.$mol_test_mocks.push(context => {
342
- let seed = 0;
343
- context.Math = Object.create(Math);
344
- context.Math.random = () => Math.sin(seed++);
345
- const forbidden = ['XMLHttpRequest', 'fetch'];
346
- for (let api of forbidden) {
347
- context[api] = new Proxy(function () { }, {
348
- get() {
349
- $mol_fail_hidden(new Error(`${api} is forbidden in tests`));
350
- },
351
- apply() {
352
- $mol_fail_hidden(new Error(`${api} is forbidden in tests`));
353
- },
354
- });
235
+ static create(init) {
236
+ const obj = new this;
237
+ if (init)
238
+ init(obj);
239
+ return obj;
355
240
  }
356
- });
357
- $mol_test({
358
- 'mocked Math.random'($) {
359
- console.assert($.Math.random() === 0);
360
- console.assert($.Math.random() === Math.sin(1));
361
- },
362
- 'forbidden XMLHttpRequest'($) {
363
- try {
364
- console.assert(void new $.XMLHttpRequest);
365
- }
366
- catch (error) {
367
- console.assert(error.message === 'XMLHttpRequest is forbidden in tests');
368
- }
369
- },
370
- 'forbidden fetch'($) {
371
- try {
372
- console.assert(void $.fetch(''));
373
- }
374
- catch (error) {
375
- console.assert(error.message === 'fetch is forbidden in tests');
376
- }
377
- },
378
- });
241
+ static [Symbol.toPrimitive]() {
242
+ return this.toString();
243
+ }
244
+ static toString() {
245
+ if (Symbol.toStringTag in this)
246
+ return this[Symbol.toStringTag];
247
+ return this.name;
248
+ }
249
+ destructor() { }
250
+ toString() {
251
+ return this[Symbol.toStringTag] || this.constructor.name + '()';
252
+ }
253
+ toJSON() {
254
+ return this.toString();
255
+ }
256
+ }
257
+ $.$mol_object2 = $mol_object2;
379
258
  })($ || ($ = {}));
380
- //mol/test/test.test.ts
259
+ //mol/object2/object2.ts
381
260
  ;
382
261
  "use strict";
383
262
  var $;
384
263
  (function ($) {
385
- })($ || ($ = {}));
386
- //mol/dom/context/context.ts
387
- ;
388
- "use strict";
389
- //node/node.ts
390
- ;
391
- "use strict";
392
- var $node = new Proxy({ require }, {
393
- get(target, name, wrapper) {
394
- if (target[name])
395
- return target[name];
396
- const mod = target.require('module');
397
- if (mod.builtinModules.indexOf(name) >= 0)
398
- return target.require(name);
399
- if (name[0] === '.')
400
- return target.require(name);
401
- const path = target.require('path');
402
- const fs = target.require('fs');
403
- let dir = path.resolve('.');
404
- const suffix = `./node_modules/${name}`;
405
- const $$ = $;
406
- while (!fs.existsSync(path.join(dir, suffix))) {
407
- const parent = path.resolve(dir, '..');
408
- if (parent === dir) {
409
- $$.$mol_exec('.', 'npm', 'install', '--omit=dev', name);
410
- try {
411
- $$.$mol_exec('.', 'npm', 'install', '--omit=dev', '@types/' + name);
264
+ $.$mol_tree_convert = Symbol('$mol_tree_convert');
265
+ class $mol_tree extends $mol_object2 {
266
+ type;
267
+ data;
268
+ sub;
269
+ baseUri;
270
+ row;
271
+ col;
272
+ length;
273
+ constructor(config = {}) {
274
+ super();
275
+ this.type = config.type || '';
276
+ if (config.value !== undefined) {
277
+ var sub = $mol_tree.values(config.value);
278
+ if (config.type || sub.length > 1) {
279
+ this.sub = [...sub, ...(config.sub || [])];
280
+ this.data = config.data || '';
281
+ }
282
+ else {
283
+ this.data = sub[0].data;
284
+ this.sub = config.sub || [];
412
285
  }
413
- catch { }
414
- break;
415
286
  }
416
287
  else {
417
- dir = parent;
418
- }
288
+ this.data = config.data || '';
289
+ this.sub = config.sub || [];
290
+ }
291
+ this.baseUri = config.baseUri || '';
292
+ this.row = config.row || 0;
293
+ this.col = config.col || 0;
294
+ this.length = config.length || 0;
419
295
  }
420
- return target.require(name);
421
- },
422
- set(target, name, value) {
423
- target[name] = value;
424
- return true;
425
- },
426
- });
427
- require = (req => Object.assign(function require(name) {
428
- return $node[name];
429
- }, req))(require);
430
- //node/node.node.ts
431
- ;
432
- "use strict";
433
- var $;
434
- (function ($) {
435
- function $mol_log3_area_lazy(event) {
436
- const self = this;
437
- const stack = self.$mol_log3_stack;
438
- const deep = stack.length;
439
- let logged = false;
440
- stack.push(() => {
441
- logged = true;
442
- self.$mol_log3_area.call(self, event);
443
- });
444
- return () => {
445
- if (logged)
446
- self.console.groupEnd();
447
- if (stack.length > deep)
448
- stack.length = deep;
449
- };
450
- }
451
- $.$mol_log3_area_lazy = $mol_log3_area_lazy;
452
- $.$mol_log3_stack = [];
453
- })($ || ($ = {}));
454
- //mol/log3/log3.ts
455
- ;
456
- "use strict";
457
- var $;
458
- (function ($) {
459
- class $mol_term_color {
460
- static reset = this.ansi(0, 0);
461
- static bold = this.ansi(1, 22);
462
- static italic = this.ansi(3, 23);
463
- static underline = this.ansi(4, 24);
464
- static inverse = this.ansi(7, 27);
465
- static hidden = this.ansi(8, 28);
466
- static strike = this.ansi(9, 29);
467
- static gray = this.ansi(90, 39);
468
- static red = this.ansi(91, 39);
469
- static green = this.ansi(92, 39);
470
- static yellow = this.ansi(93, 39);
471
- static blue = this.ansi(94, 39);
472
- static magenta = this.ansi(95, 39);
473
- static cyan = this.ansi(96, 39);
474
- static white = this.ansi(97, 39);
475
- static Red = (str) => this.inverse(this.red(str));
476
- static Green = (str) => this.inverse(this.green(str));
477
- static Yellow = (str) => this.inverse(this.yellow(str));
478
- static Blue = (str) => this.inverse(this.blue(str));
479
- static Magenta = (str) => this.inverse(this.magenta(str));
480
- static Cyan = (str) => this.inverse(this.cyan(str));
481
- static White = (str) => this.inverse(this.white(str));
482
- static ansi(open, close) {
483
- if (typeof process === 'undefined')
484
- return String;
485
- if (!process.stdout.isTTY)
486
- return String;
487
- const prefix = `\x1b[${open}m`;
488
- const postfix = `\x1b[${close}m`;
489
- const suffix_regexp = new RegExp(postfix.replace('[', '\\['), 'g');
490
- return function colorer(str) {
491
- str = String(str);
492
- if (str === '')
493
- return str;
494
- const suffix = str.replace(suffix_regexp, prefix);
495
- return prefix + suffix + postfix;
496
- };
296
+ static values(str, baseUri) {
297
+ return str.split('\n').map((data, index) => new $mol_tree({
298
+ data: data,
299
+ baseUri: baseUri,
300
+ row: index + 1,
301
+ length: data.length,
302
+ }));
497
303
  }
498
- }
499
- $.$mol_term_color = $mol_term_color;
500
- })($ || ($ = {}));
501
- //mol/term/color/color.ts
502
- ;
503
- "use strict";
504
- var $;
505
- (function ($) {
506
- function $mol_log3_node_make(level, output, type, color) {
507
- return function $mol_log3_logger(event) {
508
- if (!event.time)
509
- event = { time: new Date().toISOString(), ...event };
510
- const tree = this.$mol_tree.fromJSON(event).clone({ type });
511
- let str = color(tree.toString());
512
- this.console[level](str);
513
- const self = this;
514
- return () => self.console.groupEnd();
515
- };
516
- }
517
- $.$mol_log3_node_make = $mol_log3_node_make;
518
- $.$mol_log3_come = $mol_log3_node_make('info', 'stdout', 'come', $mol_term_color.blue);
519
- $.$mol_log3_done = $mol_log3_node_make('info', 'stdout', 'done', $mol_term_color.green);
520
- $.$mol_log3_fail = $mol_log3_node_make('error', 'stderr', 'fail', $mol_term_color.red);
521
- $.$mol_log3_warn = $mol_log3_node_make('warn', 'stderr', 'warn', $mol_term_color.yellow);
522
- $.$mol_log3_rise = $mol_log3_node_make('log', 'stdout', 'rise', $mol_term_color.magenta);
523
- $.$mol_log3_area = $mol_log3_node_make('log', 'stdout', 'area', $mol_term_color.cyan);
524
- })($ || ($ = {}));
525
- //mol/log3/log3.node.ts
526
- ;
527
- "use strict";
528
- var $;
529
- (function ($_1) {
530
- $mol_test_mocks.push($ => {
531
- $.$mol_log3_come = () => { };
532
- $.$mol_log3_done = () => { };
533
- $.$mol_log3_fail = () => { };
534
- $.$mol_log3_warn = () => { };
535
- $.$mol_log3_rise = () => { };
536
- $.$mol_log3_area = () => () => { };
537
- });
538
- })($ || ($ = {}));
539
- //mol/log3/log3.test.ts
540
- ;
541
- "use strict";
542
- var $;
543
- (function ($) {
544
- function $mol_env() {
545
- return {};
546
- }
547
- $.$mol_env = $mol_env;
548
- })($ || ($ = {}));
549
- //mol/env/env.ts
550
- ;
551
- "use strict";
552
- var $;
553
- (function ($) {
554
- $.$mol_env = function $mol_env() {
555
- return this.process.env;
556
- };
557
- })($ || ($ = {}));
558
- //mol/env/env.node.ts
559
- ;
560
- "use strict";
561
- var $;
562
- (function ($) {
563
- function $mol_exec(dir, command, ...args) {
564
- let [app, ...args0] = command.split(' ');
565
- args = [...args0, ...args];
566
- this.$mol_log3_come({
567
- place: '$mol_exec',
568
- dir: $node.path.relative('', dir),
569
- message: 'Run',
570
- command: `${app} ${args.join(' ')}`,
571
- });
572
- var res = $node['child_process'].spawnSync(app, args, {
573
- cwd: $node.path.resolve(dir),
574
- shell: true,
575
- env: this.$mol_env(),
576
- });
577
- if (res.status || res.error)
578
- return $mol_fail(res.error || new Error(res.stderr.toString()));
579
- if (!res.stdout)
580
- res.stdout = Buffer.from([]);
581
- return res;
582
- }
583
- $.$mol_exec = $mol_exec;
584
- })($ || ($ = {}));
585
- //mol/exec/exec.node.ts
586
- ;
587
- "use strict";
588
- var $;
589
- (function ($) {
590
- $.$mol_dom_context = new $node.jsdom.JSDOM('', { url: 'https://localhost/' }).window;
591
- })($ || ($ = {}));
592
- //mol/dom/context/context.node.ts
593
- ;
594
- "use strict";
595
- var $;
596
- (function ($) {
597
- function $mol_dom_render_children(el, childNodes) {
598
- const node_set = new Set(childNodes);
599
- let nextNode = el.firstChild;
600
- for (let view of childNodes) {
601
- if (view == null)
602
- continue;
603
- if (view instanceof $mol_dom_context.Node) {
604
- while (true) {
605
- if (!nextNode) {
606
- el.appendChild(view);
607
- break;
304
+ clone(config = {}) {
305
+ return new $mol_tree({
306
+ type: ('type' in config) ? config.type : this.type,
307
+ data: ('data' in config) ? config.data : this.data,
308
+ sub: ('sub' in config) ? config.sub : this.sub,
309
+ baseUri: ('baseUri' in config) ? config.baseUri : this.baseUri,
310
+ row: ('row' in config) ? config.row : this.row,
311
+ col: ('col' in config) ? config.col : this.col,
312
+ length: ('length' in config) ? config.length : this.length,
313
+ value: config.value
314
+ });
315
+ }
316
+ make(config) {
317
+ return new $mol_tree({
318
+ baseUri: this.baseUri,
319
+ row: this.row,
320
+ col: this.col,
321
+ length: this.length,
322
+ ...config,
323
+ });
324
+ }
325
+ make_data(value, sub) {
326
+ return this.make({ value, sub });
327
+ }
328
+ make_struct(type, sub) {
329
+ return this.make({ type, sub });
330
+ }
331
+ static fromString(str, baseUri) {
332
+ var root = new $mol_tree({ baseUri: baseUri });
333
+ var stack = [root];
334
+ var row = 0;
335
+ var prefix = str.replace(/^\n?(\t*)[\s\S]*/, '$1');
336
+ var lines = str.replace(new RegExp('^\\t{0,' + prefix.length + '}', 'mg'), '').split('\n');
337
+ lines.forEach(line => {
338
+ ++row;
339
+ var chunks = /^(\t*)((?:[^\n\t\\ ]+ *)*)(\\[^\n]*)?(.*?)(?:$|\n)/m.exec(line);
340
+ if (!chunks || chunks[4])
341
+ return this.$.$mol_fail(new Error(`Syntax error at ${baseUri}:${row}\n${line}`));
342
+ var indent = chunks[1];
343
+ var path = chunks[2];
344
+ var data = chunks[3];
345
+ var deep = indent.length;
346
+ var types = path ? path.replace(/ $/, '').split(/ +/) : [];
347
+ if (stack.length <= deep)
348
+ return this.$.$mol_fail(new Error(`Too many tabs at ${baseUri}:${row}\n${line}`));
349
+ stack.length = deep + 1;
350
+ var parent = stack[deep];
351
+ let col = deep;
352
+ types.forEach(type => {
353
+ if (!type)
354
+ return this.$.$mol_fail(new Error(`Unexpected space symbol ${baseUri}:${row}\n${line}`));
355
+ var next = new $mol_tree({ type, baseUri, row, col, length: type.length });
356
+ const parent_sub = parent.sub;
357
+ parent_sub.push(next);
358
+ parent = next;
359
+ col += type.length + 1;
360
+ });
361
+ if (data) {
362
+ var next = new $mol_tree({ data: data.substring(1), baseUri, row, col, length: data.length });
363
+ const parent_sub = parent.sub;
364
+ parent_sub.push(next);
365
+ parent = next;
366
+ }
367
+ stack.push(parent);
368
+ });
369
+ return root;
370
+ }
371
+ static fromJSON(json, baseUri = '') {
372
+ switch (true) {
373
+ case typeof json === 'boolean':
374
+ case typeof json === 'number':
375
+ case json === null:
376
+ return new $mol_tree({
377
+ type: String(json),
378
+ baseUri: baseUri
379
+ });
380
+ case typeof json === 'string':
381
+ return new $mol_tree({
382
+ value: json,
383
+ baseUri: baseUri
384
+ });
385
+ case Array.isArray(json):
386
+ return new $mol_tree({
387
+ type: "/",
388
+ sub: json.map(json => $mol_tree.fromJSON(json, baseUri))
389
+ });
390
+ case json instanceof Date:
391
+ return new $mol_tree({
392
+ value: json.toISOString(),
393
+ baseUri: baseUri
394
+ });
395
+ default:
396
+ if (typeof json[$.$mol_tree_convert] === 'function') {
397
+ return json[$.$mol_tree_convert]();
608
398
  }
609
- if (nextNode == view) {
610
- nextNode = nextNode.nextSibling;
611
- break;
399
+ if (typeof json.toJSON === 'function') {
400
+ return $mol_tree.fromJSON(json.toJSON());
612
401
  }
613
- else {
614
- if (node_set.has(nextNode)) {
615
- el.insertBefore(view, nextNode);
616
- break;
402
+ if (json instanceof Error) {
403
+ const { name, message, stack } = json;
404
+ json = { ...json, name, message, stack };
405
+ }
406
+ var sub = [];
407
+ for (var key in json) {
408
+ if (json[key] === undefined)
409
+ continue;
410
+ const subsub = $mol_tree.fromJSON(json[key], baseUri);
411
+ if (/^[^\n\t\\ ]+$/.test(key)) {
412
+ var child = new $mol_tree({
413
+ type: key,
414
+ baseUri: baseUri,
415
+ sub: [subsub],
416
+ });
617
417
  }
618
418
  else {
619
- const nn = nextNode.nextSibling;
620
- el.removeChild(nextNode);
621
- nextNode = nn;
419
+ var child = new $mol_tree({
420
+ value: key,
421
+ baseUri: baseUri,
422
+ sub: [subsub],
423
+ });
622
424
  }
425
+ sub.push(child);
623
426
  }
624
- }
427
+ return new $mol_tree({
428
+ type: "*",
429
+ sub: sub,
430
+ baseUri: baseUri
431
+ });
625
432
  }
626
- else {
627
- if (nextNode && nextNode.nodeName === '#text') {
628
- const str = String(view);
629
- if (nextNode.nodeValue !== str)
630
- nextNode.nodeValue = str;
631
- nextNode = nextNode.nextSibling;
433
+ }
434
+ get uri() {
435
+ return this.baseUri + '#' + this.row + ':' + this.col;
436
+ }
437
+ toString(prefix = '') {
438
+ var output = '';
439
+ if (this.type.length) {
440
+ if (!prefix.length) {
441
+ prefix = "\t";
632
442
  }
633
- else {
634
- const textNode = $mol_dom_context.document.createTextNode(String(view));
635
- el.insertBefore(textNode, nextNode);
443
+ output += this.type;
444
+ if (this.sub.length == 1) {
445
+ return output + ' ' + this.sub[0].toString(prefix);
446
+ }
447
+ output += "\n";
448
+ }
449
+ else if (this.data.length || prefix.length) {
450
+ output += "\\" + this.data + "\n";
451
+ }
452
+ for (var child of this.sub) {
453
+ output += prefix;
454
+ output += child.toString(prefix + "\t");
455
+ }
456
+ return output;
457
+ }
458
+ toJSON() {
459
+ if (!this.type)
460
+ return this.value;
461
+ if (this.type === 'true')
462
+ return true;
463
+ if (this.type === 'false')
464
+ return false;
465
+ if (this.type === 'null')
466
+ return null;
467
+ if (this.type === '*') {
468
+ var obj = {};
469
+ for (var child of this.sub) {
470
+ if (child.type === '-')
471
+ continue;
472
+ var key = child.type || child.clone({ sub: child.sub.slice(0, child.sub.length - 1) }).value;
473
+ var val = child.sub[child.sub.length - 1].toJSON();
474
+ if (val !== undefined)
475
+ obj[key] = val;
636
476
  }
477
+ return obj;
637
478
  }
638
- }
639
- while (nextNode) {
640
- const currNode = nextNode;
641
- nextNode = currNode.nextSibling;
642
- el.removeChild(currNode);
643
- }
644
- }
645
- $.$mol_dom_render_children = $mol_dom_render_children;
646
- })($ || ($ = {}));
647
- //mol/dom/render/children/children.ts
648
- ;
649
- "use strict";
650
- //mol/type/error/error.ts
651
- ;
652
- "use strict";
653
- //mol/type/assert/assert.test.ts
654
- ;
655
- "use strict";
656
- //mol/type/assert/assert.ts
657
- ;
658
- "use strict";
659
- //mol/type/equals/equals.test.ts
660
- ;
661
- "use strict";
662
- //mol/type/equals/equals.ts
663
- ;
664
- "use strict";
665
- //mol/type/partial/deep/deep.test.ts
666
- ;
667
- "use strict";
668
- //mol/type/partial/deep/deep.ts
669
- ;
670
- "use strict";
671
- var $;
672
- (function ($) {
673
- $mol_test({
674
- 'Make empty div'() {
675
- $mol_assert_equal(($mol_jsx("div", null)).outerHTML, '<div></div>');
676
- },
677
- 'Define native field'() {
678
- const dom = $mol_jsx("input", { value: '123' });
679
- $mol_assert_equal(dom.outerHTML, '<input value="123">');
680
- $mol_assert_equal(dom.value, '123');
681
- },
682
- 'Define classes'() {
683
- const dom = $mol_jsx("div", { class: 'foo bar' });
684
- $mol_assert_equal(dom.outerHTML, '<div class="foo bar"></div>');
685
- },
686
- 'Define styles'() {
687
- const dom = $mol_jsx("div", { style: { color: 'red' } });
688
- $mol_assert_equal(dom.outerHTML, '<div style="color: red;"></div>');
689
- },
690
- 'Define dataset'() {
691
- const dom = $mol_jsx("div", { dataset: { foo: 'bar' } });
692
- $mol_assert_equal(dom.outerHTML, '<div data-foo="bar"></div>');
693
- },
694
- 'Define attributes'() {
695
- const dom = $mol_jsx("div", { lang: "ru", hidden: true });
696
- $mol_assert_equal(dom.outerHTML, '<div lang="ru" hidden=""></div>');
697
- },
698
- 'Define child nodes'() {
699
- const dom = $mol_jsx("div", null,
700
- "hello",
701
- $mol_jsx("strong", null, "world"),
702
- "!");
703
- $mol_assert_equal(dom.outerHTML, '<div>hello<strong>world</strong>!</div>');
704
- },
705
- 'Function as component'() {
706
- const Button = (props, target) => {
707
- return $mol_jsx("button", { title: props.hint }, target());
708
- };
709
- const dom = $mol_jsx(Button, { id: "foo", hint: "click me" }, () => 'hey!');
710
- $mol_assert_equal(dom.outerHTML, '<button id="foo" title="click me" class="Button">hey!</button>');
711
- },
712
- 'Nested guid generation'() {
713
- const Foo = () => {
714
- return $mol_jsx("div", null,
715
- $mol_jsx(Bar, { id: "bar" },
716
- $mol_jsx("img", { id: "icon" })));
717
- };
718
- const Bar = (props, icon) => {
719
- return $mol_jsx("span", null,
720
- icon,
721
- $mol_jsx("i", { id: "label" }));
722
- };
723
- const dom = $mol_jsx(Foo, { id: "foo" });
724
- $mol_assert_equal(dom.outerHTML, '<div id="foo" class="Foo"><span id="foo/bar" class="Foo_bar Bar"><img id="foo/icon" class="Foo_icon"><i id="foo/bar/label" class="Foo_bar_label Bar_label"></i></span></div>');
725
- },
726
- 'Fail on non unique ids'() {
727
- const App = () => {
728
- return $mol_jsx("div", null,
729
- $mol_jsx("span", { id: "bar" }),
730
- $mol_jsx("span", { id: "bar" }));
731
- };
732
- $mol_assert_fail(() => $mol_jsx(App, { id: "foo" }), 'JSX already has tag with id "foo/bar"');
733
- },
734
- 'Owner based guid generationn'() {
735
- const Foo = () => {
736
- return $mol_jsx("div", null,
737
- $mol_jsx(Bar, { id: "middle", icon: () => $mol_jsx("img", { id: "icon" }) }));
738
- };
739
- const Bar = (props) => {
740
- return $mol_jsx("span", null, props.icon());
741
- };
742
- const dom = $mol_jsx(Foo, { id: "app" });
743
- $mol_assert_equal(dom.outerHTML, '<div id="app" class="Foo"><span id="app/middle" class="Foo_middle Bar"><img id="app/icon" class="Foo_icon"></span></div>');
744
- },
745
- 'Fail on same ids from different caller'() {
746
- const Foo = () => {
747
- return $mol_jsx("div", null,
748
- $mol_jsx("img", { id: "icon" }),
749
- $mol_jsx(Bar, { id: "bar", icon: () => $mol_jsx("img", { id: "icon" }) }));
750
- };
751
- const Bar = (props) => {
752
- return $mol_jsx("span", null, props.icon());
753
- };
754
- $mol_assert_fail(() => $mol_jsx(Foo, { id: "foo" }), 'JSX already has tag with id "foo/icon"');
755
- },
756
- });
757
- })($ || ($ = {}));
758
- //mol/jsx/jsx.test.tsx
759
- ;
760
- "use strict";
761
- var $;
762
- (function ($) {
763
- $.$mol_jsx_prefix = '';
764
- $.$mol_jsx_crumbs = '';
765
- $.$mol_jsx_booked = null;
766
- $.$mol_jsx_document = {
767
- getElementById: () => null,
768
- createElementNS: (space, name) => $mol_dom_context.document.createElementNS(space, name),
769
- createDocumentFragment: () => $mol_dom_context.document.createDocumentFragment(),
770
- };
771
- $.$mol_jsx_frag = '';
772
- function $mol_jsx(Elem, props, ...childNodes) {
773
- const id = props && props.id || '';
774
- const guid = id ? $.$mol_jsx_prefix ? $.$mol_jsx_prefix + '/' + id : id : $.$mol_jsx_prefix;
775
- const crumbs_self = id ? $.$mol_jsx_crumbs.replace(/(\S+)/g, `$1_${id.replace(/\/.*/i, '')}`) : $.$mol_jsx_crumbs;
776
- if (Elem && $.$mol_jsx_booked) {
777
- if ($.$mol_jsx_booked.has(id)) {
778
- $mol_fail(new Error(`JSX already has tag with id ${JSON.stringify(guid)}`));
479
+ if (this.type === '/') {
480
+ var res = [];
481
+ this.sub.forEach(child => {
482
+ if (child.type === '-')
483
+ return;
484
+ var val = child.toJSON();
485
+ if (val !== undefined)
486
+ res.push(val);
487
+ });
488
+ return res;
779
489
  }
780
- else {
781
- $.$mol_jsx_booked.add(id);
490
+ if (this.type === 'time') {
491
+ return new Date(this.value);
782
492
  }
493
+ const numb = Number(this.type);
494
+ if (!Number.isNaN(numb) || this.type === 'NaN')
495
+ return numb;
496
+ throw new Error(`Unknown type (${this.type}) at ${this.uri}`);
783
497
  }
784
- let node = guid ? $.$mol_jsx_document.getElementById(guid) : null;
785
- if ($.$mol_jsx_prefix) {
786
- const prefix_ext = $.$mol_jsx_prefix;
787
- const booked_ext = $.$mol_jsx_booked;
788
- const crumbs_ext = $.$mol_jsx_crumbs;
789
- for (const field in props) {
790
- const func = props[field];
791
- if (typeof func !== 'function')
498
+ get value() {
499
+ var values = [];
500
+ for (var child of this.sub) {
501
+ if (child.type)
792
502
  continue;
793
- const wrapper = function (...args) {
794
- const prefix = $.$mol_jsx_prefix;
795
- const booked = $.$mol_jsx_booked;
796
- const crumbs = $.$mol_jsx_crumbs;
797
- try {
798
- $.$mol_jsx_prefix = prefix_ext;
799
- $.$mol_jsx_booked = booked_ext;
800
- $.$mol_jsx_crumbs = crumbs_ext;
801
- return func.call(this, ...args);
802
- }
803
- finally {
804
- $.$mol_jsx_prefix = prefix;
805
- $.$mol_jsx_booked = booked;
806
- $.$mol_jsx_crumbs = crumbs;
807
- }
808
- };
809
- $mol_func_name_from(wrapper, func);
810
- props[field] = wrapper;
503
+ values.push(child.value);
811
504
  }
505
+ return this.data + values.join("\n");
812
506
  }
813
- if (typeof Elem !== 'string') {
814
- if ('prototype' in Elem) {
815
- const view = node && node[Elem] || new Elem;
816
- Object.assign(view, props);
817
- view[Symbol.toStringTag] = guid;
818
- view.childNodes = childNodes;
819
- if (!view.ownerDocument)
820
- view.ownerDocument = $.$mol_jsx_document;
821
- view.className = (crumbs_self ? crumbs_self + ' ' : '') + (Elem['name'] || Elem);
822
- node = view.valueOf();
823
- node[Elem] = view;
824
- return node;
507
+ insert(value, ...path) {
508
+ if (path.length === 0)
509
+ return value;
510
+ const type = path[0];
511
+ if (typeof type === 'string') {
512
+ let replaced = false;
513
+ const sub = this.sub.map((item, index) => {
514
+ if (item.type !== type)
515
+ return item;
516
+ replaced = true;
517
+ return item.insert(value, ...path.slice(1));
518
+ });
519
+ if (!replaced)
520
+ sub.push(new $mol_tree({ type }).insert(value, ...path.slice(1)));
521
+ return this.clone({ sub });
522
+ }
523
+ else if (typeof type === 'number') {
524
+ const sub = this.sub.slice();
525
+ sub[type] = (sub[type] || new $mol_tree).insert(value, ...path.slice(1));
526
+ return this.clone({ sub });
527
+ }
528
+ else {
529
+ return this.clone({ sub: ((this.sub.length === 0) ? [new $mol_tree()] : this.sub).map(item => item.insert(value, ...path.slice(1))) });
530
+ }
531
+ }
532
+ select(...path) {
533
+ var next = [this];
534
+ for (var type of path) {
535
+ if (!next.length)
536
+ break;
537
+ var prev = next;
538
+ next = [];
539
+ for (var item of prev) {
540
+ switch (typeof (type)) {
541
+ case 'string':
542
+ for (var child of item.sub) {
543
+ if (!type || (child.type == type)) {
544
+ next.push(child);
545
+ }
546
+ }
547
+ break;
548
+ case 'number':
549
+ if (type < item.sub.length)
550
+ next.push(item.sub[type]);
551
+ break;
552
+ default: next.push(...item.sub);
553
+ }
554
+ }
825
555
  }
826
- else {
827
- const prefix = $.$mol_jsx_prefix;
828
- const booked = $.$mol_jsx_booked;
829
- const crumbs = $.$mol_jsx_crumbs;
830
- try {
831
- $.$mol_jsx_prefix = guid;
832
- $.$mol_jsx_booked = new Set;
833
- $.$mol_jsx_crumbs = (crumbs_self ? crumbs_self + ' ' : '') + (Elem['name'] || Elem);
834
- return Elem(props, ...childNodes);
556
+ return new $mol_tree({ sub: next });
557
+ }
558
+ filter(path, value) {
559
+ var sub = this.sub.filter(function (item) {
560
+ var found = item.select(...path);
561
+ if (value == null) {
562
+ return Boolean(found.sub.length);
835
563
  }
836
- finally {
837
- $.$mol_jsx_prefix = prefix;
838
- $.$mol_jsx_booked = booked;
839
- $.$mol_jsx_crumbs = crumbs;
564
+ else {
565
+ return found.sub.some(child => child.value == value);
840
566
  }
841
- }
567
+ });
568
+ return new $mol_tree({ sub: sub });
842
569
  }
843
- if (!node) {
844
- node = Elem
845
- ? $.$mol_jsx_document.createElementNS(props?.xmlns ?? 'http://www.w3.org/1999/xhtml', Elem)
846
- : $.$mol_jsx_document.createDocumentFragment();
570
+ transform(visit, stack = []) {
571
+ const sub_stack = [this, ...stack];
572
+ return visit(sub_stack, () => this.sub.map(node => node.transform(visit, sub_stack)).filter(n => n));
847
573
  }
848
- $mol_dom_render_children(node, [].concat(...childNodes));
849
- if (!Elem)
850
- return node;
851
- if (guid)
852
- node.id = guid;
853
- for (const key in props) {
854
- if (key === 'id')
855
- continue;
856
- if (typeof props[key] === 'string') {
857
- ;
858
- node.setAttribute(key, props[key]);
859
- }
860
- else if (props[key] &&
861
- typeof props[key] === 'object' &&
862
- Reflect.getPrototypeOf(props[key]) === Reflect.getPrototypeOf({})) {
863
- if (typeof node[key] === 'object') {
864
- Object.assign(node[key], props[key]);
865
- continue;
866
- }
867
- }
868
- else {
869
- node[key] = props[key];
870
- }
574
+ hack(context) {
575
+ const sub = [].concat(...this.sub.map(child => {
576
+ const handle = context[child.type] || context[''];
577
+ if (!handle)
578
+ $mol_fail(child.error('Handler not defined'));
579
+ return handle(child, context);
580
+ }));
581
+ return this.clone({ sub });
582
+ }
583
+ error(message) {
584
+ return new Error(`${message}:\n${this} ${this.baseUri}:${this.row}:${this.col}`);
871
585
  }
872
- if ($.$mol_jsx_crumbs)
873
- node.className = (props?.['class'] ? props['class'] + ' ' : '') + crumbs_self;
874
- return node;
875
586
  }
876
- $.$mol_jsx = $mol_jsx;
587
+ $.$mol_tree = $mol_tree;
877
588
  })($ || ($ = {}));
878
- //mol/jsx/jsx.ts
589
+ //mol/tree/tree.ts
879
590
  ;
880
591
  "use strict";
881
592
  var $;
882
593
  (function ($) {
883
- $mol_test({
884
- 'nulls & undefineds'() {
885
- $mol_assert_ok($mol_compare_deep(null, null));
886
- $mol_assert_ok($mol_compare_deep(undefined, undefined));
887
- $mol_assert_not($mol_compare_deep(undefined, null));
888
- $mol_assert_not($mol_compare_deep({}, null));
889
- },
890
- 'number'() {
891
- $mol_assert_ok($mol_compare_deep(1, 1));
892
- $mol_assert_ok($mol_compare_deep(Number.NaN, Number.NaN));
893
- $mol_assert_not($mol_compare_deep(1, 2));
894
- $mol_assert_ok($mol_compare_deep(Object(1), Object(1)));
895
- $mol_assert_not($mol_compare_deep(Object(1), Object(2)));
896
- },
897
- 'POJO'() {
898
- $mol_assert_ok($mol_compare_deep({}, {}));
899
- $mol_assert_not($mol_compare_deep({ a: 1 }, { b: 2 }));
900
- $mol_assert_not($mol_compare_deep({ a: 1 }, { a: 2 }));
901
- $mol_assert_not($mol_compare_deep({}, { a: undefined }));
902
- $mol_assert_ok($mol_compare_deep({ a: 1, b: 2 }, { b: 2, a: 1 }));
903
- $mol_assert_ok($mol_compare_deep({ a: { b: 1 } }, { a: { b: 1 } }));
904
- },
905
- 'Array'() {
906
- $mol_assert_ok($mol_compare_deep([], []));
907
- $mol_assert_ok($mol_compare_deep([1, [2]], [1, [2]]));
908
- $mol_assert_not($mol_compare_deep([1, 2], [1, 3]));
909
- $mol_assert_not($mol_compare_deep([1, 2,], [1, 3, undefined]));
910
- },
911
- 'Non POJO are different'() {
912
- class Thing extends Object {
913
- }
914
- $mol_assert_not($mol_compare_deep(new Thing, new Thing));
915
- $mol_assert_not($mol_compare_deep(() => 1, () => 1));
916
- $mol_assert_not($mol_compare_deep(new RangeError('Test error'), new RangeError('Test error')));
917
- },
918
- 'same POJOs with cyclic reference'() {
919
- const a = { foo: {} };
920
- a['self'] = a;
921
- const b = { foo: {} };
922
- b['self'] = b;
923
- $mol_assert_ok($mol_compare_deep(a, b));
924
- },
925
- 'Date'() {
926
- $mol_assert_ok($mol_compare_deep(new Date(12345), new Date(12345)));
927
- $mol_assert_not($mol_compare_deep(new Date(12345), new Date(12346)));
928
- },
929
- 'RegExp'() {
930
- $mol_assert_ok($mol_compare_deep(/\x22/mig, /\x22/mig));
931
- $mol_assert_not($mol_compare_deep(/\x22/mig, /\x21/mig));
932
- $mol_assert_not($mol_compare_deep(/\x22/mig, /\x22/mg));
933
- },
934
- 'Error'() {
935
- $mol_assert_not($mol_compare_deep(new Error('xxx'), new Error('xxx')));
936
- const fail = (message) => new Error(message);
937
- $mol_assert_ok($mol_compare_deep(...['xxx', 'xxx'].map(msg => new Error(msg))));
938
- $mol_assert_not($mol_compare_deep(...['xxx', 'yyy'].map(msg => new Error(msg))));
939
- },
940
- 'Map'() {
941
- $mol_assert_ok($mol_compare_deep(new Map, new Map));
942
- $mol_assert_ok($mol_compare_deep(new Map([[1, [2]]]), new Map([[1, [2]]])));
943
- $mol_assert_not($mol_compare_deep(new Map([[1, 2]]), new Map([[1, 3]])));
944
- $mol_assert_not($mol_compare_deep(new Map([[[1], 2]]), new Map([[[1], 2]])));
945
- },
946
- 'Set'() {
947
- $mol_assert_ok($mol_compare_deep(new Set, new Set));
948
- $mol_assert_ok($mol_compare_deep(new Set([1, [2]]), new Set([1, [2]])));
949
- $mol_assert_not($mol_compare_deep(new Set([1]), new Set([2])));
950
- },
951
- 'Uint8Array'() {
952
- $mol_assert_ok($mol_compare_deep(new Uint8Array, new Uint8Array));
953
- $mol_assert_ok($mol_compare_deep(new Uint8Array([0]), new Uint8Array([0])));
954
- $mol_assert_not($mol_compare_deep(new Uint8Array([0]), new Uint8Array([1])));
955
- },
956
- 'Custom comparator'() {
957
- class User {
958
- name;
959
- rand;
960
- constructor(name, rand = Math.random()) {
961
- this.name = name;
962
- this.rand = rand;
963
- }
964
- [Symbol.toPrimitive](mode) {
965
- return this.name;
966
- }
967
- }
968
- $mol_assert_ok($mol_compare_deep(new User('Jin'), new User('Jin')));
969
- $mol_assert_not($mol_compare_deep(new User('Jin'), new User('John')));
970
- },
971
- });
594
+ class $mol_term_color {
595
+ static reset = this.ansi(0, 0);
596
+ static bold = this.ansi(1, 22);
597
+ static italic = this.ansi(3, 23);
598
+ static underline = this.ansi(4, 24);
599
+ static inverse = this.ansi(7, 27);
600
+ static hidden = this.ansi(8, 28);
601
+ static strike = this.ansi(9, 29);
602
+ static gray = this.ansi(90, 39);
603
+ static red = this.ansi(91, 39);
604
+ static green = this.ansi(92, 39);
605
+ static yellow = this.ansi(93, 39);
606
+ static blue = this.ansi(94, 39);
607
+ static magenta = this.ansi(95, 39);
608
+ static cyan = this.ansi(96, 39);
609
+ static white = this.ansi(97, 39);
610
+ static Red = (str) => this.inverse(this.red(str));
611
+ static Green = (str) => this.inverse(this.green(str));
612
+ static Yellow = (str) => this.inverse(this.yellow(str));
613
+ static Blue = (str) => this.inverse(this.blue(str));
614
+ static Magenta = (str) => this.inverse(this.magenta(str));
615
+ static Cyan = (str) => this.inverse(this.cyan(str));
616
+ static White = (str) => this.inverse(this.white(str));
617
+ static ansi(open, close) {
618
+ if (typeof process === 'undefined')
619
+ return String;
620
+ if (!process.stdout.isTTY)
621
+ return String;
622
+ const prefix = `\x1b[${open}m`;
623
+ const postfix = `\x1b[${close}m`;
624
+ const suffix_regexp = new RegExp(postfix.replace('[', '\\['), 'g');
625
+ return function colorer(str) {
626
+ str = String(str);
627
+ if (str === '')
628
+ return str;
629
+ const suffix = str.replace(suffix_regexp, prefix);
630
+ return prefix + suffix + postfix;
631
+ };
632
+ }
633
+ }
634
+ $.$mol_term_color = $mol_term_color;
635
+ })($ || ($ = {}));
636
+ //mol/term/color/color.ts
637
+ ;
638
+ "use strict";
639
+ var $;
640
+ (function ($) {
641
+ function $mol_log3_node_make(level, output, type, color) {
642
+ return function $mol_log3_logger(event) {
643
+ if (!event.time)
644
+ event = { time: new Date().toISOString(), ...event };
645
+ const tree = this.$mol_tree.fromJSON(event).clone({ type });
646
+ let str = color(tree.toString());
647
+ this.console[level](str);
648
+ const self = this;
649
+ return () => self.console.groupEnd();
650
+ };
651
+ }
652
+ $.$mol_log3_node_make = $mol_log3_node_make;
653
+ $.$mol_log3_come = $mol_log3_node_make('info', 'stdout', 'come', $mol_term_color.blue);
654
+ $.$mol_log3_done = $mol_log3_node_make('info', 'stdout', 'done', $mol_term_color.green);
655
+ $.$mol_log3_fail = $mol_log3_node_make('error', 'stderr', 'fail', $mol_term_color.red);
656
+ $.$mol_log3_warn = $mol_log3_node_make('warn', 'stderr', 'warn', $mol_term_color.yellow);
657
+ $.$mol_log3_rise = $mol_log3_node_make('log', 'stdout', 'rise', $mol_term_color.magenta);
658
+ $.$mol_log3_area = $mol_log3_node_make('log', 'stdout', 'area', $mol_term_color.cyan);
659
+ })($ || ($ = {}));
660
+ //mol/log3/log3.node.ts
661
+ ;
662
+ "use strict";
663
+ var $;
664
+ (function ($) {
665
+ function $mol_env() {
666
+ return {};
667
+ }
668
+ $.$mol_env = $mol_env;
669
+ })($ || ($ = {}));
670
+ //mol/env/env.ts
671
+ ;
672
+ "use strict";
673
+ var $;
674
+ (function ($) {
675
+ $.$mol_env = function $mol_env() {
676
+ return this.process.env;
677
+ };
678
+ })($ || ($ = {}));
679
+ //mol/env/env.node.ts
680
+ ;
681
+ "use strict";
682
+ var $;
683
+ (function ($) {
684
+ function $mol_exec(dir, command, ...args) {
685
+ let [app, ...args0] = command.split(' ');
686
+ args = [...args0, ...args];
687
+ this.$mol_log3_come({
688
+ place: '$mol_exec',
689
+ dir: $node.path.relative('', dir),
690
+ message: 'Run',
691
+ command: `${app} ${args.join(' ')}`,
692
+ });
693
+ var res = $node['child_process'].spawnSync(app, args, {
694
+ cwd: $node.path.resolve(dir),
695
+ shell: true,
696
+ env: this.$mol_env(),
697
+ });
698
+ if (res.status || res.error)
699
+ return $mol_fail(res.error || new Error(res.stderr.toString()));
700
+ if (!res.stdout)
701
+ res.stdout = Buffer.from([]);
702
+ return res;
703
+ }
704
+ $.$mol_exec = $mol_exec;
972
705
  })($ || ($ = {}));
973
- //mol/compare/deep/deep.test.tsx
706
+ //mol/exec/exec.node.ts
974
707
  ;
975
708
  "use strict";
976
709
  var $;
977
710
  (function ($) {
978
- $.$mol_compare_deep_cache = new WeakMap();
979
- function $mol_compare_deep(left, right) {
980
- if (Object.is(left, right))
981
- return true;
982
- if (left === null)
983
- return false;
984
- if (right === null)
985
- return false;
986
- if (typeof left !== 'object')
987
- return false;
988
- if (typeof right !== 'object')
989
- return false;
990
- const left_proto = Reflect.getPrototypeOf(left);
991
- const right_proto = Reflect.getPrototypeOf(right);
992
- if (left_proto !== right_proto)
993
- return false;
994
- if (left instanceof Boolean)
995
- return Object.is(left.valueOf(), right['valueOf']());
996
- if (left instanceof Number)
997
- return Object.is(left.valueOf(), right['valueOf']());
998
- if (left instanceof String)
999
- return Object.is(left.valueOf(), right['valueOf']());
1000
- if (left instanceof Date)
1001
- return Object.is(left.valueOf(), right['valueOf']());
1002
- if (left instanceof RegExp)
1003
- return left.source === right['source'] && left.flags === right['flags'];
1004
- if (left instanceof Error)
1005
- return left.stack === right['stack'];
1006
- let left_cache = $.$mol_compare_deep_cache.get(left);
1007
- if (left_cache) {
1008
- const right_cache = left_cache.get(right);
1009
- if (typeof right_cache === 'boolean')
1010
- return right_cache;
1011
- }
1012
- else {
1013
- left_cache = new WeakMap([[right, true]]);
1014
- $.$mol_compare_deep_cache.set(left, left_cache);
1015
- }
1016
- let result;
1017
- try {
1018
- if (left_proto && !Reflect.getPrototypeOf(left_proto))
1019
- result = compare_pojo(left, right);
1020
- else if (Array.isArray(left))
1021
- result = compare_array(left, right);
1022
- else if (left instanceof Set)
1023
- result = compare_set(left, right);
1024
- else if (left instanceof Map)
1025
- result = compare_map(left, right);
1026
- else if (ArrayBuffer.isView(left))
1027
- result = compare_buffer(left, right);
1028
- else if (Symbol.toPrimitive in left)
1029
- result = compare_primitive(left, right);
1030
- else
1031
- result = false;
711
+ $.$mol_crypto_native = $node.crypto.webcrypto;
712
+ })($ || ($ = {}));
713
+ //mol/crypto/native/native.node.ts
714
+ ;
715
+ "use strict";
716
+ var $;
717
+ (function ($) {
718
+ const algorithm = {
719
+ name: 'AES-GCM',
720
+ length: 128,
721
+ tagLength: 32,
722
+ };
723
+ class $mol_crypto_secret extends Object {
724
+ native;
725
+ static size = 16;
726
+ static extra = 4;
727
+ constructor(native) {
728
+ super();
729
+ this.native = native;
1032
730
  }
1033
- finally {
1034
- left_cache.set(right, result);
731
+ static async generate() {
732
+ return new this(await $mol_crypto_native.subtle.generateKey(algorithm, true, ['encrypt', 'decrypt']));
1035
733
  }
1036
- return result;
1037
- }
1038
- $.$mol_compare_deep = $mol_compare_deep;
1039
- function compare_array(left, right) {
1040
- const len = left.length;
1041
- if (len !== right.length)
1042
- return false;
1043
- for (let i = 0; i < len; ++i) {
1044
- if (!$mol_compare_deep(left[i], right[i]))
1045
- return false;
734
+ static async from(serial) {
735
+ return new this(await $mol_crypto_native.subtle.importKey('raw', serial, algorithm, true, ['encrypt', 'decrypt']));
1046
736
  }
1047
- return true;
1048
- }
1049
- function compare_buffer(left, right) {
1050
- const len = left.byteLength;
1051
- if (len !== right.byteLength)
1052
- return false;
1053
- for (let i = 0; i < len; ++i) {
1054
- if (left[i] !== right[i])
1055
- return false;
737
+ async serial() {
738
+ return await $mol_crypto_native.subtle.exportKey('raw', this.native);
1056
739
  }
1057
- return true;
1058
- }
1059
- function compare_iterator(left, right, compare) {
1060
- while (true) {
1061
- const left_next = left.next();
1062
- const right_next = right.next();
1063
- if (left_next.done !== right_next.done)
1064
- return false;
1065
- if (left_next.done)
1066
- break;
1067
- if (!compare(left_next.value, right_next.value))
1068
- return false;
740
+ async encrypt(open, salt) {
741
+ return await $mol_crypto_native.subtle.encrypt({
742
+ ...algorithm,
743
+ iv: salt,
744
+ }, this.native, open);
1069
745
  }
1070
- return true;
1071
- }
1072
- function compare_set(left, right) {
1073
- if (left.size !== right.size)
1074
- return false;
1075
- return compare_iterator(left.values(), right.values(), $mol_compare_deep);
1076
- }
1077
- function compare_map(left, right) {
1078
- if (left.size !== right.size)
1079
- return false;
1080
- return compare_iterator(left.keys(), right.keys(), Object.is)
1081
- && compare_iterator(left.values(), right.values(), $mol_compare_deep);
1082
- }
1083
- function compare_pojo(left, right) {
1084
- const left_keys = Object.getOwnPropertyNames(left);
1085
- const right_keys = Object.getOwnPropertyNames(right);
1086
- if (left_keys.length !== right_keys.length)
1087
- return false;
1088
- for (let key of left_keys) {
1089
- if (!$mol_compare_deep(left[key], Reflect.get(right, key)))
1090
- return false;
746
+ async decrypt(closed, salt) {
747
+ return await $mol_crypto_native.subtle.decrypt({
748
+ ...algorithm,
749
+ iv: salt,
750
+ }, this.native, closed);
1091
751
  }
1092
- return true;
1093
- }
1094
- function compare_primitive(left, right) {
1095
- return Object.is(left[Symbol.toPrimitive]('default'), right[Symbol.toPrimitive]('default'));
1096
752
  }
753
+ $.$mol_crypto_secret = $mol_crypto_secret;
1097
754
  })($ || ($ = {}));
1098
- //mol/compare/deep/deep.ts
755
+ //mol/crypto/secret/secret.ts
1099
756
  ;
1100
757
  "use strict";
1101
758
  var $;
1102
759
  (function ($) {
1103
- function $mol_dom_serialize(node) {
1104
- const serializer = new $mol_dom_context.XMLSerializer;
1105
- return serializer.serializeToString(node);
760
+ const algorithm = {
761
+ name: 'RSA-OAEP',
762
+ modulusLength: 1024,
763
+ publicExponent: new Uint8Array([1, 0, 1]),
764
+ hash: 'SHA-1',
765
+ };
766
+ async function $mol_crypto_cipher_pair() {
767
+ const pair = await $mol_crypto_native.subtle.generateKey(algorithm, true, ['encrypt', 'decrypt']);
768
+ return {
769
+ public: new $mol_crypto_cipher_public(pair.publicKey),
770
+ private: new $mol_crypto_cipher_private(pair.privateKey),
771
+ };
1106
772
  }
1107
- $.$mol_dom_serialize = $mol_dom_serialize;
1108
- })($ || ($ = {}));
1109
- //mol/dom/serialize/serialize.ts
1110
- ;
1111
- "use strict";
1112
- var $;
1113
- (function ($) {
1114
- $mol_test({
1115
- 'must be false'() {
1116
- $mol_assert_not(0);
1117
- },
1118
- 'must be true'() {
1119
- $mol_assert_ok(1);
1120
- },
1121
- 'two must be equal'() {
1122
- $mol_assert_equal(2, 2);
1123
- },
1124
- 'three must be equal'() {
1125
- $mol_assert_equal(2, 2, 2);
1126
- },
1127
- 'two must be unique'() {
1128
- $mol_assert_unique([3], [3]);
1129
- },
1130
- 'three must be unique'() {
1131
- $mol_assert_unique([3], [3], [3]);
1132
- },
1133
- 'two must be alike'() {
1134
- $mol_assert_like([3], [3]);
1135
- },
1136
- 'three must be alike'() {
1137
- $mol_assert_like([3], [3], [3]);
1138
- },
1139
- });
773
+ $.$mol_crypto_cipher_pair = $mol_crypto_cipher_pair;
774
+ class $mol_crypto_cipher_public extends Object {
775
+ native;
776
+ static size = 162;
777
+ constructor(native) {
778
+ super();
779
+ this.native = native;
780
+ }
781
+ static async from(serial) {
782
+ return new this(await $mol_crypto_native.subtle.importKey('spki', serial, algorithm, true, ['encrypt']));
783
+ }
784
+ async serial() {
785
+ return await $mol_crypto_native.subtle.exportKey('spki', this.native);
786
+ }
787
+ async encrypt(data) {
788
+ return await $mol_crypto_native.subtle.encrypt(algorithm, this.native, data);
789
+ }
790
+ }
791
+ $.$mol_crypto_cipher_public = $mol_crypto_cipher_public;
792
+ class $mol_crypto_cipher_private extends Object {
793
+ native;
794
+ constructor(native) {
795
+ super();
796
+ this.native = native;
797
+ }
798
+ static async from(serial) {
799
+ return new this(await $mol_crypto_native.subtle.importKey('pkcs8', serial, algorithm, true, ['decrypt']));
800
+ }
801
+ async serial() {
802
+ return await $mol_crypto_native.subtle.exportKey('pkcs8', this.native);
803
+ }
804
+ async decrypt(data) {
805
+ return await $mol_crypto_native.subtle.decrypt(algorithm, this.native, data);
806
+ }
807
+ }
808
+ $.$mol_crypto_cipher_private = $mol_crypto_cipher_private;
809
+ $.$mol_crypto_cipher_ecrypted_size = 128;
1140
810
  })($ || ($ = {}));
1141
- //mol/assert/assert.test.ts
811
+ //mol/crypto/cipher/cipher.ts
1142
812
  ;
1143
813
  "use strict";
1144
814
  var $;
1145
- (function ($) {
1146
- function $mol_assert_ok(value) {
1147
- if (value)
1148
- return;
1149
- $mol_fail(new Error(`${value} true`));
1150
- }
1151
- $.$mol_assert_ok = $mol_assert_ok;
1152
- function $mol_assert_not(value) {
1153
- if (!value)
1154
- return;
1155
- $mol_fail(new Error(`${value} ≠ false`));
815
+ (function ($) {
816
+ const algorithm = {
817
+ name: 'RSA-PSS',
818
+ modulusLength: 256,
819
+ publicExponent: new Uint8Array([1, 0, 1]),
820
+ hash: 'SHA-1',
821
+ saltLength: 8,
822
+ };
823
+ async function $mol_crypto_auditor_pair() {
824
+ const pair = await $mol_crypto_native.subtle.generateKey(algorithm, true, ['sign', 'verify']);
825
+ return {
826
+ public: new $mol_crypto_auditor_public(pair.publicKey),
827
+ private: new $mol_crypto_auditor_private(pair.privateKey),
828
+ };
1156
829
  }
1157
- $.$mol_assert_not = $mol_assert_not;
1158
- function $mol_assert_fail(handler, ErrorRight) {
1159
- const fail = $.$mol_fail;
1160
- try {
1161
- $.$mol_fail = $.$mol_fail_hidden;
1162
- handler();
830
+ $.$mol_crypto_auditor_pair = $mol_crypto_auditor_pair;
831
+ class $mol_crypto_auditor_public extends Object {
832
+ native;
833
+ static size = 62;
834
+ constructor(native) {
835
+ super();
836
+ this.native = native;
1163
837
  }
1164
- catch (error) {
1165
- if (!ErrorRight)
1166
- return error;
1167
- $.$mol_fail = fail;
1168
- if (typeof ErrorRight === 'string') {
1169
- $mol_assert_equal(error.message, ErrorRight);
1170
- }
1171
- else {
1172
- $mol_assert_ok(error instanceof ErrorRight);
1173
- }
1174
- return error;
838
+ static async from(serial) {
839
+ return new this(await $mol_crypto_native.subtle.importKey('spki', serial, algorithm, true, ['verify']));
1175
840
  }
1176
- finally {
1177
- $.$mol_fail = fail;
841
+ async serial() {
842
+ return await $mol_crypto_native.subtle.exportKey('spki', this.native);
1178
843
  }
1179
- $mol_fail(new Error('Not failed'));
1180
- }
1181
- $.$mol_assert_fail = $mol_assert_fail;
1182
- function $mol_assert_equal(...args) {
1183
- for (let i = 0; i < args.length; ++i) {
1184
- for (let j = 0; j < args.length; ++j) {
1185
- if (i === j)
1186
- continue;
1187
- if (Number.isNaN(args[i]) && Number.isNaN(args[j]))
1188
- continue;
1189
- if (args[i] !== args[j])
1190
- $mol_fail(new Error(`Not equal (${i + 1}:${j + 1})\n${args[i]}\n${args[j]}`));
1191
- }
844
+ async verify(data, sign) {
845
+ return await $mol_crypto_native.subtle.verify(algorithm, this.native, sign, data);
1192
846
  }
1193
847
  }
1194
- $.$mol_assert_equal = $mol_assert_equal;
1195
- function $mol_assert_unique(...args) {
1196
- for (let i = 0; i < args.length; ++i) {
1197
- for (let j = 0; j < args.length; ++j) {
1198
- if (i === j)
1199
- continue;
1200
- if (args[i] === args[j] || (Number.isNaN(args[i]) && Number.isNaN(args[j]))) {
1201
- $mol_fail(new Error(`args[${i}] = args[${j}] = ${args[i]}`));
1202
- }
1203
- }
848
+ $.$mol_crypto_auditor_public = $mol_crypto_auditor_public;
849
+ class $mol_crypto_auditor_private extends Object {
850
+ native;
851
+ static size = 200;
852
+ constructor(native) {
853
+ super();
854
+ this.native = native;
855
+ }
856
+ static async from(serial) {
857
+ return new this(await $mol_crypto_native.subtle.importKey('pkcs8', serial, algorithm, true, ['sign']));
858
+ }
859
+ async serial() {
860
+ return await $mol_crypto_native.subtle.exportKey('pkcs8', this.native);
861
+ }
862
+ async sign(data) {
863
+ return await $mol_crypto_native.subtle.sign(algorithm, this.native, data);
1204
864
  }
1205
865
  }
1206
- $.$mol_assert_unique = $mol_assert_unique;
1207
- function $mol_assert_like(head, ...tail) {
1208
- for (let [index, value] of Object.entries(tail)) {
1209
- if (!$mol_compare_deep(value, head)) {
1210
- const print = (val) => {
1211
- if (!val)
1212
- return val;
1213
- if (typeof val !== 'object')
1214
- return val;
1215
- if ('outerHTML' in val)
1216
- return val.outerHTML;
1217
- try {
1218
- return JSON.stringify(val);
866
+ $.$mol_crypto_auditor_private = $mol_crypto_auditor_private;
867
+ $.$mol_crypto_auditor_sign_size = 32;
868
+ })($ || ($ = {}));
869
+ //mol/crypto/auditor/auditor.ts
870
+ ;
871
+ "use strict";
872
+ var $;
873
+ (function ($) {
874
+ let sponge = new Uint32Array(80);
875
+ function $mol_crypto_hash(data) {
876
+ const bits = data.byteLength << 3;
877
+ const kbits = bits >> 5;
878
+ const kword = 0x80 << (24 - bits & 0b11111);
879
+ const bytes = 16 + (bits + 64 >>> 9 << 4);
880
+ const klens = bytes - 1;
881
+ const words = new Int32Array(data.buffer, data.byteOffset, data.byteLength >> 2);
882
+ let tail = 0;
883
+ for (let i = words.length * 4; i < data.length; ++i) {
884
+ tail |= data[i] << (i << 3 & 0b11000);
885
+ }
886
+ const hash = new Int32Array([1732584193, -271733879, -1732584194, 271733878, -1009589776]);
887
+ for (let i = 0; i < bytes; i += 16) {
888
+ let h0 = hash[0];
889
+ let h1 = hash[1];
890
+ let h2 = hash[2];
891
+ let h3 = hash[3];
892
+ let h4 = hash[4];
893
+ for (let j = 0; j < 80; ++j) {
894
+ let turn;
895
+ if (j < 16) {
896
+ const k = i + j;
897
+ if (k === klens) {
898
+ sponge[j] = bits;
1219
899
  }
1220
- catch (error) {
1221
- console.error(error);
1222
- return val;
900
+ else {
901
+ let word = k === words.length ? tail :
902
+ k > words.length ? 0 :
903
+ words[k];
904
+ word = word << 24 | word << 8 & 0xFF0000 | word >>> 8 & 0xFF00 | word >>> 24 & 0xFF;
905
+ if (k === kbits)
906
+ word |= kword;
907
+ sponge[j] = word;
1223
908
  }
1224
- };
1225
- return $mol_fail(new Error(`Not like (1:${+index + 2})\n${print(head)}\n---\n${print(value)}`));
909
+ turn = (h1 & h2 | ~h1 & h3) + 1518500249;
910
+ }
911
+ else {
912
+ const shuffle = sponge[j - 3] ^ sponge[j - 8] ^ sponge[j - 14] ^ sponge[j - 16];
913
+ sponge[j] = shuffle << 1 | shuffle >>> 31;
914
+ turn =
915
+ j < 20 ? (h1 & h2 | ~h1 & h3) + 1518500249 :
916
+ j < 40 ? (h1 ^ h2 ^ h3) + 1859775393 :
917
+ j < 60 ? (h1 & h2 | h1 & h3 | h2 & h3) - 1894007588 :
918
+ (h1 ^ h2 ^ h3) - 899497514;
919
+ }
920
+ const next = turn + h4 + (sponge[j] >>> 0) + ((h0 << 5) | (h0 >>> 27));
921
+ h4 = h3;
922
+ h3 = h2;
923
+ h2 = (h1 << 30) | (h1 >>> 2);
924
+ h1 = h0;
925
+ h0 = next;
1226
926
  }
927
+ hash[0] += h0;
928
+ hash[1] += h1;
929
+ hash[2] += h2;
930
+ hash[3] += h3;
931
+ hash[4] += h4;
1227
932
  }
933
+ for (let i = 0; i < 20; ++i) {
934
+ const word = hash[i];
935
+ hash[i] = word << 24 | word << 8 & 0xFF0000 | word >>> 8 & 0xFF00 | word >>> 24 & 0xFF;
936
+ }
937
+ return new Uint8Array(hash.buffer);
1228
938
  }
1229
- $.$mol_assert_like = $mol_assert_like;
1230
- function $mol_assert_dom(left, right) {
1231
- $mol_assert_equal($mol_dom_serialize(left), $mol_dom_serialize(right));
1232
- }
1233
- $.$mol_assert_dom = $mol_assert_dom;
939
+ $.$mol_crypto_hash = $mol_crypto_hash;
1234
940
  })($ || ($ = {}));
1235
- //mol/assert/assert.ts
941
+ //mol/crypto/hash/hash.ts
1236
942
  ;
1237
943
  "use strict";
1238
944
  var $;
1239
945
  (function ($) {
1240
- $.$mol_ambient_ref = Symbol('$mol_ambient_ref');
1241
- function $mol_ambient(overrides) {
1242
- return Object.setPrototypeOf(overrides, this || $);
946
+ function $mol_crypto_salt() {
947
+ return $mol_crypto_native.getRandomValues(new Uint8Array(12));
1243
948
  }
1244
- $.$mol_ambient = $mol_ambient;
949
+ $.$mol_crypto_salt = $mol_crypto_salt;
1245
950
  })($ || ($ = {}));
1246
- //mol/ambient/ambient.ts
951
+ //mol/crypto/salt/salt.ts
1247
952
  ;
1248
953
  "use strict";
1249
954
  var $;
1250
955
  (function ($) {
1251
- $mol_test({
1252
- 'get'() {
1253
- const proxy = $mol_delegate({}, () => ({ foo: 777 }));
1254
- $mol_assert_equal(proxy.foo, 777);
1255
- },
1256
- 'has'() {
1257
- const proxy = $mol_delegate({}, () => ({ foo: 777 }));
1258
- $mol_assert_equal('foo' in proxy, true);
1259
- },
1260
- 'set'() {
1261
- const target = { foo: 777 };
1262
- const proxy = $mol_delegate({}, () => target);
1263
- proxy.foo = 123;
1264
- $mol_assert_equal(target.foo, 123);
1265
- },
1266
- 'getOwnPropertyDescriptor'() {
1267
- const proxy = $mol_delegate({}, () => ({ foo: 777 }));
1268
- $mol_assert_like(Object.getOwnPropertyDescriptor(proxy, 'foo'), {
1269
- value: 777,
1270
- writable: true,
1271
- enumerable: true,
1272
- configurable: true,
956
+ function $mol_test_complete() {
957
+ process.exit(0);
958
+ }
959
+ $.$mol_test_complete = $mol_test_complete;
960
+ })($ || ($ = {}));
961
+ //mol/test/test.node.test.ts
962
+ ;
963
+ "use strict";
964
+ var $;
965
+ (function ($_1) {
966
+ function $mol_test(set) {
967
+ for (let name in set) {
968
+ const code = set[name];
969
+ const test = (typeof code === 'string') ? new Function('', code) : code;
970
+ $_1.$mol_test_all.push(test);
971
+ }
972
+ $mol_test_schedule();
973
+ }
974
+ $_1.$mol_test = $mol_test;
975
+ $_1.$mol_test_mocks = [];
976
+ $_1.$mol_test_all = [];
977
+ async function $mol_test_run() {
978
+ for (var test of $_1.$mol_test_all) {
979
+ let context = Object.create($$);
980
+ for (let mock of $_1.$mol_test_mocks)
981
+ await mock(context);
982
+ const res = test(context);
983
+ if (res instanceof Promise) {
984
+ await new Promise((done, fail) => {
985
+ res.then(done, fail);
986
+ setTimeout(() => fail(new Error('Test timeout: ' + test.name)), 1000);
987
+ });
988
+ }
989
+ }
990
+ $$.$mol_log3_done({
991
+ place: '$mol_test',
992
+ message: 'All tests passed',
993
+ count: $_1.$mol_test_all.length,
994
+ });
995
+ }
996
+ $_1.$mol_test_run = $mol_test_run;
997
+ let scheduled = false;
998
+ function $mol_test_schedule() {
999
+ if (scheduled)
1000
+ return;
1001
+ scheduled = true;
1002
+ setTimeout(async () => {
1003
+ scheduled = false;
1004
+ await $mol_test_run();
1005
+ $$.$mol_test_complete();
1006
+ }, 0);
1007
+ }
1008
+ $_1.$mol_test_schedule = $mol_test_schedule;
1009
+ $_1.$mol_test_mocks.push(context => {
1010
+ let seed = 0;
1011
+ context.Math = Object.create(Math);
1012
+ context.Math.random = () => Math.sin(seed++);
1013
+ const forbidden = ['XMLHttpRequest', 'fetch'];
1014
+ for (let api of forbidden) {
1015
+ context[api] = new Proxy(function () { }, {
1016
+ get() {
1017
+ $mol_fail_hidden(new Error(`${api} is forbidden in tests`));
1018
+ },
1019
+ apply() {
1020
+ $mol_fail_hidden(new Error(`${api} is forbidden in tests`));
1021
+ },
1273
1022
  });
1023
+ }
1024
+ });
1025
+ $mol_test({
1026
+ 'mocked Math.random'($) {
1027
+ console.assert($.Math.random() === 0);
1028
+ console.assert($.Math.random() === Math.sin(1));
1274
1029
  },
1275
- 'ownKeys'() {
1276
- const proxy = $mol_delegate({}, () => ({ foo: 777, [Symbol.toStringTag]: 'bar' }));
1277
- $mol_assert_like(Reflect.ownKeys(proxy), ['foo', Symbol.toStringTag]);
1278
- },
1279
- 'getPrototypeOf'() {
1280
- class Foo {
1030
+ 'forbidden XMLHttpRequest'($) {
1031
+ try {
1032
+ console.assert(void new $.XMLHttpRequest);
1281
1033
  }
1282
- const proxy = $mol_delegate({}, () => new Foo);
1283
- $mol_assert_equal(Object.getPrototypeOf(proxy), Foo.prototype);
1284
- },
1285
- 'setPrototypeOf'() {
1286
- class Foo {
1034
+ catch (error) {
1035
+ console.assert(error.message === 'XMLHttpRequest is forbidden in tests');
1287
1036
  }
1288
- const target = {};
1289
- const proxy = $mol_delegate({}, () => target);
1290
- Object.setPrototypeOf(proxy, Foo.prototype);
1291
- $mol_assert_equal(Object.getPrototypeOf(target), Foo.prototype);
1292
1037
  },
1293
- 'instanceof'() {
1294
- class Foo {
1038
+ 'forbidden fetch'($) {
1039
+ try {
1040
+ console.assert(void $.fetch(''));
1295
1041
  }
1296
- const proxy = $mol_delegate({}, () => new Foo);
1297
- $mol_assert_ok(proxy instanceof Foo);
1298
- $mol_assert_ok(proxy instanceof $mol_delegate);
1299
- },
1300
- 'autobind'() {
1301
- class Foo {
1042
+ catch (error) {
1043
+ console.assert(error.message === 'fetch is forbidden in tests');
1302
1044
  }
1303
- const proxy = $mol_delegate({}, () => new Foo);
1304
- $mol_assert_ok(proxy instanceof Foo);
1305
- $mol_assert_ok(proxy instanceof $mol_delegate);
1306
1045
  },
1307
1046
  });
1308
1047
  })($ || ($ = {}));
1309
- //mol/delegate/delegate.test.ts
1048
+ //mol/test/test.test.ts
1310
1049
  ;
1311
1050
  "use strict";
1312
1051
  var $;
1313
1052
  (function ($) {
1314
- const instances = new WeakSet();
1315
- function $mol_delegate(proto, target) {
1316
- const proxy = new Proxy(proto, {
1317
- get: (_, field) => {
1318
- const obj = target();
1319
- let val = Reflect.get(obj, field);
1320
- if (typeof val === 'function') {
1321
- val = val.bind(obj);
1322
- }
1323
- return val;
1324
- },
1325
- has: (_, field) => Reflect.has(target(), field),
1326
- set: (_, field, value) => Reflect.set(target(), field, value),
1327
- getOwnPropertyDescriptor: (_, field) => Reflect.getOwnPropertyDescriptor(target(), field),
1328
- ownKeys: () => Reflect.ownKeys(target()),
1329
- getPrototypeOf: () => Reflect.getPrototypeOf(target()),
1330
- setPrototypeOf: (_, donor) => Reflect.setPrototypeOf(target(), donor),
1331
- isExtensible: () => Reflect.isExtensible(target()),
1332
- preventExtensions: () => Reflect.preventExtensions(target()),
1333
- apply: (_, self, args) => Reflect.apply(target(), self, args),
1334
- construct: (_, args, retarget) => Reflect.construct(target(), args, retarget),
1335
- defineProperty: (_, field, descr) => Reflect.defineProperty(target(), field, descr),
1336
- deleteProperty: (_, field) => Reflect.deleteProperty(target(), field),
1337
- });
1338
- instances.add(proxy);
1339
- return proxy;
1340
- }
1341
- $.$mol_delegate = $mol_delegate;
1342
- Reflect.defineProperty($mol_delegate, Symbol.hasInstance, {
1343
- value: (obj) => instances.has(obj),
1053
+ })($ || ($ = {}));
1054
+ //mol/dom/context/context.ts
1055
+ ;
1056
+ "use strict";
1057
+ var $;
1058
+ (function ($_1) {
1059
+ $mol_test_mocks.push($ => {
1060
+ $.$mol_log3_come = () => { };
1061
+ $.$mol_log3_done = () => { };
1062
+ $.$mol_log3_fail = () => { };
1063
+ $.$mol_log3_warn = () => { };
1064
+ $.$mol_log3_rise = () => { };
1065
+ $.$mol_log3_area = () => () => { };
1344
1066
  });
1345
1067
  })($ || ($ = {}));
1346
- //mol/delegate/delegate.ts
1068
+ //mol/log3/log3.test.ts
1347
1069
  ;
1348
1070
  "use strict";
1349
1071
  var $;
1350
1072
  (function ($) {
1351
- $.$mol_owning_map = new WeakMap();
1352
- function $mol_owning_allow(having) {
1353
- try {
1354
- if (!having)
1355
- return false;
1356
- if (typeof having !== 'object')
1357
- return false;
1358
- if (having instanceof $mol_delegate)
1359
- return false;
1360
- if (typeof having['destructor'] !== 'function')
1361
- return false;
1362
- return true;
1363
- }
1364
- catch {
1365
- return false;
1073
+ $.$mol_dom_context = new $node.jsdom.JSDOM('', { url: 'https://localhost/' }).window;
1074
+ })($ || ($ = {}));
1075
+ //mol/dom/context/context.node.ts
1076
+ ;
1077
+ "use strict";
1078
+ var $;
1079
+ (function ($) {
1080
+ function $mol_dom_render_children(el, childNodes) {
1081
+ const node_set = new Set(childNodes);
1082
+ let nextNode = el.firstChild;
1083
+ for (let view of childNodes) {
1084
+ if (view == null)
1085
+ continue;
1086
+ if (view instanceof $mol_dom_context.Node) {
1087
+ while (true) {
1088
+ if (!nextNode) {
1089
+ el.appendChild(view);
1090
+ break;
1091
+ }
1092
+ if (nextNode == view) {
1093
+ nextNode = nextNode.nextSibling;
1094
+ break;
1095
+ }
1096
+ else {
1097
+ if (node_set.has(nextNode)) {
1098
+ el.insertBefore(view, nextNode);
1099
+ break;
1100
+ }
1101
+ else {
1102
+ const nn = nextNode.nextSibling;
1103
+ el.removeChild(nextNode);
1104
+ nextNode = nn;
1105
+ }
1106
+ }
1107
+ }
1108
+ }
1109
+ else {
1110
+ if (nextNode && nextNode.nodeName === '#text') {
1111
+ const str = String(view);
1112
+ if (nextNode.nodeValue !== str)
1113
+ nextNode.nodeValue = str;
1114
+ nextNode = nextNode.nextSibling;
1115
+ }
1116
+ else {
1117
+ const textNode = $mol_dom_context.document.createTextNode(String(view));
1118
+ el.insertBefore(textNode, nextNode);
1119
+ }
1120
+ }
1366
1121
  }
1367
- }
1368
- $.$mol_owning_allow = $mol_owning_allow;
1369
- function $mol_owning_get(having, Owner) {
1370
- if (!$mol_owning_allow(having))
1371
- return null;
1372
- while (true) {
1373
- const owner = $.$mol_owning_map.get(having);
1374
- if (!owner)
1375
- return owner;
1376
- if (!Owner)
1377
- return owner;
1378
- if (owner instanceof Owner)
1379
- return owner;
1380
- having = owner;
1122
+ while (nextNode) {
1123
+ const currNode = nextNode;
1124
+ nextNode = currNode.nextSibling;
1125
+ el.removeChild(currNode);
1381
1126
  }
1382
1127
  }
1383
- $.$mol_owning_get = $mol_owning_get;
1384
- function $mol_owning_check(owner, having) {
1385
- if (!$mol_owning_allow(having))
1386
- return false;
1387
- if ($.$mol_owning_map.get(having) !== owner)
1388
- return false;
1389
- return true;
1390
- }
1391
- $.$mol_owning_check = $mol_owning_check;
1392
- function $mol_owning_catch(owner, having) {
1393
- if (!$mol_owning_allow(having))
1394
- return false;
1395
- if ($.$mol_owning_map.get(having))
1396
- return false;
1397
- $.$mol_owning_map.set(having, owner);
1398
- return true;
1399
- }
1400
- $.$mol_owning_catch = $mol_owning_catch;
1128
+ $.$mol_dom_render_children = $mol_dom_render_children;
1129
+ })($ || ($ = {}));
1130
+ //mol/dom/render/children/children.ts
1131
+ ;
1132
+ "use strict";
1133
+ //mol/type/error/error.ts
1134
+ ;
1135
+ "use strict";
1136
+ //mol/type/assert/assert.test.ts
1137
+ ;
1138
+ "use strict";
1139
+ //mol/type/assert/assert.ts
1140
+ ;
1141
+ "use strict";
1142
+ //mol/type/equals/equals.test.ts
1143
+ ;
1144
+ "use strict";
1145
+ //mol/type/equals/equals.ts
1146
+ ;
1147
+ "use strict";
1148
+ //mol/type/partial/deep/deep.test.ts
1149
+ ;
1150
+ "use strict";
1151
+ //mol/type/partial/deep/deep.ts
1152
+ ;
1153
+ "use strict";
1154
+ var $;
1155
+ (function ($) {
1156
+ $mol_test({
1157
+ 'Make empty div'() {
1158
+ $mol_assert_equal(($mol_jsx("div", null)).outerHTML, '<div></div>');
1159
+ },
1160
+ 'Define native field'() {
1161
+ const dom = $mol_jsx("input", { value: '123' });
1162
+ $mol_assert_equal(dom.outerHTML, '<input value="123">');
1163
+ $mol_assert_equal(dom.value, '123');
1164
+ },
1165
+ 'Define classes'() {
1166
+ const dom = $mol_jsx("div", { class: 'foo bar' });
1167
+ $mol_assert_equal(dom.outerHTML, '<div class="foo bar"></div>');
1168
+ },
1169
+ 'Define styles'() {
1170
+ const dom = $mol_jsx("div", { style: { color: 'red' } });
1171
+ $mol_assert_equal(dom.outerHTML, '<div style="color: red;"></div>');
1172
+ },
1173
+ 'Define dataset'() {
1174
+ const dom = $mol_jsx("div", { dataset: { foo: 'bar' } });
1175
+ $mol_assert_equal(dom.outerHTML, '<div data-foo="bar"></div>');
1176
+ },
1177
+ 'Define attributes'() {
1178
+ const dom = $mol_jsx("div", { lang: "ru", hidden: true });
1179
+ $mol_assert_equal(dom.outerHTML, '<div lang="ru" hidden=""></div>');
1180
+ },
1181
+ 'Define child nodes'() {
1182
+ const dom = $mol_jsx("div", null,
1183
+ "hello",
1184
+ $mol_jsx("strong", null, "world"),
1185
+ "!");
1186
+ $mol_assert_equal(dom.outerHTML, '<div>hello<strong>world</strong>!</div>');
1187
+ },
1188
+ 'Function as component'() {
1189
+ const Button = (props, target) => {
1190
+ return $mol_jsx("button", { title: props.hint }, target());
1191
+ };
1192
+ const dom = $mol_jsx(Button, { id: "foo", hint: "click me" }, () => 'hey!');
1193
+ $mol_assert_equal(dom.outerHTML, '<button id="foo" title="click me" class="Button">hey!</button>');
1194
+ },
1195
+ 'Nested guid generation'() {
1196
+ const Foo = () => {
1197
+ return $mol_jsx("div", null,
1198
+ $mol_jsx(Bar, { id: "bar" },
1199
+ $mol_jsx("img", { id: "icon" })));
1200
+ };
1201
+ const Bar = (props, icon) => {
1202
+ return $mol_jsx("span", null,
1203
+ icon,
1204
+ $mol_jsx("i", { id: "label" }));
1205
+ };
1206
+ const dom = $mol_jsx(Foo, { id: "foo" });
1207
+ $mol_assert_equal(dom.outerHTML, '<div id="foo" class="Foo"><span id="foo/bar" class="Foo_bar Bar"><img id="foo/icon" class="Foo_icon"><i id="foo/bar/label" class="Foo_bar_label Bar_label"></i></span></div>');
1208
+ },
1209
+ 'Fail on non unique ids'() {
1210
+ const App = () => {
1211
+ return $mol_jsx("div", null,
1212
+ $mol_jsx("span", { id: "bar" }),
1213
+ $mol_jsx("span", { id: "bar" }));
1214
+ };
1215
+ $mol_assert_fail(() => $mol_jsx(App, { id: "foo" }), 'JSX already has tag with id "foo/bar"');
1216
+ },
1217
+ 'Owner based guid generationn'() {
1218
+ const Foo = () => {
1219
+ return $mol_jsx("div", null,
1220
+ $mol_jsx(Bar, { id: "middle", icon: () => $mol_jsx("img", { id: "icon" }) }));
1221
+ };
1222
+ const Bar = (props) => {
1223
+ return $mol_jsx("span", null, props.icon());
1224
+ };
1225
+ const dom = $mol_jsx(Foo, { id: "app" });
1226
+ $mol_assert_equal(dom.outerHTML, '<div id="app" class="Foo"><span id="app/middle" class="Foo_middle Bar"><img id="app/icon" class="Foo_icon"></span></div>');
1227
+ },
1228
+ 'Fail on same ids from different caller'() {
1229
+ const Foo = () => {
1230
+ return $mol_jsx("div", null,
1231
+ $mol_jsx("img", { id: "icon" }),
1232
+ $mol_jsx(Bar, { id: "bar", icon: () => $mol_jsx("img", { id: "icon" }) }));
1233
+ };
1234
+ const Bar = (props) => {
1235
+ return $mol_jsx("span", null, props.icon());
1236
+ };
1237
+ $mol_assert_fail(() => $mol_jsx(Foo, { id: "foo" }), 'JSX already has tag with id "foo/icon"');
1238
+ },
1239
+ });
1401
1240
  })($ || ($ = {}));
1402
- //mol/owning/owning.ts
1403
- ;
1404
- "use strict";
1405
- //mol/type/writable/writable.test.ts
1406
- ;
1407
- "use strict";
1408
- //mol/type/writable/writable.ts
1241
+ //mol/jsx/jsx.test.tsx
1409
1242
  ;
1410
1243
  "use strict";
1411
1244
  var $;
1412
1245
  (function ($) {
1413
- class $mol_object2 {
1414
- static $ = $;
1415
- [$mol_ambient_ref] = null;
1416
- get $() {
1417
- if (this[$mol_ambient_ref])
1418
- return this[$mol_ambient_ref];
1419
- const owner = $mol_owning_get(this);
1420
- return this[$mol_ambient_ref] = owner?.$ || $mol_object2.$;
1421
- }
1422
- set $(next) {
1423
- if (this[$mol_ambient_ref])
1424
- $mol_fail_hidden(new Error('Context already defined'));
1425
- this[$mol_ambient_ref] = next;
1426
- }
1427
- static create(init) {
1428
- const obj = new this;
1429
- if (init)
1430
- init(obj);
1431
- return obj;
1246
+ $.$mol_jsx_prefix = '';
1247
+ $.$mol_jsx_crumbs = '';
1248
+ $.$mol_jsx_booked = null;
1249
+ $.$mol_jsx_document = {
1250
+ getElementById: () => null,
1251
+ createElementNS: (space, name) => $mol_dom_context.document.createElementNS(space, name),
1252
+ createDocumentFragment: () => $mol_dom_context.document.createDocumentFragment(),
1253
+ };
1254
+ $.$mol_jsx_frag = '';
1255
+ function $mol_jsx(Elem, props, ...childNodes) {
1256
+ const id = props && props.id || '';
1257
+ const guid = id ? $.$mol_jsx_prefix ? $.$mol_jsx_prefix + '/' + id : id : $.$mol_jsx_prefix;
1258
+ const crumbs_self = id ? $.$mol_jsx_crumbs.replace(/(\S+)/g, `$1_${id.replace(/\/.*/i, '')}`) : $.$mol_jsx_crumbs;
1259
+ if (Elem && $.$mol_jsx_booked) {
1260
+ if ($.$mol_jsx_booked.has(id)) {
1261
+ $mol_fail(new Error(`JSX already has tag with id ${JSON.stringify(guid)}`));
1262
+ }
1263
+ else {
1264
+ $.$mol_jsx_booked.add(id);
1265
+ }
1432
1266
  }
1433
- static [Symbol.toPrimitive]() {
1434
- return this.toString();
1267
+ let node = guid ? $.$mol_jsx_document.getElementById(guid) : null;
1268
+ if ($.$mol_jsx_prefix) {
1269
+ const prefix_ext = $.$mol_jsx_prefix;
1270
+ const booked_ext = $.$mol_jsx_booked;
1271
+ const crumbs_ext = $.$mol_jsx_crumbs;
1272
+ for (const field in props) {
1273
+ const func = props[field];
1274
+ if (typeof func !== 'function')
1275
+ continue;
1276
+ const wrapper = function (...args) {
1277
+ const prefix = $.$mol_jsx_prefix;
1278
+ const booked = $.$mol_jsx_booked;
1279
+ const crumbs = $.$mol_jsx_crumbs;
1280
+ try {
1281
+ $.$mol_jsx_prefix = prefix_ext;
1282
+ $.$mol_jsx_booked = booked_ext;
1283
+ $.$mol_jsx_crumbs = crumbs_ext;
1284
+ return func.call(this, ...args);
1285
+ }
1286
+ finally {
1287
+ $.$mol_jsx_prefix = prefix;
1288
+ $.$mol_jsx_booked = booked;
1289
+ $.$mol_jsx_crumbs = crumbs;
1290
+ }
1291
+ };
1292
+ $mol_func_name_from(wrapper, func);
1293
+ props[field] = wrapper;
1294
+ }
1435
1295
  }
1436
- static toString() {
1437
- if (Symbol.toStringTag in this)
1438
- return this[Symbol.toStringTag];
1439
- return this.name;
1296
+ if (typeof Elem !== 'string') {
1297
+ if ('prototype' in Elem) {
1298
+ const view = node && node[Elem] || new Elem;
1299
+ Object.assign(view, props);
1300
+ view[Symbol.toStringTag] = guid;
1301
+ view.childNodes = childNodes;
1302
+ if (!view.ownerDocument)
1303
+ view.ownerDocument = $.$mol_jsx_document;
1304
+ view.className = (crumbs_self ? crumbs_self + ' ' : '') + (Elem['name'] || Elem);
1305
+ node = view.valueOf();
1306
+ node[Elem] = view;
1307
+ return node;
1308
+ }
1309
+ else {
1310
+ const prefix = $.$mol_jsx_prefix;
1311
+ const booked = $.$mol_jsx_booked;
1312
+ const crumbs = $.$mol_jsx_crumbs;
1313
+ try {
1314
+ $.$mol_jsx_prefix = guid;
1315
+ $.$mol_jsx_booked = new Set;
1316
+ $.$mol_jsx_crumbs = (crumbs_self ? crumbs_self + ' ' : '') + (Elem['name'] || Elem);
1317
+ return Elem(props, ...childNodes);
1318
+ }
1319
+ finally {
1320
+ $.$mol_jsx_prefix = prefix;
1321
+ $.$mol_jsx_booked = booked;
1322
+ $.$mol_jsx_crumbs = crumbs;
1323
+ }
1324
+ }
1440
1325
  }
1441
- destructor() { }
1442
- toString() {
1443
- return this[Symbol.toStringTag] || this.constructor.name + '()';
1326
+ if (!node) {
1327
+ node = Elem
1328
+ ? $.$mol_jsx_document.createElementNS(props?.xmlns ?? 'http://www.w3.org/1999/xhtml', Elem)
1329
+ : $.$mol_jsx_document.createDocumentFragment();
1444
1330
  }
1445
- toJSON() {
1446
- return this.toString();
1331
+ $mol_dom_render_children(node, [].concat(...childNodes));
1332
+ if (!Elem)
1333
+ return node;
1334
+ if (guid)
1335
+ node.id = guid;
1336
+ for (const key in props) {
1337
+ if (key === 'id')
1338
+ continue;
1339
+ if (typeof props[key] === 'string') {
1340
+ ;
1341
+ node.setAttribute(key, props[key]);
1342
+ }
1343
+ else if (props[key] &&
1344
+ typeof props[key] === 'object' &&
1345
+ Reflect.getPrototypeOf(props[key]) === Reflect.getPrototypeOf({})) {
1346
+ if (typeof node[key] === 'object') {
1347
+ Object.assign(node[key], props[key]);
1348
+ continue;
1349
+ }
1350
+ }
1351
+ else {
1352
+ node[key] = props[key];
1353
+ }
1447
1354
  }
1355
+ if ($.$mol_jsx_crumbs)
1356
+ node.className = (props?.['class'] ? props['class'] + ' ' : '') + crumbs_self;
1357
+ return node;
1448
1358
  }
1449
- $.$mol_object2 = $mol_object2;
1359
+ $.$mol_jsx = $mol_jsx;
1450
1360
  })($ || ($ = {}));
1451
- //mol/object2/object2.ts
1361
+ //mol/jsx/jsx.ts
1452
1362
  ;
1453
1363
  "use strict";
1454
1364
  var $;
1455
- (function ($_1) {
1365
+ (function ($) {
1456
1366
  $mol_test({
1457
- 'tree parsing'() {
1458
- $mol_assert_equal($mol_tree.fromString("foo\nbar\n").sub.length, 2);
1459
- $mol_assert_equal($mol_tree.fromString("foo\nbar\n").sub[1].type, "bar");
1460
- $mol_assert_equal($mol_tree.fromString("foo\n\n\n").sub.length, 1);
1461
- $mol_assert_equal($mol_tree.fromString("=foo\n\\bar\n").sub.length, 2);
1462
- $mol_assert_equal($mol_tree.fromString("=foo\n\\bar\n").sub[1].data, "bar");
1463
- $mol_assert_equal($mol_tree.fromString("foo bar \\pol").sub[0].sub[0].sub[0].data, "pol");
1464
- $mol_assert_equal($mol_tree.fromString("foo bar\n\t\\pol\n\t\\men").sub[0].sub[0].sub[1].data, "men");
1465
- $mol_assert_equal($mol_tree.fromString('foo bar \\text\n').toString(), 'foo bar \\text\n');
1367
+ 'nulls & undefineds'() {
1368
+ $mol_assert_ok($mol_compare_deep(null, null));
1369
+ $mol_assert_ok($mol_compare_deep(undefined, undefined));
1370
+ $mol_assert_not($mol_compare_deep(undefined, null));
1371
+ $mol_assert_not($mol_compare_deep({}, null));
1372
+ },
1373
+ 'number'() {
1374
+ $mol_assert_ok($mol_compare_deep(1, 1));
1375
+ $mol_assert_ok($mol_compare_deep(Number.NaN, Number.NaN));
1376
+ $mol_assert_not($mol_compare_deep(1, 2));
1377
+ $mol_assert_ok($mol_compare_deep(Object(1), Object(1)));
1378
+ $mol_assert_not($mol_compare_deep(Object(1), Object(2)));
1379
+ },
1380
+ 'POJO'() {
1381
+ $mol_assert_ok($mol_compare_deep({}, {}));
1382
+ $mol_assert_not($mol_compare_deep({ a: 1 }, { b: 2 }));
1383
+ $mol_assert_not($mol_compare_deep({ a: 1 }, { a: 2 }));
1384
+ $mol_assert_not($mol_compare_deep({}, { a: undefined }));
1385
+ $mol_assert_ok($mol_compare_deep({ a: 1, b: 2 }, { b: 2, a: 1 }));
1386
+ $mol_assert_ok($mol_compare_deep({ a: { b: 1 } }, { a: { b: 1 } }));
1387
+ },
1388
+ 'Array'() {
1389
+ $mol_assert_ok($mol_compare_deep([], []));
1390
+ $mol_assert_ok($mol_compare_deep([1, [2]], [1, [2]]));
1391
+ $mol_assert_not($mol_compare_deep([1, 2], [1, 3]));
1392
+ $mol_assert_not($mol_compare_deep([1, 2,], [1, 3, undefined]));
1393
+ },
1394
+ 'Non POJO are different'() {
1395
+ class Thing extends Object {
1396
+ }
1397
+ $mol_assert_not($mol_compare_deep(new Thing, new Thing));
1398
+ $mol_assert_not($mol_compare_deep(() => 1, () => 1));
1399
+ $mol_assert_not($mol_compare_deep(new RangeError('Test error'), new RangeError('Test error')));
1400
+ },
1401
+ 'same POJOs with cyclic reference'() {
1402
+ const a = { foo: {} };
1403
+ a['self'] = a;
1404
+ const b = { foo: {} };
1405
+ b['self'] = b;
1406
+ $mol_assert_ok($mol_compare_deep(a, b));
1407
+ },
1408
+ 'Date'() {
1409
+ $mol_assert_ok($mol_compare_deep(new Date(12345), new Date(12345)));
1410
+ $mol_assert_not($mol_compare_deep(new Date(12345), new Date(12346)));
1466
1411
  },
1467
- 'inserting'() {
1468
- $mol_assert_equal($mol_tree.fromString('a b c d').insert(new $mol_tree, 'a', 'b', 'c').toString(), 'a b \\\n');
1469
- $mol_assert_equal($mol_tree.fromString('a b').insert(new $mol_tree, 'a', 'b', 'c', 'd').toString(), 'a b c \\\n');
1470
- $mol_assert_equal($mol_tree.fromString('a b c d').insert(new $mol_tree, 0, 0, 0).toString(), 'a b \\\n');
1471
- $mol_assert_equal($mol_tree.fromString('a b').insert(new $mol_tree, 0, 0, 0, 0).toString(), 'a b \\\n\t\\\n');
1472
- $mol_assert_equal($mol_tree.fromString('a b c d').insert(new $mol_tree, null, null, null).toString(), 'a b \\\n');
1473
- $mol_assert_equal($mol_tree.fromString('a b').insert(new $mol_tree, null, null, null, null).toString(), 'a b \\\n\t\\\n');
1412
+ 'RegExp'() {
1413
+ $mol_assert_ok($mol_compare_deep(/\x22/mig, /\x22/mig));
1414
+ $mol_assert_not($mol_compare_deep(/\x22/mig, /\x21/mig));
1415
+ $mol_assert_not($mol_compare_deep(/\x22/mig, /\x22/mg));
1474
1416
  },
1475
- 'fromJSON'() {
1476
- $mol_assert_equal($mol_tree.fromJSON([]).toString(), '/\n');
1477
- $mol_assert_equal($mol_tree.fromJSON([false, true]).toString(), '/\n\tfalse\n\ttrue\n');
1478
- $mol_assert_equal($mol_tree.fromJSON([0, 1, 2.3]).toString(), '/\n\t0\n\t1\n\t2.3\n');
1479
- $mol_assert_equal($mol_tree.fromJSON(['', 'foo', 'bar\nbaz']).toString(), '/\n\t\\\n\t\\foo\n\t\\\n\t\t\\bar\n\t\t\\baz\n');
1480
- $mol_assert_equal($mol_tree.fromJSON({ 'foo': false, 'bar\nbaz': 'lol' }).toString(), '*\n\tfoo false\n\t\\\n\t\t\\bar\n\t\t\\baz\n\t\t\\lol\n');
1417
+ 'Error'() {
1418
+ $mol_assert_not($mol_compare_deep(new Error('xxx'), new Error('xxx')));
1419
+ const fail = (message) => new Error(message);
1420
+ $mol_assert_ok($mol_compare_deep(...['xxx', 'xxx'].map(msg => new Error(msg))));
1421
+ $mol_assert_not($mol_compare_deep(...['xxx', 'yyy'].map(msg => new Error(msg))));
1481
1422
  },
1482
- 'toJSON'() {
1483
- $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n').sub[0]), '[]');
1484
- $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n\tfalse\n\ttrue\n').sub[0]), '[false,true]');
1485
- $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n\t0\n\t1\n\t2.3\n').sub[0]), '[0,1,2.3]');
1486
- $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n\t\\\n\t\\foo\n\t\\\n\t\t\\bar\n\t\t\\baz\n').sub[0]), '["","foo","bar\\nbaz"]');
1487
- $mol_assert_equal(JSON.stringify($mol_tree.fromString('*\n\tfoo false\n\t\\\n\t\t\\bar\n\t\t\\baz\n\t\t\\lol\n').sub[0]), '{"foo":false,"bar\\nbaz":"lol"}');
1423
+ 'Map'() {
1424
+ $mol_assert_ok($mol_compare_deep(new Map, new Map));
1425
+ $mol_assert_ok($mol_compare_deep(new Map([[1, [2]]]), new Map([[1, [2]]])));
1426
+ $mol_assert_not($mol_compare_deep(new Map([[1, 2]]), new Map([[1, 3]])));
1427
+ $mol_assert_not($mol_compare_deep(new Map([[[1], 2]]), new Map([[[1], 2]])));
1488
1428
  },
1489
- 'hack'() {
1490
- const res = $mol_tree.fromString(`foo bar xxx`).hack({
1491
- '': (tree, context) => [tree.hack(context)],
1492
- 'bar': (tree, context) => [tree.hack(context).clone({ type: '777' })],
1493
- });
1494
- $mol_assert_equal(res.toString(), new $mol_tree({ type: 'foo 777 xxx' }).toString());
1429
+ 'Set'() {
1430
+ $mol_assert_ok($mol_compare_deep(new Set, new Set));
1431
+ $mol_assert_ok($mol_compare_deep(new Set([1, [2]]), new Set([1, [2]])));
1432
+ $mol_assert_not($mol_compare_deep(new Set([1]), new Set([2])));
1495
1433
  },
1496
- 'errors handling'($) {
1497
- const errors = [];
1498
- class Tree extends $mol_tree {
1499
- static $ = $.$mol_ambient({
1500
- $mol_fail: error => errors.push(error.message)
1501
- });
1434
+ 'Uint8Array'() {
1435
+ $mol_assert_ok($mol_compare_deep(new Uint8Array, new Uint8Array));
1436
+ $mol_assert_ok($mol_compare_deep(new Uint8Array([0]), new Uint8Array([0])));
1437
+ $mol_assert_not($mol_compare_deep(new Uint8Array([0]), new Uint8Array([1])));
1438
+ },
1439
+ 'Custom comparator'() {
1440
+ class User {
1441
+ name;
1442
+ rand;
1443
+ constructor(name, rand = Math.random()) {
1444
+ this.name = name;
1445
+ this.rand = rand;
1446
+ }
1447
+ [Symbol.toPrimitive](mode) {
1448
+ return this.name;
1449
+ }
1502
1450
  }
1503
- Tree.fromString(`
1504
- \t \tfoo
1505
- bar \\data
1506
- `, 'test');
1507
- $mol_assert_like(errors, ['Syntax error at test:2\n \tfoo']);
1451
+ $mol_assert_ok($mol_compare_deep(new User('Jin'), new User('Jin')));
1452
+ $mol_assert_not($mol_compare_deep(new User('Jin'), new User('John')));
1508
1453
  },
1509
1454
  });
1510
1455
  })($ || ($ = {}));
1511
- //mol/tree/tree.test.ts
1456
+ //mol/compare/deep/deep.test.tsx
1512
1457
  ;
1513
1458
  "use strict";
1514
1459
  var $;
1515
1460
  (function ($) {
1516
- $.$mol_tree_convert = Symbol('$mol_tree_convert');
1517
- class $mol_tree extends $mol_object2 {
1518
- type;
1519
- data;
1520
- sub;
1521
- baseUri;
1522
- row;
1523
- col;
1524
- length;
1525
- constructor(config = {}) {
1526
- super();
1527
- this.type = config.type || '';
1528
- if (config.value !== undefined) {
1529
- var sub = $mol_tree.values(config.value);
1530
- if (config.type || sub.length > 1) {
1531
- this.sub = [...sub, ...(config.sub || [])];
1532
- this.data = config.data || '';
1533
- }
1534
- else {
1535
- this.data = sub[0].data;
1536
- this.sub = config.sub || [];
1537
- }
1538
- }
1539
- else {
1540
- this.data = config.data || '';
1541
- this.sub = config.sub || [];
1542
- }
1543
- this.baseUri = config.baseUri || '';
1544
- this.row = config.row || 0;
1545
- this.col = config.col || 0;
1546
- this.length = config.length || 0;
1547
- }
1548
- static values(str, baseUri) {
1549
- return str.split('\n').map((data, index) => new $mol_tree({
1550
- data: data,
1551
- baseUri: baseUri,
1552
- row: index + 1,
1553
- length: data.length,
1554
- }));
1555
- }
1556
- clone(config = {}) {
1557
- return new $mol_tree({
1558
- type: ('type' in config) ? config.type : this.type,
1559
- data: ('data' in config) ? config.data : this.data,
1560
- sub: ('sub' in config) ? config.sub : this.sub,
1561
- baseUri: ('baseUri' in config) ? config.baseUri : this.baseUri,
1562
- row: ('row' in config) ? config.row : this.row,
1563
- col: ('col' in config) ? config.col : this.col,
1564
- length: ('length' in config) ? config.length : this.length,
1565
- value: config.value
1566
- });
1567
- }
1568
- make(config) {
1569
- return new $mol_tree({
1570
- baseUri: this.baseUri,
1571
- row: this.row,
1572
- col: this.col,
1573
- length: this.length,
1574
- ...config,
1575
- });
1576
- }
1577
- make_data(value, sub) {
1578
- return this.make({ value, sub });
1579
- }
1580
- make_struct(type, sub) {
1581
- return this.make({ type, sub });
1582
- }
1583
- static fromString(str, baseUri) {
1584
- var root = new $mol_tree({ baseUri: baseUri });
1585
- var stack = [root];
1586
- var row = 0;
1587
- var prefix = str.replace(/^\n?(\t*)[\s\S]*/, '$1');
1588
- var lines = str.replace(new RegExp('^\\t{0,' + prefix.length + '}', 'mg'), '').split('\n');
1589
- lines.forEach(line => {
1590
- ++row;
1591
- var chunks = /^(\t*)((?:[^\n\t\\ ]+ *)*)(\\[^\n]*)?(.*?)(?:$|\n)/m.exec(line);
1592
- if (!chunks || chunks[4])
1593
- return this.$.$mol_fail(new Error(`Syntax error at ${baseUri}:${row}\n${line}`));
1594
- var indent = chunks[1];
1595
- var path = chunks[2];
1596
- var data = chunks[3];
1597
- var deep = indent.length;
1598
- var types = path ? path.replace(/ $/, '').split(/ +/) : [];
1599
- if (stack.length <= deep)
1600
- return this.$.$mol_fail(new Error(`Too many tabs at ${baseUri}:${row}\n${line}`));
1601
- stack.length = deep + 1;
1602
- var parent = stack[deep];
1603
- let col = deep;
1604
- types.forEach(type => {
1605
- if (!type)
1606
- return this.$.$mol_fail(new Error(`Unexpected space symbol ${baseUri}:${row}\n${line}`));
1607
- var next = new $mol_tree({ type, baseUri, row, col, length: type.length });
1608
- const parent_sub = parent.sub;
1609
- parent_sub.push(next);
1610
- parent = next;
1611
- col += type.length + 1;
1612
- });
1613
- if (data) {
1614
- var next = new $mol_tree({ data: data.substring(1), baseUri, row, col, length: data.length });
1615
- const parent_sub = parent.sub;
1616
- parent_sub.push(next);
1617
- parent = next;
1618
- }
1619
- stack.push(parent);
1620
- });
1621
- return root;
1622
- }
1623
- static fromJSON(json, baseUri = '') {
1624
- switch (true) {
1625
- case typeof json === 'boolean':
1626
- case typeof json === 'number':
1627
- case json === null:
1628
- return new $mol_tree({
1629
- type: String(json),
1630
- baseUri: baseUri
1631
- });
1632
- case typeof json === 'string':
1633
- return new $mol_tree({
1634
- value: json,
1635
- baseUri: baseUri
1636
- });
1637
- case Array.isArray(json):
1638
- return new $mol_tree({
1639
- type: "/",
1640
- sub: json.map(json => $mol_tree.fromJSON(json, baseUri))
1641
- });
1642
- case json instanceof Date:
1643
- return new $mol_tree({
1644
- value: json.toISOString(),
1645
- baseUri: baseUri
1646
- });
1647
- default:
1648
- if (typeof json[$.$mol_tree_convert] === 'function') {
1649
- return json[$.$mol_tree_convert]();
1650
- }
1651
- if (typeof json.toJSON === 'function') {
1652
- return $mol_tree.fromJSON(json.toJSON());
1653
- }
1654
- if (json instanceof Error) {
1655
- const { name, message, stack } = json;
1656
- json = { ...json, name, message, stack };
1657
- }
1658
- var sub = [];
1659
- for (var key in json) {
1660
- if (json[key] === undefined)
1661
- continue;
1662
- const subsub = $mol_tree.fromJSON(json[key], baseUri);
1663
- if (/^[^\n\t\\ ]+$/.test(key)) {
1664
- var child = new $mol_tree({
1665
- type: key,
1666
- baseUri: baseUri,
1667
- sub: [subsub],
1668
- });
1669
- }
1670
- else {
1671
- var child = new $mol_tree({
1672
- value: key,
1673
- baseUri: baseUri,
1674
- sub: [subsub],
1675
- });
1676
- }
1677
- sub.push(child);
1678
- }
1679
- return new $mol_tree({
1680
- type: "*",
1681
- sub: sub,
1682
- baseUri: baseUri
1683
- });
1684
- }
1461
+ $.$mol_compare_deep_cache = new WeakMap();
1462
+ function $mol_compare_deep(left, right) {
1463
+ if (Object.is(left, right))
1464
+ return true;
1465
+ if (left === null)
1466
+ return false;
1467
+ if (right === null)
1468
+ return false;
1469
+ if (typeof left !== 'object')
1470
+ return false;
1471
+ if (typeof right !== 'object')
1472
+ return false;
1473
+ const left_proto = Reflect.getPrototypeOf(left);
1474
+ const right_proto = Reflect.getPrototypeOf(right);
1475
+ if (left_proto !== right_proto)
1476
+ return false;
1477
+ if (left instanceof Boolean)
1478
+ return Object.is(left.valueOf(), right['valueOf']());
1479
+ if (left instanceof Number)
1480
+ return Object.is(left.valueOf(), right['valueOf']());
1481
+ if (left instanceof String)
1482
+ return Object.is(left.valueOf(), right['valueOf']());
1483
+ if (left instanceof Date)
1484
+ return Object.is(left.valueOf(), right['valueOf']());
1485
+ if (left instanceof RegExp)
1486
+ return left.source === right['source'] && left.flags === right['flags'];
1487
+ if (left instanceof Error)
1488
+ return left.stack === right['stack'];
1489
+ let left_cache = $.$mol_compare_deep_cache.get(left);
1490
+ if (left_cache) {
1491
+ const right_cache = left_cache.get(right);
1492
+ if (typeof right_cache === 'boolean')
1493
+ return right_cache;
1685
1494
  }
1686
- get uri() {
1687
- return this.baseUri + '#' + this.row + ':' + this.col;
1495
+ else {
1496
+ left_cache = new WeakMap([[right, true]]);
1497
+ $.$mol_compare_deep_cache.set(left, left_cache);
1688
1498
  }
1689
- toString(prefix = '') {
1690
- var output = '';
1691
- if (this.type.length) {
1692
- if (!prefix.length) {
1693
- prefix = "\t";
1694
- }
1695
- output += this.type;
1696
- if (this.sub.length == 1) {
1697
- return output + ' ' + this.sub[0].toString(prefix);
1698
- }
1699
- output += "\n";
1700
- }
1701
- else if (this.data.length || prefix.length) {
1702
- output += "\\" + this.data + "\n";
1703
- }
1704
- for (var child of this.sub) {
1705
- output += prefix;
1706
- output += child.toString(prefix + "\t");
1707
- }
1708
- return output;
1499
+ let result;
1500
+ try {
1501
+ if (left_proto && !Reflect.getPrototypeOf(left_proto))
1502
+ result = compare_pojo(left, right);
1503
+ else if (Array.isArray(left))
1504
+ result = compare_array(left, right);
1505
+ else if (left instanceof Set)
1506
+ result = compare_set(left, right);
1507
+ else if (left instanceof Map)
1508
+ result = compare_map(left, right);
1509
+ else if (ArrayBuffer.isView(left))
1510
+ result = compare_buffer(left, right);
1511
+ else if (Symbol.toPrimitive in left)
1512
+ result = compare_primitive(left, right);
1513
+ else
1514
+ result = false;
1709
1515
  }
1710
- toJSON() {
1711
- if (!this.type)
1712
- return this.value;
1713
- if (this.type === 'true')
1714
- return true;
1715
- if (this.type === 'false')
1516
+ finally {
1517
+ left_cache.set(right, result);
1518
+ }
1519
+ return result;
1520
+ }
1521
+ $.$mol_compare_deep = $mol_compare_deep;
1522
+ function compare_array(left, right) {
1523
+ const len = left.length;
1524
+ if (len !== right.length)
1525
+ return false;
1526
+ for (let i = 0; i < len; ++i) {
1527
+ if (!$mol_compare_deep(left[i], right[i]))
1716
1528
  return false;
1717
- if (this.type === 'null')
1718
- return null;
1719
- if (this.type === '*') {
1720
- var obj = {};
1721
- for (var child of this.sub) {
1722
- if (child.type === '-')
1723
- continue;
1724
- var key = child.type || child.clone({ sub: child.sub.slice(0, child.sub.length - 1) }).value;
1725
- var val = child.sub[child.sub.length - 1].toJSON();
1726
- if (val !== undefined)
1727
- obj[key] = val;
1728
- }
1729
- return obj;
1730
- }
1731
- if (this.type === '/') {
1732
- var res = [];
1733
- this.sub.forEach(child => {
1734
- if (child.type === '-')
1735
- return;
1736
- var val = child.toJSON();
1737
- if (val !== undefined)
1738
- res.push(val);
1739
- });
1740
- return res;
1741
- }
1742
- if (this.type === 'time') {
1743
- return new Date(this.value);
1744
- }
1745
- const numb = Number(this.type);
1746
- if (!Number.isNaN(numb) || this.type === 'NaN')
1747
- return numb;
1748
- throw new Error(`Unknown type (${this.type}) at ${this.uri}`);
1749
1529
  }
1750
- get value() {
1751
- var values = [];
1752
- for (var child of this.sub) {
1753
- if (child.type)
1754
- continue;
1755
- values.push(child.value);
1756
- }
1757
- return this.data + values.join("\n");
1530
+ return true;
1531
+ }
1532
+ function compare_buffer(left, right) {
1533
+ const len = left.byteLength;
1534
+ if (len !== right.byteLength)
1535
+ return false;
1536
+ for (let i = 0; i < len; ++i) {
1537
+ if (left[i] !== right[i])
1538
+ return false;
1758
1539
  }
1759
- insert(value, ...path) {
1760
- if (path.length === 0)
1761
- return value;
1762
- const type = path[0];
1763
- if (typeof type === 'string') {
1764
- let replaced = false;
1765
- const sub = this.sub.map((item, index) => {
1766
- if (item.type !== type)
1767
- return item;
1768
- replaced = true;
1769
- return item.insert(value, ...path.slice(1));
1770
- });
1771
- if (!replaced)
1772
- sub.push(new $mol_tree({ type }).insert(value, ...path.slice(1)));
1773
- return this.clone({ sub });
1774
- }
1775
- else if (typeof type === 'number') {
1776
- const sub = this.sub.slice();
1777
- sub[type] = (sub[type] || new $mol_tree).insert(value, ...path.slice(1));
1778
- return this.clone({ sub });
1540
+ return true;
1541
+ }
1542
+ function compare_iterator(left, right, compare) {
1543
+ while (true) {
1544
+ const left_next = left.next();
1545
+ const right_next = right.next();
1546
+ if (left_next.done !== right_next.done)
1547
+ return false;
1548
+ if (left_next.done)
1549
+ break;
1550
+ if (!compare(left_next.value, right_next.value))
1551
+ return false;
1552
+ }
1553
+ return true;
1554
+ }
1555
+ function compare_set(left, right) {
1556
+ if (left.size !== right.size)
1557
+ return false;
1558
+ return compare_iterator(left.values(), right.values(), $mol_compare_deep);
1559
+ }
1560
+ function compare_map(left, right) {
1561
+ if (left.size !== right.size)
1562
+ return false;
1563
+ return compare_iterator(left.keys(), right.keys(), Object.is)
1564
+ && compare_iterator(left.values(), right.values(), $mol_compare_deep);
1565
+ }
1566
+ function compare_pojo(left, right) {
1567
+ const left_keys = Object.getOwnPropertyNames(left);
1568
+ const right_keys = Object.getOwnPropertyNames(right);
1569
+ if (left_keys.length !== right_keys.length)
1570
+ return false;
1571
+ for (let key of left_keys) {
1572
+ if (!$mol_compare_deep(left[key], Reflect.get(right, key)))
1573
+ return false;
1574
+ }
1575
+ return true;
1576
+ }
1577
+ function compare_primitive(left, right) {
1578
+ return Object.is(left[Symbol.toPrimitive]('default'), right[Symbol.toPrimitive]('default'));
1579
+ }
1580
+ })($ || ($ = {}));
1581
+ //mol/compare/deep/deep.ts
1582
+ ;
1583
+ "use strict";
1584
+ var $;
1585
+ (function ($) {
1586
+ function $mol_dom_serialize(node) {
1587
+ const serializer = new $mol_dom_context.XMLSerializer;
1588
+ return serializer.serializeToString(node);
1589
+ }
1590
+ $.$mol_dom_serialize = $mol_dom_serialize;
1591
+ })($ || ($ = {}));
1592
+ //mol/dom/serialize/serialize.ts
1593
+ ;
1594
+ "use strict";
1595
+ var $;
1596
+ (function ($) {
1597
+ $mol_test({
1598
+ 'must be false'() {
1599
+ $mol_assert_not(0);
1600
+ },
1601
+ 'must be true'() {
1602
+ $mol_assert_ok(1);
1603
+ },
1604
+ 'two must be equal'() {
1605
+ $mol_assert_equal(2, 2);
1606
+ },
1607
+ 'three must be equal'() {
1608
+ $mol_assert_equal(2, 2, 2);
1609
+ },
1610
+ 'two must be unique'() {
1611
+ $mol_assert_unique([3], [3]);
1612
+ },
1613
+ 'three must be unique'() {
1614
+ $mol_assert_unique([3], [3], [3]);
1615
+ },
1616
+ 'two must be alike'() {
1617
+ $mol_assert_like([3], [3]);
1618
+ },
1619
+ 'three must be alike'() {
1620
+ $mol_assert_like([3], [3], [3]);
1621
+ },
1622
+ });
1623
+ })($ || ($ = {}));
1624
+ //mol/assert/assert.test.ts
1625
+ ;
1626
+ "use strict";
1627
+ var $;
1628
+ (function ($) {
1629
+ function $mol_assert_ok(value) {
1630
+ if (value)
1631
+ return;
1632
+ $mol_fail(new Error(`${value} ≠ true`));
1633
+ }
1634
+ $.$mol_assert_ok = $mol_assert_ok;
1635
+ function $mol_assert_not(value) {
1636
+ if (!value)
1637
+ return;
1638
+ $mol_fail(new Error(`${value} ≠ false`));
1639
+ }
1640
+ $.$mol_assert_not = $mol_assert_not;
1641
+ function $mol_assert_fail(handler, ErrorRight) {
1642
+ const fail = $.$mol_fail;
1643
+ try {
1644
+ $.$mol_fail = $.$mol_fail_hidden;
1645
+ handler();
1646
+ }
1647
+ catch (error) {
1648
+ if (!ErrorRight)
1649
+ return error;
1650
+ $.$mol_fail = fail;
1651
+ if (typeof ErrorRight === 'string') {
1652
+ $mol_assert_equal(error.message, ErrorRight);
1779
1653
  }
1780
1654
  else {
1781
- return this.clone({ sub: ((this.sub.length === 0) ? [new $mol_tree()] : this.sub).map(item => item.insert(value, ...path.slice(1))) });
1655
+ $mol_assert_ok(error instanceof ErrorRight);
1782
1656
  }
1657
+ return error;
1783
1658
  }
1784
- select(...path) {
1785
- var next = [this];
1786
- for (var type of path) {
1787
- if (!next.length)
1788
- break;
1789
- var prev = next;
1790
- next = [];
1791
- for (var item of prev) {
1792
- switch (typeof (type)) {
1793
- case 'string':
1794
- for (var child of item.sub) {
1795
- if (!type || (child.type == type)) {
1796
- next.push(child);
1797
- }
1798
- }
1799
- break;
1800
- case 'number':
1801
- if (type < item.sub.length)
1802
- next.push(item.sub[type]);
1803
- break;
1804
- default: next.push(...item.sub);
1805
- }
1806
- }
1659
+ finally {
1660
+ $.$mol_fail = fail;
1661
+ }
1662
+ $mol_fail(new Error('Not failed'));
1663
+ }
1664
+ $.$mol_assert_fail = $mol_assert_fail;
1665
+ function $mol_assert_equal(...args) {
1666
+ for (let i = 0; i < args.length; ++i) {
1667
+ for (let j = 0; j < args.length; ++j) {
1668
+ if (i === j)
1669
+ continue;
1670
+ if (Number.isNaN(args[i]) && Number.isNaN(args[j]))
1671
+ continue;
1672
+ if (args[i] !== args[j])
1673
+ $mol_fail(new Error(`Not equal (${i + 1}:${j + 1})\n${args[i]}\n${args[j]}`));
1807
1674
  }
1808
- return new $mol_tree({ sub: next });
1809
1675
  }
1810
- filter(path, value) {
1811
- var sub = this.sub.filter(function (item) {
1812
- var found = item.select(...path);
1813
- if (value == null) {
1814
- return Boolean(found.sub.length);
1815
- }
1816
- else {
1817
- return found.sub.some(child => child.value == value);
1676
+ }
1677
+ $.$mol_assert_equal = $mol_assert_equal;
1678
+ function $mol_assert_unique(...args) {
1679
+ for (let i = 0; i < args.length; ++i) {
1680
+ for (let j = 0; j < args.length; ++j) {
1681
+ if (i === j)
1682
+ continue;
1683
+ if (args[i] === args[j] || (Number.isNaN(args[i]) && Number.isNaN(args[j]))) {
1684
+ $mol_fail(new Error(`args[${i}] = args[${j}] = ${args[i]}`));
1818
1685
  }
1819
- });
1820
- return new $mol_tree({ sub: sub });
1821
- }
1822
- transform(visit, stack = []) {
1823
- const sub_stack = [this, ...stack];
1824
- return visit(sub_stack, () => this.sub.map(node => node.transform(visit, sub_stack)).filter(n => n));
1825
- }
1826
- hack(context) {
1827
- const sub = [].concat(...this.sub.map(child => {
1828
- const handle = context[child.type] || context[''];
1829
- if (!handle)
1830
- $mol_fail(child.error('Handler not defined'));
1831
- return handle(child, context);
1832
- }));
1833
- return this.clone({ sub });
1686
+ }
1834
1687
  }
1835
- error(message) {
1836
- return new Error(`${message}:\n${this} ${this.baseUri}:${this.row}:${this.col}`);
1688
+ }
1689
+ $.$mol_assert_unique = $mol_assert_unique;
1690
+ function $mol_assert_like(head, ...tail) {
1691
+ for (let [index, value] of Object.entries(tail)) {
1692
+ if (!$mol_compare_deep(value, head)) {
1693
+ const print = (val) => {
1694
+ if (!val)
1695
+ return val;
1696
+ if (typeof val !== 'object')
1697
+ return val;
1698
+ if ('outerHTML' in val)
1699
+ return val.outerHTML;
1700
+ try {
1701
+ return JSON.stringify(val);
1702
+ }
1703
+ catch (error) {
1704
+ console.error(error);
1705
+ return val;
1706
+ }
1707
+ };
1708
+ return $mol_fail(new Error(`Not like (1:${+index + 2})\n${print(head)}\n---\n${print(value)}`));
1709
+ }
1837
1710
  }
1838
1711
  }
1839
- $.$mol_tree = $mol_tree;
1712
+ $.$mol_assert_like = $mol_assert_like;
1713
+ function $mol_assert_dom(left, right) {
1714
+ $mol_assert_equal($mol_dom_serialize(left), $mol_dom_serialize(right));
1715
+ }
1716
+ $.$mol_assert_dom = $mol_assert_dom;
1840
1717
  })($ || ($ = {}));
1841
- //mol/tree/tree.ts
1718
+ //mol/assert/assert.ts
1719
+ ;
1720
+ "use strict";
1721
+ var $;
1722
+ (function ($) {
1723
+ $mol_test({
1724
+ 'get'() {
1725
+ const proxy = $mol_delegate({}, () => ({ foo: 777 }));
1726
+ $mol_assert_equal(proxy.foo, 777);
1727
+ },
1728
+ 'has'() {
1729
+ const proxy = $mol_delegate({}, () => ({ foo: 777 }));
1730
+ $mol_assert_equal('foo' in proxy, true);
1731
+ },
1732
+ 'set'() {
1733
+ const target = { foo: 777 };
1734
+ const proxy = $mol_delegate({}, () => target);
1735
+ proxy.foo = 123;
1736
+ $mol_assert_equal(target.foo, 123);
1737
+ },
1738
+ 'getOwnPropertyDescriptor'() {
1739
+ const proxy = $mol_delegate({}, () => ({ foo: 777 }));
1740
+ $mol_assert_like(Object.getOwnPropertyDescriptor(proxy, 'foo'), {
1741
+ value: 777,
1742
+ writable: true,
1743
+ enumerable: true,
1744
+ configurable: true,
1745
+ });
1746
+ },
1747
+ 'ownKeys'() {
1748
+ const proxy = $mol_delegate({}, () => ({ foo: 777, [Symbol.toStringTag]: 'bar' }));
1749
+ $mol_assert_like(Reflect.ownKeys(proxy), ['foo', Symbol.toStringTag]);
1750
+ },
1751
+ 'getPrototypeOf'() {
1752
+ class Foo {
1753
+ }
1754
+ const proxy = $mol_delegate({}, () => new Foo);
1755
+ $mol_assert_equal(Object.getPrototypeOf(proxy), Foo.prototype);
1756
+ },
1757
+ 'setPrototypeOf'() {
1758
+ class Foo {
1759
+ }
1760
+ const target = {};
1761
+ const proxy = $mol_delegate({}, () => target);
1762
+ Object.setPrototypeOf(proxy, Foo.prototype);
1763
+ $mol_assert_equal(Object.getPrototypeOf(target), Foo.prototype);
1764
+ },
1765
+ 'instanceof'() {
1766
+ class Foo {
1767
+ }
1768
+ const proxy = $mol_delegate({}, () => new Foo);
1769
+ $mol_assert_ok(proxy instanceof Foo);
1770
+ $mol_assert_ok(proxy instanceof $mol_delegate);
1771
+ },
1772
+ 'autobind'() {
1773
+ class Foo {
1774
+ }
1775
+ const proxy = $mol_delegate({}, () => new Foo);
1776
+ $mol_assert_ok(proxy instanceof Foo);
1777
+ $mol_assert_ok(proxy instanceof $mol_delegate);
1778
+ },
1779
+ });
1780
+ })($ || ($ = {}));
1781
+ //mol/delegate/delegate.test.ts
1782
+ ;
1783
+ "use strict";
1784
+ //mol/type/writable/writable.test.ts
1785
+ ;
1786
+ "use strict";
1787
+ var $;
1788
+ (function ($_1) {
1789
+ $mol_test({
1790
+ 'tree parsing'() {
1791
+ $mol_assert_equal($mol_tree.fromString("foo\nbar\n").sub.length, 2);
1792
+ $mol_assert_equal($mol_tree.fromString("foo\nbar\n").sub[1].type, "bar");
1793
+ $mol_assert_equal($mol_tree.fromString("foo\n\n\n").sub.length, 1);
1794
+ $mol_assert_equal($mol_tree.fromString("=foo\n\\bar\n").sub.length, 2);
1795
+ $mol_assert_equal($mol_tree.fromString("=foo\n\\bar\n").sub[1].data, "bar");
1796
+ $mol_assert_equal($mol_tree.fromString("foo bar \\pol").sub[0].sub[0].sub[0].data, "pol");
1797
+ $mol_assert_equal($mol_tree.fromString("foo bar\n\t\\pol\n\t\\men").sub[0].sub[0].sub[1].data, "men");
1798
+ $mol_assert_equal($mol_tree.fromString('foo bar \\text\n').toString(), 'foo bar \\text\n');
1799
+ },
1800
+ 'inserting'() {
1801
+ $mol_assert_equal($mol_tree.fromString('a b c d').insert(new $mol_tree, 'a', 'b', 'c').toString(), 'a b \\\n');
1802
+ $mol_assert_equal($mol_tree.fromString('a b').insert(new $mol_tree, 'a', 'b', 'c', 'd').toString(), 'a b c \\\n');
1803
+ $mol_assert_equal($mol_tree.fromString('a b c d').insert(new $mol_tree, 0, 0, 0).toString(), 'a b \\\n');
1804
+ $mol_assert_equal($mol_tree.fromString('a b').insert(new $mol_tree, 0, 0, 0, 0).toString(), 'a b \\\n\t\\\n');
1805
+ $mol_assert_equal($mol_tree.fromString('a b c d').insert(new $mol_tree, null, null, null).toString(), 'a b \\\n');
1806
+ $mol_assert_equal($mol_tree.fromString('a b').insert(new $mol_tree, null, null, null, null).toString(), 'a b \\\n\t\\\n');
1807
+ },
1808
+ 'fromJSON'() {
1809
+ $mol_assert_equal($mol_tree.fromJSON([]).toString(), '/\n');
1810
+ $mol_assert_equal($mol_tree.fromJSON([false, true]).toString(), '/\n\tfalse\n\ttrue\n');
1811
+ $mol_assert_equal($mol_tree.fromJSON([0, 1, 2.3]).toString(), '/\n\t0\n\t1\n\t2.3\n');
1812
+ $mol_assert_equal($mol_tree.fromJSON(['', 'foo', 'bar\nbaz']).toString(), '/\n\t\\\n\t\\foo\n\t\\\n\t\t\\bar\n\t\t\\baz\n');
1813
+ $mol_assert_equal($mol_tree.fromJSON({ 'foo': false, 'bar\nbaz': 'lol' }).toString(), '*\n\tfoo false\n\t\\\n\t\t\\bar\n\t\t\\baz\n\t\t\\lol\n');
1814
+ },
1815
+ 'toJSON'() {
1816
+ $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n').sub[0]), '[]');
1817
+ $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n\tfalse\n\ttrue\n').sub[0]), '[false,true]');
1818
+ $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n\t0\n\t1\n\t2.3\n').sub[0]), '[0,1,2.3]');
1819
+ $mol_assert_equal(JSON.stringify($mol_tree.fromString('/\n\t\\\n\t\\foo\n\t\\\n\t\t\\bar\n\t\t\\baz\n').sub[0]), '["","foo","bar\\nbaz"]');
1820
+ $mol_assert_equal(JSON.stringify($mol_tree.fromString('*\n\tfoo false\n\t\\\n\t\t\\bar\n\t\t\\baz\n\t\t\\lol\n').sub[0]), '{"foo":false,"bar\\nbaz":"lol"}');
1821
+ },
1822
+ 'hack'() {
1823
+ const res = $mol_tree.fromString(`foo bar xxx`).hack({
1824
+ '': (tree, context) => [tree.hack(context)],
1825
+ 'bar': (tree, context) => [tree.hack(context).clone({ type: '777' })],
1826
+ });
1827
+ $mol_assert_equal(res.toString(), new $mol_tree({ type: 'foo 777 xxx' }).toString());
1828
+ },
1829
+ 'errors handling'($) {
1830
+ const errors = [];
1831
+ class Tree extends $mol_tree {
1832
+ static $ = $.$mol_ambient({
1833
+ $mol_fail: error => errors.push(error.message)
1834
+ });
1835
+ }
1836
+ Tree.fromString(`
1837
+ \t \tfoo
1838
+ bar \\data
1839
+ `, 'test');
1840
+ $mol_assert_like(errors, ['Syntax error at test:2\n \tfoo']);
1841
+ },
1842
+ });
1843
+ })($ || ($ = {}));
1844
+ //mol/tree/tree.test.ts
1842
1845
  ;
1843
1846
  "use strict";
1844
1847
  var $;
@@ -1953,38 +1956,6 @@ var $;
1953
1956
  ;
1954
1957
  "use strict";
1955
1958
  var $;
1956
- (function ($) {
1957
- $mol_test({
1958
- async 'sizes'() {
1959
- const pair = await $$.$mol_crypto_auditor_pair();
1960
- const key_public = await pair.public.serial();
1961
- $mol_assert_equal(key_public.byteLength, $mol_crypto_auditor_public.size);
1962
- const key_private = await pair.private.serial();
1963
- $mol_assert_ok(key_private.byteLength < $mol_crypto_auditor_private.size);
1964
- const data = new Uint8Array([1, 2, 3]);
1965
- const sign = await pair.private.sign(data);
1966
- $mol_assert_equal(sign.byteLength, $mol_crypto_auditor_sign_size);
1967
- },
1968
- async 'verify self signed with auto generated key'() {
1969
- const auditor = await $$.$mol_crypto_auditor_pair();
1970
- const data = new Uint8Array([1, 2, 3]);
1971
- const sign = await auditor.private.sign(data);
1972
- $mol_assert_ok(await auditor.public.verify(data, sign));
1973
- },
1974
- async 'verify signed with exported auto generated key'() {
1975
- const pair = await $$.$mol_crypto_auditor_pair();
1976
- const data = new Uint8Array([1, 2, 3]);
1977
- const Alice = await $mol_crypto_auditor_private.from(await pair.private.serial());
1978
- const sign = await Alice.sign(data);
1979
- const Bob = await $mol_crypto_auditor_public.from(await pair.public.serial());
1980
- $mol_assert_ok(await Bob.verify(data, sign));
1981
- },
1982
- });
1983
- })($ || ($ = {}));
1984
- //mol/crypto/auditor/auditor.test.ts
1985
- ;
1986
- "use strict";
1987
- var $;
1988
1959
  (function ($) {
1989
1960
  $mol_test({
1990
1961
  'empty hash'() {