AMD Module Dependency Detective

6.0.1 · active · verified Sun Apr 19

detective-amd is a JavaScript utility for statically analyzing JavaScript files or Abstract Syntax Trees (ASTs) to identify dependencies declared using various AMD (Asynchronous Module Definition) module syntaxes. It supports the four core AMD forms ('named', 'dependency list', 'factory', 'no dependencies'), as well as 'driver script' (`require([deps], func)`) and CommonJS-like 'REM' forms (`define(function(require, exports, module) {})`). The package also handles dynamically loaded dependencies and JSX code through `node-source-walk`. The current stable version is 6.0.1. While not on a fixed release schedule, it sees updates to maintain compatibility with modern Node.js versions and dependencies, with major versions primarily driven by Node.js LTS support drops. Its key differentiator is its specialized focus on AMD syntax, offering a robust solution for environments still leveraging RequireJS or similar AMD loaders, distinguishing it from general-purpose CommonJS or ESM dependency analysis tools.

Common errors

Warnings

Install

Imports

Quickstart

Demonstrates how to synchronously extract AMD dependencies from source code, including standard `define` calls, `require` driver scripts, and expression-based requires.

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

// Create a dummy AMD file for demonstration
const fileContent = `
// a.js
define(['./b', './c'], function (b, c) {
  console.log(b, c);
});

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

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

// main.js - A driver script
require(['./a'], function (a) {
  // My app will get booted up from here
});

// another.js - with expression-based require
define(function (require) {
  const dynamicDep = 'dynamic_module';
  const x = require('./' + dynamicDep);
  const y = require('./static_module');
});
`;

fs.writeFileSync('example.js', fileContent, 'utf8');

// Analyze the 'a.js' part of the content
const srcA = `define(['./b', './c'], function (b, c) { console.log(b, c); });`;
console.log('Dependencies for a.js:', detective(srcA));

// Analyze the 'main.js' part of the content
const srcMain = `require(['./a'], function (a) {});`;
console.log('Dependencies for main.js (driver script):', detective(srcMain));

// Analyze the 'another.js' part with expression-based requires
const srcAnother = `
define(function (require) {
  const dynamicDep = 'dynamic_module';
  const x = require('./' + dynamicDep);
  const y = require('./static_module');
});
`;
console.log('Dependencies for another.js (expression-based):', detective(srcAnother));

// Clean up dummy file (optional)
fs.unlinkSync('example.js');

view raw JSON →