alchemymvc 1.1.8 → 1.1.9

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/CHANGELOG.md CHANGED
@@ -1,454 +1,458 @@
1
- ## 1.1.8 (2021-09-12)
2
-
3
- * Add `conduit` getter to the Base class
4
- * Use Protoblast's temp file methods instead of `temp`
5
- * Add `/hawkejs/static.js` middleware
6
- * Use `sass` instead of the deprecated `node-sass`
7
- * Use Protoblast's slug method instead of mollusc
8
- * Add some more Directory & File methods
9
-
10
- ## 1.1.7 (2021-06-11)
11
-
12
- * Add `Alchemy.Criteria.FieldConfig#getDisplayValueIn(data)` method to get a simple string representation of a value
13
- * Check field class constructor in `Schema#addField()`
14
- * Allow RegExp values for String fields during a query
15
- * Requesting a route with the wrong method will now return a 405 error (Method Not Allowed) instead of a 404
16
- * Fix client `Model` classes not being able to perform a query when running on the server in loopback mode
17
- * Fix `time-ago` element refreshing every second when counting down to a date
18
- * Fix the `Loopback` conduit sometimes setting the wrong route method
19
-
20
- ## 1.1.6 (2021-04-29)
21
-
22
- * Switch from `uglify-es` to `terser` for minifying JavaScript files
23
- * Allow overriding any setting from the command line
24
- * Use `Branch` class for clearing model cache
25
-
26
- ## 1.1.5 (2021-01-21)
27
-
28
- * Fallback to the `ENV` environment variable to set the environment
29
- * Fix rendering of segments
30
- * Fix Loopback conduits not setting the correct data when only provided with a route name
31
- * Set the `Hawkejs.Renderer` language once we have a prefix
32
- * Automatically add the `hreflang` attribute to links created with the Router helper
33
- * Fix `Conduit#url` property having the wrong path set
34
- * Load `helper_datasource` and `helper_field` folders before main `helper` folder
35
- * Add `Alchemy#checksum(value)` method
36
- * Throw an error when a class instance is used as a criteria condition
37
- * Fix breadcrumbs for routes that contain objects
38
- * Apply active-link breadcrumb classes while creating the anchors
39
-
40
- ## 1.1.4 (2020-12-10)
41
-
42
- * Fix certain socket linkup packets not being json-dry encodes
43
- * Make `Alchemy#findImagePath()` return a promise
44
- * Make `FieldConfig` class more aware of paths
45
- * Fix `Validator#validateFieldValue()` throwing an error when a field contains multiple violations
46
- * Fix Schema fields not translating translatable fields
47
- * Fix `Validations` errors always having only max 1 field error
48
-
49
- ## 1.1.3 (2020-11-12)
50
-
51
- * Add `Schema#clone()` method
52
- * Add `Schema#field_count` property
53
- * Fix `Schema#addField()` throwing an error when adding a schema field on the browser side
54
- * Added `Criteria#page(page, page_size)`
55
- * `Conduit` classes have been moved into the `Conduit` namespace
56
- * `Conduit.Loopback` now correctly sets the method & body
57
- * Added `Criteria.FieldSet` and `Criteria.FieldConfig` classes
58
- * Object responses via `Conduit.Loopback#end()` will now first be cloned with the `toHawkejs` clone option
59
- * `Model#find()` will now reject when no `datasource` property is set
60
- * Add support for `fonts` asset folders
61
- * Add `CustomElement#getCurrentUrl()` method
62
-
63
- ## 1.1.2 (2020-10-08)
64
-
65
- * Fix Client class methods not being set on the server-side for classes defined in a plugin
66
- * Add `Criteria#isEmpty()` field check
67
- * Add `Linkup#demand()` method
68
- * Add `--socket` startup argument support
69
- * When the given socket path is a directory, create a socket in that directory with the current project name
70
- * Add `--url` startup argument, which will print the url in the console
71
- * Add `--preload` startup argument, which will load the homepage & the client file on startup
72
- * Allow opening redirects in a popup window
73
-
74
- ## 1.1.1 (2020-07-24)
75
-
76
- * Add `Base.mapEventToMethod()` to register simple emitted events names to methods per class
77
- * Add `Base#issueEvent(name, args, callback)` which will use the mapped event-to-method map to execute the method first & then emit the events
78
- * Implement the new event-and-method flow in Controller & Models
79
- * Already set the Hawkejs Renderer `is_for_client_side` property before calling the middleware
80
- * All the properties of the `parameters` property will be used in the Router directive
81
-
82
- ## 1.1.0 (2020-07-21)
83
-
84
- * Add `Schema#getDatasource()` which returns a pledge that resolves to the datasource
85
- * `Alchemy#requirePlugin(name, attempt)` will now attempt to load the plugin if it hasn't been done yet
86
- * Add `Criteria` class, which replaces the messy `DbQuery` class and is a query builder to boot.
87
- * The `Datasource` & `Field` class is now also available on the client side
88
- * Typedefs in routes can now contain fields, like `/{[Model._id]custom_id_name}/`
89
- * Add `Models#load_external_schema` boolean property
90
- * Add `second_format` option to Date & Datetime fields, allowing you to save Date as a timestamp
91
- * Add `Datasource#allows(name)` to see if read/create/remove/update is allowed
92
- * Add `Inode` namespace & `File` & `Directory` classes, as our way of dealing with files
93
- * Also set the `method` property on the client-side `Conduit` instance
94
- * Replace `Document.$main` object with save result
95
- * Add `Model#findByValues` and `Model#findAllByValues`
96
- * Add `Router#serveDependencyFile()` for when you want to serve a file from within a dependency
97
- * Decode path parameters using `RURL.decodeUriSegment()`
98
- * Add `$hold` property to Document class, which are also sent to the client
99
- * `Conduit#redirect()` now has a `hard_refresh` option, to force a non-ajax redirection
100
- * `DocumentList` can now be iterated over
101
- * Removing the cached client file will no longer cause 404 errors
102
- * Conduit responses can now be ended with a buffer
103
- * Sessions will emit the `removed` event when they're being removed
104
- * Websocket messages will no longer be resent upon reconnect
105
- * Add `populate` method to `DocumentList`
106
- * When adding an association to a model, an index will automatically be made
107
- * Uploaded files now use Alchemy's `Inode.File` class
108
- * The `Criteria` class can now be asynchronously iterated over
109
- * The `Fallback` datasource will now use the `read` method instead of `_read`
110
- * Add `Schema.isSchema()` method
111
- * `Enum` values will now also be serialized for the client-side config
112
- * The `Router` helper directive will now look for a `url_attribute` property on the target element
113
- * Add custom Error classes under the Classes.Alchemy.Error namespace
114
- * Re-added validation support with the `Validator` & `Violation` classes
115
- * Use `Blast.fetch()` in the `Alchemy#request()` method
116
- * Rename `Model#findById()` to `Model#findByPk()`
117
- * Add `Document#refreshValues()` to re-query the data from the database
118
- * Allow individual associations to be resolved by the datasource itself
119
- * Throw an error when trying to set a Document's data record to an invalid value
120
- * Fix getting the path of fields in a subschema
121
- * Add `Schema#getFieldChain(path)` and `Field#getFieldChain()`
122
- * Add `FieldValue` class and use it for the new `Field#getDocumentValues(document)` method
123
- * Add `Alchemy#getPrefixes()` to get the prefixes object on the server & client
124
- * The `Alchemy#pickTranslation()` method now also accepts a conduit as prefix choices
125
- * Add source-map support
126
-
127
- ## 1.0.8 (2019-01-12)
128
-
129
- * Fix for package.json dependency version error
130
-
131
- ## 1.0.7 (2019-01-12)
132
-
133
- * Setting `prefer: "client"` and `layout` property on a Route will let the client render the action once the base layout is loaded
134
- * Add default `Conduit#notAuthorized()` and `Conduit#forbidden()` method
135
- * Add support for some basic `policy` property on a Route
136
- * Make the `Scene#interceptOpenUrl` method set the internal `breadcrumb` variable
137
- * Add appcache support
138
- * The `offline_clients` setting needs to be truthy in order to send an appcache manifest
139
- * Fix `Schema#getField()` not looking in the subschema of a SchemaFieldType
140
- * Fix `Model#find('count')` returning wrong value when result is 0
141
- * Add `Alchemy#getMedHash()` function to get a simple, non-verification hash of a file
142
- * The `Conduit#body` property can now be overwritten
143
- * Allow json-dry data from logged-in users during a readDataSource request
144
- * Add `FieldType#datasource` property
145
- * Add `Datasource.setSupport(name, value)` and `Datasource.supports(name)`
146
- * Use `Datasource.supports('objectid')` to see if it understands ObjectID instances
147
- * Add `Alchemy#statPath(path, options)` function
148
- * Allow `Model.addField()` to override already existing fields
149
- * Add pledge support to `Alchemy#openUrl()`
150
- * `Alchemy#findPathToBinarySync()` will now also look in the `/bin/` directory
151
- * Deprecate `Alchemy#List()`
152
- * Add more unit tests
153
-
154
- ## 1.0.6 (2018-12-06)
155
-
156
- * Add `Document#is_new_record` property
157
- * Fix `Document#[Symbol(alike)]` method
158
- * Fix bug in SluggableBehaviour always assuming an existing record will be found
159
- * Work around adding document methods before parent model is ready
160
- * Make client-side Document classes inherit from correct parent
161
- * Allow querying for extraneous, out-of-schema fields by passing the `extraneous` option
162
- * Fix renderings of client-side Controller actions
163
- * Use aggregate `sortByPath` in client-side IndexedDB search
164
- * Add `Alchemy.Client.Document.getClassForUndry()` method
165
- * `Model#saveRecord()` will now throw an error when a regular object is passed instead of a Document instance
166
- * Add HTML field type
167
- * Convert raw datasource data back to app-readable data after a create or update
168
- * Add `Document#getLocalVersion()` and `Document#getLocalVersionIfNewer()` for in the browser
169
- * Convert document data using `toServerSaveRecord` method before sending to server
170
- * Set a reference to the current controller on the `conduit` instance
171
-
172
- ## 1.0.5 (2018-10-18)
173
-
174
- * Submitting data over a socket will now also be JSON-DRY'd
175
- * Allow the server to use the client-side only controller if no server-side controller is found
176
- * Add validator classes
177
- * Add `Document.isDocument(obj)` static method
178
- * Make the save methods use a `Document` instance instead of a simple object
179
- * Add `Alchemy#findPathToBinarySync()` for finding a path to a binary
180
- * Fix copying & moving files on mac os
181
- * `Schema#addAssociation()` will no longer add a localKey if it already exists
182
- * Allow passing options to `Document#addAssociatedData()` and make it return a pledge
183
- * Also clear the client-side model cache when clearing the server-side class cache
184
- * Add export/import functionality
185
- * Clone object with `toHawkejs` method before stringifying when calling `Conduit#end()`
186
- * Add `undefined` "from" property to postcss options to prevent annoying warning
187
-
188
- ## 1.0.4 (2018-08-27)
189
-
190
- * Don't create a `db` instance when the MongoDatasource fails to connect
191
- * Add `Document#$attributes` property, where non-database values can be stored in
192
- * Add `Document#hasChanged(name)` method, to check if values have changed
193
- * Add `Document#resetFields()` to reset a document to its initial state
194
- * Fix SluggableBehaviour
195
- * Add `Document#needsToBeSaved()`
196
- * Make `Document#hasChanged()` detect changes in object values
197
- * Don't pass undefined `version` argument to `indexedDB.open()`
198
- * Add `Document#[Blast.alikeSymbol]` method to check for likeness
199
- * Add `Conduit#supports(feature)` to check for supported features (only async/await for now)
200
- * Add `nodent-compiler` optional dependency for compiling async/await code for IE11
201
- * The `PATH_ROOT` constant can now take its value from an environment variable
202
- * Make `loadHelpers` recursively load in a directory of helpers
203
- * Add `Alchemy#isObjectId(obj)` to see if a string or object is an object id
204
- * `Model#findById(id)` will throw an error when an invalid object id is given
205
- * Document constructor code is now moved to `setDataRecord` method, so it can be shared with the client-side instance
206
- * Add default `saveRecord` action to the Controller class, for client-side record saving
207
- * Add `getModel()` method to the custom Element class
208
- * Fix Paginate component interpreting empty filters as a regex
209
- * Fix Paginate filter inputs not showing the filtered value
210
- * Add `filtering` and `sorting` boolean property to `Pagination#getConfig()` method result
211
- * Check if manual slug values are actually valid
212
- * Add `time-ago` custom HTML element
213
-
214
- ## 1.0.3 (2018-07-12)
215
-
216
- * Update alchemy info page
217
- * `Schema#addField(name, type, options)` now allows you to directly pass a `Schema` instance as a type
218
- * Fix `DocumentList#findNextBatch` looking for the `_options` property, when it should be `options`
219
- * Also pass the `model` instance when creating a new `DocumentList` instance
220
- * Fix `Document#remove` not finding the $model property
221
- * `DocumentList` instances can now be created without any arguments
222
- * Add `DocumentList#toSimpleArray()` which returns an array of simple objects with only the wanted fields
223
- * Add `DocumentList.unDry` static method to the server-side class, because static methods don't get added by default yet
224
- * Fix `Document#conduit` causing an infinite loop
225
- * Change `Model.cacheDuration` to `Model.cache_duration`
226
- * Make `Model#save()` and `Model#findById()` also return Pledges
227
- * Make `Model#remove()`, `Document#remove()`, `Model#ensureIds()` return Pledges
228
- * Make MongoDataSource use `findOneAndDelete` to remove a record
229
- * Switched from `slug` dependency to `mollusc`, which is a fork with several fixes
230
- * When the `port` setting is `null`, a random port will be tried. All other falsy values will still not start the server.
231
- * `Alchemy#usePlugin(name, options)` now accepts a `path_to_plugin` option
232
- * `Alchemy#usePath()` will no longer load `test` folders
233
- * Fix paths equaling a prefix not working as you expect them to
234
- * Don't start socket.io when `settings.websockets` is false
235
- * Fix `Alchemy#broadcast(type, data)` not working
236
- * Add `Model#getBehaviour(name)`, which gets an existing instance on the current model
237
- * Add `Document#revert(revisions)` to revert to an earlier version of the document
238
-
239
- ## 1.0.2 (2018-07-07)
240
-
241
- * Fix `DocumentList#available` always defaulting to the length of the current set
242
- * Correctly parse `x-forwarded-for` in case there are multiple ip addresses
243
-
244
- ## 1.0.1 (2018-07-04)
245
-
246
- * Fix `mongodb` dependency version
247
-
248
- ## 1.0.0 (2018-07-04)
249
-
250
- * Split up old `Document` into `DocumentList` and `Document` class
251
- * Add client-side `Document`, `Model` and `DocumentList` classes
252
- * Class-specific `title` and `type_name` properties are now statics instead of protos
253
- * Add simple HTTP `HEAD` method support
254
- * `DbQuery` is now also available on the client side
255
- * Added query matching code from nedb to `DbQuery`
256
- * Removed nedb dependency
257
- * Model & Controller are now their own namespace
258
- * Added a Base class for the Client side + client conduit & controller
259
- * Custom elements should inherit from `Alchemy.Element` from now on
260
- * Add `Base#getClientPath` and `Base#getClientPathAfter`
261
- * Add `Conduit#chooseBestLocale(locales)` in order to get the best locale for the connection
262
- * Also check `data-breadcrumbs` when activating links
263
- * Starting the server with `--debug-requirements` will print info about which files are loaded using `alchemy.use`
264
-
265
- ## 0.5.0 (2018-01-05)
266
-
267
- * Wait for `Blast` to load before starting the `startServer` stage
268
- * `usePath` will now always first load in files and THEN directories
269
- * Renamed the `Alchemy.Command` class to `Alchemy.Task`
270
- * Added `applyButton` to `Pagination` helper
271
- * You can now set multiple `Pagination` filters
272
- * Helpers are now under the Hawkejs namespace
273
- * Added `Model#eachRecord(options, task, callback)`, which returns a `Pledge`
274
- * Setting `store_units` option on a Date field will store its unit info along with it
275
- * Parse useragents using the `useragent#lookup` method, which caches strings
276
- * Calls to `Conduit#error` will now also be emitted as a `conduit_error` event on the main `alchemy` instance
277
- * A `Route`'s options will now be stored in the `options` property
278
- * `Route#generateUrl` can now also accept a regular options object instead of a `Conduit`
279
- * Don't use `let` in the `Alchemy.Base` class, since it's also used in the browser
280
- * If a minified cached asset (stylesheet or script) gets deleted, re-minify it instead of blocking the request
281
- * The session store is now stored under `alchemy.sessions`
282
- * Request URLs ending with only a prefix, and no slash, will now also work
283
- * `Route#match` will now use `decodeURIComponent` when extracting url parameters
284
- * The helper `Router#printRoute` can now be used to only print an opening anchor when used in combination with `Router#closeRoute`
285
- * Added `PostCSS` and `autoprefixer` package
286
- * `Alchemy#pickTranslation` will give correct results when given prefix is falsy
287
- * The `StringFieldType` will now pick a translation in case the database value was an object
288
- * Add "segments", view blocks that have a specific route
289
- * Make `Model.find` return a `Pledge`
290
- * Mark the `Model` class as being an abstract class
291
- * Add UglifyJS global_defs for `Blast.isNode` and `Blast.isBrowser`
292
-
293
- ## 0.4.3 (2017-09-07)
294
-
295
- * Fix: don't set gutter on `Janeway#print` output when Janeway is not active
296
- * Fix: Client-side `Alchemy#switchLanguage` will now work when there are get queries
297
- * Add `use_found_prefix` to model search options. This used to be hard-coded yes, but now it is false by default
298
- * Calculate etag using `Object.checksum`, as fowler has too many collisions
299
- * Set the current active prefix using `internal` and `expose` as 'active_prefix' (`Conduit#prefix` will not be set, because that is only used when it's in the path!)
300
- * If header `x-alchemy-default-prefix` is set, use that as *default* prefix. This differs from `x-alchemy-prefix`, as that is a hard override.
301
- * Fix `useragent` not having the `satisfies` method
302
- * Fix `socket.io.js` not being served
303
- * Only create a dgram socket when it is needed
304
- * `getResource` of the `Alchemy` helper will now always add the data object as the second argument (it used to do 2 different things on loopback or client)
305
- * Upgrade `protoblast` dependency to 0.3.10
306
-
307
- ## 0.4.2 (2017-08-27)
308
-
309
- * Remove quotes from `content-type`'s UTF-8
310
- * Add `Controller#safeSet`, which uses `encodeHTML` to set strings
311
- * The session cookie has `httpOnly` enabled
312
- * Add `Conduit#is_secure` property
313
- * Enable the `secure` option by default when setting a cookie on a secure connection
314
- * Fix path traversal security bug in `findAssetPath`
315
- * The `scene_start_` cookie will only live for 15s in stead of 10 minutes
316
-
317
- ## 0.4.1 (2017-08-11)
318
-
319
- * Setting `sort` to false will now actually disable sorting
320
- * Fallback translations `__` will now be picked
321
- * Send hawkejs templates using regular JSON, not JSON-dry
322
- * Fix urls not being generated properly when using prefixes
323
- * Add `Controller#renderDialogIn` so dialogs can be rendered from the server side, too
324
- * Let the Mongo datasource retry to reconnect a near infinite amount of times
325
- * `Alchemy#downloadFile` now uses `Blast#fetch`
326
- * Alchemy will now exit when the parent process does
327
- * Add languageSwitcher
328
- * Number fields with value null won't be cast to 0 anymore
329
- * `Conduit#redirect` now uses temporary (301) redirects by default
330
- * Disabling a find's `recursive` will now also apply to a subschema
331
- * Hidden files (starting with ".") or the "empty" file will no longer be loaded
332
- * You can now set parameters using `Conduit#param(name, value)`
333
- * `Conduit#param(name)` will now also look in the cookies
334
- * Add support for `assume_https` config and `x-forwarded-proto` header
335
- * Alchemy won't listen to multicast address by default
336
-
337
- ## 0.4.0 (2017-04-17)
338
-
339
- * Fixed router issue in the Alchemy helper
340
- * `PATH_*` globals are now constants
341
- * Removed `APP_ROOT`, `PATH_APP` has been available for years
342
- * The version of your app and alchemy itself are added to `process.versions`
343
- * The global `alchemy` object is now an instance of the `Alchemy` class
344
- * Added `Alchemy#makeNextRequireStrict()` which adds `use strict` to the next required module
345
- * Fixed adding indexes to nested fields
346
- * Automatically add 2dsphere index to Geopoint fields
347
- * Added `qs` dependency so nested GET parameters can be decoded properly
348
- * Add cache method to client-side `alchemy#fetch` method
349
- * A model's Document class will now inherit from that model's parent's document class
350
- * Self-referencing Schema fields are no longer queried for now, this causes deadlocks to occur
351
- * Add `alchemy.__` to client-side javascript
352
- * Also emit the full linkup packets as a 'linkup_packet' event
353
- * Base class fixes
354
- * Add hawkejs multiple-template serving middleware
355
-
356
- ## 0.3.3 (2017-01-21)
357
-
358
- * Fix $or grouping during normalization of `Query` conditions
359
- * Further split up the `Conduit` class
360
- * Fix some `Resource` issues in the alchemy helper
361
- * Add a `Document#toArray()` method
362
- * Put non-translated, orphaned, strings in a '__' prefix when fetched from server
363
- * Optimize `Model#ensureIds`
364
- * Add router section identifiers (for in selects, ...)
365
- * Add `conduit` property getter to `Document`
366
- * Fix new cookies being ignored on a redirect
367
- * Set option `set_updated` to false during saving so the `updated` field won't be changed
368
- * Add `of_group_name` static property to classes
369
- * Add `count` as find option
370
- * Add `Model#beforeSave` callback support
371
- * Pass query options to `Document`
372
- * Set `x-history-url` on internal redirect (and expose to hawkejs)
373
- * Change cache-control to cache for max 1 hour (in stead of 1 year)
374
- * Add options to the `Document#save` method
375
- * Find next batch of limited find results using `Document#findNextBatch`
376
- * No longer die when trying to use a "priviliged" port
377
- * Upgrade protoblast to version 0.4.0
378
- * Upgrade hawkejs to version 1.1.2
379
-
380
- ## 0.3.2 (2016-10-19)
381
-
382
- * Forgot to upgrade the Janeway package
383
-
384
- ## 0.3.1 (2016-10-19)
385
-
386
- * Upgraded NPM packages
387
- * Set terminal title using Janeway
388
- * Fixed inheritance issues
389
- * Janeway can now also be disabled by setting the DISABLE_JANEWAY env to 1
390
- * Setting `alchemy.settings.silent` to true will disable the custom `log` calls
391
-
392
- ## 0.3.0 (2016-10-04)
393
-
394
- * Added Base class in Alchemy namespace
395
- * `alchemy.classes` has been removed in favor of `Classes`
396
- * Added Command class
397
- * Associated record data will now also be saved
398
- * Sluggable behaviour has been fixed
399
- * Add `file_path` property to `useOnce` require errors
400
- * Bugfixes in the Router helper
401
- * Allow registering modules as null
402
- * Load mmmagic on-the-fly, don't preload bcrypt and chokidar
403
- * Add `alchemy.broadcast` which broadcasts to every connected websocket scene
404
-
405
- ## 0.2.2 (2016-07-02)
406
-
407
- * Update socket.io dependencies, fixing reconnection issues
408
- * Added `log.once(id, ...)` to log a specific message only once
409
- * Added `log.less(id, ...)` to log messages only once per second
410
- * Added `log.setLessConfig` if you want to set specific limit for log.less
411
-
412
- ## 0.2.1 (2016-06-27)
413
-
414
- * ClientSocket now has an `offset` and `latency` property plus `now()` timestamp method
415
- * SocketConduit now has an `ip` property
416
- * `ModelDocument` now has an `init` method that gets called on creation
417
-
418
- ## 0.2.0 (2016-06-26)
419
-
420
- * Switched to Hawkejs v1.0.0
421
- * Removed cruft (continuation, ...)
422
- * Removed old Nuclei-way of defining classes
423
- * Added new classes:
424
- - Conduit
425
- - Schema
426
- - Router
427
- - Route
428
- - FieldType
429
- - Datasource
430
-
431
- ## 0.1.0 (2014-09-10)
432
-
433
- * Remove mongoose & MongoDB eval code (still need to add validation support)
434
- * Added sluggable behaviour
435
- * Added Object.isEmpty method
436
- * Array.cast converts array-like objects to regular arrays (but not Strings),
437
- if the variable is undefined an empty array is returned
438
- * Add 'score' method to String prototype, to determine how similar strings are
439
- * Add 'alchemy.after' method, which will do something after the given event has
440
- been emitted, even if it has been emitted in the past
441
- * Add hasValue and getValueKey to Object, also works on arrays
442
- * When saving data you can pass the 'allowedIndexes' option, which should be an
443
- array of indexes allowed to be looked through for existing records.
444
- If it's an empty array, only the _id will be used. If it's false, every index
445
- is used.
446
- * Add 'divide' method to Object, which creates a new array where every key-value
447
- pair is a new object
448
- * Spin off prototype & inflections to new module: protoblast
449
- * Added publishable behaviour
450
-
451
- ## 0.0.1 (2014-04-04)
452
-
453
- * Finalise version 0.0.1 after a year of initial development,
454
- now we can start removing mongoose.
1
+ ## 1.1.9 (2021-12-06)
2
+
3
+ * Fix request files not being set correctly when using a nested form path (Backport)
4
+
5
+ ## 1.1.8 (2021-09-12)
6
+
7
+ * Add `conduit` getter to the Base class
8
+ * Use Protoblast's temp file methods instead of `temp`
9
+ * Add `/hawkejs/static.js` middleware
10
+ * Use `sass` instead of the deprecated `node-sass`
11
+ * Use Protoblast's slug method instead of mollusc
12
+ * Add some more Directory & File methods
13
+
14
+ ## 1.1.7 (2021-06-11)
15
+
16
+ * Add `Alchemy.Criteria.FieldConfig#getDisplayValueIn(data)` method to get a simple string representation of a value
17
+ * Check field class constructor in `Schema#addField()`
18
+ * Allow RegExp values for String fields during a query
19
+ * Requesting a route with the wrong method will now return a 405 error (Method Not Allowed) instead of a 404
20
+ * Fix client `Model` classes not being able to perform a query when running on the server in loopback mode
21
+ * Fix `time-ago` element refreshing every second when counting down to a date
22
+ * Fix the `Loopback` conduit sometimes setting the wrong route method
23
+
24
+ ## 1.1.6 (2021-04-29)
25
+
26
+ * Switch from `uglify-es` to `terser` for minifying JavaScript files
27
+ * Allow overriding any setting from the command line
28
+ * Use `Branch` class for clearing model cache
29
+
30
+ ## 1.1.5 (2021-01-21)
31
+
32
+ * Fallback to the `ENV` environment variable to set the environment
33
+ * Fix rendering of segments
34
+ * Fix Loopback conduits not setting the correct data when only provided with a route name
35
+ * Set the `Hawkejs.Renderer` language once we have a prefix
36
+ * Automatically add the `hreflang` attribute to links created with the Router helper
37
+ * Fix `Conduit#url` property having the wrong path set
38
+ * Load `helper_datasource` and `helper_field` folders before main `helper` folder
39
+ * Add `Alchemy#checksum(value)` method
40
+ * Throw an error when a class instance is used as a criteria condition
41
+ * Fix breadcrumbs for routes that contain objects
42
+ * Apply active-link breadcrumb classes while creating the anchors
43
+
44
+ ## 1.1.4 (2020-12-10)
45
+
46
+ * Fix certain socket linkup packets not being json-dry encodes
47
+ * Make `Alchemy#findImagePath()` return a promise
48
+ * Make `FieldConfig` class more aware of paths
49
+ * Fix `Validator#validateFieldValue()` throwing an error when a field contains multiple violations
50
+ * Fix Schema fields not translating translatable fields
51
+ * Fix `Validations` errors always having only max 1 field error
52
+
53
+ ## 1.1.3 (2020-11-12)
54
+
55
+ * Add `Schema#clone()` method
56
+ * Add `Schema#field_count` property
57
+ * Fix `Schema#addField()` throwing an error when adding a schema field on the browser side
58
+ * Added `Criteria#page(page, page_size)`
59
+ * `Conduit` classes have been moved into the `Conduit` namespace
60
+ * `Conduit.Loopback` now correctly sets the method & body
61
+ * Added `Criteria.FieldSet` and `Criteria.FieldConfig` classes
62
+ * Object responses via `Conduit.Loopback#end()` will now first be cloned with the `toHawkejs` clone option
63
+ * `Model#find()` will now reject when no `datasource` property is set
64
+ * Add support for `fonts` asset folders
65
+ * Add `CustomElement#getCurrentUrl()` method
66
+
67
+ ## 1.1.2 (2020-10-08)
68
+
69
+ * Fix Client class methods not being set on the server-side for classes defined in a plugin
70
+ * Add `Criteria#isEmpty()` field check
71
+ * Add `Linkup#demand()` method
72
+ * Add `--socket` startup argument support
73
+ * When the given socket path is a directory, create a socket in that directory with the current project name
74
+ * Add `--url` startup argument, which will print the url in the console
75
+ * Add `--preload` startup argument, which will load the homepage & the client file on startup
76
+ * Allow opening redirects in a popup window
77
+
78
+ ## 1.1.1 (2020-07-24)
79
+
80
+ * Add `Base.mapEventToMethod()` to register simple emitted events names to methods per class
81
+ * Add `Base#issueEvent(name, args, callback)` which will use the mapped event-to-method map to execute the method first & then emit the events
82
+ * Implement the new event-and-method flow in Controller & Models
83
+ * Already set the Hawkejs Renderer `is_for_client_side` property before calling the middleware
84
+ * All the properties of the `parameters` property will be used in the Router directive
85
+
86
+ ## 1.1.0 (2020-07-21)
87
+
88
+ * Add `Schema#getDatasource()` which returns a pledge that resolves to the datasource
89
+ * `Alchemy#requirePlugin(name, attempt)` will now attempt to load the plugin if it hasn't been done yet
90
+ * Add `Criteria` class, which replaces the messy `DbQuery` class and is a query builder to boot.
91
+ * The `Datasource` & `Field` class is now also available on the client side
92
+ * Typedefs in routes can now contain fields, like `/{[Model._id]custom_id_name}/`
93
+ * Add `Models#load_external_schema` boolean property
94
+ * Add `second_format` option to Date & Datetime fields, allowing you to save Date as a timestamp
95
+ * Add `Datasource#allows(name)` to see if read/create/remove/update is allowed
96
+ * Add `Inode` namespace & `File` & `Directory` classes, as our way of dealing with files
97
+ * Also set the `method` property on the client-side `Conduit` instance
98
+ * Replace `Document.$main` object with save result
99
+ * Add `Model#findByValues` and `Model#findAllByValues`
100
+ * Add `Router#serveDependencyFile()` for when you want to serve a file from within a dependency
101
+ * Decode path parameters using `RURL.decodeUriSegment()`
102
+ * Add `$hold` property to Document class, which are also sent to the client
103
+ * `Conduit#redirect()` now has a `hard_refresh` option, to force a non-ajax redirection
104
+ * `DocumentList` can now be iterated over
105
+ * Removing the cached client file will no longer cause 404 errors
106
+ * Conduit responses can now be ended with a buffer
107
+ * Sessions will emit the `removed` event when they're being removed
108
+ * Websocket messages will no longer be resent upon reconnect
109
+ * Add `populate` method to `DocumentList`
110
+ * When adding an association to a model, an index will automatically be made
111
+ * Uploaded files now use Alchemy's `Inode.File` class
112
+ * The `Criteria` class can now be asynchronously iterated over
113
+ * The `Fallback` datasource will now use the `read` method instead of `_read`
114
+ * Add `Schema.isSchema()` method
115
+ * `Enum` values will now also be serialized for the client-side config
116
+ * The `Router` helper directive will now look for a `url_attribute` property on the target element
117
+ * Add custom Error classes under the Classes.Alchemy.Error namespace
118
+ * Re-added validation support with the `Validator` & `Violation` classes
119
+ * Use `Blast.fetch()` in the `Alchemy#request()` method
120
+ * Rename `Model#findById()` to `Model#findByPk()`
121
+ * Add `Document#refreshValues()` to re-query the data from the database
122
+ * Allow individual associations to be resolved by the datasource itself
123
+ * Throw an error when trying to set a Document's data record to an invalid value
124
+ * Fix getting the path of fields in a subschema
125
+ * Add `Schema#getFieldChain(path)` and `Field#getFieldChain()`
126
+ * Add `FieldValue` class and use it for the new `Field#getDocumentValues(document)` method
127
+ * Add `Alchemy#getPrefixes()` to get the prefixes object on the server & client
128
+ * The `Alchemy#pickTranslation()` method now also accepts a conduit as prefix choices
129
+ * Add source-map support
130
+
131
+ ## 1.0.8 (2019-01-12)
132
+
133
+ * Fix for package.json dependency version error
134
+
135
+ ## 1.0.7 (2019-01-12)
136
+
137
+ * Setting `prefer: "client"` and `layout` property on a Route will let the client render the action once the base layout is loaded
138
+ * Add default `Conduit#notAuthorized()` and `Conduit#forbidden()` method
139
+ * Add support for some basic `policy` property on a Route
140
+ * Make the `Scene#interceptOpenUrl` method set the internal `breadcrumb` variable
141
+ * Add appcache support
142
+ * The `offline_clients` setting needs to be truthy in order to send an appcache manifest
143
+ * Fix `Schema#getField()` not looking in the subschema of a SchemaFieldType
144
+ * Fix `Model#find('count')` returning wrong value when result is 0
145
+ * Add `Alchemy#getMedHash()` function to get a simple, non-verification hash of a file
146
+ * The `Conduit#body` property can now be overwritten
147
+ * Allow json-dry data from logged-in users during a readDataSource request
148
+ * Add `FieldType#datasource` property
149
+ * Add `Datasource.setSupport(name, value)` and `Datasource.supports(name)`
150
+ * Use `Datasource.supports('objectid')` to see if it understands ObjectID instances
151
+ * Add `Alchemy#statPath(path, options)` function
152
+ * Allow `Model.addField()` to override already existing fields
153
+ * Add pledge support to `Alchemy#openUrl()`
154
+ * `Alchemy#findPathToBinarySync()` will now also look in the `/bin/` directory
155
+ * Deprecate `Alchemy#List()`
156
+ * Add more unit tests
157
+
158
+ ## 1.0.6 (2018-12-06)
159
+
160
+ * Add `Document#is_new_record` property
161
+ * Fix `Document#[Symbol(alike)]` method
162
+ * Fix bug in SluggableBehaviour always assuming an existing record will be found
163
+ * Work around adding document methods before parent model is ready
164
+ * Make client-side Document classes inherit from correct parent
165
+ * Allow querying for extraneous, out-of-schema fields by passing the `extraneous` option
166
+ * Fix renderings of client-side Controller actions
167
+ * Use aggregate `sortByPath` in client-side IndexedDB search
168
+ * Add `Alchemy.Client.Document.getClassForUndry()` method
169
+ * `Model#saveRecord()` will now throw an error when a regular object is passed instead of a Document instance
170
+ * Add HTML field type
171
+ * Convert raw datasource data back to app-readable data after a create or update
172
+ * Add `Document#getLocalVersion()` and `Document#getLocalVersionIfNewer()` for in the browser
173
+ * Convert document data using `toServerSaveRecord` method before sending to server
174
+ * Set a reference to the current controller on the `conduit` instance
175
+
176
+ ## 1.0.5 (2018-10-18)
177
+
178
+ * Submitting data over a socket will now also be JSON-DRY'd
179
+ * Allow the server to use the client-side only controller if no server-side controller is found
180
+ * Add validator classes
181
+ * Add `Document.isDocument(obj)` static method
182
+ * Make the save methods use a `Document` instance instead of a simple object
183
+ * Add `Alchemy#findPathToBinarySync()` for finding a path to a binary
184
+ * Fix copying & moving files on mac os
185
+ * `Schema#addAssociation()` will no longer add a localKey if it already exists
186
+ * Allow passing options to `Document#addAssociatedData()` and make it return a pledge
187
+ * Also clear the client-side model cache when clearing the server-side class cache
188
+ * Add export/import functionality
189
+ * Clone object with `toHawkejs` method before stringifying when calling `Conduit#end()`
190
+ * Add `undefined` "from" property to postcss options to prevent annoying warning
191
+
192
+ ## 1.0.4 (2018-08-27)
193
+
194
+ * Don't create a `db` instance when the MongoDatasource fails to connect
195
+ * Add `Document#$attributes` property, where non-database values can be stored in
196
+ * Add `Document#hasChanged(name)` method, to check if values have changed
197
+ * Add `Document#resetFields()` to reset a document to its initial state
198
+ * Fix SluggableBehaviour
199
+ * Add `Document#needsToBeSaved()`
200
+ * Make `Document#hasChanged()` detect changes in object values
201
+ * Don't pass undefined `version` argument to `indexedDB.open()`
202
+ * Add `Document#[Blast.alikeSymbol]` method to check for likeness
203
+ * Add `Conduit#supports(feature)` to check for supported features (only async/await for now)
204
+ * Add `nodent-compiler` optional dependency for compiling async/await code for IE11
205
+ * The `PATH_ROOT` constant can now take its value from an environment variable
206
+ * Make `loadHelpers` recursively load in a directory of helpers
207
+ * Add `Alchemy#isObjectId(obj)` to see if a string or object is an object id
208
+ * `Model#findById(id)` will throw an error when an invalid object id is given
209
+ * Document constructor code is now moved to `setDataRecord` method, so it can be shared with the client-side instance
210
+ * Add default `saveRecord` action to the Controller class, for client-side record saving
211
+ * Add `getModel()` method to the custom Element class
212
+ * Fix Paginate component interpreting empty filters as a regex
213
+ * Fix Paginate filter inputs not showing the filtered value
214
+ * Add `filtering` and `sorting` boolean property to `Pagination#getConfig()` method result
215
+ * Check if manual slug values are actually valid
216
+ * Add `time-ago` custom HTML element
217
+
218
+ ## 1.0.3 (2018-07-12)
219
+
220
+ * Update alchemy info page
221
+ * `Schema#addField(name, type, options)` now allows you to directly pass a `Schema` instance as a type
222
+ * Fix `DocumentList#findNextBatch` looking for the `_options` property, when it should be `options`
223
+ * Also pass the `model` instance when creating a new `DocumentList` instance
224
+ * Fix `Document#remove` not finding the $model property
225
+ * `DocumentList` instances can now be created without any arguments
226
+ * Add `DocumentList#toSimpleArray()` which returns an array of simple objects with only the wanted fields
227
+ * Add `DocumentList.unDry` static method to the server-side class, because static methods don't get added by default yet
228
+ * Fix `Document#conduit` causing an infinite loop
229
+ * Change `Model.cacheDuration` to `Model.cache_duration`
230
+ * Make `Model#save()` and `Model#findById()` also return Pledges
231
+ * Make `Model#remove()`, `Document#remove()`, `Model#ensureIds()` return Pledges
232
+ * Make MongoDataSource use `findOneAndDelete` to remove a record
233
+ * Switched from `slug` dependency to `mollusc`, which is a fork with several fixes
234
+ * When the `port` setting is `null`, a random port will be tried. All other falsy values will still not start the server.
235
+ * `Alchemy#usePlugin(name, options)` now accepts a `path_to_plugin` option
236
+ * `Alchemy#usePath()` will no longer load `test` folders
237
+ * Fix paths equaling a prefix not working as you expect them to
238
+ * Don't start socket.io when `settings.websockets` is false
239
+ * Fix `Alchemy#broadcast(type, data)` not working
240
+ * Add `Model#getBehaviour(name)`, which gets an existing instance on the current model
241
+ * Add `Document#revert(revisions)` to revert to an earlier version of the document
242
+
243
+ ## 1.0.2 (2018-07-07)
244
+
245
+ * Fix `DocumentList#available` always defaulting to the length of the current set
246
+ * Correctly parse `x-forwarded-for` in case there are multiple ip addresses
247
+
248
+ ## 1.0.1 (2018-07-04)
249
+
250
+ * Fix `mongodb` dependency version
251
+
252
+ ## 1.0.0 (2018-07-04)
253
+
254
+ * Split up old `Document` into `DocumentList` and `Document` class
255
+ * Add client-side `Document`, `Model` and `DocumentList` classes
256
+ * Class-specific `title` and `type_name` properties are now statics instead of protos
257
+ * Add simple HTTP `HEAD` method support
258
+ * `DbQuery` is now also available on the client side
259
+ * Added query matching code from nedb to `DbQuery`
260
+ * Removed nedb dependency
261
+ * Model & Controller are now their own namespace
262
+ * Added a Base class for the Client side + client conduit & controller
263
+ * Custom elements should inherit from `Alchemy.Element` from now on
264
+ * Add `Base#getClientPath` and `Base#getClientPathAfter`
265
+ * Add `Conduit#chooseBestLocale(locales)` in order to get the best locale for the connection
266
+ * Also check `data-breadcrumbs` when activating links
267
+ * Starting the server with `--debug-requirements` will print info about which files are loaded using `alchemy.use`
268
+
269
+ ## 0.5.0 (2018-01-05)
270
+
271
+ * Wait for `Blast` to load before starting the `startServer` stage
272
+ * `usePath` will now always first load in files and THEN directories
273
+ * Renamed the `Alchemy.Command` class to `Alchemy.Task`
274
+ * Added `applyButton` to `Pagination` helper
275
+ * You can now set multiple `Pagination` filters
276
+ * Helpers are now under the Hawkejs namespace
277
+ * Added `Model#eachRecord(options, task, callback)`, which returns a `Pledge`
278
+ * Setting `store_units` option on a Date field will store its unit info along with it
279
+ * Parse useragents using the `useragent#lookup` method, which caches strings
280
+ * Calls to `Conduit#error` will now also be emitted as a `conduit_error` event on the main `alchemy` instance
281
+ * A `Route`'s options will now be stored in the `options` property
282
+ * `Route#generateUrl` can now also accept a regular options object instead of a `Conduit`
283
+ * Don't use `let` in the `Alchemy.Base` class, since it's also used in the browser
284
+ * If a minified cached asset (stylesheet or script) gets deleted, re-minify it instead of blocking the request
285
+ * The session store is now stored under `alchemy.sessions`
286
+ * Request URLs ending with only a prefix, and no slash, will now also work
287
+ * `Route#match` will now use `decodeURIComponent` when extracting url parameters
288
+ * The helper `Router#printRoute` can now be used to only print an opening anchor when used in combination with `Router#closeRoute`
289
+ * Added `PostCSS` and `autoprefixer` package
290
+ * `Alchemy#pickTranslation` will give correct results when given prefix is falsy
291
+ * The `StringFieldType` will now pick a translation in case the database value was an object
292
+ * Add "segments", view blocks that have a specific route
293
+ * Make `Model.find` return a `Pledge`
294
+ * Mark the `Model` class as being an abstract class
295
+ * Add UglifyJS global_defs for `Blast.isNode` and `Blast.isBrowser`
296
+
297
+ ## 0.4.3 (2017-09-07)
298
+
299
+ * Fix: don't set gutter on `Janeway#print` output when Janeway is not active
300
+ * Fix: Client-side `Alchemy#switchLanguage` will now work when there are get queries
301
+ * Add `use_found_prefix` to model search options. This used to be hard-coded yes, but now it is false by default
302
+ * Calculate etag using `Object.checksum`, as fowler has too many collisions
303
+ * Set the current active prefix using `internal` and `expose` as 'active_prefix' (`Conduit#prefix` will not be set, because that is only used when it's in the path!)
304
+ * If header `x-alchemy-default-prefix` is set, use that as *default* prefix. This differs from `x-alchemy-prefix`, as that is a hard override.
305
+ * Fix `useragent` not having the `satisfies` method
306
+ * Fix `socket.io.js` not being served
307
+ * Only create a dgram socket when it is needed
308
+ * `getResource` of the `Alchemy` helper will now always add the data object as the second argument (it used to do 2 different things on loopback or client)
309
+ * Upgrade `protoblast` dependency to 0.3.10
310
+
311
+ ## 0.4.2 (2017-08-27)
312
+
313
+ * Remove quotes from `content-type`'s UTF-8
314
+ * Add `Controller#safeSet`, which uses `encodeHTML` to set strings
315
+ * The session cookie has `httpOnly` enabled
316
+ * Add `Conduit#is_secure` property
317
+ * Enable the `secure` option by default when setting a cookie on a secure connection
318
+ * Fix path traversal security bug in `findAssetPath`
319
+ * The `scene_start_` cookie will only live for 15s in stead of 10 minutes
320
+
321
+ ## 0.4.1 (2017-08-11)
322
+
323
+ * Setting `sort` to false will now actually disable sorting
324
+ * Fallback translations `__` will now be picked
325
+ * Send hawkejs templates using regular JSON, not JSON-dry
326
+ * Fix urls not being generated properly when using prefixes
327
+ * Add `Controller#renderDialogIn` so dialogs can be rendered from the server side, too
328
+ * Let the Mongo datasource retry to reconnect a near infinite amount of times
329
+ * `Alchemy#downloadFile` now uses `Blast#fetch`
330
+ * Alchemy will now exit when the parent process does
331
+ * Add languageSwitcher
332
+ * Number fields with value null won't be cast to 0 anymore
333
+ * `Conduit#redirect` now uses temporary (301) redirects by default
334
+ * Disabling a find's `recursive` will now also apply to a subschema
335
+ * Hidden files (starting with ".") or the "empty" file will no longer be loaded
336
+ * You can now set parameters using `Conduit#param(name, value)`
337
+ * `Conduit#param(name)` will now also look in the cookies
338
+ * Add support for `assume_https` config and `x-forwarded-proto` header
339
+ * Alchemy won't listen to multicast address by default
340
+
341
+ ## 0.4.0 (2017-04-17)
342
+
343
+ * Fixed router issue in the Alchemy helper
344
+ * `PATH_*` globals are now constants
345
+ * Removed `APP_ROOT`, `PATH_APP` has been available for years
346
+ * The version of your app and alchemy itself are added to `process.versions`
347
+ * The global `alchemy` object is now an instance of the `Alchemy` class
348
+ * Added `Alchemy#makeNextRequireStrict()` which adds `use strict` to the next required module
349
+ * Fixed adding indexes to nested fields
350
+ * Automatically add 2dsphere index to Geopoint fields
351
+ * Added `qs` dependency so nested GET parameters can be decoded properly
352
+ * Add cache method to client-side `alchemy#fetch` method
353
+ * A model's Document class will now inherit from that model's parent's document class
354
+ * Self-referencing Schema fields are no longer queried for now, this causes deadlocks to occur
355
+ * Add `alchemy.__` to client-side javascript
356
+ * Also emit the full linkup packets as a 'linkup_packet' event
357
+ * Base class fixes
358
+ * Add hawkejs multiple-template serving middleware
359
+
360
+ ## 0.3.3 (2017-01-21)
361
+
362
+ * Fix $or grouping during normalization of `Query` conditions
363
+ * Further split up the `Conduit` class
364
+ * Fix some `Resource` issues in the alchemy helper
365
+ * Add a `Document#toArray()` method
366
+ * Put non-translated, orphaned, strings in a '__' prefix when fetched from server
367
+ * Optimize `Model#ensureIds`
368
+ * Add router section identifiers (for in selects, ...)
369
+ * Add `conduit` property getter to `Document`
370
+ * Fix new cookies being ignored on a redirect
371
+ * Set option `set_updated` to false during saving so the `updated` field won't be changed
372
+ * Add `of_group_name` static property to classes
373
+ * Add `count` as find option
374
+ * Add `Model#beforeSave` callback support
375
+ * Pass query options to `Document`
376
+ * Set `x-history-url` on internal redirect (and expose to hawkejs)
377
+ * Change cache-control to cache for max 1 hour (in stead of 1 year)
378
+ * Add options to the `Document#save` method
379
+ * Find next batch of limited find results using `Document#findNextBatch`
380
+ * No longer die when trying to use a "priviliged" port
381
+ * Upgrade protoblast to version 0.4.0
382
+ * Upgrade hawkejs to version 1.1.2
383
+
384
+ ## 0.3.2 (2016-10-19)
385
+
386
+ * Forgot to upgrade the Janeway package
387
+
388
+ ## 0.3.1 (2016-10-19)
389
+
390
+ * Upgraded NPM packages
391
+ * Set terminal title using Janeway
392
+ * Fixed inheritance issues
393
+ * Janeway can now also be disabled by setting the DISABLE_JANEWAY env to 1
394
+ * Setting `alchemy.settings.silent` to true will disable the custom `log` calls
395
+
396
+ ## 0.3.0 (2016-10-04)
397
+
398
+ * Added Base class in Alchemy namespace
399
+ * `alchemy.classes` has been removed in favor of `Classes`
400
+ * Added Command class
401
+ * Associated record data will now also be saved
402
+ * Sluggable behaviour has been fixed
403
+ * Add `file_path` property to `useOnce` require errors
404
+ * Bugfixes in the Router helper
405
+ * Allow registering modules as null
406
+ * Load mmmagic on-the-fly, don't preload bcrypt and chokidar
407
+ * Add `alchemy.broadcast` which broadcasts to every connected websocket scene
408
+
409
+ ## 0.2.2 (2016-07-02)
410
+
411
+ * Update socket.io dependencies, fixing reconnection issues
412
+ * Added `log.once(id, ...)` to log a specific message only once
413
+ * Added `log.less(id, ...)` to log messages only once per second
414
+ * Added `log.setLessConfig` if you want to set specific limit for log.less
415
+
416
+ ## 0.2.1 (2016-06-27)
417
+
418
+ * ClientSocket now has an `offset` and `latency` property plus `now()` timestamp method
419
+ * SocketConduit now has an `ip` property
420
+ * `ModelDocument` now has an `init` method that gets called on creation
421
+
422
+ ## 0.2.0 (2016-06-26)
423
+
424
+ * Switched to Hawkejs v1.0.0
425
+ * Removed cruft (continuation, ...)
426
+ * Removed old Nuclei-way of defining classes
427
+ * Added new classes:
428
+ - Conduit
429
+ - Schema
430
+ - Router
431
+ - Route
432
+ - FieldType
433
+ - Datasource
434
+
435
+ ## 0.1.0 (2014-09-10)
436
+
437
+ * Remove mongoose & MongoDB eval code (still need to add validation support)
438
+ * Added sluggable behaviour
439
+ * Added Object.isEmpty method
440
+ * Array.cast converts array-like objects to regular arrays (but not Strings),
441
+ if the variable is undefined an empty array is returned
442
+ * Add 'score' method to String prototype, to determine how similar strings are
443
+ * Add 'alchemy.after' method, which will do something after the given event has
444
+ been emitted, even if it has been emitted in the past
445
+ * Add hasValue and getValueKey to Object, also works on arrays
446
+ * When saving data you can pass the 'allowedIndexes' option, which should be an
447
+ array of indexes allowed to be looked through for existing records.
448
+ If it's an empty array, only the _id will be used. If it's false, every index
449
+ is used.
450
+ * Add 'divide' method to Object, which creates a new array where every key-value
451
+ pair is a new object
452
+ * Spin off prototype & inflections to new module: protoblast
453
+ * Added publishable behaviour
454
+
455
+ ## 0.0.1 (2014-04-04)
456
+
457
+ * Finalise version 0.0.1 after a year of initial development,
458
+ now we can start removing mongoose.