
Company News
Socket Named Top Sales Organization by RepVue
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.
@devotis/bouquet
Advanced tools
A bouquet of little functions, wrappers and libraries that I use across projects and clients 💐
A bouquet of little functions, wrappers and libraries that I use across projects and clients
yarn add @devotis/bouquet (or npm)
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;
Functions to execute queries as a role and local settings from the Express request object.
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);
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);
};
Functions and middleware to be used with Express.
const {
getRemoteAddress,
ensureAuthenticated,
ensureCsrfProtected,
ensureTraceProtected,
setupStartServer,
setupErrorHandling,
} = require('@devotis/bouquet').express;
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);
const { connect, send } = require('@devotis/bouquet').mailjet;
connect();
await sendJetEmail({
to: 'someone@example.com',,
// bcc,
data: { some data },
TemplateID: <Mailjet Template ID number>,
});
FAQs
A bouquet of little functions, wrappers and libraries that I use across projects and clients 💐
We found that @devotis/bouquet demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.