AutomationFlowsGeneral › Module Dependency Analysis Workflow

Module Dependency Analysis Workflow

Original n8n title: Module Dependency Analysis (my Sql)

Module Dependency Analysis. Uses scheduleTrigger, mySql, respondToWebhook, httpRequest. Webhook trigger; 12 nodes.

Webhook trigger★★★★☆ complexity12 nodesMySQLHTTP Request
General Trigger: Webhook Nodes: 12 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "XspQfnwYpWM0xZbs",
  "name": "Module Dependency Analysis",
  "description": null,
  "active": true,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "module-analysis",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "1618f709-74bb-4176-a21c-eb025a4a80a0",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        0,
        336
      ]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 2
            }
          ]
        }
      },
      "id": "89cad40a-f4b1-4d95-8a8f-2d7a6caf2929",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        528
      ]
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "CALL api_wf.sp_module_load('{{ $json.modulesJson }}', 'n8n-automation', '{{ $json.runTimestamp }}')\n",
        "options": {
          "queryReplacement": "="
        }
      },
      "id": "e1358a46-1c8e-42af-918b-569d33eb26af",
      "name": "Load Modules",
      "type": "n8n-nodes-base.mySql",
      "typeVersion": 2.5,
      "position": [
        1120,
        240
      ],
      "credentials": {
        "mySql": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "CALL api_wf.sp_module_map(CAST('{{ $json.depsJson }}' AS JSON), 'n8n-automation')",
        "options": {}
      },
      "id": "f383f8d6-3f72-4c7d-8a2d-cdcd1c4ea526",
      "name": "Map Dependencies",
      "type": "n8n-nodes-base.mySql",
      "typeVersion": 2.5,
      "position": [
        1120,
        456
      ],
      "credentials": {
        "mySql": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "=Module analysis complete. Processed {{ $('Analyze').item.json.totalModules }} modules and {{ $('Analyze').item.json.totalDependencies }} dependencies.",
        "options": {}
      },
      "id": "77df85f8-d4b2-479c-8f04-d22f4c91c387",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        672,
        528
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://host.docker.internal:3010/api/execute",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "command",
              "value": "cd /workspace && depcruise --config .dependency-cruiser.cjs --output-type json ."
            }
          ]
        },
        "options": {}
      },
      "id": "33294a2f-ac0d-4184-8337-f5f32bd94dcb",
      "name": "Dependancy Cruise",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        224,
        432
      ]
    },
    {
      "parameters": {
        "jsCode": "// Parse dependency-cruiser output\n  const response = $input.item.json;\n  const depData = JSON.parse(response.stdout);\n\n  const modules = [];\n  const dependencies = [];\n\n  // Helper: Get module type from path\n  function getModuleType(filePath) {\n    if (filePath.includes('/controller/')) return 'controller';\n    if (filePath.includes('/component/') || filePath.includes('/components/')) return 'component';\n    if (filePath.includes('/util/') || filePath.includes('/utils/')) return 'utility';\n    if (filePath.includes('/route/') || filePath.includes('/routes/')) return 'routing';\n    if (filePath.includes('.config.')) return 'config';\n    if (filePath.includes('.test.') || filePath.includes('.spec.')) return 'test';\n    return 'module';\n  }\n\n  // Process dependency-cruiser data\n  for (const module of depData.modules) {\n    const filePath = module.source;\n\n    modules.push({\n      file_path: filePath,\n      module_type: getModuleType(filePath)\n    });\n\n    // Build dependencies - use resolved paths\n    if (module.dependencies) {\n      for (const dep of module.dependencies) {\n        dependencies.push({\n          from_path: filePath,\n          to_path: dep.resolved\n        });\n      }\n    }\n  }\n\n  console.log(`Analyzed ${modules.length} modules and ${dependencies.length} dependencies`);\n\n  return [{\n    json: {\n      modules: modules,\n      dependencies: dependencies,\n      totalModules: modules.length,\n      totalDependencies: dependencies.length\n    }\n  }];\n"
      },
      "id": "abd53c6b-71f8-4507-916a-73e173047fd0",
      "name": "Analyze",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        448,
        432
      ]
    },
    {
      "parameters": {
        "jsCode": "const runTimestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');\n  return [{ json: {\n    ...$input.item.json,\n    runTimestamp: runTimestamp\n  }}];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        672,
        336
      ],
      "id": "fe139fc1-a8fb-4978-b092-946f4a57a577",
      "name": "Gen Timestamp"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "CALL api_wf.sp_module_cleanup('n8n-automation', '{{ $('Gen Timestamp').item.json.runTimestamp }}')",
        "options": {
          "queryReplacement": "="
        }
      },
      "id": "e0329f83-9267-4902-8cff-7da717601d10",
      "name": "Set deleted_at Col",
      "type": "n8n-nodes-base.mySql",
      "typeVersion": 2.5,
      "position": [
        1568,
        336
      ],
      "credentials": {
        "mySql": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Prepare ALL modules at once (no splitting)\n  const modules = $input.item.json.modules;\n\n  // Serialize to JSON string with SQL escaping\n  const modulesJson = JSON.stringify(modules).replace(/'/g, \"''\");\n\n  return [{\n    json: {\n      modulesJson: modulesJson,\n      totalModules: modules.length,\n      runTimestamp: $input.item.json.runTimestamp  // Pass through!\n    }\n  }];\n\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        896,
        240
      ],
      "id": "0f2598e4-cbc6-48a4-98f9-7efa318db64a",
      "name": "Prep Modules"
    },
    {
      "parameters": {
        "jsCode": "// Prepare ALL dependencies at once\n  const dependencies = $input.item.json.dependencies;\n  const depsJson = JSON.stringify(dependencies);\n\n  return [{\n    json: {\n      depsJson: depsJson,\n      totalDeps: dependencies.length,\n      runTimestamp: $input.item.json.runTimestamp  // Pass through!\n    }\n  }];\n\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        896,
        456
      ],
      "id": "b1527186-72d0-49d8-b721-205546f135b0",
      "name": "Prep Dependancies"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        1344,
        352
      ],
      "id": "7b864218-18e7-4500-a56b-3d2d33cff692",
      "name": "Merge"
    }
  ],
  "connections": {
    "Load Modules": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Map Dependencies": {
      "main": [
        []
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Dependancy Cruise",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Dependancy Cruise",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dependancy Cruise": {
      "main": [
        [
          {
            "node": "Analyze",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gen Timestamp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prep Modules": {
      "main": [
        [
          {
            "node": "Load Modules",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prep Dependancies": {
      "main": [
        [
          {
            "node": "Map Dependencies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gen Timestamp": {
      "main": [
        [
          {
            "node": "Prep Modules",
            "type": "main",
            "index": 0
          },
          {
            "node": "Prep Dependancies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Set deleted_at Col",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": true,
    "timeSavedMode": "fixed",
    "callerPolicy": "workflowsFromSameOwner"
  },
  "staticData": {
    "node:Schedule Trigger": {
      "recurrenceRules": []
    }
  },
  "versionId": "573ff32c-ed98-4f2e-a8e8-e15345e22f90",
  "createdAt": "2025-12-27 05:03:26.789",
  "updatedAt": "2025-12-28 13:11:55.534"
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow automates the analysis of module dependencies in your codebase, helping developers and teams quickly identify potential issues like circular references or outdated links without manual effort. It saves hours of debugging by generating a comprehensive report on how modules interconnect, making it ideal for software engineers maintaining large projects or preparing for releases. The key step involves querying your MySQL database to load modules and map their relationships, followed by an HTTP request to a dependency analysis tool that processes the data into actionable insights.

Use this workflow when you need periodic scans of your project's structure, such as during CI/CD pipelines or after major code changes, to catch dependency problems early. Avoid it for one-off analyses or tiny projects where built-in IDE tools suffice, as the setup requires a MySQL backend. Common variations include integrating with GitHub webhooks for on-commit triggers or extending the output to Slack notifications for team alerts.

About this workflow

Module Dependency Analysis. Uses scheduleTrigger, mySql, respondToWebhook, httpRequest. Webhook trigger; 12 nodes.

Source: https://github.com/pchambless/wf-monorepo/blob/47cd16469735c59a12b7c76e2552861f899e335d/.n8n/workflows/module-analysis.json — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Module Dependency Analysis. Uses scheduleTrigger, httpRequest, splitInBatches, mySql. Webhook trigger; 11 nodes.

HTTP Request, MySQL
General

Send Dingtalk Message On New Azure Devops Pull Request. Uses mySql, httpRequest, stickyNote. Webhook trigger; 5 nodes.

MySQL, HTTP Request
General

Portfolio Orchestrator. Uses httpRequest. Webhook trigger; 59 nodes.

HTTP Request
General

jump-section: Comment Fix Pipeline. Uses httpRequest. Webhook trigger; 24 nodes.

HTTP Request
General

GitHub Issues Router (Linear / Jira / ClickUp). Uses stickyNote, httpRequest, respondToWebhook. Webhook trigger; 23 nodes.

HTTP Request