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.
@@ -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.1.0
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.0.5
614
+ * @version 1.2.5
577
615
  */
578
616
  Alchemy.setMethod(function reloadStylesheets() {
579
617
 
580
- var sheet,
581
- url,
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.1.0
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
- config = hawkejs.scene.helpers.Router.routeConfig(alchemy.current_route);
675
+ let url = hawkejs.scene.helpers.Router.translateCurrentRoute(prefix);
638
676
 
639
- if (!alchemy.current_route || !config) {
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
  });
@@ -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.1.8
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
- constructor = Hawkejs.Model.getClass(name, false);
258
+
259
+ if (name == '') {
260
+ constructor = Hawkejs.Model;
261
+ } else {
262
+ constructor = Hawkejs.Model.getClass(name, false);
263
+ }
259
264
  } else {
260
- constructor = Blast.Classes.Hawkejs.Model.getClass(name);
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) {
@@ -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
- sass = alchemy.use('sass');
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.1.0
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
- sass.render({
973
- data : source,
1027
+ const render_options = {
974
1028
  includePaths : ['.'].concat(styleDirs.getSorted()).concat(libpath.dirname(sassPath)),
975
- sourceMapEmbed : alchemy.settings.debug,
976
- sourceMapRoot : '/_sourcemaps/'
977
- }, function gotCss(err, result) {
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);
@@ -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
  *
@@ -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 = new Classes.Hawkejs.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.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.8",
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.16",
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.49.8",
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" : ">=10.21.0"
73
+ "node" : ">=14.0.0"
73
74
  }
74
75
  }