mol_tree2 0.0.5 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.md DELETED
@@ -1,536 +0,0 @@
1
- # $mol
2
-
3
- Reactive micro-modular ui framework. Very simple, but very powerful!
4
-
5
- # Contents
6
-
7
- - [Levels](#levels)
8
- - [Features](#features)
9
- - [Applications](https://apps.hyoo.ru/)
10
- - [Benchmarks](#benchmarks)
11
- - [Articles](#articles)
12
- - [Discussions](https://teleg.run/mam_mol)
13
- - [Quick start](#quick-start)
14
- - [Tutorials](#tutorials)
15
- - [Rationale](#rationale)
16
- - [Modules](#modules)
17
- - [Contributors](#contributors)
18
- - [Cool stuff](#cool-stuff)
19
- - [Donate](#donate)
20
-
21
- # Levels
22
-
23
- 1. **Library.** $mol is just set of small libs. Honor libs: jQuery, React, Redux, MobX.
24
- 2. **Low level framework.** $mol is very flexible, but simple. Honor low level fw: Angular, Vue, Ember.
25
- 3. **high level framework.** $mol has many costomizable ui components. Honor high level fw: Ext, OpenUI5.
26
- 4. **Platform.** $mol doesn't fit it yet. Honor platforms: Drupal, SAP, 1C.
27
-
28
- # Features
29
-
30
- - [Zero configuration](#zero-configuration). Just checkout and use it.
31
- - [Lazy rendering/evaluating/loading etc](#lazyness).
32
- - [Full reactivity](#reactivity) in all application layers. Not only between View and ViewModel.
33
- - [Automatic dependency tracking](#reactivity) between reactive containers. No need to manual publish/subscribe/unsubscribe and streams routing.
34
- - [Effective state synchronization](mem) in right way.
35
- - Automatic inclusion of modules in package at compile time. No need for manually importing them. [Just use it](#zero-configuration).
36
- - Very small modules. [All of them are optional](#zero-configuration).
37
- - Cross platform. [Support any environment](#zero-configuration) (NodeJS, Web browsers, Cordova).
38
- - Static typing ([TypeScript](https://www.typescriptlang.org/)). Full IDE support.
39
- - Full customization. No hidden implementation. [All aspects are overridable](#lego-components).
40
- - [Lifecycle management](#reactivity). Automatic destruction of unnecessary objects.
41
- - [Easy debugging](#debugging). User friendly id's of all objects. Quick access to all objects from console.
42
- - Easy [user friendly logging](#debugging) of all state changes.
43
- - Pseudosynchronous code. [Asynchrony is abstracted by reactivity](#reactivity). No callbacks/promises/streams hell. No async/await/yield virus.
44
- - Automatic [BEM](https://en.bem.info/methodology/naming-convention/)-attributes generation for elements.
45
-
46
- # Benchmarks
47
-
48
- - [$hyoo_bench_list](https://github.com/hyoo-ru/bench.hyoo.ru/tree/master/list) - Frameworks comparison ([online](https://bench.hyoo.ru/list/#sort=fill/sample=angular-1-5-5~mol~native-html~react-15-3-2~native-dom))
49
- - [ToDoMVC benchmark](https://github.com/hyoo-ru/todomvc/tree/master/benchmark) ([online](https://hyoo-ru.github.io/todomvc/benchmark/#sample=angular2%7Eangularjs%7Eknockoutjs%7Emol%7Epolymer%7Ereact-alt%7Evanillajs%7Evue#sort=fill#))
50
- - [WebPageTest - Loading progress of ToDOMVC applications on some frameworks](https://www.webpagetest.org/video/compare.php?tests=161217_V8_6RFK%2C161217_G9_6RFM%2C161217_YZ_6RFN%2C161217_DM_6RFP%2C161217_2B_6RFQ%2C161217_RJ_6RFR%2C161217_2R_6RFS%2C161217_H5_6RFT%2C161217_CW_6RFV&thumbSize=150&ival=100&end=all)
51
- - [Line charts comparison](https://github.com/hyoo-ru/bench.hyoo.ru/tree/master/chart/rope) ([online](https://bench.hyoo.ru/chart/rope/#sort=fill/sample=hcharts~mol))
52
- - [Bar charts comparison](https://github.com/hyoo-ru/bench.hyoo.ru/tree/master/chart/bar) ([online](https://bench.hyoo.ru/chart/bar/#sort=fill/sample=hcharts~mol))
53
- - [React vs React Fiber vs $mol](https://github.com/nin-jin/sierpinski) ([online](https://nin-jin.github.io/sierpinski))
54
-
55
- # Articles
56
-
57
- - [$mol — лучшее средство от геморроя](https://habr.com/ru/post/341146/) - Quick introduction to $mol
58
- - [$mol: реактивный микромодульный фреймворк](https://habrahabr.ru/post/311172/) - Comprehensive $mol review
59
- - [Объектное Реактивное Программирование](https://habrahabr.ru/post/330466/) - Features of Object Reactive Programming
60
- - [Концепции автоматического тестирования](https://habr.com/ru/post/351430/) - Testing principles
61
- - [Идеальный UI фреймворк](https://habrahabr.ru/post/276747/) - Problems of popular frameworks
62
- - [Принципы написания кода](https://habrahabr.ru/post/236785/) - Code style principles
63
-
64
- # Quick start
65
-
66
- [Video of this process](https://www.youtube.com/watch?v=PyK3if5sgN0)
67
-
68
- ## Create MAM project
69
-
70
- The easiest way is to checkout this [preconfigured MAM repository](http://github.com/hyoo-ru/mam) and start a dev server:
71
-
72
- ```sh
73
- git clone https://github.com/hyoo-ru/mam.git ./mam && cd mam
74
- npm install && npm start
75
- ```
76
-
77
- ## Setup your editor
78
-
79
- - Use MAM directory as root of your project in editor
80
- - [Install VScode intellisense plugin for *.view.tree files](https://marketplace.visualstudio.com/items?itemName=valikov.tree-language-service)
81
- - [Install plugin for *.tree files](https://github.com/nin-jin/tree.d#ide-support)
82
- - [Install .editorconfig plugin](https://editorconfig.org/#download) or use these preferences: **TABs for indents, LF for line endings**.
83
-
84
- ## Create your application component
85
-
86
- Examples use namespace `my` and application name `hello`, but you can use your own namespace and application name.
87
-
88
- Add **web entry point** at `./my/hello/index.html`:
89
-
90
- ```html
91
- <!-- Disable quirks mode -->
92
- <!doctype html>
93
-
94
- <!-- Allow height:100% in body -->
95
- <html style=" height: 100% ">
96
-
97
- <!-- Force utf-8 encoding -->
98
- <meta charset="utf-8" />
99
-
100
- <!-- Disable mobile browser auto zoom, $mol is adaptive -->
101
- <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1" />
102
-
103
- <!-- autobind component to element on load -->
104
- <body mol_view_root="$my_hello">
105
-
106
- <!-- link to autogenerated js bundle -->
107
- <script src="web.js"></script>
108
- ```
109
-
110
- Your application will be served at **`http://localhost:9080/my/hello/`**. Open it. You should refresh page to view your changes.
111
-
112
- Add [**declarative component description**](view) at `./my/hello/hello.view.tree` with string input field and greeting message:
113
-
114
- ```tree
115
- $my_hello $mol_view
116
- sub /
117
- <= Name $mol_string
118
- hint \Name
119
- value?val <=> name?val \
120
- <= message \
121
- ```
122
-
123
- That will be automatically compiled to typescript code like this:
124
-
125
- ```typescript
126
- namespace $ { export class $my_hello extends $mol_view {
127
-
128
- /// name?val \
129
- @ $mol_mem
130
- name( next = '' ) {
131
- return next
132
- }
133
-
134
- /// Name $mol_string
135
- /// hint \Name
136
- /// value?val <=> name?val
137
- @ $mol_mem
138
- Name() {
139
- const obj = new $mol_string
140
- obj.hint = () => "Name" ,
141
- obj.value = next => this.name( next ) ,
142
- return obj
143
- }
144
-
145
- /// message \
146
- message() {
147
- return ""
148
- }
149
-
150
- /// sub /
151
- /// <= Name
152
- /// <= message
153
- sub() {
154
- return [ this.Name() , this.message() ]
155
- }
156
-
157
- } }
158
- ```
159
-
160
- Add **your behaviour** at `./my/hello/hello.view.ts` by extending generated class:
161
-
162
- ```typescript
163
- namespace $.$$ {
164
- export class $my_hello extends $.$my_hello {
165
-
166
- message() {
167
- let name = this.name()
168
- return name && `Hello, ${name}!`
169
- }
170
-
171
- }
172
- }
173
- ```
174
-
175
- Add **tests for your behaviour** at `./my/hello/hello.test.ts`
176
-
177
- ```typescript
178
- namespace $.$$ {
179
-
180
- $mol_test({
181
-
182
- 'Generating greeting message'() {
183
-
184
- const app = new $my_hello
185
- app.name( 'Jin' )
186
-
187
- $mol_assert_equal( app.message() , 'Hello, Jin!' )
188
-
189
- }
190
-
191
- })
192
-
193
- }
194
- ```
195
-
196
- Add **styles** at `./my/hello/hello.view.css`:
197
-
198
- ```css
199
- /* Styling BEM-block by autogenerated attribute */
200
- [my_hello] {
201
- display: flex;
202
- flex-direction: column;
203
- align-items: center;
204
- font: 1.5rem/1 sans-serif;
205
- box-shadow: var(--mol_skin_light_outline);
206
- flex: 1 1 auto;
207
- align-self: stretch;
208
- margin: 0;
209
- }
210
-
211
- /* Styling BEM-element by autogenerated attribute */
212
- [my_hello_name] {
213
- flex-grow: 0;
214
- margin: 1rem;
215
- width: 14rem;
216
- }
217
- ```
218
-
219
- [That is all!](https://mol.js.org/app/hello/-)
220
-
221
- # Tutorials
222
-
223
- - [$mol_app_calc: вечеринка электронных таблиц](https://github.com/nin-jin/HabHub/issues/10)
224
- - [$hyoo_bench: готовим JS бенчмарки быстро и просто](https://github.com/nin-jin/HabHub/issues/8)
225
- - [$mol_app_habhub: чтение статей с GitHub](https://github.com/nin-jin/HabHub/issues/5)
226
-
227
- # Rationale
228
-
229
- ## Zero configuration
230
- Instead of ensuring configurability by any means, $mol concentrates on everything working good directly out of the box and does not bother $mol's developer by a typical configuration process. (Nevertheless, this doesn't exclude setup for your needs if required)
231
-
232
- For example if you download **[base MAM-project](http://github.com/hyoo-ru/mam)** you'll get this:
233
-
234
- **Building of JS and CSS bundles for different platforms.** A bundle can be built for any module. This bundle would contain sources of that module and sources of all other modules on which that module depends on. There also would not be any redundant modules in the bundle.
235
-
236
- Here is a full set of supported bundles:
237
-
238
- - `-/web.js` - JS for browser
239
- - `-/web.d.ts` - TypeScript definitions
240
- - `-/web.test.js` - JS with tests for a browser
241
- - `-/web.deps.json` - map of dependencies modules for browser
242
- - `-/web.locale=en.json` - strings pulled from ```*.view.tree``` and ```*.locale=en.json``` sources
243
- - `-/node.js` - JS for NodeJS
244
- - `-/node.test.js` - JS with tests for NodeJS
245
- - `-/node.deps.json` - a map of dependencies modules for NodeJS
246
-
247
- **Support of Source Maps**. Sources are compiled and integrate to maps, they are fully self-sufficient.
248
-
249
- **Development server**, which compiles bundles as needed. For example, when `http://localhost:9080/hyoo/todomvc/-/web.js` is requested, the `js` bundle is built from `hyoo/todomvc` for `web` environment. Rebuilding occurs only if any source files are changed.
250
-
251
- **Transpilling of modern CSS into CSS supported by browsers** ([postcss-cssnext](https://github.com/MoOx/postcss-cssnext)): vendor prefixes and variables etc.
252
-
253
- **Transpilling [TypeScript](https://github.com/Microsoft/TypeScript) into JS**.
254
- In TS configuration enabled support decorators and disabled implicit `any` type, to prevent missing typing by change.
255
-
256
- **Watching dependencies by fact of using** and automatic inclusion of the needed modules on further bundling. You don't need to write `include` and `require`. All you need is to refer instance by full name like `$mol_state_arg` and `$mol.state.arg` (depending on its definition) in `*.ts`, `*.view.ts`, `*.view.tree` and `*.jam.js` files. Dependencies in CSS files are looked for by entries like `[mol_check_checked]` , `[mol_check_checked=` and `.mol_check_checked`.
257
-
258
- ## Lego components
259
-
260
- $mol uses the component approach to building interfaces, however **every component is self-sufficient** and can be used as a self-sufficient application. Small components are aggregated inside larger components etc.
261
-
262
- Unlike another frameworks, $mol does not isolate the internals of its components. Vice versa, a comfortable mechanism is provided for developers to configure them, the creator of the component doesn't have to do any additional actions.
263
-
264
- For example, to set the list of sub components you need to redefine `sub` property in view.tree
265
-
266
- ```tree
267
- Confirm_delte $mol_row sub /
268
- <= Yes $mol_button_minor title \Yes
269
- <= No $mol_button_major title \No
270
- ```
271
-
272
- Or the same code in TypeScript would be:
273
-
274
- ```typescript
275
- @ $mol_mem
276
- Confirm_delete() {
277
- return $mol_row.make({
278
- sub : ()=> [ this.Yes() , this.No() ] ,
279
- })
280
- }
281
- ```
282
-
283
- In both variants the compiler would verify the existence of the property and correspondence of the signature. Normally you don't need to work with fields of the object directly, all definable properties
284
- are public and can be safely overloaded.
285
-
286
- Details about viewers and `view.tree` language: [$mol_view](view).
287
-
288
- ## Lazyness
289
-
290
- [$mol_view](view) implements lazy rendering. [$mol_scroll](scroll) watches scroll position and suggests the view height to embedded components. [$mol_list](list) knows the view height and minimal sizes of the embedded components, it excludes components definitely outside viewport from rendering. And all other components report their minimal size through `minimal_height` property.
291
-
292
- ```
293
- $my_icon $mol_view
294
- minimal_height 16
295
- ```
296
-
297
- As the result opening of any window occurs instantly. It's independent from output data size. And since data would not be rendered, any requests would not be proceeded. This allows us to download them partly, when they are needed. Such a feature is possible due to reactive architecture, that penetrates through all layers of the application.
298
-
299
- ## Reactivity
300
-
301
- Unlike control-flow architectures, $mol implements the data-flow architecture. All applications are defined as a set of classes having properties. Every property is defined as some function from another property (and properties of another classes too). Properties, which were called while processing a function are saved as dependencies of current property. When their values change, all dependent properties would be invalidated cascading. Calling a non relevant property would lead to its pre-actualization.
302
-
303
- In this way the whole application at the execution stage represents a huge tree of dependencies, with a special property at the root of the tree, which in case of invalidation would actualize itself automatically. And as any property always knows, whether something depends on it or not, then it is given a simple and reliable mechanism of controlling lifecycle of objects - they are created when dependence appears and are destroyed when nothing depends on them. This solves two fundamental problems: resources leaks and cache invalidation.
304
-
305
- Besides, the reactive architecture allows us to abstract code elegantly from asynchronous operations. If the function can't return value at the moment, it can throw `Promise` and is marked as part of the tree as "waiting of results". When result is retrieved, it can be inserted into property directly and an application would be reconstructed for the new state.
306
-
307
- ```typescript
308
- namespace $ {
309
- export class $my_greeter {
310
-
311
- @ $mol_mem
312
- greeting() : string {
313
- const user_name = $mol_fetch.json( 'https://example.org/profile' ).name
314
- return `Hello, ${ user_name }!`
315
- }
316
-
317
- }
318
- }
319
- ```
320
-
321
- Details: [$mol_mem](mem), [$mol_atom2](atom2).
322
-
323
- ## Debugging
324
-
325
- $mol pays special attention to debugging possibilities and research of how its code works.
326
-
327
- A human friendly `id` is automatically formed for every DOM-element, e.g. `$hyoo_todomvc.root(0).taskRow(0).titler()`, which is a valid javascript code, that could be executed in a console, returning a link to the component, which the DOM-element corresponds to. Unfolding the content of the component you'd see names and values for its fields like:
328
-
329
- ```
330
- $hyoo_todomvc
331
- dom_node() : div#$hyoo_todomvc.root(0)
332
- task(1474385802391) : Object
333
- task(1474386443175) : Object
334
- taskRow(0) : $hyoo_todomvc_task_rowRow
335
- taskRow(1) : $hyoo_todomvc_task_rowRow
336
- taskrows() : Array[2]
337
- ```
338
-
339
- The name of the field corresponds to calling the property, the content of the field would be available through. And thanks to naming classes and functions by underscoring, you always know which class instance you're looking at and can briefly find it in the code by searching the substring.
340
-
341
- # Modules
342
-
343
- ## Flow
344
-
345
- - **[$mol_fiber](fiber)** - suspendable tasks
346
- - **[$mol_atom2](atom2)** - reactive container
347
- - **[$mol_log2](log2)** - logging
348
- - **[$mol_import](import)** - dynamic sources import
349
-
350
- ## Object model
351
-
352
- - **[$mol_mem](mem)** - reactive property decorator
353
- - **[$mol_object](object)** - components base class
354
-
355
- ## Functions
356
-
357
- - **[$mol_const](const)** - const value returning function
358
- - **[$mol_func_name](func/name)** - name of function
359
- - **[$mol_func_sandbox](func/sandbox)** - sandbox for safe code evaluation
360
-
361
- ## Collections
362
-
363
- - **[$mol_range2](range2)** - lazy array
364
- - **[$mol_maybe](maybe)** - [maybe monad](https://en.wikipedia.org/wiki/Monad_(functional_programming)#The_Maybe_monad)
365
- - **[$mol_conform](conform)** - object tree reconciler
366
- - **[$mol_dict](dict)** - useful native `Map` extension
367
-
368
- ## [State modules](state)
369
-
370
- - **[$mol_state_arg](state/arg)** - arguments state (location/argv)
371
- - **[$mol_state_local](state/local)** - persistent local state (localStorage)
372
- - **[$mol_state_session](state/session)** - session temporary state (sessionStorage)
373
- - **[$mol_state_history](state/history)** - browser history bound state
374
- - **[$mol_state_stack](state/stack)** - state of current stack of execution
375
- - **[$mol_state_time](state/time)** - reactive current time stamp
376
-
377
- ## Simple components
378
-
379
- - **[$mol_view](view)** - reactive view model base class with lazy error-proof renderer
380
- - **[$mol_ghost](ghost)** - node-less wrapper for another view
381
- - **[$mol_filler](filler)** - lorem ipsum
382
- - **[$mol_svg](svg)** - svg base components
383
- - **[$mol_status](status)** - prints error status of some property
384
- - **[$mol_speck](speck)** - attention speck
385
-
386
- ## Simple controls
387
-
388
- - **[$mol_link](link)** - navigation link
389
- - **[$mol_button](button)** - button
390
- - **[$mol_check](check)** - check box
391
- - **[$mol_switch](switch)** - radio buttons
392
- - **[$mol_select](select)** - select with search and lazy rendering support
393
- - **[$mol_string](string)** - one string input control
394
- - **[$mol_textarea](textarea)** - multiple line input control
395
- - **[$mol_search](search)** - search string with suggests support
396
- - **[$mol_number](number)** - one number input control
397
- - **[$mol_code](code)** - bar code scanner
398
- - **[$mol_portion](portion)** - portion visualizer
399
-
400
- ## Layout components
401
-
402
- - **[$mol_scroll](scroll)** - scroll pane with position saving
403
- - **[$mol_tiler](tiler)** - items in row with balanced wrapping
404
- - **[$mol_row](row)** - items in row with wrapping and padding between
405
- - **[$mol_bar](bar)** - group of controls as own control
406
- - **[$mol_list](list)** - vertical list of rows
407
- - **[$mol_labeler](labeler)** - labeled content
408
- - **[$mol_section](section)** - section with header
409
- - **[$mol_book](book)** - horizontal stack of pages
410
- - **[$mol_page](page)** - page with header, body and footer
411
- - **[$mol_deck](deck)** - deck of panels with tab bar
412
- - **[$mol_card](card)** - card with content
413
-
414
- ## Plugin components
415
-
416
- - **[$mol_nav](nav)** - keyboard navigation
417
- - **[$mol_meter](meter)** - real time element size monitoring
418
-
419
- ## Complex components
420
-
421
- - **[$mol_form](form)** - forms with validators
422
- - **[$mol_demo](demo)** - demonstrates widget in various screens
423
- - **[$mol_attach](attach)** - preview list and attach button
424
- - **[$mol_cost](cost)** - prints currency values
425
- - **[$mol_message](message)** - user message
426
-
427
- ## Charts
428
-
429
- - **[$mol_chart](chart)** - Plot pane with legend
430
- - **[$mol_chart_legend](chart/legend)** - Simple legend for charts
431
- - **[$mol_plot_pane](plot/pane)** - Pane for multiple graphs
432
- - **[$mol_plot_graph](plot/graph)** - Plot graph base class
433
- - **[$mol_plot_bar](plot/bar)** - Bar graph
434
- - **[$mol_plot_line](plot/line)** - Linear graph
435
- - **[$mol_plot_dot](plot/dot)** - Dots graph
436
- - **[$mol_plot_fill](plot/fill)** - Filling graph
437
- - **[$mol_plot_group](plot/group)** - Group of graph as single graph
438
- - **[$mol_plot_ruler_vert](plot/ruler/vert)** - Verical ruler
439
- - **[$mol_plot_ruler_hor](plot/ruler/hor)** - Horizontal ruler
440
- - **[$mol_plot_mark_hor](plot/mark/hor)** - Horizontal markers
441
-
442
- ## Data formats
443
-
444
- - **[$mol_tree](tree)** - [tree format](https://github.com/nin-jin/tree.d) (`view.tree` language described at [$mol_view](view))
445
-
446
- ## Math
447
-
448
- - **[$mol_graph](graph)** - graph algorithms
449
- - **[$mol_unit](unit)** - typed number value
450
- - **[$mol_merge_dict](merge/dict)** - merge two dictionaries to new one
451
-
452
- ## Resources
453
-
454
- - **[$mol_logo](logo)** - $mol logotypes
455
- - **[$mol_icon](icon)** - css styled icons
456
- - **[$mol_skin](skin)** - theming
457
- - **[$mol_style](style)** - css-in-ts
458
-
459
- ## Testing
460
-
461
- - **[$mol_test](test)** - unit testing
462
- - **[$mol_stub](stub)** - stub data generators
463
-
464
- ## API
465
-
466
- - **[$mol_window](window)** - reactive view port configuration
467
- - **[$mol_fetch](fetch)** - Reactive [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
468
- - **[$mol_webdav](webdav)** - Reactive [WebDAV](https://wikipedia.org/wiki/WebDAV) client
469
- - **[$mol_file](file)** - isomorphic reactive file system wrapper
470
- - **[$mol_exec](exec)** - synchronous execute of system command
471
- - **[$mol_cordova](cordova)** - [Apache Cordova](https://cordova.apache.org) API
472
-
473
- ## Time
474
-
475
- - **[$mol_time_moment](time/moment)** - [time moment](https://en.wikipedia.org/wiki/ISO_8601#Dates) representation with iso8601 support
476
- - **[$mol_time_duration](time/duration)** - [time duration](https://en.wikipedia.org/wiki/ISO_8601#Durations) representation with iso8601 support
477
- - **[$mol_time_interval](time/interval)** - [time interval](https://en.wikipedia.org/wiki/ISO_8601#Time_intervals) representation with iso8601 support
478
- - **[$mol_state_time](state/time)** - reactive current time stamp
479
- - **[$mol_date](date)** - date picker
480
- - **[$mol_calendar](calendar)** - days of month as table
481
-
482
- ## Maps
483
-
484
- - **[$mol_map_yandex](map/yandex)** - [Yandex Maps](https://tech.yandex.ru/maps/doc/jsapi/2.1/)
485
-
486
- ## Web Services
487
-
488
- - **[$mol_github](github)** - [GitHub API](https://developer.github.com/v3/)
489
- - **[$mol_chat](chat)** - GitHub based comments everywere
490
-
491
- ## Building
492
-
493
- - **[$mol_build](build)** - MAM builder
494
- - **[$mol_build_server](build/server)** - MAM developer server
495
-
496
- ## Usage from NPM ecosystem
497
-
498
- You can manually build any $mol module as standalone lib:
499
-
500
- ```
501
- git clone https://github.com/hyoo-ru/mam.git ./mam
502
- cd mam
503
- npm install
504
- npm start path/to/module
505
- cp path/to/module/-/* your/build/directory
506
- ```
507
-
508
- Some libs are already published to NPM:
509
-
510
- - [$mol_data](data) - Static typed DTO with strict runtime validation and user friendly error messages.
511
- - [$mol_strict](strict) - Makes JS runtime more strict.
512
- - [$mol_time](time) - Proper date/time/duration/interval arithmetic.
513
- - [$mol_type](type) - TypeScript meta types for complex logic.
514
- - [$hyoo_crowd](https://github.com/hyoo-ru/crowd.hyoo.ru) - Conflict-free Reinterpretable Ordered Washed Data.
515
-
516
- All of them are very small, powerfull and fastest. Use it for your pleasure.
517
-
518
- # Contributors
519
-
520
- This project exists thanks to all the people who contribute.
521
-
522
- - [nin-jin](https://github.com/nin-jin)
523
- - [ar2r13](https://github.com/ar2r13)
524
- - [zerkalica](https://github.com/zerkalica)
525
- - [muleronko](https://github.com/muleronko)
526
- - [slava-viktorov](https://github.com/slava-viktorov)
527
- - [CONTRIBUTING](https://github.com/hyoo-ru/mol/blob/master/CONTRIBUTING.md)
528
-
529
- # Cool stuff
530
-
531
- - **[Commits visualization](http://ghv.artzub.com/#repo=mam_mol&user=hyoo-ru&climit=100000)**
532
- - **[Sources visualization](http://veniversum.me/git-visualizer/?owner=hyoo-ru&repo=mam_mol)**
533
-
534
- # Donate
535
-
536
- - **[Shut up and take my money](http://yasobe.ru/na/mol)**