Back to Nodes

Code Plus

Last updated Nov 5, 2025

n8n node that runs user code with installable cached libraries

9 Weekly Downloads
90 Monthly Downloads

Included Nodes

Code Plus

Description

Code Plus — n8n Community Node

Run custom JavaScript with installable npm libraries and a persistent cache.

!npm version
!npm downloads
!license

Package: @warnyin/n8n-nodes-code-plus

> ⚠️ BREAKING CHANGE in v0.1.24: API now matches n8n standard. Use $input.all() and $input.item with .json property accessor. See CHANGELOG.md for migration guide.

Table of Contents

  • About
  • Key Features
  • Installation
  • Usage
  • Quick Start
  • n8n Code (compat) Examples
  • Detailed Parameters & Behavior
  • Examples
  • Notes & Limitations
  • Roadmap
  • Development
  • Changelog
  • License
  • References
  • About

  • Install npm libraries directly from the node UI (comma-separated or JSON array).
  • Cache libraries in a persistent directory for reuse and faster runs.
  • Optional Init Code that runs once before the main code.
  • Mode: Run Once for Each Item, Run Once for All Items, or n8n Code (compat).
  • Control Timeout, clear cache, and force reinstall.
  • Executes in a restricted VM with a custom require bound to the cache.
  • Documentation structure is inspired by the author’s Swagger API node for n8n [reference][ref-swagger].

    Key Features

  • On-the-fly npm dependency installation.
  • Supports both comma-separated and JSON array input for libraries.
  • Persistent cache directory (default ~/.n8n/code-plus-cache).
  • Select Mode: Run Once for Each Item, Run Once for All Items, or n8n Code (compat).
  • Language selector: JavaScript (Python options are visible but not supported in this node).
  • Safety options: Timeout, Clear Cache, Force Reinstall, Preinstall Only.
  • require() is scoped to the cache directory for controlled loading.
  • Installation

    Option 1: Community Nodes (Recommended)

    1) Open n8n and go to Settings → Community Nodes
    2) Click Install
    3) Enter: @warnyin/n8n-nodes-code-plus
    4) Accept the risks and install

    Option 2: Manual Installation

    cd ~/.n8n/nodes
    npm install @warnyin/n8n-nodes-code-plus
    

    Restart n8n

    Option 3: Local Development & Linking

    Clone, install, and build

    git clone https://github.com/warnyin/n8n-nodes-code-plus.git cd n8n-nodes-code-plus npm install npm run build

    Link to n8n

    npm link cd ~/.n8n npm link @warnyin/n8n-nodes-code-plus

    Restart n8n

    Usage

    Main Parameters

  • Libraries: e.g. nanoid@latest,lodash or ["nanoid","dayjs@^1"]
  • Init Code: runs once before main code
  • – ⚠️ Important: Variables must be declared without const/let/var to be accessible in Main Code
    – ✅ Correct: nanoid = require('nanoid').nanoid;
    – ❌ Incorrect: const nanoid = require('nanoid').nanoid;
    – Reason: Variables with const/let/var are scoped locally and not accessible outside Init Code

  • Main Code: JavaScript where require() loads from the cache
  • Tip: Use the field’s menu () → Reset Value to reapply example code for the current Language and Mode.
  • Mode: Run Once for Each Item, Run Once for All Items, or n8n Code (compat)
  • Language: JavaScript (Python options are visible but not supported in Code Plus)
  • Options: Cache Directory, Clear Cache, Force Reinstall, Timeout (ms), Cache TTL (minutes), Preinstall Only
  • Quick Start

    Example with Init Code and Main Code:

    // Init Code - Load library (declare WITHOUT const/let/var)
    nanoid = require('nanoid').nanoid;

    // Main Code - Use the variable (Mode: Run Once for All Items) for (const item of $input.all()) { item.json.id = nanoid(); } return $input.all();

    Simple Main Code without Init Code:

    // Mode: Run Once for Each Item
    const { nanoid } = require('nanoid');
    $input.item.json.id = nanoid();
    return $input.item;
    

    n8n Code (compat) Examples

  • Modify items in-place like the native Code node:
  • // Mode: n8n Code (compat)
    for (const item of $input.all()) {
      item.json.idx = $input.all().indexOf(item);
    }
    return $input.all();
    
  • Return a single item object with json:
  • // Mode: n8n Code (compat)
    return { json: { ok: true } };
    

    Detailed Parameters & Behavior (English)

    Language

  • Options: JavaScript (supported), Python (Beta), Python (Native) (Beta).
  • Current behavior: Only JavaScript executes in Code Plus. Selecting Python shows a friendly message and prevents execution.
  • Roadmap: Python support via system python + venv and/or Pyodide.
  • Mode

    Important: Starting from v0.1.24, Code Plus uses the n8n standard API with $input.all() and $input.item.

  • Run Once for Each Item
  • Context: $input.item (full item with .json property), $input.all() (all items), item, items, index
    Execution: Runs once per input item. Outputs are paired with inputs via pairedItem.
    Returns: Array → multiple outputs for that item; Object → one output; undefined → passthrough current item
    Best for: map/transform per item
    Example:

        $input.item.json.newField = 1;
        return $input.item;
        
  • Run Once for All Items
  • Context: $input.all() (array of all items with .json property), items, item (first item)
    Execution: Runs once for the whole batch
    Returns: Array → multiple outputs overall; Object → one output; undefined → passthrough all items
    Best for: aggregate/summary
    Example:

        for (const item of $input.all()) {
          item.json.newField = 1;
        }
        return $input.all();
        
  • n8n Code (compat)
  • Context: full item and items objects (not only json), plus index, $input.item, $input.all()
    Execution: Iterates per item internally, like n8n’s native Code node
    Returns: Native Code node style (return items, return { json: ... }, return [ ... ], return passthrough)
    Best for: migration from the native Code node or when full item structure is required

    Mode

  • Run Once for Each Item
  • – Context: item.json, items.map(x => x.json), index, $input.item = item.json.
    – Execution: Runs once per input item. Outputs are paired with inputs via pairedItem.
    – Returns: Array → multiple outputs for that item; Object → one output; undefined → passthrough current item.json.
    – Best for: map/transform per item.

  • Run Once for All Items
  • – Context: items is an array of all json payloads; $input.item = items[0]?.json.
    – Execution: Runs once for the whole batch.
    – Returns: Array → multiple outputs overall; Object → one output; undefined → passthrough first item’s json (if present).
    – Best for: aggregate/summary.

  • n8n Code (compat)
  • – Context: full item and items objects (not only json), plus index, $input.item = item.
    – Execution: Iterates per item internally, like n8n’s native Code node.
    – Returns: Native Code node style (return items, return { json: ... }, return [ ... ], return passthrough).
    – Best for: migration from the native Code node or when full item structure is required.

    Libraries

  • Input formats: comma-separated (nanoid@latest,lodash) or JSON array (["nanoid","dayjs@^1"]).
  • Installed into the node’s cache directory (default: ~/.n8n/code-plus-cache).
  • Force Reinstall reinstalls even if present; Clear Cache Before Run removes cache node_modules before installing.
  • Init Code

  • Runs once before main code in the same VM context.
  • ⚠️ Important Variable Scoping:
  • – Variables declared with const/let/var are NOT accessible in Main Code
    – To share variables, declare without const/let/var (global assignment)
    – Example:

        // Init Code
        nanoid = require('nanoid').nanoid;  // ✅ Accessible in Main Code
        lodash = require('lodash');          // ✅ Accessible in Main Code
        
        // DON'T DO THIS:
        const helper = require('some-lib');  // ❌ NOT accessible in Main Code
        
  • Use for: preloading libraries, setting global configurations, initializing shared state
  • Supports top-level await (wrapped in async context)
  • Main Code

  • JavaScript in a restricted VM with custom require() bound to the cache.
  • Supports top-level await/return; Timeout (ms) applies to both init and main code.
  • Options

  • Cache Directory: Path for library cache (default ~/.n8n/code-plus-cache).
  • Clear Cache Before Run: Remove cached modules before reinstalling.
  • Force Reinstall: Reinstall libraries regardless of presence.
  • Timeout (ms): Max execution time for init/main code.
  • Cache TTL (minutes): Automatically clears installed libraries when the last install time exceeds this TTL.
  • Preinstall Only: Install libraries and return a summary without running code.
  • Execution Context

  • console: Forwarded to the UI in manual mode; to stdout in execute mode when CODEENABLESTDOUT="true".
  • $input helper (matches n8n standard):
  • $input.all() returns array of all items (each item has .json property with data)
    $input.item returns current item (has .json property with data)
    – Access data via $input.item.json.fieldName or item.json.fieldName in loops

  • require(): Scoped to the cache directory for controlled loading of npm packages.
  • Built-ins: Buffer, setTimeout, setInterval, clearTimeout, clearInterval.
  • helpers: Exposes n8n helpers via helpers in the sandbox.
  • Examples

    Using Init Code with Libraries (Mode: Run Once for All Items)

    // Libraries: nanoid@latest,lodash
    // Mode: Run Once for All Items

    // Init Code - Load libraries globally (NO const/let/var) nanoid = require('nanoid').nanoid; lodash = require('lodash');

    // Main Code - Modify items and return them for (const item of $input.all()) { item.json.short_id = nanoid(8); item.json.tags = lodash.uniq(item.json.tags || []); } return $input.all();

    Per-Item Processing (Mode: Run Once for Each Item)

    // Libraries: nanoid@latest
    // Mode: Run Once for Each Item

    // Init Code nanoid = require('nanoid').nanoid;

    // Main Code - Process single item $input.item.json.short_id = nanoid(8); return $input.item;

    Generate IDs without Init Code (Mode: Run Once for All Items)

    const { nanoid } = require('nanoid');
    for (const item of $input.all()) {
      item.json.id = nanoid();
    }
    return $input.all();
    

    Use lodash to chunk data (Mode: Run Once for All Items)

    const _ = require('lodash');
    const allItems = $input.all();
    const chunks = _.chunk(allItems.map(x => x.json), 50);
    return chunks.map(chunk => ({ json: { chunksCount: chunks.length, items: chunk } }));
    

    Run once and stamp a timestamp via dayjs (Mode: Run Once for All Items)

    const dayjs = require('dayjs');
    for (const item of $input.all()) {
      item.json.processedAt = dayjs().toISOString();
    }
    return $input.all();
    

    Notes & Limitations

  • Requires network access and permission to run npm install on the n8n server.
  • Libraries are installed into the cache directory only, not into n8n itself.
  • require() is restricted to the cache; Node built-ins are accessible via the sandbox.
  • Avoid long-running or blocking code; configure Timeout (ms) appropriately.
  • Python execution (python / pythonNative) is not supported in Code Plus; use the native Code node in n8n for Python.
  • Troubleshooting

    My field modifications don’t appear in output

    Problem: Code like item.newField = value doesn’t show in output

    Solution: Use $input.all() or $input.item with the .json property:

  • Mode: Run Once for All Items
  •   // ✅ Correct - access item.json
      for (const item of $input.all()) {
        item.json.short_id = nanoid();
      }
      return $input.all();
      
  • Mode: Run Once for Each Item
  •   // ✅ Correct - access $input.item.json
      $input.item.json.short_id = nanoid();
      return $input.item;
      
  • Mode: n8n Code (compat)
  •   // ✅ Correct - items[i].json is the JSON object
      for (const item of $input.all()) {
        item.json.short_id = nanoid();
      }
      return $input.all();
      

    Variables from Init Code are not defined

    Problem: ReferenceError: nanoid is not defined

    Solution: Don’t use const/let/var in Init Code

    // ❌ Wrong
    const nanoid = require('nanoid').nanoid;

    // ✅ Correct nanoid = require('nanoid').nanoid;

    Library not installing or not found

    Problem: Cannot find module 'xxx'

    Solution:
    1. Check Libraries field has correct package name
    2. Try enabling Force Reinstall option
    3. Check Clear Cache Before Run to reset cache
    4. Verify network access and npm registry availability


    Made with ❤️ for the n8n community

    Roadmap

  • Near-term (0.1.x)
  • – Add UI toggle for stdout (replace CODEENABLESTDOUT env var).
    – Expand $input and console forwarding docs with examples/screenshots.
    – Review default Mode to align with the native Code node.
    – Concurrency control for Run Once for Each Item.
    – Internationalized error messages (English/Thai) with structured details.

  • Python Support
  • – Execute Python via venv + pip with per-node cache.
    – Cross-platform handling (Windows/Linux/macOS) and compiled wheels.
    – Safety: timeouts, memory limits, sanitized imports.
    Python (Native) via Pyodide as a fallback when system Python is unavailable.
    – Language-aware editor (syntax highlight/linting for Python).

  • Execution & Security
  • – Require allowlist/denylist.
    – Offline mode and dependency whitelist scanning; integrity checks via lockfile.
    – Resource limits (CPU/Memory) and configurable concurrency.
    – Harden sandbox and restrict accessible globals.

  • Features & Compatibility
  • – Multiple outputs and binary data support.
    – Expand $input (e.g., first, pairedItem) to parity with the native Code node.
    – UI list of installed libraries with upgrade/remove actions.
    – Proxy and custom registry support for installations.

  • UX & Developer Experience
  • – Template/snippet library in the editor.
    – Autocomplete for require() from installed libraries.
    – Debug mode with step logging and timing.
    – CLI for preinstall/prune cache operations.
    – Unit/integration tests and full example workflows.

    Development

    npm install
    npm run build
    

    Use npm link as shown above to connect with n8n

    Changelog

  • See CHANGELOG.md for release notes.
  • License

  • MIT License — see LICENSE.md.
  • References

  • [0] @warnyin/n8n-nodes-swagger-api — README structure and sections [ref-swagger]

[ref-swagger]: https://www.npmjs.com/package/@warnyin/n8n-nodes-swagger-api#-warnyinn8n-nodes-swagger-api