UNPKG

13.8 kBJavaScriptView Raw
1'use strict';
2
3import 'ts-polyfill/lib/es2016-array-include';
4import 'ts-polyfill/lib/es2017-object';
5import 'ts-polyfill/lib/es2017-string';
6import 'ts-polyfill/lib/es2018-async-iterable'; // for-await-of
7
8import 'ts-polyfill/lib/es2018-promise';
9import 'ts-polyfill/lib/es2019-array';
10import 'ts-polyfill/lib/es2019-object';
11import 'ts-polyfill/lib/es2019-string';
12import 'ts-polyfill/lib/es2020-string';
13import { ComponentEngine } from './core/engine/componentEngine';
14import { RenderingEngine } from './core/engine/engine';
15import { Injector } from './core/injector';
16import { State } from './core/state';
17
18class Factory {
19 create(type) {
20 return new type();
21 }
22
23} // tslint:disable-next-line:max-classes-per-file
24
25
26export class Nails {
27 constructor(object) {
28 this.state = new State();
29
30 if (typeof object.methods.onInit !== 'undefined') {
31 object.methods.onInit();
32 }
33
34 if (object.hasOwnProperty('el')) {
35 this.state.element = object.el;
36 } else {
37 console.error('NailsJS cannot be initalized, because no element was specified');
38 }
39
40 if (object.hasOwnProperty('data')) {
41 this.state.data = object.data;
42 }
43
44 if (object.hasOwnProperty('methods')) {
45 this.state.methods = object.methods;
46 }
47
48 if (typeof object.components === 'undefined') {
49 this.state.components = [];
50 } else {
51 if (Array.isArray(object.components)) {
52 this.state.components = object.components;
53 } else {
54 this.state.components = [];
55 }
56 }
57
58 this.engine = new RenderingEngine(this.state);
59 this.componentEngine = new ComponentEngine(this.state, this.engine, this, object.routings);
60 this.setUpProxy();
61 this.injector = new Injector(this.state);
62 this.prepareInjector(object.declarations);
63 this.state.addInjector(this.injector);
64 this.engine.indexDOM();
65 this.componentEngine.renderComponents();
66 this.engine.setTitle();
67
68 this.state.methods.getState = function () {
69 return this.state;
70 };
71
72 if (typeof this.state.methods.onMounted !== 'undefined') {
73 this.state.methods.onMounted(this.state);
74 }
75 }
76
77 prepareInjector(arr) {
78 const factory = new Factory();
79
80 if (!Array.isArray(arr)) {
81 console.warn('Cannot iterate over declarations, since they are not an array');
82 return;
83 }
84
85 for (const d of arr) {
86 const instance = factory.create(d);
87 this.injector.insert(instance);
88 }
89 }
90
91 notifyDOM(target, prop, value) {
92 const refs = this.state.findElementsByObject(target, prop);
93
94 if (refs === [] || refs.length === 0) {
95 return;
96 }
97
98 for (const ref of refs) {
99 this.engine.updateInterpolatedElement(ref.element, ref.content);
100 this.engine.executeDirectivesOnElement(ref.element, false);
101 }
102
103 return true;
104 }
105
106 setUpProxy() {
107 if (typeof window.Proxy !== 'undefined') {
108 const handler = {
109 state: this.state,
110 // tslint:disable-next-line: object-literal-sort-keys
111 notifyDom: this.notifyDOM,
112 engine: this.engine,
113
114 get(target, prop, receiver) {
115 return target[prop];
116 },
117
118 set(target, prop, value) {
119 target[prop] = value;
120 this.notifyDom(target, prop, '');
121 return true;
122 }
123
124 };
125 const proxy = new Proxy(this.state.data, handler);
126 this.state.data = proxy;
127 }
128 }
129
130}
131//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9uYWlscy50cyJdLCJuYW1lcyI6WyJDb21wb25lbnRFbmdpbmUiLCJSZW5kZXJpbmdFbmdpbmUiLCJJbmplY3RvciIsIlN0YXRlIiwiRmFjdG9yeSIsImNyZWF0ZSIsInR5cGUiLCJOYWlscyIsImNvbnN0cnVjdG9yIiwib2JqZWN0Iiwic3RhdGUiLCJtZXRob2RzIiwib25Jbml0IiwiaGFzT3duUHJvcGVydHkiLCJlbGVtZW50IiwiZWwiLCJjb25zb2xlIiwiZXJyb3IiLCJkYXRhIiwiY29tcG9uZW50cyIsIkFycmF5IiwiaXNBcnJheSIsImVuZ2luZSIsImNvbXBvbmVudEVuZ2luZSIsInJvdXRpbmdzIiwic2V0VXBQcm94eSIsImluamVjdG9yIiwicHJlcGFyZUluamVjdG9yIiwiZGVjbGFyYXRpb25zIiwiYWRkSW5qZWN0b3IiLCJpbmRleERPTSIsInJlbmRlckNvbXBvbmVudHMiLCJzZXRUaXRsZSIsImdldFN0YXRlIiwib25Nb3VudGVkIiwiYXJyIiwiZmFjdG9yeSIsIndhcm4iLCJkIiwiaW5zdGFuY2UiLCJpbnNlcnQiLCJub3RpZnlET00iLCJ0YXJnZXQiLCJwcm9wIiwidmFsdWUiLCJyZWZzIiwiZmluZEVsZW1lbnRzQnlPYmplY3QiLCJsZW5ndGgiLCJyZWYiLCJ1cGRhdGVJbnRlcnBvbGF0ZWRFbGVtZW50IiwiY29udGVudCIsImV4ZWN1dGVEaXJlY3RpdmVzT25FbGVtZW50Iiwid2luZG93IiwiUHJveHkiLCJoYW5kbGVyIiwibm90aWZ5RG9tIiwiZ2V0IiwicmVjZWl2ZXIiLCJzZXQiLCJwcm94eSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsT0FBTyxzQ0FBUDtBQUNBLE9BQU8sK0JBQVA7QUFDQSxPQUFPLCtCQUFQO0FBQ0EsT0FBTyx1Q0FBUCxDLENBQWdEOztBQUNoRCxPQUFPLGdDQUFQO0FBQ0EsT0FBTyw4QkFBUDtBQUNBLE9BQU8sK0JBQVA7QUFDQSxPQUFPLCtCQUFQO0FBQ0EsT0FBTywrQkFBUDtBQUNBLFNBQVNB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ZGtDLFFBQUFBLEdBQUcsQ0FBQ2QsTUFBRCxFQUFjQyxJQUFkLEVBQXlCYyxRQUF6QixFQUF3QztBQUN6QyxpQkFBT2YsTUFBTSxDQUFDQyxJQUFELENBQWI7QUFDRCxTQVJhOztBQVNkZSxRQUFBQSxHQUFHLENBQUNoQixNQUFELEVBQWNDLElBQWQsRUFBeUJDLEtBQXpCLEVBQXdDO0FBQ3pDRixVQUFBQSxNQUFNLENBQUNDLElBQUQsQ0FBTixHQUFlQyxLQUFmO0FBQ0EsZUFBS1csU0FBTCxDQUFlYixNQUFmLEVBQXVCQyxJQUF2QixFQUE2QixFQUE3QjtBQUNBLGlCQUFPLElBQVA7QUFDRDs7QUFiYSxPQUFoQjtBQWdCQSxZQUFNZ0IsS0FBSyxHQUFHLElBQUlOLEtBQUosQ0FBVSxLQUFLM0MsS0FBTCxDQUFXUSxJQUFyQixFQUEyQm9DLE9BQTNCLENBQWQ7QUFDQSxXQUFLNUMsS0FBTCxDQUFXUSxJQUFYLEdBQWtCeUMsS0FBbEI7QUFDRDtBQUNGOztBQTlGZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5pbXBvcnQgJ3RzLXBvbHlmaWxsL2xpYi9lczIwMTYtYXJyYXktaW5jbHVkZSc7XG5pbXBvcnQgJ3RzLXBvbHlmaWxsL2xpYi9lczIwMTctb2JqZWN0JztcbmltcG9ydCAndHMtcG9seWZpbGwvbGliL2VzMjAxNy1zdHJpbmcnO1xuaW1wb3J0ICd0cy1wb2x5ZmlsbC9saWIvZXMyMDE4LWFzeW5jLWl0ZXJhYmxlJzsgLy8gZm9yLWF3YWl0LW9mXG5pbXBvcnQgJ3RzLXBvbHlmaWxsL2xpYi9lczIwMTgtcHJvbWlzZSc7XG5pbXBvcnQgJ3RzLXBvbHlmaWxsL2xpYi9lczIwMTktYXJyYXknO1xuaW1wb3J0ICd0cy1wb2x5ZmlsbC9saWIvZXMyMDE5LW9iamVjdCc7XG5pbXBvcnQgJ3RzLXBvbHlmaWxsL2xpYi9lczIwMTktc3RyaW5nJztcbmltcG9ydCAndHMtcG9seWZpbGwvbGliL2VzMjAyMC1zdHJpbmcnO1xuaW1wb3J0IHsgQ29tcG9uZW50RW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZS9jb21wb25lbnRFbmdpbmUnO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZS9lbmdpbmUnO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuL2NvcmUvaW5qZWN0b3InO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuL2NvcmUvc3RhdGUnO1xuXG5jbGFzcyBGYWN0b3J5IHtcbiAgcHVibGljIGNyZWF0ZTxUPih0eXBlOiBuZXcgKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgdHlwZSgpO1xuICB9XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtY2xhc3Nlcy1wZXItZmlsZVxuZXhwb3J0IGNsYXNzIE5haWxzIHtcbiAgcHVibGljIHN0YXRlOiBTdGF0ZTtcbiAgcHVibGljIGVuZ2luZTogUmVuZGVyaW5nRW5naW5lO1xuICBwdWJsaWMgY29tcG9uZW50RW5naW5lOiBDb21wb25lbnRFbmdpbmU7XG4gIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3I7XG5cbiAgY29uc3RydWN0b3Iob2JqZWN0OiBhbnkpIHtcbiAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKCk7XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC5tZXRob2RzLm9uSW5pdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9iamVjdC5tZXRob2RzLm9uSW5pdCgpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KCdlbCcpKSB7XG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnQgPSBvYmplY3QuZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05haWxzSlMgY2Fubm90IGJlIGluaXRhbGl6ZWQsIGJlY2F1c2Ugbm8gZWxlbWVudCB3YXMgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoJ2RhdGEnKSkge1xuICAgICAgdGhpcy5zdGF0ZS5kYXRhID0gb2JqZWN0LmRhdGE7XG4gICAgfVxuICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoJ21ldGhvZHMnKSkge1xuICAgICAgdGhpcy5zdGF0ZS5tZXRob2RzID0gb2JqZWN0Lm1ldGhvZHM7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqZWN0LmNvbXBvbmVudHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnN0YXRlLmNvbXBvbmVudHMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY29tcG9uZW50cyA9IG9iamVjdC5jb21wb25lbnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jb21wb25lbnRzID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW5naW5lID0gbmV3IFJlbmRlcmluZ0VuZ2luZSh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmNvbXBvbmVudEVuZ2luZSA9IG5ldyBDb21wb25lbnRFbmdpbmUodGhpcy5zdGF0ZSwgdGhpcy5lbmdpbmUsIHRoaXMsIG9iamVjdC5yb3V0aW5ncyk7XG4gICAgdGhpcy5zZXRVcFByb3h5KCk7XG4gICAgdGhpcy5pbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnByZXBhcmVJbmplY3RvcihvYmplY3QuZGVjbGFyYXRpb25zKTtcbiAgICB0aGlzLnN0YXRlLmFkZEluamVjdG9yKHRoaXMuaW5qZWN0b3IpO1xuICAgIHRoaXMuZW5naW5lLmluZGV4RE9NKCk7XG4gICAgdGhpcy5jb21wb25lbnRFbmdpbmUucmVuZGVyQ29tcG9uZW50cygpO1xuICAgIHRoaXMuZW5naW5lLnNldFRpdGxlKCk7XG4gICAgdGhpcy5zdGF0ZS5tZXRob2RzLmdldFN0YXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0ZS5tZXRob2RzLm9uTW91bnRlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuc3RhdGUubWV0aG9kcy5vbk1vdW50ZWQodGhpcy5zdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByZXBhcmVJbmplY3RvcihhcnI6IFtdKSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IGl0ZXJhdGUgb3ZlciBkZWNsYXJhdGlvbnMsIHNpbmNlIHRoZXkgYXJlIG5vdCBhbiBhcnJheScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGQgb2YgYXJyKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGZhY3RvcnkuY3JlYXRlKGQpO1xuICAgICAgdGhpcy5pbmplY3Rvci5pbnNlcnQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBub3RpZnlET00odGFyZ2V0OiBhbnksIHByb3A6IGFueSwgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlZnMgPSB0aGlzLnN0YXRlLmZpbmRFbGVtZW50c0J5T2JqZWN0KHRhcmdldCwgcHJvcCk7XG4gICAgaWYgKHJlZnMgPT09IFtdIHx8IHJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHtcbiAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUludGVycG9sYXRlZEVsZW1lbnQocmVmLmVsZW1lbnQsIHJlZi5jb250ZW50KTtcbiAgICAgIHRoaXMuZW5naW5lLmV4ZWN1dGVEaXJlY3RpdmVzT25FbGVtZW50KHJlZi5lbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHNldFVwUHJveHkoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuUHJveHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0ge1xuICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXNcbiAgICAgICAgbm90aWZ5RG9tOiB0aGlzLm5vdGlmeURPTSxcbiAgICAgICAgZW5naW5lOiB0aGlzLmVuZ2luZSxcblxuICAgICAgICBnZXQodGFyZ2V0OiBhbnksIHByb3A6IGFueSwgcmVjZWl2ZXI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQ6IGFueSwgcHJvcDogYW55LCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3RpZnlEb20odGFyZ2V0LCBwcm9wLCAnJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0aGlzLnN0YXRlLmRhdGEsIGhhbmRsZXIpO1xuICAgICAgdGhpcy5zdGF0ZS5kYXRhID0gcHJveHk7XG4gICAgfVxuICB9XG59XG4iXX0=
\No newline at end of file