UNPKG

fastify-objectionjs

Version:

fastify-objectionjs is a plugin for the Fastify framework that provides integration with objectionjs ORM

82 lines (65 loc) 2.04 kB
'use strict' const fp = require('fastify-plugin') const Knex = require('knex') const { SUPPORTED_CLIENTS } = require('knex/lib/constants') const { Model, knexSnakeCaseMappers } = require('objection') const defaultKnexConfig = { client: 'better-sqlite3', useNullAsDefault: true, connection: { filename: './default.sqlite' } } function fastifyObjectionjs (fastify, options, next) { const knexConfig = Object.assign( {}, defaultKnexConfig, options.knexConfig, knexSnakeCaseMappers({ upperCase: options.upperCase || false, underscoreBeforeDigits: options.underscoreBeforeDigits || false, underscoreBetweenUppercaseLetters: options.underscoreBetweenUppercaseLetters || false }) ) if (SUPPORTED_CLIENTS.indexOf(knexConfig.client) === -1) { next(new Error(`unsupported client, 'fastify-objectionjs' only support ${SUPPORTED_CLIENTS.join(', ')}.`)) return } const knexConnection = Knex(knexConfig) const objection = { knex: knexConnection } Model.knex(knexConnection) if (options.models) { if (!Array.isArray(options.models) || options.models.length < 1) { next(new Error('You need to provide a valid array of `objection.js` models.')) return } objection.models = {} for (let i = 0; i < options.models.length; i += 1) { const model = options.models[i] if (model.idColumn && model.tableName && model.QueryBuilder) { objection.models[model.name.replace(/^\w/, c => c.toLowerCase())] = model } } if (Object.keys(objection.models).length < 1) { next(new Error('The supplied models are invalid.')) return } } if (!fastify.objection) { fastify.decorate('objection', objection) } else { next(new Error('fastify-objectionjs has already registered.')) return } fastify.addHook('onClose', (fastify, done) => { knexConnection.destroy() done() }) next() } module.exports = fp(fastifyObjectionjs, { fastify: '>=4.0.0', name: 'fastify-objectionjs' })