An API for building higher-level node package managers (such as Ender)
JavaScript Shell
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Daplie is Taking Back the Internet!

Stop serving the empire and join the rebel alliance!


A collection of tools for building package managers.

pakmanager is an example (but fully functional) package manager.

Given a directory with a package.json, pakman can give you back concatonated normalized scripts that will run with a custom module loader - such as in the browser.


  • alternate dependency lists - searches in this order:
    • package.json.ender.dependencies
    • package.json.enderDependencies
    • package.json.browserDependencies
    • package.json.dependencies
  • modulename aliasing - normalizes local requires as 'mymodule/submodule' or 'myprovidesalias/submodule'
    • package.json.provides


git clone git://
cd node-pakman/tests
ls ../test_modules/foomodule/
node test-compile-local ../test_modules/foomodule/


In order to make debugging (and extension) simpler, every API function is in it's own file in lib and contains and point-and-shoot test in test.


Each module object looks something like this:

    "package": "foomodule-browser",           // npm name
    "name": "corge",
    "pathname": ".",                          // relative to package.json.lib
    "filename": "corge.js",
    "require": "../corge",                    // how this module was required by its parent
    "modulepath": "foomodule-browser/corge",
    "providespath": "foomodule/corge",        // where package.json.provides is 'foomodule'
    "requires": [

    "scriptSource": "(function () {\n  \"use strict\";\n\n  require('./foo');\n  require('bar');\n\n}());\n",

    "dependencyList": [ ... ], // other modules, ordered (by line number)
    "dependencyTree": { ... }, // other modules, mapped by modulepath

    // in the case that it is known the module cannot be found
    "error": {
        "stack": "Error: Couldn't find \"./doesnt-exist\"\n    at onDirRead (./lib/get-script.js:50:18)",
        "message": "Couldn't find \"./doesnt-exist\""


All API methods are attached to the pakman object.

var pakman = require('pakman')



Given a module path, and a render function, compiles all of the local dependencies (pre-normalized).

var compile = require('./lib/compile').compile
  , fs = require('fs')

function render(module) {
  return ''
    + '\n' + '// module: ' + module.modulepath + ' as ' + module.providespath
    + '\n' + '(function () {'
    + '\n' + module.scriptSource 
    + '\n' + '}());'
    + '\n' + // footer'
    + '\n

function writeOut(err, compiled) {
  fs.writeFile('app.js', 'utf8');

compile('/path/to/some/module', render, writeOut);

TODO: Provide package info and allow async rendering: function render(pkg, module, fn)


Given a module path, makes the module package-ready - hands you back everything you need to template the dependency with your own packag system.

var makePackageReady = require('./lib/make-package-ready').makePackageReady

function handlePackageComponents(error, pkg, missing, unlisted, unused, local, pm, builtin) {
  // error{} - couldn't read package.json, etc
  // pkg{} - the package.json info
  // missing[] - local files referenced, but not found
  // unlisted[] - npm modules referenced, but not in package.json
  // unused[] - npm modules in package.json, but not references
  // local[] - all local modules, ordered as they would need to be listed in a browser package
  // pm[] - all package-managed (npm) modules
  // builtin[] - builtin modules (such as `window`, `document`, etc in the browser, or `Buffer` in node)

// the directory must contain a `package.json`
makePackage('/path/to/some/module', handlePackageComponents);

Found in lib/make-package-ready.js


  • sort-tree-by-types
  • reduce-tree
  • get-package-tree
  • normalize-package-dependencies
  • normalize-script-requires


Given a module path, gives the parsed package.json with normalized main and lib (both will exist).

var getPackageInfo = require('./lib/get-package-info').getPackageInfo

function handlePackageInfo(error, pkg) {
  // error{} - couldn't read package.json, wrong permissions, etc
  // pkg{} - the normalized package.json info

getPackageInfo('/path/to/some/module', handlePackageInfo);

API Call Graph

  • compile
    • make-package-ready
      • normalize-package-dependencies
      • normalize-script-requires
      • reduce-tree
      • sort-tree-by-types
        • get-npm-package-info
          • get-package-info
      • get-package-tree
        • get-package-info
        • get-module-tree
          • get-module-leaf
            • get-requires
            • get-script
              • get-file
    • get-npm-tree
      • get-npm-package-info
      • get-package-info