🚀 Big News:Socket Has Acquired Secure Annex.Learn More
Socket
Book a DemoSign in
Socket

detective-amd

Package Overview
Dependencies
Maintainers
3
Versions
36
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

detective-amd

Find all dependencies within a JavaScript file using AMD module syntax

latest
Source
npmnpm
Version
6.1.0
Version published
Weekly downloads
3.5M
-18.82%
Maintainers
3
Weekly downloads
 
Created
Source

detective-amd

CI npm version npm downloads

Returns a list of dependencies for a given JavaScript file or AST using any of the AMD module syntaxes.

Inspired by substack/node-detective but built for AMD.

npm install detective-amd
  • Supports JSX code via node-source-walk.

Usage

Let's say we have the following file definitions:


// a.js
define(['./b', './c'], function (b, c) {
  console.log(b, c);
});

// b.js
define({
  name: 'foo'
});

// c.js
define(function () {
  return 'bar';
});

Here's how you can grab the list of dependencies of a.js synchronously.

const fs = require('fs');
const detective = require('detective-amd');

const srcA = fs.readFileSync('a.js', 'utf8');

// Pass in the source code or an AST (if you've already parsed the file)
console.log(detective(srcA)); // prints ['./b', './c']

You may also (optionally) configure the detective via a second object argument detective(src, options) that supports the following options:

  • skipLazyLoaded: (boolean) whether or not to omit inner requires in the list of extracted dependencies.
    • Note: this does not affect the REM form since those inner requires are not "lazily" fetched.

Syntax Support

Supports the 4 forms of AMD module syntax:

  • "named": define('name', [deps], func)
  • "dependency list": define([deps], func)
  • "factory": define(func(require))
  • "no dependencies": define({})

Extra forms:

  • "driver script" (or entry-point) syntax: require([deps], func)
  • "REM" (or CommonJS-like) form: define(function(require, exports, module) {}).

Also handles dynamically loaded dependencies (ex: inner requires).

Supports driver scripts

You can also find the dependencies from a script that has a top-level require (an app initialization/driver/entry-point script):

require([
  './a'
], function (a) {
  // My app will get booted up from here
});

Expression-based requires

If there's a require call with a non-literal, non-call-expression argument, an escodegen-generated string representation is included in the dependency list.

For example, if a.js was of the "factory" form and contained a dynamic module name using a binary expression:

// a.js

define(function (require) {
  // Assume str is some variable that gets set to a string dynamically
  // const str = ...

  const b = require('./' + str);
  const c = require('./c');

  console.log(b, c);
});

The dependency list will be: [ '\'./\' + str', './c' ]

  • Note: if the argument is a function call (e.g. require(getModule())), it cannot be statically determined and is omitted from the list.

License

MIT

Keywords

amd

FAQs

Package last updated on 25 Apr 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts