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
@@ -9,51 +9,95 @@ 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);
51
+
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;
60
+ }
61
+
62
+ if (model_name[0] == '_') {
63
+ console.log(ns, model_name)
64
+ throw new Error('KAK')
65
+ }
66
+
67
+ // The simple name of the model
68
+ this.model_name = model_name;
69
+ this.setProperty('model_name', model_name);
70
+
71
+ let table_name = base_name.tableize();
30
72
 
31
- if (!this.table) {
32
- this.table = this.model_name.tableize();
73
+ if (table_prefix) {
74
+ table_name = table_prefix + '_' + table_name;
33
75
  }
76
+
77
+ this.table = table_name;
34
78
  });
35
79
 
36
80
  /**
37
81
  * This is a model constructor
38
82
  *
39
- * @type {Boolean}
83
+ * @type {boolean}
40
84
  */
41
85
  Model.setStaticProperty('model', true);
42
86
 
43
87
  /**
44
88
  * The cache duration static getter/setter
45
89
  *
46
- * @author Jelle De Loecker <jelle@develry.be>
90
+ * @author Jelle De Loecker <jelle@elevenways.be>
47
91
  * @since 0.1.0
48
92
  * @version 1.0.3
49
93
  *
50
94
  * @property cache_duration
51
- * @type {String}
95
+ * @type {string}
52
96
  */
53
97
  Model.setStaticProperty(function cache_duration() {
54
98
 
55
99
  if (this._cache_duration == null) {
56
- this._cache_duration = alchemy.settings.model_query_cache_duration;
100
+ this._cache_duration = alchemy.settings.data_management.model_query_cache_duration;
57
101
  }
58
102
 
59
103
  return this._cache_duration;
@@ -66,7 +110,7 @@ Model.setStaticProperty(function cache_duration() {
66
110
  /**
67
111
  * Get the cache object
68
112
  *
69
- * @author Jelle De Loecker <jelle@develry.be>
113
+ * @author Jelle De Loecker <jelle@elevenways.be>
70
114
  * @since 0.1.0
71
115
  * @version 1.0.3
72
116
  *
@@ -94,11 +138,11 @@ Model.setStaticProperty(function cache() {
94
138
  /**
95
139
  * Is this an abstract model?
96
140
  *
97
- * @author Jelle De Loecker <jelle@develry.be>
141
+ * @author Jelle De Loecker <jelle@elevenways.be>
98
142
  * @since 1.1.0
99
143
  * @version 1.1.0
100
144
  *
101
- * @type {Boolean}
145
+ * @type {boolean}
102
146
  */
103
147
  Model.setStaticProperty(function is_abstract() {
104
148
 
@@ -130,11 +174,10 @@ Model.setStaticProperty(function is_abstract() {
130
174
  return field_count < 1;
131
175
  });
132
176
 
133
-
134
177
  /**
135
178
  * Get the document class constructor
136
179
  *
137
- * @type {Alchemy.Document}
180
+ * @type {Alchemy.Document}
138
181
  */
139
182
  Model.prepareStaticProperty('Document', function getDocumentClass() {
140
183
  return Classes.Alchemy.Document.Document.getDocumentClass(this);
@@ -143,7 +186,7 @@ Model.prepareStaticProperty('Document', function getDocumentClass() {
143
186
  /**
144
187
  * Get the client document class constructor
145
188
  *
146
- * @type {Hawkejs.Document}
189
+ * @type {Hawkejs.Document}
147
190
  */
148
191
  Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass() {
149
192
  return this.Document.getClientDocumentClass();
@@ -154,7 +197,7 @@ Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass()
154
197
  *
155
198
  * @version 1.1.0
156
199
  *
157
- * @type {Schema}
200
+ * @type {Schema}
158
201
  */
159
202
  Model.staticCompose('schema', function createSchema(doNext) {
160
203
 
@@ -171,7 +214,7 @@ Model.staticCompose('schema', function createSchema(doNext) {
171
214
  schema.setModel(model);
172
215
 
173
216
  // Set the schema name
174
- schema.setName(model.name);
217
+ schema.setName(model.model_name);
175
218
 
176
219
  if (model.prototype.add_basic_fields !== false) {
177
220
 
@@ -206,28 +249,28 @@ Model.setDeprecatedProperty('displayField', 'display_field');
206
249
  /**
207
250
  * The default database config to use
208
251
  *
209
- * @type {String}
252
+ * @type {string}
210
253
  */
211
254
  Model.setProperty('dbConfig', 'default');
212
255
 
213
256
  /**
214
257
  * The default field to use as display
215
258
  *
216
- * @type {String}
259
+ * @type {string}
217
260
  */
218
261
  Model.setProperty('display_field', 'title');
219
262
 
220
263
  /**
221
264
  * Translate is on by default
222
265
  *
223
- * @type {Boolean}
266
+ * @type {boolean}
224
267
  */
225
268
  Model.setProperty('translate', true);
226
269
 
227
270
  /**
228
271
  * Set the name of the primary key field
229
272
  *
230
- * @author Jelle De Loecker <jelle@develry.be>
273
+ * @author Jelle De Loecker <jelle@elevenways.be>
231
274
  * @since 0.1.0
232
275
  * @version 0.1.0
233
276
  */
@@ -236,7 +279,7 @@ Model.setProperty('primary_key', '_id');
236
279
  /**
237
280
  * Should we load the schema from the database?
238
281
  *
239
- * @author Jelle De Loecker <jelle@develry.be>
282
+ * @author Jelle De Loecker <jelle@elevenways.be>
240
283
  * @since 1.1.0
241
284
  * @version 1.1.0
242
285
  */
@@ -245,14 +288,14 @@ Model.setProperty('load_external_schema', false);
245
288
  /**
246
289
  * Object where behaviours are stored
247
290
  *
248
- * @type {Object}
291
+ * @type {Object}
249
292
  */
250
293
  Model.prepareProperty('behaviours', Object);
251
294
 
252
295
  /**
253
296
  * Associations
254
297
  *
255
- * @type {Object}
298
+ * @type {Object}
256
299
  */
257
300
  Model.setProperty(function associations() {
258
301
  return this.schema.associations;
@@ -261,7 +304,7 @@ Model.setProperty(function associations() {
261
304
  /**
262
305
  * Instance access to static cache
263
306
  *
264
- * @type {Expirable}
307
+ * @type {Expirable}
265
308
  */
266
309
  Model.prepareProperty('cache', function cache() {
267
310
  return this.constructor.cache;
@@ -270,7 +313,7 @@ Model.prepareProperty('cache', function cache() {
270
313
  /**
271
314
  * Instance access to static schema
272
315
  *
273
- * @type {Schema}
316
+ * @type {Schema}
274
317
  */
275
318
  Model.setProperty(function schema() {
276
319
  return this.constructor.schema;
@@ -279,26 +322,16 @@ Model.setProperty(function schema() {
279
322
  /**
280
323
  * Is this an abstract model?
281
324
  *
282
- * @type {Boolean}
325
+ * @type {boolean}
283
326
  */
284
327
  Model.setProperty(function is_abstract() {
285
328
  return this.constructor.is_abstract;
286
329
  });
287
330
 
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
331
  /**
299
332
  * The connection
300
333
  *
301
- * @type {Object}
334
+ * @type {Object}
302
335
  */
303
336
  Model.prepareProperty('datasource', function datasource() {
304
337
  if (this.table) return Datasource.get(this.dbConfig);
@@ -307,7 +340,7 @@ Model.prepareProperty('datasource', function datasource() {
307
340
  /**
308
341
  * The default sort options
309
342
  *
310
- * @type {Object}
343
+ * @type {Object}
311
344
  */
312
345
  Model.prepareProperty('sort', function sort() {
313
346
  return {[this.primary_key]: -1};
@@ -316,13 +349,13 @@ Model.prepareProperty('sort', function sort() {
316
349
  /**
317
350
  * Check a url value
318
351
  *
319
- * @author Jelle De Loecker <jelle@develry.be>
352
+ * @author Jelle De Loecker <jelle@elevenways.be>
320
353
  * @since 1.0.0
321
354
  * @version 1.2.5
322
355
  *
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
356
+ * @param {string} value The value in the url
357
+ * @param {string} name The name of the url parameter
358
+ * @param {string} field_name The name of the field to check
326
359
  * @param {Conduit} conduit The optional conduit
327
360
  *
328
361
  * @return {Pledge}
@@ -369,7 +402,7 @@ Model.setStatic(async function checkPathValue(value, name, field_name, conduit)
369
402
  /**
370
403
  * Add a computed field to this model's schema
371
404
  *
372
- * @author Jelle De Loecker <jelle@elevenways.be>
405
+ * @author Jelle De Loecker <jelle@elevenways.be>
373
406
  * @since 1.3.21
374
407
  * @version 1.3.21
375
408
  *
@@ -397,7 +430,7 @@ Model.setStatic(function addComputedField(name, type, options) {
397
430
  /**
398
431
  * Add a field to this model's schema
399
432
  *
400
- * @author Jelle De Loecker <jelle@develry.be>
433
+ * @author Jelle De Loecker <jelle@elevenways.be>
401
434
  * @since 0.2.0
402
435
  * @version 1.2.21
403
436
  *
@@ -423,11 +456,21 @@ Model.setStatic(function addField(name, type, options) {
423
456
  return field;
424
457
  });
425
458
 
459
+ /**
460
+ * Set the wanted table prefix
461
+ *
462
+ * @author Jelle De Loecker <jelle@elevenways.be>
463
+ * @since 1.4.0
464
+ * @version 1.4.0
465
+ */
466
+ Model.setStatic(function setTablePrefix(prefix) {
467
+ this.setStatic('table_prefix', prefix);
468
+ });
426
469
 
427
470
  /**
428
471
  * Add a behaviour to this model
429
472
  *
430
- * @author Jelle De Loecker <jelle@develry.be>
473
+ * @author Jelle De Loecker <jelle@elevenways.be>
431
474
  * @since 0.2.0
432
475
  * @version 0.2.0
433
476
  */
@@ -439,7 +482,7 @@ Model.setStatic(function addBehaviour(behaviour_name, options) {
439
482
  * Add an association to this model's schema
440
483
  * and set it on the Document as a getter
441
484
  *
442
- * @author Jelle De Loecker <jelle@develry.be>
485
+ * @author Jelle De Loecker <jelle@elevenways.be>
443
486
  * @since 0.2.0
444
487
  * @version 1.2.4
445
488
  */
@@ -456,7 +499,7 @@ Model.setStatic(function addAssociation(type, alias, model_name, options) {
456
499
  /**
457
500
  * Set a method on the document class
458
501
  *
459
- * @author Jelle De Loecker <jelle@develry.be>
502
+ * @author Jelle De Loecker <jelle@elevenways.be>
460
503
  * @since 0.2.0
461
504
  * @version 1.0.6
462
505
  */
@@ -477,7 +520,7 @@ Model.setStatic(function setDocumentMethod(name, fnc) {
477
520
  /**
478
521
  * Set a property on the document class
479
522
  *
480
- * @author Jelle De Loecker <jelle@develry.be>
523
+ * @author Jelle De Loecker <jelle@elevenways.be>
481
524
  * @since 0.2.0
482
525
  * @version 1.0.6
483
526
  */
@@ -494,7 +537,7 @@ Model.setStatic(function setDocumentProperty(name, fnc) {
494
537
  /**
495
538
  * Get a field
496
539
  *
497
- * @author Jelle De Loecker <jelle@develry.be>
540
+ * @author Jelle De Loecker <jelle@elevenways.be>
498
541
  * @since 0.2.0
499
542
  * @version 0.2.0
500
543
  *
@@ -532,22 +575,24 @@ Model.setStatic(function getField(name) {
532
575
  * Get the model's public configuration
533
576
  * (This is used to create the client-side Model instances)
534
577
  *
535
- * @author Jelle De Loecker <jelle@elevenways.be>
578
+ * @author Jelle De Loecker <jelle@elevenways.be>
536
579
  * @since 1.0.0
537
580
  * @version 1.3.1
538
581
  */
539
582
  Model.setStatic(function getClientConfig() {
540
583
 
541
584
  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,
585
+ class_name : this.name,
586
+ model_name : this.model_name,
587
+ model_namespace : this.model_namespace || undefined,
588
+ schema : this.schema,
589
+ primary_key : this.prototype.primary_key,
590
+ display_field : this.prototype.display_field,
591
+ ancestors : 0,
547
592
  };
548
593
 
549
594
  if (this.super.name != 'Model') {
550
- result.parent = this.super.name;
595
+ result.parent = this.super.model_name;
551
596
 
552
597
  let ancestors = 0,
553
598
  ancestor = this.super;
@@ -566,7 +611,7 @@ Model.setStatic(function getClientConfig() {
566
611
  /**
567
612
  * Initialize behaviours
568
613
  *
569
- * @author Jelle De Loecker <jelle@develry.be>
614
+ * @author Jelle De Loecker <jelle@elevenways.be>
570
615
  * @since 0.2.0
571
616
  * @version 0.2.0
572
617
  *
@@ -590,7 +635,7 @@ Model.setMethod(function initBehaviours() {
590
635
  /**
591
636
  * Enable a behaviour on-the-fly
592
637
  *
593
- * @author Jelle De Loecker <jelle@develry.be>
638
+ * @author Jelle De Loecker <jelle@elevenways.be>
594
639
  * @since 0.0.1
595
640
  * @version 0.2.0
596
641
  */
@@ -611,11 +656,11 @@ Model.setMethod(function addBehaviour(behaviourname, options) {
611
656
  /**
612
657
  * Get a behaviour instance
613
658
  *
614
- * @author Jelle De Loecker <jelle@develry.be>
659
+ * @author Jelle De Loecker <jelle@elevenways.be>
615
660
  * @since 1.0.3
616
661
  * @version 1.0.3
617
662
  *
618
- * @param {String} name
663
+ * @param {string} name
619
664
  *
620
665
  * @return {Behaviour}
621
666
  */
@@ -633,7 +678,7 @@ Model.setMethod(function getBehaviour(name) {
633
678
  /**
634
679
  * Enable translations
635
680
  *
636
- * @author Jelle De Loecker <jelle@develry.be>
681
+ * @author Jelle De Loecker <jelle@elevenways.be>
637
682
  * @since 0.2.0
638
683
  * @version 0.2.0
639
684
  */
@@ -644,7 +689,7 @@ Model.setMethod(function enableTranslations() {
644
689
  /**
645
690
  * Disable translations
646
691
  *
647
- * @author Jelle De Loecker <jelle@develry.be>
692
+ * @author Jelle De Loecker <jelle@elevenways.be>
648
693
  * @since 0.2.0
649
694
  * @version 0.2.0
650
695
  */
@@ -655,7 +700,7 @@ Model.setMethod(function disableTranslations() {
655
700
  /**
656
701
  * Aggregate
657
702
  *
658
- * @author Jelle De Loecker <jelle@develry.be>
703
+ * @author Jelle De Loecker <jelle@elevenways.be>
659
704
  * @since 0.5.0
660
705
  * @version 0.5.0
661
706
  *
@@ -677,7 +722,7 @@ Model.setMethod(function aggregate(pipeline, callback) {
677
722
  /**
678
723
  * Translate the given records
679
724
  *
680
- * @author Jelle De Loecker <jelle@develry.be>
725
+ * @author Jelle De Loecker <jelle@elevenways.be>
681
726
  * @since 0.2.0
682
727
  * @version 1.3.0
683
728
  *
@@ -725,7 +770,7 @@ Model.setMethod(function translateItems(items, options, callback) {
725
770
  let conduit = this.conduit;
726
771
 
727
772
  // Should we use fallback translations?
728
- const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.allow_fallback_translations ?? false;
773
+ const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.data_management.allow_fallback_translations ?? false;
729
774
 
730
775
  let use_predefined_prefixes = false;
731
776
 
@@ -824,7 +869,7 @@ Model.setMethod(function translateItems(items, options, callback) {
824
869
  /**
825
870
  * Create the given record if the id does not exist in the database
826
871
  *
827
- * @author Jelle De Loecker <jelle@develry.be>
872
+ * @author Jelle De Loecker <jelle@elevenways.be>
828
873
  * @since 0.0.1
829
874
  * @version 1.1.0
830
875
  *
@@ -868,7 +913,7 @@ Model.setMethod(function ensureIds(list, callback) {
868
913
  /**
869
914
  * Save one record
870
915
  *
871
- * @author Jelle De Loecker <jelle@develry.be>
916
+ * @author Jelle De Loecker <jelle@elevenways.be>
872
917
  * @since 0.0.1
873
918
  * @version 1.3.20
874
919
  *
@@ -1001,7 +1046,7 @@ Model.setMethod(function saveRecord(document, options, callback) {
1001
1046
  /**
1002
1047
  * Look for the record id by checking the indexes
1003
1048
  *
1004
- * @author Jelle De Loecker <jelle@develry.be>
1049
+ * @author Jelle De Loecker <jelle@elevenways.be>
1005
1050
  * @since 0.1.0
1006
1051
  * @version 1.1.0
1007
1052
  *
@@ -1129,7 +1174,7 @@ Model.setMethod(function auditRecord(document, options, callback) {
1129
1174
  /**
1130
1175
  * Turn a record into something the database will understand
1131
1176
  *
1132
- * @author Jelle De Loecker <jelle@develry.be>
1177
+ * @author Jelle De Loecker <jelle@elevenways.be>
1133
1178
  * @since 1.0.3
1134
1179
  * @version 1.0.4
1135
1180
  *
@@ -1169,7 +1214,7 @@ Model.setMethod(function convertRecordToDatasourceFormat(record, options, callba
1169
1214
  /**
1170
1215
  * Process an object of datasource format
1171
1216
  *
1172
- * @author Jelle De Loecker <jelle@develry.be>
1217
+ * @author Jelle De Loecker <jelle@elevenways.be>
1173
1218
  * @since 1.0.3
1174
1219
  * @version 1.0.3
1175
1220
  *
@@ -1204,11 +1249,11 @@ Model.setMethod(function processDatasourceFormat(ds_data, options, callback) {
1204
1249
  /**
1205
1250
  * Clear the cache of this and all associated models
1206
1251
  *
1207
- * @author Jelle De Loecker <jelle@develry.be>
1252
+ * @author Jelle De Loecker <jelle@elevenways.be>
1208
1253
  * @since 0.0.1
1209
1254
  * @version 1.1.6
1210
1255
  *
1211
- * @param {Boolean} associated Also nuke associated models
1256
+ * @param {boolean} associated Also nuke associated models
1212
1257
  * @param {Branch} parent
1213
1258
  */
1214
1259
  Model.setMethod(function nukeCache(associated, parent) {
@@ -1261,13 +1306,13 @@ Model.setMethod(function nukeCache(associated, parent) {
1261
1306
  /**
1262
1307
  * Perform a MongoDB pipeline
1263
1308
  *
1264
- * @author Jelle De Loecker <jelle@elevenways.be>
1309
+ * @author Jelle De Loecker <jelle@elevenways.be>
1265
1310
  * @since 1.3.17
1266
1311
  * @version 1.3.17
1267
1312
  *
1268
- * @param {Array} pipeline
1313
+ * @param {Array} pipeline
1269
1314
  *
1270
- * @return {Promise}
1315
+ * @return {Promise}
1271
1316
  */
1272
1317
  Model.setMethod(async function executeMongoPipeline(pipeline) {
1273
1318
 
@@ -1285,14 +1330,14 @@ Model.setMethod(async function executeMongoPipeline(pipeline) {
1285
1330
  /**
1286
1331
  * Delete the given record id
1287
1332
  *
1288
- * @author Jelle De Loecker <jelle@develry.be>
1333
+ * @author Jelle De Loecker <jelle@elevenways.be>
1289
1334
  * @since 0.0.1
1290
- * @version 1.3.21
1335
+ * @version 1.3.22
1291
1336
  *
1292
- * @param {String} id The object id
1293
- * @param {Function} callback
1337
+ * @param {string} id The object id
1338
+ * @param {Function} callback
1294
1339
  *
1295
- * @return {Pledge}
1340
+ * @return {Pledge}
1296
1341
  */
1297
1342
  Model.setMethod(function remove(id, callback) {
1298
1343
 
@@ -1313,12 +1358,33 @@ Model.setMethod(function remove(id, callback) {
1313
1358
  id = String(id);
1314
1359
  }
1315
1360
 
1316
- let query = {};
1317
- query[this.primary_key] = id;
1361
+ let query = {
1362
+ [this.primary_key] : id,
1363
+ };
1364
+
1365
+ let has_remove_events = typeof this.beforeRemove == 'function' || typeof this.afterRemove == 'function' || this.listeners('removed').length;
1366
+ let doc;
1367
+ let tasks = [];
1318
1368
 
1319
- Function.series(function recompute(next) {
1320
- that.callOrNext('beforeRemove', [id], next);
1321
- }, function done(err) {
1369
+ if (has_remove_events) {
1370
+
1371
+ // Get the actual document
1372
+ tasks.push(async next => {
1373
+ doc = await this.findByPk(id);
1374
+
1375
+ if (!doc) {
1376
+ return next(new Error('Unable to find document with id ' + id));
1377
+ }
1378
+
1379
+ next();
1380
+ });
1381
+
1382
+ tasks.push(next => {
1383
+ this.callOrNext('beforeRemove', [doc], next);
1384
+ });
1385
+ }
1386
+
1387
+ Function.series(tasks, function done(err) {
1322
1388
 
1323
1389
  if (err) {
1324
1390
  pledge.reject(err);
@@ -1330,10 +1396,13 @@ Model.setMethod(function remove(id, callback) {
1330
1396
  if (err != null) {
1331
1397
  return pledge.reject(err);
1332
1398
  }
1333
-
1334
- that.emit('removed', result, {}, false, function afterRemovedEvent() {
1399
+
1400
+ if (has_remove_events) {
1401
+ that.issueEvent('removed', [doc, result], () => pledge.resolve(result));
1402
+ } else {
1335
1403
  pledge.resolve(result);
1336
- });
1404
+ }
1405
+
1337
1406
  });
1338
1407
  });
1339
1408
 
@@ -1343,7 +1412,7 @@ Model.setMethod(function remove(id, callback) {
1343
1412
  /**
1344
1413
  * Get all the records and perform the given task on them
1345
1414
  *
1346
- * @author Jelle De Loecker <jelle@develry.be>
1415
+ * @author Jelle De Loecker <jelle@elevenways.be>
1347
1416
  * @since 0.5.0
1348
1417
  * @version 1.2.0
1349
1418
  *
@@ -1440,7 +1509,7 @@ Model.setMethod(function eachRecord(options, task, callback) {
1440
1509
  /**
1441
1510
  * Strip out private fields
1442
1511
  *
1443
- * @author Jelle De Loecker <jelle@develry.be>
1512
+ * @author Jelle De Loecker <jelle@elevenways.be>
1444
1513
  * @since 1.0.0
1445
1514
  * @version 1.0.0
1446
1515
  *
@@ -1481,7 +1550,7 @@ Model.setMethod(function removePrivateFields(records) {
1481
1550
  /**
1482
1551
  * Create an export stream
1483
1552
  *
1484
- * @author Jelle De Loecker <jelle@develry.be>
1553
+ * @author Jelle De Loecker <jelle@elevenways.be>
1485
1554
  * @since 1.0.5
1486
1555
  * @version 1.0.5
1487
1556
  *
@@ -1531,7 +1600,7 @@ Model.setMethod(function exportToStream(output, options) {
1531
1600
  /**
1532
1601
  * Import from a stream
1533
1602
  *
1534
- * @author Jelle De Loecker <jelle@develry.be>
1603
+ * @author Jelle De Loecker <jelle@elevenways.be>
1535
1604
  * @since 1.0.5
1536
1605
  * @version 1.0.5
1537
1606
  *
@@ -1704,99 +1773,44 @@ Model.setMethod(function importFromStream(input, options) {
1704
1773
  /**
1705
1774
  * Get a model
1706
1775
  *
1707
- * @author Jelle De Loecker <jelle@develry.be>
1776
+ * @author Jelle De Loecker <jelle@elevenways.be>
1708
1777
  * @since 0.0.1
1709
- * @version 1.1.0
1778
+ * @version 1.4.0
1710
1779
  *
1711
- * @param {String} name
1712
- * @param {Boolean} init
1780
+ * @param {string} name
1781
+ * @param {boolean} init
1713
1782
  *
1714
- * @return {Model}
1783
+ * @return {Model}
1715
1784
  */
1716
1785
  Model.get = function get(name, init, options) {
1717
1786
 
1718
- var constructor,
1719
- namespace,
1720
- pieces,
1721
- path,
1722
- obj;
1723
-
1724
- if (typeof name == 'function') {
1725
- name = name.name;
1726
- }
1727
-
1728
- if (!name) {
1729
- throw new TypeError('Model name should be a non-empty string');
1730
- }
1731
-
1732
- if (init && typeof init == 'object') {
1787
+ if (typeof init != 'boolean') {
1733
1788
  options = init;
1734
1789
  init = true;
1735
1790
  }
1736
1791
 
1737
- if (!options) {
1738
- options = {};
1739
- }
1740
-
1741
- if (nameCache[name]) {
1742
- if (init === false) {
1743
- return nameCache[name];
1744
- } else {
1745
- return new nameCache[name];
1746
- }
1747
- }
1748
-
1749
- pieces = name.split('.');
1750
-
1751
- if (pieces.length > 1) {
1752
- // The first part is the namespace
1753
- namespace = pieces.shift();
1754
-
1755
- // The rest should be the path
1756
- path = pieces.join('.');
1757
-
1758
- obj = Classes[namespace];
1759
-
1760
- if (!obj) {
1761
- if (init === false) {
1762
- return null;
1763
- }
1764
-
1765
- throw new TypeError('Namespace "' + namespace + '" could not be found');
1766
- }
1767
- } else {
1768
- path = name;
1769
- obj = Classes.Alchemy.Model;
1770
- }
1771
-
1772
- constructor = Object.path(obj, path) || obj[String(path).modelName()];
1792
+ let path = Blast.parseClassPath(name);
1773
1793
 
1774
- if (constructor == null) {
1775
- if (init === false) {
1776
- return null;
1777
- }
1794
+ let constructor = Object.path(Blast.Classes.Alchemy.Model, path) || Object.path(Blast.Classes, path);
1778
1795
 
1779
- throw new Error('Could not find model "' + name + '"');
1796
+ if (!constructor) {
1797
+ throw new Error('Model "' + name + '" could not be found');
1780
1798
  }
1781
1799
 
1782
- // Store this name in the cache,
1783
- // so we don't have to perform the expensive #modelName() method again
1784
- nameCache[name] = constructor;
1785
-
1786
- if (init === false) {
1800
+ if (!init) {
1787
1801
  return constructor;
1788
- } else {
1789
- return new constructor;
1790
1802
  }
1803
+
1804
+ return new constructor(options);
1791
1805
  };
1792
1806
 
1793
1807
  /**
1794
1808
  * Make the base Model class a global
1795
1809
  *
1796
- * @author Jelle De Loecker <jelle@develry.be>
1810
+ * @author Jelle De Loecker <jelle@elevenways.be>
1797
1811
  * @since 0.0.1
1798
1812
  * @version 0.2.0
1799
1813
  *
1800
- * @type {Object}
1814
+ * @type {Object}
1801
1815
  */
1802
- global.Model = Model;
1816
+ DEFINE('Model', Model);