Skip to content

Instantly share code, notes, and snippets.

Trying to stay in the right branch of the wave function.

Jon Schlinkert jonschlinkert

Trying to stay in the right branch of the wave function.
View GitHub Profile
View async-string-replace.js
const replace = async (input, regex, replacer) => {
// we need to remove the 'g' flag, if defined, so that all replacements can be made
let flags = (regex.flags || '').replace('g', '');
let re = new RegExp(regex.source || regex, flags);
let index = 0;
let match;
while ((match = re.exec(input.slice(index)))) {
let value = await replacer(...match);
index += match.index;
jonschlinkert / try-open.js
Last active Jun 25, 2019
Simple way to open a file or directory in a text editor or file manager, whichever is resolved first.
View try-open.js
const cmds = { linux: 'xdg-open', win32: 'start', darwin: 'open' };
const open = cmds[process.platform];
const tryOpen = (dirname, editors = ['sublime', 'code', open]) => {
try {
cp.execSync([editors[0], dirname].join(' '));
console.log('Opening in ' + editors[0]);
} catch (err) {
if (editors.length === 0) {
throw new Error('Cannot find an editor to open');
jonschlinkert / open.js
Created Jun 25, 2019
Simple, cross-platform way to open the browser upon starting an app.
View open.js
const cp = require('child_process');
const Koa = require('koa');
const app = new Koa();
const cmds = { linux: 'xdg-open', win32: 'start chrome', darwin: 'open' };
const open = cmds[process.platform];
const PORT = 3000;
// response
app.use(ctx => {
ctx.body = 'Hello Koa';
jonschlinkert /
Created Jun 19, 2019
The very brief guide to getting rid of NPM's annoying "vulnerability" messages for packages that have been patched.

How to get the latest patch

This little guide describes what to do when:

  1. You see a vulnerability warning for a package, and
  2. The package has already been fixed, and a patch version has been released.


  1. Delete all lock files
jonschlinkert / permutations-with-max-depth.js
Last active Apr 14, 2019
Generate all permutations of an array. Alternative to the many variants of heap's algorithm I keep finding on the interweb. Every single algorithm I found produced incorrect results. This one is correct.
View permutations-with-max-depth.js
* This variant takes a max depth as the second argument.
const permutations = (value, max = value.length) => {
let depth = Math.min(max, value.length);
let results = [];
const permute = (queue = []) => {
if (queue.length === depth) {

Guide to Contributing to Enquirer


Thanks for choosing to contribute to Enquirer! We're so happy that you're contributing to open source projects, and we're even happier that one of those projects is ours!


There is no faster, more effective way to improve a product than from the feedback from the first experience of a new user -- Jon Schlinkert

jonschlinkert /
Last active Mar 4, 2021
Clone all repos for the given user/org. Just replace <USERNAME> and run this in the command line.
curl -s<USERNAME>/repos?per_page=100 | ruby -rjson -e 'JSON.load( {|repo| %x[git clone #{repo["clone_url"]} ]}'
jonschlinkert / async-engine.js
Last active Feb 12, 2021
PoC of an async template engine using native template literals and async-await. Response to
View async-engine.js
const compile = (input, helpers, thisArg) => {
return async data => {
let ctx = { ...thisArg, };
let keys = [];
let vals = [];
if (helpers) {
for (let key of Object.keys(helpers)) {
if (ctx[key] === void 0) {
ctx[key] = (...args) => helpers[key].call(ctx, ...args);
View monokai-extended.itermcolors
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">
<key>Ansi 0 Color</key>
<key>Alpha Component</key>
<key>Blue Component</key>
View countdown.js
const countdown = (msgFn, fn, count = 3, interval = 500) => {
let timer = setInterval(() => {
if (count-- === 0) {