alchemymvc 1.2.2 → 1.2.5
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/lib/app/helper/router_helper.js +135 -3
- package/lib/app/helper_component/paginate_component.js +3 -1
- package/lib/app/helper_controller/conduit.js +20 -0
- package/lib/app/{field → helper_field}/password_field.js +10 -8
- package/lib/app/helper_field/schema_field.js +20 -12
- package/lib/app/helper_model/criteria.js +67 -15
- package/lib/app/helper_model/document.js +51 -5
- package/lib/app/helper_model/document_list.js +25 -2
- package/lib/app/helper_model/field_config.js +38 -15
- package/lib/app/helper_model/field_set.js +22 -1
- package/lib/app/helper_model/model.js +41 -13
- package/lib/class/conduit.js +87 -9
- package/lib/class/document.js +55 -13
- package/lib/class/document_list.js +33 -1
- package/lib/class/element.js +19 -14
- package/lib/class/field.js +14 -3
- package/lib/class/model.js +22 -18
- package/lib/class/route.js +92 -61
- package/lib/class/router.js +80 -3
- package/lib/class/schema.js +5 -3
- package/lib/class/schema_client.js +38 -2
- package/lib/core/base.js +42 -5
- package/lib/core/client_alchemy.js +75 -43
- package/lib/core/client_base.js +13 -3
- package/lib/core/middleware.js +72 -7
- package/lib/init/alchemy.js +16 -0
- package/lib/init/requirements.js +1 -1
- package/package.json +6 -5
|
@@ -24,6 +24,17 @@ var Alchemy = Function.inherits('Alchemy.Client.Base', function Alchemy() {
|
|
|
24
24
|
this.sent_subscriptions = [];
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* A reference to the main hawkejs instance
|
|
29
|
+
*
|
|
30
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
31
|
+
* @since 1.2.3
|
|
32
|
+
* @version 1.2.3
|
|
33
|
+
*/
|
|
34
|
+
Alchemy.setProperty(function hawkejs() {
|
|
35
|
+
return window.hawkejs;
|
|
36
|
+
});
|
|
37
|
+
|
|
27
38
|
/**
|
|
28
39
|
* Called in the onScene static method of the Alchemy helper
|
|
29
40
|
*
|
|
@@ -175,6 +186,26 @@ Alchemy.setMethod(function __d(domain, key, parameters) {
|
|
|
175
186
|
return hawkejs.scene.generalView.__d(domain, key, parameters);
|
|
176
187
|
});
|
|
177
188
|
|
|
189
|
+
/**
|
|
190
|
+
* Set the permission checker
|
|
191
|
+
*
|
|
192
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
193
|
+
* @since 1.2.5
|
|
194
|
+
* @version 1.2.5
|
|
195
|
+
*
|
|
196
|
+
* @param {Object} instance
|
|
197
|
+
*/
|
|
198
|
+
Alchemy.setMethod(function setPermissionChecker(instance) {
|
|
199
|
+
|
|
200
|
+
if (instance) {
|
|
201
|
+
if (typeof instance.conduitHasPermission != 'function') {
|
|
202
|
+
throw new Error('Permission checker needs to have a `conduitHasPermisison` method');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
this.permission_checker = instance;
|
|
207
|
+
});
|
|
208
|
+
|
|
178
209
|
/**
|
|
179
210
|
* Cast to an object id
|
|
180
211
|
*
|
|
@@ -458,7 +489,7 @@ Alchemy.setMethod(function linkup(type, data, cb) {
|
|
|
458
489
|
*
|
|
459
490
|
* @author Jelle De Loecker <jelle@develry.be>
|
|
460
491
|
* @since 0.3.0
|
|
461
|
-
* @version 1.
|
|
492
|
+
* @version 1.2.5
|
|
462
493
|
*
|
|
463
494
|
* @param {Object} variables
|
|
464
495
|
* @param {Object} render_data
|
|
@@ -485,6 +516,13 @@ Alchemy.setMethod(function markLinks(variables, render_data) {
|
|
|
485
516
|
// Get the newly set breadcrumb
|
|
486
517
|
page_breadcrumb = variables.__breadcrumb;
|
|
487
518
|
|
|
519
|
+
// Get all the language switcher anchors
|
|
520
|
+
elements = document.querySelectorAll('[data-alchemy-language-switch]');
|
|
521
|
+
|
|
522
|
+
for (i = 0; i < elements.length; i++) {
|
|
523
|
+
hawkejs.scene.general_renderer.helpers.Router.updateLanguageSwitcher(elements[i]);
|
|
524
|
+
}
|
|
525
|
+
|
|
488
526
|
// Get all the elements with a breadcrumb set
|
|
489
527
|
elements = document.querySelectorAll('[data-breadcrumb],[data-breadcrumbs]');
|
|
490
528
|
|
|
@@ -573,25 +611,30 @@ Alchemy.setMethod(function markLinks(variables, render_data) {
|
|
|
573
611
|
*
|
|
574
612
|
* @author Jelle De Loecker <jelle@develry.be>
|
|
575
613
|
* @since 1.0.0
|
|
576
|
-
* @version 1.
|
|
614
|
+
* @version 1.2.5
|
|
577
615
|
*/
|
|
578
616
|
Alchemy.setMethod(function reloadStylesheets() {
|
|
579
617
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
i;
|
|
583
|
-
|
|
584
|
-
for (i = 0; i < document.styleSheets.length; i++) {
|
|
585
|
-
sheet = document.styleSheets[i];
|
|
618
|
+
for (let i = 0; i < document.styleSheets.length; i++) {
|
|
619
|
+
let sheet = document.styleSheets[i];
|
|
586
620
|
|
|
587
621
|
if (!sheet.href) {
|
|
588
622
|
continue;
|
|
589
623
|
}
|
|
590
624
|
|
|
591
|
-
url = new RURL(sheet.href);
|
|
625
|
+
let url = new RURL(sheet.href);
|
|
592
626
|
url.param('last_reload', Date.now());
|
|
593
627
|
|
|
594
|
-
sheet.ownerNode.href = String(url);
|
|
628
|
+
//sheet.ownerNode.href = String(url);
|
|
629
|
+
|
|
630
|
+
let new_element = alchemy.hawkejs.createElement('link');
|
|
631
|
+
new_element.setAttribute('rel', 'stylesheet');
|
|
632
|
+
new_element.setAttribute('href', String(url));
|
|
633
|
+
document.head.append(new_element);
|
|
634
|
+
|
|
635
|
+
new_element.addEventListener('load', e => {
|
|
636
|
+
sheet.ownerNode.remove();
|
|
637
|
+
});
|
|
595
638
|
}
|
|
596
639
|
});
|
|
597
640
|
|
|
@@ -600,22 +643,17 @@ Alchemy.setMethod(function reloadStylesheets() {
|
|
|
600
643
|
*
|
|
601
644
|
* @author Jelle De Loecker <jelle@develry.be>
|
|
602
645
|
* @since 0.4.1
|
|
603
|
-
* @version 1.
|
|
646
|
+
* @version 1.2.5
|
|
604
647
|
*/
|
|
605
648
|
Alchemy.setMethod(function switchLanguage(prefix) {
|
|
606
649
|
|
|
607
|
-
var config,
|
|
608
|
-
target,
|
|
609
|
-
temp,
|
|
610
|
-
url,
|
|
611
|
-
key,
|
|
612
|
-
e;
|
|
613
|
-
|
|
614
650
|
if (prefix) {
|
|
615
651
|
if (typeof prefix != 'string') {
|
|
652
|
+
let target,
|
|
653
|
+
temp;
|
|
616
654
|
|
|
617
655
|
if (prefix instanceof Event) {
|
|
618
|
-
e = prefix;
|
|
656
|
+
let e = prefix;
|
|
619
657
|
target = e.srcElement || e.target;
|
|
620
658
|
e.preventDefault();
|
|
621
659
|
} else if (typeof prefix.getAttribute == 'function') {
|
|
@@ -634,35 +672,13 @@ Alchemy.setMethod(function switchLanguage(prefix) {
|
|
|
634
672
|
}
|
|
635
673
|
}
|
|
636
674
|
|
|
637
|
-
|
|
675
|
+
let url = hawkejs.scene.helpers.Router.translateCurrentRoute(prefix);
|
|
638
676
|
|
|
639
|
-
if (!
|
|
677
|
+
if (!url) {
|
|
640
678
|
// Unknown current route, defaulting to /prefix
|
|
641
679
|
return doNavigate('/' + prefix);
|
|
642
680
|
}
|
|
643
681
|
|
|
644
|
-
// Get the url string
|
|
645
|
-
url = hawkejs.scene.helpers.Router.routeUrl(alchemy.current_route, alchemy.current_url_params, {locale: prefix});
|
|
646
|
-
|
|
647
|
-
// Turn it into a url object
|
|
648
|
-
url = RURL.parse(url);
|
|
649
|
-
|
|
650
|
-
if (url && url.pathname == '/') {
|
|
651
|
-
url.pathname = '/' + prefix + url.pathname;
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
// Add the get queries
|
|
655
|
-
if (alchemy.current_url && alchemy.current_url.search) {
|
|
656
|
-
for (key in alchemy.current_url.query) {
|
|
657
|
-
|
|
658
|
-
if (key == 'hajax' || key == 'h_diversion' || key == 'htop') {
|
|
659
|
-
continue;
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
url.addQuery(key, alchemy.current_url.query[key]);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
|
|
666
682
|
url = String(url);
|
|
667
683
|
|
|
668
684
|
return doNavigate(url);
|
|
@@ -1080,4 +1096,20 @@ Alchemy.setMethod(function syncDataWithServer() {
|
|
|
1080
1096
|
Alchemy.setMethod(function createSchema(parent) {
|
|
1081
1097
|
let schema = new Classes.Alchemy.Client.Schema(parent);
|
|
1082
1098
|
return schema;
|
|
1099
|
+
});
|
|
1100
|
+
|
|
1101
|
+
/**
|
|
1102
|
+
* Get a client-side model
|
|
1103
|
+
*
|
|
1104
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1105
|
+
* @since 1.2.4
|
|
1106
|
+
* @version 1.2.4
|
|
1107
|
+
*
|
|
1108
|
+
* @param {String} name
|
|
1109
|
+
* @param {Object} options
|
|
1110
|
+
*
|
|
1111
|
+
* @return {Model}
|
|
1112
|
+
*/
|
|
1113
|
+
Alchemy.setMethod(function getClientModel(name, init, options) {
|
|
1114
|
+
return Classes.Alchemy.Client.Base.prototype.getModel.call(this, name, init, options);
|
|
1083
1115
|
});
|
package/lib/core/client_base.js
CHANGED
|
@@ -233,7 +233,7 @@ ClientBase.setStatic(function mapEventToMethod(event_name, method_name) {
|
|
|
233
233
|
*
|
|
234
234
|
* @author Jelle De Loecker <jelle@develry.be>
|
|
235
235
|
* @since 1.0.0
|
|
236
|
-
* @version 1.
|
|
236
|
+
* @version 1.2.4
|
|
237
237
|
*
|
|
238
238
|
* @param {String} name
|
|
239
239
|
* @param {Object} options
|
|
@@ -255,9 +255,19 @@ ClientBase.setMethod(function getModel(name, init, options) {
|
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
if (Blast.isBrowser) {
|
|
258
|
-
|
|
258
|
+
|
|
259
|
+
if (name == '') {
|
|
260
|
+
constructor = Hawkejs.Model;
|
|
261
|
+
} else {
|
|
262
|
+
constructor = Hawkejs.Model.getClass(name, false);
|
|
263
|
+
}
|
|
259
264
|
} else {
|
|
260
|
-
|
|
265
|
+
|
|
266
|
+
if (name == '') {
|
|
267
|
+
constructor = Blast.Classes.Hawkejs.Model;
|
|
268
|
+
} else {
|
|
269
|
+
constructor = Blast.Classes.Hawkejs.Model.getClass(name);
|
|
270
|
+
}
|
|
261
271
|
}
|
|
262
272
|
|
|
263
273
|
if (!constructor) {
|
package/lib/core/middleware.js
CHANGED
|
@@ -15,6 +15,7 @@ var publicDirs = alchemy.shared('public.directories', new Deck()),
|
|
|
15
15
|
libpath = alchemy.use('path'),
|
|
16
16
|
nodent_compiler,
|
|
17
17
|
regenerator_runtime,
|
|
18
|
+
sass_functions,
|
|
18
19
|
babel_polyfill,
|
|
19
20
|
babel_preset,
|
|
20
21
|
babel_async,
|
|
@@ -30,7 +31,61 @@ if (alchemy.settings.css_less !== false) {
|
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
if (alchemy.settings.css_sass) {
|
|
33
|
-
|
|
34
|
+
|
|
35
|
+
// Try to use the embedded DART sass
|
|
36
|
+
sass = alchemy.use('sass-embedded');
|
|
37
|
+
|
|
38
|
+
if (!sass) {
|
|
39
|
+
sass = alchemy.use('sass');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
sass_functions = {
|
|
43
|
+
'alchemy_settings($name)': function(name) {
|
|
44
|
+
|
|
45
|
+
if (!(name instanceof sass.types.String)) {
|
|
46
|
+
return sass.types.Null.NULL;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
name = name.getValue();
|
|
50
|
+
|
|
51
|
+
let value = Object.path(alchemy.settings, name);
|
|
52
|
+
|
|
53
|
+
if (value == null) {
|
|
54
|
+
value = Object.path(alchemy.plugins, name);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let type = typeof value,
|
|
58
|
+
result;
|
|
59
|
+
|
|
60
|
+
switch (type) {
|
|
61
|
+
case 'string':
|
|
62
|
+
if (value) {
|
|
63
|
+
result = new sass.types.String(value);
|
|
64
|
+
} else {
|
|
65
|
+
result = sass.types.Null.NULL;
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
|
|
69
|
+
case 'number':
|
|
70
|
+
result = new sass.types.Number(value);
|
|
71
|
+
break;
|
|
72
|
+
|
|
73
|
+
case 'boolean':
|
|
74
|
+
result = new sass.types.Boolean(value);
|
|
75
|
+
break;
|
|
76
|
+
|
|
77
|
+
default:
|
|
78
|
+
if (value == null) {
|
|
79
|
+
result = sass.types.Null.NULL;
|
|
80
|
+
} else {
|
|
81
|
+
result = new sass.types.String(''+value);
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
34
89
|
}
|
|
35
90
|
|
|
36
91
|
if (alchemy.settings.css_post !== false) {
|
|
@@ -945,7 +1000,7 @@ Alchemy.setMethod(function getCompiledLessPath(lessPath, options, callback) {
|
|
|
945
1000
|
*
|
|
946
1001
|
* @author Jelle De Loecker <jelle@develry.be>
|
|
947
1002
|
* @since 0.2.0
|
|
948
|
-
* @version 1.
|
|
1003
|
+
* @version 1.2.5
|
|
949
1004
|
*/
|
|
950
1005
|
Alchemy.setMethod(function getCompiledSassPath(sassPath, options, callback) {
|
|
951
1006
|
|
|
@@ -969,12 +1024,22 @@ Alchemy.setMethod(function getCompiledSassPath(sassPath, options, callback) {
|
|
|
969
1024
|
return writeToTemp(source);
|
|
970
1025
|
}
|
|
971
1026
|
|
|
972
|
-
|
|
973
|
-
data : source,
|
|
1027
|
+
const render_options = {
|
|
974
1028
|
includePaths : ['.'].concat(styleDirs.getSorted()).concat(libpath.dirname(sassPath)),
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
1029
|
+
functions : sass_functions,
|
|
1030
|
+
};
|
|
1031
|
+
|
|
1032
|
+
if (alchemy.settings.debug) {
|
|
1033
|
+
render_options.file = sassPath;
|
|
1034
|
+
render_options.sourceMap = 'out.css.map';
|
|
1035
|
+
render_options.sourceMapContents = true;
|
|
1036
|
+
render_options.sourceMapEmbed = true;
|
|
1037
|
+
render_options.sourceMapRoot = '/_sourcemaps/';
|
|
1038
|
+
} else {
|
|
1039
|
+
render_options.data = source;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
sass.render(render_options, function gotCss(err, result) {
|
|
978
1043
|
|
|
979
1044
|
if (err) {
|
|
980
1045
|
console.log(''+err, err);
|
package/lib/init/alchemy.js
CHANGED
|
@@ -1749,6 +1749,22 @@ Alchemy.setMethod(function createSchema(parent) {
|
|
|
1749
1749
|
return schema;
|
|
1750
1750
|
});
|
|
1751
1751
|
|
|
1752
|
+
/**
|
|
1753
|
+
* Get a client-side model
|
|
1754
|
+
*
|
|
1755
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1756
|
+
* @since 1.2.4
|
|
1757
|
+
* @version 1.2.4
|
|
1758
|
+
*
|
|
1759
|
+
* @param {String} name
|
|
1760
|
+
* @param {Object} options
|
|
1761
|
+
*
|
|
1762
|
+
* @return {Model}
|
|
1763
|
+
*/
|
|
1764
|
+
Alchemy.setMethod(function getClientModel(name, init, options) {
|
|
1765
|
+
return Classes.Alchemy.Client.Base.prototype.getModel.call(this, name, init, options);
|
|
1766
|
+
});
|
|
1767
|
+
|
|
1752
1768
|
/**
|
|
1753
1769
|
* The alchemy global, where everything will be stored
|
|
1754
1770
|
*
|
package/lib/init/requirements.js
CHANGED
|
@@ -50,7 +50,7 @@ alchemy.use('less', 'less');
|
|
|
50
50
|
* @link https://npmjs.org/package/hawkejs
|
|
51
51
|
*/
|
|
52
52
|
alchemy.use('hawkejs', 'hawkejs');
|
|
53
|
-
alchemy.hawkejs =
|
|
53
|
+
alchemy.hawkejs = Classes.Hawkejs.Hawkejs.getInstance();
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* The function to detect when everything is too busy
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alchemymvc",
|
|
3
3
|
"description": "MVC framework for Node.js",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.5",
|
|
5
5
|
"author": "Jelle De Loecker <jelle@elevenways.be>",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"alchemy",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"chokidar" : "~3.5.3",
|
|
23
23
|
"formidable" : "~1.2.2",
|
|
24
24
|
"graceful-fs" : "~4.2.9",
|
|
25
|
-
"hawkejs" : "~2.2.
|
|
25
|
+
"hawkejs" : "~2.2.10",
|
|
26
26
|
"jsondiffpatch" : "~0.4.1",
|
|
27
27
|
"mime" : "~3.0.0",
|
|
28
28
|
"minimist" : "~1.2.5",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"mongodb" : "~3.6.6",
|
|
32
32
|
"ncp" : "~2.0.0",
|
|
33
33
|
"postcss" : "~8.4.6",
|
|
34
|
-
"protoblast" : "~0.7.
|
|
34
|
+
"protoblast" : "~0.7.21",
|
|
35
35
|
"semver" : "~7.3.5",
|
|
36
36
|
"socket.io" : "~2.4.0",
|
|
37
37
|
"@11ways/socket.io-stream" : "~0.9.2",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"optionalDependencies": {
|
|
48
48
|
"janeway" : "~0.3.5",
|
|
49
49
|
"less" : "~4.1.1",
|
|
50
|
-
"sass" : "~1.
|
|
50
|
+
"sass" : "~1.53.0",
|
|
51
|
+
"sass-embedded" : "~1.53.0",
|
|
51
52
|
"nodent-compiler" : "~3.2.13",
|
|
52
53
|
"socket.io-client" : "~2.4.0"
|
|
53
54
|
},
|
|
@@ -69,6 +70,6 @@
|
|
|
69
70
|
"main": "lib/bootstrap.js",
|
|
70
71
|
"license": "MIT",
|
|
71
72
|
"engines": {
|
|
72
|
-
"node" : ">=
|
|
73
|
+
"node" : ">=14.0.0"
|
|
73
74
|
}
|
|
74
75
|
}
|