forked from totaljs/framework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
changes.txt
executable file
·1933 lines (1710 loc) · 102 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
======= 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 identificator
- 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
- added: a support for WebSocket compression
- added: removing `.package` files from `tmp` directory
- added: a new schema implementation (more in docs)
- added: `F.restful2()` has simplified route mechanism (it doesn't use "{id}" param for insert(POST)/update(POST)/delete(DELETE) method with except "GET" method)
- added: `res.binary(buffer, contentType, [type], [download], [headers])`
- added: a new route flag `novalidate` (a prevention for Schema validation)
- added: `U.upload(files, url, [callback], [cookies], [headers], [method], [timeout])` for multiple uploading files
- added: `RESTBuilder.redirect(true/false)` enables/disables auto-redirect (default: enabled)
- added: new schema aliases (`$QUERY()`, `$GET()`, `$WORKFLOW()`, '$TRANSFORM()' and `$OPERATION()`)
- added: `allow-head` (default: false) adds `head` method into the each route automatically
- added: `F.config['allow-defer']` enables deferring functions with `DEFER` keyword (default: false)
- added: `DEFER` feature
- added: `F.config['allow-debug']` starts a mini debugger
- added: `res.image_nocache()` alternative to `F.responseImageWithoutCache`
- added: `req.localize()` performs localization (executes `F.onLocale`)
- added: `image.limit(type, value)` creates a memory/map/disk/etc. limitation for GM or IM
- added: `default-image-consumption` for GM/IM memory limitation (default value `30%`)
- added: `F.useSMTP(smtp, [options], [callback(err)])` rewrites current SMTP settings
- updated: `F.http('debug/release/test', { debug: true })` can start a mini debugger
- updated: `F.route()`, `F.websocket()` and `F.file()` --> now returns `FrameworkRoute` instance instead of `Framework` instance (more in docs)
- updated: `F.load(debug, [types], [path])` supports a new type `service` which enables `F.on('service')`
- updated: Components (now doesn't have to has `html` body)
- updated: A component implementation can contain `exports.group = 'name';`
- updated: framework loads all dependencies in order
- updated: routes (web/websockets/files) can have an identificator in this form `F.route('/', ['id:custom_dentificator']);
- updated: `UNINSTALL(type, url/id/fn)` supports new types `web`, `websocket` and `file`, e.g. `UNINSTALL('web', 'id:custom_identificator')`
- updated: `U.request()`, added a new flag: `raw` (sends raw data)
- updated: `F.schedule()` returns an identificator
- updated: `U.clone()` supports `buffer` properties
- updated: `setTimeout2(name, fn(param), timeout, [limit], [param])` added a new argument `limit` and `param`
- updated: `F.script()` --> `now` argument (in the script body) is function `now()` which it still returns `new Date()`
- updated: `F.script(body, value, callback(err, response, param), [param])` --> `param` argument is a helper
- updated: middleware `next(false)` cancels calling of next middleware and controller
- updated: `OPERATION(name, value, [callback(err, response, param)], [param])` added a new (helper) argument `param`
- updated: Mail error handling (added Message instance)
- updated: `U.request()` add a new flag `noredirect`
- updated: `F.exists(req, res, [max], callback(next, filename, req, res))` added a new arguments into the callback `req` and `res`
- updated: `F.memorize()` uses `themeName` as a part of the cache key
- updated: `debug.js` (missing `startup` directory)
- renamed: configuration `mail.address.from` for `mail-address-form`
- renamed: configuration `mail.address.reply` for `mail-address-reply`
- renamed: configuration `mail.address.copy` for `mail-address-copy`
- renamed: configuration `mail.smtp` for `mail-smtp`
- renamed: configuration `mail.smtp-options` for `mail-smtp-options`
- fixed: config `static-accepts` (it didn't work)
- fixed: routing with `upload` flag
- fixed: workers timeout
- fixed: modificators by George Okojie Davis
- fixed: NoSQL comparing dates `equal` in `where` condition
- fixed: a problem with `booting` packages if are used custom paths (by @harry-stot)
- fixed: JavaScript compression
- fixed: `allow-compile-style` for inline CSS in views
- improved: events
- improved: parsing data from requests
- improved: mechanism of components
- improved: performance
- improved: responding
- improved: mail attachments
======= 2.4.0
- added: `components` more in docs
- added: `X-Powered-By` header again with option to change/remove it in the framework config `default-xpoweredby : Total.js`
- added: `UPTODATE(type, url, [options], interval, [callback(err)])` more in docs
- added: `F.on('uptodate', function(type, name) {})` new event for up-to-date dependencies
- added: `F.stats.other.mail` with a count of sent emails
- added: `F.stats.response.errorBuilder` with count of sent ErrorBuilders
- added: `F.stats.response.image` with count of processed images via GM or IM
- added: `F.stats.request.schema` with count of request to SchemaBuilder
- added: `String.prototype.parseTerminal([fields], fn(values, index, count, realIndex), [skipLines], [takeLines])`
- added: `TRACE(message, [name], [url], [ip])` is an alias for `F.trace()`
- added: `F.config['trace-console']` (default: `true`) shows tracing on the console
- added: `F.convert(name, type/function(val))` registers a new convertor (convertors uses QueryParser (GET/POST))
- added: `F.convert(obj)` performs convertor for an object
- added: `F.download(url, filename, [callback])` a new alias for `F.snapshot()`
- added: `$$$([group], name)` for `GETSCHEMA([group], name)`
- added: configuration files supports options for all dependencies `module#mymodulename (Object) : { name: 'A custom options for dependency' }`
- added: `U.chunker()` added a new property `chunker.pages` with count of all stored pages
- added: `U.chunker()` added a new property `chunker.count` with count of all stored items
- added: `NEWOPERATION(name, fn(error, callback(response), value))` - registers a new operation (same as schemas)
- added: `OPERATION('name', function(err, response))` - executes an operation (same as schemas)
- added: `.flac` file extensions
- added: a new method for `MailMessage` object `message.unsubscribe('your URL or email address')`
- updated: new error message `The field "@" is invalid.`
- updated: `NOSQL().insert(doc, [unique])`
- updated: `quicksort` algorithm has been replaced for `shellsort` (increased performance of sorting about 10-15%)
- updated: `NOSQL().counter.monthly(true, ...)` shows all stats by ID
- updated: `NOSQL().counter.yearly(true, ...)` shows all stats by ID
- updated: `dependencies` supports up-to-date features e.g. `module (1 day) : https://......js`
- updated: `F.findConnections([path])` a `path` argument is optional
- updated: `U.streamer(beg, [end], function, [skip])` add a new argument `skip`
- updated: deprecated methods in Node.js v7
- updated: `String.parseJSON([date])` added `date` argument (date fields will be converted to `datetime`)
- updated: `F.script()` can compile code to function e.g.: `F.script('next(a + b)')` returns a compiled function
- updated: `String.captialize([onlyFirst])` add a new argument `onlyFirst`
- updated: `F.onParseQuery(value, req)` add a new argument `req`
- updated: `F.onParseXML(value, req)` add a new argument `req`
- updated: `F.onParseJSON(value, req)` add a new argument `req`
- updated: `RESTBuilder.url()` without argument returns a current URL
- updated: `RESTBuilder.exec(function(err, value, response))` when the `error` exists the `value` is still `EMPTYOBJECT`
- updated: addded a new argument `replacer` to `controller.send(message, [id], [blacklist], [replacer])` and `client.send(message, [raw], [replacer])`
- removed: behaviours
- removed: restrictions
- removed: `TransformBuilder`
- removed: `F.config['allow-compatibility']` (not used)
- removed: `controller.date()` method has been useless
- removed: dynamic view compilation through `.view()` method
- removed: `contorller.proxy()` in WebSocket controller
- fixed: JS minificator
- fixed: global alias `I` for isomorphic code
- fixed: streaming files in `debug` mode (removed cache)
- fixed: (critical) a bug with authorization in WebSocket
- fixed: `nosql_builder.join()` a problem with using `nosql_builder.first()` by @yexing (Xing Ye)
- fixed: `String.parseInt2()` - a possible NaN value
- fixed: `String.parseFloat2()` - a possible NaN value
- fixed: `F.snapshot()`
- fixed: HTML compression (a fixed problem with HTML comments)
- fixed: restarting framework (missing cleaning of `F.temporary`)
- fixed: `U.isDate()` a problem with older dates than 1970, reported by @docgit
- improved: code
- improved: memory consumption for static files
- improved: CSS compression
- improved: CPU and memory consumption
- improved: performance
- improved: updating of `F.datetime`
- improved: `uninstall` dependencies
- improved: installing 3rd-party dependencies (framework compares same contents)
======= 2.3.0
- added: support for `/workflows` file (more in documentation)
- added: `ShcemaBuilderEntity.$exec(name, callback)` (more in documentation)
- added: `SchemaBuilder` supports new types `enum` and `keyvalue`
- added: `controller.$exec(name, [options], [callback])` (more in documentation)
- added: a new argument `description` to each SchemaBuilder `set` + `add` method e.g. `.setSave()`, `.addWorkflow()`, etc..
- added: `SchemaBuilder.meta` contains all registered handlers with their descriptions
- added: a property `controller.schema`
- added: `F.viewCompile(body, [model], [layout], [repository], [language])` - dynamic views
- added: `controller.viewCompile(body, [model], [headers], [partial])` - dynamic views
- added: `{viewCompile(body, [model])}` - dynamic views
- added: `Controller` is a global variable for extending prototype
- added: `F.validators` with Regular Expressions
- added: View Engine supports `@{continue}` and `@{break}` command for looping
- added: `URLBuilder.make(fn)`
- added: `NOSQLMEMORY(dbName, [viewName])` enables in-memory database collection
- added: NoSQL `nosql.upsert(doc)` inserts a new document where document doesn't exist in DB
- added: NoSQL `nosql.release()` for releasing of in-memory DB (framework clears unused in-memory databases automatically)
- added: NoSQL `nosql.scalar(type, dbName, [view])` performs scalar operation by type: `sum`, `min`, `max`, `avg`, `count` or `group`
- added: NoSQL `nosql.binary.all(callback)` browses all stored files
- added: NoSQL `nosql.binary.clear(callback)`removes all stored files
- added: NoSQL `DatabaseBuilder.random()`
- added: NoSQL `DatabaseBuilder.join(field, dbName, [view])` returns `DatabaseBuilder` with updated `.where(field_JoinedDB, field_currentdb)` method (it supports `.fields()` too)
- added: NoSQL `DatabaseBuilder.join()` supports scalar operation too, e.g. `nosql.join(...).scalar('count')`
- added: NoSQL `DatabaseBuilder.scalar(type, [field])` - types: `sum`, `min`, `max`, `avg`, `count` or `group`
- added: NoSQL `DatabaseBuilder.month(field, [operator], value)` filters `Date` fields according its month number
- added: NoSQL `DatabaseBuilder.year(field, [operator], value)` filters `Date` fields according its year number
- added: NoSQL `DatabaseBuilder.day(field, [operator], value)` filters `Date` fields according its day number
- added: NoSQL events (documents): `insert`, `update`, `modify` and `remove`
- added: NoSQL events (binary): `insert`, `remove` and `clear`
- added: NoSQL events (counter): `hit`, `remove` and `clear`
- added: a new alias `NOBIN(dbName)` witch it returns `NOSQL(dbName).binary` (a binary instance)
- added: a new alias `NOCOUNTER(dbName)` witch it returns `NOSQL(dbName).counter` (a counter instance)
- added: `F.kill(signal)` for killing an instance of the framework
- added: `I` alias for `isomorphic code on server-side and client-side together by [email protected] <https://github.com/Creeplays>
- added: `F.script(body, value, callback(err, value))` evaluates script securly in safe scope (more in documentation)
- added: new alias `SCRIPT()` for `F.script()`
- added: `HttpFile.rename(filename, [callback(err)])` moves file to another directory
- updated: `F.on('exit', function(signal) {})` added a signal code
- updated: SchemaBuilderEntity contains new argument `controller`, e.g. `.setSave(function(error, model, options, callback, controller) { ..`
- updated: removed all validators of email addresses from FrameworkMail
- updated: `GETSCHEMA([group], name, [callback(err, schema)])` can wait for a schema
- updated: `F.localize()` supports modificators as `static` type
- updated: `F.modify()` supports a new type `static`, it's group of `.html`, `.txt` and `.md` files
- updated: `U.trim(obj, [clean])` supports a new argument `clean` (default `false`) and when it's `true` and a value is `''` then it sets the value to `undefined`
- updated: `nosql.update(docToUpdate, [docToInsert])` when the document for updating doesn't exist then database performs insert
- updated: `nosql.modify(docToUpdate, [docToInsert])` when the document for updating doesn't exist then database performs insert
- updated: `nosql.binary` stores a creation date as meta info
- fixed: Image.stream()
- fixed: global variable `Image` (in a single library)
- fixed: JavaScript compressor (problem with Regular Expressions)
- fixed: custom paths in `F.model()` and `F.source()`
- fixed: NoSQL removing documents (problem with different filters in one queue)
- fixed: fix view compiler error message
- fixed: `String.prototype.capitalize`
- removed: `nosql` doesn't support cache (`DatabaseBuilder.cache` is obsolete)
- removed: `F.refresh()` the method was useless
- replaced: `Array.randomize()` for `Array.random()`
- improved: code
======= 2.2.0
- added: `controller.proxy2(url, [callback], [headers], [timeout])` creates a proxy between current request and new URL
- added: `Image.watermark(filename, [x], [y], [width], [height])` creates a watermark
- added: hidden hack `res.noCompress = true` disables compilation of `.js` or `.css`
- added: `RESTBuilder` for creating REST requests (more in docs)
- added: new config item `allow-cache-snapshot` - to prevent cache when the framework is restarted
- updated: `SINGLETON(name, [def = {}])` about `def` argument
- updated: `debug.js` adds timestamps
- updated: `F.redirect()` can contain a relative URL of file
- updated: NoSQL embedded parser, dates are parsed as date object
- updated: `Pagination.next()`, `Pagination.prev()`, `Pagination.last()` and `Pagination.first()` supports new arguments `.html([link_inner_html], [class_name])`
- updated: `F.worker()` supports packages `F.worker('@eshop/myworker-script')`
- updated: `FrameworkImage` when the instance contains no command then `.minify()` method is performed automatically for preventing of empty response
- updated: `F.config['static-accepts']` removed dots from all extensions
- improved: `@{href(key, value)}` performance
- improved: Total Package Manager `$ tpm --help`
- improved: FrameworkImage command building
- fixed: (critical) NoSQL `nosql.modify()` and problem with updating `undefined` values
- fixed: (critical) security with GM and IM --> 10000x thanks for Luis Figueiredo <[email protected]>
- fixed: `Image.stream()` and `Image.pipe()`
- renamed: `F.onLocate` renamed to __`F.onLocale`__
======= 2.1.0
- added: `F.sitemap_add(string)` for adding entries to sitemap by Martin Smola <https://github.com/molda>
- added: SchemaBuilderEntity `schema.addHook(name, fn(error, model, options, callback))`
- added: SchemaBuilderEntity `schema.hook(name, model, [helper], callback)`
- added: `controller.$hook(name, [helper], callback)`
- added: `String.parseInt2()` the method searchs number and converts it to integer
- added: `String.parseFloat2()` the method searchs number and converts it to float
- added: `@{title2('this content will be added to end of current title')}`
- added: `String.parseInt2()` the method searchs number and converts it to integer
- added: `String.parseFloat2()` the method searchs number and converts it to float
- added: `@{absolute(url, [hostname])}` for importing links with absolute URL by George Okojie Davis <https://github.com/binarygeotech>
- added: `sitemap_replace(name, title, url)` can change sitemap `title` and `url` onetime
- added: new JavaScript minificator algorithm because of Douglas Crockford "Good, not Evil"
- added: NoSQL supports counter for e.g. views or downloads, etc., more in documentation
- added: new routing mechanism `F.mmr(url, action)` for streaming `multipart/x-mixed-replace` types (client-->server)
- added: `controller.mmr(filename, [stream], callback)` for streaming `multipart/x-mixed-replace` (server-->client)
- added: `setTimeout2(key, fn, timeout)` resets old and creates a new `setTimeout` according to the `key`
- added: `clearTimeou2(key)` resets existing timeout
- added: `dnscache` into the `controller.pipe()` and `F.responsePipe()`
- added: `CREATE([group], name)` the methods create an empty object according to the schema
- added: `F.group(flags, fn)` for extending routes (web, websocket, file) flags
- added: `Number.prototype.filesize([decimals], [type])` formatting file sizes
- added: `binary` importing CSV `-csv`
- added: `controller.autodestroy([callback])` only for websocket
- updated: `framework.view()`, `controller.view()` and `@{view()}` supports `=theme/viewname`
- updated: sitemap routing supports localization
- updated: `F.cache.fn(name, fnCache, fnCallback(value, isFromCache))` - added argument `isFromCache`
- updated: `F.use(name, url, types, [first])` - `first` (default: `false`) argument adds a new middleware to the beginning of a route middleware
- updated: `String.toSearch()` - removes duplicates characters + better performance
- updated: `String.decode()` - improves decoding by Tom Spaccialbelli <https://github.com/harry-stot>
- fixed: (critical) NoSQL views
- fixed: (critical) view compilation in release mode (problem with just-in-time rendering)
- fixed: (critical) `F.eval()`
- fixed: (critical) parsing Date instance as Date instance in SchemaBuilder
- fixed: `F.resize()` additional path `~`
- fixed: `controller.memorize()` threw a timeout when the action contains some error in the memorize scope
- fixed: `F.sitemap()` fixed problem with `me` argument
- fixed: SchemaBuilderEntity preparing and validation
- fixed: QuickSort algorithm (problem with dates)
- fixed: `TRY()` scope
- fixed: problem with resources in views
- fixed: CSS compressor
- fixed: CORS
- fixed: problem with SUCCESS() and async schemas
- fixed: killing the process
- fixed: HTML compressor in views
======= 2.0.1
- added: binary supports webserver `totaljs 8000` starts webserver on 8000 port and the current directory will be a public directory
- added: configuration supports new subtype (`env` or `environment`) for binding values from `process.env`
- added: `SchemaBuilderEntity.$next(type, [name], helper)` --> adds a new operation (type: `workflow`, `transform`, `operation`, `save`, `read`, `query`, `remove`) to async list as next step
- added: `SchemaBuilderEntity.$push(type, [name], helper)` --> adds a new operation (type: `workflow`, `transform`, `operation`, `save`, `read`, `query`, `remove`) to async list as last step
- added: `SchemaBuilderEntity.$index(index)` can changed `obj.$async()` index (the index can be string e.g. `+1` or `-1`)
- added: `SchemaBuilderEntity.$callback(fn)` can changed `obj.$async()` callback
- added: `SchemaBuilderEntity.$repository(name, [value])` can get / set temporary value
- added: `SchemaBuilderEntity.$output()` sets the current `callback(value)` as output/result for `obj.$async(function(err, output))`
- updated: when the config contains `directory-temp` with empty value then the framework uses system temporary directory
- updated: `U.reduce()` supports array
- fixed: binary `totaljs`, fixed problem with creating localized texts
- fixed: `F.responseFile()` problem with cached filename, extension was broken when the framework reads the file from cache
- fixed: preparing values with subtype for array in SchemaBuilder
- fixed: generation UID
- fixed: problem with uninstalling middleware
- fixed: email validation, a problem with e.g. `[email protected]` by @VarunBatraIT
- improved: view engine rendering
- improved: view engine memory consumption
======= 2.0.0
- added: new NoSQL version v4.0.0 is fully optimized for total.js
- added: `controller.invalid([status])` creates the ErrorBuilder instance and it responds in the next tick
- added: `controller.sitemap_url([id])` returns an URL from the sitemap
- added: `controller.sitemap_name([id])` returns a name/title from the sitemap
- added: `controller.sitemap_change(id, property, newvalue)` can change a current value in the sitemap
- added: `controller.sitemap_navigation([parent], [langauge])` can get list of all items according to the parent
- added: `@{sitemap_url([id], [arg1], [arg2], [argN])}` returns an URL from the sitemap
- added: `@{sitemap_name([id], [arg1], [arg2], [argN])}` returns a name/title from the sitemap
- added: `@{sitemap_change(id, property, newvalue)}` can change a current value in the sitemap
- added: `@{sitemap_navigation([parent], [language])` can get list of all items according to the parent
- added: `/startup/` all scripts in this directory are executed only one (then are renamed automatically)
- added: `F.route()` supports a new flag: `cors` (creates a cors route) and `credentials` (enables cookies for cors)
- added: `ErrorBuilder.plain()` returns all errors as a simple string
- added: `Array.findItem()` alias to `Array.find()`
- added: `Number.async(fn(index, next), callback)` for asynchronous operations
- added: `UID()` for generating unique identificators (contains minimum 18 chars)
- added: `F.restart()` for restarting app
- added: `F.on('restart')`
- added: quicksort algorithm for sorting arrays
- added: `Array.quicksort(property_name, [asc], [maxlength])` for sorting arrays
- added: `String.removeTags()` by @harry-stot
- added: F.nosql(name) + NOSQL(name) --> alias for NoSQL embedded database (it can be used with e.g. SQL Agent)
- added: modificators can handle `INSTALL('view', ...)`
- added: `String.isPhone()` for phone number validation
- added: `String.isUID()` for UID() validation
- added: `String.isZIP()`
- added: `Pagination.html(max, format)` returns `String`
- added: `Pagination.json(max, format)` returns `String`
- added: new schemabuilder types `Email` (string, maxlength 120), `Phone` (string, maxlength 20), `Zip` (string, maxlength 10), `Capitalize` (string), `Lowerize` (string), `Upperize` (string), `UID` (string, minlength 18, maxlength 20), `Url` (string, maxlength 500), `JSON` (string)
- added: `SchemaBuilderEntity.fields` and it contains all field names in array.
- added: `Mail.send(smtp, options, messages, [callback])` messages must be array
- added: `Mail.send2(messages, [callback])` sends messages according to the framework configuration
- added: `Mail.try(smtp, options, callback)` tries to open a SMTP
- added: `F.datetime` contains current datetime and each 1 minute is the value increased
- added: `F.stats.other.restart` contains a new property with count of restarting
- added: `F.config.trace` for enable/disable tracing, `Boolean`, in a debug mode: `true`, release mode: `false`
- added: `F.trace(message, [name], [uri], [ip])`
- added: `controller.trace(message)`
- added: `req.split` contains splitted url
- added: `F.touch(url/req)` for clearing internal cache of cached static files (it works only in release mode)
- added: `F.path.exists(path, callback(exist, size, isFile))` for check of existing file
- added: `U.chunker(name, [max])` creates the chunker (for streaming some items)
- added: `F.worker2(name, [args], [callback], [timeout])`
- added: `SchemaBuilderEntity.allow('fieldname1', 'fieldnameN')` - allows other keys out of defined fields
- added: `global.EMPTYOBJECT`
- added: `global.EMPTYARRAY`
- added: `global.SINGLETON(name)` returns a singleton object instance
- added: `controller.referrer` returns a value from `req.headers['referer']`
- added: `controller.author(value)` can change `<meta name="author"`
- added: `@{author(value)}` can change `<meta name="author"`
- added: view engine supports looping with objects `@{foreach m in model} key: @{m.key} and value: @{m.value} @{end}`
- updated: subdomain routing supports wildcard routing `F.route('[*]/', 'homepage')` (`F.websocket()` is supported too)
- updated: `F.route(url, ...)` - `url`can be String Array with multiple relative paths by @Harry-Stot
- updated: `F.file()` supports flags instead of middleware and the flags supports extensions `['.jpg', '.png']`. The `name` argument has been removed.
- updated: `F.localize()` supports flags and the `name` argument has been removed
- updated: `F.sitemap()` returns object with a new field: `wildcard: {Boolean}`
- updated: `F.problem()`, `F.change()`, `controller.problem()` and `controller.change()` write logs to the file
- updated: `F.mail()` and `controller.mail()` subject is translated according to the language
- updated: `F.file(fnValidation/relative_path, fnExecute, [flags])` the file routing is completely changed
- updated: `export.booting` can contain `root` attribute for `package` applications
- updated: `Array.orderBy()` added quicksort algorithm
- updated: `Date.format()` supports day names `ddd` (short) and `dddd` (full)
- updated: `String.removeDiacritics()` supports multiple languages (by @Harry-Slot)
- updated: (IMPORTANT) `U.getExtension(filename)` --> returns extension without `.` dot
- updated: (IMPORTANT) `F.resize(url, action(image), [flags])` new resize routing
- updated: `F.resize()` flags can contain http/https `path` e.g. `F.resize('/img/*.*', (image) => image.minify(), ['https://www.totaljs.com/img/']);`
- updated: `U.GUID()` supports better charset by Guy Fraser
- updated: `Date.add(number)` supports number increase/decrease in milliseconds
- updated: `U.send(name, stream, url, callback, [cookies], [headers], [method], [timeout])` supports cookies and timeout
- updated: `U.request()` supports a new flag `< 200` (kB), it means that the method stores a content with maxixmum size 200 kB.
- updated: `ErrorBuilder` instance contains a new property `instance.unexpected` when is `instance.push()` a classic Error's instance.
- updated: configuration files + resources support types like String, Number, Array, Date, etc. via `key (type) : value`
- updated: `F.use(name, [url], [types])` - now supports new attributes `url`, and `types`
- fixed: `Websocket.destroy()`
- fixed: Too many open files with `F.log()` and `F.logger()`
- fixed: `String.isJSON()` the problem with `\n` character
- fixed: `FrameworkImage.save()` problem with streams
- fixed: `CLEANUP(stream)` method
- fixed: `controller.memorize()` problem with `controller.content()`
- fixed: `multipart/form-data` parser
- fixed: `Array.async()` without arguments
- fixed: view inline helpers
- fixed: `FrameworkImage.save()` doens't work when it doesn't contain any operation
- fixed: Windows paths
- fixed: problem with `websocket.destroy()`
- fixed: `F.cors()`
- fixed: WebSocket initialization (critical)
- fixed: Mail sender (problem with ZOHO SMTP)
- fixed: `Number.add()` problem with percentage
- fixed: `U.isDate()` by Guy Fraser
- fixed: `U.parseXML` problem with `CDATA`
- fixed: `U.join()` problem with Windows path by Martin Smola
- fixed: uploading files (problem with unexpected closed requests)
- fixed: `F.assert()` a problem with external URL address
- renamed: event `route-add` to `route`
- renamed: `F.versionNode` to `F.version_node`
- removed: (IMPORTANT) `X-Powered-By` header
- removed: `SCHEMA()`
- removed: composer from `SchemaBuilderEntity`
- removed: rules from `SchemaBuilderEntity`
- removed: obsolete code
- removed: `controller.async()`
- removed: `framework.async()`
- removed: `Utils.validate()`
- removed: `Utils.isEmail()`
- removed: `Utils.isURL()`
- removed: `Utils.isValid()`
- removed: `Utils.isNullOrEmpty()`
- removed: `controller.global` property by Guy Fraser (a problem with referrencing)
- removed: `controller.database()`, use `F.database()`
- removed: `controller.functions()`
- removed: `controller.models()`
- improved: Controller initialization by Guy Fraser
- improved: SMTP sender
- improved: redirecting
- improved: Array.orderBy(), added quicksort algorithm
- improved: ErrorBuilder
- improved: `WebSocket.send()` for JSON communication
- improved: code (a lot)
- improved: preparing `SchemaBuilderEntity`
- improved: performance
- improved: a lot of code by Guy Fraser
======= 1.9.7
- added: `F.web()` --> alias to F.route()
- added: `F.cors(url, flags, credentials)`
- added: `config['default-response-maxage']`, default value `11111111`
- added: `U.get(obj, path)` reads a value from `obj` by path
- added: `U.set(obj, path, value)` sets a value into `obj` by path
- added: (IMPORTANT) `config['default-root']` can replace root relative path
- added: `FrameworkImage` --> `instance.make(function(image) {})`
- added: `FrameworkImage` supports middleware `FrameworkImage.middleware(extension, fn)`
- added: `controller.$get([helper], callback)` or alias `controller.$read([helper], callback)` - schema must be defined in the route
- added: `controller.$remove([helper], callback)` - schema must be defined in the route
- added: `controller.$save([helper], callback)` - schema must be defined in the route
- added: `controller.$query([helper], callback)` - schema must be defined in the route
- added: `controller.$transform(name, [helper], callback)` - schema must be defined in the route
- added: `controller.$workflow([name, [helper], callback)` - schema must be defined in the route
- added: `controller.$operation(name, [helper], callback)` - schema must be defined in the route
- added: `controller.$async(callback, [index])` - schema must be defined in the route
- added: new `F.route()` flag `binary` (works only with `raw` flag)
- added: `U.ls2()` --> returns additional information about files (stat Object);
- added: `Pagination` is a global variable
- added: `SchemaBuilder.workflow2(name, options, callback)` skips preparing and validation
- added: `SchemaBuilder.transform2(name, options, callback)` skips preparing and validation
- added: `SchemaBuilder.operation2(name, options, callback)` skips preparing and validation
- added: `ErrorBuilder.exception(message)` - adds a new exception message
- added: `F.findConnection()` finds a websocket connection
- added: `F.findConnections()` finds websocket connections
- updated: (IMPORTANT) Array.async([NEW: threadCount (Number)], [callback]) supports `threads`
- updated: (IMPORTANT) Array.wait(onItem(item, index), [callback], [threadCount]) supports `threads`
- updated: (IMPORTANT) U.streamer(beg, [end], callback) --> supports "end" delimiter
- updated: Date.format(format, [resource_name]) supports name of months via `MMM` (short) and `MMMM` (full)
- updated: Resources support months e.g. `January : Január`
- updated: `F.merge()` supports directories, e.g. `F.merge('app.js', '/js/*.js')`
- updated: NoSQL embeddded version
- updated: `U.ls()` --> [filter] can be `string` or `RegExp`
- updated: `@{meta(title, [description], [keywords], [image])}` and `@{keywords(value)}` keywords can be String Array
- updated: `@{section name}` can be used in the view more times
- updated: `U.request()` flags supports `number` for timeout and encoding `utf8`, `ascii`, etc.
- updated: `F.restfull()` each action support SchemaBuilder
- fixed: (IMPORTANT) Expires headers - problem with Russian timezone, reported by [Андрей Владимирович](https://github.com/anddesigner)
- fixed: (IMPORTANT) SchemaBuilder validation
- fixed: (IMPORTANT) view caching
- fixed: (IMPORTANT) U.keywords()
- fixed: @{checkbox} value binding
- fixed: dynamic views translator caching
- fixed: URL search string in `F.redirect()` (doesn't work on local relative address)
- fixed: binary / executable for Windows
- fixed: SUCCESS()
- fixed: Schema Validation is performed after F.onAuthorize().
- fixed: checking of maximum request length
- fixed: regexp routing
- fixed: F.restrictions.allow()
- fixed: `U.request()` and fixed `head` method, callback returns headers when is `head` method used
- fixed: Pagination by DusanDragula
- fixed: View inline helpers - reported by [Андрей Владимирович](https://github.com/anddesigner)
- fixed: `Array.findIndex` - reported by [Liao San-Kai](https://github.com/liaosankai)
- fixed: `WebSocket.send()` problem with `[id]` and `[blacklist]`
- improved: performance in `Expires Header`
======= 1.9.6
- added: MailMessage.manually() and removes auto-sending mail --> works only with `F.mail()` and `controller.Mail()`.
- added: view engine supports now `@{'route-to-static-file.jpg'}`
- added: `U.clone(obj, [skip])`
- added: `U.parseTheme(path)` --> parses theme name
- added: `@{href}` or `@{href(obj)}` or `@{href(key, value)}` --> query string manipulation (more in documentation)
- added: `.jsx` content-type
- added: `robot` flag into the routing (for search engines)
- added: property `req.robot`
- added: property `controller.robot`
- added: property `controller.mobile`
- added: support for default theme name, e.g. `=?/index` (the framework replaces `?` for `default-theme`)
- added: String.localeCompare2(value) --> same as localeCompare() but this method works with diacritics
- added: F.register(filename); --> the methods registers new e.g. resource (it solves the problem with resources in packages)
- updated: (IMPORTANT) controller.isSecure was renamed to controller.secured
- updated: (IMPORTANT) req.isSecure was renamed to req.secured
- updated: (IMPORTANT) Array.wait(onItem, onCallback, [NEW: threadCount (Number) or removeItemFromArray (Boolean)]) supports `threads`
- updated: `F.mail()` supports themes with view nema like this `=default/someview'`
- updated: `@{import()}` supports movies and images
- updated: `@{import()}` can contain schema name in the path like this `=YOURTHEME/somefile.js`
- updated: `F.route('/', '=themeName/viewname')` supports inline themes
- updated: `F.resize()` added new options parameter --> `direction` (top, center or bottom)
- updated: SUCCESS(), now supports function as first argument and the method returns wrapped function too
- fixed: problem with views path (`./some/path/in/hdd/` routed view anywhere)
- fixed: static file routing (`@{import()}`, `@{routeScript}`, etc..)
- fixed: miss `Sec-WebSocket-Protocol` by Liao San-Kai
- fixed: `MailMessage.send()` --> `options` argument is optional
- fixed: problem with UTF8 in U.request() by Ivan Marchukov
- fixed: WebSocket parser
- fixed: WebSocket closing message (problem with UTF8)
- fixed: U.getExtension()
- fixed: problem with WebSocket `destroy`
- fixed: sync2() doesn't work
- fixed: problem with themes in controller.memorize()
- fixed: problem with timeout in controller.memorize()
- fixed: fixed unitialized memory block in `mail` (by ChALkeR)
- fixed: problem with static files (directories with extensions)
- removed: all `controller.current...()` methods
- removed: all `@{current...()}` methods
- removed: (IMPORTANT) `framework.fs`
- removed: (IMPORTANT) `controller.fs`
- improved: (IMPORTANT) SchemaBuilder by Ivan Marchukov
- improved: (IMPORTANT) ViewEngine performance about 15%
- improved: request cookie parsing
======= 1.9.5
I had to skip v1.9.4 version because of NPM (my mistake).
- added: (IMPORTANT) new feature: THEMES
- added: `@{theme}` --> return String
- added: `F.onTheme` delegate
- added: `controller.theme(theme_name)` --> select theme;
- added: `config['default-theme']`
- added: `U.keywords(content, [forSearch], [alternative(true|false|soundex)], [max_count(200)], [max_length(20)], [min_length(2)]);`
- added: `String.prototype.keywords([forSearch], [alternative(true|false|soundex)], [max_count(200)], [max_length(20)], [min_length(2)])`
- added: `String.prototype.soundex()`
- added: `F.wait(name, [enable])` the server waits for pending task and it responds via 503 status code
- added: `U.parseQuery()` and `String.parseQuery()`
- added: `U.join(path1, path2, path3)`
- added: `U.getName(path)`
- added: `F.on('error400')`
- added: `F.on('error401')`
- added: `F.on('error403')`
- added: `F.on('error404')`
- added: `F.on('error408')`
- added: `F.on('error431')`
- updated: (IMPORTANT) F.onAuthorization() was renamed to F.onAuthorize()
- updated: `Date.format()` supports `w` and `ww` for week number
- updated: `Date.add()` supports `w`, `ww`, `week`, `weeks`
- updated: MailMessage supports display name `mail.from('Name <vali@demail>');`
- updated: MailMessage supports display name `mail.to('Name <vali@demail>');`
- updated: MailMessage supports display name `mail.to(email, [name], [clear]);`
- updated: MailMessage supports display name `mail.cc('Name <vali@demail>');`
- updated: MailMessage supports display name `mail.cc(email, [name], [clear]);`
- updated: U.resolve(url, [callback]) --> `callback` is optional
- fixed: HTTP cache for HTML 5 offline manifest files
- fixed: async() error handling
- fixed: NoSQL embedded paths
- fixed: problem with empty SMTP options
- fixed: ErrorBuilder default transformation to JSON
- fixed: Error handling
- fixed: SchemaBuilder request auto-validation
- fixed: String.isJSON()
- fixed: F.responsePipe() --> problem with transmitted headers
- fixed: evaluating of @{helpers.helper_name()}
- fixed: HTML minification of UTF8 characters
- fixed: U.isEqual()
- fixed: FrameworkImage.save() in Windows by LiaoTzukai
- fixed: SchemaBuilder prefix by Dušan Dragula
- improved performance of the response
- improved total performance
- improved view engine performance
======= 1.9.3
- added: (IMPORTANT) merging supports BLOCKS (.js,.css), e.g. F.merge('merge.js', 'fileA.js#management,common', 'fileB.js#management')
- added: (IMPORTANT) a route with schema binding can contain filter e.g. `*Schema#update` or `*Group/Schema#create` --> the framework validates only fields by filter
- added: TRANSFORM([transform], obj)
- added: NEWTRANSFORM(name, fn, [isDefault]) --> alias for TransformBuilder.addTransform()
- added: packages can be stored as directories (recommended for debug mode only)
- added: F.localize(name, url, [middleware], [options], [minify]) --> minify argument
- added: email supports calendar (.ics) request sending
- added: SchemaBuilderEntity.make(function(schema))
- added: F.install() supports packages mapping
- added: Support for unicode routing
- added: Packages can be loaded in framework structure (/controllers/, /modules/) `exports.booting = true`
- added: route flags can contains object --> the object is an additional options for middleware
- added: Utils.btoa(str) --> returns base64
- added: Utils.atob(str) --> returns binary
- added: global.TRY(fnScope, [fnError]) --> creates safe scope (more in documentation)
- added: Utils.getExtension(filename)
- added: @{head} can be imported as @{import('head')}
- added: @{meta} can be imported as @{import('meta')}
- added: controller.cookie('KEY') --> for reading
- added: controller.cookie('KEY', 'VALUE', expire, [options]) --> for writting
- added: framework.onParseQuery(function(value)) --> for parsing values from the requests
- added: framework.onParseXML(function(value)) --> for parsing values from the requests
- added: framework.onParseJSON(function(value)) --> for parsing values from the requests
- updated: (IMPORTANT) F.onValidation() was renamed to F.onValidate()
- updated: (IMPORTANT) SchemaBuilderEntity.onValidation() was renamed to SchemaBuilderEntity.onValidate()
- updated: (IMPORTANT) SchemaBuilderEntity.setValidation() was renamed to SchemaBuilderEntity.setValidate()
- updated: CSS compressor removes comments
- updated: F.restrictions.allow('IP') --> does not have to be full IP
- updated: F.restrictions.disallow('IP') --> does not have to be full IP
- updated: String.startsWith() and String.endsWith() according to ES6 but with the backward compatibility
- updated: String.parseDate() supports JSON format and classic date serialization
- updated: U.request() --> response always returns string
- updated: debug.js --> now watchs packages
- fixed: framework starting path (fixed problem with PM2 module)
- fixed: controller.memorize() - prevention for multiple requests
- fixed: routing (POST request without content-type is considered as `application/x-www-form-urlencoded`)
- fixed: sync2()
- fixed: U.minifyHTML() - now compresses JS and CSS in HTML
- fixed: Async.cancel()
- fixed: email attachments
- fixed: throwing error in global middleware
- fixed: Pagination.last()
- fixed: CSS auto-vendor-prefixes
- fixed: `tpm` binary (bug in creating packages on Windows)
- fixed: controller generators
- fixed: F.install() --> problem with names via URL import
- fixed: F.map() on Windows (problem with paths)
- fixed: HTML compression in views
- fixed: U.Async() object (problem with waitingFor)
- fixed: F.map(), problem in Windows
- fixed: CLEANUP(stream, [callback]);
- fixed: HTTP CACHE
- EXAMPLE (NEW): https://github.com/totaljs/examples/tree/master/blocks
======= 1.9.2 (HOTFIX)
- added: support for node +v4.0.0
- updated: F.load(.., ..., [path]) path arguments supports '..' for parent directory
- updated: PageBuilder (+added properties: `nextPage`, `prevPage`, `firstPage`, `lastPage`) by [Liao San-Kai](https://github.com/liaosankai)
- updated: NoSQL
- fixed: U.request() --> `DELETE` method has `application/x-www-form-urlencoded` as default content type
- fixed: routing with `delete` flag
- fixed: F.worker()
- fixed: WebSocket event handlers
- fixed: sync2()
- fixed: @{place}
- fixed: @{section}
- fixed: controller.memorize() - problem with different layouts
- improve: routing performance with F.onAuthorization()
======= 1.9.1 (HOTFIX)
- added: new sitemap system
- added: a default schema validator is F.onValidation()
- added: ErrorBuilder.setContentType() --> default application/json
- added: View engine supports `else if`
- added: U.parseBoolean(val, [def])
- added: F.backup(filename, path, [callback], [filter]) --> backup some path to one file
- added: F.restore(filename, target, [callback], [filter]) --> restore backup file (but not evaluating)
- added: MailMessage supports custom headers `message.headers = { key: 'value' }`
- added: @{notranslate} --> disables view translation
- added: F.mode('debug') or F.mode('release') --> changes a mode of the framework
- added: EACHSCHEMA([group], prepare(group, name, schema))
- updated: MailMessage.bcc(email, [clear]) --> added clear
- updated: MailMessage.cc(email, [clear]) --> added clear
- updated: MailMessage.reply(email, [clear]) --> added clear
- fixed: uploading files
- fixed: prevention for mail double callback calling (by Andrea Sessa)
- fixed: worker messaging
- fixed: problem with schema parser (by Andrea Sessa)
- fixed: F.load() --> "versions" is configurable
- fixed: "raw" receiving of data
- fixed: U.request(), the problem with default method
- fixed: F.exists() - problem with URL query string
- fixed: framework startup path
- fixed: Date.format()
- fixed: Assertion Testing
======= 1.9.0
- added: (IMPORTANT) ISOMORPHIC using