alchemymvc 1.3.21 → 1.4.0-alpha.1

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.
Files changed (155) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -3
  3. package/lib/app/behaviour/publishable_behaviour.js +5 -5
  4. package/lib/app/behaviour/revision_behaviour.js +10 -10
  5. package/lib/app/behaviour/sluggable_behaviour.js +14 -14
  6. package/lib/app/conduit/electron_conduit.js +9 -9
  7. package/lib/app/conduit/http_conduit.js +13 -13
  8. package/lib/app/conduit/loopback_conduit.js +15 -15
  9. package/lib/app/conduit/socket_conduit.js +43 -43
  10. package/lib/app/config/routes.js +26 -0
  11. package/lib/app/controller/00-default_app_controller.js +21 -0
  12. package/lib/app/controller/alchemy_info_controller.js +12 -12
  13. package/lib/app/datasource/mongo_datasource.js +16 -16
  14. package/lib/app/element/00-default_app_element.js +19 -0
  15. package/lib/app/element/time_ago.js +5 -5
  16. package/lib/app/helper/00-default_app_helper.js +11 -0
  17. package/lib/app/helper/alchemy_helper.js +22 -22
  18. package/lib/app/helper/backed_map.js +1 -1
  19. package/lib/app/helper/breadcrumb.js +10 -10
  20. package/lib/app/helper/client_collection.js +3 -3
  21. package/lib/app/helper/cron.js +29 -29
  22. package/lib/app/helper/enum_values.js +6 -6
  23. package/lib/app/helper/pagination_helper.js +36 -36
  24. package/lib/app/helper/router_helper.js +35 -35
  25. package/lib/app/helper/socket_helper.js +57 -57
  26. package/lib/app/helper/syncable.js +84 -59
  27. package/lib/app/helper_component/paginate_component.js +9 -9
  28. package/lib/app/helper_controller/component.js +1 -1
  29. package/lib/app/helper_controller/conduit.js +31 -31
  30. package/lib/app/helper_controller/controller.js +54 -39
  31. package/lib/app/helper_datasource/00-nosql_datasource.js +624 -70
  32. package/lib/app/helper_datasource/05-fallback_datasource.js +10 -10
  33. package/lib/app/helper_datasource/idb_datasource.js +6 -6
  34. package/lib/app/helper_datasource/indexed_db.js +22 -22
  35. package/lib/app/helper_datasource/remote_datasource.js +5 -5
  36. package/lib/app/helper_error/http_error.js +4 -4
  37. package/lib/app/helper_error/model_error.js +2 -2
  38. package/lib/app/helper_error/validation_error.js +12 -12
  39. package/lib/app/helper_field/00-objectid_field.js +7 -7
  40. package/lib/app/helper_field/05-string_field.js +16 -12
  41. package/lib/app/helper_field/06-text_field.js +2 -4
  42. package/lib/app/helper_field/10-number_field.js +9 -12
  43. package/lib/app/helper_field/11-date_field.js +15 -15
  44. package/lib/app/helper_field/15-local_temporal_field.js +10 -10
  45. package/lib/app/helper_field/20-decimal_field.js +8 -9
  46. package/lib/app/helper_field/belongsto_field.js +1 -1
  47. package/lib/app/helper_field/big_int_field.js +8 -8
  48. package/lib/app/helper_field/boolean_field.js +9 -11
  49. package/lib/app/helper_field/datetime_field.js +3 -3
  50. package/lib/app/helper_field/enum_field.js +13 -8
  51. package/lib/app/helper_field/fixed_decimal_field.js +6 -7
  52. package/lib/app/helper_field/geopoint_field.js +9 -10
  53. package/lib/app/helper_field/habtm_field.js +3 -3
  54. package/lib/app/helper_field/hasoneparent_field.js +1 -1
  55. package/lib/app/helper_field/html_field.js +2 -4
  56. package/lib/app/helper_field/integer_field.js +8 -11
  57. package/lib/app/helper_field/local_date_field.js +5 -5
  58. package/lib/app/helper_field/local_date_time_field.js +5 -5
  59. package/lib/app/helper_field/local_time_field.js +5 -5
  60. package/lib/app/helper_field/mixed_field.js +5 -5
  61. package/lib/app/helper_field/object_field.js +8 -8
  62. package/lib/app/helper_field/password_field.js +3 -3
  63. package/lib/app/helper_field/regexp_field.js +7 -9
  64. package/lib/app/helper_field/schema_field.js +91 -88
  65. package/lib/app/helper_field/settings_field.js +92 -0
  66. package/lib/app/helper_field/time_field.js +6 -6
  67. package/lib/app/helper_field/url_field.js +2 -4
  68. package/lib/app/helper_model/00-base_criteria.js +662 -0
  69. package/lib/app/helper_model/05-criteria_expressions.js +605 -0
  70. package/lib/app/helper_model/10-model_criteria.js +1182 -0
  71. package/lib/app/helper_model/data_provider.js +2 -2
  72. package/lib/app/helper_model/document.js +103 -92
  73. package/lib/app/helper_model/document_list.js +14 -14
  74. package/lib/app/helper_model/field_config.js +11 -11
  75. package/lib/app/helper_model/field_set.js +17 -17
  76. package/lib/app/helper_model/model.js +203 -124
  77. package/lib/app/helper_model/remote_data_provider.js +2 -2
  78. package/lib/app/helper_validator/00_validator.js +16 -16
  79. package/lib/app/helper_validator/not_empty_validator.js +9 -9
  80. package/lib/app/model/00-default_app_model.js +18 -0
  81. package/lib/app/model/05-system_model.js +27 -0
  82. package/lib/app/model/{alchemy_migration_model.js → system_migration_model.js} +4 -4
  83. package/lib/app/model/system_setting_model.js +154 -0
  84. package/lib/app/model/{alchemy_task_history_model.js → system_task_history_model.js} +7 -7
  85. package/lib/app/model/{alchemy_task_model.js → system_task_model.js} +11 -11
  86. package/lib/bootstrap.js +22 -312
  87. package/lib/class/accumulator.js +5 -5
  88. package/lib/class/behaviour.js +5 -5
  89. package/lib/class/component.js +3 -3
  90. package/lib/class/conduit.js +203 -163
  91. package/lib/class/controller.js +42 -42
  92. package/lib/class/datasource.js +74 -79
  93. package/lib/class/document.js +74 -95
  94. package/lib/class/document_list.js +5 -5
  95. package/lib/class/element.js +17 -17
  96. package/lib/class/error.js +3 -3
  97. package/lib/class/field.js +169 -91
  98. package/lib/class/field_value.js +6 -6
  99. package/lib/class/helper.js +3 -3
  100. package/lib/class/inode.js +17 -17
  101. package/lib/class/inode_dir.js +12 -12
  102. package/lib/class/inode_file.js +50 -25
  103. package/lib/class/inode_list.js +4 -4
  104. package/lib/class/migration.js +4 -4
  105. package/lib/class/model.js +182 -168
  106. package/lib/class/path_definition.js +22 -22
  107. package/lib/class/path_evaluator.js +5 -5
  108. package/lib/class/path_param_definition.js +7 -7
  109. package/lib/class/plugin.js +312 -0
  110. package/lib/class/postponement.js +29 -29
  111. package/lib/class/reciprocal.js +8 -8
  112. package/lib/class/route.js +33 -33
  113. package/lib/class/router.js +73 -73
  114. package/lib/class/schema.js +21 -21
  115. package/lib/class/schema_client.js +73 -67
  116. package/lib/class/session.js +63 -29
  117. package/lib/class/session_scene.js +4 -4
  118. package/lib/class/sitemap.js +16 -16
  119. package/lib/class/task.js +39 -39
  120. package/lib/class/task_service.js +43 -47
  121. package/lib/{init → core}/alchemy.js +413 -374
  122. package/lib/{init/functions.js → core/alchemy_functions.js} +171 -108
  123. package/lib/core/alchemy_load_functions.js +715 -0
  124. package/lib/core/base.js +50 -62
  125. package/lib/core/client_alchemy.js +144 -152
  126. package/lib/core/client_base.js +39 -52
  127. package/lib/core/discovery.js +16 -18
  128. package/lib/core/middleware.js +54 -43
  129. package/lib/core/{routing.js → prefix.js} +14 -16
  130. package/lib/core/setting.js +1684 -0
  131. package/lib/core/stage.js +758 -0
  132. package/lib/scripts/create_constants.js +119 -0
  133. package/lib/{init/languages.js → scripts/create_languages.js} +5 -5
  134. package/lib/scripts/create_settings.js +449 -0
  135. package/lib/scripts/create_shared_constants.js +95 -0
  136. package/lib/scripts/create_stages.js +55 -0
  137. package/lib/scripts/init_alchemy.js +51 -0
  138. package/lib/{init/requirements.js → scripts/preload_modules.js} +15 -2
  139. package/lib/scripts/setup_devwatch.js +238 -0
  140. package/lib/stages/00-load_core.js +342 -0
  141. package/lib/stages/05-load_app.js +57 -0
  142. package/lib/stages/10-datasource.js +61 -0
  143. package/lib/stages/15-tasks.js +27 -0
  144. package/lib/stages/20-settings.js +68 -0
  145. package/lib/stages/50-routes.js +218 -0
  146. package/lib/stages/90-server.js +347 -0
  147. package/package.json +5 -7
  148. package/lib/app/helper_model/criteria.js +0 -2294
  149. package/lib/app/helper_model/db_query.js +0 -1488
  150. package/lib/app/routes.js +0 -11
  151. package/lib/core/socket.js +0 -171
  152. package/lib/init/constants.js +0 -158
  153. package/lib/init/devwatch.js +0 -238
  154. package/lib/init/load_functions.js +0 -973
  155. package/lib/stages.js +0 -513
@@ -0,0 +1,119 @@
1
+ const libpath = require('path'),
2
+ libfs = require('fs');
3
+
4
+ /**
5
+ * Path to the directory of the server.js file
6
+ *
7
+ * @author Jelle De Loecker <jelle@elevenways.be>
8
+ * @since 0.0.1
9
+ * @version 1.0.4
10
+ *
11
+ * @type {string}
12
+ */
13
+ DEFINE('PATH_ROOT', process.env.PATH_ROOT || libpath.dirname(require.main.janeway_required || require.main.filename));
14
+
15
+ /**
16
+ * Path to the directory of the base app folder
17
+ *
18
+ * @author Jelle De Loecker <jelle@elevenways.be>
19
+ * @since 0.0.1
20
+ * @version 0.4.0
21
+ *
22
+ * @type {string}
23
+ */
24
+ DEFINE('PATH_APP', libpath.resolve(PATH_ROOT, 'app'));
25
+
26
+ /**
27
+ * Path to the temporary directory
28
+ *
29
+ * @author Jelle De Loecker <jelle@elevenways.be>
30
+ * @since 0.0.1
31
+ * @version 0.4.0
32
+ *
33
+ * @type {string}
34
+ */
35
+ DEFINE('PATH_TEMP', libpath.resolve(PATH_ROOT, 'temp'));
36
+
37
+ /**
38
+ * Path to the core lib path
39
+ *
40
+ * @author Jelle De Loecker <jelle@elevenways.be>
41
+ * @since 0.0.1
42
+ * @version 0.4.0
43
+ *
44
+ * @type {string}
45
+ */
46
+ DEFINE('PATH_CORE', libpath.resolve(__dirname, '..'));
47
+
48
+ /**
49
+ * Resolve a core path
50
+ *
51
+ * @author Jelle De Loecker <jelle@elevenways.be>
52
+ * @since 1.4.0
53
+ * @version 1.4.0
54
+ */
55
+ DEFINE(function resolveCorePath(...args) {
56
+ return libpath.resolve(PATH_CORE, ...args);
57
+ });
58
+
59
+ /**
60
+ * Require a core path
61
+ *
62
+ * @author Jelle De Loecker <jelle@elevenways.be>
63
+ * @since 1.4.0
64
+ * @version 1.4.0
65
+ */
66
+ DEFINE(function requireCorePath(...args) {
67
+ return Blast.require(resolveCorePath(...args), {client: false});
68
+ });
69
+
70
+ /**
71
+ * Require all files in a directory
72
+ *
73
+ * @author Jelle De Loecker <jelle@elevenways.be>
74
+ * @since 1.4.0
75
+ * @version 1.4.0
76
+ */
77
+ DEFINE(function requireCorePathAll(...args) {
78
+
79
+ let path = resolveCorePath(...args),
80
+ result = {};
81
+
82
+ for (let filename of libfs.readdirSync(path)) {
83
+ let name = filename.beforeLast('.');
84
+ result[name] = Blast.require(libpath.resolve(path, filename), {client: false});
85
+ }
86
+
87
+ return result;
88
+ });
89
+
90
+ /**
91
+ * Debug value
92
+ * Actually not a constant, will be changed later
93
+ *
94
+ * @author Jelle De Loecker <jelle@elevenways.be>
95
+ * @since 0.2.0
96
+ * @version 0.4.0
97
+ *
98
+ * @type {boolean}
99
+ */
100
+ global.DEBUG = false;
101
+
102
+ /**
103
+ * Exit the application with an error message
104
+ *
105
+ * @author Jelle De Loecker <jelle@elevenways.be>
106
+ * @since 0.0.1
107
+ * @version 0.4.0
108
+ *
109
+ * @type {Function}
110
+ */
111
+ DEFINE('die', function die(...args) {
112
+
113
+ // Print the log
114
+ // @TODO: destroy Janeway first
115
+ // (but blessed can't revert to original state without segfaulting)
116
+ alchemy.Janeway.print(alchemy.SEVERE, args, {level: 2});
117
+
118
+ process.exit();
119
+ });
@@ -226,12 +226,12 @@ for (locale in allLanguages) {
226
226
  * Get a language name by its locale.
227
227
  * Returns the English name by default.
228
228
  *
229
- * @author Jelle De Loecker <jelle@develry.be>
229
+ * @author Jelle De Loecker <jelle@elevenways.be>
230
230
  * @since 0.0.1
231
231
  * @version 0.0.1
232
232
  *
233
- * @param {String} locale The short, 2-character locale code
234
- * @param {Boolean} ownLanguage Return the name in its own language?
233
+ * @param {string} locale The short, 2-character locale code
234
+ * @param {boolean} ownLanguage Return the name in its own language?
235
235
  */
236
236
  Language.get = function getLanguage(locale, ownLanguage) {
237
237
 
@@ -257,11 +257,11 @@ Language.get = function getLanguage(locale, ownLanguage) {
257
257
  /**
258
258
  * Get the locale for the given language
259
259
  *
260
- * @author Jelle De Loecker <jelle@develry.be>
260
+ * @author Jelle De Loecker <jelle@elevenways.be>
261
261
  * @since 0.0.1
262
262
  * @version 0.0.1
263
263
  *
264
- * @param {String} language The full language name (english or own)
264
+ * @param {string} language The full language name (english or own)
265
265
  */
266
266
  Language.getByName = function getByName(language) {
267
267
  language = language.toLowerCase();
@@ -0,0 +1,449 @@
1
+ const SettingNs = Function.getNamespace('Alchemy.Setting');
2
+ const libfs = require('fs');
3
+
4
+ // Create the system settings group
5
+ const system = new Classes.Alchemy.Setting.Group('system', null);
6
+ SettingNs.SYSTEM = system;
7
+
8
+ system.addSetting('environment', {
9
+ type : 'string',
10
+ default : null,
11
+ values : ['dev', 'live', 'preview'],
12
+ description : 'The current environment',
13
+ locked : true,
14
+ requires_restart : true,
15
+ });
16
+
17
+ system.addSetting('name', {
18
+ type : 'string',
19
+ default : null,
20
+ description : 'The package name',
21
+ });
22
+
23
+ const plugins = system.createGroup('plugins');
24
+ SettingNs.PLUGINS = plugins;
25
+
26
+ const network = system.createGroup('network');
27
+
28
+ network.addSetting('port', {
29
+ type : 'primitive',
30
+ default : 3000,
31
+ description : 'The port or socket to listen to',
32
+ locked : true,
33
+ requires_restart : true,
34
+ });
35
+
36
+ network.addSetting('socket', {
37
+ type : 'string',
38
+ default : null,
39
+ description : 'The optional socket file to listen to (higher priority than port)',
40
+ locked : true,
41
+ requires_restart : true,
42
+ });
43
+
44
+ network.addSetting('socketfile_chmod', {
45
+ type : 'string',
46
+ default : null,
47
+ description : 'The chmod to set on the socket file',
48
+ action : function applySocketfileChmod(value, value_instance) {
49
+
50
+ if (!value) {
51
+ return;
52
+ }
53
+
54
+ let socketfile = alchemy.getSetting('network.socket');
55
+
56
+ if (!socketfile) {
57
+ return;
58
+ }
59
+
60
+ libfs.chmodSync(socketfile, value);
61
+ },
62
+ });
63
+
64
+ network.addSetting('assume_https', {
65
+ type : 'boolean',
66
+ default : false,
67
+ description : 'Assume incoming requests are using https',
68
+ });
69
+
70
+ network.addSetting('use_compression', {
71
+ type : 'boolean',
72
+ default : true,
73
+ description : 'Compress responses using gzip/deflate',
74
+ });
75
+
76
+ network.addSetting('use_json_dry_responses', {
77
+ type : 'boolean',
78
+ default : true,
79
+ description : 'Allow use of JSON-dry in non-hawkejs responses',
80
+ locked : true,
81
+ });
82
+
83
+ network.addSetting('use_websockets', {
84
+ type : 'string',
85
+ default : 'optional',
86
+ values : ['optional', 'always', 'never'],
87
+ description : 'Enable websockets',
88
+ });
89
+
90
+ network.addSetting('main_url', {
91
+ type : 'string',
92
+ default : null,
93
+ description : 'The main URL this site is hosted on',
94
+ });
95
+
96
+ const performance = system.createGroup('performance');
97
+
98
+ performance.addSetting('cache', {
99
+ type : 'boolean',
100
+ default : true,
101
+ description : 'Enable caching',
102
+ });
103
+
104
+ performance.addSetting('postpone_requests_on_overload', {
105
+ type : 'boolean',
106
+ default : true,
107
+ description : 'Allow requests postponement/queue when the server is overloaded',
108
+ });
109
+
110
+ performance.addSetting('max_event_loop_lag', {
111
+ type : 'integer',
112
+ default : 70,
113
+ description : 'Detect when this node server is too busy',
114
+ });
115
+
116
+ performance.addSetting('max_system_load', {
117
+ type : 'percentage',
118
+ default : 85,
119
+ description : 'What systemload is considered overloaded, as a total percentage?',
120
+ });
121
+
122
+ performance.addSetting('preload', {
123
+ type : 'boolean',
124
+ default : false,
125
+ description : 'Should the home page & client file be preloaded on boot?',
126
+ requires_restart : true,
127
+ });
128
+
129
+ performance.addSetting('janeway_lag_menu', {
130
+ type : 'boolean',
131
+ default : true,
132
+ description : 'Show the lag menu entry in Janeway',
133
+ requires : 'system.debugging.enable_janeway',
134
+ depends_on : [],
135
+ action : function applyJanewayLagMenu(value, value_instance) {
136
+
137
+ if (!alchemy.Janeway) {
138
+ return;
139
+ }
140
+
141
+ if (!value) {
142
+
143
+ // Remove existing entry
144
+ if (alchemy.Janeway.lag_menu) {
145
+ alchemy.Janeway.lag_menu.remove();
146
+ }
147
+
148
+ return;
149
+ }
150
+
151
+ // Do nothing if it already exists
152
+ if (alchemy.Janeway.lag_menu) {
153
+ return;
154
+ }
155
+
156
+ let lag_menu = alchemy.Janeway.addIndicator('0 ms');
157
+
158
+ if (!lag_menu) {
159
+ return;
160
+ }
161
+
162
+ setInterval(() => {
163
+ lag_menu.setIcon(alchemy.lagInMs() + ' ms');
164
+ alchemy.Janeway.redraw();
165
+ }, 900).unref();
166
+
167
+ alchemy.Janeway.lag_menu = lag_menu;
168
+ },
169
+ });
170
+
171
+ const debugging = system.createGroup('debugging');
172
+
173
+ debugging.addSetting('debug', {
174
+ type : 'boolean',
175
+ default : false,
176
+ });
177
+
178
+ debugging.addSetting('enable_janeway', {
179
+ type : 'boolean',
180
+ default : true,
181
+ description : 'Enable the Janeway TUI',
182
+ locked : true,
183
+ requires_restart : true,
184
+ });
185
+
186
+ debugging.addSetting('info_page', {
187
+ type : 'boolean',
188
+ default : false,
189
+ description : 'Allow access to the info page',
190
+ });
191
+
192
+ debugging.addSetting('silent', {
193
+ type : 'boolean',
194
+ default : false,
195
+ description : 'Do not print certain logs when true',
196
+ });
197
+
198
+ debugging.addSetting('create_source_map', {
199
+ type : 'boolean',
200
+ default : false,
201
+ description : 'Create sourcemaps for client-side assets?',
202
+ });
203
+
204
+ const debug_logging = debugging.createGroup('logging');
205
+
206
+ debug_logging.addSetting('level', {
207
+ type : 'integer',
208
+ default : 4,
209
+ });
210
+
211
+ debug_logging.addSetting('trace', {
212
+ type : 'boolean',
213
+ default : false,
214
+ });
215
+
216
+ debugging.addSetting('kill_on_file_change', {
217
+ type : 'boolean',
218
+ default : false,
219
+ description : 'Kill the process when a JavaScript file changes',
220
+ });
221
+
222
+ const frontend = system.createGroup('frontend');
223
+
224
+ frontend.addSetting('title', {
225
+ type : 'string',
226
+ default : null,
227
+ description : 'The title of the site',
228
+ action : function applyTitle(value, value_instance) {
229
+
230
+ if (!value || !alchemy.Janeway) {
231
+ return;
232
+ }
233
+
234
+ alchemy.Janeway.setTitle(value);
235
+ },
236
+ });
237
+
238
+ frontend.addSetting('title_suffix', {
239
+ type : 'string',
240
+ default : null,
241
+ description : 'Optional suffix to add to route titles',
242
+ });
243
+
244
+ frontend.addSetting('appcache', {
245
+ type : 'boolean',
246
+ default : false,
247
+ description : 'Enable the use of the appcache manifest',
248
+ });
249
+
250
+ const stylesheet = frontend.createGroup('stylesheet');
251
+
252
+ stylesheet.addSetting('minify', {
253
+ type : 'boolean',
254
+ default : true,
255
+ });
256
+
257
+ stylesheet.addSetting('enable_less', {
258
+ type : 'boolean',
259
+ default : true,
260
+ description : 'Allow the usage of LESS',
261
+ });
262
+
263
+ stylesheet.addSetting('enable_scss', {
264
+ type : 'boolean',
265
+ default : true,
266
+ description : 'Allow the usage of SCSS',
267
+ });
268
+
269
+ stylesheet.addSetting('enable_post', {
270
+ type : 'boolean',
271
+ default : true,
272
+ description : 'Allow the usage of PostCSS',
273
+ });
274
+
275
+ const javascript = frontend.createGroup('javascript');
276
+
277
+ javascript.addSetting('minify', {
278
+ type : 'boolean',
279
+ default : true,
280
+ });
281
+
282
+ javascript.addSetting('enable_babel', {
283
+ type : 'boolean',
284
+ default : false,
285
+ description : 'Allow the usage of Babel for compiling client-side scripts',
286
+ });
287
+
288
+ const ui = frontend.createGroup('ui');
289
+
290
+ ui.addSetting('main_logo', {
291
+ type : 'path',
292
+ default : '/alchemy-logo.png',
293
+ description : 'The main logo to use',
294
+ });
295
+
296
+ ui.addSetting('layout', {
297
+ type : 'object',
298
+ default : {
299
+
300
+ // Root layout
301
+ root : {
302
+
303
+ // The root layout file to use
304
+ view : 'layouts/body',
305
+
306
+ // The main block to use in this root layout file
307
+ block : 'main',
308
+ },
309
+ },
310
+ description : 'Public layout settings, exposed as `alchemy_layout`',
311
+ });
312
+
313
+ const cookies = frontend.createGroup('cookies');
314
+
315
+ cookies.addSetting('enabled', {
316
+ type : 'boolean',
317
+ default : true,
318
+ description : 'Allow cookies',
319
+ });
320
+
321
+ cookies.addSetting('domain', {
322
+ type : 'string',
323
+ default : null,
324
+ description : 'The domain for which the cookies should be set',
325
+ });
326
+
327
+ const sessions = system.createGroup('sessions');
328
+
329
+ sessions.addSetting('enabled', {
330
+ type : 'boolean',
331
+ default : true,
332
+ description : 'Enable sessions',
333
+ });
334
+
335
+ sessions.addSetting('cookie_name', {
336
+ type : 'string',
337
+ default : 'alchemy_sid',
338
+ description : 'The name of the session cookie',
339
+ });
340
+
341
+ sessions.addSetting('duration', {
342
+ type : 'duration',
343
+ default : '20 minutes',
344
+ description : 'The duration of a session',
345
+ });
346
+
347
+ sessions.addSetting('janeway_menu', {
348
+ type : 'boolean',
349
+ default : false,
350
+ description : 'Show a list of all sessions in the Janeway TUI',
351
+ requires : 'system.debugging.enable_janeway',
352
+ depends_on : [],
353
+ action : function createJanewaySessionMenu(value, value_instance) {
354
+
355
+ if (!value) {
356
+
357
+ // Remove existing entry
358
+ if (alchemy.Janeway.session_menu) {
359
+ alchemy.Janeway.session_menu.remove();
360
+ }
361
+
362
+ return;
363
+ }
364
+
365
+ // Do nothing if it already exists
366
+ if (alchemy.Janeway.session_menu) {
367
+ return;
368
+ }
369
+
370
+ let session_menu = alchemy.Janeway.addIndicator('⌨ ');
371
+
372
+ if (!session_menu) {
373
+ return;
374
+ }
375
+
376
+ session_menu.addItem({
377
+ title : 'Current active browser sessions:',
378
+ weight : Infinity,
379
+ }, () => {
380
+ console.log('All sessions:', this.sessions);
381
+ });
382
+
383
+ alchemy.Janeway.session_menu = session_menu;
384
+ },
385
+ });
386
+
387
+ const data_management = system.createGroup('data_management');
388
+
389
+ data_management.addSetting('process_body', {
390
+ type : 'boolean',
391
+ default : true,
392
+ description : 'Process the body of incoming requests',
393
+ });
394
+
395
+ data_management.addSetting('file_hash_algorithm', {
396
+ type : 'string',
397
+ default : 'sha1',
398
+ description : 'The default file hash method',
399
+ });
400
+
401
+ data_management.addSetting('model_query_cache_duration', {
402
+ type : 'duration',
403
+ default : '60 minutes',
404
+ description : 'How long query results are cached',
405
+ });
406
+
407
+ data_management.addSetting('model_assoc_parallel_limit', {
408
+ type : 'integer',
409
+ default : 8,
410
+ description : 'How many assoc data queries are allowed to run at the same time',
411
+ });
412
+
413
+ data_management.addSetting('allow_fallback_translations', {
414
+ type : 'boolean',
415
+ default : false,
416
+ description : 'Should fallback translations be allowed?',
417
+ });
418
+
419
+ const task = system.createGroup('task');
420
+
421
+ task.addSetting('janeway_menu', {
422
+ type : 'boolean',
423
+ default : true,
424
+ description : 'Show the task menu in Janeway',
425
+ requires : 'system.debugging.enable_janeway',
426
+ depends_on : [],
427
+ action : function createJanewayTaskMenu(value, value_instance) {
428
+ if (value) {
429
+ return alchemy.task_service.createJanewayTaskMenu();
430
+ }
431
+ },
432
+ });
433
+
434
+ const errors = system.createGroup('errors');
435
+
436
+ errors.addSetting('handle_uncaught', {
437
+ type : 'boolean',
438
+ default : true,
439
+ description : 'Handle uncaught errors',
440
+ });
441
+
442
+ // Here are some old settings that might have to be removed:
443
+ // multicast?
444
+ // offline_clients
445
+ // log_trace settings?
446
+ // less import paths?
447
+ //
448
+ // hawkejs_client?
449
+ // search_for_modules?
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Function to define global constants
3
+ *
4
+ * @author Jelle De Loecker <jelle@elevenways.be>
5
+ * @since 0.4.0
6
+ * @version 1.4.0
7
+ *
8
+ * @type {Function}
9
+ */
10
+ function DEFINE(name, value) {
11
+
12
+ if (typeof name == 'function') {
13
+ value = name;
14
+ name = value.name;
15
+ }
16
+
17
+ Object.defineProperty(globalThis, name, {value: value});
18
+ }
19
+
20
+ /**
21
+ * Use DEFINE for itself
22
+ *
23
+ * @author Jelle De Loecker <jelle@elevenways.be>
24
+ * @since 0.4.0
25
+ * @version 0.4.0
26
+ *
27
+ * @type {Function}
28
+ */
29
+ DEFINE('DEFINE', DEFINE);
30
+
31
+ /**
32
+ * Create a global to __Protoblast
33
+ *
34
+ * @author Jelle De Loecker <jelle@elevenways.be>
35
+ * @since 0.2.0
36
+ * @version 0.4.0
37
+ *
38
+ * @type {Informer}
39
+ */
40
+ DEFINE('Blast', __Protoblast);
41
+
42
+ /**
43
+ * All classes will be collected here
44
+ *
45
+ * @author Jelle De Loecker <jelle@elevenways.be>
46
+ * @since 0.3.0
47
+ * @version 0.3.0
48
+ *
49
+ * @type {Object}
50
+ */
51
+ DEFINE('Classes', Blast.Classes);
52
+
53
+ /**
54
+ * Available types
55
+ *
56
+ * @author Jelle De Loecker <jelle@elevenways.be>
57
+ * @since 1.3.0
58
+ * @version 1.3.0
59
+ *
60
+ * @type {Object}
61
+ */
62
+ DEFINE('Types', Blast.Types);
63
+
64
+ /**
65
+ * The new Local Date/Time classes
66
+ *
67
+ * @author Jelle De Loecker <jelle@elevenways.be>
68
+ * @since 1.3.20
69
+ * @version 1.3.20
70
+ */
71
+ DEFINE('LocalDateTime', Classes.Develry.LocalDateTime);
72
+ DEFINE('LocalDate', Classes.Develry.LocalDate);
73
+ DEFINE('LocalTime', Classes.Develry.LocalTime);
74
+
75
+ /**
76
+ * The new Decimal classes
77
+ *
78
+ * @author Jelle De Loecker <jelle@elevenways.be>
79
+ * @since 1.3.20
80
+ * @version 1.3.20
81
+ */
82
+ DEFINE('Decimal', Classes.Develry.Decimal);
83
+ DEFINE('MutableDecimal', Classes.Develry.MutableDecimal);
84
+ DEFINE('FixedDecimal', Classes.Develry.FixedDecimal);
85
+ DEFINE('MutableFixedDecimal', Classes.Develry.MutableFixedDecimal);
86
+
87
+ /**
88
+ * The Trail class:
89
+ * A class that represents a path in an object
90
+ *
91
+ * @author Jelle De Loecker <jelle@elevenways.be>
92
+ * @since 1.4.0
93
+ * @version 1.4.0
94
+ */
95
+ DEFINE('Trail', Classes.Develry.Trail);