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.
- package/LICENSE +1 -1
- package/README.md +3 -3
- package/lib/app/behaviour/publishable_behaviour.js +5 -5
- package/lib/app/behaviour/revision_behaviour.js +10 -10
- package/lib/app/behaviour/sluggable_behaviour.js +14 -14
- package/lib/app/conduit/electron_conduit.js +9 -9
- package/lib/app/conduit/http_conduit.js +13 -13
- package/lib/app/conduit/loopback_conduit.js +15 -15
- package/lib/app/conduit/socket_conduit.js +43 -43
- package/lib/app/config/routes.js +26 -0
- package/lib/app/controller/00-default_app_controller.js +21 -0
- package/lib/app/controller/alchemy_info_controller.js +12 -12
- package/lib/app/datasource/mongo_datasource.js +16 -16
- package/lib/app/element/00-default_app_element.js +19 -0
- package/lib/app/element/time_ago.js +5 -5
- package/lib/app/helper/00-default_app_helper.js +11 -0
- package/lib/app/helper/alchemy_helper.js +22 -22
- package/lib/app/helper/backed_map.js +1 -1
- package/lib/app/helper/breadcrumb.js +10 -10
- package/lib/app/helper/client_collection.js +3 -3
- package/lib/app/helper/cron.js +29 -29
- package/lib/app/helper/enum_values.js +6 -6
- package/lib/app/helper/pagination_helper.js +36 -36
- package/lib/app/helper/router_helper.js +35 -35
- package/lib/app/helper/socket_helper.js +57 -57
- package/lib/app/helper/syncable.js +84 -59
- package/lib/app/helper_component/paginate_component.js +9 -9
- package/lib/app/helper_controller/component.js +1 -1
- package/lib/app/helper_controller/conduit.js +31 -31
- package/lib/app/helper_controller/controller.js +54 -39
- package/lib/app/helper_datasource/00-nosql_datasource.js +624 -70
- package/lib/app/helper_datasource/05-fallback_datasource.js +10 -10
- package/lib/app/helper_datasource/idb_datasource.js +6 -6
- package/lib/app/helper_datasource/indexed_db.js +22 -22
- package/lib/app/helper_datasource/remote_datasource.js +5 -5
- package/lib/app/helper_error/http_error.js +4 -4
- package/lib/app/helper_error/model_error.js +2 -2
- package/lib/app/helper_error/validation_error.js +12 -12
- package/lib/app/helper_field/00-objectid_field.js +7 -7
- package/lib/app/helper_field/05-string_field.js +16 -12
- package/lib/app/helper_field/06-text_field.js +2 -4
- package/lib/app/helper_field/10-number_field.js +9 -12
- package/lib/app/helper_field/11-date_field.js +15 -15
- package/lib/app/helper_field/15-local_temporal_field.js +10 -10
- package/lib/app/helper_field/20-decimal_field.js +8 -9
- package/lib/app/helper_field/belongsto_field.js +1 -1
- package/lib/app/helper_field/big_int_field.js +8 -8
- package/lib/app/helper_field/boolean_field.js +9 -11
- package/lib/app/helper_field/datetime_field.js +3 -3
- package/lib/app/helper_field/enum_field.js +13 -8
- package/lib/app/helper_field/fixed_decimal_field.js +6 -7
- package/lib/app/helper_field/geopoint_field.js +9 -10
- package/lib/app/helper_field/habtm_field.js +3 -3
- package/lib/app/helper_field/hasoneparent_field.js +1 -1
- package/lib/app/helper_field/html_field.js +2 -4
- package/lib/app/helper_field/integer_field.js +8 -11
- package/lib/app/helper_field/local_date_field.js +5 -5
- package/lib/app/helper_field/local_date_time_field.js +5 -5
- package/lib/app/helper_field/local_time_field.js +5 -5
- package/lib/app/helper_field/mixed_field.js +5 -5
- package/lib/app/helper_field/object_field.js +8 -8
- package/lib/app/helper_field/password_field.js +3 -3
- package/lib/app/helper_field/regexp_field.js +7 -9
- package/lib/app/helper_field/schema_field.js +91 -88
- package/lib/app/helper_field/settings_field.js +92 -0
- package/lib/app/helper_field/time_field.js +6 -6
- package/lib/app/helper_field/url_field.js +2 -4
- package/lib/app/helper_model/00-base_criteria.js +662 -0
- package/lib/app/helper_model/05-criteria_expressions.js +605 -0
- package/lib/app/helper_model/10-model_criteria.js +1182 -0
- package/lib/app/helper_model/data_provider.js +2 -2
- package/lib/app/helper_model/document.js +103 -92
- package/lib/app/helper_model/document_list.js +14 -14
- package/lib/app/helper_model/field_config.js +11 -11
- package/lib/app/helper_model/field_set.js +17 -17
- package/lib/app/helper_model/model.js +203 -124
- package/lib/app/helper_model/remote_data_provider.js +2 -2
- package/lib/app/helper_validator/00_validator.js +16 -16
- package/lib/app/helper_validator/not_empty_validator.js +9 -9
- package/lib/app/model/00-default_app_model.js +18 -0
- package/lib/app/model/05-system_model.js +27 -0
- package/lib/app/model/{alchemy_migration_model.js → system_migration_model.js} +4 -4
- package/lib/app/model/system_setting_model.js +154 -0
- package/lib/app/model/{alchemy_task_history_model.js → system_task_history_model.js} +7 -7
- package/lib/app/model/{alchemy_task_model.js → system_task_model.js} +11 -11
- package/lib/bootstrap.js +22 -312
- package/lib/class/accumulator.js +5 -5
- package/lib/class/behaviour.js +5 -5
- package/lib/class/component.js +3 -3
- package/lib/class/conduit.js +203 -163
- package/lib/class/controller.js +42 -42
- package/lib/class/datasource.js +74 -79
- package/lib/class/document.js +74 -95
- package/lib/class/document_list.js +5 -5
- package/lib/class/element.js +17 -17
- package/lib/class/error.js +3 -3
- package/lib/class/field.js +169 -91
- package/lib/class/field_value.js +6 -6
- package/lib/class/helper.js +3 -3
- package/lib/class/inode.js +17 -17
- package/lib/class/inode_dir.js +12 -12
- package/lib/class/inode_file.js +50 -25
- package/lib/class/inode_list.js +4 -4
- package/lib/class/migration.js +4 -4
- package/lib/class/model.js +182 -168
- package/lib/class/path_definition.js +22 -22
- package/lib/class/path_evaluator.js +5 -5
- package/lib/class/path_param_definition.js +7 -7
- package/lib/class/plugin.js +312 -0
- package/lib/class/postponement.js +29 -29
- package/lib/class/reciprocal.js +8 -8
- package/lib/class/route.js +33 -33
- package/lib/class/router.js +73 -73
- package/lib/class/schema.js +21 -21
- package/lib/class/schema_client.js +73 -67
- package/lib/class/session.js +63 -29
- package/lib/class/session_scene.js +4 -4
- package/lib/class/sitemap.js +16 -16
- package/lib/class/task.js +39 -39
- package/lib/class/task_service.js +43 -47
- package/lib/{init → core}/alchemy.js +413 -374
- package/lib/{init/functions.js → core/alchemy_functions.js} +171 -108
- package/lib/core/alchemy_load_functions.js +715 -0
- package/lib/core/base.js +50 -62
- package/lib/core/client_alchemy.js +144 -152
- package/lib/core/client_base.js +39 -52
- package/lib/core/discovery.js +16 -18
- package/lib/core/middleware.js +54 -43
- package/lib/core/{routing.js → prefix.js} +14 -16
- package/lib/core/setting.js +1684 -0
- package/lib/core/stage.js +758 -0
- package/lib/scripts/create_constants.js +119 -0
- package/lib/{init/languages.js → scripts/create_languages.js} +5 -5
- package/lib/scripts/create_settings.js +449 -0
- package/lib/scripts/create_shared_constants.js +95 -0
- package/lib/scripts/create_stages.js +55 -0
- package/lib/scripts/init_alchemy.js +51 -0
- package/lib/{init/requirements.js → scripts/preload_modules.js} +15 -2
- package/lib/scripts/setup_devwatch.js +238 -0
- package/lib/stages/00-load_core.js +342 -0
- package/lib/stages/05-load_app.js +57 -0
- package/lib/stages/10-datasource.js +61 -0
- package/lib/stages/15-tasks.js +27 -0
- package/lib/stages/20-settings.js +68 -0
- package/lib/stages/50-routes.js +218 -0
- package/lib/stages/90-server.js +347 -0
- package/package.json +5 -7
- package/lib/app/helper_model/criteria.js +0 -2294
- package/lib/app/helper_model/db_query.js +0 -1488
- package/lib/app/routes.js +0 -11
- package/lib/core/socket.js +0 -171
- package/lib/init/constants.js +0 -158
- package/lib/init/devwatch.js +0 -238
- package/lib/init/load_functions.js +0 -973
- 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
|
|
229
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
230
230
|
* @since 0.0.1
|
|
231
231
|
* @version 0.0.1
|
|
232
232
|
*
|
|
233
|
-
* @param {
|
|
234
|
-
* @param {
|
|
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
|
|
260
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
261
261
|
* @since 0.0.1
|
|
262
262
|
* @version 0.0.1
|
|
263
263
|
*
|
|
264
|
-
* @param {
|
|
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);
|