0.0.3 • Public • Published

Starter Kit Utils

Simpler API and only one dependency for common create- style packages and starter kits' prompt q's.



This function checks if something is on the path, like which. It takes three arguments, name, a string, the name of the thing to look for, envPath, a string, variable to use instead of process.env, insensitive, a boolean, should the path check be insensitive.

If the third argument, insensitive is not given, it is set to whether we are on windows.


var { checkPath } = require('starter-kit-utils');
checkPath('node').then(console.log.bind(console)); // '/usr/local/bin/node'


This function will check if any of the files in the directories in the environment PATH variable insensitively match npm or yarn, or their Windows variants, npm.exe or yarn.exe.

It takes no arguments, and returns an object with two properties: { yarn: Boolean, npm: Boolean }.


var { checkManagers } = require('starter-kit-utils');
// { npm: '/usr/local/bin/npm', yarn: '/home/toor/.yarn/bin/yarn' }


This function will try to find remotes in the local git configuration and user's name and email from the global configuration. This populates the author and repository fields.


var { getAuthorInfo } = require('starter-kit-utils');
// { author: 'David Ankin <>' }


This is the equivalent of doing something like
Object.assign({}, { new: data }); but on a physical file. This function takes first argument the file path, and the rest of the arguments are passed to Object#assign.


$ echo '{"a":5}' > file.json
$ node
> var { updateJSON } = require('starter-kit-utils');
> JSON.parse(fs.readFileSync('file.json', 'utf8'));
// { a: 5 }
> updateJSON('file.json', { a: undefined, b: 5, c: [ 5 ]})
// { a: undefined, b: 5, c: [ 5 ] }
$ cat file.json
// {b:5,c:[5]}


This function will take the dependencies in the getDeps format and put them into a manifest, taking arguments, object, deps, dev or not.


var { addDeps } = require('starter-kit-utils');
var a = {};
addDeps(a, [ { name: 'dotenv', version: '1.0.0' } ], true);
console.log(a); // { devDpendencies: { dotenv: '1.0.0' } }

a = {};
addDeps(a, [ { name: 'dotenv', version: '1.0.0' } ]);
console.log(a); // { dependencies: { dotenv: '1.0.0' } }


This function will actually query the npm repository via pacote, as follows:

async function getDeps(deps) {
  return await Promise.all( dep => {
    return {
      name: dep,
      version: (await pacote.manifest(dep)).version

For example:

var { getDeps } = require('starter-kit-utils');
getDeps(['dotenv', 'express']).then(console.log.bind(console));
// [ { name: 'dotenv', version: '8.2.0' },
//   { name: 'express', version: '4.17.1' } ]


Takes a folder with ejs templates and renders them with locals. Takes three arguments, from, to, and locals.

It will create the directories in the destination like mkdir -p.

It looks like this:

async function renderFolder(templateDir, destDir, locals) {
  var l = await generateCopyList(templateDir);
  var d = path.join.bind(path, destDir), n = path.dirname.bind(path);
  await Promise.all( => mkdirp(n(d(f.relativeTo)))));
  await Promise.all( => renderFile(f.from, d(f.relativeTo), locals)));

TODO, add example tests with broken symlinks

Utility Functions

The ones based on the fs module are to avoid the warnings when using require('fs').promise.

Name Args Description
copyFile ...args Returns a promise for the results of passing the ...args to fs.copyFile
readdir string path Returns a promise for the results of fs.readdir
readFile ...args Returns a promise for the results of passing the ...args to fs.readFile
writeFile ...args Returns a promise for the results of passing the ...args to fs.writeFile
unlink ...args Returns a promise for the results of passing the ...args to fs.unlink
exists string path Returns a promise for true of fs.access does not error
stat ...args Returns a promise for the results of passing the ...args to fs.stat


npm i starter-kit-utils

DownloadsWeekly Downloads






Unpacked Size

131 kB

Total Files


Last publish


  • daveankin