2.0.5 (2021-08-08)
2.0.4 (2021-08-08)
2.0.3 (2020-06-20)
- types: allow providing value type to
getRaw(a41da36)
v2.0.2 (2019-06-30)
2.0.1 (2019-06-24)
- timestamps: only create timestamp triggers when necessary (35dbab6)
2.0.0 (2019-06-12)
v2.0.0 is a significant release. The highlights are:
- rewritten in TypeScript
- lifecycle hooks
- Node 8.10 minimum version requirement
To try it out, use:
# using yarn
yarn add trilogy@2.0.0
# using npm
npm i trilogy@2.0.0
The documentation has also been expanded and improved, and is available at https://trilogy.js.org.
trilogy has been rewritten in TypeScript, which paid off early and often — two of the last three 1.x patch releases contained fixes found in the process of refactoring the code base with types. It also provides a greatly improved editing experience:
click to expand
import * as trilogy from 'trilogy'
const db = trilogy.connect(':memory:')
// you can provide types like this to `model()`
// to get compiler assistance
type Person = {
name: string
}
;(async () => {
const people = await db.model<Person>('people', {
name: String
})
await people.create({ names: 'typo' })
// !> Property 'names' does not exist in type 'Person'. Did you mean 'name'?
})()
A set of lifecycle hooks has been implemented, of which before* variants support
canceling events. These hooks are useful for debugging, logging, and simple
plugin-like addons.
click to expand
const { connect, EventCancellation } = require('./dist')
const db = connect(':memory:')
;(async () => {
const notRobots = await db.model('notRobots', {
name: String,
intelligence: Number
})
const unsub = await notRobots.beforeCreate(async person => {
if (person.intelligence < 1650) {
console.log('ignoring total human- ... uh, robot')
return EventCancellation
}
person.name += ' (totally not a robot)'
})
console.log(await db.create('notRobots', {
name: '0110101101001111010001010',
intelligence: 96156615
}))
// -> { name: '0110101101001111010001010 (totally not a robot)',
// intelligence: 96156615 }
console.log(await db.create('notRobots', {
name: 'Tom',
intelligence: 100
}))
// "ignoring total human- ... uh, robot"
// -> undefined
// removes the hook, objects after this are unaffected
unsub()
await db.close()
})()
- store dates as ISO formatted strings (d2a7cda)
- write trilogy in typescript
- add lifecycle hooks
- remove
verbosein favor ofonQueryhook (cf7d085) - invariant: throw standard
Errorinstead of custom type (5a4bf70) - schema: make
nullableactually work inversely tonotNullable(e4ccc51) - schema-helpers: throw on non-string column types (43eebb6)
- where,cast: make casting & where clauses stricter (3ecee37)
- schema-helpers: throw on empty schemas (ce4a066)
- throw if property name is required but not provided (ede6363)
- find*: move column signatures into their own methods (a73f773)
- count: split
model.countwith column tocountIn(df4ccb4) - schema-helpers: throw on invalid column types (9d22fc2)
- enforce valid option parameters with
runtypes(755555d) - unabbreviate
incr&decrmethods (04404fe) - upgrade to sql.js 1.x (9669dcf)
- count: avoid
argumentsusage (cb33ff1)
- schema: providing both the
nullable¬Nullableproperties will cause anErrorto be thrown. - where,cast: invalid where clauses and unrecognized types at casting will now cause
Errors to be thrown. - schema-helpers: an error will be thrown when column type cannot be retrieved.
- invariant:
InvariantErrors are no longer thrown, they areErrors instead. - flow: flow definitions have been removed.
- find*:
find()andfindOne()on models no longer accept an optional column argument. Instead, use the newfindIn()orfindOneIn()methods. Top level trilogy methods still accepttable.columndot notation. - count:
model.countno longer has a signature allowing a column as the first parameter. This is now a separate method calledcountIn. - schema-helpers: using an unknown column type in a descriptor will now result in an error.
- an error will now be thrown immediately from methods that require a property name if none is provided.
- date serialization has changed to improve reliability and predictability.
incr&decrhave been renamed toincrement&decrement.- invalid options objects passed to methods accepting them will now cause exceptions to be thrown.
- the
verboseoption has been removed from trilogy instances. Use the newonQueryhook instead.
Support for Node 4 and Node 6 has been dropped, meaning trilogy now requires >=8.10.
trilogy no longer has a default export in order to better support TypeScript users. The recommended way to create a new instance has also changed (though the old way is still possible).
// before
import Trilogy from 'trilogy'
const db = new Trilogy(':memory:')
// after
import { connect } from 'trilogy'
const db = connect(':memory:')
v1.4.6 (2019-05-30)
To prevent installation breakage on newer Node releases, a third-party dependency now has its version pinned.
- package: pin osom dependency to prevent installation breakage
1.4.5 (2018-04-24)
No changes since 1.4.4 - this release restores the v1 release line to the latest tag,
where a v2 beta was accidentally publish.
1.4.4 (2018-01-09)
- enforcers:
groupBy->group(3eaed9a)
1.4.3 (2018-01-09)
- handle tuple where clauses correctly (efbea74)
1.4.2 (2017-12-08)
- create: prevent error while searching for last object (5379bb5)
- types: handle nullish values when casting (e8193c6), closes #79
- util: use
indexOfinstead ofsome()(559dbe0)
1.4.1 (2017-11-16)
Small patch for TypeScript users to correctly export types.
- types: fix TypeScript typings (#75) @IKnowBashFu
1.4.0 (2017-11-04)
1.3.0 (2017-08-24)
This release brings a pair of exciting features!
First up is the ability to define getters and setters when creating models. These are useful for things like formatting after selects and making sure conforming data before inserts.
const people = await db.model('people', {
name: String,
username: {
type: String,
get (username) {
return `username is: ${username}`
},
set (username) {
// remove anything that isn't alphanumeric or underscore
return username.replace(/[^\w]/gi, '')
}
}
})
await people.create({
name: 'Bo Lingen',
username: 'ci.ty]ci[d/e'
})
// -> { name: 'Bo Lingen', username: 'citycide' }
await people.get('username', { name: 'Bo Lingen' })
// -> 'username is: citycide'
// can use `getRaw()` and `setRaw()` to bypass getters / setters
// other methods may also accept a `raw` property in their options object
await people.getRaw('username', { name: 'Bo Lingen' })
// -> 'citycide'
There's also a new memory-only mode - if the file path is exactly ':memory:', no file will be created and an in-memory store will be used. This doesn't persist any data but is useful for speed and performance reasons. For example, most of trilogy's tests now use in-memory databases to avoid tons of disk usage.
const db = new Trilogy(':memory:')
- always return promises in async functions (009f079)
- add support for in-memory database (8587f4b)
- add getters & setters (ab5cd7b)
- add
getRaw()&setRaw()(5fe1f80)
1.2.1 (2017-07-25)
- immediately create db file for both clients (7423312)
- fix
.mjsmodule by removingmodule.exportsusage (e1d57c3)
1.2.0 (2017-06-09)
- add initial Flow definitions (b9937b4)
- add initial TypeScript definitions (3d9a2a5)
- support multiple where clauses (ff481bb), closes #54
1.1.0 (2017-03-23)
- findOne: error when no result and column provided (7394150)
- drop fs-jetpack dependency (4a82ab6)
1.0.0 (2017-03-16)
We've officially arrived at 1.0.0!
But don't let that stop you from submitting issues if you come across problems, or pull requests if there's something that can be improved or added.
Thanks for the help getting here!
- incr|decr: do nothing with amounts of 0 (94dd9e0)
1.0.0-rc.5 (2017-02-26)
This is probably the last release candidate before 1.0.0!
...
I feel like I've said that before.
1.0.0-rc.4 (2017-02-24)
This is probably the last release candidate before 1.0.0!
- native: ensure directory exists (f142cf4)
- package: update fs-jetpack to version 0.11.0 (481a8d6)
- package: update fs-jetpack to version 0.12.0 (3157627)
1.0.0-rc.3 (2017-02-04)
This release contains a breaking change regarding the return value of create().
You can follow the discussion leading up to this change in
#21,
#22,
& #24.
Many thanks to @jonataswalker who put in a lot of effort for this one.
- create: last object when auto-increment key (6c8acc1)
- create: native vs
sql.jslast object handling (06cfca0) - model:
sql.jsnot returning model on creations (06df94f) - tests.model:
create()expected return value (baa6ad3)
- create: return the created object (e551bbd)
- optimize
findLastObjecthelper (e90cdff)
- create: The return value of
create()is no longer the number of created objects. Instead,create()returns the created object.
1.0.0-rc.2 (2017-01-17)
1.0.0-rc.1 (2017-01-13)
🙌 Welcome to the very first official release candidate of Trilogy! 🙌
The next version will be v1.0.0 unless there are any significant issues discovered.
There have not been significant changes since v0.11.1.
- enforcers: broken descriptor validation (459a485)
- types: add
ArrayandObjectas valid types (421d079)
0.11.1 (2017-01-10)
This is a small feature patch on top of v0.11.0 adding model() options
that include the ability to set compound primary keys, multiple unique
properties, and add timestamp properties (created_at and updated_at).
Note: the changes below are mostly from v0.11.0.
- enforcers: verbose option validation (b000a5e)
- findOne: sqlite3 response is an object (2f71f5f)
- model: argument handling with no column (e76343c)
- model: make
model()async (e3d57f6) - native: fix affected row return value for native queries (2233a0f)
- native: query return types (7519f9e)
- query: return type should always be Promise (31cfed7)
modelslist type (f77aae5)- model existence check (5591860)
- add
hasModel(),dropModel(), andclose()(00c0d66) - add
raw()method for custom queries (2403e27) - change
groupByusages togroup(772b252) - initial commit for rewrite (#14) (26f739f)
- clear: add
clear()method, safeguardremove()(ab671c1) - count: add ability to count tables in the database (de9a62d)
- create: make
create()return # rows affected (695753e) - model: add model options (dcc874e)
- schema: add
indexas a valid column attribute (8873e34) - sql.js: add connection pool for managing sq.js backend (2df8381)
- types: add
'timestamp'property type (6bd0710)
Major breakage inbound. See #14 for more info and useful migration tips.
0.10.0 (2016-12-17)
- build: revert babel config to es2015 base (0e67048)
- tests: fix error in deletion tests (#4) (85160d8), closes #4
- tests: working directory discrepancy (3330d92)
- addt'l createTable forms, coercion config, modularize, cjs export (d3bab02)
- change schemaBuilder & queryBuilder to getters (4c82d3c)
- Any instances of retrieving knex's schema or query builder through trilogy must now use for example:
db.queryBuilder.[method]instead ofdb.getQueryBuilder().[method]. The same applies to schema builder. - Any commonjs users
requireing trilogy no longer need.defaultdue to using commonjs export instead of Babel'sexport defaultfill.