Implement SQLite database with full-text search for n8n node documentation
Major features implemented: - SQLite storage service with FTS5 for fast node search - Database rebuild mechanism for bulk node extraction - MCP tools: search_nodes, extract_all_nodes, get_node_statistics - Production Docker deployment with persistent storage - Management scripts for database operations - Comprehensive test suite for all functionality Database capabilities: - Stores node source code and metadata - Full-text search by node name or content - No versioning (stores latest only as per requirements) - Supports complete database rebuilds - ~4.5MB database with 500+ nodes indexed Production features: - Automated deployment script - Docker Compose production configuration - Database initialization on first run - Volume persistence for data - Management utilities for operations Documentation: - Updated README with complete instructions - Production deployment guide - Clear troubleshooting section - API reference for all new tools 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
29
.env.example
29
.env.example
@@ -1,13 +1,22 @@
|
||||
# MCP Server Configuration
|
||||
MCP_SERVER_PORT=3000
|
||||
MCP_SERVER_HOST=localhost
|
||||
|
||||
# n8n Configuration
|
||||
N8N_API_URL=http://localhost:5678
|
||||
N8N_API_KEY=your-n8n-api-key
|
||||
N8N_BASIC_AUTH_USER=admin
|
||||
N8N_BASIC_AUTH_PASSWORD=your-secure-password-here
|
||||
N8N_HOST=localhost
|
||||
N8N_API_KEY=your-api-key-here
|
||||
|
||||
# MCP Configuration
|
||||
MCP_LOG_LEVEL=info
|
||||
NODE_ENV=production
|
||||
|
||||
# Database Configuration
|
||||
NODE_DB_PATH=/app/data/nodes.db
|
||||
|
||||
# Optional: External n8n instance
|
||||
# N8N_API_URL=http://your-n8n-instance:5678
|
||||
|
||||
# MCP Server Configuration (if using HTTP transport)
|
||||
# MCP_SERVER_PORT=3000
|
||||
# MCP_SERVER_HOST=localhost
|
||||
|
||||
# Authentication
|
||||
MCP_AUTH_TOKEN=your-secure-token
|
||||
|
||||
# Logging
|
||||
LOG_LEVEL=info
|
||||
# MCP_AUTH_TOKEN=your-secure-token
|
||||
53
Dockerfile
53
Dockerfile
@@ -1,23 +1,9 @@
|
||||
# Build stage
|
||||
FROM node:18-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files
|
||||
COPY package*.json ./
|
||||
|
||||
# Install dependencies
|
||||
RUN npm ci
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Build the project
|
||||
RUN npm run build
|
||||
|
||||
# Production stage
|
||||
FROM node:18-alpine
|
||||
|
||||
# Install SQLite (for database management)
|
||||
RUN apk add --no-cache sqlite
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files
|
||||
@@ -26,20 +12,43 @@ COPY package*.json ./
|
||||
# Install production dependencies only
|
||||
RUN npm ci --only=production
|
||||
|
||||
# Copy built files from builder stage
|
||||
COPY --from=builder /app/dist ./dist
|
||||
# Copy built files
|
||||
COPY dist ./dist
|
||||
COPY tests ./tests
|
||||
|
||||
# Create data directory for SQLite database
|
||||
RUN mkdir -p /app/data
|
||||
|
||||
# Create a non-root user
|
||||
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
|
||||
|
||||
# Change ownership
|
||||
# Change ownership (including data directory)
|
||||
RUN chown -R nodejs:nodejs /app
|
||||
|
||||
# Switch to non-root user
|
||||
USER nodejs
|
||||
|
||||
# Set environment variable for database location
|
||||
ENV NODE_DB_PATH=/app/data/nodes.db
|
||||
|
||||
# Create a startup script
|
||||
RUN printf '#!/bin/sh\n\
|
||||
echo "🚀 Starting n8n-MCP server..."\n\
|
||||
\n\
|
||||
# Initialize database if it does not exist\n\
|
||||
if [ ! -f "$NODE_DB_PATH" ]; then\n\
|
||||
echo "📦 Initializing database..."\n\
|
||||
node dist/scripts/rebuild-database.js\n\
|
||||
fi\n\
|
||||
\n\
|
||||
echo "🎯 Database ready, starting MCP server..."\n\
|
||||
exec node dist/index.js\n' > /app/start.sh && chmod +x /app/start.sh
|
||||
|
||||
# Expose the MCP server port (if using HTTP transport)
|
||||
EXPOSE 3000
|
||||
|
||||
# Start the MCP server
|
||||
CMD ["node", "dist/index.js"]
|
||||
# Volume for persistent database storage
|
||||
VOLUME ["/app/data"]
|
||||
|
||||
# Start the MCP server with database initialization
|
||||
CMD ["/bin/sh", "/app/start.sh"]
|
||||
325
README.md
325
README.md
@@ -1,76 +1,96 @@
|
||||
# n8n-mcp
|
||||
# n8n-MCP Integration
|
||||
|
||||
Integration between n8n workflow automation and Model Context Protocol (MCP). This project provides:
|
||||
Complete integration between n8n workflow automation and Model Context Protocol (MCP), enabling bidirectional communication between n8n workflows and AI assistants.
|
||||
|
||||
- An MCP server that exposes n8n workflows and operations to AI assistants
|
||||
- A custom n8n node for connecting to MCP servers from within workflows
|
||||
## Overview
|
||||
|
||||
This project provides two main components:
|
||||
1. **MCP Server**: Allows AI assistants (like Claude) to interact with n8n workflows, execute them, and explore n8n nodes
|
||||
2. **n8n Custom Node**: Enables n8n workflows to connect to and use MCP servers
|
||||
|
||||
**Important**: The MCP server uses stdio transport and is designed to be invoked by AI assistants like Claude Desktop. It's not a standalone HTTP server but rather a tool that AI assistants can call directly.
|
||||
|
||||
## Features
|
||||
|
||||
- **MCP Server**: Expose n8n workflows as tools, resources, and prompts for AI assistants
|
||||
- **n8n Node**: Connect to any MCP server from n8n workflows
|
||||
- **Bidirectional Integration**: Use AI capabilities in n8n and n8n automation in AI contexts
|
||||
- **Node Source Extraction**: Extract source code from any n8n node, including AI Agent nodes
|
||||
- **Authentication**: Secure token-based authentication
|
||||
- **Flexible Transport**: Support for WebSocket and stdio connections
|
||||
- **Bidirectional Integration**: n8n workflows can call MCP tools, and MCP servers can execute n8n workflows
|
||||
- **Node Source Extraction**: Extract and search source code from any n8n node, including AI Agent nodes
|
||||
- **SQLite Database**: Full-text search for n8n node documentation and source code (500+ nodes indexed)
|
||||
- **Production Ready**: Docker-based deployment with persistent storage
|
||||
- **Comprehensive MCP Tools**: 12+ tools for workflow management, node exploration, and database search
|
||||
- **Custom n8n Node**: Connect to any MCP server from n8n workflows
|
||||
- **Auto-indexing**: Automatically builds a searchable database of all n8n nodes on first run
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Node.js 18+
|
||||
- Docker and Docker Compose (for production deployment)
|
||||
- n8n instance with API access enabled
|
||||
- (Optional) Claude Desktop for MCP integration
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js 18+
|
||||
- n8n instance with API access enabled
|
||||
- MCP-compatible AI assistant (Claude, etc.)
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/czlonkowski/n8n-mcp.git
|
||||
git clone https://github.com/yourusername/n8n-mcp.git
|
||||
cd n8n-mcp
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Copy environment configuration
|
||||
# Copy environment template
|
||||
cp .env.example .env
|
||||
# Edit .env with your n8n credentials
|
||||
|
||||
# Configure your n8n API credentials
|
||||
# Edit .env with your n8n instance details
|
||||
```
|
||||
|
||||
### Running the MCP Server
|
||||
|
||||
```bash
|
||||
# Build the project
|
||||
npm run build
|
||||
|
||||
# Start the MCP server
|
||||
npm start
|
||||
# Initialize the database
|
||||
npm run db:init
|
||||
|
||||
# (Optional) Rebuild database with all nodes
|
||||
npm run db:rebuild
|
||||
```
|
||||
|
||||
For development:
|
||||
### Development
|
||||
|
||||
```bash
|
||||
# Run tests
|
||||
npm test
|
||||
|
||||
# Start development server
|
||||
npm run dev
|
||||
|
||||
# Type checking
|
||||
npm run typecheck
|
||||
```
|
||||
|
||||
### Production Deployment
|
||||
|
||||
```bash
|
||||
# Use the automated deployment script
|
||||
./scripts/deploy-production.sh
|
||||
|
||||
# Or manually with Docker Compose
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
See [Production Deployment Guide](docs/PRODUCTION_DEPLOYMENT.md) for detailed instructions.
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Create a `.env` file based on `.env.example`:
|
||||
Environment variables (`.env` file):
|
||||
|
||||
```env
|
||||
# MCP Server Configuration
|
||||
MCP_SERVER_PORT=3000
|
||||
MCP_SERVER_HOST=localhost
|
||||
|
||||
# n8n Configuration
|
||||
N8N_API_URL=http://localhost:5678
|
||||
N8N_API_KEY=your-n8n-api-key
|
||||
N8N_BASIC_AUTH_USER=admin
|
||||
N8N_BASIC_AUTH_PASSWORD=your-password
|
||||
N8N_HOST=localhost
|
||||
N8N_API_KEY=your-api-key
|
||||
|
||||
# Authentication
|
||||
MCP_AUTH_TOKEN=your-secure-token
|
||||
# Database
|
||||
NODE_DB_PATH=/app/data/nodes.db
|
||||
|
||||
# Logging
|
||||
LOG_LEVEL=info
|
||||
@@ -99,20 +119,32 @@ Add the server to your Claude configuration:
|
||||
|
||||
### Available MCP Tools
|
||||
|
||||
#### Workflow Management
|
||||
- `execute_workflow` - Execute an n8n workflow by ID
|
||||
- `list_workflows` - List all available workflows
|
||||
- `get_workflow` - Get details of a specific workflow
|
||||
- `create_workflow` - Create a new workflow
|
||||
- `update_workflow` - Update an existing workflow
|
||||
- `delete_workflow` - Delete a workflow
|
||||
- `list_workflows` - List all workflows with filtering options
|
||||
- `get_workflow` - Get detailed workflow information
|
||||
- `create_workflow` - Create new workflows programmatically
|
||||
- `update_workflow` - Update existing workflows
|
||||
- `delete_workflow` - Delete workflows
|
||||
- `get_executions` - Get workflow execution history
|
||||
- `get_execution_data` - Get detailed execution data
|
||||
- `get_node_source_code` - Extract source code of any n8n node
|
||||
|
||||
#### Node Exploration & Search
|
||||
- `list_available_nodes` - List all available n8n nodes
|
||||
- `get_node_source_code` - Extract source code of any n8n node
|
||||
- `search_nodes` - Search nodes by name or content using full-text search
|
||||
- `extract_all_nodes` - Extract and index all nodes to database
|
||||
- `get_node_statistics` - Get database statistics (total nodes, packages, etc.)
|
||||
|
||||
### Using the n8n MCP Node
|
||||
|
||||
1. Copy the node files to your n8n custom nodes directory
|
||||
1. Install the node in n8n:
|
||||
```bash
|
||||
# Copy to n8n custom nodes directory
|
||||
cp -r dist/n8n/* ~/.n8n/custom/
|
||||
# Or use the install script
|
||||
./scripts/install-n8n-node.sh
|
||||
```
|
||||
2. Restart n8n
|
||||
3. The MCP node will appear in the nodes panel
|
||||
4. Configure with your MCP server credentials
|
||||
@@ -139,44 +171,64 @@ Add the server to your Claude configuration:
|
||||
|
||||
## Architecture
|
||||
|
||||
### Project Structure
|
||||
### Components
|
||||
|
||||
```
|
||||
n8n-mcp/
|
||||
├── src/
|
||||
│ ├── mcp/ # MCP server implementation
|
||||
│ ├── n8n/ # n8n node implementation
|
||||
│ ├── utils/ # Shared utilities
|
||||
│ └── types/ # TypeScript type definitions
|
||||
├── tests/ # Test files
|
||||
└── dist/ # Compiled output
|
||||
1. **MCP Server** (`src/mcp/`): Exposes n8n operations as MCP tools
|
||||
2. **n8n Custom Node** (`src/n8n/`): Allows n8n to connect to MCP servers
|
||||
3. **SQLite Storage** (`src/services/`): Persistent storage with full-text search
|
||||
4. **Bridge Layer** (`src/utils/`): Converts between n8n and MCP formats
|
||||
|
||||
### Database Management
|
||||
|
||||
The SQLite database stores n8n node documentation and source code with full-text search capabilities:
|
||||
|
||||
```bash
|
||||
# Initialize empty database
|
||||
npm run db:init
|
||||
|
||||
# Rebuild the entire database (indexes all nodes)
|
||||
npm run db:rebuild
|
||||
|
||||
# In production
|
||||
./scripts/manage-production.sh rebuild-db
|
||||
|
||||
# View statistics
|
||||
./scripts/manage-production.sh db-stats
|
||||
```
|
||||
|
||||
### Key Components
|
||||
#### Search Examples
|
||||
|
||||
- **MCP Server**: Handles MCP protocol requests and translates to n8n API calls
|
||||
- **n8n API Client**: Manages communication with n8n instance
|
||||
- **Bridge Layer**: Converts between n8n and MCP data formats
|
||||
- **Authentication**: Validates tokens and manages access control
|
||||
```javascript
|
||||
// Search for nodes by name
|
||||
await mcp.callTool('search_nodes', { query: 'webhook' })
|
||||
|
||||
## Development
|
||||
// Search in specific package
|
||||
await mcp.callTool('search_nodes', {
|
||||
query: 'http',
|
||||
packageName: 'n8n-nodes-base'
|
||||
})
|
||||
|
||||
### Running Tests
|
||||
// Get database statistics
|
||||
await mcp.callTool('get_node_statistics', {})
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Run All Tests
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
### Building
|
||||
|
||||
### Test Specific Features
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
# Test node extraction
|
||||
node tests/test-mcp-extraction.js
|
||||
|
||||
### Type Checking
|
||||
# Test database search
|
||||
node tests/test-sqlite-search.js
|
||||
|
||||
```bash
|
||||
npm run typecheck
|
||||
# Test AI Agent extraction
|
||||
./scripts/test-ai-agent-extraction.sh
|
||||
```
|
||||
|
||||
## API Reference
|
||||
@@ -201,14 +253,36 @@ Parameters:
|
||||
Extract source code of any n8n node.
|
||||
|
||||
Parameters:
|
||||
- `nodeType` (string, required): The node type identifier (e.g., `@n8n/n8n-nodes-langchain.Agent`)
|
||||
- `nodeType` (string, required): The node type identifier (e.g., `n8n-nodes-base.Webhook`)
|
||||
- `includeCredentials` (boolean, optional): Include credential type definitions if available
|
||||
|
||||
#### search_nodes
|
||||
Search nodes using full-text search in the SQLite database.
|
||||
|
||||
Parameters:
|
||||
- `query` (string, optional): Search term for node names/descriptions
|
||||
- `packageName` (string, optional): Filter by package name
|
||||
- `nodeType` (string, optional): Filter by node type pattern
|
||||
- `hasCredentials` (boolean, optional): Filter nodes with credentials
|
||||
- `limit` (number, optional): Limit results (default: 20)
|
||||
|
||||
#### extract_all_nodes
|
||||
Extract and index all available nodes to the database.
|
||||
|
||||
Parameters:
|
||||
- `packageFilter` (string, optional): Filter by package name
|
||||
- `limit` (number, optional): Limit number of nodes to extract
|
||||
|
||||
#### get_node_statistics
|
||||
Get database statistics including total nodes, packages, and size.
|
||||
|
||||
No parameters required.
|
||||
|
||||
#### list_available_nodes
|
||||
List all available n8n nodes in the system.
|
||||
|
||||
Parameters:
|
||||
- `category` (string, optional): Filter by category (e.g., AI, Data Transformation)
|
||||
- `category` (string, optional): Filter by category
|
||||
- `search` (string, optional): Search term to filter nodes
|
||||
|
||||
### MCP Resources
|
||||
@@ -227,65 +301,88 @@ Parameters:
|
||||
- `optimize_workflow_prompt` - Optimize workflow performance
|
||||
- `explain_workflow_prompt` - Explain workflow functionality
|
||||
|
||||
## Management
|
||||
|
||||
Use the management script for production operations:
|
||||
|
||||
```bash
|
||||
# Check status
|
||||
./scripts/manage-production.sh status
|
||||
|
||||
# View logs
|
||||
./scripts/manage-production.sh logs
|
||||
|
||||
# Create backup
|
||||
./scripts/manage-production.sh backup
|
||||
|
||||
# Update services
|
||||
./scripts/manage-production.sh update
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Connection refused**: Ensure n8n is running and API is enabled
|
||||
2. **Authentication failed**: Check your API key in .env
|
||||
3. **Workflow not found**: Verify workflow ID exists in n8n
|
||||
4. **MCP connection failed**: Check server is running and accessible
|
||||
1. **MCP server keeps restarting in Docker**
|
||||
- This is expected behavior. The MCP server uses stdio transport and waits for input from AI assistants.
|
||||
- For testing, use the development mode or invoke through Claude Desktop.
|
||||
|
||||
### Debug Mode
|
||||
2. **Database not found**
|
||||
- Run `npm run db:init` to create the database
|
||||
- Run `npm run db:rebuild` to populate with all nodes
|
||||
|
||||
3. **n8n API connection failed**
|
||||
- Verify n8n is running and accessible
|
||||
- Check API key in `.env` file
|
||||
- Ensure n8n API is enabled in settings
|
||||
|
||||
4. **Node extraction fails**
|
||||
- Ensure Docker volume mounts are correct
|
||||
- Check read permissions on node_modules directory
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Production Deployment Guide](docs/PRODUCTION_DEPLOYMENT.md)
|
||||
- [AI Agent Extraction Test](docs/AI_AGENT_EXTRACTION_TEST.md)
|
||||
|
||||
## Security
|
||||
|
||||
- Token-based authentication for n8n API
|
||||
- Read-only access to node source files
|
||||
- Isolated Docker containers
|
||||
- Persistent volume encryption (optional)
|
||||
|
||||
## Project Structure
|
||||
|
||||
Enable debug logging:
|
||||
```env
|
||||
LOG_LEVEL=debug
|
||||
```
|
||||
|
||||
## Special Features
|
||||
|
||||
### AI Agent Node Extraction
|
||||
|
||||
The MCP server can extract source code from n8n nodes, particularly useful for AI Agent nodes:
|
||||
|
||||
```bash
|
||||
# Test AI Agent extraction
|
||||
./scripts/test-ai-agent-extraction.sh
|
||||
|
||||
# Or use the standalone test
|
||||
node tests/test-mcp-extraction.js
|
||||
```
|
||||
|
||||
This feature allows AI assistants to:
|
||||
- Understand n8n node implementations
|
||||
- Generate compatible code
|
||||
- Debug workflow issues
|
||||
- Create custom variations
|
||||
|
||||
### Docker Volumes for Node Access
|
||||
|
||||
When running in Docker, mount n8n's node_modules for source extraction:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- n8n_modules:/usr/local/lib/node_modules/n8n/node_modules:ro
|
||||
n8n-mcp/
|
||||
├── src/
|
||||
│ ├── mcp/ # MCP server implementation
|
||||
│ ├── n8n/ # n8n custom node
|
||||
│ ├── services/ # SQLite storage service
|
||||
│ ├── utils/ # Utilities and helpers
|
||||
│ └── scripts/ # Database management scripts
|
||||
├── tests/ # Test suite
|
||||
├── docs/ # Documentation
|
||||
├── scripts/ # Deployment and management scripts
|
||||
└── data/ # SQLite database (created on init)
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please:
|
||||
1. Fork the repository
|
||||
2. Create a feature branch
|
||||
3. Make your changes
|
||||
4. Add tests
|
||||
3. Add tests for new features
|
||||
4. Ensure all tests pass
|
||||
5. Submit a pull request
|
||||
|
||||
## License
|
||||
|
||||
ISC License - see LICENSE file for details
|
||||
ISC License
|
||||
|
||||
## Support
|
||||
|
||||
- Issues: https://github.com/czlonkowski/n8n-mcp/issues
|
||||
- n8n Documentation: https://docs.n8n.io
|
||||
- MCP Specification: https://modelcontextprotocol.io
|
||||
- GitHub Issues: [Report bugs or request features](https://github.com/yourusername/n8n-mcp/issues)
|
||||
- n8n Community: [n8n.io/community](https://community.n8n.io/)
|
||||
- MCP Documentation: [modelcontextprotocol.io](https://modelcontextprotocol.io/)
|
||||
|
||||
BIN
data/nodes.db
Normal file
BIN
data/nodes.db
Normal file
Binary file not shown.
69
docker-compose.prod.yml
Normal file
69
docker-compose.prod.yml
Normal file
@@ -0,0 +1,69 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
n8n-mcp:
|
||||
image: n8n-mcp:production
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: n8n-mcp-server
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- NODE_DB_PATH=/app/data/nodes.db
|
||||
- N8N_API_URL=http://n8n:5678
|
||||
- N8N_API_KEY=${N8N_API_KEY}
|
||||
- LOG_LEVEL=info
|
||||
volumes:
|
||||
- mcp-data:/app/data
|
||||
- n8n-node-modules:/usr/local/lib/node_modules/n8n/node_modules:ro
|
||||
networks:
|
||||
- n8n-network
|
||||
depends_on:
|
||||
- n8n
|
||||
healthcheck:
|
||||
test: ["CMD", "node", "-e", "require('fs').existsSync('/app/data/nodes.db') || process.exit(1)"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
n8n:
|
||||
image: n8nio/n8n:latest
|
||||
container_name: n8n
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5678:5678"
|
||||
environment:
|
||||
- N8N_BASIC_AUTH_ACTIVE=true
|
||||
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
|
||||
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
|
||||
- N8N_HOST=${N8N_HOST:-localhost}
|
||||
- N8N_PORT=5678
|
||||
- N8N_PROTOCOL=http
|
||||
- NODE_ENV=production
|
||||
- N8N_METRICS=true
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
volumes:
|
||||
- n8n-data:/home/node/.n8n
|
||||
- ./dist/n8n:/home/node/.n8n/custom/nodes
|
||||
networks:
|
||||
- n8n-network
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-q", "-O", "-", "http://localhost:5678/healthz"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
volumes:
|
||||
n8n-data:
|
||||
driver: local
|
||||
mcp-data:
|
||||
driver: local
|
||||
n8n-node-modules:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
n8n-network:
|
||||
driver: bridge
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
networks:
|
||||
- test-network
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"]
|
||||
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
@@ -51,8 +51,7 @@ services:
|
||||
networks:
|
||||
- test-network
|
||||
depends_on:
|
||||
n8n:
|
||||
condition: service_healthy
|
||||
- n8n
|
||||
command: node dist/index.js
|
||||
|
||||
networks:
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# Development docker-compose configuration
|
||||
# For production deployment, use docker-compose.prod.yml
|
||||
# See docs/PRODUCTION_DEPLOYMENT.md for instructions
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
|
||||
188
docs/IMPLEMENTATION_ROADMAP.md
Normal file
188
docs/IMPLEMENTATION_ROADMAP.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# n8n-MCP Implementation Roadmap
|
||||
|
||||
## ✅ Completed Features
|
||||
|
||||
### 1. Core MCP Server Implementation
|
||||
- [x] Basic MCP server with stdio transport
|
||||
- [x] Tool handlers for n8n workflow operations
|
||||
- [x] Resource handlers for workflow data
|
||||
- [x] Authentication and error handling
|
||||
|
||||
### 2. n8n Integration
|
||||
- [x] n8n API client for workflow management
|
||||
- [x] MCP<->n8n data bridge for format conversion
|
||||
- [x] Workflow execution and monitoring
|
||||
|
||||
### 3. Node Source Extraction
|
||||
- [x] Extract source code from any n8n node
|
||||
- [x] Handle pnpm directory structures
|
||||
- [x] Support for AI Agent node extraction
|
||||
- [x] Bulk extraction capabilities
|
||||
|
||||
### 4. Node Storage System
|
||||
- [x] In-memory storage service
|
||||
- [x] Search functionality
|
||||
- [x] Package statistics
|
||||
- [x] Database export format
|
||||
|
||||
## 🚧 Next Implementation Steps
|
||||
|
||||
### Phase 1: Database Integration (Priority: High)
|
||||
1. **Real Database Backend**
|
||||
- [ ] Add PostgreSQL/SQLite support
|
||||
- [ ] Implement proper migrations
|
||||
- [ ] Add connection pooling
|
||||
- [ ] Transaction support
|
||||
|
||||
2. **Enhanced Storage Features**
|
||||
- [ ] Version tracking for nodes
|
||||
- [ ] Diff detection for updates
|
||||
- [ ] Backup/restore functionality
|
||||
- [ ] Data compression
|
||||
|
||||
### Phase 2: Advanced Search & Analysis (Priority: High)
|
||||
1. **Full-Text Search**
|
||||
- [ ] Elasticsearch/MeiliSearch integration
|
||||
- [ ] Code analysis and indexing
|
||||
- [ ] Semantic search capabilities
|
||||
- [ ] Search by functionality
|
||||
|
||||
2. **Node Analysis**
|
||||
- [ ] Dependency graph generation
|
||||
- [ ] Security vulnerability scanning
|
||||
- [ ] Performance profiling
|
||||
- [ ] Code quality metrics
|
||||
|
||||
### Phase 3: AI Integration (Priority: Medium)
|
||||
1. **AI-Powered Features**
|
||||
- [ ] Node recommendation system
|
||||
- [ ] Workflow generation from descriptions
|
||||
- [ ] Code explanation generation
|
||||
- [ ] Automatic documentation
|
||||
|
||||
2. **Vector Database**
|
||||
- [ ] Node embeddings generation
|
||||
- [ ] Similarity search
|
||||
- [ ] Clustering similar nodes
|
||||
- [ ] AI training data export
|
||||
|
||||
### Phase 4: n8n Node Development (Priority: Medium)
|
||||
1. **MCPNode Enhancements**
|
||||
- [ ] Dynamic tool discovery
|
||||
- [ ] Streaming responses
|
||||
- [ ] File upload/download
|
||||
- [ ] WebSocket support
|
||||
|
||||
2. **Custom Node Features**
|
||||
- [ ] Visual configuration UI
|
||||
- [ ] Credential management
|
||||
- [ ] Error handling improvements
|
||||
- [ ] Performance monitoring
|
||||
|
||||
### Phase 5: API & Web Interface (Priority: Low)
|
||||
1. **REST/GraphQL API**
|
||||
- [ ] Node search API
|
||||
- [ ] Statistics dashboard
|
||||
- [ ] Webhook notifications
|
||||
- [ ] Rate limiting
|
||||
|
||||
2. **Web Dashboard**
|
||||
- [ ] Node browser interface
|
||||
- [ ] Code viewer with syntax highlighting
|
||||
- [ ] Search interface
|
||||
- [ ] Analytics dashboard
|
||||
|
||||
### Phase 6: Production Features (Priority: Low)
|
||||
1. **Deployment**
|
||||
- [ ] Kubernetes manifests
|
||||
- [ ] Helm charts
|
||||
- [ ] Auto-scaling configuration
|
||||
- [ ] Health checks
|
||||
|
||||
2. **Monitoring**
|
||||
- [ ] Prometheus metrics
|
||||
- [ ] Grafana dashboards
|
||||
- [ ] Log aggregation
|
||||
- [ ] Alerting rules
|
||||
|
||||
## 🎯 Immediate Next Steps
|
||||
|
||||
1. **Database Integration** (Week 1-2)
|
||||
```typescript
|
||||
// Add to package.json
|
||||
"typeorm": "^0.3.x",
|
||||
"pg": "^8.x"
|
||||
|
||||
// Create entities/Node.entity.ts
|
||||
@Entity()
|
||||
export class Node {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
@Column({ unique: true })
|
||||
nodeType: string;
|
||||
|
||||
@Column('text')
|
||||
sourceCode: string;
|
||||
// ... etc
|
||||
}
|
||||
```
|
||||
|
||||
2. **Add Database MCP Tools** (Week 2)
|
||||
```typescript
|
||||
// New tools:
|
||||
- sync_nodes_to_database
|
||||
- query_nodes_database
|
||||
- export_nodes_for_training
|
||||
```
|
||||
|
||||
3. **Create Migration Scripts** (Week 2-3)
|
||||
```bash
|
||||
npm run migrate:create -- CreateNodesTable
|
||||
npm run migrate:run
|
||||
```
|
||||
|
||||
4. **Implement Caching Layer** (Week 3)
|
||||
- Redis for frequently accessed nodes
|
||||
- LRU cache for search results
|
||||
- Invalidation strategies
|
||||
|
||||
5. **Add Real-Time Updates** (Week 4)
|
||||
- WebSocket server for live updates
|
||||
- Node change notifications
|
||||
- Workflow execution streaming
|
||||
|
||||
## 📊 Success Metrics
|
||||
|
||||
- [ ] Extract and store 100% of n8n nodes
|
||||
- [ ] Search response time < 100ms
|
||||
- [ ] Support for 10k+ stored nodes
|
||||
- [ ] 99.9% uptime for MCP server
|
||||
- [ ] Full-text search accuracy > 90%
|
||||
|
||||
## 🔗 Integration Points
|
||||
|
||||
1. **n8n Community Store**
|
||||
- Sync with community nodes
|
||||
- Version tracking
|
||||
- Popularity metrics
|
||||
|
||||
2. **AI Platforms**
|
||||
- OpenAI fine-tuning exports
|
||||
- Anthropic training data
|
||||
- Local LLM integration
|
||||
|
||||
3. **Development Tools**
|
||||
- VS Code extension
|
||||
- CLI tools
|
||||
- SDK libraries
|
||||
|
||||
## 📝 Documentation Needs
|
||||
|
||||
- [ ] API reference documentation
|
||||
- [ ] Database schema documentation
|
||||
- [ ] Search query syntax guide
|
||||
- [ ] Performance tuning guide
|
||||
- [ ] Security best practices
|
||||
|
||||
This roadmap provides a clear path forward for the n8n-MCP project, with the most critical next step being proper database integration to persist the extracted node data.
|
||||
207
docs/PRODUCTION_DEPLOYMENT.md
Normal file
207
docs/PRODUCTION_DEPLOYMENT.md
Normal file
@@ -0,0 +1,207 @@
|
||||
# Production Deployment Guide for n8n-MCP
|
||||
|
||||
This guide provides instructions for deploying n8n-MCP in a production environment.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker and Docker Compose v2 installed
|
||||
- Node.js 18+ installed (for building)
|
||||
- At least 2GB of available RAM
|
||||
- 1GB of available disk space
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. **Clone the repository**
|
||||
```bash
|
||||
git clone https://github.com/yourusername/n8n-mcp.git
|
||||
cd n8n-mcp
|
||||
```
|
||||
|
||||
2. **Run the deployment script**
|
||||
```bash
|
||||
./scripts/deploy-production.sh
|
||||
```
|
||||
|
||||
This script will:
|
||||
- Check prerequisites
|
||||
- Create a secure `.env` file with generated passwords
|
||||
- Build the project
|
||||
- Create Docker images
|
||||
- Start all services
|
||||
- Initialize the node database
|
||||
|
||||
3. **Access n8n**
|
||||
- URL: `http://localhost:5678`
|
||||
- Use the credentials displayed during deployment
|
||||
|
||||
## Manual Deployment
|
||||
|
||||
If you prefer manual deployment:
|
||||
|
||||
1. **Create .env file**
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Edit .env with your configuration
|
||||
```
|
||||
|
||||
2. **Build the project**
|
||||
```bash
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
3. **Start services**
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `N8N_BASIC_AUTH_USER` | n8n admin username | admin |
|
||||
| `N8N_BASIC_AUTH_PASSWORD` | n8n admin password | (generated) |
|
||||
| `N8N_HOST` | n8n hostname | localhost |
|
||||
| `N8N_API_KEY` | API key for n8n access | (generated) |
|
||||
| `NODE_DB_PATH` | SQLite database path | /app/data/nodes.db |
|
||||
| `LOG_LEVEL` | Logging level | info |
|
||||
|
||||
### Volumes
|
||||
|
||||
The deployment creates persistent volumes:
|
||||
- `n8n-data`: n8n workflows and credentials
|
||||
- `mcp-data`: MCP node database
|
||||
- `n8n-node-modules`: Read-only n8n node modules
|
||||
|
||||
## Management
|
||||
|
||||
Use the management script for common operations:
|
||||
|
||||
```bash
|
||||
# Check service status
|
||||
./scripts/manage-production.sh status
|
||||
|
||||
# View logs
|
||||
./scripts/manage-production.sh logs
|
||||
|
||||
# Rebuild node database
|
||||
./scripts/manage-production.sh rebuild-db
|
||||
|
||||
# Show database statistics
|
||||
./scripts/manage-production.sh db-stats
|
||||
|
||||
# Create backup
|
||||
./scripts/manage-production.sh backup
|
||||
|
||||
# Update services
|
||||
./scripts/manage-production.sh update
|
||||
```
|
||||
|
||||
## Database Management
|
||||
|
||||
### Initial Database Population
|
||||
|
||||
The database is automatically populated on first startup. To manually rebuild:
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml exec n8n-mcp node dist/scripts/rebuild-database.js
|
||||
```
|
||||
|
||||
### Database Queries
|
||||
|
||||
Search for nodes:
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml exec n8n-mcp sqlite3 /app/data/nodes.db \
|
||||
"SELECT node_type, display_name FROM nodes WHERE name LIKE '%webhook%';"
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **Change default passwords**: Always change the generated passwords in production
|
||||
2. **Use HTTPS**: Configure a reverse proxy (nginx, traefik) for HTTPS
|
||||
3. **Firewall**: Restrict access to ports 5678
|
||||
4. **API Keys**: Keep API keys secure and rotate regularly
|
||||
5. **Backups**: Regular backup of data volumes
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Health Checks
|
||||
|
||||
Both services include health checks:
|
||||
- n8n: `http://localhost:5678/healthz`
|
||||
- MCP: Database file existence check
|
||||
|
||||
### Logs
|
||||
|
||||
View logs for debugging:
|
||||
```bash
|
||||
# All services
|
||||
docker compose -f docker-compose.prod.yml logs -f
|
||||
|
||||
# Specific service
|
||||
docker compose -f docker-compose.prod.yml logs -f n8n-mcp
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Database Issues
|
||||
|
||||
If the database is corrupted or needs rebuilding:
|
||||
```bash
|
||||
# Stop services
|
||||
docker compose -f docker-compose.prod.yml stop
|
||||
|
||||
# Remove database
|
||||
docker compose -f docker-compose.prod.yml exec n8n-mcp rm /app/data/nodes.db
|
||||
|
||||
# Start services (database will rebuild)
|
||||
docker compose -f docker-compose.prod.yml start
|
||||
```
|
||||
|
||||
### Memory Issues
|
||||
|
||||
If services run out of memory, increase Docker memory limits:
|
||||
```yaml
|
||||
# In docker-compose.prod.yml
|
||||
services:
|
||||
n8n-mcp:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
```
|
||||
|
||||
### Connection Issues
|
||||
|
||||
If n8n can't connect to MCP:
|
||||
1. Check both services are running: `docker compose -f docker-compose.prod.yml ps`
|
||||
2. Verify network connectivity: `docker compose -f docker-compose.prod.yml exec n8n ping n8n-mcp`
|
||||
3. Check MCP logs: `docker compose -f docker-compose.prod.yml logs n8n-mcp`
|
||||
|
||||
## Scaling
|
||||
|
||||
For high-availability deployments:
|
||||
|
||||
1. **Database Replication**: Use external SQLite replication or migrate to PostgreSQL
|
||||
2. **Load Balancing**: Deploy multiple MCP instances behind a load balancer
|
||||
3. **Caching**: Implement Redis caching for frequently accessed nodes
|
||||
|
||||
## Updates
|
||||
|
||||
To update to the latest version:
|
||||
|
||||
```bash
|
||||
# Pull latest code
|
||||
git pull
|
||||
|
||||
# Rebuild and restart
|
||||
./scripts/manage-production.sh update
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
For issues and questions:
|
||||
- GitHub Issues: [your-repo-url]/issues
|
||||
- Documentation: [your-docs-url]
|
||||
310
package-lock.json
generated
310
package-lock.json
generated
@@ -10,6 +10,8 @@
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@modelcontextprotocol/sdk": "^1.12.1",
|
||||
"@types/better-sqlite3": "^7.6.13",
|
||||
"better-sqlite3": "^11.10.0",
|
||||
"dotenv": "^16.5.0",
|
||||
"express": "^5.1.0",
|
||||
"n8n-core": "^1.14.1",
|
||||
@@ -4000,6 +4002,15 @@
|
||||
"@babel/types": "^7.20.7"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/better-sqlite3": {
|
||||
"version": "7.6.13",
|
||||
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz",
|
||||
"integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/body-parser": {
|
||||
"version": "1.19.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
|
||||
@@ -4894,6 +4905,17 @@
|
||||
"tweetnacl": "^0.14.3"
|
||||
}
|
||||
},
|
||||
"node_modules/better-sqlite3": {
|
||||
"version": "11.10.0",
|
||||
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz",
|
||||
"integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"bindings": "^1.5.0",
|
||||
"prebuild-install": "^7.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/big-integer": {
|
||||
"version": "1.6.52",
|
||||
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
|
||||
@@ -4932,6 +4954,15 @@
|
||||
"integrity": "sha512-rA2CrUl1+6yKrn+XgLs8Hdy18OER1UW146nM+ixzhQXDY+Bd3ySkyIJGwF2a4I45JwbvF1mDL/nWkqBwpOcdBA==",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/bindings": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
|
||||
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"file-uri-to-path": "1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bl": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-6.1.0.tgz",
|
||||
@@ -5155,7 +5186,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"base64-js": "^1.3.1",
|
||||
"ieee754": "^1.1.13"
|
||||
@@ -5437,6 +5467,12 @@
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/chownr": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
|
||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/ci-info": {
|
||||
"version": "3.9.0",
|
||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
|
||||
@@ -5890,6 +5926,21 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/decompress-response": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
|
||||
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mimic-response": "^3.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/dedent": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
|
||||
@@ -5933,6 +5984,15 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/deep-extend": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
|
||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/deepmerge": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
|
||||
@@ -6014,6 +6074,15 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/detect-libc": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
|
||||
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/detect-newline": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
|
||||
@@ -6257,7 +6326,6 @@
|
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
||||
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
@@ -6602,6 +6670,15 @@
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/expand-template": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
|
||||
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
|
||||
"license": "(MIT OR WTFPL)",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/expand-tilde": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
|
||||
@@ -6821,6 +6898,12 @@
|
||||
"url": "https://github.com/sindresorhus/file-type?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/file-uri-to-path": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
||||
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/filelist": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
|
||||
@@ -7037,6 +7120,12 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-constants": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -7270,6 +7359,12 @@
|
||||
"node": ">8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/github-from-package": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/glob": {
|
||||
"version": "7.2.3",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||
@@ -7964,6 +8059,12 @@
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/ini": {
|
||||
"version": "1.3.8",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/internal-slot": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
|
||||
@@ -9953,6 +10054,18 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/mimic-response": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
|
||||
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/minifaker": {
|
||||
"version": "1.34.1",
|
||||
"resolved": "https://registry.npmjs.org/minifaker/-/minifaker-1.34.1.tgz",
|
||||
@@ -9997,7 +10110,6 @@
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
@@ -10025,6 +10137,12 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/mkdirp-classic": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
||||
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/moment": {
|
||||
"version": "2.30.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
|
||||
@@ -10625,6 +10743,12 @@
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/napi-build-utils": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
|
||||
"integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/native-duplexpair": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz",
|
||||
@@ -10659,6 +10783,30 @@
|
||||
"tslib": "^2.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/node-abi": {
|
||||
"version": "3.75.0",
|
||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz",
|
||||
"integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"semver": "^7.3.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/node-abi/node_modules/semver": {
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/node-abort-controller": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
|
||||
@@ -11712,6 +11860,32 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/prebuild-install": {
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
|
||||
"integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"detect-libc": "^2.0.0",
|
||||
"expand-template": "^2.0.3",
|
||||
"github-from-package": "0.0.0",
|
||||
"minimist": "^1.2.3",
|
||||
"mkdirp-classic": "^0.5.3",
|
||||
"napi-build-utils": "^2.0.0",
|
||||
"node-abi": "^3.3.0",
|
||||
"pump": "^3.0.0",
|
||||
"rc": "^1.2.7",
|
||||
"simple-get": "^4.0.0",
|
||||
"tar-fs": "^2.0.0",
|
||||
"tunnel-agent": "^0.6.0"
|
||||
},
|
||||
"bin": {
|
||||
"prebuild-install": "bin.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/pretty-bytes": {
|
||||
"version": "5.6.0",
|
||||
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
|
||||
@@ -11875,6 +12049,16 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/pump": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
|
||||
"integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"end-of-stream": "^1.1.0",
|
||||
"once": "^1.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/punycode": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
||||
@@ -12012,6 +12196,30 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/rc": {
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
||||
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
|
||||
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
|
||||
"dependencies": {
|
||||
"deep-extend": "^0.6.0",
|
||||
"ini": "~1.3.0",
|
||||
"minimist": "^1.2.0",
|
||||
"strip-json-comments": "~2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
"rc": "cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/rc/node_modules/strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-is": {
|
||||
"version": "18.3.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
|
||||
@@ -12800,6 +13008,51 @@
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/simple-concat": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
|
||||
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/simple-get": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
|
||||
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"decompress-response": "^6.0.0",
|
||||
"once": "^1.3.1",
|
||||
"simple-concat": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/simple-git": {
|
||||
"version": "3.28.0",
|
||||
"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz",
|
||||
@@ -13465,6 +13718,45 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-fs": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
|
||||
"integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chownr": "^1.1.1",
|
||||
"mkdirp-classic": "^0.5.2",
|
||||
"pump": "^3.0.0",
|
||||
"tar-stream": "^2.1.4"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"bl": "^4.0.3",
|
||||
"end-of-stream": "^1.4.1",
|
||||
"fs-constants": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^3.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream/node_modules/bl": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
||||
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"buffer": "^5.5.0",
|
||||
"inherits": "^2.0.4",
|
||||
"readable-stream": "^3.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tarn": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
|
||||
@@ -13922,6 +14214,18 @@
|
||||
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
|
||||
}
|
||||
},
|
||||
"node_modules/tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/tweetnacl": {
|
||||
"version": "0.14.5",
|
||||
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
"start": "node dist/index.js",
|
||||
"test": "jest",
|
||||
"lint": "tsc --noEmit",
|
||||
"typecheck": "tsc --noEmit"
|
||||
"typecheck": "tsc --noEmit",
|
||||
"db:rebuild": "node dist/scripts/rebuild-database.js",
|
||||
"db:init": "node -e \"new (require('./dist/services/sqlite-storage-service').SQLiteStorageService)(); console.log('Database initialized')\""
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -34,6 +36,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@modelcontextprotocol/sdk": "^1.12.1",
|
||||
"@types/better-sqlite3": "^7.6.13",
|
||||
"better-sqlite3": "^11.10.0",
|
||||
"dotenv": "^16.5.0",
|
||||
"express": "^5.1.0",
|
||||
"n8n-core": "^1.14.1",
|
||||
|
||||
66
quick-test.sh
Executable file
66
quick-test.sh
Executable file
@@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "🚀 Quick n8n-MCP Node Extraction Test"
|
||||
echo "===================================="
|
||||
echo ""
|
||||
|
||||
# Start services
|
||||
echo "1. Starting Docker services..."
|
||||
docker compose -f docker-compose.test.yml up -d
|
||||
|
||||
echo ""
|
||||
echo "2. Waiting for services to start (30 seconds)..."
|
||||
sleep 30
|
||||
|
||||
echo ""
|
||||
echo "3. Testing AI Agent node extraction..."
|
||||
docker compose -f docker-compose.test.yml run --rm n8n-mcp node -e "
|
||||
const { NodeSourceExtractor } = require('./dist/utils/node-source-extractor');
|
||||
|
||||
async function test() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
console.log('\\n🔍 Extracting AI Agent node...');
|
||||
try {
|
||||
const result = await extractor.extractNodeSource('@n8n/n8n-nodes-langchain.Agent');
|
||||
console.log('✅ SUCCESS!');
|
||||
console.log('📦 Node Type:', result.nodeType);
|
||||
console.log('📏 Code Size:', result.sourceCode.length, 'bytes');
|
||||
console.log('📍 Location:', result.location);
|
||||
console.log('\\n📄 First 200 characters of code:');
|
||||
console.log(result.sourceCode.substring(0, 200) + '...');
|
||||
} catch (error) {
|
||||
console.log('❌ FAILED:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
test();
|
||||
"
|
||||
|
||||
echo ""
|
||||
echo "4. Listing available AI nodes..."
|
||||
docker compose -f docker-compose.test.yml run --rm n8n-mcp node -e "
|
||||
const { NodeSourceExtractor } = require('./dist/utils/node-source-extractor');
|
||||
|
||||
async function test() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
console.log('\\n📋 Listing AI/LangChain nodes...');
|
||||
const nodes = await extractor.listAvailableNodes();
|
||||
const aiNodes = nodes.filter(n => n.location && n.location.includes('langchain'));
|
||||
|
||||
console.log('Found', aiNodes.length, 'AI nodes:');
|
||||
aiNodes.slice(0, 10).forEach(node => {
|
||||
console.log(' -', node.name);
|
||||
});
|
||||
}
|
||||
|
||||
test();
|
||||
"
|
||||
|
||||
echo ""
|
||||
echo "5. Cleaning up..."
|
||||
docker compose -f docker-compose.test.yml down -v
|
||||
|
||||
echo ""
|
||||
echo "✅ Test complete!"
|
||||
140
scripts/deploy-production.sh
Executable file
140
scripts/deploy-production.sh
Executable file
@@ -0,0 +1,140 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Production deployment script for n8n-MCP
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 n8n-MCP Production Deployment Script"
|
||||
echo "======================================"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Function to check if command exists
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to generate secure password
|
||||
generate_password() {
|
||||
openssl rand -base64 32 | tr -d "=+/" | cut -c1-25
|
||||
}
|
||||
|
||||
# Check prerequisites
|
||||
echo -e "\n${YELLOW}Checking prerequisites...${NC}"
|
||||
|
||||
if ! command_exists docker; then
|
||||
echo -e "${RED}❌ Docker is not installed. Please install Docker first.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command_exists docker compose; then
|
||||
echo -e "${RED}❌ Docker Compose v2 is not installed. Please install Docker Compose v2.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command_exists node; then
|
||||
echo -e "${RED}❌ Node.js is not installed. Please install Node.js first.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✅ All prerequisites met${NC}"
|
||||
|
||||
# Check for .env file
|
||||
if [ ! -f .env ]; then
|
||||
echo -e "\n${YELLOW}Creating .env file...${NC}"
|
||||
|
||||
# Generate secure passwords
|
||||
N8N_BASIC_AUTH_PASSWORD=$(generate_password)
|
||||
N8N_API_KEY=$(generate_password)
|
||||
|
||||
cat > .env << EOF
|
||||
# n8n Configuration
|
||||
N8N_BASIC_AUTH_USER=admin
|
||||
N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
|
||||
N8N_HOST=localhost
|
||||
N8N_API_KEY=${N8N_API_KEY}
|
||||
|
||||
# MCP Configuration
|
||||
MCP_LOG_LEVEL=info
|
||||
NODE_ENV=production
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN}✅ Created .env file with secure defaults${NC}"
|
||||
echo -e "${YELLOW}⚠️ Please note your credentials:${NC}"
|
||||
echo -e " n8n Username: admin"
|
||||
echo -e " n8n Password: ${N8N_BASIC_AUTH_PASSWORD}"
|
||||
echo -e " API Key: ${N8N_API_KEY}"
|
||||
echo -e "${YELLOW} Save these credentials securely!${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ Using existing .env file${NC}"
|
||||
fi
|
||||
|
||||
# Build the project
|
||||
echo -e "\n${YELLOW}Building the project...${NC}"
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}❌ Build failed. Please fix the errors and try again.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✅ Build completed successfully${NC}"
|
||||
|
||||
# Build Docker image
|
||||
echo -e "\n${YELLOW}Building Docker image...${NC}"
|
||||
docker compose -f docker-compose.prod.yml build
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}❌ Docker build failed. Please check the logs.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✅ Docker image built successfully${NC}"
|
||||
|
||||
# Start services
|
||||
echo -e "\n${YELLOW}Starting services...${NC}"
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}❌ Failed to start services. Please check the logs.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✅ Services started successfully${NC}"
|
||||
|
||||
# Wait for services to be healthy
|
||||
echo -e "\n${YELLOW}Waiting for services to be healthy...${NC}"
|
||||
sleep 10
|
||||
|
||||
# Check service health
|
||||
N8N_HEALTH=$(docker compose -f docker-compose.prod.yml ps n8n --format json | jq -r '.[0].Health // "unknown"')
|
||||
MCP_HEALTH=$(docker compose -f docker-compose.prod.yml ps n8n-mcp --format json | jq -r '.[0].Health // "unknown"')
|
||||
|
||||
if [ "$N8N_HEALTH" = "healthy" ] && [ "$MCP_HEALTH" = "healthy" ]; then
|
||||
echo -e "${GREEN}✅ All services are healthy${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ Services might still be starting up...${NC}"
|
||||
echo -e " n8n status: $N8N_HEALTH"
|
||||
echo -e " MCP server status: $MCP_HEALTH"
|
||||
fi
|
||||
|
||||
# Display access information
|
||||
echo -e "\n${GREEN}🎉 Deployment completed successfully!${NC}"
|
||||
echo -e "\n${YELLOW}Access Information:${NC}"
|
||||
echo -e " n8n UI: http://localhost:5678"
|
||||
echo -e " MCP Server: Running internally (accessible by n8n)"
|
||||
echo -e "\n${YELLOW}Next Steps:${NC}"
|
||||
echo -e " 1. Access n8n at http://localhost:5678"
|
||||
echo -e " 2. Log in with the credentials from .env file"
|
||||
echo -e " 3. Create a new workflow and add the MCP node"
|
||||
echo -e " 4. Configure the MCP node to connect to the internal server"
|
||||
echo -e "\n${YELLOW}Useful Commands:${NC}"
|
||||
echo -e " View logs: docker compose -f docker-compose.prod.yml logs -f"
|
||||
echo -e " Stop services: docker compose -f docker-compose.prod.yml down"
|
||||
echo -e " Rebuild database: docker compose -f docker-compose.prod.yml exec n8n-mcp node dist/scripts/rebuild-database.js"
|
||||
echo -e " View database stats: docker compose -f docker-compose.prod.yml exec n8n-mcp sqlite3 /app/data/nodes.db 'SELECT COUNT(*) as total_nodes FROM nodes;'"
|
||||
178
scripts/manage-production.sh
Executable file
178
scripts/manage-production.sh
Executable file
@@ -0,0 +1,178 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Production management script for n8n-MCP
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Display usage
|
||||
usage() {
|
||||
echo -e "${BLUE}n8n-MCP Production Management Script${NC}"
|
||||
echo -e "${YELLOW}Usage:${NC} $0 [command]"
|
||||
echo
|
||||
echo -e "${YELLOW}Commands:${NC}"
|
||||
echo " status - Show service status"
|
||||
echo " logs - View service logs"
|
||||
echo " start - Start all services"
|
||||
echo " stop - Stop all services"
|
||||
echo " restart - Restart all services"
|
||||
echo " rebuild-db - Rebuild the node database"
|
||||
echo " db-stats - Show database statistics"
|
||||
echo " backup - Backup data volumes"
|
||||
echo " restore - Restore data volumes from backup"
|
||||
echo " update - Update services to latest versions"
|
||||
echo " shell - Open shell in MCP container"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Check if docker compose file exists
|
||||
if [ ! -f "docker-compose.prod.yml" ]; then
|
||||
echo -e "${RED}❌ docker-compose.prod.yml not found. Run this script from the project root.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Main command handling
|
||||
case "$1" in
|
||||
status)
|
||||
echo -e "${YELLOW}Service Status:${NC}"
|
||||
docker compose -f docker-compose.prod.yml ps
|
||||
;;
|
||||
|
||||
logs)
|
||||
if [ -z "$2" ]; then
|
||||
docker compose -f docker-compose.prod.yml logs -f --tail=100
|
||||
else
|
||||
docker compose -f docker-compose.prod.yml logs -f --tail=100 "$2"
|
||||
fi
|
||||
;;
|
||||
|
||||
start)
|
||||
echo -e "${YELLOW}Starting services...${NC}"
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
echo -e "${GREEN}✅ Services started${NC}"
|
||||
;;
|
||||
|
||||
stop)
|
||||
echo -e "${YELLOW}Stopping services...${NC}"
|
||||
docker compose -f docker-compose.prod.yml down
|
||||
echo -e "${GREEN}✅ Services stopped${NC}"
|
||||
;;
|
||||
|
||||
restart)
|
||||
echo -e "${YELLOW}Restarting services...${NC}"
|
||||
docker compose -f docker-compose.prod.yml restart
|
||||
echo -e "${GREEN}✅ Services restarted${NC}"
|
||||
;;
|
||||
|
||||
rebuild-db)
|
||||
echo -e "${YELLOW}Rebuilding node database...${NC}"
|
||||
docker compose -f docker-compose.prod.yml exec n8n-mcp node dist/scripts/rebuild-database.js
|
||||
;;
|
||||
|
||||
db-stats)
|
||||
echo -e "${YELLOW}Database Statistics:${NC}"
|
||||
docker compose -f docker-compose.prod.yml exec n8n-mcp sqlite3 /app/data/nodes.db << 'EOF'
|
||||
.headers on
|
||||
.mode column
|
||||
SELECT
|
||||
COUNT(*) as total_nodes,
|
||||
COUNT(DISTINCT package_name) as total_packages,
|
||||
ROUND(SUM(code_length) / 1024.0 / 1024.0, 2) as total_size_mb,
|
||||
ROUND(AVG(code_length) / 1024.0, 2) as avg_size_kb
|
||||
FROM nodes;
|
||||
|
||||
.print
|
||||
.print "Top 10 packages by node count:"
|
||||
SELECT package_name, COUNT(*) as node_count
|
||||
FROM nodes
|
||||
GROUP BY package_name
|
||||
ORDER BY node_count DESC
|
||||
LIMIT 10;
|
||||
EOF
|
||||
;;
|
||||
|
||||
backup)
|
||||
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
|
||||
echo -e "${YELLOW}Creating backup in ${BACKUP_DIR}...${NC}"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# Stop services for consistent backup
|
||||
docker compose -f docker-compose.prod.yml stop
|
||||
|
||||
# Backup volumes
|
||||
docker run --rm -v n8n-mcp_n8n-data:/source -v $(pwd)/$BACKUP_DIR:/backup alpine tar czf /backup/n8n-data.tar.gz -C /source .
|
||||
docker run --rm -v n8n-mcp_mcp-data:/source -v $(pwd)/$BACKUP_DIR:/backup alpine tar czf /backup/mcp-data.tar.gz -C /source .
|
||||
|
||||
# Copy .env file
|
||||
cp .env "$BACKUP_DIR/"
|
||||
|
||||
# Restart services
|
||||
docker compose -f docker-compose.prod.yml start
|
||||
|
||||
echo -e "${GREEN}✅ Backup completed in ${BACKUP_DIR}${NC}"
|
||||
;;
|
||||
|
||||
restore)
|
||||
if [ -z "$2" ]; then
|
||||
echo -e "${RED}❌ Please specify backup directory (e.g., backups/20240107_120000)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$2" ]; then
|
||||
echo -e "${RED}❌ Backup directory $2 not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}⚠️ This will replace all current data! Continue? (y/N)${NC}"
|
||||
read -r confirm
|
||||
if [ "$confirm" != "y" ]; then
|
||||
echo "Restore cancelled"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}Restoring from $2...${NC}"
|
||||
|
||||
# Stop services
|
||||
docker compose -f docker-compose.prod.yml down
|
||||
|
||||
# Restore volumes
|
||||
docker run --rm -v n8n-mcp_n8n-data:/target -v $(pwd)/$2:/backup alpine tar xzf /backup/n8n-data.tar.gz -C /target
|
||||
docker run --rm -v n8n-mcp_mcp-data:/target -v $(pwd)/$2:/backup alpine tar xzf /backup/mcp-data.tar.gz -C /target
|
||||
|
||||
# Start services
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
|
||||
echo -e "${GREEN}✅ Restore completed${NC}"
|
||||
;;
|
||||
|
||||
update)
|
||||
echo -e "${YELLOW}Updating services...${NC}"
|
||||
|
||||
# Pull latest images
|
||||
docker compose -f docker-compose.prod.yml pull
|
||||
|
||||
# Rebuild MCP image
|
||||
docker compose -f docker-compose.prod.yml build
|
||||
|
||||
# Restart with new images
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
|
||||
echo -e "${GREEN}✅ Services updated${NC}"
|
||||
;;
|
||||
|
||||
shell)
|
||||
echo -e "${YELLOW}Opening shell in MCP container...${NC}"
|
||||
docker compose -f docker-compose.prod.yml exec n8n-mcp /bin/sh
|
||||
;;
|
||||
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
@@ -23,11 +23,11 @@ npm run build
|
||||
|
||||
echo
|
||||
echo "2. Building Docker image..."
|
||||
docker-compose -f docker-compose.test.yml build
|
||||
docker compose -f docker-compose.test.yml build
|
||||
|
||||
echo
|
||||
echo "3. Starting test environment..."
|
||||
docker-compose -f docker-compose.test.yml up -d
|
||||
docker compose -f docker-compose.test.yml up -d
|
||||
|
||||
echo
|
||||
echo "4. Waiting for services to be ready..."
|
||||
@@ -36,7 +36,7 @@ sleep 10
|
||||
# Wait for n8n to be healthy
|
||||
echo " Waiting for n8n to be ready..."
|
||||
for i in {1..30}; do
|
||||
if docker-compose -f docker-compose.test.yml exec n8n wget --spider -q http://localhost:5678/healthz 2>/dev/null; then
|
||||
if docker compose -f docker-compose.test.yml exec n8n wget --spider -q http://localhost:5678/healthz 2>/dev/null; then
|
||||
echo -e " ${GREEN}✓ n8n is ready${NC}"
|
||||
break
|
||||
fi
|
||||
@@ -48,7 +48,7 @@ echo
|
||||
echo "5. Running MCP client test..."
|
||||
|
||||
# Create a simple test using the MCP server directly
|
||||
docker-compose -f docker-compose.test.yml exec n8n-mcp node -e "
|
||||
docker compose -f docker-compose.test.yml exec n8n-mcp node -e "
|
||||
const http = require('http');
|
||||
|
||||
// Test data
|
||||
@@ -107,12 +107,12 @@ if (!found) {
|
||||
|
||||
echo
|
||||
echo "6. Alternative test - Direct file system check..."
|
||||
docker-compose -f docker-compose.test.yml exec n8n find /usr/local/lib/node_modules -name "*Agent*.node.js" -type f 2>/dev/null | head -10 || true
|
||||
docker compose -f docker-compose.test.yml exec n8n find /usr/local/lib/node_modules -name "*Agent*.node.js" -type f 2>/dev/null | head -10 || true
|
||||
|
||||
echo
|
||||
echo "7. Test using curl to n8n API..."
|
||||
# Get available node types from n8n
|
||||
NODE_TYPES=$(docker-compose -f docker-compose.test.yml exec n8n curl -s http://localhost:5678/api/v1/node-types | jq -r '.data[].name' | grep -i agent | head -5) || true
|
||||
NODE_TYPES=$(docker compose -f docker-compose.test.yml exec n8n curl -s http://localhost:5678/api/v1/node-types | jq -r '.data[].name' | grep -i agent | head -5) || true
|
||||
|
||||
if [ -n "$NODE_TYPES" ]; then
|
||||
echo -e "${GREEN}✓ Found Agent nodes in n8n:${NC}"
|
||||
@@ -126,7 +126,7 @@ echo "8. Cleanup..."
|
||||
read -p "Stop test environment? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
docker-compose -f docker-compose.test.yml down
|
||||
docker compose -f docker-compose.test.yml down
|
||||
echo -e "${GREEN}✓ Test environment stopped${NC}"
|
||||
fi
|
||||
|
||||
|
||||
63
src/db/schema.sql
Normal file
63
src/db/schema.sql
Normal file
@@ -0,0 +1,63 @@
|
||||
-- Main nodes table
|
||||
CREATE TABLE IF NOT EXISTS nodes (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
node_type TEXT UNIQUE NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
package_name TEXT NOT NULL,
|
||||
display_name TEXT,
|
||||
description TEXT,
|
||||
code_hash TEXT NOT NULL,
|
||||
code_length INTEGER NOT NULL,
|
||||
source_location TEXT NOT NULL,
|
||||
source_code TEXT NOT NULL,
|
||||
credential_code TEXT,
|
||||
package_info TEXT, -- JSON
|
||||
has_credentials INTEGER DEFAULT 0,
|
||||
extracted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Indexes for performance
|
||||
CREATE INDEX IF NOT EXISTS idx_nodes_package_name ON nodes(package_name);
|
||||
CREATE INDEX IF NOT EXISTS idx_nodes_code_hash ON nodes(code_hash);
|
||||
CREATE INDEX IF NOT EXISTS idx_nodes_name ON nodes(name);
|
||||
|
||||
-- Full Text Search virtual table for node search
|
||||
CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
|
||||
node_type,
|
||||
name,
|
||||
display_name,
|
||||
description,
|
||||
package_name,
|
||||
content=nodes,
|
||||
content_rowid=id
|
||||
);
|
||||
|
||||
-- Triggers to keep FTS in sync
|
||||
CREATE TRIGGER IF NOT EXISTS nodes_ai AFTER INSERT ON nodes
|
||||
BEGIN
|
||||
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
|
||||
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS nodes_ad AFTER DELETE ON nodes
|
||||
BEGIN
|
||||
DELETE FROM nodes_fts WHERE rowid = old.id;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS nodes_au AFTER UPDATE ON nodes
|
||||
BEGIN
|
||||
DELETE FROM nodes_fts WHERE rowid = old.id;
|
||||
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
|
||||
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
|
||||
END;
|
||||
|
||||
-- Statistics table for metadata
|
||||
CREATE TABLE IF NOT EXISTS extraction_stats (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
total_nodes INTEGER NOT NULL,
|
||||
total_packages INTEGER NOT NULL,
|
||||
total_code_size INTEGER NOT NULL,
|
||||
nodes_with_credentials INTEGER NOT NULL,
|
||||
extraction_date DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
@@ -16,15 +16,18 @@ import { N8NApiClient } from '../utils/n8n-client';
|
||||
import { N8NMCPBridge } from '../utils/bridge';
|
||||
import { logger } from '../utils/logger';
|
||||
import { NodeSourceExtractor } from '../utils/node-source-extractor';
|
||||
import { SQLiteStorageService } from '../services/sqlite-storage-service';
|
||||
|
||||
export class N8NMCPServer {
|
||||
private server: Server;
|
||||
private n8nClient: N8NApiClient;
|
||||
private nodeExtractor: NodeSourceExtractor;
|
||||
private nodeStorage: SQLiteStorageService;
|
||||
|
||||
constructor(config: MCPServerConfig, n8nConfig: N8NConfig) {
|
||||
this.n8nClient = new N8NApiClient(n8nConfig);
|
||||
this.nodeExtractor = new NodeSourceExtractor();
|
||||
this.nodeStorage = new SQLiteStorageService();
|
||||
logger.info('Initializing n8n MCP server', { config, n8nConfig });
|
||||
this.server = new Server(
|
||||
{
|
||||
@@ -161,6 +164,12 @@ export class N8NMCPServer {
|
||||
return this.getNodeSourceCode(args);
|
||||
case 'list_available_nodes':
|
||||
return this.listAvailableNodes(args);
|
||||
case 'extract_all_nodes':
|
||||
return this.extractAllNodes(args);
|
||||
case 'search_nodes':
|
||||
return this.searchNodes(args);
|
||||
case 'get_node_statistics':
|
||||
return this.getNodeStatistics(args);
|
||||
default:
|
||||
throw new Error(`Unknown tool: ${name}`);
|
||||
}
|
||||
@@ -314,6 +323,107 @@ export class N8NMCPServer {
|
||||
}
|
||||
}
|
||||
|
||||
private async extractAllNodes(args: any): Promise<any> {
|
||||
try {
|
||||
logger.info(`Extracting all nodes`, args);
|
||||
|
||||
// Get list of all nodes
|
||||
const allNodes = await this.nodeExtractor.listAvailableNodes();
|
||||
let nodesToExtract = allNodes;
|
||||
|
||||
// Apply filters
|
||||
if (args.packageFilter) {
|
||||
nodesToExtract = nodesToExtract.filter(node =>
|
||||
node.packageName === args.packageFilter ||
|
||||
node.location?.includes(args.packageFilter)
|
||||
);
|
||||
}
|
||||
|
||||
if (args.limit) {
|
||||
nodesToExtract = nodesToExtract.slice(0, args.limit);
|
||||
}
|
||||
|
||||
logger.info(`Extracting ${nodesToExtract.length} nodes...`);
|
||||
|
||||
const extractedNodes = [];
|
||||
const errors = [];
|
||||
|
||||
for (const node of nodesToExtract) {
|
||||
try {
|
||||
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
|
||||
const nodeInfo = await this.nodeExtractor.extractNodeSource(nodeType);
|
||||
await this.nodeStorage.storeNode(nodeInfo);
|
||||
extractedNodes.push(nodeType);
|
||||
} catch (error) {
|
||||
errors.push({
|
||||
node: node.name,
|
||||
error: error instanceof Error ? error.message : 'Unknown error'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const stats = await this.nodeStorage.getStatistics();
|
||||
|
||||
return {
|
||||
success: true,
|
||||
extracted: extractedNodes.length,
|
||||
failed: errors.length,
|
||||
totalStored: stats.totalNodes,
|
||||
errors: errors.slice(0, 10), // Limit error list
|
||||
statistics: stats
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error(`Failed to extract all nodes`, error);
|
||||
throw new Error(`Failed to extract all nodes: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
|
||||
private async searchNodes(args: any): Promise<any> {
|
||||
try {
|
||||
logger.info(`Searching nodes`, args);
|
||||
|
||||
const results = await this.nodeStorage.searchNodes({
|
||||
query: args.query,
|
||||
packageName: args.packageName,
|
||||
hasCredentials: args.hasCredentials,
|
||||
limit: args.limit || 20
|
||||
});
|
||||
|
||||
return {
|
||||
nodes: results.map(node => ({
|
||||
nodeType: node.nodeType,
|
||||
name: node.name,
|
||||
packageName: node.packageName,
|
||||
displayName: node.displayName,
|
||||
description: node.description,
|
||||
codeLength: node.codeLength,
|
||||
hasCredentials: node.hasCredentials,
|
||||
location: node.sourceLocation
|
||||
})),
|
||||
total: results.length
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error(`Failed to search nodes`, error);
|
||||
throw new Error(`Failed to search nodes: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
|
||||
private async getNodeStatistics(args: any): Promise<any> {
|
||||
try {
|
||||
logger.info(`Getting node statistics`);
|
||||
const stats = await this.nodeStorage.getStatistics();
|
||||
|
||||
return {
|
||||
...stats,
|
||||
formattedTotalSize: `${(stats.totalCodeSize / 1024 / 1024).toFixed(2)} MB`,
|
||||
formattedAverageSize: `${(stats.averageNodeSize / 1024).toFixed(2)} KB`
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error(`Failed to get node statistics`, error);
|
||||
throw new Error(`Failed to get node statistics: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
|
||||
async start(): Promise<void> {
|
||||
try {
|
||||
logger.info('Starting n8n MCP server...');
|
||||
|
||||
@@ -181,4 +181,55 @@ export const n8nTools: ToolDefinition[] = [
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'extract_all_nodes',
|
||||
description: 'Extract and store all available n8n nodes in the database',
|
||||
inputSchema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
packageFilter: {
|
||||
type: 'string',
|
||||
description: 'Optional package name to filter extraction',
|
||||
},
|
||||
limit: {
|
||||
type: 'number',
|
||||
description: 'Maximum number of nodes to extract',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'search_nodes',
|
||||
description: 'Search for n8n nodes by name, package, or functionality',
|
||||
inputSchema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
query: {
|
||||
type: 'string',
|
||||
description: 'Search query',
|
||||
},
|
||||
packageName: {
|
||||
type: 'string',
|
||||
description: 'Filter by package name',
|
||||
},
|
||||
hasCredentials: {
|
||||
type: 'boolean',
|
||||
description: 'Filter nodes that have credentials',
|
||||
},
|
||||
limit: {
|
||||
type: 'number',
|
||||
description: 'Maximum results to return',
|
||||
default: 20,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'get_node_statistics',
|
||||
description: 'Get statistics about stored n8n nodes',
|
||||
inputSchema: {
|
||||
type: 'object',
|
||||
properties: {},
|
||||
},
|
||||
},
|
||||
];
|
||||
129
src/scripts/rebuild-database.ts
Normal file
129
src/scripts/rebuild-database.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { NodeSourceExtractor } from '../utils/node-source-extractor';
|
||||
import { SQLiteStorageService } from '../services/sqlite-storage-service';
|
||||
import { logger } from '../utils/logger';
|
||||
import * as path from 'path';
|
||||
|
||||
/**
|
||||
* Rebuild the entire nodes database by extracting all available nodes
|
||||
*/
|
||||
async function rebuildDatabase() {
|
||||
console.log('🔄 Starting database rebuild...\n');
|
||||
|
||||
const startTime = Date.now();
|
||||
const extractor = new NodeSourceExtractor();
|
||||
const storage = new SQLiteStorageService();
|
||||
|
||||
try {
|
||||
// Step 1: Clear existing database
|
||||
console.log('1️⃣ Clearing existing database...');
|
||||
await storage.rebuildDatabase();
|
||||
|
||||
// Step 2: Get all available nodes
|
||||
console.log('2️⃣ Discovering available nodes...');
|
||||
const allNodes = await extractor.listAvailableNodes();
|
||||
console.log(` Found ${allNodes.length} nodes\n`);
|
||||
|
||||
// Step 3: Extract and store each node
|
||||
console.log('3️⃣ Extracting and storing nodes...');
|
||||
let processed = 0;
|
||||
let stored = 0;
|
||||
let failed = 0;
|
||||
const errors: Array<{ node: string; error: string }> = [];
|
||||
|
||||
// Process in batches for better performance
|
||||
const batchSize = 50;
|
||||
for (let i = 0; i < allNodes.length; i += batchSize) {
|
||||
const batch = allNodes.slice(i, Math.min(i + batchSize, allNodes.length));
|
||||
const nodeInfos = [];
|
||||
|
||||
for (const node of batch) {
|
||||
processed++;
|
||||
|
||||
try {
|
||||
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
|
||||
|
||||
// Show progress
|
||||
if (processed % 100 === 0) {
|
||||
const progress = ((processed / allNodes.length) * 100).toFixed(1);
|
||||
console.log(` Progress: ${processed}/${allNodes.length} (${progress}%)`);
|
||||
}
|
||||
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeType);
|
||||
nodeInfos.push(nodeInfo);
|
||||
stored++;
|
||||
} catch (error) {
|
||||
failed++;
|
||||
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
||||
errors.push({
|
||||
node: node.name,
|
||||
error: errorMsg
|
||||
});
|
||||
|
||||
// Log first few errors
|
||||
if (errors.length <= 5) {
|
||||
logger.debug(`Failed to extract ${node.name}: ${errorMsg}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Bulk store the batch
|
||||
if (nodeInfos.length > 0) {
|
||||
await storage.bulkStoreNodes(nodeInfos);
|
||||
}
|
||||
}
|
||||
|
||||
// Step 4: Save statistics
|
||||
console.log('\n4️⃣ Saving statistics...');
|
||||
const stats = await storage.getStatistics();
|
||||
await storage.saveExtractionStats(stats);
|
||||
|
||||
// Step 5: Display results
|
||||
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
||||
|
||||
console.log('\n✅ Database rebuild completed!\n');
|
||||
console.log('📊 Results:');
|
||||
console.log(` Total nodes found: ${allNodes.length}`);
|
||||
console.log(` Successfully stored: ${stored}`);
|
||||
console.log(` Failed: ${failed}`);
|
||||
console.log(` Duration: ${duration}s`);
|
||||
console.log(` Database size: ${(stats.totalCodeSize / 1024 / 1024).toFixed(2)} MB`);
|
||||
|
||||
console.log('\n📦 Package distribution:');
|
||||
stats.packageDistribution.slice(0, 10).forEach(pkg => {
|
||||
console.log(` ${pkg.package}: ${pkg.count} nodes`);
|
||||
});
|
||||
|
||||
if (errors.length > 0) {
|
||||
console.log(`\n⚠️ First ${Math.min(5, errors.length)} errors:`);
|
||||
errors.slice(0, 5).forEach(err => {
|
||||
console.log(` - ${err.node}: ${err.error}`);
|
||||
});
|
||||
|
||||
if (errors.length > 5) {
|
||||
console.log(` ... and ${errors.length - 5} more errors`);
|
||||
}
|
||||
}
|
||||
|
||||
// Close database connection
|
||||
storage.close();
|
||||
|
||||
console.log('\n✨ Database is ready for use!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('\n❌ Database rebuild failed:', error);
|
||||
storage.close();
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Run if called directly
|
||||
if (require.main === module) {
|
||||
rebuildDatabase().catch(error => {
|
||||
console.error('Fatal error:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
export { rebuildDatabase };
|
||||
274
src/services/node-storage-service.ts
Normal file
274
src/services/node-storage-service.ts
Normal file
@@ -0,0 +1,274 @@
|
||||
import { NodeSourceInfo } from '../utils/node-source-extractor';
|
||||
import { logger } from '../utils/logger';
|
||||
import * as crypto from 'crypto';
|
||||
|
||||
export interface StoredNode {
|
||||
id: string;
|
||||
nodeType: string;
|
||||
name: string;
|
||||
packageName: string;
|
||||
displayName?: string;
|
||||
description?: string;
|
||||
codeHash: string;
|
||||
codeLength: number;
|
||||
sourceLocation: string;
|
||||
hasCredentials: boolean;
|
||||
extractedAt: Date;
|
||||
updatedAt: Date;
|
||||
sourceCode?: string;
|
||||
credentialCode?: string;
|
||||
packageInfo?: any;
|
||||
metadata?: Record<string, any>;
|
||||
}
|
||||
|
||||
export interface NodeSearchQuery {
|
||||
query?: string;
|
||||
packageName?: string;
|
||||
nodeType?: string;
|
||||
hasCredentials?: boolean;
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
}
|
||||
|
||||
export class NodeStorageService {
|
||||
private nodes: Map<string, StoredNode> = new Map();
|
||||
private nodesByPackage: Map<string, Set<string>> = new Map();
|
||||
private searchIndex: Map<string, Set<string>> = new Map();
|
||||
|
||||
/**
|
||||
* Store a node in the database
|
||||
*/
|
||||
async storeNode(nodeInfo: NodeSourceInfo): Promise<StoredNode> {
|
||||
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
|
||||
|
||||
// Parse display name and description from source if possible
|
||||
const displayName = this.extractDisplayName(nodeInfo.sourceCode);
|
||||
const description = this.extractDescription(nodeInfo.sourceCode);
|
||||
|
||||
const storedNode: StoredNode = {
|
||||
id: crypto.randomUUID(),
|
||||
nodeType: nodeInfo.nodeType,
|
||||
name: nodeInfo.nodeType.split('.').pop() || nodeInfo.nodeType,
|
||||
packageName: nodeInfo.nodeType.split('.')[0] || 'unknown',
|
||||
displayName,
|
||||
description,
|
||||
codeHash,
|
||||
codeLength: nodeInfo.sourceCode.length,
|
||||
sourceLocation: nodeInfo.location,
|
||||
hasCredentials: !!nodeInfo.credentialCode,
|
||||
extractedAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
sourceCode: nodeInfo.sourceCode,
|
||||
credentialCode: nodeInfo.credentialCode,
|
||||
packageInfo: nodeInfo.packageInfo,
|
||||
};
|
||||
|
||||
// Store in memory (replace with real DB)
|
||||
this.nodes.set(nodeInfo.nodeType, storedNode);
|
||||
|
||||
// Update package index
|
||||
if (!this.nodesByPackage.has(storedNode.packageName)) {
|
||||
this.nodesByPackage.set(storedNode.packageName, new Set());
|
||||
}
|
||||
this.nodesByPackage.get(storedNode.packageName)!.add(nodeInfo.nodeType);
|
||||
|
||||
// Update search index
|
||||
this.updateSearchIndex(storedNode);
|
||||
|
||||
logger.info(`Stored node: ${nodeInfo.nodeType} (${codeHash.substring(0, 8)}...)`);
|
||||
return storedNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for nodes
|
||||
*/
|
||||
async searchNodes(query: NodeSearchQuery): Promise<StoredNode[]> {
|
||||
let results: StoredNode[] = [];
|
||||
|
||||
if (query.query) {
|
||||
// Text search
|
||||
const searchTerms = query.query.toLowerCase().split(' ');
|
||||
const matchingNodeTypes = new Set<string>();
|
||||
|
||||
for (const term of searchTerms) {
|
||||
const matches = this.searchIndex.get(term) || new Set();
|
||||
matches.forEach(nodeType => matchingNodeTypes.add(nodeType));
|
||||
}
|
||||
|
||||
results = Array.from(matchingNodeTypes)
|
||||
.map(nodeType => this.nodes.get(nodeType)!)
|
||||
.filter(Boolean);
|
||||
} else {
|
||||
// Get all nodes
|
||||
results = Array.from(this.nodes.values());
|
||||
}
|
||||
|
||||
// Apply filters
|
||||
if (query.packageName) {
|
||||
results = results.filter(node => node.packageName === query.packageName);
|
||||
}
|
||||
|
||||
if (query.nodeType) {
|
||||
results = results.filter(node => node.nodeType.includes(query.nodeType!));
|
||||
}
|
||||
|
||||
if (query.hasCredentials !== undefined) {
|
||||
results = results.filter(node => node.hasCredentials === query.hasCredentials);
|
||||
}
|
||||
|
||||
// Apply pagination
|
||||
const offset = query.offset || 0;
|
||||
const limit = query.limit || 50;
|
||||
|
||||
return results.slice(offset, offset + limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get node by type
|
||||
*/
|
||||
async getNode(nodeType: string): Promise<StoredNode | null> {
|
||||
return this.nodes.get(nodeType) || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all packages
|
||||
*/
|
||||
async getPackages(): Promise<Array<{ name: string; nodeCount: number }>> {
|
||||
return Array.from(this.nodesByPackage.entries()).map(([name, nodes]) => ({
|
||||
name,
|
||||
nodeCount: nodes.size,
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Bulk store nodes
|
||||
*/
|
||||
async bulkStoreNodes(nodeInfos: NodeSourceInfo[]): Promise<{
|
||||
stored: number;
|
||||
failed: number;
|
||||
errors: Array<{ nodeType: string; error: string }>;
|
||||
}> {
|
||||
const results = {
|
||||
stored: 0,
|
||||
failed: 0,
|
||||
errors: [] as Array<{ nodeType: string; error: string }>,
|
||||
};
|
||||
|
||||
for (const nodeInfo of nodeInfos) {
|
||||
try {
|
||||
await this.storeNode(nodeInfo);
|
||||
results.stored++;
|
||||
} catch (error) {
|
||||
results.failed++;
|
||||
results.errors.push({
|
||||
nodeType: nodeInfo.nodeType,
|
||||
error: error instanceof Error ? error.message : 'Unknown error',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate statistics
|
||||
*/
|
||||
async getStatistics(): Promise<{
|
||||
totalNodes: number;
|
||||
totalPackages: number;
|
||||
totalCodeSize: number;
|
||||
nodesWithCredentials: number;
|
||||
averageNodeSize: number;
|
||||
packageDistribution: Array<{ package: string; count: number }>;
|
||||
}> {
|
||||
const nodes = Array.from(this.nodes.values());
|
||||
const totalCodeSize = nodes.reduce((sum, node) => sum + node.codeLength, 0);
|
||||
const nodesWithCredentials = nodes.filter(node => node.hasCredentials).length;
|
||||
|
||||
const packageDistribution = Array.from(this.nodesByPackage.entries())
|
||||
.map(([pkg, nodeSet]) => ({ package: pkg, count: nodeSet.size }))
|
||||
.sort((a, b) => b.count - a.count);
|
||||
|
||||
return {
|
||||
totalNodes: nodes.length,
|
||||
totalPackages: this.nodesByPackage.size,
|
||||
totalCodeSize,
|
||||
nodesWithCredentials,
|
||||
averageNodeSize: nodes.length > 0 ? Math.round(totalCodeSize / nodes.length) : 0,
|
||||
packageDistribution,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract display name from source code
|
||||
*/
|
||||
private extractDisplayName(sourceCode: string): string | undefined {
|
||||
const match = sourceCode.match(/displayName:\s*["'`]([^"'`]+)["'`]/);
|
||||
return match ? match[1] : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract description from source code
|
||||
*/
|
||||
private extractDescription(sourceCode: string): string | undefined {
|
||||
const match = sourceCode.match(/description:\s*["'`]([^"'`]+)["'`]/);
|
||||
return match ? match[1] : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update search index
|
||||
*/
|
||||
private updateSearchIndex(node: StoredNode): void {
|
||||
// Index by name parts
|
||||
const nameParts = node.name.toLowerCase().split(/(?=[A-Z])|[._-]/).filter(Boolean);
|
||||
for (const part of nameParts) {
|
||||
if (!this.searchIndex.has(part)) {
|
||||
this.searchIndex.set(part, new Set());
|
||||
}
|
||||
this.searchIndex.get(part)!.add(node.nodeType);
|
||||
}
|
||||
|
||||
// Index by display name
|
||||
if (node.displayName) {
|
||||
const displayParts = node.displayName.toLowerCase().split(/\s+/);
|
||||
for (const part of displayParts) {
|
||||
if (!this.searchIndex.has(part)) {
|
||||
this.searchIndex.set(part, new Set());
|
||||
}
|
||||
this.searchIndex.get(part)!.add(node.nodeType);
|
||||
}
|
||||
}
|
||||
|
||||
// Index by package name
|
||||
const pkgParts = node.packageName.toLowerCase().split(/[.-]/);
|
||||
for (const part of pkgParts) {
|
||||
if (!this.searchIndex.has(part)) {
|
||||
this.searchIndex.set(part, new Set());
|
||||
}
|
||||
this.searchIndex.get(part)!.add(node.nodeType);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Export all nodes for database import
|
||||
*/
|
||||
async exportForDatabase(): Promise<{
|
||||
nodes: StoredNode[];
|
||||
metadata: {
|
||||
exportedAt: Date;
|
||||
totalNodes: number;
|
||||
totalPackages: number;
|
||||
};
|
||||
}> {
|
||||
const nodes = Array.from(this.nodes.values());
|
||||
|
||||
return {
|
||||
nodes,
|
||||
metadata: {
|
||||
exportedAt: new Date(),
|
||||
totalNodes: nodes.length,
|
||||
totalPackages: this.nodesByPackage.size,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
410
src/services/sqlite-storage-service.ts
Normal file
410
src/services/sqlite-storage-service.ts
Normal file
@@ -0,0 +1,410 @@
|
||||
import Database from 'better-sqlite3';
|
||||
import * as path from 'path';
|
||||
import * as fs from 'fs';
|
||||
import * as crypto from 'crypto';
|
||||
import { NodeSourceInfo } from '../utils/node-source-extractor';
|
||||
import { StoredNode, NodeSearchQuery } from './node-storage-service';
|
||||
import { logger } from '../utils/logger';
|
||||
|
||||
export class SQLiteStorageService {
|
||||
private db: Database.Database;
|
||||
private readonly dbPath: string;
|
||||
|
||||
constructor(dbPath?: string) {
|
||||
this.dbPath = dbPath || process.env.NODE_DB_PATH || path.join(process.cwd(), 'data', 'nodes.db');
|
||||
|
||||
// Ensure data directory exists
|
||||
const dataDir = path.dirname(this.dbPath);
|
||||
if (!fs.existsSync(dataDir)) {
|
||||
fs.mkdirSync(dataDir, { recursive: true });
|
||||
}
|
||||
|
||||
this.db = new Database(this.dbPath, {
|
||||
verbose: process.env.NODE_ENV === 'development' ? (msg: unknown) => logger.debug(String(msg)) : undefined
|
||||
});
|
||||
|
||||
// Enable WAL mode for better performance
|
||||
this.db.pragma('journal_mode = WAL');
|
||||
|
||||
this.initializeDatabase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize database with schema
|
||||
*/
|
||||
private initializeDatabase(): void {
|
||||
try {
|
||||
const schema = `
|
||||
-- Main nodes table
|
||||
CREATE TABLE IF NOT EXISTS nodes (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
node_type TEXT UNIQUE NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
package_name TEXT NOT NULL,
|
||||
display_name TEXT,
|
||||
description TEXT,
|
||||
code_hash TEXT NOT NULL,
|
||||
code_length INTEGER NOT NULL,
|
||||
source_location TEXT NOT NULL,
|
||||
source_code TEXT NOT NULL,
|
||||
credential_code TEXT,
|
||||
package_info TEXT, -- JSON
|
||||
has_credentials INTEGER DEFAULT 0,
|
||||
extracted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Indexes for performance
|
||||
CREATE INDEX IF NOT EXISTS idx_nodes_package_name ON nodes(package_name);
|
||||
CREATE INDEX IF NOT EXISTS idx_nodes_code_hash ON nodes(code_hash);
|
||||
CREATE INDEX IF NOT EXISTS idx_nodes_name ON nodes(name);
|
||||
|
||||
-- Full Text Search virtual table for node search
|
||||
CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
|
||||
node_type,
|
||||
name,
|
||||
display_name,
|
||||
description,
|
||||
package_name,
|
||||
content=nodes,
|
||||
content_rowid=id
|
||||
);
|
||||
|
||||
-- Triggers to keep FTS in sync
|
||||
CREATE TRIGGER IF NOT EXISTS nodes_ai AFTER INSERT ON nodes
|
||||
BEGIN
|
||||
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
|
||||
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS nodes_ad AFTER DELETE ON nodes
|
||||
BEGIN
|
||||
DELETE FROM nodes_fts WHERE rowid = old.id;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS nodes_au AFTER UPDATE ON nodes
|
||||
BEGIN
|
||||
DELETE FROM nodes_fts WHERE rowid = old.id;
|
||||
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
|
||||
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
|
||||
END;
|
||||
|
||||
-- Statistics table for metadata
|
||||
CREATE TABLE IF NOT EXISTS extraction_stats (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
total_nodes INTEGER NOT NULL,
|
||||
total_packages INTEGER NOT NULL,
|
||||
total_code_size INTEGER NOT NULL,
|
||||
nodes_with_credentials INTEGER NOT NULL,
|
||||
extraction_date DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
`;
|
||||
|
||||
this.db.exec(schema);
|
||||
logger.info('Database initialized successfully');
|
||||
} catch (error) {
|
||||
logger.error('Failed to initialize database:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a node in the database
|
||||
*/
|
||||
async storeNode(nodeInfo: NodeSourceInfo): Promise<StoredNode> {
|
||||
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
|
||||
|
||||
// Parse display name and description from source
|
||||
const displayName = this.extractDisplayName(nodeInfo.sourceCode);
|
||||
const description = this.extractDescription(nodeInfo.sourceCode);
|
||||
|
||||
const stmt = this.db.prepare(`
|
||||
INSERT OR REPLACE INTO nodes (
|
||||
node_type, name, package_name, display_name, description,
|
||||
code_hash, code_length, source_location, source_code,
|
||||
credential_code, package_info, has_credentials,
|
||||
updated_at
|
||||
) VALUES (
|
||||
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP
|
||||
)
|
||||
`);
|
||||
|
||||
const name = nodeInfo.nodeType.split('.').pop() || nodeInfo.nodeType;
|
||||
const packageName = nodeInfo.nodeType.split('.')[0] || 'unknown';
|
||||
|
||||
const result = stmt.run(
|
||||
nodeInfo.nodeType,
|
||||
name,
|
||||
packageName,
|
||||
displayName || null,
|
||||
description || null,
|
||||
codeHash,
|
||||
nodeInfo.sourceCode.length,
|
||||
nodeInfo.location,
|
||||
nodeInfo.sourceCode,
|
||||
nodeInfo.credentialCode || null,
|
||||
nodeInfo.packageInfo ? JSON.stringify(nodeInfo.packageInfo) : null,
|
||||
nodeInfo.credentialCode ? 1 : 0
|
||||
);
|
||||
|
||||
logger.info(`Stored node: ${nodeInfo.nodeType} (${codeHash.substring(0, 8)}...)`);
|
||||
|
||||
return {
|
||||
id: String(result.lastInsertRowid),
|
||||
nodeType: nodeInfo.nodeType,
|
||||
name,
|
||||
packageName,
|
||||
displayName,
|
||||
description,
|
||||
codeHash,
|
||||
codeLength: nodeInfo.sourceCode.length,
|
||||
sourceLocation: nodeInfo.location,
|
||||
hasCredentials: !!nodeInfo.credentialCode,
|
||||
extractedAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
sourceCode: nodeInfo.sourceCode,
|
||||
credentialCode: nodeInfo.credentialCode,
|
||||
packageInfo: nodeInfo.packageInfo
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for nodes using FTS
|
||||
*/
|
||||
async searchNodes(query: NodeSearchQuery): Promise<StoredNode[]> {
|
||||
let sql = `
|
||||
SELECT DISTINCT n.*
|
||||
FROM nodes n
|
||||
`;
|
||||
|
||||
const params: any[] = [];
|
||||
const conditions: string[] = [];
|
||||
|
||||
if (query.query) {
|
||||
// Use FTS for text search
|
||||
sql += ` JOIN nodes_fts fts ON n.id = fts.rowid`;
|
||||
conditions.push(`nodes_fts MATCH ?`);
|
||||
// Convert search query to FTS syntax (prefix search)
|
||||
const ftsQuery = query.query.split(' ')
|
||||
.map(term => `${term}*`)
|
||||
.join(' ');
|
||||
params.push(ftsQuery);
|
||||
}
|
||||
|
||||
if (query.packageName) {
|
||||
conditions.push(`n.package_name = ?`);
|
||||
params.push(query.packageName);
|
||||
}
|
||||
|
||||
if (query.nodeType) {
|
||||
conditions.push(`n.node_type LIKE ?`);
|
||||
params.push(`%${query.nodeType}%`);
|
||||
}
|
||||
|
||||
if (query.hasCredentials !== undefined) {
|
||||
conditions.push(`n.has_credentials = ?`);
|
||||
params.push(query.hasCredentials ? 1 : 0);
|
||||
}
|
||||
|
||||
if (conditions.length > 0) {
|
||||
sql += ` WHERE ${conditions.join(' AND ')}`;
|
||||
}
|
||||
|
||||
sql += ` ORDER BY n.name`;
|
||||
|
||||
if (query.limit) {
|
||||
sql += ` LIMIT ?`;
|
||||
params.push(query.limit);
|
||||
|
||||
if (query.offset) {
|
||||
sql += ` OFFSET ?`;
|
||||
params.push(query.offset);
|
||||
}
|
||||
}
|
||||
|
||||
const stmt = this.db.prepare(sql);
|
||||
const rows = stmt.all(...params);
|
||||
|
||||
return rows.map(row => this.rowToStoredNode(row));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get node by type
|
||||
*/
|
||||
async getNode(nodeType: string): Promise<StoredNode | null> {
|
||||
const stmt = this.db.prepare(`
|
||||
SELECT * FROM nodes WHERE node_type = ?
|
||||
`);
|
||||
|
||||
const row = stmt.get(nodeType);
|
||||
return row ? this.rowToStoredNode(row) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all packages
|
||||
*/
|
||||
async getPackages(): Promise<Array<{ name: string; nodeCount: number }>> {
|
||||
const stmt = this.db.prepare(`
|
||||
SELECT package_name as name, COUNT(*) as nodeCount
|
||||
FROM nodes
|
||||
GROUP BY package_name
|
||||
ORDER BY nodeCount DESC
|
||||
`);
|
||||
|
||||
return stmt.all() as Array<{ name: string; nodeCount: number }>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bulk store nodes (used for database rebuild)
|
||||
*/
|
||||
async bulkStoreNodes(nodeInfos: NodeSourceInfo[]): Promise<{
|
||||
stored: number;
|
||||
failed: number;
|
||||
errors: Array<{ nodeType: string; error: string }>;
|
||||
}> {
|
||||
const results = {
|
||||
stored: 0,
|
||||
failed: 0,
|
||||
errors: [] as Array<{ nodeType: string; error: string }>
|
||||
};
|
||||
|
||||
// Use transaction for bulk insert
|
||||
const insertMany = this.db.transaction((nodes: NodeSourceInfo[]) => {
|
||||
for (const nodeInfo of nodes) {
|
||||
try {
|
||||
this.storeNode(nodeInfo);
|
||||
results.stored++;
|
||||
} catch (error) {
|
||||
results.failed++;
|
||||
results.errors.push({
|
||||
nodeType: nodeInfo.nodeType,
|
||||
error: error instanceof Error ? error.message : 'Unknown error'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
insertMany(nodeInfos);
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get statistics
|
||||
*/
|
||||
async getStatistics(): Promise<{
|
||||
totalNodes: number;
|
||||
totalPackages: number;
|
||||
totalCodeSize: number;
|
||||
nodesWithCredentials: number;
|
||||
averageNodeSize: number;
|
||||
packageDistribution: Array<{ package: string; count: number }>;
|
||||
}> {
|
||||
const stats = this.db.prepare(`
|
||||
SELECT
|
||||
COUNT(*) as totalNodes,
|
||||
COUNT(DISTINCT package_name) as totalPackages,
|
||||
SUM(code_length) as totalCodeSize,
|
||||
SUM(has_credentials) as nodesWithCredentials
|
||||
FROM nodes
|
||||
`).get() as any;
|
||||
|
||||
const packageDist = this.db.prepare(`
|
||||
SELECT package_name as package, COUNT(*) as count
|
||||
FROM nodes
|
||||
GROUP BY package_name
|
||||
ORDER BY count DESC
|
||||
`).all() as Array<{ package: string; count: number }>;
|
||||
|
||||
return {
|
||||
totalNodes: stats.totalNodes || 0,
|
||||
totalPackages: stats.totalPackages || 0,
|
||||
totalCodeSize: stats.totalCodeSize || 0,
|
||||
nodesWithCredentials: stats.nodesWithCredentials || 0,
|
||||
averageNodeSize: stats.totalNodes > 0 ? Math.round(stats.totalCodeSize / stats.totalNodes) : 0,
|
||||
packageDistribution: packageDist
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild entire database
|
||||
*/
|
||||
async rebuildDatabase(): Promise<void> {
|
||||
logger.info('Starting database rebuild...');
|
||||
|
||||
// Clear existing data
|
||||
this.db.exec('DELETE FROM nodes');
|
||||
this.db.exec('DELETE FROM extraction_stats');
|
||||
|
||||
logger.info('Database cleared for rebuild');
|
||||
}
|
||||
|
||||
/**
|
||||
* Save extraction statistics
|
||||
*/
|
||||
async saveExtractionStats(stats: {
|
||||
totalNodes: number;
|
||||
totalPackages: number;
|
||||
totalCodeSize: number;
|
||||
nodesWithCredentials: number;
|
||||
}): Promise<void> {
|
||||
const stmt = this.db.prepare(`
|
||||
INSERT INTO extraction_stats (
|
||||
total_nodes, total_packages, total_code_size, nodes_with_credentials
|
||||
) VALUES (?, ?, ?, ?)
|
||||
`);
|
||||
|
||||
stmt.run(
|
||||
stats.totalNodes,
|
||||
stats.totalPackages,
|
||||
stats.totalCodeSize,
|
||||
stats.nodesWithCredentials
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close database connection
|
||||
*/
|
||||
close(): void {
|
||||
this.db.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert database row to StoredNode
|
||||
*/
|
||||
private rowToStoredNode(row: any): StoredNode {
|
||||
return {
|
||||
id: String(row.id),
|
||||
nodeType: row.node_type,
|
||||
name: row.name,
|
||||
packageName: row.package_name,
|
||||
displayName: row.display_name,
|
||||
description: row.description,
|
||||
codeHash: row.code_hash,
|
||||
codeLength: row.code_length,
|
||||
sourceLocation: row.source_location,
|
||||
hasCredentials: row.has_credentials === 1,
|
||||
extractedAt: new Date(row.extracted_at),
|
||||
updatedAt: new Date(row.updated_at),
|
||||
sourceCode: row.source_code,
|
||||
credentialCode: row.credential_code,
|
||||
packageInfo: row.package_info ? JSON.parse(row.package_info) : undefined
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract display name from source code
|
||||
*/
|
||||
private extractDisplayName(sourceCode: string): string | undefined {
|
||||
const match = sourceCode.match(/displayName:\s*["'`]([^"'`]+)["'`]/);
|
||||
return match ? match[1] : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract description from source code
|
||||
*/
|
||||
private extractDescription(sourceCode: string): string | undefined {
|
||||
const match = sourceCode.match(/description:\s*["'`]([^"'`]+)["'`]/);
|
||||
return match ? match[1] : undefined;
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,12 @@ export class NodeSourceExtractor {
|
||||
'/app/node_modules',
|
||||
'/home/node/.n8n/custom/nodes',
|
||||
'./node_modules',
|
||||
];
|
||||
// Docker volume paths
|
||||
'/var/lib/docker/volumes/n8n-mcp_n8n_modules/_data',
|
||||
'/n8n-modules',
|
||||
// Common n8n installation paths
|
||||
process.env.N8N_CUSTOM_EXTENSIONS || '',
|
||||
].filter(Boolean);
|
||||
|
||||
/**
|
||||
* Extract source code for a specific n8n node
|
||||
@@ -70,8 +75,8 @@ export class NodeSourceExtractor {
|
||||
nodeName: string
|
||||
): Promise<NodeSourceInfo | null> {
|
||||
try {
|
||||
// Common patterns for node files
|
||||
const patterns = [
|
||||
// First, try standard patterns
|
||||
const standardPatterns = [
|
||||
`${packageName}/dist/nodes/${nodeName}/${nodeName}.node.js`,
|
||||
`${packageName}/dist/nodes/${nodeName}.node.js`,
|
||||
`${packageName}/nodes/${nodeName}/${nodeName}.node.js`,
|
||||
@@ -80,39 +85,36 @@ export class NodeSourceExtractor {
|
||||
`${nodeName}.node.js`,
|
||||
];
|
||||
|
||||
for (const pattern of patterns) {
|
||||
// Additional patterns for nested node structures (e.g., agents/Agent)
|
||||
const nestedPatterns = [
|
||||
`${packageName}/dist/nodes/*/${nodeName}/${nodeName}.node.js`,
|
||||
`${packageName}/dist/nodes/**/${nodeName}/${nodeName}.node.js`,
|
||||
`${packageName}/nodes/*/${nodeName}/${nodeName}.node.js`,
|
||||
`${packageName}/nodes/**/${nodeName}/${nodeName}.node.js`,
|
||||
];
|
||||
|
||||
// Try standard patterns first
|
||||
for (const pattern of standardPatterns) {
|
||||
const fullPath = path.join(basePath, pattern);
|
||||
const result = await this.tryLoadNodeFile(fullPath, packageName, nodeName, basePath);
|
||||
if (result) return result;
|
||||
}
|
||||
|
||||
// Try nested patterns (with glob-like search)
|
||||
for (const pattern of nestedPatterns) {
|
||||
const result = await this.searchWithGlobPattern(basePath, pattern, packageName, nodeName);
|
||||
if (result) return result;
|
||||
}
|
||||
|
||||
// If basePath contains .pnpm, search in pnpm structure
|
||||
if (basePath.includes('node_modules')) {
|
||||
const pnpmPath = path.join(basePath, '.pnpm');
|
||||
try {
|
||||
const sourceCode = await fs.readFile(fullPath, 'utf-8');
|
||||
|
||||
// Try to find credential file
|
||||
const credentialPath = fullPath.replace('.node.js', '.credentials.js');
|
||||
let credentialCode: string | undefined;
|
||||
try {
|
||||
credentialCode = await fs.readFile(credentialPath, 'utf-8');
|
||||
} catch {
|
||||
// Credential file is optional
|
||||
}
|
||||
|
||||
// Try to get package.json info
|
||||
const packageJsonPath = path.join(basePath, packageName, 'package.json');
|
||||
let packageInfo: any;
|
||||
try {
|
||||
const packageJson = await fs.readFile(packageJsonPath, 'utf-8');
|
||||
packageInfo = JSON.parse(packageJson);
|
||||
} catch {
|
||||
// Package.json is optional
|
||||
}
|
||||
|
||||
return {
|
||||
nodeType: `${packageName}.${nodeName}`,
|
||||
sourceCode,
|
||||
credentialCode,
|
||||
packageInfo,
|
||||
location: fullPath,
|
||||
};
|
||||
await fs.access(pnpmPath);
|
||||
const result = await this.searchInPnpm(pnpmPath, packageName, nodeName);
|
||||
if (result) return result;
|
||||
} catch {
|
||||
// Continue searching
|
||||
// .pnpm directory doesn't exist
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -122,6 +124,172 @@ export class NodeSourceExtractor {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for nodes in pnpm's special directory structure
|
||||
*/
|
||||
private async searchInPnpm(
|
||||
pnpmPath: string,
|
||||
packageName: string,
|
||||
nodeName: string
|
||||
): Promise<NodeSourceInfo | null> {
|
||||
try {
|
||||
const entries = await fs.readdir(pnpmPath);
|
||||
|
||||
// Filter entries that might contain our package
|
||||
const packageEntries = entries.filter(entry =>
|
||||
entry.includes(packageName.replace('/', '+')) ||
|
||||
entry.includes(packageName)
|
||||
);
|
||||
|
||||
for (const entry of packageEntries) {
|
||||
const entryPath = path.join(pnpmPath, entry, 'node_modules', packageName);
|
||||
|
||||
// Search patterns within the pnpm package directory
|
||||
const patterns = [
|
||||
`dist/nodes/${nodeName}/${nodeName}.node.js`,
|
||||
`dist/nodes/${nodeName}.node.js`,
|
||||
`dist/nodes/*/${nodeName}/${nodeName}.node.js`,
|
||||
`dist/nodes/**/${nodeName}/${nodeName}.node.js`,
|
||||
];
|
||||
|
||||
for (const pattern of patterns) {
|
||||
if (pattern.includes('*')) {
|
||||
const result = await this.searchWithGlobPattern(entryPath, pattern, packageName, nodeName);
|
||||
if (result) return result;
|
||||
} else {
|
||||
const fullPath = path.join(entryPath, pattern);
|
||||
const result = await this.tryLoadNodeFile(fullPath, packageName, nodeName, entryPath);
|
||||
if (result) return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
logger.debug(`Error searching in pnpm directory: ${error}`);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for files matching a glob-like pattern
|
||||
*/
|
||||
private async searchWithGlobPattern(
|
||||
basePath: string,
|
||||
pattern: string,
|
||||
packageName: string,
|
||||
nodeName: string
|
||||
): Promise<NodeSourceInfo | null> {
|
||||
// Convert glob pattern to regex parts
|
||||
const parts = pattern.split('/');
|
||||
const targetFile = `${nodeName}.node.js`;
|
||||
|
||||
async function searchDir(currentPath: string, remainingParts: string[]): Promise<string | null> {
|
||||
if (remainingParts.length === 0) return null;
|
||||
|
||||
const part = remainingParts[0];
|
||||
const isLastPart = remainingParts.length === 1;
|
||||
|
||||
try {
|
||||
if (isLastPart && part === targetFile) {
|
||||
// Check if file exists
|
||||
const fullPath = path.join(currentPath, part);
|
||||
await fs.access(fullPath);
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
||||
|
||||
for (const entry of entries) {
|
||||
if (!entry.isDirectory() && !isLastPart) continue;
|
||||
|
||||
if (part === '*' || part === '**') {
|
||||
// Match any directory
|
||||
if (entry.isDirectory()) {
|
||||
const result = await searchDir(
|
||||
path.join(currentPath, entry.name),
|
||||
part === '**' ? remainingParts : remainingParts.slice(1)
|
||||
);
|
||||
if (result) return result;
|
||||
}
|
||||
} else if (entry.name === part || (isLastPart && entry.name === targetFile)) {
|
||||
if (isLastPart && entry.isFile()) {
|
||||
return path.join(currentPath, entry.name);
|
||||
} else if (!isLastPart && entry.isDirectory()) {
|
||||
const result = await searchDir(
|
||||
path.join(currentPath, entry.name),
|
||||
remainingParts.slice(1)
|
||||
);
|
||||
if (result) return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Directory doesn't exist or can't be read
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
const foundPath = await searchDir(basePath, parts);
|
||||
if (foundPath) {
|
||||
return this.tryLoadNodeFile(foundPath, packageName, nodeName, basePath);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to load a node file and its associated files
|
||||
*/
|
||||
private async tryLoadNodeFile(
|
||||
fullPath: string,
|
||||
packageName: string,
|
||||
nodeName: string,
|
||||
packageBasePath: string
|
||||
): Promise<NodeSourceInfo | null> {
|
||||
try {
|
||||
const sourceCode = await fs.readFile(fullPath, 'utf-8');
|
||||
|
||||
// Try to find credential file
|
||||
const credentialPath = fullPath.replace('.node.js', '.credentials.js');
|
||||
let credentialCode: string | undefined;
|
||||
try {
|
||||
credentialCode = await fs.readFile(credentialPath, 'utf-8');
|
||||
} catch {
|
||||
// Credential file is optional
|
||||
}
|
||||
|
||||
// Try to get package.json info
|
||||
let packageInfo: any;
|
||||
const possiblePackageJsonPaths = [
|
||||
path.join(packageBasePath, 'package.json'),
|
||||
path.join(packageBasePath, packageName, 'package.json'),
|
||||
path.join(path.dirname(path.dirname(fullPath)), 'package.json'),
|
||||
path.join(path.dirname(path.dirname(path.dirname(fullPath))), 'package.json'),
|
||||
];
|
||||
|
||||
for (const packageJsonPath of possiblePackageJsonPaths) {
|
||||
try {
|
||||
const packageJson = await fs.readFile(packageJsonPath, 'utf-8');
|
||||
packageInfo = JSON.parse(packageJson);
|
||||
break;
|
||||
} catch {
|
||||
// Try next path
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
nodeType: `${packageName}.${nodeName}`,
|
||||
sourceCode,
|
||||
credentialCode,
|
||||
packageInfo,
|
||||
location: fullPath,
|
||||
};
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* List all available nodes
|
||||
*/
|
||||
@@ -183,9 +351,14 @@ export class NodeSourceExtractor {
|
||||
} catch {
|
||||
// Skip files we can't read
|
||||
}
|
||||
} else if (entry.isDirectory() && entry.name !== 'node_modules') {
|
||||
// Recursively scan subdirectories
|
||||
await this.scanDirectoryForNodes(path.join(dirPath, entry.name), nodes, category, search);
|
||||
} else if (entry.isDirectory()) {
|
||||
// Special handling for .pnpm directories
|
||||
if (entry.name === '.pnpm') {
|
||||
await this.scanPnpmDirectory(path.join(dirPath, entry.name), nodes, category, search);
|
||||
} else if (entry.name !== 'node_modules') {
|
||||
// Recursively scan subdirectories
|
||||
await this.scanDirectoryForNodes(path.join(dirPath, entry.name), nodes, category, search);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -193,6 +366,32 @@ export class NodeSourceExtractor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan pnpm directory structure for nodes
|
||||
*/
|
||||
private async scanPnpmDirectory(
|
||||
pnpmPath: string,
|
||||
nodes: any[],
|
||||
category?: string,
|
||||
search?: string
|
||||
): Promise<void> {
|
||||
try {
|
||||
const entries = await fs.readdir(pnpmPath);
|
||||
|
||||
for (const entry of entries) {
|
||||
const entryPath = path.join(pnpmPath, entry, 'node_modules');
|
||||
try {
|
||||
await fs.access(entryPath);
|
||||
await this.scanDirectoryForNodes(entryPath, nodes, category, search);
|
||||
} catch {
|
||||
// Skip if node_modules doesn't exist
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
logger.debug(`Error scanning pnpm directory ${pnpmPath}: ${error}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract AI Agent node specifically
|
||||
*/
|
||||
|
||||
50
test-extraction.js
Executable file
50
test-extraction.js
Executable file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Simple test to verify node extraction works
|
||||
const { NodeSourceExtractor } = require('./dist/utils/node-source-extractor');
|
||||
|
||||
async function testExtraction() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
console.log('🧪 Testing n8n Node Extraction\n');
|
||||
|
||||
// Test cases
|
||||
const testNodes = [
|
||||
'n8n-nodes-base.Function',
|
||||
'n8n-nodes-base.Webhook',
|
||||
'@n8n/n8n-nodes-langchain.Agent'
|
||||
];
|
||||
|
||||
for (const nodeType of testNodes) {
|
||||
console.log(`\n📦 Testing: ${nodeType}`);
|
||||
console.log('-'.repeat(40));
|
||||
|
||||
try {
|
||||
const result = await extractor.extractNodeSource(nodeType);
|
||||
|
||||
console.log('✅ Success!');
|
||||
console.log(` Size: ${result.sourceCode.length} bytes`);
|
||||
console.log(` Location: ${result.location}`);
|
||||
console.log(` Has package info: ${result.packageInfo ? 'Yes' : 'No'}`);
|
||||
|
||||
if (result.packageInfo) {
|
||||
console.log(` Package: ${result.packageInfo.name} v${result.packageInfo.version}`);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log('❌ Failed:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n\n📋 Listing available nodes...');
|
||||
const allNodes = await extractor.listAvailableNodes();
|
||||
console.log(`Found ${allNodes.length} total nodes`);
|
||||
|
||||
// Show first 5
|
||||
console.log('\nFirst 5 nodes:');
|
||||
allNodes.slice(0, 5).forEach(node => {
|
||||
console.log(` - ${node.name} (${node.displayName || 'no display name'})`);
|
||||
});
|
||||
}
|
||||
|
||||
testExtraction().catch(console.error);
|
||||
484
tests/comprehensive-extraction-test.js
Executable file
484
tests/comprehensive-extraction-test.js
Executable file
@@ -0,0 +1,484 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Comprehensive test suite for n8n node extraction functionality
|
||||
* Tests all aspects of node extraction for database storage
|
||||
*/
|
||||
|
||||
const fs = require('fs').promises;
|
||||
const path = require('path');
|
||||
const crypto = require('crypto');
|
||||
|
||||
// Import our components
|
||||
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
|
||||
const { N8NMCPServer } = require('../dist/mcp/server');
|
||||
|
||||
// Test configuration
|
||||
const TEST_RESULTS_DIR = path.join(__dirname, 'test-results');
|
||||
const EXTRACTED_NODES_FILE = path.join(TEST_RESULTS_DIR, 'extracted-nodes.json');
|
||||
const TEST_SUMMARY_FILE = path.join(TEST_RESULTS_DIR, 'test-summary.json');
|
||||
|
||||
// Create results directory
|
||||
async function ensureTestDir() {
|
||||
try {
|
||||
await fs.mkdir(TEST_RESULTS_DIR, { recursive: true });
|
||||
} catch (error) {
|
||||
console.error('Failed to create test directory:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// Test results tracking
|
||||
const testResults = {
|
||||
totalTests: 0,
|
||||
passed: 0,
|
||||
failed: 0,
|
||||
startTime: new Date(),
|
||||
endTime: null,
|
||||
tests: [],
|
||||
extractedNodes: [],
|
||||
databaseSchema: null
|
||||
};
|
||||
|
||||
// Helper function to run a test
|
||||
async function runTest(name, testFn) {
|
||||
console.log(`\n📋 Running: ${name}`);
|
||||
testResults.totalTests++;
|
||||
|
||||
const testResult = {
|
||||
name,
|
||||
status: 'pending',
|
||||
startTime: new Date(),
|
||||
endTime: null,
|
||||
error: null,
|
||||
details: {}
|
||||
};
|
||||
|
||||
try {
|
||||
const result = await testFn();
|
||||
testResult.status = 'passed';
|
||||
testResult.details = result;
|
||||
testResults.passed++;
|
||||
console.log(`✅ PASSED: ${name}`);
|
||||
} catch (error) {
|
||||
testResult.status = 'failed';
|
||||
testResult.error = error.message;
|
||||
testResults.failed++;
|
||||
console.error(`❌ FAILED: ${name}`);
|
||||
console.error(` Error: ${error.message}`);
|
||||
if (process.env.DEBUG) {
|
||||
console.error(error.stack);
|
||||
}
|
||||
}
|
||||
|
||||
testResult.endTime = new Date();
|
||||
testResults.tests.push(testResult);
|
||||
return testResult;
|
||||
}
|
||||
|
||||
// Test 1: Basic extraction functionality
|
||||
async function testBasicExtraction() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
// Test a known node
|
||||
const testNodes = [
|
||||
'@n8n/n8n-nodes-langchain.Agent',
|
||||
'n8n-nodes-base.Function',
|
||||
'n8n-nodes-base.Webhook'
|
||||
];
|
||||
|
||||
const results = [];
|
||||
|
||||
for (const nodeType of testNodes) {
|
||||
try {
|
||||
console.log(` - Extracting ${nodeType}...`);
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeType);
|
||||
|
||||
results.push({
|
||||
nodeType,
|
||||
extracted: true,
|
||||
codeLength: nodeInfo.sourceCode.length,
|
||||
hasCredentials: !!nodeInfo.credentialCode,
|
||||
hasPackageInfo: !!nodeInfo.packageInfo,
|
||||
location: nodeInfo.location
|
||||
});
|
||||
|
||||
console.log(` ✓ Extracted: ${nodeInfo.sourceCode.length} bytes`);
|
||||
} catch (error) {
|
||||
results.push({
|
||||
nodeType,
|
||||
extracted: false,
|
||||
error: error.message
|
||||
});
|
||||
console.log(` ✗ Failed: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
// At least one should succeed
|
||||
const successCount = results.filter(r => r.extracted).length;
|
||||
if (successCount === 0) {
|
||||
throw new Error('No nodes could be extracted');
|
||||
}
|
||||
|
||||
return { results, successCount, totalTested: testNodes.length };
|
||||
}
|
||||
|
||||
// Test 2: List available nodes
|
||||
async function testListAvailableNodes() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
console.log(' - Listing all available nodes...');
|
||||
const nodes = await extractor.listAvailableNodes();
|
||||
|
||||
console.log(` - Found ${nodes.length} nodes`);
|
||||
|
||||
// Group by package
|
||||
const nodesByPackage = {};
|
||||
nodes.forEach(node => {
|
||||
const pkg = node.packageName || 'unknown';
|
||||
if (!nodesByPackage[pkg]) {
|
||||
nodesByPackage[pkg] = [];
|
||||
}
|
||||
nodesByPackage[pkg].push(node.name);
|
||||
});
|
||||
|
||||
// Show summary
|
||||
console.log(' - Node distribution by package:');
|
||||
Object.entries(nodesByPackage).forEach(([pkg, nodeList]) => {
|
||||
console.log(` ${pkg}: ${nodeList.length} nodes`);
|
||||
});
|
||||
|
||||
if (nodes.length === 0) {
|
||||
throw new Error('No nodes found');
|
||||
}
|
||||
|
||||
return {
|
||||
totalNodes: nodes.length,
|
||||
packages: Object.keys(nodesByPackage),
|
||||
nodesByPackage,
|
||||
sampleNodes: nodes.slice(0, 5)
|
||||
};
|
||||
}
|
||||
|
||||
// Test 3: Bulk extraction simulation
|
||||
async function testBulkExtraction() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
// First get list of nodes
|
||||
const allNodes = await extractor.listAvailableNodes();
|
||||
|
||||
// Limit to a reasonable number for testing
|
||||
const nodesToExtract = allNodes.slice(0, 10);
|
||||
console.log(` - Testing bulk extraction of ${nodesToExtract.length} nodes...`);
|
||||
|
||||
const extractionResults = [];
|
||||
const startTime = Date.now();
|
||||
|
||||
for (const node of nodesToExtract) {
|
||||
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
|
||||
|
||||
try {
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeType);
|
||||
|
||||
// Calculate hash for deduplication
|
||||
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
|
||||
|
||||
const extractedData = {
|
||||
nodeType,
|
||||
name: node.name,
|
||||
packageName: node.packageName,
|
||||
codeLength: nodeInfo.sourceCode.length,
|
||||
codeHash,
|
||||
hasCredentials: !!nodeInfo.credentialCode,
|
||||
hasPackageInfo: !!nodeInfo.packageInfo,
|
||||
location: nodeInfo.location,
|
||||
extractedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
extractionResults.push({
|
||||
success: true,
|
||||
data: extractedData
|
||||
});
|
||||
|
||||
// Store for database simulation
|
||||
testResults.extractedNodes.push({
|
||||
...extractedData,
|
||||
sourceCode: nodeInfo.sourceCode,
|
||||
credentialCode: nodeInfo.credentialCode,
|
||||
packageInfo: nodeInfo.packageInfo
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
extractionResults.push({
|
||||
success: false,
|
||||
nodeType,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const endTime = Date.now();
|
||||
const successCount = extractionResults.filter(r => r.success).length;
|
||||
|
||||
console.log(` - Extraction completed in ${endTime - startTime}ms`);
|
||||
console.log(` - Success rate: ${successCount}/${nodesToExtract.length} (${(successCount/nodesToExtract.length*100).toFixed(1)}%)`);
|
||||
|
||||
return {
|
||||
totalAttempted: nodesToExtract.length,
|
||||
successCount,
|
||||
failureCount: nodesToExtract.length - successCount,
|
||||
timeElapsed: endTime - startTime,
|
||||
results: extractionResults
|
||||
};
|
||||
}
|
||||
|
||||
// Test 4: Database schema simulation
|
||||
async function testDatabaseSchema() {
|
||||
console.log(' - Simulating database schema for extracted nodes...');
|
||||
|
||||
// Define a schema that would work for storing extracted nodes
|
||||
const schema = {
|
||||
tables: {
|
||||
nodes: {
|
||||
columns: {
|
||||
id: 'UUID PRIMARY KEY',
|
||||
node_type: 'VARCHAR(255) UNIQUE NOT NULL',
|
||||
name: 'VARCHAR(255) NOT NULL',
|
||||
package_name: 'VARCHAR(255)',
|
||||
display_name: 'VARCHAR(255)',
|
||||
description: 'TEXT',
|
||||
version: 'VARCHAR(50)',
|
||||
code_hash: 'VARCHAR(64) NOT NULL',
|
||||
code_length: 'INTEGER NOT NULL',
|
||||
source_location: 'TEXT',
|
||||
extracted_at: 'TIMESTAMP NOT NULL',
|
||||
updated_at: 'TIMESTAMP'
|
||||
},
|
||||
indexes: ['node_type', 'package_name', 'code_hash']
|
||||
},
|
||||
node_source_code: {
|
||||
columns: {
|
||||
id: 'UUID PRIMARY KEY',
|
||||
node_id: 'UUID REFERENCES nodes(id)',
|
||||
source_code: 'TEXT NOT NULL',
|
||||
compiled_code: 'TEXT',
|
||||
source_map: 'TEXT'
|
||||
}
|
||||
},
|
||||
node_credentials: {
|
||||
columns: {
|
||||
id: 'UUID PRIMARY KEY',
|
||||
node_id: 'UUID REFERENCES nodes(id)',
|
||||
credential_type: 'VARCHAR(255) NOT NULL',
|
||||
credential_code: 'TEXT NOT NULL',
|
||||
required_fields: 'JSONB'
|
||||
}
|
||||
},
|
||||
node_metadata: {
|
||||
columns: {
|
||||
id: 'UUID PRIMARY KEY',
|
||||
node_id: 'UUID REFERENCES nodes(id)',
|
||||
package_info: 'JSONB',
|
||||
dependencies: 'JSONB',
|
||||
icon: 'TEXT',
|
||||
categories: 'TEXT[]',
|
||||
documentation_url: 'TEXT'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Validate that our extracted data fits the schema
|
||||
const sampleNode = testResults.extractedNodes[0];
|
||||
if (sampleNode) {
|
||||
console.log(' - Validating extracted data against schema...');
|
||||
|
||||
// Simulate database record
|
||||
const dbRecord = {
|
||||
nodes: {
|
||||
id: crypto.randomUUID(),
|
||||
node_type: sampleNode.nodeType,
|
||||
name: sampleNode.name,
|
||||
package_name: sampleNode.packageName,
|
||||
code_hash: sampleNode.codeHash,
|
||||
code_length: sampleNode.codeLength,
|
||||
source_location: sampleNode.location,
|
||||
extracted_at: new Date()
|
||||
},
|
||||
node_source_code: {
|
||||
source_code: sampleNode.sourceCode
|
||||
},
|
||||
node_credentials: sampleNode.credentialCode ? {
|
||||
credential_code: sampleNode.credentialCode
|
||||
} : null,
|
||||
node_metadata: {
|
||||
package_info: sampleNode.packageInfo
|
||||
}
|
||||
};
|
||||
|
||||
console.log(' - Sample database record created successfully');
|
||||
}
|
||||
|
||||
testResults.databaseSchema = schema;
|
||||
|
||||
return {
|
||||
schemaValid: true,
|
||||
tablesCount: Object.keys(schema.tables).length,
|
||||
estimatedStoragePerNode: sampleNode ? sampleNode.codeLength + 1024 : 0 // code + metadata overhead
|
||||
};
|
||||
}
|
||||
|
||||
// Test 5: Error handling
|
||||
async function testErrorHandling() {
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
const errorTests = [
|
||||
{
|
||||
name: 'Non-existent node',
|
||||
nodeType: 'non-existent-package.FakeNode',
|
||||
expectedError: 'not found'
|
||||
},
|
||||
{
|
||||
name: 'Invalid node type format',
|
||||
nodeType: '',
|
||||
expectedError: 'invalid'
|
||||
},
|
||||
{
|
||||
name: 'Malformed package name',
|
||||
nodeType: '@invalid@package.Node',
|
||||
expectedError: 'not found'
|
||||
}
|
||||
];
|
||||
|
||||
const results = [];
|
||||
|
||||
for (const test of errorTests) {
|
||||
try {
|
||||
console.log(` - Testing: ${test.name}`);
|
||||
await extractor.extractNodeSource(test.nodeType);
|
||||
results.push({
|
||||
...test,
|
||||
passed: false,
|
||||
error: 'Expected error but extraction succeeded'
|
||||
});
|
||||
} catch (error) {
|
||||
const passed = error.message.toLowerCase().includes(test.expectedError);
|
||||
results.push({
|
||||
...test,
|
||||
passed,
|
||||
actualError: error.message
|
||||
});
|
||||
console.log(` ${passed ? '✓' : '✗'} Got expected error type`);
|
||||
}
|
||||
}
|
||||
|
||||
const passedCount = results.filter(r => r.passed).length;
|
||||
return {
|
||||
totalTests: errorTests.length,
|
||||
passed: passedCount,
|
||||
results
|
||||
};
|
||||
}
|
||||
|
||||
// Test 6: MCP server integration
|
||||
async function testMCPServerIntegration() {
|
||||
console.log(' - Testing MCP server tool handlers...');
|
||||
|
||||
const config = {
|
||||
port: 3000,
|
||||
host: '0.0.0.0',
|
||||
authToken: 'test-token'
|
||||
};
|
||||
|
||||
const n8nConfig = {
|
||||
apiUrl: 'http://localhost:5678',
|
||||
apiKey: 'test-key'
|
||||
};
|
||||
|
||||
// Note: We can't fully test the server without running it,
|
||||
// but we can verify the handlers are set up correctly
|
||||
const server = new N8NMCPServer(config, n8nConfig);
|
||||
|
||||
// Verify the server instance is created
|
||||
if (!server) {
|
||||
throw new Error('Failed to create MCP server instance');
|
||||
}
|
||||
|
||||
console.log(' - MCP server instance created successfully');
|
||||
|
||||
return {
|
||||
serverCreated: true,
|
||||
config
|
||||
};
|
||||
}
|
||||
|
||||
// Main test runner
|
||||
async function runAllTests() {
|
||||
console.log('=== Comprehensive n8n Node Extraction Test Suite ===\n');
|
||||
console.log('This test suite validates the extraction of n8n nodes for database storage.\n');
|
||||
|
||||
await ensureTestDir();
|
||||
|
||||
// Update todo status
|
||||
console.log('Starting test execution...\n');
|
||||
|
||||
// Run all tests
|
||||
await runTest('Basic Node Extraction', testBasicExtraction);
|
||||
await runTest('List Available Nodes', testListAvailableNodes);
|
||||
await runTest('Bulk Node Extraction', testBulkExtraction);
|
||||
await runTest('Database Schema Validation', testDatabaseSchema);
|
||||
await runTest('Error Handling', testErrorHandling);
|
||||
await runTest('MCP Server Integration', testMCPServerIntegration);
|
||||
|
||||
// Calculate final results
|
||||
testResults.endTime = new Date();
|
||||
const duration = (testResults.endTime - testResults.startTime) / 1000;
|
||||
|
||||
// Save extracted nodes data
|
||||
if (testResults.extractedNodes.length > 0) {
|
||||
await fs.writeFile(
|
||||
EXTRACTED_NODES_FILE,
|
||||
JSON.stringify(testResults.extractedNodes, null, 2)
|
||||
);
|
||||
console.log(`\n📁 Extracted nodes saved to: ${EXTRACTED_NODES_FILE}`);
|
||||
}
|
||||
|
||||
// Save test summary
|
||||
const summary = {
|
||||
...testResults,
|
||||
extractedNodes: testResults.extractedNodes.length // Just count, not full data
|
||||
};
|
||||
await fs.writeFile(
|
||||
TEST_SUMMARY_FILE,
|
||||
JSON.stringify(summary, null, 2)
|
||||
);
|
||||
|
||||
// Print summary
|
||||
console.log('\n' + '='.repeat(60));
|
||||
console.log('TEST SUMMARY');
|
||||
console.log('='.repeat(60));
|
||||
console.log(`Total Tests: ${testResults.totalTests}`);
|
||||
console.log(`Passed: ${testResults.passed} ✅`);
|
||||
console.log(`Failed: ${testResults.failed} ❌`);
|
||||
console.log(`Duration: ${duration.toFixed(2)}s`);
|
||||
console.log(`Nodes Extracted: ${testResults.extractedNodes.length}`);
|
||||
|
||||
if (testResults.databaseSchema) {
|
||||
console.log('\nDatabase Schema:');
|
||||
console.log(`- Tables: ${Object.keys(testResults.databaseSchema.tables).join(', ')}`);
|
||||
console.log(`- Ready for bulk storage: YES`);
|
||||
}
|
||||
|
||||
console.log('\n' + '='.repeat(60));
|
||||
|
||||
// Exit with appropriate code
|
||||
process.exit(testResults.failed > 0 ? 1 : 0);
|
||||
}
|
||||
|
||||
// Handle errors
|
||||
process.on('unhandledRejection', (error) => {
|
||||
console.error('\n💥 Unhandled error:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
// Run tests
|
||||
runAllTests();
|
||||
7180
tests/extracted-nodes-db/database-import.json
Normal file
7180
tests/extracted-nodes-db/database-import.json
Normal file
File diff suppressed because one or more lines are too long
7194
tests/extracted-nodes-db/extraction-report.json
Normal file
7194
tests/extracted-nodes-db/extraction-report.json
Normal file
File diff suppressed because one or more lines are too long
34
tests/extracted-nodes-db/insert-nodes.sql
Normal file
34
tests/extracted-nodes-db/insert-nodes.sql
Normal file
@@ -0,0 +1,34 @@
|
||||
-- Auto-generated SQL for n8n nodes
|
||||
|
||||
-- Node: n8n-nodes-base.Function
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.Function', 'Function', 'n8n-nodes-base', 'd68f1ab94b190161e2ec2c56ec6631f6c3992826557c100ec578efff5de96a70', 7449, 'node_modules/n8n-nodes-base/dist/nodes/Function/Function.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.Webhook
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.Webhook', 'Webhook', 'n8n-nodes-base', '143d6bbdce335c5a9204112b2c1e8b92e4061d75ba3cb23301845f6fed9e6c71', 10667, 'node_modules/n8n-nodes-base/dist/nodes/Webhook/Webhook.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.HttpRequest
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.HttpRequest', 'HttpRequest', 'n8n-nodes-base', '5b5e2328474b7e85361c940dfe942e167b3f0057f38062f56d6b693f0a7ffe7e', 1343, 'node_modules/n8n-nodes-base/dist/nodes/HttpRequest/HttpRequest.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.If
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.If', 'If', 'n8n-nodes-base', '7910ed9177a946b76f04ca847defb81226c37c698e4cdb63913f038c6c257ee1', 20533, 'node_modules/n8n-nodes-base/dist/nodes/If/If.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.SplitInBatches
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.SplitInBatches', 'SplitInBatches', 'n8n-nodes-base', 'c751422a11e30bf361a6c4803376289740a40434aeb77f90e18cd4dd7ba5c019', 1135, 'node_modules/n8n-nodes-base/dist/nodes/SplitInBatches/SplitInBatches.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.Airtable
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.Airtable', 'Airtable', 'n8n-nodes-base', '2d67e72931697178946f5127b43e954649c4c5e7ad9e29764796404ae96e7db5', 936, 'node_modules/n8n-nodes-base/dist/nodes/Airtable/Airtable.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.Slack
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.Slack', 'Slack', 'n8n-nodes-base', '0ed10d0646f3c595406359edfa2c293dac41991cee59ad4fb3ccf2bb70eca6fc', 1007, 'node_modules/n8n-nodes-base/dist/nodes/Slack/Slack.node.js', false);
|
||||
|
||||
-- Node: n8n-nodes-base.Discord
|
||||
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
|
||||
VALUES ('n8n-nodes-base.Discord', 'Discord', 'n8n-nodes-base', '4995f9ca5c5b57d2486c2e320cc7505238e7f2260861f7e321b44b45ccabeb00', 10049, 'node_modules/n8n-nodes-base/dist/nodes/Discord/Discord.node.js', false);
|
||||
|
||||
896
tests/extracted-nodes-db/n8n-nodes-base__Airtable.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__Airtable.json
Normal file
@@ -0,0 +1,896 @@
|
||||
{
|
||||
"node_type": "n8n-nodes-base.Airtable",
|
||||
"name": "Airtable",
|
||||
"package_name": "n8n-nodes-base",
|
||||
"code_hash": "2d67e72931697178946f5127b43e954649c4c5e7ad9e29764796404ae96e7db5",
|
||||
"code_length": 936,
|
||||
"source_location": "node_modules/n8n-nodes-base/dist/nodes/Airtable/Airtable.node.js",
|
||||
"has_credentials": false,
|
||||
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Airtable = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst AirtableV1_node_1 = require(\"./v1/AirtableV1.node\");\nconst AirtableV2_node_1 = require(\"./v2/AirtableV2.node\");\nclass Airtable extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'Airtable',\n name: 'airtable',\n icon: 'file:airtable.svg',\n group: ['input'],\n description: 'Read, update, write and delete data from Airtable',\n defaultVersion: 2,\n };\n const nodeVersions = {\n 1: new AirtableV1_node_1.AirtableV1(baseDescription),\n 2: new AirtableV2_node_1.AirtableV2(baseDescription),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.Airtable = Airtable;\n//# sourceMappingURL=Airtable.node.js.map",
|
||||
"package_info": {
|
||||
"name": "n8n-nodes-base",
|
||||
"version": "1.14.1",
|
||||
"description": "Base nodes of n8n",
|
||||
"license": "SEE LICENSE IN LICENSE.md",
|
||||
"homepage": "https://n8n.io",
|
||||
"author": {
|
||||
"name": "Jan Oberhauser",
|
||||
"email": "jan@n8n.io"
|
||||
},
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/n8n-io/n8n.git"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"n8n": {
|
||||
"credentials": [
|
||||
"dist/credentials/ActionNetworkApi.credentials.js",
|
||||
"dist/credentials/ActiveCampaignApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
|
||||
"dist/credentials/AdaloApi.credentials.js",
|
||||
"dist/credentials/AffinityApi.credentials.js",
|
||||
"dist/credentials/AgileCrmApi.credentials.js",
|
||||
"dist/credentials/AirtableApi.credentials.js",
|
||||
"dist/credentials/AirtableOAuth2Api.credentials.js",
|
||||
"dist/credentials/AirtableTokenApi.credentials.js",
|
||||
"dist/credentials/AlienVaultApi.credentials.js",
|
||||
"dist/credentials/Amqp.credentials.js",
|
||||
"dist/credentials/ApiTemplateIoApi.credentials.js",
|
||||
"dist/credentials/AsanaApi.credentials.js",
|
||||
"dist/credentials/AsanaOAuth2Api.credentials.js",
|
||||
"dist/credentials/Auth0ManagementApi.credentials.js",
|
||||
"dist/credentials/AutomizyApi.credentials.js",
|
||||
"dist/credentials/AutopilotApi.credentials.js",
|
||||
"dist/credentials/Aws.credentials.js",
|
||||
"dist/credentials/BambooHrApi.credentials.js",
|
||||
"dist/credentials/BannerbearApi.credentials.js",
|
||||
"dist/credentials/BaserowApi.credentials.js",
|
||||
"dist/credentials/BeeminderApi.credentials.js",
|
||||
"dist/credentials/BitbucketApi.credentials.js",
|
||||
"dist/credentials/BitlyApi.credentials.js",
|
||||
"dist/credentials/BitlyOAuth2Api.credentials.js",
|
||||
"dist/credentials/BitwardenApi.credentials.js",
|
||||
"dist/credentials/BoxOAuth2Api.credentials.js",
|
||||
"dist/credentials/BrandfetchApi.credentials.js",
|
||||
"dist/credentials/BubbleApi.credentials.js",
|
||||
"dist/credentials/CalApi.credentials.js",
|
||||
"dist/credentials/CalendlyApi.credentials.js",
|
||||
"dist/credentials/CarbonBlackApi.credentials.js",
|
||||
"dist/credentials/ChargebeeApi.credentials.js",
|
||||
"dist/credentials/CircleCiApi.credentials.js",
|
||||
"dist/credentials/CiscoMerakiApi.credentials.js",
|
||||
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
|
||||
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
|
||||
"dist/credentials/CiscoUmbrellaApi.credentials.js",
|
||||
"dist/credentials/CitrixAdcApi.credentials.js",
|
||||
"dist/credentials/CloudflareApi.credentials.js",
|
||||
"dist/credentials/ClearbitApi.credentials.js",
|
||||
"dist/credentials/ClickUpApi.credentials.js",
|
||||
"dist/credentials/ClickUpOAuth2Api.credentials.js",
|
||||
"dist/credentials/ClockifyApi.credentials.js",
|
||||
"dist/credentials/CockpitApi.credentials.js",
|
||||
"dist/credentials/CodaApi.credentials.js",
|
||||
"dist/credentials/ContentfulApi.credentials.js",
|
||||
"dist/credentials/ConvertKitApi.credentials.js",
|
||||
"dist/credentials/CopperApi.credentials.js",
|
||||
"dist/credentials/CortexApi.credentials.js",
|
||||
"dist/credentials/CrateDb.credentials.js",
|
||||
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
|
||||
"dist/credentials/CrowdDevApi.credentials.js",
|
||||
"dist/credentials/CustomerIoApi.credentials.js",
|
||||
"dist/credentials/DeepLApi.credentials.js",
|
||||
"dist/credentials/DemioApi.credentials.js",
|
||||
"dist/credentials/DhlApi.credentials.js",
|
||||
"dist/credentials/DiscourseApi.credentials.js",
|
||||
"dist/credentials/DisqusApi.credentials.js",
|
||||
"dist/credentials/DriftApi.credentials.js",
|
||||
"dist/credentials/DriftOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropboxApi.credentials.js",
|
||||
"dist/credentials/DropboxOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropcontactApi.credentials.js",
|
||||
"dist/credentials/EgoiApi.credentials.js",
|
||||
"dist/credentials/ElasticsearchApi.credentials.js",
|
||||
"dist/credentials/ElasticSecurityApi.credentials.js",
|
||||
"dist/credentials/EmeliaApi.credentials.js",
|
||||
"dist/credentials/ERPNextApi.credentials.js",
|
||||
"dist/credentials/EventbriteApi.credentials.js",
|
||||
"dist/credentials/EventbriteOAuth2Api.credentials.js",
|
||||
"dist/credentials/F5BigIpApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphAppApi.credentials.js",
|
||||
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/FigmaApi.credentials.js",
|
||||
"dist/credentials/FileMaker.credentials.js",
|
||||
"dist/credentials/FlowApi.credentials.js",
|
||||
"dist/credentials/FormIoApi.credentials.js",
|
||||
"dist/credentials/FormstackApi.credentials.js",
|
||||
"dist/credentials/FormstackOAuth2Api.credentials.js",
|
||||
"dist/credentials/FortiGateApi.credentials.js",
|
||||
"dist/credentials/FreshdeskApi.credentials.js",
|
||||
"dist/credentials/FreshserviceApi.credentials.js",
|
||||
"dist/credentials/FreshworksCrmApi.credentials.js",
|
||||
"dist/credentials/Ftp.credentials.js",
|
||||
"dist/credentials/GetResponseApi.credentials.js",
|
||||
"dist/credentials/GetResponseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GhostAdminApi.credentials.js",
|
||||
"dist/credentials/GhostContentApi.credentials.js",
|
||||
"dist/credentials/GithubApi.credentials.js",
|
||||
"dist/credentials/GithubOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitlabApi.credentials.js",
|
||||
"dist/credentials/GitlabOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitPassword.credentials.js",
|
||||
"dist/credentials/GmailOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleApi.credentials.js",
|
||||
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleOAuth2Api.credentials.js",
|
||||
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
|
||||
"dist/credentials/GotifyApi.credentials.js",
|
||||
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GristApi.credentials.js",
|
||||
"dist/credentials/GrafanaApi.credentials.js",
|
||||
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
|
||||
"dist/credentials/GumroadApi.credentials.js",
|
||||
"dist/credentials/HaloPSAApi.credentials.js",
|
||||
"dist/credentials/HarvestApi.credentials.js",
|
||||
"dist/credentials/HarvestOAuth2Api.credentials.js",
|
||||
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
|
||||
"dist/credentials/HighLevelApi.credentials.js",
|
||||
"dist/credentials/HomeAssistantApi.credentials.js",
|
||||
"dist/credentials/HttpBasicAuth.credentials.js",
|
||||
"dist/credentials/HttpDigestAuth.credentials.js",
|
||||
"dist/credentials/HttpHeaderAuth.credentials.js",
|
||||
"dist/credentials/HttpCustomAuth.credentials.js",
|
||||
"dist/credentials/HttpQueryAuth.credentials.js",
|
||||
"dist/credentials/HubspotApi.credentials.js",
|
||||
"dist/credentials/HubspotAppToken.credentials.js",
|
||||
"dist/credentials/HubspotDeveloperApi.credentials.js",
|
||||
"dist/credentials/HubspotOAuth2Api.credentials.js",
|
||||
"dist/credentials/HumanticAiApi.credentials.js",
|
||||
"dist/credentials/HunterApi.credentials.js",
|
||||
"dist/credentials/HybridAnalysisApi.credentials.js",
|
||||
"dist/credentials/Imap.credentials.js",
|
||||
"dist/credentials/ImpervaWafApi.credentials.js",
|
||||
"dist/credentials/IntercomApi.credentials.js",
|
||||
"dist/credentials/InvoiceNinjaApi.credentials.js",
|
||||
"dist/credentials/IterableApi.credentials.js",
|
||||
"dist/credentials/JenkinsApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareServerApi.credentials.js",
|
||||
"dist/credentials/JotFormApi.credentials.js",
|
||||
"dist/credentials/Kafka.credentials.js",
|
||||
"dist/credentials/KeapOAuth2Api.credentials.js",
|
||||
"dist/credentials/KibanaApi.credentials.js",
|
||||
"dist/credentials/KitemakerApi.credentials.js",
|
||||
"dist/credentials/KoBoToolboxApi.credentials.js",
|
||||
"dist/credentials/Ldap.credentials.js",
|
||||
"dist/credentials/LemlistApi.credentials.js",
|
||||
"dist/credentials/LinearApi.credentials.js",
|
||||
"dist/credentials/LinearOAuth2Api.credentials.js",
|
||||
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/LingvaNexApi.credentials.js",
|
||||
"dist/credentials/LinkedInOAuth2Api.credentials.js",
|
||||
"dist/credentials/LoneScaleApi.credentials.js",
|
||||
"dist/credentials/Magento2Api.credentials.js",
|
||||
"dist/credentials/MailcheckApi.credentials.js",
|
||||
"dist/credentials/MailchimpApi.credentials.js",
|
||||
"dist/credentials/MailchimpOAuth2Api.credentials.js",
|
||||
"dist/credentials/MailerLiteApi.credentials.js",
|
||||
"dist/credentials/MailgunApi.credentials.js",
|
||||
"dist/credentials/MailjetEmailApi.credentials.js",
|
||||
"dist/credentials/MailjetSmsApi.credentials.js",
|
||||
"dist/credentials/MandrillApi.credentials.js",
|
||||
"dist/credentials/MarketstackApi.credentials.js",
|
||||
"dist/credentials/MatrixApi.credentials.js",
|
||||
"dist/credentials/MattermostApi.credentials.js",
|
||||
"dist/credentials/MauticApi.credentials.js",
|
||||
"dist/credentials/MauticOAuth2Api.credentials.js",
|
||||
"dist/credentials/MediumApi.credentials.js",
|
||||
"dist/credentials/MediumOAuth2Api.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MessageBirdApi.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftSql.credentials.js",
|
||||
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
|
||||
"dist/credentials/MindeeInvoiceApi.credentials.js",
|
||||
"dist/credentials/MindeeReceiptApi.credentials.js",
|
||||
"dist/credentials/MispApi.credentials.js",
|
||||
"dist/credentials/MistApi.credentials.js",
|
||||
"dist/credentials/MoceanApi.credentials.js",
|
||||
"dist/credentials/MondayComApi.credentials.js",
|
||||
"dist/credentials/MondayComOAuth2Api.credentials.js",
|
||||
"dist/credentials/MongoDb.credentials.js",
|
||||
"dist/credentials/MonicaCrmApi.credentials.js",
|
||||
"dist/credentials/Mqtt.credentials.js",
|
||||
"dist/credentials/Msg91Api.credentials.js",
|
||||
"dist/credentials/MySql.credentials.js",
|
||||
"dist/credentials/N8nApi.credentials.js",
|
||||
"dist/credentials/NasaApi.credentials.js",
|
||||
"dist/credentials/NetlifyApi.credentials.js",
|
||||
"dist/credentials/NextCloudApi.credentials.js",
|
||||
"dist/credentials/NextCloudOAuth2Api.credentials.js",
|
||||
"dist/credentials/NocoDb.credentials.js",
|
||||
"dist/credentials/NocoDbApiToken.credentials.js",
|
||||
"dist/credentials/NotionApi.credentials.js",
|
||||
"dist/credentials/NotionOAuth2Api.credentials.js",
|
||||
"dist/credentials/NpmApi.credentials.js",
|
||||
"dist/credentials/OAuth1Api.credentials.js",
|
||||
"dist/credentials/OAuth2Api.credentials.js",
|
||||
"dist/credentials/OdooApi.credentials.js",
|
||||
"dist/credentials/OktaApi.credentials.js",
|
||||
"dist/credentials/OneSimpleApi.credentials.js",
|
||||
"dist/credentials/OnfleetApi.credentials.js",
|
||||
"dist/credentials/OpenAiApi.credentials.js",
|
||||
"dist/credentials/OpenCTIApi.credentials.js",
|
||||
"dist/credentials/OpenWeatherMapApi.credentials.js",
|
||||
"dist/credentials/OrbitApi.credentials.js",
|
||||
"dist/credentials/OuraApi.credentials.js",
|
||||
"dist/credentials/PaddleApi.credentials.js",
|
||||
"dist/credentials/PagerDutyApi.credentials.js",
|
||||
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
|
||||
"dist/credentials/PayPalApi.credentials.js",
|
||||
"dist/credentials/PeekalinkApi.credentials.js",
|
||||
"dist/credentials/PhantombusterApi.credentials.js",
|
||||
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
|
||||
"dist/credentials/PipedriveApi.credentials.js",
|
||||
"dist/credentials/PipedriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/PlivoApi.credentials.js",
|
||||
"dist/credentials/Postgres.credentials.js",
|
||||
"dist/credentials/PostHogApi.credentials.js",
|
||||
"dist/credentials/PostmarkApi.credentials.js",
|
||||
"dist/credentials/ProfitWellApi.credentials.js",
|
||||
"dist/credentials/PushbulletOAuth2Api.credentials.js",
|
||||
"dist/credentials/PushcutApi.credentials.js",
|
||||
"dist/credentials/PushoverApi.credentials.js",
|
||||
"dist/credentials/QRadarApi.credentials.js",
|
||||
"dist/credentials/QualysApi.credentials.js",
|
||||
"dist/credentials/QuestDb.credentials.js",
|
||||
"dist/credentials/QuickBaseApi.credentials.js",
|
||||
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/RabbitMQ.credentials.js",
|
||||
"dist/credentials/RaindropOAuth2Api.credentials.js",
|
||||
"dist/credentials/RecordedFutureApi.credentials.js",
|
||||
"dist/credentials/RedditOAuth2Api.credentials.js",
|
||||
"dist/credentials/Redis.credentials.js",
|
||||
"dist/credentials/RocketchatApi.credentials.js",
|
||||
"dist/credentials/RundeckApi.credentials.js",
|
||||
"dist/credentials/S3.credentials.js",
|
||||
"dist/credentials/SalesforceJwtApi.credentials.js",
|
||||
"dist/credentials/SalesforceOAuth2Api.credentials.js",
|
||||
"dist/credentials/SalesmateApi.credentials.js",
|
||||
"dist/credentials/SeaTableApi.credentials.js",
|
||||
"dist/credentials/SecurityScorecardApi.credentials.js",
|
||||
"dist/credentials/SegmentApi.credentials.js",
|
||||
"dist/credentials/SekoiaApi.credentials.js",
|
||||
"dist/credentials/SendGridApi.credentials.js",
|
||||
"dist/credentials/BrevoApi.credentials.js",
|
||||
"dist/credentials/SendyApi.credentials.js",
|
||||
"dist/credentials/SentryIoApi.credentials.js",
|
||||
"dist/credentials/SentryIoOAuth2Api.credentials.js",
|
||||
"dist/credentials/SentryIoServerApi.credentials.js",
|
||||
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
|
||||
"dist/credentials/ServiceNowBasicApi.credentials.js",
|
||||
"dist/credentials/Sftp.credentials.js",
|
||||
"dist/credentials/ShopifyApi.credentials.js",
|
||||
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
|
||||
"dist/credentials/ShopifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/Signl4Api.credentials.js",
|
||||
"dist/credentials/SlackApi.credentials.js",
|
||||
"dist/credentials/SlackOAuth2Api.credentials.js",
|
||||
"dist/credentials/Sms77Api.credentials.js",
|
||||
"dist/credentials/Smtp.credentials.js",
|
||||
"dist/credentials/Snowflake.credentials.js",
|
||||
"dist/credentials/SplunkApi.credentials.js",
|
||||
"dist/credentials/SpontitApi.credentials.js",
|
||||
"dist/credentials/SpotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/ShufflerApi.credentials.js",
|
||||
"dist/credentials/SshPassword.credentials.js",
|
||||
"dist/credentials/SshPrivateKey.credentials.js",
|
||||
"dist/credentials/StackbyApi.credentials.js",
|
||||
"dist/credentials/StoryblokContentApi.credentials.js",
|
||||
"dist/credentials/StoryblokManagementApi.credentials.js",
|
||||
"dist/credentials/StrapiApi.credentials.js",
|
||||
"dist/credentials/StrapiTokenApi.credentials.js",
|
||||
"dist/credentials/StravaOAuth2Api.credentials.js",
|
||||
"dist/credentials/StripeApi.credentials.js",
|
||||
"dist/credentials/SupabaseApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
|
||||
"dist/credentials/SyncroMspApi.credentials.js",
|
||||
"dist/credentials/TaigaApi.credentials.js",
|
||||
"dist/credentials/TapfiliateApi.credentials.js",
|
||||
"dist/credentials/TelegramApi.credentials.js",
|
||||
"dist/credentials/TheHiveProjectApi.credentials.js",
|
||||
"dist/credentials/TheHiveApi.credentials.js",
|
||||
"dist/credentials/TimescaleDb.credentials.js",
|
||||
"dist/credentials/TodoistApi.credentials.js",
|
||||
"dist/credentials/TodoistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TogglApi.credentials.js",
|
||||
"dist/credentials/TotpApi.credentials.js",
|
||||
"dist/credentials/TravisCiApi.credentials.js",
|
||||
"dist/credentials/TrellixEpoApi.credentials.js",
|
||||
"dist/credentials/TrelloApi.credentials.js",
|
||||
"dist/credentials/TwakeCloudApi.credentials.js",
|
||||
"dist/credentials/TwakeServerApi.credentials.js",
|
||||
"dist/credentials/TwilioApi.credentials.js",
|
||||
"dist/credentials/TwistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth1Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth2Api.credentials.js",
|
||||
"dist/credentials/TypeformApi.credentials.js",
|
||||
"dist/credentials/TypeformOAuth2Api.credentials.js",
|
||||
"dist/credentials/UnleashedSoftwareApi.credentials.js",
|
||||
"dist/credentials/UpleadApi.credentials.js",
|
||||
"dist/credentials/UProcApi.credentials.js",
|
||||
"dist/credentials/UptimeRobotApi.credentials.js",
|
||||
"dist/credentials/UrlScanIoApi.credentials.js",
|
||||
"dist/credentials/VeroApi.credentials.js",
|
||||
"dist/credentials/VirusTotalApi.credentials.js",
|
||||
"dist/credentials/VonageApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
|
||||
"dist/credentials/WebflowApi.credentials.js",
|
||||
"dist/credentials/WebflowOAuth2Api.credentials.js",
|
||||
"dist/credentials/WekanApi.credentials.js",
|
||||
"dist/credentials/WhatsAppApi.credentials.js",
|
||||
"dist/credentials/WiseApi.credentials.js",
|
||||
"dist/credentials/WooCommerceApi.credentials.js",
|
||||
"dist/credentials/WordpressApi.credentials.js",
|
||||
"dist/credentials/WorkableApi.credentials.js",
|
||||
"dist/credentials/WufooApi.credentials.js",
|
||||
"dist/credentials/XeroOAuth2Api.credentials.js",
|
||||
"dist/credentials/YourlsApi.credentials.js",
|
||||
"dist/credentials/YouTubeOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZammadBasicAuthApi.credentials.js",
|
||||
"dist/credentials/ZammadTokenAuthApi.credentials.js",
|
||||
"dist/credentials/ZendeskApi.credentials.js",
|
||||
"dist/credentials/ZendeskOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZohoOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZoomApi.credentials.js",
|
||||
"dist/credentials/ZoomOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZscalerZiaApi.credentials.js",
|
||||
"dist/credentials/ZulipApi.credentials.js"
|
||||
],
|
||||
"nodes": [
|
||||
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
|
||||
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
|
||||
"dist/nodes/Adalo/Adalo.node.js",
|
||||
"dist/nodes/Affinity/Affinity.node.js",
|
||||
"dist/nodes/Affinity/AffinityTrigger.node.js",
|
||||
"dist/nodes/AgileCrm/AgileCrm.node.js",
|
||||
"dist/nodes/Airtable/Airtable.node.js",
|
||||
"dist/nodes/Airtable/AirtableTrigger.node.js",
|
||||
"dist/nodes/Amqp/Amqp.node.js",
|
||||
"dist/nodes/Amqp/AmqpTrigger.node.js",
|
||||
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
|
||||
"dist/nodes/Asana/Asana.node.js",
|
||||
"dist/nodes/Asana/AsanaTrigger.node.js",
|
||||
"dist/nodes/Automizy/Automizy.node.js",
|
||||
"dist/nodes/Autopilot/Autopilot.node.js",
|
||||
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
|
||||
"dist/nodes/Aws/AwsLambda.node.js",
|
||||
"dist/nodes/Aws/AwsSns.node.js",
|
||||
"dist/nodes/Aws/AwsSnsTrigger.node.js",
|
||||
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
|
||||
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
|
||||
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
|
||||
"dist/nodes/Aws/ELB/AwsElb.node.js",
|
||||
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
|
||||
"dist/nodes/Aws/S3/AwsS3.node.js",
|
||||
"dist/nodes/Aws/SES/AwsSes.node.js",
|
||||
"dist/nodes/Aws/SQS/AwsSqs.node.js",
|
||||
"dist/nodes/Aws/Textract/AwsTextract.node.js",
|
||||
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
|
||||
"dist/nodes/BambooHr/BambooHr.node.js",
|
||||
"dist/nodes/Bannerbear/Bannerbear.node.js",
|
||||
"dist/nodes/Baserow/Baserow.node.js",
|
||||
"dist/nodes/Beeminder/Beeminder.node.js",
|
||||
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
|
||||
"dist/nodes/Bitly/Bitly.node.js",
|
||||
"dist/nodes/Bitwarden/Bitwarden.node.js",
|
||||
"dist/nodes/Box/Box.node.js",
|
||||
"dist/nodes/Box/BoxTrigger.node.js",
|
||||
"dist/nodes/Brandfetch/Brandfetch.node.js",
|
||||
"dist/nodes/Bubble/Bubble.node.js",
|
||||
"dist/nodes/Cal/CalTrigger.node.js",
|
||||
"dist/nodes/Calendly/CalendlyTrigger.node.js",
|
||||
"dist/nodes/Chargebee/Chargebee.node.js",
|
||||
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
|
||||
"dist/nodes/CircleCi/CircleCi.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
|
||||
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
|
||||
"dist/nodes/Cloudflare/Cloudflare.node.js",
|
||||
"dist/nodes/Clearbit/Clearbit.node.js",
|
||||
"dist/nodes/ClickUp/ClickUp.node.js",
|
||||
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
|
||||
"dist/nodes/Clockify/Clockify.node.js",
|
||||
"dist/nodes/Clockify/ClockifyTrigger.node.js",
|
||||
"dist/nodes/Cockpit/Cockpit.node.js",
|
||||
"dist/nodes/Coda/Coda.node.js",
|
||||
"dist/nodes/Code/Code.node.js",
|
||||
"dist/nodes/CoinGecko/CoinGecko.node.js",
|
||||
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
|
||||
"dist/nodes/Compression/Compression.node.js",
|
||||
"dist/nodes/Contentful/Contentful.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKit.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
|
||||
"dist/nodes/Copper/Copper.node.js",
|
||||
"dist/nodes/Copper/CopperTrigger.node.js",
|
||||
"dist/nodes/Cortex/Cortex.node.js",
|
||||
"dist/nodes/CrateDb/CrateDb.node.js",
|
||||
"dist/nodes/Cron/Cron.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDev.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
|
||||
"dist/nodes/Crypto/Crypto.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIo.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
|
||||
"dist/nodes/DateTime/DateTime.node.js",
|
||||
"dist/nodes/DebugHelper/DebugHelper.node.js",
|
||||
"dist/nodes/DeepL/DeepL.node.js",
|
||||
"dist/nodes/Demio/Demio.node.js",
|
||||
"dist/nodes/Dhl/Dhl.node.js",
|
||||
"dist/nodes/Discord/Discord.node.js",
|
||||
"dist/nodes/Discourse/Discourse.node.js",
|
||||
"dist/nodes/Disqus/Disqus.node.js",
|
||||
"dist/nodes/Drift/Drift.node.js",
|
||||
"dist/nodes/Dropbox/Dropbox.node.js",
|
||||
"dist/nodes/Dropcontact/Dropcontact.node.js",
|
||||
"dist/nodes/EditImage/EditImage.node.js",
|
||||
"dist/nodes/E2eTest/E2eTest.node.js",
|
||||
"dist/nodes/Egoi/Egoi.node.js",
|
||||
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
|
||||
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
|
||||
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
|
||||
"dist/nodes/EmailSend/EmailSend.node.js",
|
||||
"dist/nodes/Emelia/Emelia.node.js",
|
||||
"dist/nodes/Emelia/EmeliaTrigger.node.js",
|
||||
"dist/nodes/ERPNext/ERPNext.node.js",
|
||||
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
|
||||
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
|
||||
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
|
||||
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
|
||||
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
|
||||
"dist/nodes/ExecutionData/ExecutionData.node.js",
|
||||
"dist/nodes/Facebook/FacebookGraphApi.node.js",
|
||||
"dist/nodes/Facebook/FacebookTrigger.node.js",
|
||||
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
|
||||
"dist/nodes/Figma/FigmaTrigger.node.js",
|
||||
"dist/nodes/FileMaker/FileMaker.node.js",
|
||||
"dist/nodes/Filter/Filter.node.js",
|
||||
"dist/nodes/Flow/Flow.node.js",
|
||||
"dist/nodes/Flow/FlowTrigger.node.js",
|
||||
"dist/nodes/Form/FormTrigger.node.js",
|
||||
"dist/nodes/FormIo/FormIoTrigger.node.js",
|
||||
"dist/nodes/Formstack/FormstackTrigger.node.js",
|
||||
"dist/nodes/Freshdesk/Freshdesk.node.js",
|
||||
"dist/nodes/Freshservice/Freshservice.node.js",
|
||||
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
|
||||
"dist/nodes/Ftp/Ftp.node.js",
|
||||
"dist/nodes/Function/Function.node.js",
|
||||
"dist/nodes/FunctionItem/FunctionItem.node.js",
|
||||
"dist/nodes/GetResponse/GetResponse.node.js",
|
||||
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
|
||||
"dist/nodes/Ghost/Ghost.node.js",
|
||||
"dist/nodes/Git/Git.node.js",
|
||||
"dist/nodes/Github/Github.node.js",
|
||||
"dist/nodes/Github/GithubTrigger.node.js",
|
||||
"dist/nodes/Gitlab/Gitlab.node.js",
|
||||
"dist/nodes/Gitlab/GitlabTrigger.node.js",
|
||||
"dist/nodes/Google/Ads/GoogleAds.node.js",
|
||||
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
|
||||
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
|
||||
"dist/nodes/Google/Books/GoogleBooks.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
|
||||
"dist/nodes/Google/Chat/GoogleChat.node.js",
|
||||
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
|
||||
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
|
||||
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
|
||||
"dist/nodes/Google/Docs/GoogleDocs.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDrive.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
|
||||
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
|
||||
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
|
||||
"dist/nodes/Google/Gmail/Gmail.node.js",
|
||||
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
|
||||
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
|
||||
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
|
||||
"dist/nodes/Google/Slides/GoogleSlides.node.js",
|
||||
"dist/nodes/Google/Task/GoogleTasks.node.js",
|
||||
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
|
||||
"dist/nodes/Google/YouTube/YouTube.node.js",
|
||||
"dist/nodes/Gotify/Gotify.node.js",
|
||||
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
|
||||
"dist/nodes/Grafana/Grafana.node.js",
|
||||
"dist/nodes/GraphQL/GraphQL.node.js",
|
||||
"dist/nodes/Grist/Grist.node.js",
|
||||
"dist/nodes/Gumroad/GumroadTrigger.node.js",
|
||||
"dist/nodes/HackerNews/HackerNews.node.js",
|
||||
"dist/nodes/HaloPSA/HaloPSA.node.js",
|
||||
"dist/nodes/Harvest/Harvest.node.js",
|
||||
"dist/nodes/HelpScout/HelpScout.node.js",
|
||||
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
|
||||
"dist/nodes/HighLevel/HighLevel.node.js",
|
||||
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
|
||||
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
|
||||
"dist/nodes/Html/Html.node.js",
|
||||
"dist/nodes/HttpRequest/HttpRequest.node.js",
|
||||
"dist/nodes/Hubspot/Hubspot.node.js",
|
||||
"dist/nodes/Hubspot/HubspotTrigger.node.js",
|
||||
"dist/nodes/HumanticAI/HumanticAi.node.js",
|
||||
"dist/nodes/Hunter/Hunter.node.js",
|
||||
"dist/nodes/ICalendar/ICalendar.node.js",
|
||||
"dist/nodes/If/If.node.js",
|
||||
"dist/nodes/Intercom/Intercom.node.js",
|
||||
"dist/nodes/Interval/Interval.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
|
||||
"dist/nodes/ItemLists/ItemLists.node.js",
|
||||
"dist/nodes/Iterable/Iterable.node.js",
|
||||
"dist/nodes/Jenkins/Jenkins.node.js",
|
||||
"dist/nodes/Jira/Jira.node.js",
|
||||
"dist/nodes/Jira/JiraTrigger.node.js",
|
||||
"dist/nodes/JotForm/JotFormTrigger.node.js",
|
||||
"dist/nodes/Kafka/Kafka.node.js",
|
||||
"dist/nodes/Kafka/KafkaTrigger.node.js",
|
||||
"dist/nodes/Keap/Keap.node.js",
|
||||
"dist/nodes/Keap/KeapTrigger.node.js",
|
||||
"dist/nodes/Kitemaker/Kitemaker.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
|
||||
"dist/nodes/Ldap/Ldap.node.js",
|
||||
"dist/nodes/Lemlist/Lemlist.node.js",
|
||||
"dist/nodes/Lemlist/LemlistTrigger.node.js",
|
||||
"dist/nodes/Line/Line.node.js",
|
||||
"dist/nodes/Linear/Linear.node.js",
|
||||
"dist/nodes/Linear/LinearTrigger.node.js",
|
||||
"dist/nodes/LingvaNex/LingvaNex.node.js",
|
||||
"dist/nodes/LinkedIn/LinkedIn.node.js",
|
||||
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScale.node.js",
|
||||
"dist/nodes/Magento/Magento2.node.js",
|
||||
"dist/nodes/Mailcheck/Mailcheck.node.js",
|
||||
"dist/nodes/Mailchimp/Mailchimp.node.js",
|
||||
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
|
||||
"dist/nodes/MailerLite/MailerLite.node.js",
|
||||
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
|
||||
"dist/nodes/Mailgun/Mailgun.node.js",
|
||||
"dist/nodes/Mailjet/Mailjet.node.js",
|
||||
"dist/nodes/Mailjet/MailjetTrigger.node.js",
|
||||
"dist/nodes/Mandrill/Mandrill.node.js",
|
||||
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
|
||||
"dist/nodes/Markdown/Markdown.node.js",
|
||||
"dist/nodes/Marketstack/Marketstack.node.js",
|
||||
"dist/nodes/Matrix/Matrix.node.js",
|
||||
"dist/nodes/Mattermost/Mattermost.node.js",
|
||||
"dist/nodes/Mautic/Mautic.node.js",
|
||||
"dist/nodes/Mautic/MauticTrigger.node.js",
|
||||
"dist/nodes/Medium/Medium.node.js",
|
||||
"dist/nodes/Merge/Merge.node.js",
|
||||
"dist/nodes/MessageBird/MessageBird.node.js",
|
||||
"dist/nodes/Metabase/Metabase.node.js",
|
||||
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
|
||||
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
|
||||
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
|
||||
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
|
||||
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
|
||||
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
|
||||
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
|
||||
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
|
||||
"dist/nodes/Mindee/Mindee.node.js",
|
||||
"dist/nodes/Misp/Misp.node.js",
|
||||
"dist/nodes/Mocean/Mocean.node.js",
|
||||
"dist/nodes/MondayCom/MondayCom.node.js",
|
||||
"dist/nodes/MongoDb/MongoDb.node.js",
|
||||
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
|
||||
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
|
||||
"dist/nodes/MQTT/Mqtt.node.js",
|
||||
"dist/nodes/MQTT/MqttTrigger.node.js",
|
||||
"dist/nodes/Msg91/Msg91.node.js",
|
||||
"dist/nodes/MySql/MySql.node.js",
|
||||
"dist/nodes/N8n/N8n.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
|
||||
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
|
||||
"dist/nodes/Nasa/Nasa.node.js",
|
||||
"dist/nodes/Netlify/Netlify.node.js",
|
||||
"dist/nodes/Netlify/NetlifyTrigger.node.js",
|
||||
"dist/nodes/NextCloud/NextCloud.node.js",
|
||||
"dist/nodes/NocoDB/NocoDB.node.js",
|
||||
"dist/nodes/Brevo/Brevo.node.js",
|
||||
"dist/nodes/Brevo/BrevoTrigger.node.js",
|
||||
"dist/nodes/StickyNote/StickyNote.node.js",
|
||||
"dist/nodes/NoOp/NoOp.node.js",
|
||||
"dist/nodes/Onfleet/Onfleet.node.js",
|
||||
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
|
||||
"dist/nodes/Notion/Notion.node.js",
|
||||
"dist/nodes/Notion/NotionTrigger.node.js",
|
||||
"dist/nodes/Npm/Npm.node.js",
|
||||
"dist/nodes/Odoo/Odoo.node.js",
|
||||
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
|
||||
"dist/nodes/OpenAi/OpenAi.node.js",
|
||||
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
|
||||
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
|
||||
"dist/nodes/Orbit/Orbit.node.js",
|
||||
"dist/nodes/Oura/Oura.node.js",
|
||||
"dist/nodes/Paddle/Paddle.node.js",
|
||||
"dist/nodes/PagerDuty/PagerDuty.node.js",
|
||||
"dist/nodes/PayPal/PayPal.node.js",
|
||||
"dist/nodes/PayPal/PayPalTrigger.node.js",
|
||||
"dist/nodes/Peekalink/Peekalink.node.js",
|
||||
"dist/nodes/Phantombuster/Phantombuster.node.js",
|
||||
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
|
||||
"dist/nodes/Pipedrive/Pipedrive.node.js",
|
||||
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
|
||||
"dist/nodes/Plivo/Plivo.node.js",
|
||||
"dist/nodes/PostBin/PostBin.node.js",
|
||||
"dist/nodes/Postgres/Postgres.node.js",
|
||||
"dist/nodes/Postgres/PostgresTrigger.node.js",
|
||||
"dist/nodes/PostHog/PostHog.node.js",
|
||||
"dist/nodes/Postmark/PostmarkTrigger.node.js",
|
||||
"dist/nodes/ProfitWell/ProfitWell.node.js",
|
||||
"dist/nodes/Pushbullet/Pushbullet.node.js",
|
||||
"dist/nodes/Pushcut/Pushcut.node.js",
|
||||
"dist/nodes/Pushcut/PushcutTrigger.node.js",
|
||||
"dist/nodes/Pushover/Pushover.node.js",
|
||||
"dist/nodes/QuestDb/QuestDb.node.js",
|
||||
"dist/nodes/QuickBase/QuickBase.node.js",
|
||||
"dist/nodes/QuickBooks/QuickBooks.node.js",
|
||||
"dist/nodes/QuickChart/QuickChart.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
|
||||
"dist/nodes/Raindrop/Raindrop.node.js",
|
||||
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
|
||||
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
|
||||
"dist/nodes/ReadPdf/ReadPDF.node.js",
|
||||
"dist/nodes/Reddit/Reddit.node.js",
|
||||
"dist/nodes/Redis/Redis.node.js",
|
||||
"dist/nodes/Redis/RedisTrigger.node.js",
|
||||
"dist/nodes/RenameKeys/RenameKeys.node.js",
|
||||
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
|
||||
"dist/nodes/Rocketchat/Rocketchat.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
|
||||
"dist/nodes/Rundeck/Rundeck.node.js",
|
||||
"dist/nodes/S3/S3.node.js",
|
||||
"dist/nodes/Salesforce/Salesforce.node.js",
|
||||
"dist/nodes/Salesmate/Salesmate.node.js",
|
||||
"dist/nodes/Schedule/ScheduleTrigger.node.js",
|
||||
"dist/nodes/SeaTable/SeaTable.node.js",
|
||||
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
|
||||
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
|
||||
"dist/nodes/Segment/Segment.node.js",
|
||||
"dist/nodes/SendGrid/SendGrid.node.js",
|
||||
"dist/nodes/Sendy/Sendy.node.js",
|
||||
"dist/nodes/SentryIo/SentryIo.node.js",
|
||||
"dist/nodes/ServiceNow/ServiceNow.node.js",
|
||||
"dist/nodes/Set/Set.node.js",
|
||||
"dist/nodes/Shopify/Shopify.node.js",
|
||||
"dist/nodes/Shopify/ShopifyTrigger.node.js",
|
||||
"dist/nodes/Signl4/Signl4.node.js",
|
||||
"dist/nodes/Slack/Slack.node.js",
|
||||
"dist/nodes/Sms77/Sms77.node.js",
|
||||
"dist/nodes/Snowflake/Snowflake.node.js",
|
||||
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
|
||||
"dist/nodes/Splunk/Splunk.node.js",
|
||||
"dist/nodes/Spontit/Spontit.node.js",
|
||||
"dist/nodes/Spotify/Spotify.node.js",
|
||||
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
|
||||
"dist/nodes/SseTrigger/SseTrigger.node.js",
|
||||
"dist/nodes/Ssh/Ssh.node.js",
|
||||
"dist/nodes/Stackby/Stackby.node.js",
|
||||
"dist/nodes/Start/Start.node.js",
|
||||
"dist/nodes/StopAndError/StopAndError.node.js",
|
||||
"dist/nodes/Storyblok/Storyblok.node.js",
|
||||
"dist/nodes/Strapi/Strapi.node.js",
|
||||
"dist/nodes/Strava/Strava.node.js",
|
||||
"dist/nodes/Strava/StravaTrigger.node.js",
|
||||
"dist/nodes/Stripe/Stripe.node.js",
|
||||
"dist/nodes/Stripe/StripeTrigger.node.js",
|
||||
"dist/nodes/Supabase/Supabase.node.js",
|
||||
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
|
||||
"dist/nodes/Switch/Switch.node.js",
|
||||
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
|
||||
"dist/nodes/Taiga/Taiga.node.js",
|
||||
"dist/nodes/Taiga/TaigaTrigger.node.js",
|
||||
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
|
||||
"dist/nodes/Telegram/Telegram.node.js",
|
||||
"dist/nodes/Telegram/TelegramTrigger.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
|
||||
"dist/nodes/TheHive/TheHive.node.js",
|
||||
"dist/nodes/TheHive/TheHiveTrigger.node.js",
|
||||
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
|
||||
"dist/nodes/Todoist/Todoist.node.js",
|
||||
"dist/nodes/Toggl/TogglTrigger.node.js",
|
||||
"dist/nodes/Totp/Totp.node.js",
|
||||
"dist/nodes/TravisCi/TravisCi.node.js",
|
||||
"dist/nodes/Trello/Trello.node.js",
|
||||
"dist/nodes/Trello/TrelloTrigger.node.js",
|
||||
"dist/nodes/Twake/Twake.node.js",
|
||||
"dist/nodes/Twilio/Twilio.node.js",
|
||||
"dist/nodes/Twist/Twist.node.js",
|
||||
"dist/nodes/Twitter/Twitter.node.js",
|
||||
"dist/nodes/Typeform/TypeformTrigger.node.js",
|
||||
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
|
||||
"dist/nodes/Uplead/Uplead.node.js",
|
||||
"dist/nodes/UProc/UProc.node.js",
|
||||
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
|
||||
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
|
||||
"dist/nodes/Vero/Vero.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
|
||||
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
|
||||
"dist/nodes/Vonage/Vonage.node.js",
|
||||
"dist/nodes/Wait/Wait.node.js",
|
||||
"dist/nodes/Webflow/Webflow.node.js",
|
||||
"dist/nodes/Webflow/WebflowTrigger.node.js",
|
||||
"dist/nodes/Webhook/Webhook.node.js",
|
||||
"dist/nodes/Wekan/Wekan.node.js",
|
||||
"dist/nodes/WhatsApp/WhatsApp.node.js",
|
||||
"dist/nodes/Wise/Wise.node.js",
|
||||
"dist/nodes/Wise/WiseTrigger.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerce.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
|
||||
"dist/nodes/Wordpress/Wordpress.node.js",
|
||||
"dist/nodes/Workable/WorkableTrigger.node.js",
|
||||
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
|
||||
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
|
||||
"dist/nodes/Wufoo/WufooTrigger.node.js",
|
||||
"dist/nodes/Xero/Xero.node.js",
|
||||
"dist/nodes/Xml/Xml.node.js",
|
||||
"dist/nodes/Yourls/Yourls.node.js",
|
||||
"dist/nodes/Zammad/Zammad.node.js",
|
||||
"dist/nodes/Zendesk/Zendesk.node.js",
|
||||
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
|
||||
"dist/nodes/Zoho/ZohoCrm.node.js",
|
||||
"dist/nodes/Zoom/Zoom.node.js",
|
||||
"dist/nodes/Zulip/Zulip.node.js"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/amqplib": "^0.10.1",
|
||||
"@types/aws4": "^1.5.1",
|
||||
"@types/basic-auth": "^1.1.3",
|
||||
"@types/cheerio": "^0.22.15",
|
||||
"@types/cron": "~1.7.1",
|
||||
"@types/eventsource": "^1.1.2",
|
||||
"@types/express": "^4.17.6",
|
||||
"@types/gm": "^1.25.0",
|
||||
"@types/imap-simple": "^4.2.0",
|
||||
"@types/js-nacl": "^1.3.0",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/lodash": "^4.14.195",
|
||||
"@types/lossless-json": "^1.0.0",
|
||||
"@types/mailparser": "^2.7.3",
|
||||
"@types/mime-types": "^2.1.0",
|
||||
"@types/mssql": "^6.0.2",
|
||||
"@types/node-ssh": "^7.0.1",
|
||||
"@types/nodemailer": "^6.4.0",
|
||||
"@types/promise-ftp": "^1.3.4",
|
||||
"@types/redis": "^2.8.11",
|
||||
"@types/request-promise-native": "~1.0.15",
|
||||
"@types/rfc2047": "^2.0.1",
|
||||
"@types/showdown": "^1.9.4",
|
||||
"@types/snowflake-sdk": "^1.6.12",
|
||||
"@types/ssh2-sftp-client": "^5.1.0",
|
||||
"@types/tmp": "^0.2.0",
|
||||
"@types/uuid": "^8.3.2",
|
||||
"@types/xml2js": "^0.4.11",
|
||||
"eslint-plugin-n8n-nodes-base": "^1.16.0",
|
||||
"gulp": "^4.0.0",
|
||||
"n8n-core": "1.14.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@kafkajs/confluent-schema-registry": "1.0.6",
|
||||
"@n8n/vm2": "^3.9.20",
|
||||
"amqplib": "^0.10.3",
|
||||
"aws4": "^1.8.0",
|
||||
"basic-auth": "^2.0.1",
|
||||
"change-case": "^4.1.1",
|
||||
"cheerio": "1.0.0-rc.6",
|
||||
"chokidar": "3.5.2",
|
||||
"cron": "~1.7.2",
|
||||
"csv-parse": "^5.5.0",
|
||||
"currency-codes": "^2.1.0",
|
||||
"eventsource": "^2.0.2",
|
||||
"fast-glob": "^3.2.5",
|
||||
"fflate": "^0.7.0",
|
||||
"get-system-fonts": "^2.0.2",
|
||||
"gm": "^1.25.0",
|
||||
"iconv-lite": "^0.6.2",
|
||||
"ics": "^2.27.0",
|
||||
"imap-simple": "^4.3.0",
|
||||
"isbot": "^3.6.13",
|
||||
"iso-639-1": "^2.1.3",
|
||||
"js-nacl": "^1.4.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"kafkajs": "^1.14.0",
|
||||
"ldapts": "^4.2.6",
|
||||
"lodash": "^4.17.21",
|
||||
"lossless-json": "^1.0.4",
|
||||
"luxon": "^3.3.0",
|
||||
"mailparser": "^3.2.0",
|
||||
"minifaker": "^1.34.1",
|
||||
"moment": "~2.29.2",
|
||||
"moment-timezone": "^0.5.28",
|
||||
"mongodb": "^4.17.1",
|
||||
"mqtt": "^5.0.2",
|
||||
"mssql": "^8.1.2",
|
||||
"mysql2": "~2.3.0",
|
||||
"nanoid": "^3.3.6",
|
||||
"node-html-markdown": "^1.1.3",
|
||||
"node-ssh": "^12.0.0",
|
||||
"nodemailer": "^6.7.1",
|
||||
"otpauth": "^9.1.1",
|
||||
"pdfjs-dist": "^2.16.105",
|
||||
"pg": "^8.3.0",
|
||||
"pg-promise": "^10.5.8",
|
||||
"pretty-bytes": "^5.6.0",
|
||||
"promise-ftp": "^1.3.5",
|
||||
"pyodide": "^0.23.4",
|
||||
"redis": "^3.1.1",
|
||||
"rfc2047": "^4.0.1",
|
||||
"rhea": "^1.0.11",
|
||||
"rss-parser": "^3.7.0",
|
||||
"semver": "^7.5.4",
|
||||
"showdown": "^2.0.3",
|
||||
"simple-git": "^3.17.0",
|
||||
"snowflake-sdk": "^1.8.0",
|
||||
"ssh2-sftp-client": "^7.0.0",
|
||||
"tmp-promise": "^3.0.2",
|
||||
"typedi": "^0.10.0",
|
||||
"uuid": "^8.3.2",
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
|
||||
"xml2js": "^0.5.0",
|
||||
"n8n-workflow": "1.14.1"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist .turbo",
|
||||
"dev": "pnpm watch",
|
||||
"typecheck": "tsc",
|
||||
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
|
||||
"build:translations": "gulp build:translations",
|
||||
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
|
||||
"format": "prettier --write . --ignore-path ../../.prettierignore",
|
||||
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
|
||||
"lintfix": "eslint . --fix",
|
||||
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
|
||||
"test": "jest"
|
||||
}
|
||||
},
|
||||
"extraction_time_ms": 5,
|
||||
"extracted_at": "2025-06-07T17:49:22.782Z"
|
||||
}
|
||||
896
tests/extracted-nodes-db/n8n-nodes-base__Discord.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__Discord.json
Normal file
File diff suppressed because one or more lines are too long
896
tests/extracted-nodes-db/n8n-nodes-base__Function.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__Function.json
Normal file
File diff suppressed because one or more lines are too long
896
tests/extracted-nodes-db/n8n-nodes-base__HttpRequest.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__HttpRequest.json
Normal file
@@ -0,0 +1,896 @@
|
||||
{
|
||||
"node_type": "n8n-nodes-base.HttpRequest",
|
||||
"name": "HttpRequest",
|
||||
"package_name": "n8n-nodes-base",
|
||||
"code_hash": "5b5e2328474b7e85361c940dfe942e167b3f0057f38062f56d6b693f0a7ffe7e",
|
||||
"code_length": 1343,
|
||||
"source_location": "node_modules/n8n-nodes-base/dist/nodes/HttpRequest/HttpRequest.node.js",
|
||||
"has_credentials": false,
|
||||
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpRequest = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst HttpRequestV1_node_1 = require(\"./V1/HttpRequestV1.node\");\nconst HttpRequestV2_node_1 = require(\"./V2/HttpRequestV2.node\");\nconst HttpRequestV3_node_1 = require(\"./V3/HttpRequestV3.node\");\nclass HttpRequest extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'HTTP Request',\n name: 'httpRequest',\n icon: 'fa:at',\n group: ['output'],\n subtitle: '={{$parameter[\"requestMethod\"] + \": \" + $parameter[\"url\"]}}',\n description: 'Makes an HTTP request and returns the response data',\n defaultVersion: 4.1,\n };\n const nodeVersions = {\n 1: new HttpRequestV1_node_1.HttpRequestV1(baseDescription),\n 2: new HttpRequestV2_node_1.HttpRequestV2(baseDescription),\n 3: new HttpRequestV3_node_1.HttpRequestV3(baseDescription),\n 4: new HttpRequestV3_node_1.HttpRequestV3(baseDescription),\n 4.1: new HttpRequestV3_node_1.HttpRequestV3(baseDescription),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.HttpRequest = HttpRequest;\n//# sourceMappingURL=HttpRequest.node.js.map",
|
||||
"package_info": {
|
||||
"name": "n8n-nodes-base",
|
||||
"version": "1.14.1",
|
||||
"description": "Base nodes of n8n",
|
||||
"license": "SEE LICENSE IN LICENSE.md",
|
||||
"homepage": "https://n8n.io",
|
||||
"author": {
|
||||
"name": "Jan Oberhauser",
|
||||
"email": "jan@n8n.io"
|
||||
},
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/n8n-io/n8n.git"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"n8n": {
|
||||
"credentials": [
|
||||
"dist/credentials/ActionNetworkApi.credentials.js",
|
||||
"dist/credentials/ActiveCampaignApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
|
||||
"dist/credentials/AdaloApi.credentials.js",
|
||||
"dist/credentials/AffinityApi.credentials.js",
|
||||
"dist/credentials/AgileCrmApi.credentials.js",
|
||||
"dist/credentials/AirtableApi.credentials.js",
|
||||
"dist/credentials/AirtableOAuth2Api.credentials.js",
|
||||
"dist/credentials/AirtableTokenApi.credentials.js",
|
||||
"dist/credentials/AlienVaultApi.credentials.js",
|
||||
"dist/credentials/Amqp.credentials.js",
|
||||
"dist/credentials/ApiTemplateIoApi.credentials.js",
|
||||
"dist/credentials/AsanaApi.credentials.js",
|
||||
"dist/credentials/AsanaOAuth2Api.credentials.js",
|
||||
"dist/credentials/Auth0ManagementApi.credentials.js",
|
||||
"dist/credentials/AutomizyApi.credentials.js",
|
||||
"dist/credentials/AutopilotApi.credentials.js",
|
||||
"dist/credentials/Aws.credentials.js",
|
||||
"dist/credentials/BambooHrApi.credentials.js",
|
||||
"dist/credentials/BannerbearApi.credentials.js",
|
||||
"dist/credentials/BaserowApi.credentials.js",
|
||||
"dist/credentials/BeeminderApi.credentials.js",
|
||||
"dist/credentials/BitbucketApi.credentials.js",
|
||||
"dist/credentials/BitlyApi.credentials.js",
|
||||
"dist/credentials/BitlyOAuth2Api.credentials.js",
|
||||
"dist/credentials/BitwardenApi.credentials.js",
|
||||
"dist/credentials/BoxOAuth2Api.credentials.js",
|
||||
"dist/credentials/BrandfetchApi.credentials.js",
|
||||
"dist/credentials/BubbleApi.credentials.js",
|
||||
"dist/credentials/CalApi.credentials.js",
|
||||
"dist/credentials/CalendlyApi.credentials.js",
|
||||
"dist/credentials/CarbonBlackApi.credentials.js",
|
||||
"dist/credentials/ChargebeeApi.credentials.js",
|
||||
"dist/credentials/CircleCiApi.credentials.js",
|
||||
"dist/credentials/CiscoMerakiApi.credentials.js",
|
||||
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
|
||||
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
|
||||
"dist/credentials/CiscoUmbrellaApi.credentials.js",
|
||||
"dist/credentials/CitrixAdcApi.credentials.js",
|
||||
"dist/credentials/CloudflareApi.credentials.js",
|
||||
"dist/credentials/ClearbitApi.credentials.js",
|
||||
"dist/credentials/ClickUpApi.credentials.js",
|
||||
"dist/credentials/ClickUpOAuth2Api.credentials.js",
|
||||
"dist/credentials/ClockifyApi.credentials.js",
|
||||
"dist/credentials/CockpitApi.credentials.js",
|
||||
"dist/credentials/CodaApi.credentials.js",
|
||||
"dist/credentials/ContentfulApi.credentials.js",
|
||||
"dist/credentials/ConvertKitApi.credentials.js",
|
||||
"dist/credentials/CopperApi.credentials.js",
|
||||
"dist/credentials/CortexApi.credentials.js",
|
||||
"dist/credentials/CrateDb.credentials.js",
|
||||
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
|
||||
"dist/credentials/CrowdDevApi.credentials.js",
|
||||
"dist/credentials/CustomerIoApi.credentials.js",
|
||||
"dist/credentials/DeepLApi.credentials.js",
|
||||
"dist/credentials/DemioApi.credentials.js",
|
||||
"dist/credentials/DhlApi.credentials.js",
|
||||
"dist/credentials/DiscourseApi.credentials.js",
|
||||
"dist/credentials/DisqusApi.credentials.js",
|
||||
"dist/credentials/DriftApi.credentials.js",
|
||||
"dist/credentials/DriftOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropboxApi.credentials.js",
|
||||
"dist/credentials/DropboxOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropcontactApi.credentials.js",
|
||||
"dist/credentials/EgoiApi.credentials.js",
|
||||
"dist/credentials/ElasticsearchApi.credentials.js",
|
||||
"dist/credentials/ElasticSecurityApi.credentials.js",
|
||||
"dist/credentials/EmeliaApi.credentials.js",
|
||||
"dist/credentials/ERPNextApi.credentials.js",
|
||||
"dist/credentials/EventbriteApi.credentials.js",
|
||||
"dist/credentials/EventbriteOAuth2Api.credentials.js",
|
||||
"dist/credentials/F5BigIpApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphAppApi.credentials.js",
|
||||
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/FigmaApi.credentials.js",
|
||||
"dist/credentials/FileMaker.credentials.js",
|
||||
"dist/credentials/FlowApi.credentials.js",
|
||||
"dist/credentials/FormIoApi.credentials.js",
|
||||
"dist/credentials/FormstackApi.credentials.js",
|
||||
"dist/credentials/FormstackOAuth2Api.credentials.js",
|
||||
"dist/credentials/FortiGateApi.credentials.js",
|
||||
"dist/credentials/FreshdeskApi.credentials.js",
|
||||
"dist/credentials/FreshserviceApi.credentials.js",
|
||||
"dist/credentials/FreshworksCrmApi.credentials.js",
|
||||
"dist/credentials/Ftp.credentials.js",
|
||||
"dist/credentials/GetResponseApi.credentials.js",
|
||||
"dist/credentials/GetResponseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GhostAdminApi.credentials.js",
|
||||
"dist/credentials/GhostContentApi.credentials.js",
|
||||
"dist/credentials/GithubApi.credentials.js",
|
||||
"dist/credentials/GithubOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitlabApi.credentials.js",
|
||||
"dist/credentials/GitlabOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitPassword.credentials.js",
|
||||
"dist/credentials/GmailOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleApi.credentials.js",
|
||||
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleOAuth2Api.credentials.js",
|
||||
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
|
||||
"dist/credentials/GotifyApi.credentials.js",
|
||||
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GristApi.credentials.js",
|
||||
"dist/credentials/GrafanaApi.credentials.js",
|
||||
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
|
||||
"dist/credentials/GumroadApi.credentials.js",
|
||||
"dist/credentials/HaloPSAApi.credentials.js",
|
||||
"dist/credentials/HarvestApi.credentials.js",
|
||||
"dist/credentials/HarvestOAuth2Api.credentials.js",
|
||||
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
|
||||
"dist/credentials/HighLevelApi.credentials.js",
|
||||
"dist/credentials/HomeAssistantApi.credentials.js",
|
||||
"dist/credentials/HttpBasicAuth.credentials.js",
|
||||
"dist/credentials/HttpDigestAuth.credentials.js",
|
||||
"dist/credentials/HttpHeaderAuth.credentials.js",
|
||||
"dist/credentials/HttpCustomAuth.credentials.js",
|
||||
"dist/credentials/HttpQueryAuth.credentials.js",
|
||||
"dist/credentials/HubspotApi.credentials.js",
|
||||
"dist/credentials/HubspotAppToken.credentials.js",
|
||||
"dist/credentials/HubspotDeveloperApi.credentials.js",
|
||||
"dist/credentials/HubspotOAuth2Api.credentials.js",
|
||||
"dist/credentials/HumanticAiApi.credentials.js",
|
||||
"dist/credentials/HunterApi.credentials.js",
|
||||
"dist/credentials/HybridAnalysisApi.credentials.js",
|
||||
"dist/credentials/Imap.credentials.js",
|
||||
"dist/credentials/ImpervaWafApi.credentials.js",
|
||||
"dist/credentials/IntercomApi.credentials.js",
|
||||
"dist/credentials/InvoiceNinjaApi.credentials.js",
|
||||
"dist/credentials/IterableApi.credentials.js",
|
||||
"dist/credentials/JenkinsApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareServerApi.credentials.js",
|
||||
"dist/credentials/JotFormApi.credentials.js",
|
||||
"dist/credentials/Kafka.credentials.js",
|
||||
"dist/credentials/KeapOAuth2Api.credentials.js",
|
||||
"dist/credentials/KibanaApi.credentials.js",
|
||||
"dist/credentials/KitemakerApi.credentials.js",
|
||||
"dist/credentials/KoBoToolboxApi.credentials.js",
|
||||
"dist/credentials/Ldap.credentials.js",
|
||||
"dist/credentials/LemlistApi.credentials.js",
|
||||
"dist/credentials/LinearApi.credentials.js",
|
||||
"dist/credentials/LinearOAuth2Api.credentials.js",
|
||||
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/LingvaNexApi.credentials.js",
|
||||
"dist/credentials/LinkedInOAuth2Api.credentials.js",
|
||||
"dist/credentials/LoneScaleApi.credentials.js",
|
||||
"dist/credentials/Magento2Api.credentials.js",
|
||||
"dist/credentials/MailcheckApi.credentials.js",
|
||||
"dist/credentials/MailchimpApi.credentials.js",
|
||||
"dist/credentials/MailchimpOAuth2Api.credentials.js",
|
||||
"dist/credentials/MailerLiteApi.credentials.js",
|
||||
"dist/credentials/MailgunApi.credentials.js",
|
||||
"dist/credentials/MailjetEmailApi.credentials.js",
|
||||
"dist/credentials/MailjetSmsApi.credentials.js",
|
||||
"dist/credentials/MandrillApi.credentials.js",
|
||||
"dist/credentials/MarketstackApi.credentials.js",
|
||||
"dist/credentials/MatrixApi.credentials.js",
|
||||
"dist/credentials/MattermostApi.credentials.js",
|
||||
"dist/credentials/MauticApi.credentials.js",
|
||||
"dist/credentials/MauticOAuth2Api.credentials.js",
|
||||
"dist/credentials/MediumApi.credentials.js",
|
||||
"dist/credentials/MediumOAuth2Api.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MessageBirdApi.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftSql.credentials.js",
|
||||
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
|
||||
"dist/credentials/MindeeInvoiceApi.credentials.js",
|
||||
"dist/credentials/MindeeReceiptApi.credentials.js",
|
||||
"dist/credentials/MispApi.credentials.js",
|
||||
"dist/credentials/MistApi.credentials.js",
|
||||
"dist/credentials/MoceanApi.credentials.js",
|
||||
"dist/credentials/MondayComApi.credentials.js",
|
||||
"dist/credentials/MondayComOAuth2Api.credentials.js",
|
||||
"dist/credentials/MongoDb.credentials.js",
|
||||
"dist/credentials/MonicaCrmApi.credentials.js",
|
||||
"dist/credentials/Mqtt.credentials.js",
|
||||
"dist/credentials/Msg91Api.credentials.js",
|
||||
"dist/credentials/MySql.credentials.js",
|
||||
"dist/credentials/N8nApi.credentials.js",
|
||||
"dist/credentials/NasaApi.credentials.js",
|
||||
"dist/credentials/NetlifyApi.credentials.js",
|
||||
"dist/credentials/NextCloudApi.credentials.js",
|
||||
"dist/credentials/NextCloudOAuth2Api.credentials.js",
|
||||
"dist/credentials/NocoDb.credentials.js",
|
||||
"dist/credentials/NocoDbApiToken.credentials.js",
|
||||
"dist/credentials/NotionApi.credentials.js",
|
||||
"dist/credentials/NotionOAuth2Api.credentials.js",
|
||||
"dist/credentials/NpmApi.credentials.js",
|
||||
"dist/credentials/OAuth1Api.credentials.js",
|
||||
"dist/credentials/OAuth2Api.credentials.js",
|
||||
"dist/credentials/OdooApi.credentials.js",
|
||||
"dist/credentials/OktaApi.credentials.js",
|
||||
"dist/credentials/OneSimpleApi.credentials.js",
|
||||
"dist/credentials/OnfleetApi.credentials.js",
|
||||
"dist/credentials/OpenAiApi.credentials.js",
|
||||
"dist/credentials/OpenCTIApi.credentials.js",
|
||||
"dist/credentials/OpenWeatherMapApi.credentials.js",
|
||||
"dist/credentials/OrbitApi.credentials.js",
|
||||
"dist/credentials/OuraApi.credentials.js",
|
||||
"dist/credentials/PaddleApi.credentials.js",
|
||||
"dist/credentials/PagerDutyApi.credentials.js",
|
||||
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
|
||||
"dist/credentials/PayPalApi.credentials.js",
|
||||
"dist/credentials/PeekalinkApi.credentials.js",
|
||||
"dist/credentials/PhantombusterApi.credentials.js",
|
||||
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
|
||||
"dist/credentials/PipedriveApi.credentials.js",
|
||||
"dist/credentials/PipedriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/PlivoApi.credentials.js",
|
||||
"dist/credentials/Postgres.credentials.js",
|
||||
"dist/credentials/PostHogApi.credentials.js",
|
||||
"dist/credentials/PostmarkApi.credentials.js",
|
||||
"dist/credentials/ProfitWellApi.credentials.js",
|
||||
"dist/credentials/PushbulletOAuth2Api.credentials.js",
|
||||
"dist/credentials/PushcutApi.credentials.js",
|
||||
"dist/credentials/PushoverApi.credentials.js",
|
||||
"dist/credentials/QRadarApi.credentials.js",
|
||||
"dist/credentials/QualysApi.credentials.js",
|
||||
"dist/credentials/QuestDb.credentials.js",
|
||||
"dist/credentials/QuickBaseApi.credentials.js",
|
||||
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/RabbitMQ.credentials.js",
|
||||
"dist/credentials/RaindropOAuth2Api.credentials.js",
|
||||
"dist/credentials/RecordedFutureApi.credentials.js",
|
||||
"dist/credentials/RedditOAuth2Api.credentials.js",
|
||||
"dist/credentials/Redis.credentials.js",
|
||||
"dist/credentials/RocketchatApi.credentials.js",
|
||||
"dist/credentials/RundeckApi.credentials.js",
|
||||
"dist/credentials/S3.credentials.js",
|
||||
"dist/credentials/SalesforceJwtApi.credentials.js",
|
||||
"dist/credentials/SalesforceOAuth2Api.credentials.js",
|
||||
"dist/credentials/SalesmateApi.credentials.js",
|
||||
"dist/credentials/SeaTableApi.credentials.js",
|
||||
"dist/credentials/SecurityScorecardApi.credentials.js",
|
||||
"dist/credentials/SegmentApi.credentials.js",
|
||||
"dist/credentials/SekoiaApi.credentials.js",
|
||||
"dist/credentials/SendGridApi.credentials.js",
|
||||
"dist/credentials/BrevoApi.credentials.js",
|
||||
"dist/credentials/SendyApi.credentials.js",
|
||||
"dist/credentials/SentryIoApi.credentials.js",
|
||||
"dist/credentials/SentryIoOAuth2Api.credentials.js",
|
||||
"dist/credentials/SentryIoServerApi.credentials.js",
|
||||
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
|
||||
"dist/credentials/ServiceNowBasicApi.credentials.js",
|
||||
"dist/credentials/Sftp.credentials.js",
|
||||
"dist/credentials/ShopifyApi.credentials.js",
|
||||
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
|
||||
"dist/credentials/ShopifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/Signl4Api.credentials.js",
|
||||
"dist/credentials/SlackApi.credentials.js",
|
||||
"dist/credentials/SlackOAuth2Api.credentials.js",
|
||||
"dist/credentials/Sms77Api.credentials.js",
|
||||
"dist/credentials/Smtp.credentials.js",
|
||||
"dist/credentials/Snowflake.credentials.js",
|
||||
"dist/credentials/SplunkApi.credentials.js",
|
||||
"dist/credentials/SpontitApi.credentials.js",
|
||||
"dist/credentials/SpotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/ShufflerApi.credentials.js",
|
||||
"dist/credentials/SshPassword.credentials.js",
|
||||
"dist/credentials/SshPrivateKey.credentials.js",
|
||||
"dist/credentials/StackbyApi.credentials.js",
|
||||
"dist/credentials/StoryblokContentApi.credentials.js",
|
||||
"dist/credentials/StoryblokManagementApi.credentials.js",
|
||||
"dist/credentials/StrapiApi.credentials.js",
|
||||
"dist/credentials/StrapiTokenApi.credentials.js",
|
||||
"dist/credentials/StravaOAuth2Api.credentials.js",
|
||||
"dist/credentials/StripeApi.credentials.js",
|
||||
"dist/credentials/SupabaseApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
|
||||
"dist/credentials/SyncroMspApi.credentials.js",
|
||||
"dist/credentials/TaigaApi.credentials.js",
|
||||
"dist/credentials/TapfiliateApi.credentials.js",
|
||||
"dist/credentials/TelegramApi.credentials.js",
|
||||
"dist/credentials/TheHiveProjectApi.credentials.js",
|
||||
"dist/credentials/TheHiveApi.credentials.js",
|
||||
"dist/credentials/TimescaleDb.credentials.js",
|
||||
"dist/credentials/TodoistApi.credentials.js",
|
||||
"dist/credentials/TodoistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TogglApi.credentials.js",
|
||||
"dist/credentials/TotpApi.credentials.js",
|
||||
"dist/credentials/TravisCiApi.credentials.js",
|
||||
"dist/credentials/TrellixEpoApi.credentials.js",
|
||||
"dist/credentials/TrelloApi.credentials.js",
|
||||
"dist/credentials/TwakeCloudApi.credentials.js",
|
||||
"dist/credentials/TwakeServerApi.credentials.js",
|
||||
"dist/credentials/TwilioApi.credentials.js",
|
||||
"dist/credentials/TwistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth1Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth2Api.credentials.js",
|
||||
"dist/credentials/TypeformApi.credentials.js",
|
||||
"dist/credentials/TypeformOAuth2Api.credentials.js",
|
||||
"dist/credentials/UnleashedSoftwareApi.credentials.js",
|
||||
"dist/credentials/UpleadApi.credentials.js",
|
||||
"dist/credentials/UProcApi.credentials.js",
|
||||
"dist/credentials/UptimeRobotApi.credentials.js",
|
||||
"dist/credentials/UrlScanIoApi.credentials.js",
|
||||
"dist/credentials/VeroApi.credentials.js",
|
||||
"dist/credentials/VirusTotalApi.credentials.js",
|
||||
"dist/credentials/VonageApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
|
||||
"dist/credentials/WebflowApi.credentials.js",
|
||||
"dist/credentials/WebflowOAuth2Api.credentials.js",
|
||||
"dist/credentials/WekanApi.credentials.js",
|
||||
"dist/credentials/WhatsAppApi.credentials.js",
|
||||
"dist/credentials/WiseApi.credentials.js",
|
||||
"dist/credentials/WooCommerceApi.credentials.js",
|
||||
"dist/credentials/WordpressApi.credentials.js",
|
||||
"dist/credentials/WorkableApi.credentials.js",
|
||||
"dist/credentials/WufooApi.credentials.js",
|
||||
"dist/credentials/XeroOAuth2Api.credentials.js",
|
||||
"dist/credentials/YourlsApi.credentials.js",
|
||||
"dist/credentials/YouTubeOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZammadBasicAuthApi.credentials.js",
|
||||
"dist/credentials/ZammadTokenAuthApi.credentials.js",
|
||||
"dist/credentials/ZendeskApi.credentials.js",
|
||||
"dist/credentials/ZendeskOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZohoOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZoomApi.credentials.js",
|
||||
"dist/credentials/ZoomOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZscalerZiaApi.credentials.js",
|
||||
"dist/credentials/ZulipApi.credentials.js"
|
||||
],
|
||||
"nodes": [
|
||||
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
|
||||
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
|
||||
"dist/nodes/Adalo/Adalo.node.js",
|
||||
"dist/nodes/Affinity/Affinity.node.js",
|
||||
"dist/nodes/Affinity/AffinityTrigger.node.js",
|
||||
"dist/nodes/AgileCrm/AgileCrm.node.js",
|
||||
"dist/nodes/Airtable/Airtable.node.js",
|
||||
"dist/nodes/Airtable/AirtableTrigger.node.js",
|
||||
"dist/nodes/Amqp/Amqp.node.js",
|
||||
"dist/nodes/Amqp/AmqpTrigger.node.js",
|
||||
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
|
||||
"dist/nodes/Asana/Asana.node.js",
|
||||
"dist/nodes/Asana/AsanaTrigger.node.js",
|
||||
"dist/nodes/Automizy/Automizy.node.js",
|
||||
"dist/nodes/Autopilot/Autopilot.node.js",
|
||||
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
|
||||
"dist/nodes/Aws/AwsLambda.node.js",
|
||||
"dist/nodes/Aws/AwsSns.node.js",
|
||||
"dist/nodes/Aws/AwsSnsTrigger.node.js",
|
||||
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
|
||||
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
|
||||
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
|
||||
"dist/nodes/Aws/ELB/AwsElb.node.js",
|
||||
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
|
||||
"dist/nodes/Aws/S3/AwsS3.node.js",
|
||||
"dist/nodes/Aws/SES/AwsSes.node.js",
|
||||
"dist/nodes/Aws/SQS/AwsSqs.node.js",
|
||||
"dist/nodes/Aws/Textract/AwsTextract.node.js",
|
||||
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
|
||||
"dist/nodes/BambooHr/BambooHr.node.js",
|
||||
"dist/nodes/Bannerbear/Bannerbear.node.js",
|
||||
"dist/nodes/Baserow/Baserow.node.js",
|
||||
"dist/nodes/Beeminder/Beeminder.node.js",
|
||||
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
|
||||
"dist/nodes/Bitly/Bitly.node.js",
|
||||
"dist/nodes/Bitwarden/Bitwarden.node.js",
|
||||
"dist/nodes/Box/Box.node.js",
|
||||
"dist/nodes/Box/BoxTrigger.node.js",
|
||||
"dist/nodes/Brandfetch/Brandfetch.node.js",
|
||||
"dist/nodes/Bubble/Bubble.node.js",
|
||||
"dist/nodes/Cal/CalTrigger.node.js",
|
||||
"dist/nodes/Calendly/CalendlyTrigger.node.js",
|
||||
"dist/nodes/Chargebee/Chargebee.node.js",
|
||||
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
|
||||
"dist/nodes/CircleCi/CircleCi.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
|
||||
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
|
||||
"dist/nodes/Cloudflare/Cloudflare.node.js",
|
||||
"dist/nodes/Clearbit/Clearbit.node.js",
|
||||
"dist/nodes/ClickUp/ClickUp.node.js",
|
||||
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
|
||||
"dist/nodes/Clockify/Clockify.node.js",
|
||||
"dist/nodes/Clockify/ClockifyTrigger.node.js",
|
||||
"dist/nodes/Cockpit/Cockpit.node.js",
|
||||
"dist/nodes/Coda/Coda.node.js",
|
||||
"dist/nodes/Code/Code.node.js",
|
||||
"dist/nodes/CoinGecko/CoinGecko.node.js",
|
||||
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
|
||||
"dist/nodes/Compression/Compression.node.js",
|
||||
"dist/nodes/Contentful/Contentful.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKit.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
|
||||
"dist/nodes/Copper/Copper.node.js",
|
||||
"dist/nodes/Copper/CopperTrigger.node.js",
|
||||
"dist/nodes/Cortex/Cortex.node.js",
|
||||
"dist/nodes/CrateDb/CrateDb.node.js",
|
||||
"dist/nodes/Cron/Cron.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDev.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
|
||||
"dist/nodes/Crypto/Crypto.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIo.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
|
||||
"dist/nodes/DateTime/DateTime.node.js",
|
||||
"dist/nodes/DebugHelper/DebugHelper.node.js",
|
||||
"dist/nodes/DeepL/DeepL.node.js",
|
||||
"dist/nodes/Demio/Demio.node.js",
|
||||
"dist/nodes/Dhl/Dhl.node.js",
|
||||
"dist/nodes/Discord/Discord.node.js",
|
||||
"dist/nodes/Discourse/Discourse.node.js",
|
||||
"dist/nodes/Disqus/Disqus.node.js",
|
||||
"dist/nodes/Drift/Drift.node.js",
|
||||
"dist/nodes/Dropbox/Dropbox.node.js",
|
||||
"dist/nodes/Dropcontact/Dropcontact.node.js",
|
||||
"dist/nodes/EditImage/EditImage.node.js",
|
||||
"dist/nodes/E2eTest/E2eTest.node.js",
|
||||
"dist/nodes/Egoi/Egoi.node.js",
|
||||
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
|
||||
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
|
||||
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
|
||||
"dist/nodes/EmailSend/EmailSend.node.js",
|
||||
"dist/nodes/Emelia/Emelia.node.js",
|
||||
"dist/nodes/Emelia/EmeliaTrigger.node.js",
|
||||
"dist/nodes/ERPNext/ERPNext.node.js",
|
||||
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
|
||||
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
|
||||
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
|
||||
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
|
||||
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
|
||||
"dist/nodes/ExecutionData/ExecutionData.node.js",
|
||||
"dist/nodes/Facebook/FacebookGraphApi.node.js",
|
||||
"dist/nodes/Facebook/FacebookTrigger.node.js",
|
||||
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
|
||||
"dist/nodes/Figma/FigmaTrigger.node.js",
|
||||
"dist/nodes/FileMaker/FileMaker.node.js",
|
||||
"dist/nodes/Filter/Filter.node.js",
|
||||
"dist/nodes/Flow/Flow.node.js",
|
||||
"dist/nodes/Flow/FlowTrigger.node.js",
|
||||
"dist/nodes/Form/FormTrigger.node.js",
|
||||
"dist/nodes/FormIo/FormIoTrigger.node.js",
|
||||
"dist/nodes/Formstack/FormstackTrigger.node.js",
|
||||
"dist/nodes/Freshdesk/Freshdesk.node.js",
|
||||
"dist/nodes/Freshservice/Freshservice.node.js",
|
||||
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
|
||||
"dist/nodes/Ftp/Ftp.node.js",
|
||||
"dist/nodes/Function/Function.node.js",
|
||||
"dist/nodes/FunctionItem/FunctionItem.node.js",
|
||||
"dist/nodes/GetResponse/GetResponse.node.js",
|
||||
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
|
||||
"dist/nodes/Ghost/Ghost.node.js",
|
||||
"dist/nodes/Git/Git.node.js",
|
||||
"dist/nodes/Github/Github.node.js",
|
||||
"dist/nodes/Github/GithubTrigger.node.js",
|
||||
"dist/nodes/Gitlab/Gitlab.node.js",
|
||||
"dist/nodes/Gitlab/GitlabTrigger.node.js",
|
||||
"dist/nodes/Google/Ads/GoogleAds.node.js",
|
||||
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
|
||||
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
|
||||
"dist/nodes/Google/Books/GoogleBooks.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
|
||||
"dist/nodes/Google/Chat/GoogleChat.node.js",
|
||||
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
|
||||
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
|
||||
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
|
||||
"dist/nodes/Google/Docs/GoogleDocs.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDrive.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
|
||||
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
|
||||
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
|
||||
"dist/nodes/Google/Gmail/Gmail.node.js",
|
||||
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
|
||||
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
|
||||
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
|
||||
"dist/nodes/Google/Slides/GoogleSlides.node.js",
|
||||
"dist/nodes/Google/Task/GoogleTasks.node.js",
|
||||
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
|
||||
"dist/nodes/Google/YouTube/YouTube.node.js",
|
||||
"dist/nodes/Gotify/Gotify.node.js",
|
||||
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
|
||||
"dist/nodes/Grafana/Grafana.node.js",
|
||||
"dist/nodes/GraphQL/GraphQL.node.js",
|
||||
"dist/nodes/Grist/Grist.node.js",
|
||||
"dist/nodes/Gumroad/GumroadTrigger.node.js",
|
||||
"dist/nodes/HackerNews/HackerNews.node.js",
|
||||
"dist/nodes/HaloPSA/HaloPSA.node.js",
|
||||
"dist/nodes/Harvest/Harvest.node.js",
|
||||
"dist/nodes/HelpScout/HelpScout.node.js",
|
||||
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
|
||||
"dist/nodes/HighLevel/HighLevel.node.js",
|
||||
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
|
||||
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
|
||||
"dist/nodes/Html/Html.node.js",
|
||||
"dist/nodes/HttpRequest/HttpRequest.node.js",
|
||||
"dist/nodes/Hubspot/Hubspot.node.js",
|
||||
"dist/nodes/Hubspot/HubspotTrigger.node.js",
|
||||
"dist/nodes/HumanticAI/HumanticAi.node.js",
|
||||
"dist/nodes/Hunter/Hunter.node.js",
|
||||
"dist/nodes/ICalendar/ICalendar.node.js",
|
||||
"dist/nodes/If/If.node.js",
|
||||
"dist/nodes/Intercom/Intercom.node.js",
|
||||
"dist/nodes/Interval/Interval.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
|
||||
"dist/nodes/ItemLists/ItemLists.node.js",
|
||||
"dist/nodes/Iterable/Iterable.node.js",
|
||||
"dist/nodes/Jenkins/Jenkins.node.js",
|
||||
"dist/nodes/Jira/Jira.node.js",
|
||||
"dist/nodes/Jira/JiraTrigger.node.js",
|
||||
"dist/nodes/JotForm/JotFormTrigger.node.js",
|
||||
"dist/nodes/Kafka/Kafka.node.js",
|
||||
"dist/nodes/Kafka/KafkaTrigger.node.js",
|
||||
"dist/nodes/Keap/Keap.node.js",
|
||||
"dist/nodes/Keap/KeapTrigger.node.js",
|
||||
"dist/nodes/Kitemaker/Kitemaker.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
|
||||
"dist/nodes/Ldap/Ldap.node.js",
|
||||
"dist/nodes/Lemlist/Lemlist.node.js",
|
||||
"dist/nodes/Lemlist/LemlistTrigger.node.js",
|
||||
"dist/nodes/Line/Line.node.js",
|
||||
"dist/nodes/Linear/Linear.node.js",
|
||||
"dist/nodes/Linear/LinearTrigger.node.js",
|
||||
"dist/nodes/LingvaNex/LingvaNex.node.js",
|
||||
"dist/nodes/LinkedIn/LinkedIn.node.js",
|
||||
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScale.node.js",
|
||||
"dist/nodes/Magento/Magento2.node.js",
|
||||
"dist/nodes/Mailcheck/Mailcheck.node.js",
|
||||
"dist/nodes/Mailchimp/Mailchimp.node.js",
|
||||
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
|
||||
"dist/nodes/MailerLite/MailerLite.node.js",
|
||||
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
|
||||
"dist/nodes/Mailgun/Mailgun.node.js",
|
||||
"dist/nodes/Mailjet/Mailjet.node.js",
|
||||
"dist/nodes/Mailjet/MailjetTrigger.node.js",
|
||||
"dist/nodes/Mandrill/Mandrill.node.js",
|
||||
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
|
||||
"dist/nodes/Markdown/Markdown.node.js",
|
||||
"dist/nodes/Marketstack/Marketstack.node.js",
|
||||
"dist/nodes/Matrix/Matrix.node.js",
|
||||
"dist/nodes/Mattermost/Mattermost.node.js",
|
||||
"dist/nodes/Mautic/Mautic.node.js",
|
||||
"dist/nodes/Mautic/MauticTrigger.node.js",
|
||||
"dist/nodes/Medium/Medium.node.js",
|
||||
"dist/nodes/Merge/Merge.node.js",
|
||||
"dist/nodes/MessageBird/MessageBird.node.js",
|
||||
"dist/nodes/Metabase/Metabase.node.js",
|
||||
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
|
||||
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
|
||||
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
|
||||
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
|
||||
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
|
||||
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
|
||||
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
|
||||
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
|
||||
"dist/nodes/Mindee/Mindee.node.js",
|
||||
"dist/nodes/Misp/Misp.node.js",
|
||||
"dist/nodes/Mocean/Mocean.node.js",
|
||||
"dist/nodes/MondayCom/MondayCom.node.js",
|
||||
"dist/nodes/MongoDb/MongoDb.node.js",
|
||||
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
|
||||
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
|
||||
"dist/nodes/MQTT/Mqtt.node.js",
|
||||
"dist/nodes/MQTT/MqttTrigger.node.js",
|
||||
"dist/nodes/Msg91/Msg91.node.js",
|
||||
"dist/nodes/MySql/MySql.node.js",
|
||||
"dist/nodes/N8n/N8n.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
|
||||
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
|
||||
"dist/nodes/Nasa/Nasa.node.js",
|
||||
"dist/nodes/Netlify/Netlify.node.js",
|
||||
"dist/nodes/Netlify/NetlifyTrigger.node.js",
|
||||
"dist/nodes/NextCloud/NextCloud.node.js",
|
||||
"dist/nodes/NocoDB/NocoDB.node.js",
|
||||
"dist/nodes/Brevo/Brevo.node.js",
|
||||
"dist/nodes/Brevo/BrevoTrigger.node.js",
|
||||
"dist/nodes/StickyNote/StickyNote.node.js",
|
||||
"dist/nodes/NoOp/NoOp.node.js",
|
||||
"dist/nodes/Onfleet/Onfleet.node.js",
|
||||
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
|
||||
"dist/nodes/Notion/Notion.node.js",
|
||||
"dist/nodes/Notion/NotionTrigger.node.js",
|
||||
"dist/nodes/Npm/Npm.node.js",
|
||||
"dist/nodes/Odoo/Odoo.node.js",
|
||||
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
|
||||
"dist/nodes/OpenAi/OpenAi.node.js",
|
||||
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
|
||||
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
|
||||
"dist/nodes/Orbit/Orbit.node.js",
|
||||
"dist/nodes/Oura/Oura.node.js",
|
||||
"dist/nodes/Paddle/Paddle.node.js",
|
||||
"dist/nodes/PagerDuty/PagerDuty.node.js",
|
||||
"dist/nodes/PayPal/PayPal.node.js",
|
||||
"dist/nodes/PayPal/PayPalTrigger.node.js",
|
||||
"dist/nodes/Peekalink/Peekalink.node.js",
|
||||
"dist/nodes/Phantombuster/Phantombuster.node.js",
|
||||
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
|
||||
"dist/nodes/Pipedrive/Pipedrive.node.js",
|
||||
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
|
||||
"dist/nodes/Plivo/Plivo.node.js",
|
||||
"dist/nodes/PostBin/PostBin.node.js",
|
||||
"dist/nodes/Postgres/Postgres.node.js",
|
||||
"dist/nodes/Postgres/PostgresTrigger.node.js",
|
||||
"dist/nodes/PostHog/PostHog.node.js",
|
||||
"dist/nodes/Postmark/PostmarkTrigger.node.js",
|
||||
"dist/nodes/ProfitWell/ProfitWell.node.js",
|
||||
"dist/nodes/Pushbullet/Pushbullet.node.js",
|
||||
"dist/nodes/Pushcut/Pushcut.node.js",
|
||||
"dist/nodes/Pushcut/PushcutTrigger.node.js",
|
||||
"dist/nodes/Pushover/Pushover.node.js",
|
||||
"dist/nodes/QuestDb/QuestDb.node.js",
|
||||
"dist/nodes/QuickBase/QuickBase.node.js",
|
||||
"dist/nodes/QuickBooks/QuickBooks.node.js",
|
||||
"dist/nodes/QuickChart/QuickChart.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
|
||||
"dist/nodes/Raindrop/Raindrop.node.js",
|
||||
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
|
||||
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
|
||||
"dist/nodes/ReadPdf/ReadPDF.node.js",
|
||||
"dist/nodes/Reddit/Reddit.node.js",
|
||||
"dist/nodes/Redis/Redis.node.js",
|
||||
"dist/nodes/Redis/RedisTrigger.node.js",
|
||||
"dist/nodes/RenameKeys/RenameKeys.node.js",
|
||||
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
|
||||
"dist/nodes/Rocketchat/Rocketchat.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
|
||||
"dist/nodes/Rundeck/Rundeck.node.js",
|
||||
"dist/nodes/S3/S3.node.js",
|
||||
"dist/nodes/Salesforce/Salesforce.node.js",
|
||||
"dist/nodes/Salesmate/Salesmate.node.js",
|
||||
"dist/nodes/Schedule/ScheduleTrigger.node.js",
|
||||
"dist/nodes/SeaTable/SeaTable.node.js",
|
||||
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
|
||||
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
|
||||
"dist/nodes/Segment/Segment.node.js",
|
||||
"dist/nodes/SendGrid/SendGrid.node.js",
|
||||
"dist/nodes/Sendy/Sendy.node.js",
|
||||
"dist/nodes/SentryIo/SentryIo.node.js",
|
||||
"dist/nodes/ServiceNow/ServiceNow.node.js",
|
||||
"dist/nodes/Set/Set.node.js",
|
||||
"dist/nodes/Shopify/Shopify.node.js",
|
||||
"dist/nodes/Shopify/ShopifyTrigger.node.js",
|
||||
"dist/nodes/Signl4/Signl4.node.js",
|
||||
"dist/nodes/Slack/Slack.node.js",
|
||||
"dist/nodes/Sms77/Sms77.node.js",
|
||||
"dist/nodes/Snowflake/Snowflake.node.js",
|
||||
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
|
||||
"dist/nodes/Splunk/Splunk.node.js",
|
||||
"dist/nodes/Spontit/Spontit.node.js",
|
||||
"dist/nodes/Spotify/Spotify.node.js",
|
||||
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
|
||||
"dist/nodes/SseTrigger/SseTrigger.node.js",
|
||||
"dist/nodes/Ssh/Ssh.node.js",
|
||||
"dist/nodes/Stackby/Stackby.node.js",
|
||||
"dist/nodes/Start/Start.node.js",
|
||||
"dist/nodes/StopAndError/StopAndError.node.js",
|
||||
"dist/nodes/Storyblok/Storyblok.node.js",
|
||||
"dist/nodes/Strapi/Strapi.node.js",
|
||||
"dist/nodes/Strava/Strava.node.js",
|
||||
"dist/nodes/Strava/StravaTrigger.node.js",
|
||||
"dist/nodes/Stripe/Stripe.node.js",
|
||||
"dist/nodes/Stripe/StripeTrigger.node.js",
|
||||
"dist/nodes/Supabase/Supabase.node.js",
|
||||
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
|
||||
"dist/nodes/Switch/Switch.node.js",
|
||||
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
|
||||
"dist/nodes/Taiga/Taiga.node.js",
|
||||
"dist/nodes/Taiga/TaigaTrigger.node.js",
|
||||
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
|
||||
"dist/nodes/Telegram/Telegram.node.js",
|
||||
"dist/nodes/Telegram/TelegramTrigger.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
|
||||
"dist/nodes/TheHive/TheHive.node.js",
|
||||
"dist/nodes/TheHive/TheHiveTrigger.node.js",
|
||||
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
|
||||
"dist/nodes/Todoist/Todoist.node.js",
|
||||
"dist/nodes/Toggl/TogglTrigger.node.js",
|
||||
"dist/nodes/Totp/Totp.node.js",
|
||||
"dist/nodes/TravisCi/TravisCi.node.js",
|
||||
"dist/nodes/Trello/Trello.node.js",
|
||||
"dist/nodes/Trello/TrelloTrigger.node.js",
|
||||
"dist/nodes/Twake/Twake.node.js",
|
||||
"dist/nodes/Twilio/Twilio.node.js",
|
||||
"dist/nodes/Twist/Twist.node.js",
|
||||
"dist/nodes/Twitter/Twitter.node.js",
|
||||
"dist/nodes/Typeform/TypeformTrigger.node.js",
|
||||
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
|
||||
"dist/nodes/Uplead/Uplead.node.js",
|
||||
"dist/nodes/UProc/UProc.node.js",
|
||||
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
|
||||
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
|
||||
"dist/nodes/Vero/Vero.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
|
||||
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
|
||||
"dist/nodes/Vonage/Vonage.node.js",
|
||||
"dist/nodes/Wait/Wait.node.js",
|
||||
"dist/nodes/Webflow/Webflow.node.js",
|
||||
"dist/nodes/Webflow/WebflowTrigger.node.js",
|
||||
"dist/nodes/Webhook/Webhook.node.js",
|
||||
"dist/nodes/Wekan/Wekan.node.js",
|
||||
"dist/nodes/WhatsApp/WhatsApp.node.js",
|
||||
"dist/nodes/Wise/Wise.node.js",
|
||||
"dist/nodes/Wise/WiseTrigger.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerce.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
|
||||
"dist/nodes/Wordpress/Wordpress.node.js",
|
||||
"dist/nodes/Workable/WorkableTrigger.node.js",
|
||||
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
|
||||
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
|
||||
"dist/nodes/Wufoo/WufooTrigger.node.js",
|
||||
"dist/nodes/Xero/Xero.node.js",
|
||||
"dist/nodes/Xml/Xml.node.js",
|
||||
"dist/nodes/Yourls/Yourls.node.js",
|
||||
"dist/nodes/Zammad/Zammad.node.js",
|
||||
"dist/nodes/Zendesk/Zendesk.node.js",
|
||||
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
|
||||
"dist/nodes/Zoho/ZohoCrm.node.js",
|
||||
"dist/nodes/Zoom/Zoom.node.js",
|
||||
"dist/nodes/Zulip/Zulip.node.js"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/amqplib": "^0.10.1",
|
||||
"@types/aws4": "^1.5.1",
|
||||
"@types/basic-auth": "^1.1.3",
|
||||
"@types/cheerio": "^0.22.15",
|
||||
"@types/cron": "~1.7.1",
|
||||
"@types/eventsource": "^1.1.2",
|
||||
"@types/express": "^4.17.6",
|
||||
"@types/gm": "^1.25.0",
|
||||
"@types/imap-simple": "^4.2.0",
|
||||
"@types/js-nacl": "^1.3.0",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/lodash": "^4.14.195",
|
||||
"@types/lossless-json": "^1.0.0",
|
||||
"@types/mailparser": "^2.7.3",
|
||||
"@types/mime-types": "^2.1.0",
|
||||
"@types/mssql": "^6.0.2",
|
||||
"@types/node-ssh": "^7.0.1",
|
||||
"@types/nodemailer": "^6.4.0",
|
||||
"@types/promise-ftp": "^1.3.4",
|
||||
"@types/redis": "^2.8.11",
|
||||
"@types/request-promise-native": "~1.0.15",
|
||||
"@types/rfc2047": "^2.0.1",
|
||||
"@types/showdown": "^1.9.4",
|
||||
"@types/snowflake-sdk": "^1.6.12",
|
||||
"@types/ssh2-sftp-client": "^5.1.0",
|
||||
"@types/tmp": "^0.2.0",
|
||||
"@types/uuid": "^8.3.2",
|
||||
"@types/xml2js": "^0.4.11",
|
||||
"eslint-plugin-n8n-nodes-base": "^1.16.0",
|
||||
"gulp": "^4.0.0",
|
||||
"n8n-core": "1.14.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@kafkajs/confluent-schema-registry": "1.0.6",
|
||||
"@n8n/vm2": "^3.9.20",
|
||||
"amqplib": "^0.10.3",
|
||||
"aws4": "^1.8.0",
|
||||
"basic-auth": "^2.0.1",
|
||||
"change-case": "^4.1.1",
|
||||
"cheerio": "1.0.0-rc.6",
|
||||
"chokidar": "3.5.2",
|
||||
"cron": "~1.7.2",
|
||||
"csv-parse": "^5.5.0",
|
||||
"currency-codes": "^2.1.0",
|
||||
"eventsource": "^2.0.2",
|
||||
"fast-glob": "^3.2.5",
|
||||
"fflate": "^0.7.0",
|
||||
"get-system-fonts": "^2.0.2",
|
||||
"gm": "^1.25.0",
|
||||
"iconv-lite": "^0.6.2",
|
||||
"ics": "^2.27.0",
|
||||
"imap-simple": "^4.3.0",
|
||||
"isbot": "^3.6.13",
|
||||
"iso-639-1": "^2.1.3",
|
||||
"js-nacl": "^1.4.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"kafkajs": "^1.14.0",
|
||||
"ldapts": "^4.2.6",
|
||||
"lodash": "^4.17.21",
|
||||
"lossless-json": "^1.0.4",
|
||||
"luxon": "^3.3.0",
|
||||
"mailparser": "^3.2.0",
|
||||
"minifaker": "^1.34.1",
|
||||
"moment": "~2.29.2",
|
||||
"moment-timezone": "^0.5.28",
|
||||
"mongodb": "^4.17.1",
|
||||
"mqtt": "^5.0.2",
|
||||
"mssql": "^8.1.2",
|
||||
"mysql2": "~2.3.0",
|
||||
"nanoid": "^3.3.6",
|
||||
"node-html-markdown": "^1.1.3",
|
||||
"node-ssh": "^12.0.0",
|
||||
"nodemailer": "^6.7.1",
|
||||
"otpauth": "^9.1.1",
|
||||
"pdfjs-dist": "^2.16.105",
|
||||
"pg": "^8.3.0",
|
||||
"pg-promise": "^10.5.8",
|
||||
"pretty-bytes": "^5.6.0",
|
||||
"promise-ftp": "^1.3.5",
|
||||
"pyodide": "^0.23.4",
|
||||
"redis": "^3.1.1",
|
||||
"rfc2047": "^4.0.1",
|
||||
"rhea": "^1.0.11",
|
||||
"rss-parser": "^3.7.0",
|
||||
"semver": "^7.5.4",
|
||||
"showdown": "^2.0.3",
|
||||
"simple-git": "^3.17.0",
|
||||
"snowflake-sdk": "^1.8.0",
|
||||
"ssh2-sftp-client": "^7.0.0",
|
||||
"tmp-promise": "^3.0.2",
|
||||
"typedi": "^0.10.0",
|
||||
"uuid": "^8.3.2",
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
|
||||
"xml2js": "^0.5.0",
|
||||
"n8n-workflow": "1.14.1"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist .turbo",
|
||||
"dev": "pnpm watch",
|
||||
"typecheck": "tsc",
|
||||
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
|
||||
"build:translations": "gulp build:translations",
|
||||
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
|
||||
"format": "prettier --write . --ignore-path ../../.prettierignore",
|
||||
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
|
||||
"lintfix": "eslint . --fix",
|
||||
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
|
||||
"test": "jest"
|
||||
}
|
||||
},
|
||||
"extraction_time_ms": 7,
|
||||
"extracted_at": "2025-06-07T17:49:22.717Z"
|
||||
}
|
||||
896
tests/extracted-nodes-db/n8n-nodes-base__If.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__If.json
Normal file
File diff suppressed because one or more lines are too long
896
tests/extracted-nodes-db/n8n-nodes-base__Slack.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__Slack.json
Normal file
@@ -0,0 +1,896 @@
|
||||
{
|
||||
"node_type": "n8n-nodes-base.Slack",
|
||||
"name": "Slack",
|
||||
"package_name": "n8n-nodes-base",
|
||||
"code_hash": "0ed10d0646f3c595406359edfa2c293dac41991cee59ad4fb3ccf2bb70eca6fc",
|
||||
"code_length": 1007,
|
||||
"source_location": "node_modules/n8n-nodes-base/dist/nodes/Slack/Slack.node.js",
|
||||
"has_credentials": false,
|
||||
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Slack = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst SlackV1_node_1 = require(\"./V1/SlackV1.node\");\nconst SlackV2_node_1 = require(\"./V2/SlackV2.node\");\nclass Slack extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'Slack',\n name: 'slack',\n icon: 'file:slack.svg',\n group: ['output'],\n subtitle: '={{$parameter[\"operation\"] + \": \" + $parameter[\"resource\"]}}',\n description: 'Consume Slack API',\n defaultVersion: 2.1,\n };\n const nodeVersions = {\n 1: new SlackV1_node_1.SlackV1(baseDescription),\n 2: new SlackV2_node_1.SlackV2(baseDescription),\n 2.1: new SlackV2_node_1.SlackV2(baseDescription),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.Slack = Slack;\n//# sourceMappingURL=Slack.node.js.map",
|
||||
"package_info": {
|
||||
"name": "n8n-nodes-base",
|
||||
"version": "1.14.1",
|
||||
"description": "Base nodes of n8n",
|
||||
"license": "SEE LICENSE IN LICENSE.md",
|
||||
"homepage": "https://n8n.io",
|
||||
"author": {
|
||||
"name": "Jan Oberhauser",
|
||||
"email": "jan@n8n.io"
|
||||
},
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/n8n-io/n8n.git"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"n8n": {
|
||||
"credentials": [
|
||||
"dist/credentials/ActionNetworkApi.credentials.js",
|
||||
"dist/credentials/ActiveCampaignApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
|
||||
"dist/credentials/AdaloApi.credentials.js",
|
||||
"dist/credentials/AffinityApi.credentials.js",
|
||||
"dist/credentials/AgileCrmApi.credentials.js",
|
||||
"dist/credentials/AirtableApi.credentials.js",
|
||||
"dist/credentials/AirtableOAuth2Api.credentials.js",
|
||||
"dist/credentials/AirtableTokenApi.credentials.js",
|
||||
"dist/credentials/AlienVaultApi.credentials.js",
|
||||
"dist/credentials/Amqp.credentials.js",
|
||||
"dist/credentials/ApiTemplateIoApi.credentials.js",
|
||||
"dist/credentials/AsanaApi.credentials.js",
|
||||
"dist/credentials/AsanaOAuth2Api.credentials.js",
|
||||
"dist/credentials/Auth0ManagementApi.credentials.js",
|
||||
"dist/credentials/AutomizyApi.credentials.js",
|
||||
"dist/credentials/AutopilotApi.credentials.js",
|
||||
"dist/credentials/Aws.credentials.js",
|
||||
"dist/credentials/BambooHrApi.credentials.js",
|
||||
"dist/credentials/BannerbearApi.credentials.js",
|
||||
"dist/credentials/BaserowApi.credentials.js",
|
||||
"dist/credentials/BeeminderApi.credentials.js",
|
||||
"dist/credentials/BitbucketApi.credentials.js",
|
||||
"dist/credentials/BitlyApi.credentials.js",
|
||||
"dist/credentials/BitlyOAuth2Api.credentials.js",
|
||||
"dist/credentials/BitwardenApi.credentials.js",
|
||||
"dist/credentials/BoxOAuth2Api.credentials.js",
|
||||
"dist/credentials/BrandfetchApi.credentials.js",
|
||||
"dist/credentials/BubbleApi.credentials.js",
|
||||
"dist/credentials/CalApi.credentials.js",
|
||||
"dist/credentials/CalendlyApi.credentials.js",
|
||||
"dist/credentials/CarbonBlackApi.credentials.js",
|
||||
"dist/credentials/ChargebeeApi.credentials.js",
|
||||
"dist/credentials/CircleCiApi.credentials.js",
|
||||
"dist/credentials/CiscoMerakiApi.credentials.js",
|
||||
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
|
||||
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
|
||||
"dist/credentials/CiscoUmbrellaApi.credentials.js",
|
||||
"dist/credentials/CitrixAdcApi.credentials.js",
|
||||
"dist/credentials/CloudflareApi.credentials.js",
|
||||
"dist/credentials/ClearbitApi.credentials.js",
|
||||
"dist/credentials/ClickUpApi.credentials.js",
|
||||
"dist/credentials/ClickUpOAuth2Api.credentials.js",
|
||||
"dist/credentials/ClockifyApi.credentials.js",
|
||||
"dist/credentials/CockpitApi.credentials.js",
|
||||
"dist/credentials/CodaApi.credentials.js",
|
||||
"dist/credentials/ContentfulApi.credentials.js",
|
||||
"dist/credentials/ConvertKitApi.credentials.js",
|
||||
"dist/credentials/CopperApi.credentials.js",
|
||||
"dist/credentials/CortexApi.credentials.js",
|
||||
"dist/credentials/CrateDb.credentials.js",
|
||||
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
|
||||
"dist/credentials/CrowdDevApi.credentials.js",
|
||||
"dist/credentials/CustomerIoApi.credentials.js",
|
||||
"dist/credentials/DeepLApi.credentials.js",
|
||||
"dist/credentials/DemioApi.credentials.js",
|
||||
"dist/credentials/DhlApi.credentials.js",
|
||||
"dist/credentials/DiscourseApi.credentials.js",
|
||||
"dist/credentials/DisqusApi.credentials.js",
|
||||
"dist/credentials/DriftApi.credentials.js",
|
||||
"dist/credentials/DriftOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropboxApi.credentials.js",
|
||||
"dist/credentials/DropboxOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropcontactApi.credentials.js",
|
||||
"dist/credentials/EgoiApi.credentials.js",
|
||||
"dist/credentials/ElasticsearchApi.credentials.js",
|
||||
"dist/credentials/ElasticSecurityApi.credentials.js",
|
||||
"dist/credentials/EmeliaApi.credentials.js",
|
||||
"dist/credentials/ERPNextApi.credentials.js",
|
||||
"dist/credentials/EventbriteApi.credentials.js",
|
||||
"dist/credentials/EventbriteOAuth2Api.credentials.js",
|
||||
"dist/credentials/F5BigIpApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphAppApi.credentials.js",
|
||||
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/FigmaApi.credentials.js",
|
||||
"dist/credentials/FileMaker.credentials.js",
|
||||
"dist/credentials/FlowApi.credentials.js",
|
||||
"dist/credentials/FormIoApi.credentials.js",
|
||||
"dist/credentials/FormstackApi.credentials.js",
|
||||
"dist/credentials/FormstackOAuth2Api.credentials.js",
|
||||
"dist/credentials/FortiGateApi.credentials.js",
|
||||
"dist/credentials/FreshdeskApi.credentials.js",
|
||||
"dist/credentials/FreshserviceApi.credentials.js",
|
||||
"dist/credentials/FreshworksCrmApi.credentials.js",
|
||||
"dist/credentials/Ftp.credentials.js",
|
||||
"dist/credentials/GetResponseApi.credentials.js",
|
||||
"dist/credentials/GetResponseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GhostAdminApi.credentials.js",
|
||||
"dist/credentials/GhostContentApi.credentials.js",
|
||||
"dist/credentials/GithubApi.credentials.js",
|
||||
"dist/credentials/GithubOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitlabApi.credentials.js",
|
||||
"dist/credentials/GitlabOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitPassword.credentials.js",
|
||||
"dist/credentials/GmailOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleApi.credentials.js",
|
||||
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleOAuth2Api.credentials.js",
|
||||
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
|
||||
"dist/credentials/GotifyApi.credentials.js",
|
||||
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GristApi.credentials.js",
|
||||
"dist/credentials/GrafanaApi.credentials.js",
|
||||
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
|
||||
"dist/credentials/GumroadApi.credentials.js",
|
||||
"dist/credentials/HaloPSAApi.credentials.js",
|
||||
"dist/credentials/HarvestApi.credentials.js",
|
||||
"dist/credentials/HarvestOAuth2Api.credentials.js",
|
||||
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
|
||||
"dist/credentials/HighLevelApi.credentials.js",
|
||||
"dist/credentials/HomeAssistantApi.credentials.js",
|
||||
"dist/credentials/HttpBasicAuth.credentials.js",
|
||||
"dist/credentials/HttpDigestAuth.credentials.js",
|
||||
"dist/credentials/HttpHeaderAuth.credentials.js",
|
||||
"dist/credentials/HttpCustomAuth.credentials.js",
|
||||
"dist/credentials/HttpQueryAuth.credentials.js",
|
||||
"dist/credentials/HubspotApi.credentials.js",
|
||||
"dist/credentials/HubspotAppToken.credentials.js",
|
||||
"dist/credentials/HubspotDeveloperApi.credentials.js",
|
||||
"dist/credentials/HubspotOAuth2Api.credentials.js",
|
||||
"dist/credentials/HumanticAiApi.credentials.js",
|
||||
"dist/credentials/HunterApi.credentials.js",
|
||||
"dist/credentials/HybridAnalysisApi.credentials.js",
|
||||
"dist/credentials/Imap.credentials.js",
|
||||
"dist/credentials/ImpervaWafApi.credentials.js",
|
||||
"dist/credentials/IntercomApi.credentials.js",
|
||||
"dist/credentials/InvoiceNinjaApi.credentials.js",
|
||||
"dist/credentials/IterableApi.credentials.js",
|
||||
"dist/credentials/JenkinsApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareServerApi.credentials.js",
|
||||
"dist/credentials/JotFormApi.credentials.js",
|
||||
"dist/credentials/Kafka.credentials.js",
|
||||
"dist/credentials/KeapOAuth2Api.credentials.js",
|
||||
"dist/credentials/KibanaApi.credentials.js",
|
||||
"dist/credentials/KitemakerApi.credentials.js",
|
||||
"dist/credentials/KoBoToolboxApi.credentials.js",
|
||||
"dist/credentials/Ldap.credentials.js",
|
||||
"dist/credentials/LemlistApi.credentials.js",
|
||||
"dist/credentials/LinearApi.credentials.js",
|
||||
"dist/credentials/LinearOAuth2Api.credentials.js",
|
||||
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/LingvaNexApi.credentials.js",
|
||||
"dist/credentials/LinkedInOAuth2Api.credentials.js",
|
||||
"dist/credentials/LoneScaleApi.credentials.js",
|
||||
"dist/credentials/Magento2Api.credentials.js",
|
||||
"dist/credentials/MailcheckApi.credentials.js",
|
||||
"dist/credentials/MailchimpApi.credentials.js",
|
||||
"dist/credentials/MailchimpOAuth2Api.credentials.js",
|
||||
"dist/credentials/MailerLiteApi.credentials.js",
|
||||
"dist/credentials/MailgunApi.credentials.js",
|
||||
"dist/credentials/MailjetEmailApi.credentials.js",
|
||||
"dist/credentials/MailjetSmsApi.credentials.js",
|
||||
"dist/credentials/MandrillApi.credentials.js",
|
||||
"dist/credentials/MarketstackApi.credentials.js",
|
||||
"dist/credentials/MatrixApi.credentials.js",
|
||||
"dist/credentials/MattermostApi.credentials.js",
|
||||
"dist/credentials/MauticApi.credentials.js",
|
||||
"dist/credentials/MauticOAuth2Api.credentials.js",
|
||||
"dist/credentials/MediumApi.credentials.js",
|
||||
"dist/credentials/MediumOAuth2Api.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MessageBirdApi.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftSql.credentials.js",
|
||||
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
|
||||
"dist/credentials/MindeeInvoiceApi.credentials.js",
|
||||
"dist/credentials/MindeeReceiptApi.credentials.js",
|
||||
"dist/credentials/MispApi.credentials.js",
|
||||
"dist/credentials/MistApi.credentials.js",
|
||||
"dist/credentials/MoceanApi.credentials.js",
|
||||
"dist/credentials/MondayComApi.credentials.js",
|
||||
"dist/credentials/MondayComOAuth2Api.credentials.js",
|
||||
"dist/credentials/MongoDb.credentials.js",
|
||||
"dist/credentials/MonicaCrmApi.credentials.js",
|
||||
"dist/credentials/Mqtt.credentials.js",
|
||||
"dist/credentials/Msg91Api.credentials.js",
|
||||
"dist/credentials/MySql.credentials.js",
|
||||
"dist/credentials/N8nApi.credentials.js",
|
||||
"dist/credentials/NasaApi.credentials.js",
|
||||
"dist/credentials/NetlifyApi.credentials.js",
|
||||
"dist/credentials/NextCloudApi.credentials.js",
|
||||
"dist/credentials/NextCloudOAuth2Api.credentials.js",
|
||||
"dist/credentials/NocoDb.credentials.js",
|
||||
"dist/credentials/NocoDbApiToken.credentials.js",
|
||||
"dist/credentials/NotionApi.credentials.js",
|
||||
"dist/credentials/NotionOAuth2Api.credentials.js",
|
||||
"dist/credentials/NpmApi.credentials.js",
|
||||
"dist/credentials/OAuth1Api.credentials.js",
|
||||
"dist/credentials/OAuth2Api.credentials.js",
|
||||
"dist/credentials/OdooApi.credentials.js",
|
||||
"dist/credentials/OktaApi.credentials.js",
|
||||
"dist/credentials/OneSimpleApi.credentials.js",
|
||||
"dist/credentials/OnfleetApi.credentials.js",
|
||||
"dist/credentials/OpenAiApi.credentials.js",
|
||||
"dist/credentials/OpenCTIApi.credentials.js",
|
||||
"dist/credentials/OpenWeatherMapApi.credentials.js",
|
||||
"dist/credentials/OrbitApi.credentials.js",
|
||||
"dist/credentials/OuraApi.credentials.js",
|
||||
"dist/credentials/PaddleApi.credentials.js",
|
||||
"dist/credentials/PagerDutyApi.credentials.js",
|
||||
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
|
||||
"dist/credentials/PayPalApi.credentials.js",
|
||||
"dist/credentials/PeekalinkApi.credentials.js",
|
||||
"dist/credentials/PhantombusterApi.credentials.js",
|
||||
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
|
||||
"dist/credentials/PipedriveApi.credentials.js",
|
||||
"dist/credentials/PipedriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/PlivoApi.credentials.js",
|
||||
"dist/credentials/Postgres.credentials.js",
|
||||
"dist/credentials/PostHogApi.credentials.js",
|
||||
"dist/credentials/PostmarkApi.credentials.js",
|
||||
"dist/credentials/ProfitWellApi.credentials.js",
|
||||
"dist/credentials/PushbulletOAuth2Api.credentials.js",
|
||||
"dist/credentials/PushcutApi.credentials.js",
|
||||
"dist/credentials/PushoverApi.credentials.js",
|
||||
"dist/credentials/QRadarApi.credentials.js",
|
||||
"dist/credentials/QualysApi.credentials.js",
|
||||
"dist/credentials/QuestDb.credentials.js",
|
||||
"dist/credentials/QuickBaseApi.credentials.js",
|
||||
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/RabbitMQ.credentials.js",
|
||||
"dist/credentials/RaindropOAuth2Api.credentials.js",
|
||||
"dist/credentials/RecordedFutureApi.credentials.js",
|
||||
"dist/credentials/RedditOAuth2Api.credentials.js",
|
||||
"dist/credentials/Redis.credentials.js",
|
||||
"dist/credentials/RocketchatApi.credentials.js",
|
||||
"dist/credentials/RundeckApi.credentials.js",
|
||||
"dist/credentials/S3.credentials.js",
|
||||
"dist/credentials/SalesforceJwtApi.credentials.js",
|
||||
"dist/credentials/SalesforceOAuth2Api.credentials.js",
|
||||
"dist/credentials/SalesmateApi.credentials.js",
|
||||
"dist/credentials/SeaTableApi.credentials.js",
|
||||
"dist/credentials/SecurityScorecardApi.credentials.js",
|
||||
"dist/credentials/SegmentApi.credentials.js",
|
||||
"dist/credentials/SekoiaApi.credentials.js",
|
||||
"dist/credentials/SendGridApi.credentials.js",
|
||||
"dist/credentials/BrevoApi.credentials.js",
|
||||
"dist/credentials/SendyApi.credentials.js",
|
||||
"dist/credentials/SentryIoApi.credentials.js",
|
||||
"dist/credentials/SentryIoOAuth2Api.credentials.js",
|
||||
"dist/credentials/SentryIoServerApi.credentials.js",
|
||||
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
|
||||
"dist/credentials/ServiceNowBasicApi.credentials.js",
|
||||
"dist/credentials/Sftp.credentials.js",
|
||||
"dist/credentials/ShopifyApi.credentials.js",
|
||||
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
|
||||
"dist/credentials/ShopifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/Signl4Api.credentials.js",
|
||||
"dist/credentials/SlackApi.credentials.js",
|
||||
"dist/credentials/SlackOAuth2Api.credentials.js",
|
||||
"dist/credentials/Sms77Api.credentials.js",
|
||||
"dist/credentials/Smtp.credentials.js",
|
||||
"dist/credentials/Snowflake.credentials.js",
|
||||
"dist/credentials/SplunkApi.credentials.js",
|
||||
"dist/credentials/SpontitApi.credentials.js",
|
||||
"dist/credentials/SpotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/ShufflerApi.credentials.js",
|
||||
"dist/credentials/SshPassword.credentials.js",
|
||||
"dist/credentials/SshPrivateKey.credentials.js",
|
||||
"dist/credentials/StackbyApi.credentials.js",
|
||||
"dist/credentials/StoryblokContentApi.credentials.js",
|
||||
"dist/credentials/StoryblokManagementApi.credentials.js",
|
||||
"dist/credentials/StrapiApi.credentials.js",
|
||||
"dist/credentials/StrapiTokenApi.credentials.js",
|
||||
"dist/credentials/StravaOAuth2Api.credentials.js",
|
||||
"dist/credentials/StripeApi.credentials.js",
|
||||
"dist/credentials/SupabaseApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
|
||||
"dist/credentials/SyncroMspApi.credentials.js",
|
||||
"dist/credentials/TaigaApi.credentials.js",
|
||||
"dist/credentials/TapfiliateApi.credentials.js",
|
||||
"dist/credentials/TelegramApi.credentials.js",
|
||||
"dist/credentials/TheHiveProjectApi.credentials.js",
|
||||
"dist/credentials/TheHiveApi.credentials.js",
|
||||
"dist/credentials/TimescaleDb.credentials.js",
|
||||
"dist/credentials/TodoistApi.credentials.js",
|
||||
"dist/credentials/TodoistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TogglApi.credentials.js",
|
||||
"dist/credentials/TotpApi.credentials.js",
|
||||
"dist/credentials/TravisCiApi.credentials.js",
|
||||
"dist/credentials/TrellixEpoApi.credentials.js",
|
||||
"dist/credentials/TrelloApi.credentials.js",
|
||||
"dist/credentials/TwakeCloudApi.credentials.js",
|
||||
"dist/credentials/TwakeServerApi.credentials.js",
|
||||
"dist/credentials/TwilioApi.credentials.js",
|
||||
"dist/credentials/TwistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth1Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth2Api.credentials.js",
|
||||
"dist/credentials/TypeformApi.credentials.js",
|
||||
"dist/credentials/TypeformOAuth2Api.credentials.js",
|
||||
"dist/credentials/UnleashedSoftwareApi.credentials.js",
|
||||
"dist/credentials/UpleadApi.credentials.js",
|
||||
"dist/credentials/UProcApi.credentials.js",
|
||||
"dist/credentials/UptimeRobotApi.credentials.js",
|
||||
"dist/credentials/UrlScanIoApi.credentials.js",
|
||||
"dist/credentials/VeroApi.credentials.js",
|
||||
"dist/credentials/VirusTotalApi.credentials.js",
|
||||
"dist/credentials/VonageApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
|
||||
"dist/credentials/WebflowApi.credentials.js",
|
||||
"dist/credentials/WebflowOAuth2Api.credentials.js",
|
||||
"dist/credentials/WekanApi.credentials.js",
|
||||
"dist/credentials/WhatsAppApi.credentials.js",
|
||||
"dist/credentials/WiseApi.credentials.js",
|
||||
"dist/credentials/WooCommerceApi.credentials.js",
|
||||
"dist/credentials/WordpressApi.credentials.js",
|
||||
"dist/credentials/WorkableApi.credentials.js",
|
||||
"dist/credentials/WufooApi.credentials.js",
|
||||
"dist/credentials/XeroOAuth2Api.credentials.js",
|
||||
"dist/credentials/YourlsApi.credentials.js",
|
||||
"dist/credentials/YouTubeOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZammadBasicAuthApi.credentials.js",
|
||||
"dist/credentials/ZammadTokenAuthApi.credentials.js",
|
||||
"dist/credentials/ZendeskApi.credentials.js",
|
||||
"dist/credentials/ZendeskOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZohoOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZoomApi.credentials.js",
|
||||
"dist/credentials/ZoomOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZscalerZiaApi.credentials.js",
|
||||
"dist/credentials/ZulipApi.credentials.js"
|
||||
],
|
||||
"nodes": [
|
||||
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
|
||||
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
|
||||
"dist/nodes/Adalo/Adalo.node.js",
|
||||
"dist/nodes/Affinity/Affinity.node.js",
|
||||
"dist/nodes/Affinity/AffinityTrigger.node.js",
|
||||
"dist/nodes/AgileCrm/AgileCrm.node.js",
|
||||
"dist/nodes/Airtable/Airtable.node.js",
|
||||
"dist/nodes/Airtable/AirtableTrigger.node.js",
|
||||
"dist/nodes/Amqp/Amqp.node.js",
|
||||
"dist/nodes/Amqp/AmqpTrigger.node.js",
|
||||
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
|
||||
"dist/nodes/Asana/Asana.node.js",
|
||||
"dist/nodes/Asana/AsanaTrigger.node.js",
|
||||
"dist/nodes/Automizy/Automizy.node.js",
|
||||
"dist/nodes/Autopilot/Autopilot.node.js",
|
||||
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
|
||||
"dist/nodes/Aws/AwsLambda.node.js",
|
||||
"dist/nodes/Aws/AwsSns.node.js",
|
||||
"dist/nodes/Aws/AwsSnsTrigger.node.js",
|
||||
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
|
||||
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
|
||||
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
|
||||
"dist/nodes/Aws/ELB/AwsElb.node.js",
|
||||
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
|
||||
"dist/nodes/Aws/S3/AwsS3.node.js",
|
||||
"dist/nodes/Aws/SES/AwsSes.node.js",
|
||||
"dist/nodes/Aws/SQS/AwsSqs.node.js",
|
||||
"dist/nodes/Aws/Textract/AwsTextract.node.js",
|
||||
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
|
||||
"dist/nodes/BambooHr/BambooHr.node.js",
|
||||
"dist/nodes/Bannerbear/Bannerbear.node.js",
|
||||
"dist/nodes/Baserow/Baserow.node.js",
|
||||
"dist/nodes/Beeminder/Beeminder.node.js",
|
||||
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
|
||||
"dist/nodes/Bitly/Bitly.node.js",
|
||||
"dist/nodes/Bitwarden/Bitwarden.node.js",
|
||||
"dist/nodes/Box/Box.node.js",
|
||||
"dist/nodes/Box/BoxTrigger.node.js",
|
||||
"dist/nodes/Brandfetch/Brandfetch.node.js",
|
||||
"dist/nodes/Bubble/Bubble.node.js",
|
||||
"dist/nodes/Cal/CalTrigger.node.js",
|
||||
"dist/nodes/Calendly/CalendlyTrigger.node.js",
|
||||
"dist/nodes/Chargebee/Chargebee.node.js",
|
||||
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
|
||||
"dist/nodes/CircleCi/CircleCi.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
|
||||
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
|
||||
"dist/nodes/Cloudflare/Cloudflare.node.js",
|
||||
"dist/nodes/Clearbit/Clearbit.node.js",
|
||||
"dist/nodes/ClickUp/ClickUp.node.js",
|
||||
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
|
||||
"dist/nodes/Clockify/Clockify.node.js",
|
||||
"dist/nodes/Clockify/ClockifyTrigger.node.js",
|
||||
"dist/nodes/Cockpit/Cockpit.node.js",
|
||||
"dist/nodes/Coda/Coda.node.js",
|
||||
"dist/nodes/Code/Code.node.js",
|
||||
"dist/nodes/CoinGecko/CoinGecko.node.js",
|
||||
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
|
||||
"dist/nodes/Compression/Compression.node.js",
|
||||
"dist/nodes/Contentful/Contentful.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKit.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
|
||||
"dist/nodes/Copper/Copper.node.js",
|
||||
"dist/nodes/Copper/CopperTrigger.node.js",
|
||||
"dist/nodes/Cortex/Cortex.node.js",
|
||||
"dist/nodes/CrateDb/CrateDb.node.js",
|
||||
"dist/nodes/Cron/Cron.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDev.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
|
||||
"dist/nodes/Crypto/Crypto.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIo.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
|
||||
"dist/nodes/DateTime/DateTime.node.js",
|
||||
"dist/nodes/DebugHelper/DebugHelper.node.js",
|
||||
"dist/nodes/DeepL/DeepL.node.js",
|
||||
"dist/nodes/Demio/Demio.node.js",
|
||||
"dist/nodes/Dhl/Dhl.node.js",
|
||||
"dist/nodes/Discord/Discord.node.js",
|
||||
"dist/nodes/Discourse/Discourse.node.js",
|
||||
"dist/nodes/Disqus/Disqus.node.js",
|
||||
"dist/nodes/Drift/Drift.node.js",
|
||||
"dist/nodes/Dropbox/Dropbox.node.js",
|
||||
"dist/nodes/Dropcontact/Dropcontact.node.js",
|
||||
"dist/nodes/EditImage/EditImage.node.js",
|
||||
"dist/nodes/E2eTest/E2eTest.node.js",
|
||||
"dist/nodes/Egoi/Egoi.node.js",
|
||||
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
|
||||
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
|
||||
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
|
||||
"dist/nodes/EmailSend/EmailSend.node.js",
|
||||
"dist/nodes/Emelia/Emelia.node.js",
|
||||
"dist/nodes/Emelia/EmeliaTrigger.node.js",
|
||||
"dist/nodes/ERPNext/ERPNext.node.js",
|
||||
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
|
||||
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
|
||||
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
|
||||
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
|
||||
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
|
||||
"dist/nodes/ExecutionData/ExecutionData.node.js",
|
||||
"dist/nodes/Facebook/FacebookGraphApi.node.js",
|
||||
"dist/nodes/Facebook/FacebookTrigger.node.js",
|
||||
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
|
||||
"dist/nodes/Figma/FigmaTrigger.node.js",
|
||||
"dist/nodes/FileMaker/FileMaker.node.js",
|
||||
"dist/nodes/Filter/Filter.node.js",
|
||||
"dist/nodes/Flow/Flow.node.js",
|
||||
"dist/nodes/Flow/FlowTrigger.node.js",
|
||||
"dist/nodes/Form/FormTrigger.node.js",
|
||||
"dist/nodes/FormIo/FormIoTrigger.node.js",
|
||||
"dist/nodes/Formstack/FormstackTrigger.node.js",
|
||||
"dist/nodes/Freshdesk/Freshdesk.node.js",
|
||||
"dist/nodes/Freshservice/Freshservice.node.js",
|
||||
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
|
||||
"dist/nodes/Ftp/Ftp.node.js",
|
||||
"dist/nodes/Function/Function.node.js",
|
||||
"dist/nodes/FunctionItem/FunctionItem.node.js",
|
||||
"dist/nodes/GetResponse/GetResponse.node.js",
|
||||
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
|
||||
"dist/nodes/Ghost/Ghost.node.js",
|
||||
"dist/nodes/Git/Git.node.js",
|
||||
"dist/nodes/Github/Github.node.js",
|
||||
"dist/nodes/Github/GithubTrigger.node.js",
|
||||
"dist/nodes/Gitlab/Gitlab.node.js",
|
||||
"dist/nodes/Gitlab/GitlabTrigger.node.js",
|
||||
"dist/nodes/Google/Ads/GoogleAds.node.js",
|
||||
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
|
||||
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
|
||||
"dist/nodes/Google/Books/GoogleBooks.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
|
||||
"dist/nodes/Google/Chat/GoogleChat.node.js",
|
||||
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
|
||||
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
|
||||
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
|
||||
"dist/nodes/Google/Docs/GoogleDocs.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDrive.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
|
||||
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
|
||||
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
|
||||
"dist/nodes/Google/Gmail/Gmail.node.js",
|
||||
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
|
||||
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
|
||||
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
|
||||
"dist/nodes/Google/Slides/GoogleSlides.node.js",
|
||||
"dist/nodes/Google/Task/GoogleTasks.node.js",
|
||||
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
|
||||
"dist/nodes/Google/YouTube/YouTube.node.js",
|
||||
"dist/nodes/Gotify/Gotify.node.js",
|
||||
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
|
||||
"dist/nodes/Grafana/Grafana.node.js",
|
||||
"dist/nodes/GraphQL/GraphQL.node.js",
|
||||
"dist/nodes/Grist/Grist.node.js",
|
||||
"dist/nodes/Gumroad/GumroadTrigger.node.js",
|
||||
"dist/nodes/HackerNews/HackerNews.node.js",
|
||||
"dist/nodes/HaloPSA/HaloPSA.node.js",
|
||||
"dist/nodes/Harvest/Harvest.node.js",
|
||||
"dist/nodes/HelpScout/HelpScout.node.js",
|
||||
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
|
||||
"dist/nodes/HighLevel/HighLevel.node.js",
|
||||
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
|
||||
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
|
||||
"dist/nodes/Html/Html.node.js",
|
||||
"dist/nodes/HttpRequest/HttpRequest.node.js",
|
||||
"dist/nodes/Hubspot/Hubspot.node.js",
|
||||
"dist/nodes/Hubspot/HubspotTrigger.node.js",
|
||||
"dist/nodes/HumanticAI/HumanticAi.node.js",
|
||||
"dist/nodes/Hunter/Hunter.node.js",
|
||||
"dist/nodes/ICalendar/ICalendar.node.js",
|
||||
"dist/nodes/If/If.node.js",
|
||||
"dist/nodes/Intercom/Intercom.node.js",
|
||||
"dist/nodes/Interval/Interval.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
|
||||
"dist/nodes/ItemLists/ItemLists.node.js",
|
||||
"dist/nodes/Iterable/Iterable.node.js",
|
||||
"dist/nodes/Jenkins/Jenkins.node.js",
|
||||
"dist/nodes/Jira/Jira.node.js",
|
||||
"dist/nodes/Jira/JiraTrigger.node.js",
|
||||
"dist/nodes/JotForm/JotFormTrigger.node.js",
|
||||
"dist/nodes/Kafka/Kafka.node.js",
|
||||
"dist/nodes/Kafka/KafkaTrigger.node.js",
|
||||
"dist/nodes/Keap/Keap.node.js",
|
||||
"dist/nodes/Keap/KeapTrigger.node.js",
|
||||
"dist/nodes/Kitemaker/Kitemaker.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
|
||||
"dist/nodes/Ldap/Ldap.node.js",
|
||||
"dist/nodes/Lemlist/Lemlist.node.js",
|
||||
"dist/nodes/Lemlist/LemlistTrigger.node.js",
|
||||
"dist/nodes/Line/Line.node.js",
|
||||
"dist/nodes/Linear/Linear.node.js",
|
||||
"dist/nodes/Linear/LinearTrigger.node.js",
|
||||
"dist/nodes/LingvaNex/LingvaNex.node.js",
|
||||
"dist/nodes/LinkedIn/LinkedIn.node.js",
|
||||
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScale.node.js",
|
||||
"dist/nodes/Magento/Magento2.node.js",
|
||||
"dist/nodes/Mailcheck/Mailcheck.node.js",
|
||||
"dist/nodes/Mailchimp/Mailchimp.node.js",
|
||||
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
|
||||
"dist/nodes/MailerLite/MailerLite.node.js",
|
||||
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
|
||||
"dist/nodes/Mailgun/Mailgun.node.js",
|
||||
"dist/nodes/Mailjet/Mailjet.node.js",
|
||||
"dist/nodes/Mailjet/MailjetTrigger.node.js",
|
||||
"dist/nodes/Mandrill/Mandrill.node.js",
|
||||
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
|
||||
"dist/nodes/Markdown/Markdown.node.js",
|
||||
"dist/nodes/Marketstack/Marketstack.node.js",
|
||||
"dist/nodes/Matrix/Matrix.node.js",
|
||||
"dist/nodes/Mattermost/Mattermost.node.js",
|
||||
"dist/nodes/Mautic/Mautic.node.js",
|
||||
"dist/nodes/Mautic/MauticTrigger.node.js",
|
||||
"dist/nodes/Medium/Medium.node.js",
|
||||
"dist/nodes/Merge/Merge.node.js",
|
||||
"dist/nodes/MessageBird/MessageBird.node.js",
|
||||
"dist/nodes/Metabase/Metabase.node.js",
|
||||
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
|
||||
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
|
||||
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
|
||||
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
|
||||
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
|
||||
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
|
||||
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
|
||||
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
|
||||
"dist/nodes/Mindee/Mindee.node.js",
|
||||
"dist/nodes/Misp/Misp.node.js",
|
||||
"dist/nodes/Mocean/Mocean.node.js",
|
||||
"dist/nodes/MondayCom/MondayCom.node.js",
|
||||
"dist/nodes/MongoDb/MongoDb.node.js",
|
||||
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
|
||||
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
|
||||
"dist/nodes/MQTT/Mqtt.node.js",
|
||||
"dist/nodes/MQTT/MqttTrigger.node.js",
|
||||
"dist/nodes/Msg91/Msg91.node.js",
|
||||
"dist/nodes/MySql/MySql.node.js",
|
||||
"dist/nodes/N8n/N8n.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
|
||||
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
|
||||
"dist/nodes/Nasa/Nasa.node.js",
|
||||
"dist/nodes/Netlify/Netlify.node.js",
|
||||
"dist/nodes/Netlify/NetlifyTrigger.node.js",
|
||||
"dist/nodes/NextCloud/NextCloud.node.js",
|
||||
"dist/nodes/NocoDB/NocoDB.node.js",
|
||||
"dist/nodes/Brevo/Brevo.node.js",
|
||||
"dist/nodes/Brevo/BrevoTrigger.node.js",
|
||||
"dist/nodes/StickyNote/StickyNote.node.js",
|
||||
"dist/nodes/NoOp/NoOp.node.js",
|
||||
"dist/nodes/Onfleet/Onfleet.node.js",
|
||||
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
|
||||
"dist/nodes/Notion/Notion.node.js",
|
||||
"dist/nodes/Notion/NotionTrigger.node.js",
|
||||
"dist/nodes/Npm/Npm.node.js",
|
||||
"dist/nodes/Odoo/Odoo.node.js",
|
||||
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
|
||||
"dist/nodes/OpenAi/OpenAi.node.js",
|
||||
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
|
||||
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
|
||||
"dist/nodes/Orbit/Orbit.node.js",
|
||||
"dist/nodes/Oura/Oura.node.js",
|
||||
"dist/nodes/Paddle/Paddle.node.js",
|
||||
"dist/nodes/PagerDuty/PagerDuty.node.js",
|
||||
"dist/nodes/PayPal/PayPal.node.js",
|
||||
"dist/nodes/PayPal/PayPalTrigger.node.js",
|
||||
"dist/nodes/Peekalink/Peekalink.node.js",
|
||||
"dist/nodes/Phantombuster/Phantombuster.node.js",
|
||||
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
|
||||
"dist/nodes/Pipedrive/Pipedrive.node.js",
|
||||
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
|
||||
"dist/nodes/Plivo/Plivo.node.js",
|
||||
"dist/nodes/PostBin/PostBin.node.js",
|
||||
"dist/nodes/Postgres/Postgres.node.js",
|
||||
"dist/nodes/Postgres/PostgresTrigger.node.js",
|
||||
"dist/nodes/PostHog/PostHog.node.js",
|
||||
"dist/nodes/Postmark/PostmarkTrigger.node.js",
|
||||
"dist/nodes/ProfitWell/ProfitWell.node.js",
|
||||
"dist/nodes/Pushbullet/Pushbullet.node.js",
|
||||
"dist/nodes/Pushcut/Pushcut.node.js",
|
||||
"dist/nodes/Pushcut/PushcutTrigger.node.js",
|
||||
"dist/nodes/Pushover/Pushover.node.js",
|
||||
"dist/nodes/QuestDb/QuestDb.node.js",
|
||||
"dist/nodes/QuickBase/QuickBase.node.js",
|
||||
"dist/nodes/QuickBooks/QuickBooks.node.js",
|
||||
"dist/nodes/QuickChart/QuickChart.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
|
||||
"dist/nodes/Raindrop/Raindrop.node.js",
|
||||
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
|
||||
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
|
||||
"dist/nodes/ReadPdf/ReadPDF.node.js",
|
||||
"dist/nodes/Reddit/Reddit.node.js",
|
||||
"dist/nodes/Redis/Redis.node.js",
|
||||
"dist/nodes/Redis/RedisTrigger.node.js",
|
||||
"dist/nodes/RenameKeys/RenameKeys.node.js",
|
||||
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
|
||||
"dist/nodes/Rocketchat/Rocketchat.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
|
||||
"dist/nodes/Rundeck/Rundeck.node.js",
|
||||
"dist/nodes/S3/S3.node.js",
|
||||
"dist/nodes/Salesforce/Salesforce.node.js",
|
||||
"dist/nodes/Salesmate/Salesmate.node.js",
|
||||
"dist/nodes/Schedule/ScheduleTrigger.node.js",
|
||||
"dist/nodes/SeaTable/SeaTable.node.js",
|
||||
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
|
||||
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
|
||||
"dist/nodes/Segment/Segment.node.js",
|
||||
"dist/nodes/SendGrid/SendGrid.node.js",
|
||||
"dist/nodes/Sendy/Sendy.node.js",
|
||||
"dist/nodes/SentryIo/SentryIo.node.js",
|
||||
"dist/nodes/ServiceNow/ServiceNow.node.js",
|
||||
"dist/nodes/Set/Set.node.js",
|
||||
"dist/nodes/Shopify/Shopify.node.js",
|
||||
"dist/nodes/Shopify/ShopifyTrigger.node.js",
|
||||
"dist/nodes/Signl4/Signl4.node.js",
|
||||
"dist/nodes/Slack/Slack.node.js",
|
||||
"dist/nodes/Sms77/Sms77.node.js",
|
||||
"dist/nodes/Snowflake/Snowflake.node.js",
|
||||
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
|
||||
"dist/nodes/Splunk/Splunk.node.js",
|
||||
"dist/nodes/Spontit/Spontit.node.js",
|
||||
"dist/nodes/Spotify/Spotify.node.js",
|
||||
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
|
||||
"dist/nodes/SseTrigger/SseTrigger.node.js",
|
||||
"dist/nodes/Ssh/Ssh.node.js",
|
||||
"dist/nodes/Stackby/Stackby.node.js",
|
||||
"dist/nodes/Start/Start.node.js",
|
||||
"dist/nodes/StopAndError/StopAndError.node.js",
|
||||
"dist/nodes/Storyblok/Storyblok.node.js",
|
||||
"dist/nodes/Strapi/Strapi.node.js",
|
||||
"dist/nodes/Strava/Strava.node.js",
|
||||
"dist/nodes/Strava/StravaTrigger.node.js",
|
||||
"dist/nodes/Stripe/Stripe.node.js",
|
||||
"dist/nodes/Stripe/StripeTrigger.node.js",
|
||||
"dist/nodes/Supabase/Supabase.node.js",
|
||||
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
|
||||
"dist/nodes/Switch/Switch.node.js",
|
||||
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
|
||||
"dist/nodes/Taiga/Taiga.node.js",
|
||||
"dist/nodes/Taiga/TaigaTrigger.node.js",
|
||||
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
|
||||
"dist/nodes/Telegram/Telegram.node.js",
|
||||
"dist/nodes/Telegram/TelegramTrigger.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
|
||||
"dist/nodes/TheHive/TheHive.node.js",
|
||||
"dist/nodes/TheHive/TheHiveTrigger.node.js",
|
||||
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
|
||||
"dist/nodes/Todoist/Todoist.node.js",
|
||||
"dist/nodes/Toggl/TogglTrigger.node.js",
|
||||
"dist/nodes/Totp/Totp.node.js",
|
||||
"dist/nodes/TravisCi/TravisCi.node.js",
|
||||
"dist/nodes/Trello/Trello.node.js",
|
||||
"dist/nodes/Trello/TrelloTrigger.node.js",
|
||||
"dist/nodes/Twake/Twake.node.js",
|
||||
"dist/nodes/Twilio/Twilio.node.js",
|
||||
"dist/nodes/Twist/Twist.node.js",
|
||||
"dist/nodes/Twitter/Twitter.node.js",
|
||||
"dist/nodes/Typeform/TypeformTrigger.node.js",
|
||||
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
|
||||
"dist/nodes/Uplead/Uplead.node.js",
|
||||
"dist/nodes/UProc/UProc.node.js",
|
||||
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
|
||||
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
|
||||
"dist/nodes/Vero/Vero.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
|
||||
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
|
||||
"dist/nodes/Vonage/Vonage.node.js",
|
||||
"dist/nodes/Wait/Wait.node.js",
|
||||
"dist/nodes/Webflow/Webflow.node.js",
|
||||
"dist/nodes/Webflow/WebflowTrigger.node.js",
|
||||
"dist/nodes/Webhook/Webhook.node.js",
|
||||
"dist/nodes/Wekan/Wekan.node.js",
|
||||
"dist/nodes/WhatsApp/WhatsApp.node.js",
|
||||
"dist/nodes/Wise/Wise.node.js",
|
||||
"dist/nodes/Wise/WiseTrigger.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerce.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
|
||||
"dist/nodes/Wordpress/Wordpress.node.js",
|
||||
"dist/nodes/Workable/WorkableTrigger.node.js",
|
||||
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
|
||||
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
|
||||
"dist/nodes/Wufoo/WufooTrigger.node.js",
|
||||
"dist/nodes/Xero/Xero.node.js",
|
||||
"dist/nodes/Xml/Xml.node.js",
|
||||
"dist/nodes/Yourls/Yourls.node.js",
|
||||
"dist/nodes/Zammad/Zammad.node.js",
|
||||
"dist/nodes/Zendesk/Zendesk.node.js",
|
||||
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
|
||||
"dist/nodes/Zoho/ZohoCrm.node.js",
|
||||
"dist/nodes/Zoom/Zoom.node.js",
|
||||
"dist/nodes/Zulip/Zulip.node.js"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/amqplib": "^0.10.1",
|
||||
"@types/aws4": "^1.5.1",
|
||||
"@types/basic-auth": "^1.1.3",
|
||||
"@types/cheerio": "^0.22.15",
|
||||
"@types/cron": "~1.7.1",
|
||||
"@types/eventsource": "^1.1.2",
|
||||
"@types/express": "^4.17.6",
|
||||
"@types/gm": "^1.25.0",
|
||||
"@types/imap-simple": "^4.2.0",
|
||||
"@types/js-nacl": "^1.3.0",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/lodash": "^4.14.195",
|
||||
"@types/lossless-json": "^1.0.0",
|
||||
"@types/mailparser": "^2.7.3",
|
||||
"@types/mime-types": "^2.1.0",
|
||||
"@types/mssql": "^6.0.2",
|
||||
"@types/node-ssh": "^7.0.1",
|
||||
"@types/nodemailer": "^6.4.0",
|
||||
"@types/promise-ftp": "^1.3.4",
|
||||
"@types/redis": "^2.8.11",
|
||||
"@types/request-promise-native": "~1.0.15",
|
||||
"@types/rfc2047": "^2.0.1",
|
||||
"@types/showdown": "^1.9.4",
|
||||
"@types/snowflake-sdk": "^1.6.12",
|
||||
"@types/ssh2-sftp-client": "^5.1.0",
|
||||
"@types/tmp": "^0.2.0",
|
||||
"@types/uuid": "^8.3.2",
|
||||
"@types/xml2js": "^0.4.11",
|
||||
"eslint-plugin-n8n-nodes-base": "^1.16.0",
|
||||
"gulp": "^4.0.0",
|
||||
"n8n-core": "1.14.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@kafkajs/confluent-schema-registry": "1.0.6",
|
||||
"@n8n/vm2": "^3.9.20",
|
||||
"amqplib": "^0.10.3",
|
||||
"aws4": "^1.8.0",
|
||||
"basic-auth": "^2.0.1",
|
||||
"change-case": "^4.1.1",
|
||||
"cheerio": "1.0.0-rc.6",
|
||||
"chokidar": "3.5.2",
|
||||
"cron": "~1.7.2",
|
||||
"csv-parse": "^5.5.0",
|
||||
"currency-codes": "^2.1.0",
|
||||
"eventsource": "^2.0.2",
|
||||
"fast-glob": "^3.2.5",
|
||||
"fflate": "^0.7.0",
|
||||
"get-system-fonts": "^2.0.2",
|
||||
"gm": "^1.25.0",
|
||||
"iconv-lite": "^0.6.2",
|
||||
"ics": "^2.27.0",
|
||||
"imap-simple": "^4.3.0",
|
||||
"isbot": "^3.6.13",
|
||||
"iso-639-1": "^2.1.3",
|
||||
"js-nacl": "^1.4.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"kafkajs": "^1.14.0",
|
||||
"ldapts": "^4.2.6",
|
||||
"lodash": "^4.17.21",
|
||||
"lossless-json": "^1.0.4",
|
||||
"luxon": "^3.3.0",
|
||||
"mailparser": "^3.2.0",
|
||||
"minifaker": "^1.34.1",
|
||||
"moment": "~2.29.2",
|
||||
"moment-timezone": "^0.5.28",
|
||||
"mongodb": "^4.17.1",
|
||||
"mqtt": "^5.0.2",
|
||||
"mssql": "^8.1.2",
|
||||
"mysql2": "~2.3.0",
|
||||
"nanoid": "^3.3.6",
|
||||
"node-html-markdown": "^1.1.3",
|
||||
"node-ssh": "^12.0.0",
|
||||
"nodemailer": "^6.7.1",
|
||||
"otpauth": "^9.1.1",
|
||||
"pdfjs-dist": "^2.16.105",
|
||||
"pg": "^8.3.0",
|
||||
"pg-promise": "^10.5.8",
|
||||
"pretty-bytes": "^5.6.0",
|
||||
"promise-ftp": "^1.3.5",
|
||||
"pyodide": "^0.23.4",
|
||||
"redis": "^3.1.1",
|
||||
"rfc2047": "^4.0.1",
|
||||
"rhea": "^1.0.11",
|
||||
"rss-parser": "^3.7.0",
|
||||
"semver": "^7.5.4",
|
||||
"showdown": "^2.0.3",
|
||||
"simple-git": "^3.17.0",
|
||||
"snowflake-sdk": "^1.8.0",
|
||||
"ssh2-sftp-client": "^7.0.0",
|
||||
"tmp-promise": "^3.0.2",
|
||||
"typedi": "^0.10.0",
|
||||
"uuid": "^8.3.2",
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
|
||||
"xml2js": "^0.5.0",
|
||||
"n8n-workflow": "1.14.1"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist .turbo",
|
||||
"dev": "pnpm watch",
|
||||
"typecheck": "tsc",
|
||||
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
|
||||
"build:translations": "gulp build:translations",
|
||||
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
|
||||
"format": "prettier --write . --ignore-path ../../.prettierignore",
|
||||
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
|
||||
"lintfix": "eslint . --fix",
|
||||
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
|
||||
"test": "jest"
|
||||
}
|
||||
},
|
||||
"extraction_time_ms": 4,
|
||||
"extracted_at": "2025-06-07T17:49:22.884Z"
|
||||
}
|
||||
896
tests/extracted-nodes-db/n8n-nodes-base__SplitInBatches.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__SplitInBatches.json
Normal file
@@ -0,0 +1,896 @@
|
||||
{
|
||||
"node_type": "n8n-nodes-base.SplitInBatches",
|
||||
"name": "SplitInBatches",
|
||||
"package_name": "n8n-nodes-base",
|
||||
"code_hash": "c751422a11e30bf361a6c4803376289740a40434aeb77f90e18cd4dd7ba5c019",
|
||||
"code_length": 1135,
|
||||
"source_location": "node_modules/n8n-nodes-base/dist/nodes/SplitInBatches/SplitInBatches.node.js",
|
||||
"has_credentials": false,
|
||||
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SplitInBatches = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst SplitInBatchesV1_node_1 = require(\"./v1/SplitInBatchesV1.node\");\nconst SplitInBatchesV2_node_1 = require(\"./v2/SplitInBatchesV2.node\");\nconst SplitInBatchesV3_node_1 = require(\"./v3/SplitInBatchesV3.node\");\nclass SplitInBatches extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'Split In Batches',\n name: 'splitInBatches',\n icon: 'fa:th-large',\n group: ['organization'],\n description: 'Split data into batches and iterate over each batch',\n defaultVersion: 3,\n };\n const nodeVersions = {\n 1: new SplitInBatchesV1_node_1.SplitInBatchesV1(),\n 2: new SplitInBatchesV2_node_1.SplitInBatchesV2(),\n 3: new SplitInBatchesV3_node_1.SplitInBatchesV3(),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.SplitInBatches = SplitInBatches;\n//# sourceMappingURL=SplitInBatches.node.js.map",
|
||||
"package_info": {
|
||||
"name": "n8n-nodes-base",
|
||||
"version": "1.14.1",
|
||||
"description": "Base nodes of n8n",
|
||||
"license": "SEE LICENSE IN LICENSE.md",
|
||||
"homepage": "https://n8n.io",
|
||||
"author": {
|
||||
"name": "Jan Oberhauser",
|
||||
"email": "jan@n8n.io"
|
||||
},
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/n8n-io/n8n.git"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"n8n": {
|
||||
"credentials": [
|
||||
"dist/credentials/ActionNetworkApi.credentials.js",
|
||||
"dist/credentials/ActiveCampaignApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingApi.credentials.js",
|
||||
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
|
||||
"dist/credentials/AdaloApi.credentials.js",
|
||||
"dist/credentials/AffinityApi.credentials.js",
|
||||
"dist/credentials/AgileCrmApi.credentials.js",
|
||||
"dist/credentials/AirtableApi.credentials.js",
|
||||
"dist/credentials/AirtableOAuth2Api.credentials.js",
|
||||
"dist/credentials/AirtableTokenApi.credentials.js",
|
||||
"dist/credentials/AlienVaultApi.credentials.js",
|
||||
"dist/credentials/Amqp.credentials.js",
|
||||
"dist/credentials/ApiTemplateIoApi.credentials.js",
|
||||
"dist/credentials/AsanaApi.credentials.js",
|
||||
"dist/credentials/AsanaOAuth2Api.credentials.js",
|
||||
"dist/credentials/Auth0ManagementApi.credentials.js",
|
||||
"dist/credentials/AutomizyApi.credentials.js",
|
||||
"dist/credentials/AutopilotApi.credentials.js",
|
||||
"dist/credentials/Aws.credentials.js",
|
||||
"dist/credentials/BambooHrApi.credentials.js",
|
||||
"dist/credentials/BannerbearApi.credentials.js",
|
||||
"dist/credentials/BaserowApi.credentials.js",
|
||||
"dist/credentials/BeeminderApi.credentials.js",
|
||||
"dist/credentials/BitbucketApi.credentials.js",
|
||||
"dist/credentials/BitlyApi.credentials.js",
|
||||
"dist/credentials/BitlyOAuth2Api.credentials.js",
|
||||
"dist/credentials/BitwardenApi.credentials.js",
|
||||
"dist/credentials/BoxOAuth2Api.credentials.js",
|
||||
"dist/credentials/BrandfetchApi.credentials.js",
|
||||
"dist/credentials/BubbleApi.credentials.js",
|
||||
"dist/credentials/CalApi.credentials.js",
|
||||
"dist/credentials/CalendlyApi.credentials.js",
|
||||
"dist/credentials/CarbonBlackApi.credentials.js",
|
||||
"dist/credentials/ChargebeeApi.credentials.js",
|
||||
"dist/credentials/CircleCiApi.credentials.js",
|
||||
"dist/credentials/CiscoMerakiApi.credentials.js",
|
||||
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
|
||||
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
|
||||
"dist/credentials/CiscoUmbrellaApi.credentials.js",
|
||||
"dist/credentials/CitrixAdcApi.credentials.js",
|
||||
"dist/credentials/CloudflareApi.credentials.js",
|
||||
"dist/credentials/ClearbitApi.credentials.js",
|
||||
"dist/credentials/ClickUpApi.credentials.js",
|
||||
"dist/credentials/ClickUpOAuth2Api.credentials.js",
|
||||
"dist/credentials/ClockifyApi.credentials.js",
|
||||
"dist/credentials/CockpitApi.credentials.js",
|
||||
"dist/credentials/CodaApi.credentials.js",
|
||||
"dist/credentials/ContentfulApi.credentials.js",
|
||||
"dist/credentials/ConvertKitApi.credentials.js",
|
||||
"dist/credentials/CopperApi.credentials.js",
|
||||
"dist/credentials/CortexApi.credentials.js",
|
||||
"dist/credentials/CrateDb.credentials.js",
|
||||
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
|
||||
"dist/credentials/CrowdDevApi.credentials.js",
|
||||
"dist/credentials/CustomerIoApi.credentials.js",
|
||||
"dist/credentials/DeepLApi.credentials.js",
|
||||
"dist/credentials/DemioApi.credentials.js",
|
||||
"dist/credentials/DhlApi.credentials.js",
|
||||
"dist/credentials/DiscourseApi.credentials.js",
|
||||
"dist/credentials/DisqusApi.credentials.js",
|
||||
"dist/credentials/DriftApi.credentials.js",
|
||||
"dist/credentials/DriftOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropboxApi.credentials.js",
|
||||
"dist/credentials/DropboxOAuth2Api.credentials.js",
|
||||
"dist/credentials/DropcontactApi.credentials.js",
|
||||
"dist/credentials/EgoiApi.credentials.js",
|
||||
"dist/credentials/ElasticsearchApi.credentials.js",
|
||||
"dist/credentials/ElasticSecurityApi.credentials.js",
|
||||
"dist/credentials/EmeliaApi.credentials.js",
|
||||
"dist/credentials/ERPNextApi.credentials.js",
|
||||
"dist/credentials/EventbriteApi.credentials.js",
|
||||
"dist/credentials/EventbriteOAuth2Api.credentials.js",
|
||||
"dist/credentials/F5BigIpApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphApi.credentials.js",
|
||||
"dist/credentials/FacebookGraphAppApi.credentials.js",
|
||||
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/FigmaApi.credentials.js",
|
||||
"dist/credentials/FileMaker.credentials.js",
|
||||
"dist/credentials/FlowApi.credentials.js",
|
||||
"dist/credentials/FormIoApi.credentials.js",
|
||||
"dist/credentials/FormstackApi.credentials.js",
|
||||
"dist/credentials/FormstackOAuth2Api.credentials.js",
|
||||
"dist/credentials/FortiGateApi.credentials.js",
|
||||
"dist/credentials/FreshdeskApi.credentials.js",
|
||||
"dist/credentials/FreshserviceApi.credentials.js",
|
||||
"dist/credentials/FreshworksCrmApi.credentials.js",
|
||||
"dist/credentials/Ftp.credentials.js",
|
||||
"dist/credentials/GetResponseApi.credentials.js",
|
||||
"dist/credentials/GetResponseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GhostAdminApi.credentials.js",
|
||||
"dist/credentials/GhostContentApi.credentials.js",
|
||||
"dist/credentials/GithubApi.credentials.js",
|
||||
"dist/credentials/GithubOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitlabApi.credentials.js",
|
||||
"dist/credentials/GitlabOAuth2Api.credentials.js",
|
||||
"dist/credentials/GitPassword.credentials.js",
|
||||
"dist/credentials/GmailOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleApi.credentials.js",
|
||||
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleOAuth2Api.credentials.js",
|
||||
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
|
||||
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
|
||||
"dist/credentials/GotifyApi.credentials.js",
|
||||
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
|
||||
"dist/credentials/GristApi.credentials.js",
|
||||
"dist/credentials/GrafanaApi.credentials.js",
|
||||
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
|
||||
"dist/credentials/GumroadApi.credentials.js",
|
||||
"dist/credentials/HaloPSAApi.credentials.js",
|
||||
"dist/credentials/HarvestApi.credentials.js",
|
||||
"dist/credentials/HarvestOAuth2Api.credentials.js",
|
||||
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
|
||||
"dist/credentials/HighLevelApi.credentials.js",
|
||||
"dist/credentials/HomeAssistantApi.credentials.js",
|
||||
"dist/credentials/HttpBasicAuth.credentials.js",
|
||||
"dist/credentials/HttpDigestAuth.credentials.js",
|
||||
"dist/credentials/HttpHeaderAuth.credentials.js",
|
||||
"dist/credentials/HttpCustomAuth.credentials.js",
|
||||
"dist/credentials/HttpQueryAuth.credentials.js",
|
||||
"dist/credentials/HubspotApi.credentials.js",
|
||||
"dist/credentials/HubspotAppToken.credentials.js",
|
||||
"dist/credentials/HubspotDeveloperApi.credentials.js",
|
||||
"dist/credentials/HubspotOAuth2Api.credentials.js",
|
||||
"dist/credentials/HumanticAiApi.credentials.js",
|
||||
"dist/credentials/HunterApi.credentials.js",
|
||||
"dist/credentials/HybridAnalysisApi.credentials.js",
|
||||
"dist/credentials/Imap.credentials.js",
|
||||
"dist/credentials/ImpervaWafApi.credentials.js",
|
||||
"dist/credentials/IntercomApi.credentials.js",
|
||||
"dist/credentials/InvoiceNinjaApi.credentials.js",
|
||||
"dist/credentials/IterableApi.credentials.js",
|
||||
"dist/credentials/JenkinsApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
|
||||
"dist/credentials/JiraSoftwareServerApi.credentials.js",
|
||||
"dist/credentials/JotFormApi.credentials.js",
|
||||
"dist/credentials/Kafka.credentials.js",
|
||||
"dist/credentials/KeapOAuth2Api.credentials.js",
|
||||
"dist/credentials/KibanaApi.credentials.js",
|
||||
"dist/credentials/KitemakerApi.credentials.js",
|
||||
"dist/credentials/KoBoToolboxApi.credentials.js",
|
||||
"dist/credentials/Ldap.credentials.js",
|
||||
"dist/credentials/LemlistApi.credentials.js",
|
||||
"dist/credentials/LinearApi.credentials.js",
|
||||
"dist/credentials/LinearOAuth2Api.credentials.js",
|
||||
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/LingvaNexApi.credentials.js",
|
||||
"dist/credentials/LinkedInOAuth2Api.credentials.js",
|
||||
"dist/credentials/LoneScaleApi.credentials.js",
|
||||
"dist/credentials/Magento2Api.credentials.js",
|
||||
"dist/credentials/MailcheckApi.credentials.js",
|
||||
"dist/credentials/MailchimpApi.credentials.js",
|
||||
"dist/credentials/MailchimpOAuth2Api.credentials.js",
|
||||
"dist/credentials/MailerLiteApi.credentials.js",
|
||||
"dist/credentials/MailgunApi.credentials.js",
|
||||
"dist/credentials/MailjetEmailApi.credentials.js",
|
||||
"dist/credentials/MailjetSmsApi.credentials.js",
|
||||
"dist/credentials/MandrillApi.credentials.js",
|
||||
"dist/credentials/MarketstackApi.credentials.js",
|
||||
"dist/credentials/MatrixApi.credentials.js",
|
||||
"dist/credentials/MattermostApi.credentials.js",
|
||||
"dist/credentials/MauticApi.credentials.js",
|
||||
"dist/credentials/MauticOAuth2Api.credentials.js",
|
||||
"dist/credentials/MediumApi.credentials.js",
|
||||
"dist/credentials/MediumOAuth2Api.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MessageBirdApi.credentials.js",
|
||||
"dist/credentials/MetabaseApi.credentials.js",
|
||||
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftSql.credentials.js",
|
||||
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
|
||||
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
|
||||
"dist/credentials/MindeeInvoiceApi.credentials.js",
|
||||
"dist/credentials/MindeeReceiptApi.credentials.js",
|
||||
"dist/credentials/MispApi.credentials.js",
|
||||
"dist/credentials/MistApi.credentials.js",
|
||||
"dist/credentials/MoceanApi.credentials.js",
|
||||
"dist/credentials/MondayComApi.credentials.js",
|
||||
"dist/credentials/MondayComOAuth2Api.credentials.js",
|
||||
"dist/credentials/MongoDb.credentials.js",
|
||||
"dist/credentials/MonicaCrmApi.credentials.js",
|
||||
"dist/credentials/Mqtt.credentials.js",
|
||||
"dist/credentials/Msg91Api.credentials.js",
|
||||
"dist/credentials/MySql.credentials.js",
|
||||
"dist/credentials/N8nApi.credentials.js",
|
||||
"dist/credentials/NasaApi.credentials.js",
|
||||
"dist/credentials/NetlifyApi.credentials.js",
|
||||
"dist/credentials/NextCloudApi.credentials.js",
|
||||
"dist/credentials/NextCloudOAuth2Api.credentials.js",
|
||||
"dist/credentials/NocoDb.credentials.js",
|
||||
"dist/credentials/NocoDbApiToken.credentials.js",
|
||||
"dist/credentials/NotionApi.credentials.js",
|
||||
"dist/credentials/NotionOAuth2Api.credentials.js",
|
||||
"dist/credentials/NpmApi.credentials.js",
|
||||
"dist/credentials/OAuth1Api.credentials.js",
|
||||
"dist/credentials/OAuth2Api.credentials.js",
|
||||
"dist/credentials/OdooApi.credentials.js",
|
||||
"dist/credentials/OktaApi.credentials.js",
|
||||
"dist/credentials/OneSimpleApi.credentials.js",
|
||||
"dist/credentials/OnfleetApi.credentials.js",
|
||||
"dist/credentials/OpenAiApi.credentials.js",
|
||||
"dist/credentials/OpenCTIApi.credentials.js",
|
||||
"dist/credentials/OpenWeatherMapApi.credentials.js",
|
||||
"dist/credentials/OrbitApi.credentials.js",
|
||||
"dist/credentials/OuraApi.credentials.js",
|
||||
"dist/credentials/PaddleApi.credentials.js",
|
||||
"dist/credentials/PagerDutyApi.credentials.js",
|
||||
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
|
||||
"dist/credentials/PayPalApi.credentials.js",
|
||||
"dist/credentials/PeekalinkApi.credentials.js",
|
||||
"dist/credentials/PhantombusterApi.credentials.js",
|
||||
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
|
||||
"dist/credentials/PipedriveApi.credentials.js",
|
||||
"dist/credentials/PipedriveOAuth2Api.credentials.js",
|
||||
"dist/credentials/PlivoApi.credentials.js",
|
||||
"dist/credentials/Postgres.credentials.js",
|
||||
"dist/credentials/PostHogApi.credentials.js",
|
||||
"dist/credentials/PostmarkApi.credentials.js",
|
||||
"dist/credentials/ProfitWellApi.credentials.js",
|
||||
"dist/credentials/PushbulletOAuth2Api.credentials.js",
|
||||
"dist/credentials/PushcutApi.credentials.js",
|
||||
"dist/credentials/PushoverApi.credentials.js",
|
||||
"dist/credentials/QRadarApi.credentials.js",
|
||||
"dist/credentials/QualysApi.credentials.js",
|
||||
"dist/credentials/QuestDb.credentials.js",
|
||||
"dist/credentials/QuickBaseApi.credentials.js",
|
||||
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
|
||||
"dist/credentials/RabbitMQ.credentials.js",
|
||||
"dist/credentials/RaindropOAuth2Api.credentials.js",
|
||||
"dist/credentials/RecordedFutureApi.credentials.js",
|
||||
"dist/credentials/RedditOAuth2Api.credentials.js",
|
||||
"dist/credentials/Redis.credentials.js",
|
||||
"dist/credentials/RocketchatApi.credentials.js",
|
||||
"dist/credentials/RundeckApi.credentials.js",
|
||||
"dist/credentials/S3.credentials.js",
|
||||
"dist/credentials/SalesforceJwtApi.credentials.js",
|
||||
"dist/credentials/SalesforceOAuth2Api.credentials.js",
|
||||
"dist/credentials/SalesmateApi.credentials.js",
|
||||
"dist/credentials/SeaTableApi.credentials.js",
|
||||
"dist/credentials/SecurityScorecardApi.credentials.js",
|
||||
"dist/credentials/SegmentApi.credentials.js",
|
||||
"dist/credentials/SekoiaApi.credentials.js",
|
||||
"dist/credentials/SendGridApi.credentials.js",
|
||||
"dist/credentials/BrevoApi.credentials.js",
|
||||
"dist/credentials/SendyApi.credentials.js",
|
||||
"dist/credentials/SentryIoApi.credentials.js",
|
||||
"dist/credentials/SentryIoOAuth2Api.credentials.js",
|
||||
"dist/credentials/SentryIoServerApi.credentials.js",
|
||||
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
|
||||
"dist/credentials/ServiceNowBasicApi.credentials.js",
|
||||
"dist/credentials/Sftp.credentials.js",
|
||||
"dist/credentials/ShopifyApi.credentials.js",
|
||||
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
|
||||
"dist/credentials/ShopifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/Signl4Api.credentials.js",
|
||||
"dist/credentials/SlackApi.credentials.js",
|
||||
"dist/credentials/SlackOAuth2Api.credentials.js",
|
||||
"dist/credentials/Sms77Api.credentials.js",
|
||||
"dist/credentials/Smtp.credentials.js",
|
||||
"dist/credentials/Snowflake.credentials.js",
|
||||
"dist/credentials/SplunkApi.credentials.js",
|
||||
"dist/credentials/SpontitApi.credentials.js",
|
||||
"dist/credentials/SpotifyOAuth2Api.credentials.js",
|
||||
"dist/credentials/ShufflerApi.credentials.js",
|
||||
"dist/credentials/SshPassword.credentials.js",
|
||||
"dist/credentials/SshPrivateKey.credentials.js",
|
||||
"dist/credentials/StackbyApi.credentials.js",
|
||||
"dist/credentials/StoryblokContentApi.credentials.js",
|
||||
"dist/credentials/StoryblokManagementApi.credentials.js",
|
||||
"dist/credentials/StrapiApi.credentials.js",
|
||||
"dist/credentials/StrapiTokenApi.credentials.js",
|
||||
"dist/credentials/StravaOAuth2Api.credentials.js",
|
||||
"dist/credentials/StripeApi.credentials.js",
|
||||
"dist/credentials/SupabaseApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyApi.credentials.js",
|
||||
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
|
||||
"dist/credentials/SyncroMspApi.credentials.js",
|
||||
"dist/credentials/TaigaApi.credentials.js",
|
||||
"dist/credentials/TapfiliateApi.credentials.js",
|
||||
"dist/credentials/TelegramApi.credentials.js",
|
||||
"dist/credentials/TheHiveProjectApi.credentials.js",
|
||||
"dist/credentials/TheHiveApi.credentials.js",
|
||||
"dist/credentials/TimescaleDb.credentials.js",
|
||||
"dist/credentials/TodoistApi.credentials.js",
|
||||
"dist/credentials/TodoistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TogglApi.credentials.js",
|
||||
"dist/credentials/TotpApi.credentials.js",
|
||||
"dist/credentials/TravisCiApi.credentials.js",
|
||||
"dist/credentials/TrellixEpoApi.credentials.js",
|
||||
"dist/credentials/TrelloApi.credentials.js",
|
||||
"dist/credentials/TwakeCloudApi.credentials.js",
|
||||
"dist/credentials/TwakeServerApi.credentials.js",
|
||||
"dist/credentials/TwilioApi.credentials.js",
|
||||
"dist/credentials/TwistOAuth2Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth1Api.credentials.js",
|
||||
"dist/credentials/TwitterOAuth2Api.credentials.js",
|
||||
"dist/credentials/TypeformApi.credentials.js",
|
||||
"dist/credentials/TypeformOAuth2Api.credentials.js",
|
||||
"dist/credentials/UnleashedSoftwareApi.credentials.js",
|
||||
"dist/credentials/UpleadApi.credentials.js",
|
||||
"dist/credentials/UProcApi.credentials.js",
|
||||
"dist/credentials/UptimeRobotApi.credentials.js",
|
||||
"dist/credentials/UrlScanIoApi.credentials.js",
|
||||
"dist/credentials/VeroApi.credentials.js",
|
||||
"dist/credentials/VirusTotalApi.credentials.js",
|
||||
"dist/credentials/VonageApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
|
||||
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
|
||||
"dist/credentials/WebflowApi.credentials.js",
|
||||
"dist/credentials/WebflowOAuth2Api.credentials.js",
|
||||
"dist/credentials/WekanApi.credentials.js",
|
||||
"dist/credentials/WhatsAppApi.credentials.js",
|
||||
"dist/credentials/WiseApi.credentials.js",
|
||||
"dist/credentials/WooCommerceApi.credentials.js",
|
||||
"dist/credentials/WordpressApi.credentials.js",
|
||||
"dist/credentials/WorkableApi.credentials.js",
|
||||
"dist/credentials/WufooApi.credentials.js",
|
||||
"dist/credentials/XeroOAuth2Api.credentials.js",
|
||||
"dist/credentials/YourlsApi.credentials.js",
|
||||
"dist/credentials/YouTubeOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZammadBasicAuthApi.credentials.js",
|
||||
"dist/credentials/ZammadTokenAuthApi.credentials.js",
|
||||
"dist/credentials/ZendeskApi.credentials.js",
|
||||
"dist/credentials/ZendeskOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZohoOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZoomApi.credentials.js",
|
||||
"dist/credentials/ZoomOAuth2Api.credentials.js",
|
||||
"dist/credentials/ZscalerZiaApi.credentials.js",
|
||||
"dist/credentials/ZulipApi.credentials.js"
|
||||
],
|
||||
"nodes": [
|
||||
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
|
||||
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
|
||||
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
|
||||
"dist/nodes/Adalo/Adalo.node.js",
|
||||
"dist/nodes/Affinity/Affinity.node.js",
|
||||
"dist/nodes/Affinity/AffinityTrigger.node.js",
|
||||
"dist/nodes/AgileCrm/AgileCrm.node.js",
|
||||
"dist/nodes/Airtable/Airtable.node.js",
|
||||
"dist/nodes/Airtable/AirtableTrigger.node.js",
|
||||
"dist/nodes/Amqp/Amqp.node.js",
|
||||
"dist/nodes/Amqp/AmqpTrigger.node.js",
|
||||
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
|
||||
"dist/nodes/Asana/Asana.node.js",
|
||||
"dist/nodes/Asana/AsanaTrigger.node.js",
|
||||
"dist/nodes/Automizy/Automizy.node.js",
|
||||
"dist/nodes/Autopilot/Autopilot.node.js",
|
||||
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
|
||||
"dist/nodes/Aws/AwsLambda.node.js",
|
||||
"dist/nodes/Aws/AwsSns.node.js",
|
||||
"dist/nodes/Aws/AwsSnsTrigger.node.js",
|
||||
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
|
||||
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
|
||||
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
|
||||
"dist/nodes/Aws/ELB/AwsElb.node.js",
|
||||
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
|
||||
"dist/nodes/Aws/S3/AwsS3.node.js",
|
||||
"dist/nodes/Aws/SES/AwsSes.node.js",
|
||||
"dist/nodes/Aws/SQS/AwsSqs.node.js",
|
||||
"dist/nodes/Aws/Textract/AwsTextract.node.js",
|
||||
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
|
||||
"dist/nodes/BambooHr/BambooHr.node.js",
|
||||
"dist/nodes/Bannerbear/Bannerbear.node.js",
|
||||
"dist/nodes/Baserow/Baserow.node.js",
|
||||
"dist/nodes/Beeminder/Beeminder.node.js",
|
||||
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
|
||||
"dist/nodes/Bitly/Bitly.node.js",
|
||||
"dist/nodes/Bitwarden/Bitwarden.node.js",
|
||||
"dist/nodes/Box/Box.node.js",
|
||||
"dist/nodes/Box/BoxTrigger.node.js",
|
||||
"dist/nodes/Brandfetch/Brandfetch.node.js",
|
||||
"dist/nodes/Bubble/Bubble.node.js",
|
||||
"dist/nodes/Cal/CalTrigger.node.js",
|
||||
"dist/nodes/Calendly/CalendlyTrigger.node.js",
|
||||
"dist/nodes/Chargebee/Chargebee.node.js",
|
||||
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
|
||||
"dist/nodes/CircleCi/CircleCi.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
|
||||
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
|
||||
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
|
||||
"dist/nodes/Cloudflare/Cloudflare.node.js",
|
||||
"dist/nodes/Clearbit/Clearbit.node.js",
|
||||
"dist/nodes/ClickUp/ClickUp.node.js",
|
||||
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
|
||||
"dist/nodes/Clockify/Clockify.node.js",
|
||||
"dist/nodes/Clockify/ClockifyTrigger.node.js",
|
||||
"dist/nodes/Cockpit/Cockpit.node.js",
|
||||
"dist/nodes/Coda/Coda.node.js",
|
||||
"dist/nodes/Code/Code.node.js",
|
||||
"dist/nodes/CoinGecko/CoinGecko.node.js",
|
||||
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
|
||||
"dist/nodes/Compression/Compression.node.js",
|
||||
"dist/nodes/Contentful/Contentful.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKit.node.js",
|
||||
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
|
||||
"dist/nodes/Copper/Copper.node.js",
|
||||
"dist/nodes/Copper/CopperTrigger.node.js",
|
||||
"dist/nodes/Cortex/Cortex.node.js",
|
||||
"dist/nodes/CrateDb/CrateDb.node.js",
|
||||
"dist/nodes/Cron/Cron.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDev.node.js",
|
||||
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
|
||||
"dist/nodes/Crypto/Crypto.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIo.node.js",
|
||||
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
|
||||
"dist/nodes/DateTime/DateTime.node.js",
|
||||
"dist/nodes/DebugHelper/DebugHelper.node.js",
|
||||
"dist/nodes/DeepL/DeepL.node.js",
|
||||
"dist/nodes/Demio/Demio.node.js",
|
||||
"dist/nodes/Dhl/Dhl.node.js",
|
||||
"dist/nodes/Discord/Discord.node.js",
|
||||
"dist/nodes/Discourse/Discourse.node.js",
|
||||
"dist/nodes/Disqus/Disqus.node.js",
|
||||
"dist/nodes/Drift/Drift.node.js",
|
||||
"dist/nodes/Dropbox/Dropbox.node.js",
|
||||
"dist/nodes/Dropcontact/Dropcontact.node.js",
|
||||
"dist/nodes/EditImage/EditImage.node.js",
|
||||
"dist/nodes/E2eTest/E2eTest.node.js",
|
||||
"dist/nodes/Egoi/Egoi.node.js",
|
||||
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
|
||||
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
|
||||
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
|
||||
"dist/nodes/EmailSend/EmailSend.node.js",
|
||||
"dist/nodes/Emelia/Emelia.node.js",
|
||||
"dist/nodes/Emelia/EmeliaTrigger.node.js",
|
||||
"dist/nodes/ERPNext/ERPNext.node.js",
|
||||
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
|
||||
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
|
||||
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
|
||||
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
|
||||
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
|
||||
"dist/nodes/ExecutionData/ExecutionData.node.js",
|
||||
"dist/nodes/Facebook/FacebookGraphApi.node.js",
|
||||
"dist/nodes/Facebook/FacebookTrigger.node.js",
|
||||
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
|
||||
"dist/nodes/Figma/FigmaTrigger.node.js",
|
||||
"dist/nodes/FileMaker/FileMaker.node.js",
|
||||
"dist/nodes/Filter/Filter.node.js",
|
||||
"dist/nodes/Flow/Flow.node.js",
|
||||
"dist/nodes/Flow/FlowTrigger.node.js",
|
||||
"dist/nodes/Form/FormTrigger.node.js",
|
||||
"dist/nodes/FormIo/FormIoTrigger.node.js",
|
||||
"dist/nodes/Formstack/FormstackTrigger.node.js",
|
||||
"dist/nodes/Freshdesk/Freshdesk.node.js",
|
||||
"dist/nodes/Freshservice/Freshservice.node.js",
|
||||
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
|
||||
"dist/nodes/Ftp/Ftp.node.js",
|
||||
"dist/nodes/Function/Function.node.js",
|
||||
"dist/nodes/FunctionItem/FunctionItem.node.js",
|
||||
"dist/nodes/GetResponse/GetResponse.node.js",
|
||||
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
|
||||
"dist/nodes/Ghost/Ghost.node.js",
|
||||
"dist/nodes/Git/Git.node.js",
|
||||
"dist/nodes/Github/Github.node.js",
|
||||
"dist/nodes/Github/GithubTrigger.node.js",
|
||||
"dist/nodes/Gitlab/Gitlab.node.js",
|
||||
"dist/nodes/Gitlab/GitlabTrigger.node.js",
|
||||
"dist/nodes/Google/Ads/GoogleAds.node.js",
|
||||
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
|
||||
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
|
||||
"dist/nodes/Google/Books/GoogleBooks.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
|
||||
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
|
||||
"dist/nodes/Google/Chat/GoogleChat.node.js",
|
||||
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
|
||||
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
|
||||
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
|
||||
"dist/nodes/Google/Docs/GoogleDocs.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDrive.node.js",
|
||||
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
|
||||
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
|
||||
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
|
||||
"dist/nodes/Google/Gmail/Gmail.node.js",
|
||||
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
|
||||
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
|
||||
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
|
||||
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
|
||||
"dist/nodes/Google/Slides/GoogleSlides.node.js",
|
||||
"dist/nodes/Google/Task/GoogleTasks.node.js",
|
||||
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
|
||||
"dist/nodes/Google/YouTube/YouTube.node.js",
|
||||
"dist/nodes/Gotify/Gotify.node.js",
|
||||
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
|
||||
"dist/nodes/Grafana/Grafana.node.js",
|
||||
"dist/nodes/GraphQL/GraphQL.node.js",
|
||||
"dist/nodes/Grist/Grist.node.js",
|
||||
"dist/nodes/Gumroad/GumroadTrigger.node.js",
|
||||
"dist/nodes/HackerNews/HackerNews.node.js",
|
||||
"dist/nodes/HaloPSA/HaloPSA.node.js",
|
||||
"dist/nodes/Harvest/Harvest.node.js",
|
||||
"dist/nodes/HelpScout/HelpScout.node.js",
|
||||
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
|
||||
"dist/nodes/HighLevel/HighLevel.node.js",
|
||||
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
|
||||
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
|
||||
"dist/nodes/Html/Html.node.js",
|
||||
"dist/nodes/HttpRequest/HttpRequest.node.js",
|
||||
"dist/nodes/Hubspot/Hubspot.node.js",
|
||||
"dist/nodes/Hubspot/HubspotTrigger.node.js",
|
||||
"dist/nodes/HumanticAI/HumanticAi.node.js",
|
||||
"dist/nodes/Hunter/Hunter.node.js",
|
||||
"dist/nodes/ICalendar/ICalendar.node.js",
|
||||
"dist/nodes/If/If.node.js",
|
||||
"dist/nodes/Intercom/Intercom.node.js",
|
||||
"dist/nodes/Interval/Interval.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
|
||||
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
|
||||
"dist/nodes/ItemLists/ItemLists.node.js",
|
||||
"dist/nodes/Iterable/Iterable.node.js",
|
||||
"dist/nodes/Jenkins/Jenkins.node.js",
|
||||
"dist/nodes/Jira/Jira.node.js",
|
||||
"dist/nodes/Jira/JiraTrigger.node.js",
|
||||
"dist/nodes/JotForm/JotFormTrigger.node.js",
|
||||
"dist/nodes/Kafka/Kafka.node.js",
|
||||
"dist/nodes/Kafka/KafkaTrigger.node.js",
|
||||
"dist/nodes/Keap/Keap.node.js",
|
||||
"dist/nodes/Keap/KeapTrigger.node.js",
|
||||
"dist/nodes/Kitemaker/Kitemaker.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
|
||||
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
|
||||
"dist/nodes/Ldap/Ldap.node.js",
|
||||
"dist/nodes/Lemlist/Lemlist.node.js",
|
||||
"dist/nodes/Lemlist/LemlistTrigger.node.js",
|
||||
"dist/nodes/Line/Line.node.js",
|
||||
"dist/nodes/Linear/Linear.node.js",
|
||||
"dist/nodes/Linear/LinearTrigger.node.js",
|
||||
"dist/nodes/LingvaNex/LingvaNex.node.js",
|
||||
"dist/nodes/LinkedIn/LinkedIn.node.js",
|
||||
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
|
||||
"dist/nodes/LoneScale/LoneScale.node.js",
|
||||
"dist/nodes/Magento/Magento2.node.js",
|
||||
"dist/nodes/Mailcheck/Mailcheck.node.js",
|
||||
"dist/nodes/Mailchimp/Mailchimp.node.js",
|
||||
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
|
||||
"dist/nodes/MailerLite/MailerLite.node.js",
|
||||
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
|
||||
"dist/nodes/Mailgun/Mailgun.node.js",
|
||||
"dist/nodes/Mailjet/Mailjet.node.js",
|
||||
"dist/nodes/Mailjet/MailjetTrigger.node.js",
|
||||
"dist/nodes/Mandrill/Mandrill.node.js",
|
||||
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
|
||||
"dist/nodes/Markdown/Markdown.node.js",
|
||||
"dist/nodes/Marketstack/Marketstack.node.js",
|
||||
"dist/nodes/Matrix/Matrix.node.js",
|
||||
"dist/nodes/Mattermost/Mattermost.node.js",
|
||||
"dist/nodes/Mautic/Mautic.node.js",
|
||||
"dist/nodes/Mautic/MauticTrigger.node.js",
|
||||
"dist/nodes/Medium/Medium.node.js",
|
||||
"dist/nodes/Merge/Merge.node.js",
|
||||
"dist/nodes/MessageBird/MessageBird.node.js",
|
||||
"dist/nodes/Metabase/Metabase.node.js",
|
||||
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
|
||||
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
|
||||
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
|
||||
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
|
||||
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
|
||||
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
|
||||
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
|
||||
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
|
||||
"dist/nodes/Mindee/Mindee.node.js",
|
||||
"dist/nodes/Misp/Misp.node.js",
|
||||
"dist/nodes/Mocean/Mocean.node.js",
|
||||
"dist/nodes/MondayCom/MondayCom.node.js",
|
||||
"dist/nodes/MongoDb/MongoDb.node.js",
|
||||
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
|
||||
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
|
||||
"dist/nodes/MQTT/Mqtt.node.js",
|
||||
"dist/nodes/MQTT/MqttTrigger.node.js",
|
||||
"dist/nodes/Msg91/Msg91.node.js",
|
||||
"dist/nodes/MySql/MySql.node.js",
|
||||
"dist/nodes/N8n/N8n.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
|
||||
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
|
||||
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
|
||||
"dist/nodes/Nasa/Nasa.node.js",
|
||||
"dist/nodes/Netlify/Netlify.node.js",
|
||||
"dist/nodes/Netlify/NetlifyTrigger.node.js",
|
||||
"dist/nodes/NextCloud/NextCloud.node.js",
|
||||
"dist/nodes/NocoDB/NocoDB.node.js",
|
||||
"dist/nodes/Brevo/Brevo.node.js",
|
||||
"dist/nodes/Brevo/BrevoTrigger.node.js",
|
||||
"dist/nodes/StickyNote/StickyNote.node.js",
|
||||
"dist/nodes/NoOp/NoOp.node.js",
|
||||
"dist/nodes/Onfleet/Onfleet.node.js",
|
||||
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
|
||||
"dist/nodes/Notion/Notion.node.js",
|
||||
"dist/nodes/Notion/NotionTrigger.node.js",
|
||||
"dist/nodes/Npm/Npm.node.js",
|
||||
"dist/nodes/Odoo/Odoo.node.js",
|
||||
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
|
||||
"dist/nodes/OpenAi/OpenAi.node.js",
|
||||
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
|
||||
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
|
||||
"dist/nodes/Orbit/Orbit.node.js",
|
||||
"dist/nodes/Oura/Oura.node.js",
|
||||
"dist/nodes/Paddle/Paddle.node.js",
|
||||
"dist/nodes/PagerDuty/PagerDuty.node.js",
|
||||
"dist/nodes/PayPal/PayPal.node.js",
|
||||
"dist/nodes/PayPal/PayPalTrigger.node.js",
|
||||
"dist/nodes/Peekalink/Peekalink.node.js",
|
||||
"dist/nodes/Phantombuster/Phantombuster.node.js",
|
||||
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
|
||||
"dist/nodes/Pipedrive/Pipedrive.node.js",
|
||||
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
|
||||
"dist/nodes/Plivo/Plivo.node.js",
|
||||
"dist/nodes/PostBin/PostBin.node.js",
|
||||
"dist/nodes/Postgres/Postgres.node.js",
|
||||
"dist/nodes/Postgres/PostgresTrigger.node.js",
|
||||
"dist/nodes/PostHog/PostHog.node.js",
|
||||
"dist/nodes/Postmark/PostmarkTrigger.node.js",
|
||||
"dist/nodes/ProfitWell/ProfitWell.node.js",
|
||||
"dist/nodes/Pushbullet/Pushbullet.node.js",
|
||||
"dist/nodes/Pushcut/Pushcut.node.js",
|
||||
"dist/nodes/Pushcut/PushcutTrigger.node.js",
|
||||
"dist/nodes/Pushover/Pushover.node.js",
|
||||
"dist/nodes/QuestDb/QuestDb.node.js",
|
||||
"dist/nodes/QuickBase/QuickBase.node.js",
|
||||
"dist/nodes/QuickBooks/QuickBooks.node.js",
|
||||
"dist/nodes/QuickChart/QuickChart.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
|
||||
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
|
||||
"dist/nodes/Raindrop/Raindrop.node.js",
|
||||
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
|
||||
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
|
||||
"dist/nodes/ReadPdf/ReadPDF.node.js",
|
||||
"dist/nodes/Reddit/Reddit.node.js",
|
||||
"dist/nodes/Redis/Redis.node.js",
|
||||
"dist/nodes/Redis/RedisTrigger.node.js",
|
||||
"dist/nodes/RenameKeys/RenameKeys.node.js",
|
||||
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
|
||||
"dist/nodes/Rocketchat/Rocketchat.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
|
||||
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
|
||||
"dist/nodes/Rundeck/Rundeck.node.js",
|
||||
"dist/nodes/S3/S3.node.js",
|
||||
"dist/nodes/Salesforce/Salesforce.node.js",
|
||||
"dist/nodes/Salesmate/Salesmate.node.js",
|
||||
"dist/nodes/Schedule/ScheduleTrigger.node.js",
|
||||
"dist/nodes/SeaTable/SeaTable.node.js",
|
||||
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
|
||||
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
|
||||
"dist/nodes/Segment/Segment.node.js",
|
||||
"dist/nodes/SendGrid/SendGrid.node.js",
|
||||
"dist/nodes/Sendy/Sendy.node.js",
|
||||
"dist/nodes/SentryIo/SentryIo.node.js",
|
||||
"dist/nodes/ServiceNow/ServiceNow.node.js",
|
||||
"dist/nodes/Set/Set.node.js",
|
||||
"dist/nodes/Shopify/Shopify.node.js",
|
||||
"dist/nodes/Shopify/ShopifyTrigger.node.js",
|
||||
"dist/nodes/Signl4/Signl4.node.js",
|
||||
"dist/nodes/Slack/Slack.node.js",
|
||||
"dist/nodes/Sms77/Sms77.node.js",
|
||||
"dist/nodes/Snowflake/Snowflake.node.js",
|
||||
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
|
||||
"dist/nodes/Splunk/Splunk.node.js",
|
||||
"dist/nodes/Spontit/Spontit.node.js",
|
||||
"dist/nodes/Spotify/Spotify.node.js",
|
||||
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
|
||||
"dist/nodes/SseTrigger/SseTrigger.node.js",
|
||||
"dist/nodes/Ssh/Ssh.node.js",
|
||||
"dist/nodes/Stackby/Stackby.node.js",
|
||||
"dist/nodes/Start/Start.node.js",
|
||||
"dist/nodes/StopAndError/StopAndError.node.js",
|
||||
"dist/nodes/Storyblok/Storyblok.node.js",
|
||||
"dist/nodes/Strapi/Strapi.node.js",
|
||||
"dist/nodes/Strava/Strava.node.js",
|
||||
"dist/nodes/Strava/StravaTrigger.node.js",
|
||||
"dist/nodes/Stripe/Stripe.node.js",
|
||||
"dist/nodes/Stripe/StripeTrigger.node.js",
|
||||
"dist/nodes/Supabase/Supabase.node.js",
|
||||
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
|
||||
"dist/nodes/Switch/Switch.node.js",
|
||||
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
|
||||
"dist/nodes/Taiga/Taiga.node.js",
|
||||
"dist/nodes/Taiga/TaigaTrigger.node.js",
|
||||
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
|
||||
"dist/nodes/Telegram/Telegram.node.js",
|
||||
"dist/nodes/Telegram/TelegramTrigger.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
|
||||
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
|
||||
"dist/nodes/TheHive/TheHive.node.js",
|
||||
"dist/nodes/TheHive/TheHiveTrigger.node.js",
|
||||
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
|
||||
"dist/nodes/Todoist/Todoist.node.js",
|
||||
"dist/nodes/Toggl/TogglTrigger.node.js",
|
||||
"dist/nodes/Totp/Totp.node.js",
|
||||
"dist/nodes/TravisCi/TravisCi.node.js",
|
||||
"dist/nodes/Trello/Trello.node.js",
|
||||
"dist/nodes/Trello/TrelloTrigger.node.js",
|
||||
"dist/nodes/Twake/Twake.node.js",
|
||||
"dist/nodes/Twilio/Twilio.node.js",
|
||||
"dist/nodes/Twist/Twist.node.js",
|
||||
"dist/nodes/Twitter/Twitter.node.js",
|
||||
"dist/nodes/Typeform/TypeformTrigger.node.js",
|
||||
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
|
||||
"dist/nodes/Uplead/Uplead.node.js",
|
||||
"dist/nodes/UProc/UProc.node.js",
|
||||
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
|
||||
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
|
||||
"dist/nodes/Vero/Vero.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
|
||||
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
|
||||
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
|
||||
"dist/nodes/Vonage/Vonage.node.js",
|
||||
"dist/nodes/Wait/Wait.node.js",
|
||||
"dist/nodes/Webflow/Webflow.node.js",
|
||||
"dist/nodes/Webflow/WebflowTrigger.node.js",
|
||||
"dist/nodes/Webhook/Webhook.node.js",
|
||||
"dist/nodes/Wekan/Wekan.node.js",
|
||||
"dist/nodes/WhatsApp/WhatsApp.node.js",
|
||||
"dist/nodes/Wise/Wise.node.js",
|
||||
"dist/nodes/Wise/WiseTrigger.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerce.node.js",
|
||||
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
|
||||
"dist/nodes/Wordpress/Wordpress.node.js",
|
||||
"dist/nodes/Workable/WorkableTrigger.node.js",
|
||||
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
|
||||
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
|
||||
"dist/nodes/Wufoo/WufooTrigger.node.js",
|
||||
"dist/nodes/Xero/Xero.node.js",
|
||||
"dist/nodes/Xml/Xml.node.js",
|
||||
"dist/nodes/Yourls/Yourls.node.js",
|
||||
"dist/nodes/Zammad/Zammad.node.js",
|
||||
"dist/nodes/Zendesk/Zendesk.node.js",
|
||||
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
|
||||
"dist/nodes/Zoho/ZohoCrm.node.js",
|
||||
"dist/nodes/Zoom/Zoom.node.js",
|
||||
"dist/nodes/Zulip/Zulip.node.js"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/amqplib": "^0.10.1",
|
||||
"@types/aws4": "^1.5.1",
|
||||
"@types/basic-auth": "^1.1.3",
|
||||
"@types/cheerio": "^0.22.15",
|
||||
"@types/cron": "~1.7.1",
|
||||
"@types/eventsource": "^1.1.2",
|
||||
"@types/express": "^4.17.6",
|
||||
"@types/gm": "^1.25.0",
|
||||
"@types/imap-simple": "^4.2.0",
|
||||
"@types/js-nacl": "^1.3.0",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/lodash": "^4.14.195",
|
||||
"@types/lossless-json": "^1.0.0",
|
||||
"@types/mailparser": "^2.7.3",
|
||||
"@types/mime-types": "^2.1.0",
|
||||
"@types/mssql": "^6.0.2",
|
||||
"@types/node-ssh": "^7.0.1",
|
||||
"@types/nodemailer": "^6.4.0",
|
||||
"@types/promise-ftp": "^1.3.4",
|
||||
"@types/redis": "^2.8.11",
|
||||
"@types/request-promise-native": "~1.0.15",
|
||||
"@types/rfc2047": "^2.0.1",
|
||||
"@types/showdown": "^1.9.4",
|
||||
"@types/snowflake-sdk": "^1.6.12",
|
||||
"@types/ssh2-sftp-client": "^5.1.0",
|
||||
"@types/tmp": "^0.2.0",
|
||||
"@types/uuid": "^8.3.2",
|
||||
"@types/xml2js": "^0.4.11",
|
||||
"eslint-plugin-n8n-nodes-base": "^1.16.0",
|
||||
"gulp": "^4.0.0",
|
||||
"n8n-core": "1.14.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@kafkajs/confluent-schema-registry": "1.0.6",
|
||||
"@n8n/vm2": "^3.9.20",
|
||||
"amqplib": "^0.10.3",
|
||||
"aws4": "^1.8.0",
|
||||
"basic-auth": "^2.0.1",
|
||||
"change-case": "^4.1.1",
|
||||
"cheerio": "1.0.0-rc.6",
|
||||
"chokidar": "3.5.2",
|
||||
"cron": "~1.7.2",
|
||||
"csv-parse": "^5.5.0",
|
||||
"currency-codes": "^2.1.0",
|
||||
"eventsource": "^2.0.2",
|
||||
"fast-glob": "^3.2.5",
|
||||
"fflate": "^0.7.0",
|
||||
"get-system-fonts": "^2.0.2",
|
||||
"gm": "^1.25.0",
|
||||
"iconv-lite": "^0.6.2",
|
||||
"ics": "^2.27.0",
|
||||
"imap-simple": "^4.3.0",
|
||||
"isbot": "^3.6.13",
|
||||
"iso-639-1": "^2.1.3",
|
||||
"js-nacl": "^1.4.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"kafkajs": "^1.14.0",
|
||||
"ldapts": "^4.2.6",
|
||||
"lodash": "^4.17.21",
|
||||
"lossless-json": "^1.0.4",
|
||||
"luxon": "^3.3.0",
|
||||
"mailparser": "^3.2.0",
|
||||
"minifaker": "^1.34.1",
|
||||
"moment": "~2.29.2",
|
||||
"moment-timezone": "^0.5.28",
|
||||
"mongodb": "^4.17.1",
|
||||
"mqtt": "^5.0.2",
|
||||
"mssql": "^8.1.2",
|
||||
"mysql2": "~2.3.0",
|
||||
"nanoid": "^3.3.6",
|
||||
"node-html-markdown": "^1.1.3",
|
||||
"node-ssh": "^12.0.0",
|
||||
"nodemailer": "^6.7.1",
|
||||
"otpauth": "^9.1.1",
|
||||
"pdfjs-dist": "^2.16.105",
|
||||
"pg": "^8.3.0",
|
||||
"pg-promise": "^10.5.8",
|
||||
"pretty-bytes": "^5.6.0",
|
||||
"promise-ftp": "^1.3.5",
|
||||
"pyodide": "^0.23.4",
|
||||
"redis": "^3.1.1",
|
||||
"rfc2047": "^4.0.1",
|
||||
"rhea": "^1.0.11",
|
||||
"rss-parser": "^3.7.0",
|
||||
"semver": "^7.5.4",
|
||||
"showdown": "^2.0.3",
|
||||
"simple-git": "^3.17.0",
|
||||
"snowflake-sdk": "^1.8.0",
|
||||
"ssh2-sftp-client": "^7.0.0",
|
||||
"tmp-promise": "^3.0.2",
|
||||
"typedi": "^0.10.0",
|
||||
"uuid": "^8.3.2",
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
|
||||
"xml2js": "^0.5.0",
|
||||
"n8n-workflow": "1.14.1"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist .turbo",
|
||||
"dev": "pnpm watch",
|
||||
"typecheck": "tsc",
|
||||
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
|
||||
"build:translations": "gulp build:translations",
|
||||
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
|
||||
"format": "prettier --write . --ignore-path ../../.prettierignore",
|
||||
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
|
||||
"lintfix": "eslint . --fix",
|
||||
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
|
||||
"test": "jest"
|
||||
}
|
||||
},
|
||||
"extraction_time_ms": 5,
|
||||
"extracted_at": "2025-06-07T17:49:22.730Z"
|
||||
}
|
||||
896
tests/extracted-nodes-db/n8n-nodes-base__Webhook.json
Normal file
896
tests/extracted-nodes-db/n8n-nodes-base__Webhook.json
Normal file
File diff suppressed because one or more lines are too long
8100
tests/node-storage-export.json
Normal file
8100
tests/node-storage-export.json
Normal file
File diff suppressed because one or more lines are too long
282
tests/test-database-extraction.js
Executable file
282
tests/test-database-extraction.js
Executable file
@@ -0,0 +1,282 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Test node extraction for database storage
|
||||
* Focus on extracting known nodes with proper structure for DB storage
|
||||
*/
|
||||
|
||||
const fs = require('fs').promises;
|
||||
const path = require('path');
|
||||
const crypto = require('crypto');
|
||||
|
||||
// Import our extractor
|
||||
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
|
||||
|
||||
// Known n8n nodes to test
|
||||
const KNOWN_NODES = [
|
||||
// Core nodes
|
||||
{ type: 'n8n-nodes-base.Function', package: 'n8n-nodes-base', name: 'Function' },
|
||||
{ type: 'n8n-nodes-base.Webhook', package: 'n8n-nodes-base', name: 'Webhook' },
|
||||
{ type: 'n8n-nodes-base.HttpRequest', package: 'n8n-nodes-base', name: 'HttpRequest' },
|
||||
{ type: 'n8n-nodes-base.If', package: 'n8n-nodes-base', name: 'If' },
|
||||
{ type: 'n8n-nodes-base.SplitInBatches', package: 'n8n-nodes-base', name: 'SplitInBatches' },
|
||||
|
||||
// AI nodes
|
||||
{ type: '@n8n/n8n-nodes-langchain.Agent', package: '@n8n/n8n-nodes-langchain', name: 'Agent' },
|
||||
{ type: '@n8n/n8n-nodes-langchain.OpenAiAssistant', package: '@n8n/n8n-nodes-langchain', name: 'OpenAiAssistant' },
|
||||
{ type: '@n8n/n8n-nodes-langchain.ChainLlm', package: '@n8n/n8n-nodes-langchain', name: 'ChainLlm' },
|
||||
|
||||
// Integration nodes
|
||||
{ type: 'n8n-nodes-base.Airtable', package: 'n8n-nodes-base', name: 'Airtable' },
|
||||
{ type: 'n8n-nodes-base.GoogleSheets', package: 'n8n-nodes-base', name: 'GoogleSheets' },
|
||||
{ type: 'n8n-nodes-base.Slack', package: 'n8n-nodes-base', name: 'Slack' },
|
||||
{ type: 'n8n-nodes-base.Discord', package: 'n8n-nodes-base', name: 'Discord' },
|
||||
];
|
||||
|
||||
// Database schema for storing nodes
|
||||
const DB_SCHEMA = `
|
||||
-- Main nodes table
|
||||
CREATE TABLE IF NOT EXISTS nodes (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
node_type VARCHAR(255) UNIQUE NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
package_name VARCHAR(255) NOT NULL,
|
||||
display_name VARCHAR(255),
|
||||
description TEXT,
|
||||
version VARCHAR(50),
|
||||
code_hash VARCHAR(64) NOT NULL,
|
||||
code_length INTEGER NOT NULL,
|
||||
source_location TEXT NOT NULL,
|
||||
has_credentials BOOLEAN DEFAULT FALSE,
|
||||
extracted_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT idx_node_type UNIQUE (node_type),
|
||||
INDEX idx_package_name (package_name),
|
||||
INDEX idx_code_hash (code_hash)
|
||||
);
|
||||
|
||||
-- Source code storage
|
||||
CREATE TABLE IF NOT EXISTS node_source_code (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
|
||||
source_code TEXT NOT NULL,
|
||||
minified_code TEXT,
|
||||
source_map TEXT,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT idx_node_source UNIQUE (node_id)
|
||||
);
|
||||
|
||||
-- Credentials definitions
|
||||
CREATE TABLE IF NOT EXISTS node_credentials (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
|
||||
credential_type VARCHAR(255) NOT NULL,
|
||||
credential_code TEXT NOT NULL,
|
||||
required_fields JSONB,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
INDEX idx_node_credentials (node_id)
|
||||
);
|
||||
|
||||
-- Package metadata
|
||||
CREATE TABLE IF NOT EXISTS node_packages (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
package_name VARCHAR(255) UNIQUE NOT NULL,
|
||||
version VARCHAR(50),
|
||||
description TEXT,
|
||||
author VARCHAR(255),
|
||||
license VARCHAR(50),
|
||||
repository_url TEXT,
|
||||
metadata JSONB,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Node dependencies
|
||||
CREATE TABLE IF NOT EXISTS node_dependencies (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
|
||||
depends_on_node_id UUID NOT NULL REFERENCES nodes(id),
|
||||
dependency_type VARCHAR(50), -- 'extends', 'imports', 'requires'
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT unique_dependency UNIQUE (node_id, depends_on_node_id)
|
||||
);
|
||||
`;
|
||||
|
||||
async function main() {
|
||||
console.log('=== n8n Node Extraction for Database Storage Test ===\n');
|
||||
|
||||
const extractor = new NodeSourceExtractor();
|
||||
const results = {
|
||||
tested: 0,
|
||||
extracted: 0,
|
||||
failed: 0,
|
||||
nodes: [],
|
||||
errors: [],
|
||||
totalSize: 0
|
||||
};
|
||||
|
||||
// Create output directory
|
||||
const outputDir = path.join(__dirname, 'extracted-nodes-db');
|
||||
await fs.mkdir(outputDir, { recursive: true });
|
||||
|
||||
console.log(`Testing extraction of ${KNOWN_NODES.length} known nodes...\n`);
|
||||
|
||||
// Extract each node
|
||||
for (const nodeConfig of KNOWN_NODES) {
|
||||
console.log(`📦 Extracting: ${nodeConfig.type}`);
|
||||
results.tested++;
|
||||
|
||||
try {
|
||||
const startTime = Date.now();
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeConfig.type);
|
||||
const extractTime = Date.now() - startTime;
|
||||
|
||||
// Calculate hash for deduplication
|
||||
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
|
||||
|
||||
// Prepare database record
|
||||
const dbRecord = {
|
||||
// Primary data
|
||||
node_type: nodeConfig.type,
|
||||
name: nodeConfig.name,
|
||||
package_name: nodeConfig.package,
|
||||
code_hash: codeHash,
|
||||
code_length: nodeInfo.sourceCode.length,
|
||||
source_location: nodeInfo.location,
|
||||
has_credentials: !!nodeInfo.credentialCode,
|
||||
|
||||
// Source code (separate table in real DB)
|
||||
source_code: nodeInfo.sourceCode,
|
||||
credential_code: nodeInfo.credentialCode,
|
||||
|
||||
// Package info
|
||||
package_info: nodeInfo.packageInfo,
|
||||
|
||||
// Metadata
|
||||
extraction_time_ms: extractTime,
|
||||
extracted_at: new Date().toISOString()
|
||||
};
|
||||
|
||||
results.nodes.push(dbRecord);
|
||||
results.extracted++;
|
||||
results.totalSize += nodeInfo.sourceCode.length;
|
||||
|
||||
console.log(` ✅ Success: ${nodeInfo.sourceCode.length} bytes (${extractTime}ms)`);
|
||||
console.log(` 📍 Location: ${nodeInfo.location}`);
|
||||
console.log(` 🔑 Hash: ${codeHash.substring(0, 12)}...`);
|
||||
|
||||
if (nodeInfo.credentialCode) {
|
||||
console.log(` 🔐 Has credentials: ${nodeInfo.credentialCode.length} bytes`);
|
||||
}
|
||||
|
||||
// Save individual node data
|
||||
const nodeFile = path.join(outputDir, `${nodeConfig.package}__${nodeConfig.name}.json`);
|
||||
await fs.writeFile(nodeFile, JSON.stringify(dbRecord, null, 2));
|
||||
|
||||
} catch (error) {
|
||||
results.failed++;
|
||||
results.errors.push({
|
||||
node: nodeConfig.type,
|
||||
error: error.message
|
||||
});
|
||||
console.log(` ❌ Failed: ${error.message}`);
|
||||
}
|
||||
|
||||
console.log('');
|
||||
}
|
||||
|
||||
// Generate summary report
|
||||
const successRate = ((results.extracted / results.tested) * 100).toFixed(1);
|
||||
|
||||
console.log('='.repeat(60));
|
||||
console.log('EXTRACTION SUMMARY');
|
||||
console.log('='.repeat(60));
|
||||
console.log(`Total nodes tested: ${results.tested}`);
|
||||
console.log(`Successfully extracted: ${results.extracted} (${successRate}%)`);
|
||||
console.log(`Failed: ${results.failed}`);
|
||||
console.log(`Total code size: ${(results.totalSize / 1024).toFixed(2)} KB`);
|
||||
console.log(`Average node size: ${(results.totalSize / results.extracted / 1024).toFixed(2)} KB`);
|
||||
|
||||
// Test database insertion simulation
|
||||
console.log('\n📊 Database Storage Simulation:');
|
||||
console.log('--------------------------------');
|
||||
|
||||
if (results.extracted > 0) {
|
||||
// Group by package
|
||||
const packages = {};
|
||||
results.nodes.forEach(node => {
|
||||
if (!packages[node.package_name]) {
|
||||
packages[node.package_name] = {
|
||||
name: node.package_name,
|
||||
nodes: [],
|
||||
totalSize: 0
|
||||
};
|
||||
}
|
||||
packages[node.package_name].nodes.push(node.name);
|
||||
packages[node.package_name].totalSize += node.code_length;
|
||||
});
|
||||
|
||||
console.log('\nPackages:');
|
||||
Object.values(packages).forEach(pkg => {
|
||||
console.log(` 📦 ${pkg.name}`);
|
||||
console.log(` Nodes: ${pkg.nodes.length}`);
|
||||
console.log(` Total size: ${(pkg.totalSize / 1024).toFixed(2)} KB`);
|
||||
console.log(` Nodes: ${pkg.nodes.join(', ')}`);
|
||||
});
|
||||
|
||||
// Save database-ready JSON
|
||||
const dbData = {
|
||||
schema: DB_SCHEMA,
|
||||
extracted_at: new Date().toISOString(),
|
||||
statistics: {
|
||||
total_nodes: results.extracted,
|
||||
total_size_bytes: results.totalSize,
|
||||
packages: Object.keys(packages).length,
|
||||
success_rate: successRate
|
||||
},
|
||||
nodes: results.nodes
|
||||
};
|
||||
|
||||
const dbFile = path.join(outputDir, 'database-import.json');
|
||||
await fs.writeFile(dbFile, JSON.stringify(dbData, null, 2));
|
||||
console.log(`\n💾 Database import file saved: ${dbFile}`);
|
||||
|
||||
// Create SQL insert statements
|
||||
const sqlFile = path.join(outputDir, 'insert-nodes.sql');
|
||||
let sql = '-- Auto-generated SQL for n8n nodes\n\n';
|
||||
|
||||
results.nodes.forEach(node => {
|
||||
sql += `-- Node: ${node.node_type}\n`;
|
||||
sql += `INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)\n`;
|
||||
sql += `VALUES ('${node.node_type}', '${node.name}', '${node.package_name}', '${node.code_hash}', ${node.code_length}, '${node.source_location}', ${node.has_credentials});\n\n`;
|
||||
});
|
||||
|
||||
await fs.writeFile(sqlFile, sql);
|
||||
console.log(`📝 SQL insert file saved: ${sqlFile}`);
|
||||
}
|
||||
|
||||
// Save full report
|
||||
const reportFile = path.join(outputDir, 'extraction-report.json');
|
||||
await fs.writeFile(reportFile, JSON.stringify(results, null, 2));
|
||||
console.log(`\n📄 Full report saved: ${reportFile}`);
|
||||
|
||||
// Show any errors
|
||||
if (results.errors.length > 0) {
|
||||
console.log('\n⚠️ Extraction Errors:');
|
||||
results.errors.forEach(err => {
|
||||
console.log(` - ${err.node}: ${err.error}`);
|
||||
});
|
||||
}
|
||||
|
||||
console.log('\n✨ Database extraction test completed!');
|
||||
console.log(`📁 Results saved in: ${outputDir}`);
|
||||
|
||||
// Exit with appropriate code
|
||||
process.exit(results.failed > 0 ? 1 : 0);
|
||||
}
|
||||
|
||||
// Run the test
|
||||
main().catch(error => {
|
||||
console.error('Fatal error:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
79
tests/test-direct-extraction.js
Executable file
79
tests/test-direct-extraction.js
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Import the NodeSourceExtractor
|
||||
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
|
||||
|
||||
async function testExtraction() {
|
||||
console.log('=== Direct Node Extraction Test ===\n');
|
||||
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
// Test extraction of AI Agent node
|
||||
const nodeType = '@n8n/n8n-nodes-langchain.Agent';
|
||||
|
||||
console.log(`Testing extraction of: ${nodeType}`);
|
||||
|
||||
// First, let's debug what paths are being searched
|
||||
console.log('\nSearching in paths:');
|
||||
const searchPaths = [
|
||||
'/usr/local/lib/node_modules/n8n/node_modules',
|
||||
'/app/node_modules',
|
||||
'/home/node/.n8n/custom/nodes',
|
||||
'./node_modules'
|
||||
];
|
||||
|
||||
for (const basePath of searchPaths) {
|
||||
console.log(`- ${basePath}`);
|
||||
try {
|
||||
const exists = fs.existsSync(basePath);
|
||||
console.log(` Exists: ${exists}`);
|
||||
if (exists) {
|
||||
const items = fs.readdirSync(basePath).slice(0, 5);
|
||||
console.log(` Sample items: ${items.join(', ')}...`);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(` Error: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await extractor.extractNodeSource(nodeType, true);
|
||||
|
||||
console.log('\n✅ Extraction successful!');
|
||||
console.log(`Source file: ${result.location}`);
|
||||
console.log(`Code length: ${result.sourceCode.length} characters`);
|
||||
console.log(`Credential code found: ${result.credentialCode ? 'Yes' : 'No'}`);
|
||||
console.log(`Package.json found: ${result.packageInfo ? 'Yes' : 'No'}`);
|
||||
|
||||
// Show first 500 characters of the code
|
||||
console.log('\nFirst 500 characters of code:');
|
||||
console.log('=' .repeat(60));
|
||||
console.log(result.sourceCode.substring(0, 500) + '...');
|
||||
console.log('=' .repeat(60));
|
||||
|
||||
// Show credential code if found
|
||||
if (result.credentialCode) {
|
||||
console.log('\nCredential code found!');
|
||||
console.log('First 200 characters of credential code:');
|
||||
console.log(result.credentialCode.substring(0, 200) + '...');
|
||||
}
|
||||
|
||||
// Check if we can find it in Docker volume
|
||||
const dockerPath = '/usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+n8n-nodes-langchain@file+packages+@n8n+nodes-langchain_f35e7d377a7fe4d08dc2766706b5dbff/node_modules/@n8n/n8n-nodes-langchain/dist/nodes/agents/Agent/Agent.node.js';
|
||||
|
||||
if (fs.existsSync(dockerPath)) {
|
||||
console.log('\n✅ File also found in expected Docker path');
|
||||
const dockerContent = fs.readFileSync(dockerPath, 'utf8');
|
||||
console.log(`Docker file size: ${dockerContent.length} bytes`);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('\n❌ Extraction failed:', error.message);
|
||||
console.error('Stack trace:', error.stack);
|
||||
}
|
||||
}
|
||||
|
||||
testExtraction().catch(console.error);
|
||||
104
tests/test-mcp-server-extraction.js
Executable file
104
tests/test-mcp-server-extraction.js
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Test MCP Server extraction functionality
|
||||
* Simulates an MCP client calling the get_node_source_code tool
|
||||
*/
|
||||
|
||||
const { spawn } = require('child_process');
|
||||
const path = require('path');
|
||||
|
||||
// MCP request to get AI Agent node source code
|
||||
const mcpRequest = {
|
||||
jsonrpc: '2.0',
|
||||
id: 1,
|
||||
method: 'tools/call',
|
||||
params: {
|
||||
name: 'get_node_source_code',
|
||||
arguments: {
|
||||
nodeType: '@n8n/n8n-nodes-langchain.Agent',
|
||||
includeCredentials: true
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
async function testMCPExtraction() {
|
||||
console.log('=== MCP Server Node Extraction Test ===\n');
|
||||
console.log('Starting MCP server...');
|
||||
|
||||
// Start the MCP server
|
||||
const serverPath = path.join(__dirname, '../dist/index.js');
|
||||
const server = spawn('node', [serverPath], {
|
||||
env: {
|
||||
...process.env,
|
||||
MCP_SERVER_PORT: '3000',
|
||||
MCP_SERVER_HOST: '0.0.0.0',
|
||||
N8N_API_URL: 'http://n8n:5678',
|
||||
N8N_API_KEY: 'test-api-key',
|
||||
MCP_AUTH_TOKEN: 'test-token',
|
||||
LOG_LEVEL: 'info'
|
||||
},
|
||||
stdio: ['pipe', 'pipe', 'pipe']
|
||||
});
|
||||
|
||||
let responseBuffer = '';
|
||||
let errorBuffer = '';
|
||||
|
||||
server.stdout.on('data', (data) => {
|
||||
responseBuffer += data.toString();
|
||||
});
|
||||
|
||||
server.stderr.on('data', (data) => {
|
||||
errorBuffer += data.toString();
|
||||
});
|
||||
|
||||
// Give server time to start
|
||||
await new Promise(resolve => setTimeout(resolve, 2000));
|
||||
|
||||
console.log('Sending MCP request...');
|
||||
console.log(JSON.stringify(mcpRequest, null, 2));
|
||||
|
||||
// Send the request via stdin (MCP uses stdio transport)
|
||||
server.stdin.write(JSON.stringify(mcpRequest) + '\n');
|
||||
|
||||
// Wait for response
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Kill the server
|
||||
server.kill();
|
||||
|
||||
console.log('\n=== Server Output ===');
|
||||
console.log(responseBuffer);
|
||||
|
||||
if (errorBuffer) {
|
||||
console.log('\n=== Server Errors ===');
|
||||
console.log(errorBuffer);
|
||||
}
|
||||
|
||||
// Try to parse any JSON responses
|
||||
const lines = responseBuffer.split('\n').filter(line => line.trim());
|
||||
for (const line of lines) {
|
||||
try {
|
||||
const data = JSON.parse(line);
|
||||
if (data.id === 1 && data.result) {
|
||||
console.log('\n✅ MCP Response received!');
|
||||
console.log(`Node type: ${data.result.nodeType}`);
|
||||
console.log(`Source code length: ${data.result.sourceCode ? data.result.sourceCode.length : 0} characters`);
|
||||
console.log(`Location: ${data.result.location}`);
|
||||
console.log(`Has credentials: ${data.result.credentialCode ? 'Yes' : 'No'}`);
|
||||
console.log(`Has package info: ${data.result.packageInfo ? 'Yes' : 'No'}`);
|
||||
|
||||
if (data.result.sourceCode) {
|
||||
console.log('\nFirst 300 characters of extracted code:');
|
||||
console.log('='.repeat(60));
|
||||
console.log(data.result.sourceCode.substring(0, 300) + '...');
|
||||
console.log('='.repeat(60));
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
// Not JSON, skip
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
testMCPExtraction().catch(console.error);
|
||||
235
tests/test-mcp-tools-integration.js
Executable file
235
tests/test-mcp-tools-integration.js
Executable file
@@ -0,0 +1,235 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* End-to-end test for MCP server tools integration
|
||||
* Tests both get_node_source_code and list_available_nodes tools
|
||||
*/
|
||||
|
||||
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
||||
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
||||
const { N8NMCPServer } = require('../dist/mcp/server');
|
||||
|
||||
// Test configuration
|
||||
const TEST_CONFIG = {
|
||||
mcp: {
|
||||
port: 3000,
|
||||
host: '0.0.0.0',
|
||||
authToken: 'test-token'
|
||||
},
|
||||
n8n: {
|
||||
apiUrl: 'http://localhost:5678',
|
||||
apiKey: 'test-key'
|
||||
}
|
||||
};
|
||||
|
||||
// Mock tool calls
|
||||
const TEST_REQUESTS = [
|
||||
{
|
||||
name: 'list_available_nodes',
|
||||
description: 'List all available n8n nodes',
|
||||
request: {
|
||||
name: 'list_available_nodes',
|
||||
arguments: {}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'list_ai_nodes',
|
||||
description: 'List AI/LangChain nodes',
|
||||
request: {
|
||||
name: 'list_available_nodes',
|
||||
arguments: {
|
||||
category: 'ai'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'get_function_node',
|
||||
description: 'Extract Function node source',
|
||||
request: {
|
||||
name: 'get_node_source_code',
|
||||
arguments: {
|
||||
nodeType: 'n8n-nodes-base.Function',
|
||||
includeCredentials: true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'get_ai_agent_node',
|
||||
description: 'Extract AI Agent node source',
|
||||
request: {
|
||||
name: 'get_node_source_code',
|
||||
arguments: {
|
||||
nodeType: '@n8n/n8n-nodes-langchain.Agent',
|
||||
includeCredentials: true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'get_webhook_node',
|
||||
description: 'Extract Webhook node source',
|
||||
request: {
|
||||
name: 'get_node_source_code',
|
||||
arguments: {
|
||||
nodeType: 'n8n-nodes-base.Webhook',
|
||||
includeCredentials: false
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
async function simulateToolCall(server, toolRequest) {
|
||||
console.log(`\n📋 Testing: ${toolRequest.description}`);
|
||||
console.log(` Tool: ${toolRequest.request.name}`);
|
||||
console.log(` Args:`, JSON.stringify(toolRequest.request.arguments, null, 2));
|
||||
|
||||
try {
|
||||
const startTime = Date.now();
|
||||
|
||||
// Directly call the tool handler
|
||||
const handler = server.toolHandlers[toolRequest.request.name];
|
||||
if (!handler) {
|
||||
throw new Error(`Tool handler not found: ${toolRequest.request.name}`);
|
||||
}
|
||||
|
||||
const result = await handler(toolRequest.request.arguments);
|
||||
const elapsed = Date.now() - startTime;
|
||||
|
||||
console.log(` ✅ Success (${elapsed}ms)`);
|
||||
|
||||
// Analyze results based on tool type
|
||||
if (toolRequest.request.name === 'list_available_nodes') {
|
||||
console.log(` 📊 Found ${result.nodes.length} nodes`);
|
||||
if (result.nodes.length > 0) {
|
||||
console.log(` Sample nodes:`);
|
||||
result.nodes.slice(0, 3).forEach(node => {
|
||||
console.log(` - ${node.name} (${node.packageName || 'unknown'})`);
|
||||
});
|
||||
}
|
||||
} else if (toolRequest.request.name === 'get_node_source_code') {
|
||||
console.log(` 📦 Node: ${result.nodeType}`);
|
||||
console.log(` 📏 Code size: ${result.sourceCode.length} bytes`);
|
||||
console.log(` 📍 Location: ${result.location}`);
|
||||
console.log(` 🔐 Has credentials: ${!!result.credentialCode}`);
|
||||
console.log(` 📄 Has package info: ${!!result.packageInfo}`);
|
||||
|
||||
if (result.packageInfo) {
|
||||
console.log(` 📦 Package: ${result.packageInfo.name} v${result.packageInfo.version}`);
|
||||
}
|
||||
}
|
||||
|
||||
return { success: true, result, elapsed };
|
||||
} catch (error) {
|
||||
console.log(` ❌ Failed: ${error.message}`);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log('=== MCP Server Tools Integration Test ===\n');
|
||||
|
||||
// Create MCP server instance
|
||||
console.log('🚀 Initializing MCP server...');
|
||||
const server = new N8NMCPServer(TEST_CONFIG.mcp, TEST_CONFIG.n8n);
|
||||
|
||||
// Store tool handlers for direct access
|
||||
server.toolHandlers = {};
|
||||
|
||||
// Override handler setup to capture handlers
|
||||
const originalSetup = server.setupHandlers.bind(server);
|
||||
server.setupHandlers = function() {
|
||||
originalSetup();
|
||||
|
||||
// Capture tool call handler
|
||||
const originalHandler = this.server.setRequestHandler;
|
||||
this.server.setRequestHandler = function(schema, handler) {
|
||||
if (schema.parse && schema.parse({method: 'tools/call'}).method === 'tools/call') {
|
||||
// This is the tool call handler
|
||||
const toolCallHandler = handler;
|
||||
server.handleToolCall = async (args) => {
|
||||
const response = await toolCallHandler({ method: 'tools/call', params: args });
|
||||
return response.content[0];
|
||||
};
|
||||
}
|
||||
return originalHandler.call(this, schema, handler);
|
||||
};
|
||||
};
|
||||
|
||||
// Re-setup handlers
|
||||
server.setupHandlers();
|
||||
|
||||
// Extract individual tool handlers
|
||||
server.toolHandlers = {
|
||||
list_available_nodes: async (args) => server.listAvailableNodes(args),
|
||||
get_node_source_code: async (args) => server.getNodeSourceCode(args)
|
||||
};
|
||||
|
||||
console.log('✅ MCP server initialized\n');
|
||||
|
||||
// Test statistics
|
||||
const stats = {
|
||||
total: 0,
|
||||
passed: 0,
|
||||
failed: 0,
|
||||
results: []
|
||||
};
|
||||
|
||||
// Run all test requests
|
||||
for (const testRequest of TEST_REQUESTS) {
|
||||
stats.total++;
|
||||
const result = await simulateToolCall(server, testRequest);
|
||||
stats.results.push({
|
||||
name: testRequest.name,
|
||||
...result
|
||||
});
|
||||
|
||||
if (result.success) {
|
||||
stats.passed++;
|
||||
} else {
|
||||
stats.failed++;
|
||||
}
|
||||
}
|
||||
|
||||
// Summary
|
||||
console.log('\n' + '='.repeat(60));
|
||||
console.log('TEST SUMMARY');
|
||||
console.log('='.repeat(60));
|
||||
console.log(`Total tests: ${stats.total}`);
|
||||
console.log(`Passed: ${stats.passed} ✅`);
|
||||
console.log(`Failed: ${stats.failed} ❌`);
|
||||
console.log(`Success rate: ${((stats.passed / stats.total) * 100).toFixed(1)}%`);
|
||||
|
||||
// Detailed results
|
||||
console.log('\nDetailed Results:');
|
||||
stats.results.forEach(result => {
|
||||
const status = result.success ? '✅' : '❌';
|
||||
const time = result.elapsed ? ` (${result.elapsed}ms)` : '';
|
||||
console.log(` ${status} ${result.name}${time}`);
|
||||
if (!result.success) {
|
||||
console.log(` Error: ${result.error}`);
|
||||
}
|
||||
});
|
||||
|
||||
console.log('\n✨ MCP tools integration test completed!');
|
||||
|
||||
// Test database storage capability
|
||||
console.log('\n📊 Database Storage Capability:');
|
||||
const sampleExtraction = stats.results.find(r => r.success && r.result && r.result.sourceCode);
|
||||
if (sampleExtraction) {
|
||||
console.log('✅ Node extraction produces database-ready structure');
|
||||
console.log('✅ Includes source code, hash, location, and metadata');
|
||||
console.log('✅ Ready for bulk extraction and storage');
|
||||
} else {
|
||||
console.log('⚠️ No successful extraction to verify database structure');
|
||||
}
|
||||
|
||||
process.exit(stats.failed > 0 ? 1 : 0);
|
||||
}
|
||||
|
||||
// Handle errors
|
||||
process.on('unhandledRejection', (error) => {
|
||||
console.error('\n💥 Unhandled error:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
// Run the test
|
||||
main();
|
||||
143
tests/test-sqlite-search.js
Executable file
143
tests/test-sqlite-search.js
Executable file
@@ -0,0 +1,143 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Test SQLite database search functionality
|
||||
*/
|
||||
|
||||
const { SQLiteStorageService } = require('../dist/services/sqlite-storage-service');
|
||||
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
|
||||
|
||||
async function testDatabaseSearch() {
|
||||
console.log('=== SQLite Database Search Test ===\n');
|
||||
|
||||
const storage = new SQLiteStorageService();
|
||||
const extractor = new NodeSourceExtractor();
|
||||
|
||||
// First, ensure we have some data
|
||||
console.log('1️⃣ Checking database status...');
|
||||
let stats = await storage.getStatistics();
|
||||
|
||||
if (stats.totalNodes === 0) {
|
||||
console.log(' Database is empty. Adding some test nodes...\n');
|
||||
|
||||
const testNodes = [
|
||||
'n8n-nodes-base.Function',
|
||||
'n8n-nodes-base.Webhook',
|
||||
'n8n-nodes-base.HttpRequest',
|
||||
'n8n-nodes-base.If',
|
||||
'n8n-nodes-base.Slack',
|
||||
'n8n-nodes-base.Discord'
|
||||
];
|
||||
|
||||
for (const nodeType of testNodes) {
|
||||
try {
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeType);
|
||||
await storage.storeNode(nodeInfo);
|
||||
console.log(` ✅ Stored ${nodeType}`);
|
||||
} catch (error) {
|
||||
console.log(` ❌ Failed to store ${nodeType}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
stats = await storage.getStatistics();
|
||||
}
|
||||
|
||||
console.log(`\n Total nodes in database: ${stats.totalNodes}`);
|
||||
console.log(` Total packages: ${stats.totalPackages}`);
|
||||
console.log(` Database size: ${(stats.totalCodeSize / 1024).toFixed(2)} KB\n`);
|
||||
|
||||
// Test different search scenarios
|
||||
console.log('2️⃣ Testing search functionality...\n');
|
||||
|
||||
const searchTests = [
|
||||
{
|
||||
name: 'Search by partial name (func)',
|
||||
query: { query: 'func' }
|
||||
},
|
||||
{
|
||||
name: 'Search by partial name (web)',
|
||||
query: { query: 'web' }
|
||||
},
|
||||
{
|
||||
name: 'Search for HTTP',
|
||||
query: { query: 'http' }
|
||||
},
|
||||
{
|
||||
name: 'Search for multiple terms',
|
||||
query: { query: 'slack discord' }
|
||||
},
|
||||
{
|
||||
name: 'Filter by package',
|
||||
query: { packageName: 'n8n-nodes-base' }
|
||||
},
|
||||
{
|
||||
name: 'Search with package filter',
|
||||
query: { query: 'func', packageName: 'n8n-nodes-base' }
|
||||
},
|
||||
{
|
||||
name: 'Search by node type',
|
||||
query: { nodeType: 'Webhook' }
|
||||
},
|
||||
{
|
||||
name: 'Limit results',
|
||||
query: { query: 'node', limit: 3 }
|
||||
}
|
||||
];
|
||||
|
||||
for (const test of searchTests) {
|
||||
console.log(` 📍 ${test.name}:`);
|
||||
console.log(` Query: ${JSON.stringify(test.query)}`);
|
||||
|
||||
try {
|
||||
const results = await storage.searchNodes(test.query);
|
||||
console.log(` Results: ${results.length} nodes found`);
|
||||
|
||||
if (results.length > 0) {
|
||||
console.log(' Matches:');
|
||||
results.slice(0, 3).forEach(node => {
|
||||
console.log(` - ${node.nodeType} (${node.displayName || node.name})`);
|
||||
});
|
||||
if (results.length > 3) {
|
||||
console.log(` ... and ${results.length - 3} more`);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(` ❌ Error: ${error.message}`);
|
||||
}
|
||||
|
||||
console.log('');
|
||||
}
|
||||
|
||||
// Test specific node retrieval
|
||||
console.log('3️⃣ Testing specific node retrieval...\n');
|
||||
|
||||
const specificNode = await storage.getNode('n8n-nodes-base.Function');
|
||||
if (specificNode) {
|
||||
console.log(` ✅ Found node: ${specificNode.nodeType}`);
|
||||
console.log(` Display name: ${specificNode.displayName}`);
|
||||
console.log(` Code size: ${specificNode.codeLength} bytes`);
|
||||
console.log(` Has credentials: ${specificNode.hasCredentials}`);
|
||||
} else {
|
||||
console.log(' ❌ Node not found');
|
||||
}
|
||||
|
||||
// Test package listing
|
||||
console.log('\n4️⃣ Testing package listing...\n');
|
||||
|
||||
const packages = await storage.getPackages();
|
||||
console.log(` Found ${packages.length} packages:`);
|
||||
packages.forEach(pkg => {
|
||||
console.log(` - ${pkg.name}: ${pkg.nodeCount} nodes`);
|
||||
});
|
||||
|
||||
// Close database
|
||||
storage.close();
|
||||
|
||||
console.log('\n✅ Search functionality test completed!');
|
||||
}
|
||||
|
||||
// Run the test
|
||||
testDatabaseSearch().catch(error => {
|
||||
console.error('Test failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
116
tests/test-storage-system.js
Executable file
116
tests/test-storage-system.js
Executable file
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Test the node storage and search system
|
||||
*/
|
||||
|
||||
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
|
||||
const { NodeStorageService } = require('../dist/services/node-storage-service');
|
||||
|
||||
async function testStorageSystem() {
|
||||
console.log('=== Node Storage System Test ===\n');
|
||||
|
||||
const extractor = new NodeSourceExtractor();
|
||||
const storage = new NodeStorageService();
|
||||
|
||||
// 1. Extract and store some nodes
|
||||
console.log('1. Extracting and storing nodes...\n');
|
||||
|
||||
const testNodes = [
|
||||
'n8n-nodes-base.Function',
|
||||
'n8n-nodes-base.Webhook',
|
||||
'n8n-nodes-base.HttpRequest',
|
||||
'@n8n/n8n-nodes-langchain.Agent'
|
||||
];
|
||||
|
||||
let stored = 0;
|
||||
for (const nodeType of testNodes) {
|
||||
try {
|
||||
console.log(` Extracting ${nodeType}...`);
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeType);
|
||||
await storage.storeNode(nodeInfo);
|
||||
stored++;
|
||||
console.log(` ✅ Stored successfully`);
|
||||
} catch (error) {
|
||||
console.log(` ❌ Failed: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n Total stored: ${stored}/${testNodes.length}\n`);
|
||||
|
||||
// 2. Test search functionality
|
||||
console.log('2. Testing search functionality...\n');
|
||||
|
||||
const searchTests = [
|
||||
{ query: 'function', desc: 'Search for "function"' },
|
||||
{ query: 'webhook', desc: 'Search for "webhook"' },
|
||||
{ packageName: 'n8n-nodes-base', desc: 'Filter by package' },
|
||||
{ hasCredentials: false, desc: 'Nodes without credentials' }
|
||||
];
|
||||
|
||||
for (const test of searchTests) {
|
||||
console.log(` ${test.desc}:`);
|
||||
const results = await storage.searchNodes(test);
|
||||
console.log(` Found ${results.length} nodes`);
|
||||
if (results.length > 0) {
|
||||
console.log(` First result: ${results[0].nodeType}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Get statistics
|
||||
console.log('\n3. Storage statistics:\n');
|
||||
|
||||
const stats = await storage.getStatistics();
|
||||
console.log(` Total nodes: ${stats.totalNodes}`);
|
||||
console.log(` Total packages: ${stats.totalPackages}`);
|
||||
console.log(` Total code size: ${(stats.totalCodeSize / 1024).toFixed(2)} KB`);
|
||||
console.log(` Average node size: ${(stats.averageNodeSize / 1024).toFixed(2)} KB`);
|
||||
console.log(` Nodes with credentials: ${stats.nodesWithCredentials}`);
|
||||
|
||||
console.log('\n Package distribution:');
|
||||
stats.packageDistribution.forEach(pkg => {
|
||||
console.log(` ${pkg.package}: ${pkg.count} nodes`);
|
||||
});
|
||||
|
||||
// 4. Test bulk extraction
|
||||
console.log('\n4. Testing bulk extraction (first 10 nodes)...\n');
|
||||
|
||||
const allNodes = await extractor.listAvailableNodes();
|
||||
const nodesToExtract = allNodes.slice(0, 10);
|
||||
|
||||
const nodeInfos = [];
|
||||
for (const node of nodesToExtract) {
|
||||
try {
|
||||
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
|
||||
const nodeInfo = await extractor.extractNodeSource(nodeType);
|
||||
nodeInfos.push(nodeInfo);
|
||||
} catch (error) {
|
||||
// Skip failed extractions
|
||||
}
|
||||
}
|
||||
|
||||
if (nodeInfos.length > 0) {
|
||||
const bulkResult = await storage.bulkStoreNodes(nodeInfos);
|
||||
console.log(` Bulk stored: ${bulkResult.stored}`);
|
||||
console.log(` Failed: ${bulkResult.failed}`);
|
||||
}
|
||||
|
||||
// 5. Export for database
|
||||
console.log('\n5. Exporting for database...\n');
|
||||
|
||||
const dbExport = await storage.exportForDatabase();
|
||||
console.log(` Exported ${dbExport.nodes.length} nodes`);
|
||||
console.log(` Total packages: ${dbExport.metadata.totalPackages}`);
|
||||
console.log(` Export timestamp: ${dbExport.metadata.exportedAt}`);
|
||||
|
||||
// Save export to file
|
||||
const fs = require('fs').promises;
|
||||
const exportFile = path.join(__dirname, 'node-storage-export.json');
|
||||
await fs.writeFile(exportFile, JSON.stringify(dbExport, null, 2));
|
||||
console.log(` Saved to: ${exportFile}`);
|
||||
|
||||
console.log('\n✅ Storage system test completed!');
|
||||
}
|
||||
|
||||
const path = require('path');
|
||||
testStorageSystem().catch(console.error);
|
||||
Reference in New Issue
Block a user