Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@devotis/bouquet

devotis44MIT1.3.6

A bouquet of little functions, wrappers and libraries that I use across projects and clients 💐

readme

💐 Bouquet

A bouquet of little functions, wrappers and libraries that I use across projects and clients

Install

yarn add @devotis/bouquet (or npm)

Usage

mssql

Functions to connect to and query SQL Server using node-mssql as a dependency.

const {
    connect,
    query,
    close,
    all,
    one,
    tag,
    cp, // the connection pool for raw usage with for example:
    mssql, // const request = new mssql.Request(cp);
} = require('@devotis/bouquet').mssql;

pg

Functions to execute queries as a role and local settings from the Express request object.

With postgraphile as middleware

const express = require('express');
const {
    connect,
    setupPostgraphile,
    errorHandling,
    startServer,
    getRedisStore,
} = require('@devotis/bouquet').express;

const server = express();
const poolPg = connect();

const isSecureCookie = process.env.NODE_ENV === 'production';
const ONE_MONTH = 31 * 24 * 60 * 60 * 1000;
server.use(
    session({
        name: 'session',
        store: getRedisStore(),
        secret: process.env.SESSION_SECRET,
        resave: false,
        saveUninitialized: true,
        proxy: isSecureCookie, // needed when behind a reverse proxy for secure cookies
        cookie: {
            path: '/',
            httpOnly: true,
            secure: isSecureCookie,
            maxAge: ONE_MONTH,
        },
    })
);

// ...
setupPostgraphile(server, {
    pool: poolPg,
    schemaName: 'app',
    mountPath: '/api/postgraphile',
    reqParts: ['headers', 'user', 'query', 'session', 'method', 'fullUrl'],
    getRole: (req) => `app_${req.user ? req.user.roleName : 'anonymous'}`,
    defaultSettings: {
        application_name: 'bouquet',
        timezone: 'Europe/Amsterdam',
    },
});
// ...
setupErrorHandling(server);
setupStartServer(server);

Without postgraphile

You can query as a role with local settings without postgraphile as well.

const express = require('express');
const { sql, queryWithContext } = require('@devotis/bouquet').pg;

// ...
const routeHandler = async (req, res, next) => {
    const result = await queryWithContext(
        req,
        (reqParts = [
            'headers',
            'user',
            'query',
            'session',
            'method',
            'fullUrl',
        ]),
        (req) => `app_${req.user ? req.user.roleName : 'anonymous'}`,
        {
            application_name: 'bouquet',
            timezone: 'Europe/Amsterdam',
        },
        sql`
            select t.*
            from app.my_table t
            where t.id = ${req.params.id}
              and t.creator_id = current_setting('request.user.id', true)
        `
    );

    res.json(result);
};

express

Functions and middleware to be used with Express.

const {
    getRemoteAddress,
    ensureAuthenticated,
    ensureCsrfProtected,
    ensureNocache,
    ensureTraceProtected,
    setupStartServer,
    setupErrorHandling,
} = require('@devotis/bouquet').express;

logger

All same as the logfmt based heroku-logger, but allows logging an error object along with context-specific error message (issues) and the express req object

const logger = require('@devotis/bouquet').logger;

const error = new Error('x');

logger.error(error);
logger.error(error, { some, additional, info });
logger.error(error, req); // req is the express req object.
logger.error('Custom error message', error);
logger.error('Custom error message', error, { some, additional, info });
logger.error('Custom error message', error, req);

// Also log a few bits of info on the req object
logger.info('Some message', req);

// Log a lot of information on the req object
logger.debug('Some message', req);

mailjet

const { connect, send } = require('@devotis/bouquet').mailjet;

connect();

await sendJetEmail({
    to: 'someone@example.com',,
    // bcc,
    data: { some data },
    TemplateID: <Mailjet Template ID number>,
});

changelog

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

[1.3.6] - 2020-12-03

Fixed

  • Gigantic error logs for superagent response errors

[1.3.5] - 2020-11-23

Fixed

  • Tests for request.session.id

Added

  • Add complete and working example for mssql

Changed

  • Prettier 2.x

[1.3.4] - 2020-06-02

Added

  • Allow passing own keyset to mailjet connect

[1.3.3] - 2020-05-19

Added

  • Allow adding the req object to logger.info/warn/debug for additional info about the request

[1.3.2] - 2020-05-19

Added

  • ensureNocache middleware

[1.3.1] - 2020-05-12

Changed

  • Accept redis client options

[1.3.0] - 2020-05-12

Added

  • Wrapper for creating a redisStore fast with built in retry and logging

[1.2.3] - 2020-05-11

Added

  • Test that only the expected functions are exported and not more

Fixed

  • request.session.id not available with 'session' as the req parts

[1.2.2] - 2020-05-06

Added

  • Allow also string parts of the request like originalUrl, method (and one bonus peroperty fullUrl) to be added to the pg settings

[1.2.1] - 2020-05-06

Changed

  • [Doc] show how you should actually require the submodules in readme

Fixed

  • Error package subpath './v4' is not defined by "exports" in /.../node_modules/uuid/package.json

[1.2.0] - 2020-04-24

Added

  • Postgres support
  • Mssql pool error logging
  • Mssql log query duration
  • Mssql tests

[1.1.1] - 2020-04-24

Changed

  • More extensive express req object details in error log

[1.1.0] - 2020-04-24

Added

  • Mailjet submodule
  • Also export the connections pool and mssql directly
  • Test suite for the logger

Changed

  • Refactor logger.error code
  • Use own logger internally

[1.0.2] - 2020-04-22

Added

  • Heroku-logger but with improved error function
  • Express middleware functions
  • Tests

Changed

  • log format to: bouquet/[submodule] > message

Fixed

  • Doc on usage

[1.0.1] - 2020-04-21

Added

  • New Express utility function

[1.0.0] - 2020-04-21

Added

  • New mssql function set