npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

module-structure

v2.0.6

Published

Create levelized structure maps from module dependencies.

Readme

Module Structure

Creates levelized structure maps (LSMs) from ECMAScript/JavaScript, TypeScript and AMD module dependencies - inspired by structure101's Levelized Structure Maps.

Example Diagram

Diagram Viewer

The Diagram Viewer is automatically started in your default browser if invoked without outFile argument (see CLI/API documentation below).

There's no UI like a toolbar or context menu.

But for now, it's already possible to influence display of dependencies with the following keyboard shortcuts:

| Shortcut | Function | |:------------|:-----------------------------------------| | Ctrl+Click | Add/Remove nodes from selection | | Alt+D | Show all dependencies (default) | | Alt+S | Show dependencies on selected nodes | | Alt+B | Show dependencies between selected nodes | | Alt and + | Expand all nodes | | Alt and - | Collapse all nodes |

Prerequisites

Requires a recent Node.js installation (>= 10.x).

CLI

Installation

npm i -g module-structure module-structure-lang-ts module-structure-lang-js

Usage

module-structure --rootDir directory

Create structure map and display in default browser. Refreshing the browser repeats the structure analysis and updates the browser, useful after modifications to the code base.

module-structure --rootDir directory --outFile file

Create structure map and save as JSON file. Doesn't open structure map in browser.

module-structure --inputFile file

Reads an existing structure map JSON file and displays it in default browser.

Flags

| Argument | Alias | Description | |-------------|-------|:-------------------------------------------------------------------------------------------------------------------------------------------------| | --help | -h | Show this help. | | --version | -v | Print the version number. | | --rootDir | | Specifies the root directory of input files. | | --exclude | -e | One or more expressions to filter packages and/or modules. | | --outFile | | Path for the JSON output file. If omitted, the file will be created in a temporary directory and displayed as a diagram in your default browser. | | --pretty | | Pretty-print the JSON output file. Only used if --outFile is specified. | | --inputFile | | Skips the analysis step and directly renders the specified model file as a diagram in your default browser. | | --port | -p | Port for serving the included viewer web-app (defaults to 3000). Omitted if --outFile is specified. |

API

Installation

npm i --save module-structure module-structure-lang-ts module-structure-lang-js

Usage

moduleStructure(configuration)

Configuration

| Field | Type | Required | Default | Description | |-------------|-----------|----------|-----------|:-----------------------------------------------------------------------------------------------------------| | rootDir | string | yes | - | Specifies the root directory of input files. | | exclude | string[] | no | [] | One or more expressions to filter packages and/or modules. | | outFile | string | no | undefined | Exports the structure model as JSON to the file path specified by outFile. | | pretty | boolean | no | false | Pretty-print the JSON output file. Only used in combination with outFile. | | open | boolean | no | false | Opens the structure map in default browser. | | port | number | no | 3000 | Port for serving the included viewer web-app (defaults to 3000). Only used in combination with open. | | inputFile | string | no | undefined | Skips the analysis step and directly renders the specified model file as a diagram in your default browser.| | logging | boolean | no | false | Enable/disable logging. |

Example

const moduleStructure = require("module-structure");

let model = moduleStructure({rootDir: "/path/to/some/codebase"});

Model Schema

{
  "type": "object",
  "required": true,
  "root": {
    "type": "node",
    "required": true,
    "properties": {
      "id": {
        "type": "string",
        "required": true
      },
      "name": {
        "type": "string",
        "required": true
      },
      "isGroup": {
        "type": "boolean",
        "required": true
      },
      "rows": {
        "type": "array",
        "required": true,
        "items": {
          "type": "array",
          "required": false,
          "items": {
            "type": "node",
            "required": false
          }
        }
      }
    }
  },
  "dependencies": {
    "type": "array",
    "required": true,
    "items": {
      "type": "dependency",
      "required": false,
      "properties": {
        "from": {
          "type": "string",
          "required": true
        },
        "to": {
          "type": "string",
          "required": true
        }
      }
    }
  },
  "feedbacks": {
    "type": "array",
    "required": true,
    "items": {
      "type": "dependency",
      "required": false,
      "properties": {
        "from": {
          "type": "string",
          "required": true
        },
        "to": {
          "type": "string",
          "required": true
        }
      }
    }
  }
}

Node Type

  • id: The node's full qualified name.
  • name: The node's simple name.
  • isGroup: Whether the node is a package or a module - maybe a later version will also look inside modules, then a module would also become a group.
  • rows: Array with rows. Each row in turn is an array of nodes.

Dependency Type

  • from: The full qualified name of the dependency's source module.
  • to: The full qualified name of the dependency's target module.

Extensibility

module-structue provides support for custom languages by means of plugin extensions. Each plugin is a node module complete with a package.json file. It need not actually be in npm, it can be a simple folder and made availabe via npm link. At startup, module-structure scans and loads plugins that implement known extension-points. At the time of this writing, there's only one extension-point for providing module dependencies for a given module file which is called module-structure:language.

To implement a custom language plugin, one needs to implement the StructureMapLanguageProvider interface and register the node module as extension.

Below is an example how to contribute support for the Swift language.

package.json

In the example below, the module registers itself for the module-structure:language extension point and for modules files ending with the .swift file extension. The value is the relative path to the actual script containing the implementation.

{
    "name": "module-structure-lang-swift",
    ...
    "extensions": {
        "module-structure:language": {
            "swift": "./src/module-structure-lang-swift"
        }
    }
}

Implementation

A minimal skeleton implementation of the language provider interface would look like this:

"use strict";

class SwiftLanguageProvider {
    
    /**
     * @public
     * @param {string} modulePath The file path of the current module to provide dependencies for.
     * @param {string} rootPath The root path of the code base. Some external libraries require this.
     * @returns {Array<string>} A list of relative file paths to dependent modules.
     */
    getDependencies(modulePath, rootPath) {
        // TODO: add implementation here:
        return [];
    }
}

module.exports = function() {
    return new SwiftLanguageProvider();
};

Further Examples

Support for JavaScript, TypeScript, Vue.js and even C++ is provided via plugins, so there already exist some working examples written in JavaScript and TypeScript, too.

You can find them here:

Credits

License

MIT