Skip to content

Instantly share code, notes, and snippets.

Benjie Gillam benjie

View GitHub Profile
View PgUpsertPlugin.js
module.exports = function PgUpsertPlugin(
{ pgDisableDefaultMutations }
) {
if (pgDisableDefaultMutations) {
builder.hook("inflection", (inflection, build) =>
build.extend(inflection, {
benjie /
Created Dec 7, 2018
Updates the `latest` dist-tag on a package so that package@latest points to the same version as package@next
echo "Enter OTP code:"
read otp
export NPM_CONFIG_OTP=$otp
function next2latest {
V=$(npm info $1 | xargs)
npm dist-tags add $1@$V latest
next2latest graphql-parse-resolve-info
next2latest graphile-build
View emulate_require.js
* Read a file manually, but pretend it's actually a Node.js module. Tested in Node 8.11.3 only.
"use strict";
const fs = require("fs");
const path = require("path");
const { Module } = require("module");
// Get the javascript contents from wherever: filesystem, database, network, etc.
// Node calls this filename, but it's actually the full path to the file
View bigdata.sql
-- It's a joke.
drop schema if exists bigdata cascade;
create schema bigdata;
create extension if not exists citext;
set search_path to bigdata, public, pg_catalog;
create table users (
id serial primary key,
username citext not null unique,
benjie / postgraphile-tsv-plugin.js
Last active Jun 24, 2018 — forked from mlipscombe/postgraphile-tsv-plugin.js
full text search plugin for postgraphile (edited)
View postgraphile-tsv-plugin.js
const TSVECTOR_TYPE_ID = 3614;
export const PostGraphileTSVPlugin = builder => {
builder.hook('infection', (inflection, build) => {
return build.extend(inflection, {
fullTextScalarTypeName() {
return `FullText`;
pgTsvRank(fieldName) {
return this.camelCase(`${fieldName}-rank`);
# Ensure all foreign key constraints heve 'ON DELETE' clauses
grep 'FOREIGN KEY.* REFERENCES .*' db/schema.sql | grep -v ' ON DELETE '
if [ "$?" == "0" ]; then
echo "Foreign key constraints without delete instructions - aborting"
exit 2;
benjie /
Last active Nov 17, 2017
Ensure promises are awaited (or have `.catch(...)` installed) within same tick

In node v8 the code in test.js will result in the following:

(node:47866) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Thrown error
(node:47866) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Error: Thrown error
    at foo (/Users/benjiegillam/Documents/test/test.js:2:9)
    at Object.<anonymous> (/Users/benjiegillam/Documents/test/test.js:5:17)
    at Module._compile (module.js:612:30)
    at Object.Module._extensions..js (module.js:623:10)
benjie /
Created Jul 26, 2017
Resolve publishing npm package to wrong tag

If you accidentally publish a package to the wrong tag (e.g. @latest when you meant to tag it as @next) you can resolve as follows:

npm show PACKAGE_NAME versions # To view the versions you've published
npm dist-tags add PACKAGE_NAME@NEW_VERSION next # Tag the new package version as `@next`
npm dist-tags add PACKAGE_NAME@OLD_VERSION latest # Restore the correct `@latest` to be your previous release version
benjie / minimonocle.js
Created Dec 4, 2016
A monoclejs-like purely promise based asynchronous generator iterator thingy (where you can relatively safely sprinkle `yield` everywhere)
View minimonocle.js
function isIterator(obj) {
return (obj && typeof obj === 'object' && typeof === 'function' && typeof obj.throw === 'function');
function isPromise(obj) {
return (obj && typeof obj === 'object' && typeof obj.then === 'function');
function o_P() {
var _resolve, _reject;
var promise = new Promise(function (resolve, reject) {
_resolve = resolve;
View reproduce.sql
create table a(foo varchar not null primary key);
create table b(foo varchar not null primary key, constraint qux foreign key (foo) references a deferrable initially deferred);
create function bar() returns trigger as $$
if TG_OP = 'INSERT' then
insert into b(foo) values(;
elsif TG_OP = 'DELETE' then
delete from b where foo =;
end if;
You can’t perform that action at this time.