-
-
Notifications
You must be signed in to change notification settings - Fork 449
/
changes.txt
executable file
·2642 lines (2350 loc) · 143 KB
/
changes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
======= 3.4.13
- fixed wrong counting of week number in the `Date.format()`
======= 3.4.12
- (critical) fixed WebSocket implementation for Safari +15
- (critical) fixed extracting packages/bundles
======= 3.4.11
- fixed calling `F.snapshotstats()` #785
- improved RegExp for validating URL addresses by [yetingli](https://github.com/yetingli)
======= 3.4.10
- fixed CSS variables
======= 3.4.9
- added HTML escaping for meta tags
- added `insecure` flag into the `U.request()` method
- added `RESTBuilder.insecure()` method
- fixed security issue when parsing query arguments (reported by <https://github.com/fl4x>)
- fixed security in `U.get()` and `U.set()` (reported by Agustin Gianni)
======= 3.4.8
- fixed measuring dimension for `.gif` images
- fixed potential remote code execution in `U.set()` founded by [Snyk](https://snyk.io/vuln)
======= 3.4.7
- fixed: command injection in `Image.pipe()` and `Image.stream()`
- fixed `DELETE` method for the schemas (now it works like `PATCH` method)
- fixed: `controller.transfer()`
======= 3.4.6
- added: a support for Total.js v4 UIDs
- updated: file stats
- updated: calculating of `usage`
- fixed: applying of `default_root` in static files
- fixed: routing evaluation
- fixed: parsing of longer WebSocket messages
- fixed: mail error handling
- fixed: `versions` with `default_root`
======= 3.4.5
- fixed: a problem with persistent images
======= 3.4.4
- added: schema options `$.successful(function(response) {})`
- added: `options.reconnectserver {Boolean}` to `WEBSOCKETCLIENT`
- added: `req.snapshot(callback(err, request_body))`
- added: a new command `CMD('reload_preferences')`
- added: a new FILESTORAGE mechanism based on `UID`
- added: `sql` extension to `U.getContentType()`
- added: `F.stats.performance.usage` which contains percentual usage of the thread
- updated: `SchemaOptions` method `$.response([index/operation_name])`, e.g. `$.response('workflow.NAME')`
- updated: snapshot `startscript.js.json` contains tabs instead of spaces
- updated: `DatabaseBuilder.rule(rule, [param])`, supports string declaration of filter function
- updated: `URL` validation
- fixed: cleaning of NoSQL embedded databases
- fixed: `String.parseCSV()`, now supports multiline strings
- fixed: a bug when closing of websocket
- fixed: `DatabaseBuilder.search()` method
- fixed: `Error` in `CLONE()` method
- fixed: `schema.inherit()` by adding `schema.middleware()` and `schema.verify()`
- fixed: parsing messages in WebSocket
- fixed: a problem in some commands pre-render in the view compiler
- fixed: parsing of query strings
======= 3.4.3
- added: `HASH(value, [type])` for creating hash like in jComponent
- added: `SchemaOptions.repo` as alias to `SchemaInstance.model.$$repository`
- added: a new type `CONVERT syntax` to `schema.define()` (more in docs)
- added: `SchemaEntity.verify(name, function($), [cache])` for async verification of values
- added: `TEMP` variable as a new global variable (it's cleaned every 7 minutes)
- added: `CONF.allow_persistent_images: true` which allows to reuse resized images in temp directory
- added: `req.filecache(callback)` as alias for `F.exists()`
- added: own QueryParser
- added: `RESTBuilderInstance.convert('name:String,age:Number')` method
- added: `RESTBuilder.upgrade(fn(restbuilder))` for upgrading of `RESTBuilder`
- added: `RESTBuilder` parses Total.js Errors in responses as Error
- added: `String.prototype.env()` replaces all values in the form `[key]` for `CONF.key`
- added: WebSocket supports a new type - raw `buffer`
- added: `Number.fixed(decimals)`
- updated: `websocket.send2(message, comparer, replacer, [params])` by adding `params` argument for comparer function
- updated: `Websocket.encodedecode` can enable/disable easily encoding of messages
- updated: bundling skips all bundles with `-bk.bundle` in filename
- updated: bundle filenames are displayed in console
- updated: `UPDATE()` method by adding `noarchive` argument
- updated: `TEST()` method supports `[subdomain]` keyword and `METHOD url` in URL address
- updated: `MODIFY([filename], fn)` by adding `filename` argument
- updated: background of schedulers by @fgnm
- updated: `U.download()` by adding `param` argument
- updated: `U.request()` by adding `param` argument
- updated: `schema.cl(name, [value])` method by adding `value` argument for replacing of existing code-list
- updated: Tangular version to `v4.0.0`
- improved: `filename` in modificators (now filenames contain relative paths)
- improved: performance of `U.request()` (around +10%)
- improved: performance of `U.download()` (around +10%)
- improved: performance of `RESTBuilder`
- improved: CSS minifier by compressing single hex color from e.g. `#000000` to `#000`
- fixed: localization in `totaljs` executable script
- fixed: phone validation
- fixed: `DOWNLOAD()`
- fixed: `Number.VAT()` by Tomas Novak
- fixed: debugging mode in Node.js v14
- fixed: `allow_compile_html` in static files
- fixed: `ROUTE()` method, there was a problem with spaces `GET /* `
- fixed: `ACTION()` with json output
- fixed: controller in `$ACTION()` with used `get` and `query` actions
- fixed: `PATCH` method in `$ACTION()`
- fixed: `schema.allow()` in `PATCH` method
- fixed: image resizing in debug-mode
======= 3.4.1
- added: `SchemaOptions.parent` returns a parent model
- added: Tangular template engine (experimental)
- added: `String.makeid()` for creating of unique identifier from string
- added: a new property called `message.ua` to `FLOWSTREAM()`
- updated: `HttpFile.fs()` by adding `id` argument for updating of existing file
- updated: default value for `allow_ssc_validation` to `true`
- fixed: `String.parseDate(format)` with defined format
- fixed: inheriting of controllers between schemas
- fixed: `MailMessage.attachments()`
- fixed: calling of `F.snapshotstats` in cache recycle
- fixed: `controller.success()`
- fixed: removing of unused files when a bundle is extracting
- fixed: a processor function in `F.backup()`
- improved: `Date.format()`
- improved: Total.js translate (supports ErrorBuilder and DBMS)
======= 3.4.0
- added: `date.setTimeZone(timezone)`
- added: `NOSQL('~absolute_path.nosql')' loads external NoSQL embedded database
- added: `TABLE('~absolute_path.nosql')' loads external Table
- added: `(generate)` subtype into the `config` files
- added: `String.isBase64()`
- added: new schema type `Base64`
- added: SchemaEntity supports `schema.addWorkflowExtension(name, fn($, [data]))`
- added: SchemaEntity supports `schema.addTransformExtension(name, fn($, [data]))`
- added: SchemaEntity supports `schema.addOperationExtension(name, fn($, [data]))`
- added: SchemaEntity supports `schema.addHookExtension(name, fn($, [data]))`
- added: SchemaEntity supports `schema.setSaveExtension(fn($, [data]))`
- added: SchemaEntity supports `schema.setReadExtension(fn($, [data]))`
- added: SchemaEntity supports `schema.setQueryExtension(fn($, [data]))`
- added: SchemaEntity supports `schema.setRemoveExtension(fn($, [data]))`
- added: SchemaEntity supports `schema.setInsertExtension(fn($, [data]))`
- added: SchemaEntity supports `schema.setUpdateExtension(fn($, [data]))`
- added: SchemaEntity supports `schema.setPatchExtension(fn($, [data]))`
- added: SchemaOptions supports `$.extend([data])` for evaluating of all extensions for the current operation
- added: `WebSocket.keys` property (it contains all keys with connections)
- added: `threads` directory for server-less functionality
- added: a global variable called `THREAD` with a name of current thread
- added: `require('total.js').http(..., { thread: 'thread_name' })` evaluates only specified thread
- added: `require('total.js').cluster.http(..., { thread: 'thread_name' })` evaluates only specified thread in cluster
- added: framework creates a file with app stats in the form `your_init_script_name.js.json`
- added: a new config key `allow_stats_snapshot`
- added: view engine `@{import()}` supports auto-merging JS or CSS files: `@{import('default.js + ui.js')}`
- added: `exports.options` delegate to component in `FLOWSTREAM`
- added: `DatabaseBuilder.autofill()` from DBMS
- added: `HttpFile.extension` property
- added: `HttpFile.size` property alias to `HttpFile.length`
- added: auto-session cleaner of unused sessions
- added: `allow_sessions_unused` config key for cleaning of unused sessions
- added: missing `PATH.schemas`, `PATH.operations` and `PATH.tasks`
- added: a new method `PATH.updates`
- added: easy updating of applications via `UPDATE(versions, [callback], [pause_server_message])`
- added: NOSQL counter `.reset([type], [id], [date], [callback])` method-
- added: `session.listlive(callback)` returns all live items in session
- added: `controller.ua` returns parsed User-Agent
- added: `$.ua` returns parsed User-Agent in Schemas, Operations, TaskBuilder, `MIDDLEWARE()` and `AUTH()`
- added: support for `.mjs` extensions
- added: a simple support for DDOS protection `allow_reqlimit : Number` (max. concurent requests by IP just-in-time)
- added: unit-testing supports colors, added by @dacrhu
- added: `String.encryptUID()` as alias for `U.encryptUID()`
- added: `String.decryptUID()` as alias for `U.decryptUID()`
- updated: `WEBSOCKET()` supports `+`, `-` and `🔒` as authorization flags
- updated: `LOAD()` supports `service` type
- updated: cluster watches `restart` or `restart_NAME_of_THREAD` files for restarting of existing threads
- updated: cluster supports `auto` mode
- updated: cluster supports watcher in `debug` mode
- updated: `*.filefs()`, `*.filenosql()`, `*.imagefs()`, `*.imagenosql()` by adding `checkmeta` argument
- updated: `$.done([user_instance])` method in `AUTH()`, added a new argument called `user_instance` (optional)
- updated: GZIP is enabled only for JSON bodies which have more than 4096 bytes
- updated: `.env` parser supports parsing of `.env-debug` or `.env-release` files according to the mode
- updated: list of user-agents in `String.parseUA()`
- fixed: `ON('error404')` when the route doens't exist
- fixed: `filter` in Schema `workflows`, `transformations` and `operations`
- fixed: `NOSQL()` joins with absolute paths
- fixed: `TABLE()` joins with absolute paths
- fixed: `(random)` subtype in `config` files
- fixed: `(response)` phrase in `ROUTE()` for multiple `OPERATIONS`
- fixed: a response in `ROUTE()` with mulitple operations if the result contained some error
- fixed: a security bug with a path traversal vulnerability
- fixed: `debug` watcher for `themes`
- fixed: `generators` in schemas with a new declaration
- fixed: a problem with handling files in 404 action
- fixed: `startup` directory in bundles
- fixed: `schema.inherit()` didn't copy `required` fields.
- fixed: `SUCCESS()` serialization with `SUCCESS()` argument
- fixed: a critial bug with `UID()` generator
- fixed: clearing of DNS cache
- improved: `LOGMAIL()` mail format
- improved: starting logs in console output (added IPv4 local address)
- improved: performance with JSON serialization in `controller.success()` and `controller.done()`
======= 3.3.2
- fixed: default time zone (`utc` is default time zone)
======= 3.3.1
- added: `RESTBuilder.callback()` which performs `.exec()` automatically
- added: `FLOWSTREAM()`
- fixed: `AUDIT()` method
- fixed: error handling in `controller.invalid()`
- fixed: `req.authorize()`
- fixed: CSS auto-vendor-prefixes, fixed `opacity` with `!important`
- fixed: `CONVERT()` a problem with arrays
======= 3.3.0
- added: `NEWTASK(name, declaration)` for creating preddefined `TaskBuilder`
- added: `TASK(name, taskname, callback, [controller/SchemaOptions/OperationOptions/ErrorBuilder])` for executing preddefined `TaskBuilder`
- added: a new config key `directory_tasks` for `TaskBuilder`
- added: a global alias `MODIFY()` for `F.modify()`
- added: a global alias `VIEWCOMPILE()` for `F.view_compile()`
- added: `mail.type = 'html'` can be `html` (default) or `plain`
- added: `$.headers` into the `SchemaOptions`, `OperationOptions` and `TaskBuilder`
- added: `String.parseCSV([delimiter])` returns `Object Array`
- added: `String.parseUA([structured])` a simple user-agent parser
- added: `req.useragent([structured])` returns parsed User-Agent
- added: a new config key `default_crypto` it can rewrite Total.js crypto mechanism (default: `undefined`)
- added: a new config key `default_crypto_iv` it's an initialization vector (default: generated from `secret`) or it can contain a custom `hex` value
- added: a new config key `allow_workers_silent` can enable/disable silent workers (default: `false`)
- added: a new config sub-type called `random`, example: `secret_key (random) : 10` and `10` means a length of value
- added: a new command `clear_dnscache` for clearing DNS cache
- added: commands `INSTALL('command', 'command_name', function)` for registering commands and `CMD(name, [a], [b], [c], [d])` for executing commands
- added: `ENCRYPTREQ(req, val, [key], [strict])` to encrypt value according to the request meta data
- added: `DECRYPTREQ(req, val, [key])` to decrypt value according to the request meta data
- added: `controller.nocache()`
- added: `controller.nocontent()`
- added: `REPO` as a global variable
- added: `FUNC` as a global variable
- added: `MAIN` as a global variable
- added: `DEF` as a global variable for defining of behaviour for some operations (alternative to `F`)
- added: `PREF.set(name, [value])` (read+write) or `PREF.propname` (only read) for reading/writing a persistent preferences
- added: `F.onPrefSave = function(obj)` to write preferences
- added: `F.onPrefLoad = function(next(obj))` to read preferences
- added: `RESTBuilder.url(url)` which returns a new instance of `RESTBuilder` for chaining
- added: `restbuilder.keepalive()` enables a keepalive for `RESTBuilder` instance
- added: `SESSION()` management, more in docs
- added: `controller.sessionid` with ID of `SESSION()`
- added: `AUTH()` supports a new auth declaration with `$` as `AuthOptions` like `SchemaOptions` or `OperationOptions`
- added: `AuthOptions` to prototypes
- added: `ErrorBuilder.length` property (alias for `instance.items.length)
- added: Schemas `prepare` supports `req` argument
- added: `DEF.currencies.eur = function(val) {}` registers a currency formatter
- added: `DEF.helpers` registers a new view engine helper (`F.helpers` is alias for for this object)
- added: `DEF.validators` is alias for for `F.validators`
- added: usage of currency formatter `Number.currency(currency)`
- added: new schema type `Number2` with default value is `null`, not zero `0`
- added: `@{json2(model, elementID, key1, key2, key3)}` can serialize data with keys defined into the `<script type="application/json">`
- added: schemas supports `PATCH` and `.setPatch()`, only specified field are processed
- added: `SchemaOptions` supports `$.keys` for `PATCH` method
- added: `schema.cl(name)` ("cl" means codelist) returns `{Array}` a list of values from defined enum/keyvalue
- added: `schema.props()` returns `{Object}` meta info about all defined properties
- added: `SchemaOptions`, `OperationOptions` and `TaskOptions` supports `$.req` and `$.res` properties
- added: `AUDIT(name, $, [type], message)` a method for audit logs
- added: __obsolete__ message to older declaration of middleware, schemas and operations
- added: `U.diffarr(prop, arr_A, arr_B)` for comparing of two arrays
- added: `DIFFARR(prop, arr_A, arr_B)` is a global alias for `U.diffarr()`
- added: `global.REQUIRE()` for local modules within app directory
- added: `global.isWORKER` variable which contains `true` (when the process is executed as a worker) or `false`
- added: `ACTION(url, [data], callback)` can evaluate a route without request creation
- added: `ROUTE('🔒 METHOD URL')`, it means that 🔒 adds `authorized` flag
- added: `ROUTE('+METHOD URL')`, it means that `++` or `+` adds `authorized` flag
- added: `ROUTE('-METHOD URL')`, it means that `--` or `-` adds `authorized` flag
- added: `SchemaOptions`, `OperationOptions`, `TaskOptions` supports filtered query arguments via `$.filter`
- added: `controller.done([value])`
- added: `SITEMAP()` as alias to `F.sitemap()`
- added: config key `allow_localize` enables a localization for all `HTML` files
- added: `controller.breadcrumb` returns all sitemap items
- added: `PAUSESERVER(name, pause)` pauses web server (alias for `F.wait()`)
- added: `PROXY(endpoint, hostname, [copypath], [before_fn(uri,req,res)], [after_fn(res)])` makes a direct proxy from webserver
- added: `schema.middleware(function($, next))` for creating simple middlewares for Schema operations
- added: `FILE404(fn(req, res))` performs a simple fallback for non-existing files
- added: `$PATCH(schema, model, [options], callback, [controller])` method
- added: `.env` parser to `process.env`
- added: `String.parseENV()` for parsing `.env` syntax
- added: `$.noop()` for custom responses
- added: `$ACTION(schemaroute, [model], callback, [controller])` evaluates schema
- added: `process.send('total:restart')` performs a restart of app when the app is in debug mode
- added: `NOSQLREADER(filename)` for reading different files of NoSQL embedded databases
- added: `TABLEREADER(filename)` for reading different files of Table embedded databases
- added: `Mail.use()` an alias for `F.useSMTP()`
- added: `F.onAudit(name, data)` delegate for handling audit logs
- added: Components support a new features called `Parts`, more in docs
- updated: `$.invalid()` without arguments can return a function `function(err)`
- updated: Mail `unsubscribe` appends new header which enables `unsubscribe` in e.g. iOS
- updated: `MODIFY`, handler contains a new argument `controller`
- updated: `headers` argument in `controller.proxy` supports `flags: []` for REQEUST method
- updated: `.filefs()` and `.filenosql()` supports `download` with `true` or with `(name, type) => 'new_name'` (`filename` will be read from NoSQL binary file)
- updated: `$.done(arg)` argument `@arg` can be `boolean` (response will be as a value) or object/primitive value (`arg` will be as a value)
- updated: `String.arg(obj, [encode], [def])` added `encode` (`true`, `json`, `html`) and `def` arguments
- updated: `AUTH(req, res, flags, next)` and `next` function can handle `callback(err, user)`
- updated: `REQUEST()` supports `keepalive` flag
- updated: `bundles` mechanism supports merging files `--filename` between `bundles` files
- updated: `String.hash(true)` returns unsigned int
- updated: `CONF:default_image_converter` supports `magick` for new version of ImageMagick
- updated: `CONF.default_image_consumption` can contain ZERO value which means disabled optimialization of CPU/memory consumption
- updated: `CONF.default_image_consumption` has changed a default value to `0`
- updated: `U.parseXML(str, [replace])` and `String.parseXML([replace])` contains a new argument called `replace`
- updated: `LOAD()` added a callback function
- updated: components support `encoding="utf8"` attribute for `<file` tag (default: `base64`)
- updated: `EventEmitter2` supports a new argument `obj`, example: `U.EventEmitter2(obj)` or supports `.extend` method: `U.EventEmitter2.extend(proto)`
- updated: `UID()` generates new types of `UID` with 100% backward compatibility
- updated: `FILESTORAGE()` now it works in cluster mode
- fixed: schemas validation
- fixed: error handling in dynamic schemas
- fixed: CSS variables
- fixed: CSS variables with additional `!important` clause
- fixed: `controller.proxy()` with Gzip/Deflate compression
- fixed: HTTP status code with `204` in `REQUEST()`
- fixed: `cookies` in `WEBSOCKETCLIENT`
- fixed: `REQUEST()` with `json` flag and with `null` and `''` value
- fixed: rendering components in `layout`
- fixed: resources, there was a bug with reading of value from `default.resource`
- fixed: too many open files in `res.image()`
- fixed: too many open files in `res.filefs()`
- fixed: Schema `Boolean` parser
- fixed: renamed `F.stats.request.path` to `F.stats.request.patch`
- fixed: SMTP sender (a problem with auth mechanism with some mail servers)
- fixed: filter in `F.backup()`
- fixed: paths for stored directories in `F.backup()`
- fixed: uploading files
- fixed: `U.getExtension()` by @molda
- renamed: `*.routeScript` to `*.public_js`
- renamed: `*.routeStyle` to `*.public_css`
- renamed: `*.routeFont` to `*.public_font`
- renamed: `*.routeVideo` to `*.public_video`
- renamed: `*.routeImage` to `*.public_image`
- renamed: `*.routeDownload` to `*.public_download`
- renamed: `*.routeStatic` to `*.public`
- renamed: `controller.viewCompile()` to `controller.view_compile()`
- renamed: event `cache-set` to `cache_set`:
- renamed: event `controller-render-meta` to `controller_render_meta`
- renamed: event `request-end` to `request_end`
- renamed: event `websocket-begin` to `websocket_begin`
- renamed: event `websocket-end` to `websocket_end`
- renamed: event `request-begin` to `request_begin`
- renamed: event `upload-begin` to `upload_begin`
- renamed: event `upload-end` to `upload_end`
- renamed: event `cache-expire` to `cache_expired`
- __removed: backward compatibility__ with older version of Node.js < 10
- removed: `F.hash()`, alternative `String.prototype.hash()`
- removed: `controller.hash()`, alternative `String.prototype.hash()`
- improved Schemas and error handling
- improved `res.filefs()` method for nonexistent files
======= 3.2.0
- added: `WORKER()` alias to `F.worker()`
- added: `WORKER2()` alias to `F.worker2()`
- added: `F.cluster.https()`
- added: `TaskBuilder.done2([send_value])` returns `function` with wrapped `.done()`
- added: `TaskBuilder.success2([send_value])` returns `function` with wrapped `.success()`
- added: `TaskBuilder.next2(name)` returns `function` with wrapped `.next()`
- added: new `RESTBuilder` aliases `.DELETE()`, `.PUT()`, `.POST()`, `.PATCH() and `.GET()`
- added: `schema.before(key, (value, model, index) => value)` is a simple and new alternative to `schema.setPrepare()`
- added: `SchemaInstance.$parent` returns a parent schema (if the schema is nested schema)
- added: `SchemaOptions.redirect(url)` can perform a redirect from the schema
- added: `OperationOptions.redirect(url)` can perform a redirect from the operation
- added: `.ics` extension as acceptable file for the web server
- updated: `F.worker2()` returns entire `stdout` buffer in the `callback(err, buffer)`
- updated: `$options()` by adding `disabled` key
- updated: `String.ROOT()` by adding a support for jComponent `AJAX()` calls
- updated: `RESTBuilder.method(method, [data])` added `data` argument
- updated: `String.parseDate([format])` added `format` argument
- updated: SMTP settings contain `heloid` as `heloidentifier` (manually can be defined `HELO` or `EHLO` command)
- updated: SMTP hostname is computed from email if SMTP is not specified
- fixed: critical bug with security + improved security
- fixed: system routing
- fixed: NoSQL sorting, solved a strange problem
- fixed: `U.request()` with `GET` method by @khaledkhalil94 (it doesn't send JSON data if `data` is null/undefined)
- fixed: `F.wait()` in WebSocket
- fixed: `String.capitalize(true)`
- fixed: `REQUEST()` uploading of additional multipart/form-data (removed encoding)
- fixed: view engine conditions defined in `<script>`
- fixed: auto-redirects in `U.download()`
- fixed: image streams resizing
- fixed: `@{'%config_key'}` a problem with rendering a value with `'`
- removed: `X-Powered-By: Total.js`
======= 3.1.0
- added: CSS variables support default values `border-radius: $radius || 10px`
- added: NoSQL storage `.find(beg, end, [threads])` + `.count(beg, end, [threads])` + '.scalar(beg, end, type, field, [threads])' with multiple thread support
- added: `U.reader()`
- added: `bundles` supports merging files between bundle and project, project file must start with e.g. `--name.js`
- added: `.bundlesignore` support with similiar functionality like `.gitignore`
- added: support for `SameSite` cookie attribute
- added: `RUN()` for executing multiple Total.js operations
- added: a new global alias `CONF` (it's a reference to config) for `F.config`
- added: a new global alias `FUNC` (it's a reference to functions) for `F.functions`
- added: `DatabaseBuilder.arg(key, value)` for adding an dynamic argument
- added: NOSQL/TABLE modify supports `!field` as boolean toggle
- added: NOSQL/TABLE modify supports a new type `$age: 'js_code'` with some JS code
- added: NOSQL/TABLE update supports a new type `'js_code'` with some JS code
- added: a new config item `default-restbuilder-timeout : 10000`
- added: a new config item `default-cors : https://www.totaljs.com, https://www.componentator.com` which allows originators for `CORS()` method
- added: a new config item `default-request-maxkeys : 33` for restricting query max. keys
- added: a new config item `logger : false` which enables logging for Middleware, Schemas and Operations
- added: a new config item `bundling : shallow` which enables shallow bundling (if `bundle.json` exists then the bundles won't be extracted)
- added: `SchemaOptions` and `OperationOptions` supports `$.cancel()` method
- added: `CACHE(name, [value], [expire], [persistent])` alias for `F.cache.get2()` and `F.cache.set()` or `F.cache.set2()`
- added: encryption of config values
- added: `F.refresh()` for refreshing of internal cache
- added: `DatabaseBuilder.each(fn)` for browsing of evaluated records
- added: Bundles can be downloaded from URL addresses
- added: `ONCE()` alias to `F.once()`
- added: `image.define(value)` performs `convert -define 'value'`
- added: Total.js JS files (+ packages) tarted with `.` (dot) or ended with `-bk` won't be processed
- added: A new builder called `TaskBuilder` for creating custom tasks in Schemas or Operations
- added: `WebSocket.send2(message, [comparer(client, message)], [replacer])` a new method for better sending frames
- addde: `PATH` as a global alias for `F.path`
- updated: `debug` mode creates a `start_name_script.pid` instead of `debug.pid`
- updated: `NEWOPERATION()` supports `repeat`, `stop` and `binderror` arguments (more in docs)
- updated: routing, now it supports operations in the form `ROUTE('.. * --> @save_operation @load_operation (response)')`
- updated: `ROUTE()` supports multiple HTTP method declaration `ROUTE('GET,POST,PUT /something/', action)`
- updated: `ROUTE()` supports dynamic schemas
- updated: `REQUEST()` can return binary data if the content-type is not `text/*` or `application/*`
- updated: NoSQL joins support array values
- updated: `ROUTING(id:|search, [flags])` method
- updated: `F.path.mkdir(path, [cache])` can cache a current satte (default: false)
- updated: `controller.all()` can return `Array` of all WebSocketClient
- updated: startup info by adding user name
- updated: `LOCALIZE()` now `url` arg can be a function which replaces `F.onLocale`
- fixed: a critical bug with storing uploaded files via `httpfile.fs()` or `httpfile.nosql()`
- fixed: a critical bug with JavaScript minificator
- fixed: a critical bug with NoSQL counter and freezing app
- fixed: a critical bug with rendering of multiple async components
- fixed: a critical bug with GZIP compression (sometimes appeared in Safari)
- fixed: `nosql.update()` and `nosql.modify()` methods if the first argument is a function
- fixed: `F.wait()` in the test mode
- fixed: `LOCALIZE()` for nested directories
- fixed: sending of error handling when WebSocketClient is starting (for example: `unauthorized`)
- fixed: `versions` and `auto` feature with enabled `F.wait()`
- fixed: `versions` and `auto` feature with direct link to file
- fixed: `LOAD('release')` a release mode
- fixed: `SchemaInstance.$clean()` for nested schemas
- fixed: extracting `bundles` (added `/flow/` and `/dashboard/`)
- fixed: subdomain routing for `localhost`
- fixed: service for database cleaner
- fixed: rendering group of components
- fixed: RESTBuilder - JSON request without param sends an empty object
- fixed: `$MAKE()` with `callback`
- fixed: `String.slug()` for UTF - Chinese/Japan/Arabic/etc. chars
- fixed: async rendering of `components`
- fixed: RESTBuilder cache works only if the response status is `200`
- fixed: compressing CSS with `\t` tabs
- fixed: `controller.autoclear()`
- fixed: `controller.proxy()`
- fixed: `repeat` mode in `SCHEDULE()`
- fixed: `--inspect` argument for Workers by Tema Smirnov
- fixed: TLS in SMTP mail sender
- fixed: applying of versions
- fixed: unit-tests reads only `javascript` files
- fixed: `controller.invalid()` a problem with ErrorBuilder as a argument
- removed: `F.config.debug`
- removed: `controller.isDebug`
- improved: NoSQL reader
- improved: `UID()` -> now it changes a random hash each minute
- improved: CORS
- improved: rendering of components
======= 3.0.0
- added: (IMPORTANT) bundles
- added: (IMPORTANT) Total.js components can have async delegate
- added: (IMPORTANT) Total.js components support nested public files encoded in base64
- added: (IMPORTANT) NoSQL worker
- added: (IMPORTANT) NoSQL embedded storage for smaller big data / IoT
- added: `debugging` supports live reloading
- added: new schema operations: `schema.setInsert()` and `schema.setUpdate()`
- added: `RESTBuilder.patch([data])`
- added: `RESTBuilder.type(new-content-type)`
- added: `CONVERT(obj, schema)` for quick converting values like Schema (more in docs.)
- added: `Capitalize2` schema type which converts only the first char
- added: `MailMessage.high()` sets `high` priority of the email messsage
- added: `MailMessage.low()` sets `low` priority of the email messsage
- added: `MailMessage.confidential()` sets `Sensitivity` header with `confidential` value
- added: `MailMessage.attachmentnosql(db, id, [name])` sends a file from NoSQL embedded database
- added: `MailMessage.attachmentfs(storage_name, id, [name])` sends a file from FileStorage
- added: `SchemaBuilderEntity.$stop()` stops the async list
- added: `SchemaOptions.stop()` alias to `$.model.$stop()`
- added: `SchemaOptions.next()` alias to `$.model.$next()`
- added: `SchemaOptions.output()` alias to `$.model.$output()`
- added: `SchemaOptions.clean()` alias to `$.model.$clean()`
- added: `SchemaOptions.response()` alias to `$.model.$response([index])`
- added: `SchemaOptions.$async(callback, [index])` alias to `$.model.$async()`
- added: `SchemaOptions.$get([options], [callback])` alias to `$.model.$get()`
- added: `SchemaOptions.$insert([options], [callback])` alias to `$.model.$insert()`
- added: `SchemaOptions.$query([options], [callback])` alias to `$.model.$query()`
- added: `SchemaOptions.$remove([options], [callback])` alias to `$.model.$remove()`
- added: `SchemaOptions.$save([options], [callback])` alias to `$.model.$save()`
- added: `SchemaOptions.$update([options], [callback])` alias to `$.model.$update()`
- added: `SchemaOptions.$workflow(name, [options], [callback])` alias to `$.model.$workflow()`
- added: `SchemaOptions.$transform(name, [options], [callback])` alias to `$.model.$transform()`
- added: `SchemaOptions.$operation(name, [options], [callback])` alias to `$.model.$operation()`
- added: `SchemaOptions.$hook(name, [options], [callback])` alias to `$.model.$hook()`
- added: `SchemaOptions.stop()` alias to `$.model.$stop()`
- added: a new route flag type `&group` something like `roles` but groups aren't evaluated
- added: `route.groups` with defined groups
- added: NoSQL `database.listing([view])` which generates a listing response
- added: `DatabaseBuilder.insert(fn(doc))` can modify a document after `update` or `modify` has `insert` mode
- added: `DatabaseBuilder.query(code)` can contain a raw JS condition in the form e.g. `doc.age > 18 && doc.age < 33`
- added: `DatabaseBuilder.regexp(name, regexp)` RegExp search in strings
- added: `DatabaseBuilder.fulltext(name, regexp, [weight])` full text search in strings, more info in docs.
- added: `DatabaseBuilder.hour(name, [compare], value)` creates a condition for hours
- added: `DatabaseBuilder.minute(name, [compare], value)` creates a condition for minutes
- added: `Database.find2()` performs faster and reverse reading of documents (from end to begin of the file)
- added: `Database.stream(fn, [repository], [callback(err, repository, count)])` for streaming documents
- added: `Database.lock(callback(next))` locks all internal DB operations
- added: `Database.ready(callback)` executes a callback when DB is ready to use (only for special cases if you use indexes)
- added: new directory `schemas` with a new configuration item `directory-schemas'
- added: new directory `operations` with a new configuration item `directory-operations'
- added: `String.crc32([unsigned])`
- added: `U.hash('crc32')` and `U.hash('crc32unsigned')`
- added: config `nosql-worker' for enabling worker for NoSQL embedded database (default: `false`)
- added: config `nosql-inmemory' can contain name of databases e.g. (`users, products`) or String Array
- added: config `nosql-cleaner` for cleaning databases from removed documents (default: `1440` === 24 hours)
- added: config `nosql-logger` (default `true`) enables simple logs when re-indexing and cleaning
- added: config `security.txt` for auto-generating security.txt content (more in docs)
- added: config `default-proxy` for default web proxy server
- added: config `allow-cache-cluster` (default `true`) allow/disallow cache synchronization
- added: `GUID()` a global alias for `U.GUID()`
- added: `VIEW()` a global alias for `F.view()`
- added: `SchemaBuilderEntity.$response([index])` returns a specific response from an operation in `async` queue
- added: `$SAVE(schema, model, [options], [callback], [controller])` performs `schema.save()`
- added: `$INSERT(schema, model, [options], [callback], [controller])` performs `schema.insert()`
- added: `$UPDATE(schema, model, [options], [callback], [controller])` performs `schema.update()`
- added: `$REMOVE(schema, [options], [callback], [controller])` performs `schema.remove()`
- added: `U.streamer2()` same functionality as `U.streamer()` but it returns `Buffer` instead of `String`
- added: `Number.round([precision])`
- added: `UID([type])` supports custom types, e.g. `UID('users')` or `UID('orders')`
- added: `REQUEST()` global method, it's alias to `U.request()`
- added: `NOW` global property, it's alias to `F.datetime`
- added: `DatabaseBuilder.promise()`
- added: `RESTBuilder.promise()`
- added: `RESTBuilder.plain()` it returns a raw string from the response body
- added: `versions` file supports `auto` value for generating auto-checksum of files
- added: `F.load()` supports `test`
- added: NoSQL binary supports `custom` small data attributes
- added: CSS and JS supports a simple View Engine markup (config + resources + F.global)
- added: `controller.split` alias to `controller.req.split`
- added: nicer error response messages
- added: `RESTBuilder.proxy(proxy)` for HTTP proxy
- added: `U.request()` supports a new flag `proxy`, for example `proxy 127.0.0.1:8080`
- added: NoSQL database a new event `change`, more in docs
- added: `schema.define()(DEFAULT_VALUE)` added `DEFAULT_VALUE`
- added: `TESTUSER([user])` for faking of `F.onAuthorize` delegate, targeted for unit-testing only
- added: `G` as a global alias for `F.global`
- added: `ERROR([name])` is an improved `F.error()` without arguments
- added: a simple support for `.heic` and `.heif` image format
- added: `controller.sitemap_url2()`
- added: `controller.sitemap_name2()`
- added: `@{sitemap_url2()}`
- added: `@{sitemap_name2()}`
- added: `F.syshash` contains a simple MD5 hash with OS info
- added: `SchemaEntity.clear()` for removing all current definition
- added: new view engine markup `@{#}` for simulating of root URL
- added: new view engine command `@{root}` for getting sub-root path
- added: `String.ROOT()` for replacing `@{#}` markup in strings
- added: `U.decryptUID(value, key)` for encrypting number/string values
- added: `U.encryptUID(value, key)` for decrypting of number/string values
- added: `F.config['secret-uid']` as a hidden secret for encrypting/decrypting values
- added: `F.dir(path)` for changing of root directory
- added: `NOSQL()/TABLE().memory(count, [size])` for memory consumption, more in docs
- added: `HttpFile.fs(storage_name, [custom], [callback])` saves a file into the FileStorage
- added: `HttpFile.nosql(db_name, [custom], [callback])` saves a file into the FileStorage
- added: `res.filefs(storage_name, id, [download], [headers], [callback])` returns file from FileStorage
- added: `res.filenosql(db_name, id, [download], [headers], [callback])` returns file from NoSQL binary
- added: `res.imagefs(storage_name, id, image_make_fn, [headers], [callback])` returns file from FileStorage
- added: `res.imagenosql(db_name, id, image_make_fn, [headers], [callback])` returns file from NoSQL binary
- added: new stats `F.stats.performance` contains count of `request` and `file` per minute
- added: new method `controller.operation(name, value, [callback], [options])` for evaluating of operation
- updated: (IMPORTANT) NoSQL binary divides files to independent directories for 1000 files per directory
- updated: `GROUP()` by adding a new argument `url_prefix`
- updated: `NEWSCHEMA()` supports `NEWSCHEMA('group/name')`
- updated: `ROUTE()`, extended syntax for schemas, for example: `Schema --> @name` (more in docs.)
- updated: `ROUTE()` supports a new HTTP method definition `ROUTE('GET /api/users/')`, `ROUTE('POST /api/users/')`, etc.
- updated: `ROUTE()` supports a schema definition directly in the URL `ROUTE('GET /api/users/ *User --> @save')`, etc.
- updated: `tpm` supports a new command called `bundle`, for example: `tpm bundle cms`
- updated: `F.restore()` filter can return a new filename (for files only)
- updated: `@{import('livereload')}` or `@{import('livereload wss://mywebsite.com')}` supports `livereload` value and it's rendered in `debug` mode only
- updated: information after the framework is started
- updated: `schema.define('name', null)` removes a schema field
- updated: Chunker supports `compression`, default `true`
- updated: Chunker supports `autoremove` processed files in `each()` or `read()` method, default `true`
- updated: `String.parseConfig(def, [onError])` can handle errors better
- updated: `middleware`, now Total.js supports new declaration `F.middleware(function($) {})`
- updated: `F.wait()` HTML template
- updated: JavaScript compressor, now optimizes multiple `var` declarations
- updated: `CORS()` without arguments for all routes, methods and origins
- updated: `CORS()` tries to join multiple same preferences to one
- updated: `CORS(path)` without additional arguments allows all HTTP methods
- updated: `U.keywords()` for Chinese/Japan characters
- updated: `@{import()}` by adding `manifest` value linked to `/manifest.json`
- updated: `F.use()` supports `function` instead of `middleware` name
- updated: improved crypto algorithm
- updated: decreased a maximum count of keys to `33` from `69` when the query string is parsing
- updated: extended `schema.required(name, (model, workflow) => workflow.update)`, more in docs.
- updated: `$MAKE(schema, model, [filter/workflows], ...)` supports `workflows` (array or object) instead of filter for `schema.required()`
- updated: `OPERATION()` by adding `controller`
- fixed: mail attachments
- fixed: mail `message.manually()`
- fixed: WebSocket comparing of `origin` header
- fixed: uninstalling CORS routes
- fixed: cache for `favicon`
- fixed: `Date.extend()`
- fixed: `String.isJSON()` validator
- fixed: `String.parseDate()` now it parses date to UTC correctly
- fixed: `Date.format()` now it formats a date as UTC correctly
- fixed: HTML compressor with `\r\n` (Windows line endings)
- fixed: schema validation
- fixed: `U.atob()`
- fixed: `U.btoa()`
- fixed: schema field can be changed dynamically
- fixed: `String.arg()`
- fixed: `controller.href()` with Array values
- fixed: `U.get()` a problem with path with `-`
- fixed: `U.set()` a problem with path with `-`
- fixed: `F.path.mkdir()` in Windows and Linux
- replaced: config `disable-clear-temporary-directory` to `allow-clear-temp : true|false`
- replaced: config `disable-strict-server-certificate-validation` to `allow-ssc-validation : true|false`
- replaced: config `default-websocket-request-length` to `default-websocket-maxlength`
- replaced: config `default-request-length` to `default-request-maxlength`
- replaced: config `default-maximum-file-descriptors` to `default-maxopenfiles`
- replaced: `controller.proxy()` functionality (the name remains) via `controller.proxy2()` functionality
- removed: `F.responseFile()`
- removed: `F.responsePipe()`
- removed: `F.responseImage()`
- removed: `F.responseImageWithoutCache()`
- removed: `F.responseStream()`
- removed: `F.responseBinary()`
- removed: `F.responseContent()`
- removed: `F.responseRedirect()`
- removed: `F.response400()`
- removed: `F.response401()`
- removed: `F.response404()`
- removed: `F.response408()`
- removed: `F.response431()`
- removed: `F.response500()`
- removed: `F.response501()`
- removed: `F.responseStatic()`
- removed: `F.setModified()`
- removed: `F.notModified()`
- removed: `F.responseCode()`
- removed: `F.noCache()`
- removed: `controller.$modified()`
- removed: `controller.$etag()`
- improved: `debug` mode timing with improved consumption
- improved: performance (+20%) NoSQL embedded database
- improved: reading performance (+5%) in `U.streamer()`
- improved: CSS compressor
- improved: CORS processing
- improved: internal encryption/decryption mechanism
======= 2.9.4 (HOTFIX)
- fixed: mail attachments
- fixed: comparing `origin` header in WebSocket
- fixed: unit-testing
======= 2.9.3 (HOTFIX)
- added: `String.arg(obj)` for a simple templating `Hello {variable}!`
- added: new event `ON('@controllername', function() {})` -> is executed if the controller is evaluated
- updated: RESTBuilder default headers are lower-case
- updated: `content-disposition` header by adding `utf-8` according to [RFC 5987](https://tools.ietf.org/html/rfc5987#section-3.2.2)
- fixed: a missing property `controller.params` in WebSocket controller
- fixed: `$ASYNC()` execution in some cases
- fixed: `SCRIPT()` code with comments
- fixed: a callback reference in `OPERATION()`
- fixed: cache after route is removed
- fixed: `409` system route
- fixed: requests with `range` header and bad values
- fixed: `clearSchedule()`
- fixed: `Date.extend()` problem with months
- fixed: NoSQL counter reading stats
======= 2.9.2
- added: `controller.html(body, [headers])`
- added: `F.cluster.master(name, [data])` - for child processes, this method emits an event in master process
- added: `F.cluster.on(name, callback(data))` - master event listener
- added: `LOGMAIL()` global alias for `F.logmail()`
- added: `MAIL()` global alias for `F.mail()`
- added: own implementation of `onFinished`
- added: `RESTBuilder.cookies(obj)` can set cookies as raw object
- added: `RESTBuilder.cook([true/false])` enables persistent cookies
- added: `SchemaOptions.params` which returns dynamic params from the controller's action
- added: `SchemaOptions.done([arg])` as a callback (contains wrapped SUCCESS())
- added: `SchemaOptions.DB()` which returns `DB(this.error)` instance (for SQL Agent)
- added: `OperationOptions.done([arg])` as a callback (contains wrapped SUCCESS())
- added: `OperationOptions.DB()` which returns `DB(this.error)` instance (for SQL Agent)
- added: static method `Image.measure(type, buffer)` for measuring width/height of image
- added: `EACHOPERATION(function(name) {})` for obtaining all registered operations
- added: `controller.params` which returns dynamic params from the action
- updated: `F.load()`, now supports `string` for `debug` or `release` mode
- updated: `F.cluster.request()` can be executed from master process
- updated: `Image.miniature()` change a default filter from `Box` to `Hamming`
- updated: `U.request()` supports a new flag `cookies` which enables a parsing cookies from response
- fixed: schema validation (problem with Arrays)
- fixed: determines `x-forwarded-proto`
- fixed: nested schema validation
- fixed: themes static routing
- fixed: NoSQL reader
- fixed: NoSQL counter (sorting while reading stats)
- fixed: loading dependencies
- fixed: uninstalling middleware
- fixed: reading/updating sitemap in controller
- removed: max. sort `string` length
- removed: `auto` appending `.css` and `.js` extension in view engine
- removed: experimental `defer` feature
- improved: GZIP compression
- improved: code
======= 2.9.1 (HOTFIX)
- added: `controller.throw409()`, `req.throw409()`
- added: new view aliases: `@{R.something}` for `repository`, `@{M.something}` for `model` and `@{G.something}` for `global`
- updated: `ErrorBuilder.push()` supports `.push(name, status_code)` or `.push(name, error, status_code)`
- fixed: sitemap language auto-setting
- fixed: NoSQL: `builder.paginate()` a problem with zero limit (default limit will be `maxlimit`)
- fixed: NoSQL number filtering
- fixed: localization of ErrorBuilder in controllers
======= 2.9.0
- added: `WebSocketClient`
- added: `$ASYNC(schema, callback, [index], [controlller])` alias to `SchemaBuilderEntity.$async()`
- added: `ArrayBuffer.prototype.toBuffer()`
- added: `AUTH(fn)` is an alias to `F.onAuthorize = fn`
- added: `controller.success()` alias to `controller.json(SUCCESS(value))`
- added: `CORS()` alias to `F.cors()`
- added: `DatabaseBuilder.paginate(page, limit)`
- added: `F.config['allow-compile']` can disable the whole compilation of static files
- added: `F.config['default-dependency-timeout']` it's a timeout for module dependencies
- added: `F.path.rmdir(directory/directories, callback)`
- added: `F.path.unlink(file/files, callback)`
- added: `LOCALIZE()` a new global alias to `F.localize()`
- added: `MAP()` a new global alias to `F.map()`
- added: `MERGE()` a new global alias to `F.merge()`
- added: `MIDDLEWARE()` a new global alias to `F.middleware()`
- added: `NOSQL('users').backups([filter(doc)], callback(err, response))` returns all backups
- added: `SchemaOptions.invalid(name, [value], [path], [index])` alias to `$.errors.push() + callback()`
- added: `SchemaOptions.success()` alias to `callback(SUCCESS(value))`
- added: `controller.sitemapid` contains a sitemap identifier
- added: `controller.sitemap_add(parent, name, url)` appends a new item into the sitemap per request
- added: `@{sitemap_add(parent, name, url)}` appends a new item into the sitemap per request
- added: `SchemaEntity.required('fieldname', boolean/function(model))` which can disable/enable validation for this field
- updated: `sitemap` routing can contain an additional path, e.g. `#sitemapid/path/`
- updated: `F.localize()` supports sitemap routing
- updated: `F.merge()` supports sitemap routing
- updated: `F.map()` supports sitemap routing
- updated: `F.http(mode, [options], [middleware(listen)])` added a new argument `middleware`
- updated: `debug.js` now reads directories according to the config (author: @luoage)
- updated: config parser supports `config` sub-type
- updated: `controller.$exec()` --> `callback` is by default `controller.callback()`
- updated: `F.localize()` has enabled `compression` by default
- updated: HTTP server is listening after the framework is completely loaded
- updated: (IMPORTANT) HTTP cache in dynamic content and static files
- updated: `F.prototypes()` by adding `OperationOptions`
- updated: ErrorHandling in schemas (supports inline validation and advanced conditions)
- updated: `F.noCache()` is obsolete
- renamed: `allow-handle-static-files` to `allow-static-files`
- fixed: (IMPORTANT) `DatabaseBuilder.in()`
- fixed: (IMPORTANT) `U.ls2()`
- fixed: (IMPORTANT) `WebSocket` implementation (author: @jozefgula)
- fixed: `ArrayBuffer` in webosocket
- fixed: `F.path.mkdir()` on Windows (author: @molda)
- fixed: `F.restore()` on Windows (author: @molda)
- fixed: `F.rmdir` removes all files and directories
- fixed: `JSON` type in Total.js schemas
- fixed: `MODEL()`, `MODULE()`, `INCLUDE()` now are direct aliases
- fixed: a check for maximum length of request data
- fixed: Date formatting with `a` value
- fixed: empty localization in view engine e.g. `@()`
- fixed: external static routing in view engine on Windows
- fixed: NoSQL filtering with `or`
- fixed: NoSQL multiple updates
- fixed: NoSQL sorting of boolean values in larger dataset
- fixed: responding on `range` header
- fixed: unit testing (author: @ckpiggy)
- fixed: `schema.setPrefix()` in nested schemas
- fixed: sitemap localization
- fixed: CORS custom headers
- fixed: NoSQL date filtering
- improved: performance and security
======= 2.8.0
- added: `NOSQL().restore()` restores a database (its package)
- added: Mail options support a new property `xoauth2` (it needs to contain a `BASE64` value) for sending emails via OAuth 2.0 tokens (more in docs)
- added: `F.path.mkdir(path)` creates all directories according to the path
- added: `MailMessage.send2([callback])` sends a message according to the framework configuration
- added: a new filter for NoSQL embedded `DatabaseBuilder.contains(name)`
- added: a new filter for NoSQL embedded `DatabaseBuilder.empty(name)`
- added: (IMPORTANT) NoSQL counter supports daily stats (NoSQL counter files will be upgraded automatically and backwards incompatible)
- added: (IMPORTANT) NoSQL database and counter can read data from URL
- added: NoSQL counter `db.counter.daily_sum([id], callback)` for reading stats
- added: NoSQL counter `db.counter.daily_max([id], callback)` for reading stats
- added: NoSQL counter `db.counter.daily_min([id], callback)` for reading stats
- added: NoSQL counter `db.counter.monthly_sum([id], callback)` for reading stats
- added: NoSQL counter `db.counter.monthly_max([id], callback)` for reading stats
- added: NoSQL counter `db.counter.monthly_min([id], callback)` for reading stats
- added: NoSQL counter `db.counter.yearly_sum([id], callback)` for reading stats
- added: NoSQL counter `db.counter.yearly_max([id], callback)` for reading stats
- added: NoSQL counter `db.counter.yearly_min([id], callback)` for reading stats
- added: NoSQL counter `db.counter.stats_sum(top, [year], [month], [day], callback)` for reading stats
- added: NoSQL counter `db.counter.stats_max(top, [year], [month], [day], callback)` for reading stats
- added: NoSQL counter `db.counter.stats_min(top, [year], [month], [day], callback)` for reading stats
- added: NoSQL counter `db.counter.minimum([id], callback)` for reading stats
- added: NoSQL counter `db.counter.maximum([id], callback)` for reading stats
- added: NoSQL counter `db.counter.min(id, value)` for writing stats
- added: NoSQL counter `db.counter.max(id, value)` for writing stats
- added: NoSQL counter `db.counter.sum(id, value)` for writing stats (alias for `db.counter.hit()`)
- added: NoSQL counter: a new event `stats` when the stats are changed
- added: NoSQL logging in `DatabaseBuilder.log(msg, [user])`
- added: NoSQL backuping documents while they are updating/removing in `DatabaseBuilder.backup([user])`
- added: `CLONE(obj)` alias for `U.clone()`
- added: `GROUP(flags, fn)` alias for `F.group()`
- added: `F.cache.set2()` it creates a persistent cache (persistent items are stored in a file)
- added: new View Engine command `@{'%config'}` which reads a value from config directly
- added: `F.config['allow-filter-errors']` for filtering network unhandled errors
- added: `REDIRECT()` alias for `F.redirect()`
- updated: (IMPORTANT) packages compress/decompress function supports streaming data
- updated: (IMPORTANT) `NOSQL().backup()` !!! was changed !!!!
- updated: `controller.view(name/url, [model], [headers], [partial])` can render a view from URL address
- updated: `F.backup()` argument `path` can contain `String Array` file list
- updated: `controller.viewCompile(body, model, [headers], [partial], [cacheKey])` add a cache key
- updated: `image.command(arg, value, [priority], [escape])` a `priority` argument can be `escape` when it contains `boolean` value
- updated: `U.getExtension()` returns lower-case extensions
- updated: `total.js/debug` watchs `/workflows` file
- updated: file `/workflows` supports custom `options`, more in docs
- updated: `Array.random()` algorithm (+70% faster than older)
- updated: `RESTBuilder.file(name, filetarget, [filename])` can contain `filename` instead of buffer
- updated: `U.streamer(beg, [end], onItem(item, index), [skip], [stream])` added a new argument `stream` for flushing buffer
- updated: `ErrorBuilder.addTransform(name, callback(isResponse))` by adding new argument `isresponse`
- updated: `sorting` (framework + NoSQL embedded), now supports `internationalization`
- updated: `total.js/debugger` by adding a new option `options.watch = ['directory']`
- updated: `U.streamer()` supports "cancelation", just return `false`
- updated: CSS auto-prefixer, added: `repeating-linear-gradient`, `radial-gradient`, `repeating-radial-gradient` and removed `-o` prefix
- fixed: (IMPORTANT) long messages in WebSocket
- fixed: (IMPORTANT) `controller` param in schemas
- fixed: moved executing of `MailMessage.callback()` to better place
- fixed: mail auth when `options.user` and `options.password` are blank
- fixed: JS/CSS/HTML blocks
- fixed: `F.prototypes()`
- fixed: `F.decrypt()` a problem with parsing JSON and date formats
- fided: `debug.js` sometimes was created a problem with output informations
- improved: Date formatting (+50%)
- improved: NoSQL performance (around 60% in some cases)
======= 2.7.0
- added: __IMPORTANT__ new unit-testing mechanism
- added: __IMPORTANT__ `F.prototypes(function(proto) {})` for extending all internal prototypes
- added: `HttpFile` is set in `global` for extending of prototype
- added: `file.move()` a new alias for `file.rename()`
- added: `SchemaBuilderEntity.$controller(new_controller)`
- added: `EMPTYCONTROLLER` is a global variable
- added: new alias `NOSQL.set()` and `NOSQL.get()` for `NOSQL.meta()`
- added: `RESTBuilder.file(name, filename, [buffer])` supports uploading files
- added: `RESTBuilder.mobile()` adds `iPhone` phrase into the `User-Agent` header
- added: `RESTBuilder.robot()` adds `Bot` phrase into the `User-Agent` header
- added: a small protection for multipart data
- added: a new global aliases `ROUTE()` --> `F.route()`, `FILE()` --> `F.file()` and `WEBSOCKET()` --> `F.websocket()`
- updated: __IMPORTANT__ components (framework can render css/js from specific group)
- updated: `F.cluster` each operation checks whether cluster is activated
- updated: default IP to `0.0.0.0`
- updated: `Date.prototype.format()` with `ddd` renders name of day with 2 capital letters
- fixed: new schemas with defined callback `function($)`
- fixed: loading of `config-test` file (added rewriting of existing values)
- fixed: Total.js version in `debug.js`
- fixed: cluster initialization
- improved: `cors` in `F.restful()` and `F.restful2()`
- improved: `auto-vendor-prefixes`
- improved: parsing files from multipart data
======= 2.6.2 (HOTFIX)
- fixed: a critical bug with `debug.js`
- fixed: `try/catch` block from parsing of WebSocket message
======= 2.6.1 (HOTFIX)
- fixed: timeout in `RESTBuilder` and `U.request()`
- fixed: `F.merge()` a problem with `.js` or `.css` extension in some directory
======= 2.6.0
- added: `F.config['default-errorbuilder-status']` a default HTTP status for all error builders default `200`
- added: `F.config['default-listenpath']` starts a UNIX socket server listening for connections on the given path
- added: `F.listenpath` contains `default-listenpath` location
- added: `F.custom(mode, http, request_prototype, response_prototype, options)` a new mode for overwriting default HTTP server
- added: `schema.inherit([group], name)` can inherit all values from another schema
- added: NoSQL synchronization for cluster (more in docs)
- added: cache synchronization for cluster (more in docs)
- added: `F.cluster` (more in docs)
- added: Total.js `debug` script `require('total.js/debug')` instead of `debug.js` file
- added: a support for `async` attribute when `<script async src="` tag is generating, e.g. `@{import('async default.js')}`
- updated: `F.http(type, options)` supports `options.listenpath` for HTTP server (a direct shortcut for `default-listenpath`)
- updated: `F.script` returns error if compilation fails
- updated: `debug.js` supports `inspector`
- updated: NoSQL embedded database sorting (increased read performance about 30%)
- updated: RESTBuilder parsers JSON date string as `Date` object
- updated: `favicon()` generates `<link rel="icon"` instead of `<link rel="shortcut icon"`
- fixed: `controller.send()` bad declaration of `connection.id` for `id` and `blacklist` arguments
- fixed: `totaljs --translate` problem with `node_modules` and `.git` directory
- fixed: a waiting mode in `GETSCHEMA()`
- fixed: cache `instance.cache()` in RESTBuilder
- fixed: NoSQL filtering (critical)
- fixed: a bug ImageMagick/GraphicsMagick when the path contains spaces (critical)
- fixed: `controller.memorize()` didn't work (critical)
- fixed: dynamic params when `controller.transfer()` is performed
======= 2.5.0
- added: a missing property for WebSocket controller `controller.mobile`
- added: `EMIT()` alias for `F.emit()`
- added: `ON()` alias for `F.on()`
- added: `OFF()` alias for `F.removeListener(eventName, listener)` or `F.removeAllListeners([eventName])`
- added: `controller.components()` adds script/css tag into the head
- added: `@{components([group], [settings])}` renders all components together from selected group
- added: a new alias `WAIT()` alias for `U.wait()`
- added: `res.status(code)` for express middleware
- added: `F.clearSchedule(id)` for removing existing schedules