alchemymvc 1.3.22 → 1.4.0-alpha.2

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 +96 -59
  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 +27 -18
  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 +62 -62
  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 +6 -6
  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 +201 -123
  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 +152 -150
  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 +26 -26
  103. package/lib/class/inode_list.js +4 -4
  104. package/lib/class/migration.js +4 -4
  105. package/lib/class/model.js +146 -165
  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 +105 -82
  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 +411 -373
  122. package/lib/{init/functions.js → core/alchemy_functions.js} +113 -91
  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 +27 -50
  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 -979
  155. package/lib/stages.js +0 -515
@@ -9,51 +9,90 @@ var nameCache = {},
9
9
  *
10
10
  * @constructor
11
11
  *
12
- * @author Jelle De Loecker <jelle@develry.be>
12
+ * @author Jelle De Loecker <jelle@elevenways.be>
13
13
  * @since 0.0.1
14
14
  * @version 1.1.0
15
15
  */
16
- var Model = Function.inherits('Alchemy.Base', 'Alchemy.Model', function Model(options) {
16
+ const Model = Function.inherits('Alchemy.Base', 'Alchemy.Model', function Model(options) {
17
17
  this.init(options);
18
18
  });
19
19
 
20
+ /**
21
+ * This is a wrapper class
22
+ */
23
+ Model.makeAbstractClass();
24
+
25
+ /**
26
+ * This wrapper class starts a new group
27
+ */
28
+ Model.startNewGroup();
29
+
20
30
  /**
21
31
  * Set the modelName property after class creation
22
32
  *
23
- * @author Jelle De Loecker <jelle@develry.be>
33
+ * @author Jelle De Loecker <jelle@elevenways.be>
24
34
  * @since 0.2.0
25
- * @version 1.1.0
35
+ * @version 1.4.0
26
36
  */
27
- Model.constitute(function setModelName() {
28
- this.model_name = this.name;
29
- this.setProperty('model_name', this.model_name);
37
+ Model.postInherit(function setModelName() {
38
+
39
+ let base_name = this.name;
40
+ let model_name = base_name;
41
+ let table_prefix = this.table_prefix;
42
+ let namespace = this.namespace;
43
+
44
+ if (namespace.startsWith('Alchemy.Model.') || namespace == 'Alchemy.Model') {
45
+ namespace = namespace.slice(14);
46
+ } else if (namespace.startsWith('Alchemy.Client.Model.') || namespace == 'Alchemy.Client.Model') {
47
+ namespace = namespace.slice(21);
48
+ }
49
+
50
+ this.setStatic('model_namespace', namespace, false);
30
51
 
31
- if (!this.table) {
32
- this.table = this.model_name.tableize();
52
+ let ns = namespace.replaceAll('.', '_');
53
+
54
+ if (!table_prefix && ns) {
55
+ table_prefix = ns.tableize();
56
+ }
57
+
58
+ if (ns) {
59
+ model_name = ns + '_' + model_name;
33
60
  }
61
+
62
+ // The simple name of the model
63
+ this.model_name = model_name;
64
+ this.setProperty('model_name', model_name);
65
+
66
+ let table_name = base_name.tableize();
67
+
68
+ if (table_prefix) {
69
+ table_name = table_prefix + '_' + table_name;
70
+ }
71
+
72
+ this.table = table_name;
34
73
  });
35
74
 
36
75
  /**
37
76
  * This is a model constructor
38
77
  *
39
- * @type {Boolean}
78
+ * @type {boolean}
40
79
  */
41
80
  Model.setStaticProperty('model', true);
42
81
 
43
82
  /**
44
83
  * The cache duration static getter/setter
45
84
  *
46
- * @author Jelle De Loecker <jelle@develry.be>
85
+ * @author Jelle De Loecker <jelle@elevenways.be>
47
86
  * @since 0.1.0
48
87
  * @version 1.0.3
49
88
  *
50
89
  * @property cache_duration
51
- * @type {String}
90
+ * @type {string}
52
91
  */
53
92
  Model.setStaticProperty(function cache_duration() {
54
93
 
55
94
  if (this._cache_duration == null) {
56
- this._cache_duration = alchemy.settings.model_query_cache_duration;
95
+ this._cache_duration = alchemy.settings.data_management.model_query_cache_duration;
57
96
  }
58
97
 
59
98
  return this._cache_duration;
@@ -66,7 +105,7 @@ Model.setStaticProperty(function cache_duration() {
66
105
  /**
67
106
  * Get the cache object
68
107
  *
69
- * @author Jelle De Loecker <jelle@develry.be>
108
+ * @author Jelle De Loecker <jelle@elevenways.be>
70
109
  * @since 0.1.0
71
110
  * @version 1.0.3
72
111
  *
@@ -94,11 +133,11 @@ Model.setStaticProperty(function cache() {
94
133
  /**
95
134
  * Is this an abstract model?
96
135
  *
97
- * @author Jelle De Loecker <jelle@develry.be>
136
+ * @author Jelle De Loecker <jelle@elevenways.be>
98
137
  * @since 1.1.0
99
138
  * @version 1.1.0
100
139
  *
101
- * @type {Boolean}
140
+ * @type {boolean}
102
141
  */
103
142
  Model.setStaticProperty(function is_abstract() {
104
143
 
@@ -130,11 +169,10 @@ Model.setStaticProperty(function is_abstract() {
130
169
  return field_count < 1;
131
170
  });
132
171
 
133
-
134
172
  /**
135
173
  * Get the document class constructor
136
174
  *
137
- * @type {Alchemy.Document}
175
+ * @type {Alchemy.Document}
138
176
  */
139
177
  Model.prepareStaticProperty('Document', function getDocumentClass() {
140
178
  return Classes.Alchemy.Document.Document.getDocumentClass(this);
@@ -143,7 +181,7 @@ Model.prepareStaticProperty('Document', function getDocumentClass() {
143
181
  /**
144
182
  * Get the client document class constructor
145
183
  *
146
- * @type {Hawkejs.Document}
184
+ * @type {Hawkejs.Document}
147
185
  */
148
186
  Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass() {
149
187
  return this.Document.getClientDocumentClass();
@@ -154,7 +192,7 @@ Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass()
154
192
  *
155
193
  * @version 1.1.0
156
194
  *
157
- * @type {Schema}
195
+ * @type {Schema}
158
196
  */
159
197
  Model.staticCompose('schema', function createSchema(doNext) {
160
198
 
@@ -171,7 +209,7 @@ Model.staticCompose('schema', function createSchema(doNext) {
171
209
  schema.setModel(model);
172
210
 
173
211
  // Set the schema name
174
- schema.setName(model.name);
212
+ schema.setName(model.model_name);
175
213
 
176
214
  if (model.prototype.add_basic_fields !== false) {
177
215
 
@@ -206,28 +244,28 @@ Model.setDeprecatedProperty('displayField', 'display_field');
206
244
  /**
207
245
  * The default database config to use
208
246
  *
209
- * @type {String}
247
+ * @type {string}
210
248
  */
211
249
  Model.setProperty('dbConfig', 'default');
212
250
 
213
251
  /**
214
252
  * The default field to use as display
215
253
  *
216
- * @type {String}
254
+ * @type {string}
217
255
  */
218
256
  Model.setProperty('display_field', 'title');
219
257
 
220
258
  /**
221
259
  * Translate is on by default
222
260
  *
223
- * @type {Boolean}
261
+ * @type {boolean}
224
262
  */
225
263
  Model.setProperty('translate', true);
226
264
 
227
265
  /**
228
266
  * Set the name of the primary key field
229
267
  *
230
- * @author Jelle De Loecker <jelle@develry.be>
268
+ * @author Jelle De Loecker <jelle@elevenways.be>
231
269
  * @since 0.1.0
232
270
  * @version 0.1.0
233
271
  */
@@ -236,7 +274,7 @@ Model.setProperty('primary_key', '_id');
236
274
  /**
237
275
  * Should we load the schema from the database?
238
276
  *
239
- * @author Jelle De Loecker <jelle@develry.be>
277
+ * @author Jelle De Loecker <jelle@elevenways.be>
240
278
  * @since 1.1.0
241
279
  * @version 1.1.0
242
280
  */
@@ -245,14 +283,14 @@ Model.setProperty('load_external_schema', false);
245
283
  /**
246
284
  * Object where behaviours are stored
247
285
  *
248
- * @type {Object}
286
+ * @type {Object}
249
287
  */
250
288
  Model.prepareProperty('behaviours', Object);
251
289
 
252
290
  /**
253
291
  * Associations
254
292
  *
255
- * @type {Object}
293
+ * @type {Object}
256
294
  */
257
295
  Model.setProperty(function associations() {
258
296
  return this.schema.associations;
@@ -261,7 +299,7 @@ Model.setProperty(function associations() {
261
299
  /**
262
300
  * Instance access to static cache
263
301
  *
264
- * @type {Expirable}
302
+ * @type {Expirable}
265
303
  */
266
304
  Model.prepareProperty('cache', function cache() {
267
305
  return this.constructor.cache;
@@ -270,7 +308,7 @@ Model.prepareProperty('cache', function cache() {
270
308
  /**
271
309
  * Instance access to static schema
272
310
  *
273
- * @type {Schema}
311
+ * @type {Schema}
274
312
  */
275
313
  Model.setProperty(function schema() {
276
314
  return this.constructor.schema;
@@ -279,26 +317,16 @@ Model.setProperty(function schema() {
279
317
  /**
280
318
  * Is this an abstract model?
281
319
  *
282
- * @type {Boolean}
320
+ * @type {boolean}
283
321
  */
284
322
  Model.setProperty(function is_abstract() {
285
323
  return this.constructor.is_abstract;
286
324
  });
287
325
 
288
- /**
289
- * This is a wrapper class
290
- */
291
- Model.makeAbstractClass();
292
-
293
- /**
294
- * This wrapper class starts a new group
295
- */
296
- Model.startNewGroup();
297
-
298
326
  /**
299
327
  * The connection
300
328
  *
301
- * @type {Object}
329
+ * @type {Object}
302
330
  */
303
331
  Model.prepareProperty('datasource', function datasource() {
304
332
  if (this.table) return Datasource.get(this.dbConfig);
@@ -307,7 +335,7 @@ Model.prepareProperty('datasource', function datasource() {
307
335
  /**
308
336
  * The default sort options
309
337
  *
310
- * @type {Object}
338
+ * @type {Object}
311
339
  */
312
340
  Model.prepareProperty('sort', function sort() {
313
341
  return {[this.primary_key]: -1};
@@ -316,13 +344,13 @@ Model.prepareProperty('sort', function sort() {
316
344
  /**
317
345
  * Check a url value
318
346
  *
319
- * @author Jelle De Loecker <jelle@develry.be>
347
+ * @author Jelle De Loecker <jelle@elevenways.be>
320
348
  * @since 1.0.0
321
349
  * @version 1.2.5
322
350
  *
323
- * @param {String} value The value in the url
324
- * @param {String} name The name of the url parameter
325
- * @param {String} field_name The name of the field to check
351
+ * @param {string} value The value in the url
352
+ * @param {string} name The name of the url parameter
353
+ * @param {string} field_name The name of the field to check
326
354
  * @param {Conduit} conduit The optional conduit
327
355
  *
328
356
  * @return {Pledge}
@@ -369,7 +397,7 @@ Model.setStatic(async function checkPathValue(value, name, field_name, conduit)
369
397
  /**
370
398
  * Add a computed field to this model's schema
371
399
  *
372
- * @author Jelle De Loecker <jelle@elevenways.be>
400
+ * @author Jelle De Loecker <jelle@elevenways.be>
373
401
  * @since 1.3.21
374
402
  * @version 1.3.21
375
403
  *
@@ -397,7 +425,7 @@ Model.setStatic(function addComputedField(name, type, options) {
397
425
  /**
398
426
  * Add a field to this model's schema
399
427
  *
400
- * @author Jelle De Loecker <jelle@develry.be>
428
+ * @author Jelle De Loecker <jelle@elevenways.be>
401
429
  * @since 0.2.0
402
430
  * @version 1.2.21
403
431
  *
@@ -423,11 +451,21 @@ Model.setStatic(function addField(name, type, options) {
423
451
  return field;
424
452
  });
425
453
 
454
+ /**
455
+ * Set the wanted table prefix
456
+ *
457
+ * @author Jelle De Loecker <jelle@elevenways.be>
458
+ * @since 1.4.0
459
+ * @version 1.4.0
460
+ */
461
+ Model.setStatic(function setTablePrefix(prefix) {
462
+ this.setStatic('table_prefix', prefix);
463
+ });
426
464
 
427
465
  /**
428
466
  * Add a behaviour to this model
429
467
  *
430
- * @author Jelle De Loecker <jelle@develry.be>
468
+ * @author Jelle De Loecker <jelle@elevenways.be>
431
469
  * @since 0.2.0
432
470
  * @version 0.2.0
433
471
  */
@@ -439,7 +477,7 @@ Model.setStatic(function addBehaviour(behaviour_name, options) {
439
477
  * Add an association to this model's schema
440
478
  * and set it on the Document as a getter
441
479
  *
442
- * @author Jelle De Loecker <jelle@develry.be>
480
+ * @author Jelle De Loecker <jelle@elevenways.be>
443
481
  * @since 0.2.0
444
482
  * @version 1.2.4
445
483
  */
@@ -456,7 +494,7 @@ Model.setStatic(function addAssociation(type, alias, model_name, options) {
456
494
  /**
457
495
  * Set a method on the document class
458
496
  *
459
- * @author Jelle De Loecker <jelle@develry.be>
497
+ * @author Jelle De Loecker <jelle@elevenways.be>
460
498
  * @since 0.2.0
461
499
  * @version 1.0.6
462
500
  */
@@ -477,7 +515,7 @@ Model.setStatic(function setDocumentMethod(name, fnc) {
477
515
  /**
478
516
  * Set a property on the document class
479
517
  *
480
- * @author Jelle De Loecker <jelle@develry.be>
518
+ * @author Jelle De Loecker <jelle@elevenways.be>
481
519
  * @since 0.2.0
482
520
  * @version 1.0.6
483
521
  */
@@ -494,7 +532,7 @@ Model.setStatic(function setDocumentProperty(name, fnc) {
494
532
  /**
495
533
  * Get a field
496
534
  *
497
- * @author Jelle De Loecker <jelle@develry.be>
535
+ * @author Jelle De Loecker <jelle@elevenways.be>
498
536
  * @since 0.2.0
499
537
  * @version 0.2.0
500
538
  *
@@ -532,22 +570,24 @@ Model.setStatic(function getField(name) {
532
570
  * Get the model's public configuration
533
571
  * (This is used to create the client-side Model instances)
534
572
  *
535
- * @author Jelle De Loecker <jelle@elevenways.be>
573
+ * @author Jelle De Loecker <jelle@elevenways.be>
536
574
  * @since 1.0.0
537
575
  * @version 1.3.1
538
576
  */
539
577
  Model.setStatic(function getClientConfig() {
540
578
 
541
579
  const result = {
542
- name : this.model_name,
543
- schema : this.schema,
544
- primary_key : this.prototype.primary_key,
545
- display_field : this.prototype.display_field,
546
- ancestors : 0,
580
+ class_name : this.name,
581
+ model_name : this.model_name,
582
+ model_namespace : this.model_namespace || undefined,
583
+ schema : this.schema,
584
+ primary_key : this.prototype.primary_key,
585
+ display_field : this.prototype.display_field,
586
+ ancestors : 0,
547
587
  };
548
588
 
549
589
  if (this.super.name != 'Model') {
550
- result.parent = this.super.name;
590
+ result.parent = this.super.model_name;
551
591
 
552
592
  let ancestors = 0,
553
593
  ancestor = this.super;
@@ -566,7 +606,7 @@ Model.setStatic(function getClientConfig() {
566
606
  /**
567
607
  * Initialize behaviours
568
608
  *
569
- * @author Jelle De Loecker <jelle@develry.be>
609
+ * @author Jelle De Loecker <jelle@elevenways.be>
570
610
  * @since 0.2.0
571
611
  * @version 0.2.0
572
612
  *
@@ -590,7 +630,7 @@ Model.setMethod(function initBehaviours() {
590
630
  /**
591
631
  * Enable a behaviour on-the-fly
592
632
  *
593
- * @author Jelle De Loecker <jelle@develry.be>
633
+ * @author Jelle De Loecker <jelle@elevenways.be>
594
634
  * @since 0.0.1
595
635
  * @version 0.2.0
596
636
  */
@@ -611,11 +651,11 @@ Model.setMethod(function addBehaviour(behaviourname, options) {
611
651
  /**
612
652
  * Get a behaviour instance
613
653
  *
614
- * @author Jelle De Loecker <jelle@develry.be>
654
+ * @author Jelle De Loecker <jelle@elevenways.be>
615
655
  * @since 1.0.3
616
656
  * @version 1.0.3
617
657
  *
618
- * @param {String} name
658
+ * @param {string} name
619
659
  *
620
660
  * @return {Behaviour}
621
661
  */
@@ -633,7 +673,7 @@ Model.setMethod(function getBehaviour(name) {
633
673
  /**
634
674
  * Enable translations
635
675
  *
636
- * @author Jelle De Loecker <jelle@develry.be>
676
+ * @author Jelle De Loecker <jelle@elevenways.be>
637
677
  * @since 0.2.0
638
678
  * @version 0.2.0
639
679
  */
@@ -644,7 +684,7 @@ Model.setMethod(function enableTranslations() {
644
684
  /**
645
685
  * Disable translations
646
686
  *
647
- * @author Jelle De Loecker <jelle@develry.be>
687
+ * @author Jelle De Loecker <jelle@elevenways.be>
648
688
  * @since 0.2.0
649
689
  * @version 0.2.0
650
690
  */
@@ -655,7 +695,7 @@ Model.setMethod(function disableTranslations() {
655
695
  /**
656
696
  * Aggregate
657
697
  *
658
- * @author Jelle De Loecker <jelle@develry.be>
698
+ * @author Jelle De Loecker <jelle@elevenways.be>
659
699
  * @since 0.5.0
660
700
  * @version 0.5.0
661
701
  *
@@ -677,7 +717,7 @@ Model.setMethod(function aggregate(pipeline, callback) {
677
717
  /**
678
718
  * Translate the given records
679
719
  *
680
- * @author Jelle De Loecker <jelle@develry.be>
720
+ * @author Jelle De Loecker <jelle@elevenways.be>
681
721
  * @since 0.2.0
682
722
  * @version 1.3.0
683
723
  *
@@ -725,7 +765,7 @@ Model.setMethod(function translateItems(items, options, callback) {
725
765
  let conduit = this.conduit;
726
766
 
727
767
  // Should we use fallback translations?
728
- const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.allow_fallback_translations ?? false;
768
+ const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.data_management.allow_fallback_translations ?? false;
729
769
 
730
770
  let use_predefined_prefixes = false;
731
771
 
@@ -824,7 +864,7 @@ Model.setMethod(function translateItems(items, options, callback) {
824
864
  /**
825
865
  * Create the given record if the id does not exist in the database
826
866
  *
827
- * @author Jelle De Loecker <jelle@develry.be>
867
+ * @author Jelle De Loecker <jelle@elevenways.be>
828
868
  * @since 0.0.1
829
869
  * @version 1.1.0
830
870
  *
@@ -868,7 +908,7 @@ Model.setMethod(function ensureIds(list, callback) {
868
908
  /**
869
909
  * Save one record
870
910
  *
871
- * @author Jelle De Loecker <jelle@develry.be>
911
+ * @author Jelle De Loecker <jelle@elevenways.be>
872
912
  * @since 0.0.1
873
913
  * @version 1.3.20
874
914
  *
@@ -1001,7 +1041,7 @@ Model.setMethod(function saveRecord(document, options, callback) {
1001
1041
  /**
1002
1042
  * Look for the record id by checking the indexes
1003
1043
  *
1004
- * @author Jelle De Loecker <jelle@develry.be>
1044
+ * @author Jelle De Loecker <jelle@elevenways.be>
1005
1045
  * @since 0.1.0
1006
1046
  * @version 1.1.0
1007
1047
  *
@@ -1129,7 +1169,7 @@ Model.setMethod(function auditRecord(document, options, callback) {
1129
1169
  /**
1130
1170
  * Turn a record into something the database will understand
1131
1171
  *
1132
- * @author Jelle De Loecker <jelle@develry.be>
1172
+ * @author Jelle De Loecker <jelle@elevenways.be>
1133
1173
  * @since 1.0.3
1134
1174
  * @version 1.0.4
1135
1175
  *
@@ -1141,10 +1181,6 @@ Model.setMethod(function auditRecord(document, options, callback) {
1141
1181
  */
1142
1182
  Model.setMethod(function convertRecordToDatasourceFormat(record, options, callback) {
1143
1183
 
1144
- var that = this,
1145
- pledge,
1146
- data;
1147
-
1148
1184
  if (typeof options == 'function') {
1149
1185
  callback = options;
1150
1186
  options = {};
@@ -1154,12 +1190,12 @@ Model.setMethod(function convertRecordToDatasourceFormat(record, options, callba
1154
1190
  options = {};
1155
1191
  }
1156
1192
 
1157
- data = record[this.name] || record;
1193
+ let data = record.$main || record[this.model_name] || record;
1158
1194
 
1159
1195
  // Normalize the data
1160
1196
  data = this.compose(data, options);
1161
1197
 
1162
- pledge = this.datasource.toDatasource(this, data);
1198
+ let pledge = this.datasource.toDatasource(this, data);
1163
1199
 
1164
1200
  pledge.handleCallback(callback);
1165
1201
 
@@ -1169,7 +1205,7 @@ Model.setMethod(function convertRecordToDatasourceFormat(record, options, callba
1169
1205
  /**
1170
1206
  * Process an object of datasource format
1171
1207
  *
1172
- * @author Jelle De Loecker <jelle@develry.be>
1208
+ * @author Jelle De Loecker <jelle@elevenways.be>
1173
1209
  * @since 1.0.3
1174
1210
  * @version 1.0.3
1175
1211
  *
@@ -1204,11 +1240,11 @@ Model.setMethod(function processDatasourceFormat(ds_data, options, callback) {
1204
1240
  /**
1205
1241
  * Clear the cache of this and all associated models
1206
1242
  *
1207
- * @author Jelle De Loecker <jelle@develry.be>
1243
+ * @author Jelle De Loecker <jelle@elevenways.be>
1208
1244
  * @since 0.0.1
1209
1245
  * @version 1.1.6
1210
1246
  *
1211
- * @param {Boolean} associated Also nuke associated models
1247
+ * @param {boolean} associated Also nuke associated models
1212
1248
  * @param {Branch} parent
1213
1249
  */
1214
1250
  Model.setMethod(function nukeCache(associated, parent) {
@@ -1261,13 +1297,13 @@ Model.setMethod(function nukeCache(associated, parent) {
1261
1297
  /**
1262
1298
  * Perform a MongoDB pipeline
1263
1299
  *
1264
- * @author Jelle De Loecker <jelle@elevenways.be>
1300
+ * @author Jelle De Loecker <jelle@elevenways.be>
1265
1301
  * @since 1.3.17
1266
1302
  * @version 1.3.17
1267
1303
  *
1268
- * @param {Array} pipeline
1304
+ * @param {Array} pipeline
1269
1305
  *
1270
- * @return {Promise}
1306
+ * @return {Promise}
1271
1307
  */
1272
1308
  Model.setMethod(async function executeMongoPipeline(pipeline) {
1273
1309
 
@@ -1285,14 +1321,14 @@ Model.setMethod(async function executeMongoPipeline(pipeline) {
1285
1321
  /**
1286
1322
  * Delete the given record id
1287
1323
  *
1288
- * @author Jelle De Loecker <jelle@develry.be>
1324
+ * @author Jelle De Loecker <jelle@elevenways.be>
1289
1325
  * @since 0.0.1
1290
1326
  * @version 1.3.22
1291
1327
  *
1292
- * @param {String} id The object id
1293
- * @param {Function} callback
1328
+ * @param {string} id The object id
1329
+ * @param {Function} callback
1294
1330
  *
1295
- * @return {Pledge}
1331
+ * @return {Pledge}
1296
1332
  */
1297
1333
  Model.setMethod(function remove(id, callback) {
1298
1334
 
@@ -1367,7 +1403,7 @@ Model.setMethod(function remove(id, callback) {
1367
1403
  /**
1368
1404
  * Get all the records and perform the given task on them
1369
1405
  *
1370
- * @author Jelle De Loecker <jelle@develry.be>
1406
+ * @author Jelle De Loecker <jelle@elevenways.be>
1371
1407
  * @since 0.5.0
1372
1408
  * @version 1.2.0
1373
1409
  *
@@ -1464,7 +1500,7 @@ Model.setMethod(function eachRecord(options, task, callback) {
1464
1500
  /**
1465
1501
  * Strip out private fields
1466
1502
  *
1467
- * @author Jelle De Loecker <jelle@develry.be>
1503
+ * @author Jelle De Loecker <jelle@elevenways.be>
1468
1504
  * @since 1.0.0
1469
1505
  * @version 1.0.0
1470
1506
  *
@@ -1505,7 +1541,7 @@ Model.setMethod(function removePrivateFields(records) {
1505
1541
  /**
1506
1542
  * Create an export stream
1507
1543
  *
1508
- * @author Jelle De Loecker <jelle@develry.be>
1544
+ * @author Jelle De Loecker <jelle@elevenways.be>
1509
1545
  * @since 1.0.5
1510
1546
  * @version 1.0.5
1511
1547
  *
@@ -1555,7 +1591,7 @@ Model.setMethod(function exportToStream(output, options) {
1555
1591
  /**
1556
1592
  * Import from a stream
1557
1593
  *
1558
- * @author Jelle De Loecker <jelle@develry.be>
1594
+ * @author Jelle De Loecker <jelle@elevenways.be>
1559
1595
  * @since 1.0.5
1560
1596
  * @version 1.0.5
1561
1597
  *
@@ -1728,99 +1764,44 @@ Model.setMethod(function importFromStream(input, options) {
1728
1764
  /**
1729
1765
  * Get a model
1730
1766
  *
1731
- * @author Jelle De Loecker <jelle@develry.be>
1767
+ * @author Jelle De Loecker <jelle@elevenways.be>
1732
1768
  * @since 0.0.1
1733
- * @version 1.1.0
1769
+ * @version 1.4.0
1734
1770
  *
1735
- * @param {String} name
1736
- * @param {Boolean} init
1771
+ * @param {string} name
1772
+ * @param {boolean} init
1737
1773
  *
1738
- * @return {Model}
1774
+ * @return {Model}
1739
1775
  */
1740
1776
  Model.get = function get(name, init, options) {
1741
1777
 
1742
- var constructor,
1743
- namespace,
1744
- pieces,
1745
- path,
1746
- obj;
1747
-
1748
- if (typeof name == 'function') {
1749
- name = name.name;
1750
- }
1751
-
1752
- if (!name) {
1753
- throw new TypeError('Model name should be a non-empty string');
1754
- }
1755
-
1756
- if (init && typeof init == 'object') {
1778
+ if (typeof init != 'boolean') {
1757
1779
  options = init;
1758
1780
  init = true;
1759
1781
  }
1760
1782
 
1761
- if (!options) {
1762
- options = {};
1763
- }
1783
+ let path = Blast.parseClassPath(name);
1764
1784
 
1765
- if (nameCache[name]) {
1766
- if (init === false) {
1767
- return nameCache[name];
1768
- } else {
1769
- return new nameCache[name];
1770
- }
1771
- }
1772
-
1773
- pieces = name.split('.');
1774
-
1775
- if (pieces.length > 1) {
1776
- // The first part is the namespace
1777
- namespace = pieces.shift();
1778
-
1779
- // The rest should be the path
1780
- path = pieces.join('.');
1785
+ let constructor = Object.path(Blast.Classes.Alchemy.Model, path) || Object.path(Blast.Classes, path);
1781
1786
 
1782
- obj = Classes[namespace];
1783
-
1784
- if (!obj) {
1785
- if (init === false) {
1786
- return null;
1787
- }
1788
-
1789
- throw new TypeError('Namespace "' + namespace + '" could not be found');
1790
- }
1791
- } else {
1792
- path = name;
1793
- obj = Classes.Alchemy.Model;
1787
+ if (!constructor) {
1788
+ throw new Error('Model "' + name + '" could not be found');
1794
1789
  }
1795
1790
 
1796
- constructor = Object.path(obj, path) || obj[String(path).modelName()];
1797
-
1798
- if (constructor == null) {
1799
- if (init === false) {
1800
- return null;
1801
- }
1802
-
1803
- throw new Error('Could not find model "' + name + '"');
1804
- }
1805
-
1806
- // Store this name in the cache,
1807
- // so we don't have to perform the expensive #modelName() method again
1808
- nameCache[name] = constructor;
1809
-
1810
- if (init === false) {
1791
+ if (!init) {
1811
1792
  return constructor;
1812
- } else {
1813
- return new constructor;
1814
1793
  }
1794
+
1795
+ return new constructor(options);
1815
1796
  };
1816
1797
 
1817
1798
  /**
1818
1799
  * Make the base Model class a global
1819
1800
  *
1820
- * @author Jelle De Loecker <jelle@develry.be>
1801
+ * @author Jelle De Loecker <jelle@elevenways.be>
1821
1802
  * @since 0.0.1
1822
1803
  * @version 0.2.0
1823
1804
  *
1824
- * @type {Object}
1805
+ * @type {Object}
1825
1806
  */
1826
- global.Model = Model;
1807
+ DEFINE('Model', Model);