{"_id":"@conciso/n8n-nodes-join","_rev":"3-e5ce2ebdd9d5e6cfb66917a3e74651ff","name":"@conciso/n8n-nodes-join","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"name":"@conciso/n8n-nodes-join","version":"1.1.0","keywords":["n8n-community-node-package","join","merge","parallel","workflow"],"author":{"name":"Thorsten Kamann","email":"thorsten.kamann@conciso.de"},"license":"MIT","_id":"@conciso/n8n-nodes-join@1.1.0","maintainers":[{"name":"npm_conciso_thorsten","email":"thorsten.kamann@conciso.de"}],"homepage":"https://github.com/conciso/n8n-nodes-join#readme","bugs":{"url":"https://github.com/conciso/n8n-nodes-join/issues"},"n8n":{"nodes":["dist/nodes/Join/Join.node.js"],"n8nNodesApiVersion":1},"dist":{"shasum":"f969b89df0a79b5d9826684cfbf49bc6b07f8356","tarball":"https://registry.npmjs.org/@conciso/n8n-nodes-join/-/n8n-nodes-join-1.1.0.tgz","fileCount":16,"integrity":"sha512-bQJ7uaLYVtnIQ/LrieZxH7fkBHqCEIsoFEBtfq0pkACWLfFLziWWkDF1AeIA7/8Xe/PMwsBVFaqQud/PPU0ckw==","signatures":[{"sig":"MEUCIQDJ5ODrAKpL0IBh419nhzDb4mUKwKjzXMxcE1vTqEoXBQIgHxvXDv7rm2NTnltBSj5s8WiCk2knSMqLTC489Hw9P+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51215},"main":"index.js","engines":{"node":">=20.15"},"gitHead":"3bfcdfe82084cff6188f058fb236a979206a45dc","scripts":{"dev":"gulp dev","init":"gulp init","lint":"gulp lint","test":"gulp test","build":"gulp build","clean":"gulp clean","release":"gulp releaseMinor","build:test":"gulp buildWithTests","test:watch":"gulp testWatch","release:major":"gulp releaseMajor","release:minor":"gulp releaseMinor","release:patch":"gulp releasePatch","deploy:staging":"gulp lint && gulp deployStaging","deploy:production":"gulp lint && gulp deployProduction"},"_npmUser":{"name":"npm_conciso_thorsten","email":"thorsten.kamann@conciso.de"},"repository":{"url":"git+https://github.com/conciso/n8n-nodes-join.git","type":"git","homepage":"https://github.com/conciso/n8n-nodes-join#readme"},"_npmVersion":"10.8.2","description":"n8n node for joining parallel workflow branches into a single JSON object","directories":{},"_nodeVersion":"20.19.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gulp":"^5.0.0","jest":"^29.7.0","dotenv":"^17.0.1","eslint":"^8.57.1","ts-jest":"^29.4.0","prettier":"^3.5.3","jest-junit":"^16.0.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^24.0.3","gulp-prettier":"^6.0.0","jest-mock-extended":"^3.0.7","@typescript-eslint/parser":"~8.34.1","eslint-plugin-n8n-nodes-base":"^1.16.3"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-join_1.1.0_1753038838202_0.7974006823947302","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-07-20T19:13:58.106Z","modified":"2026-09-25T09:58:10.095Z","1.1.0":"2025-07-20T19:13:58.397Z"},"bugs":{"url":"https://github.com/conciso/n8n-nodes-join/issues"},"author":{"name":"Thorsten Kamann","email":"thorsten.kamann@conciso.de"},"license":"MIT","homepage":"https://github.com/conciso/n8n-nodes-join#readme","keywords":["n8n-community-node-package","join","merge","parallel","workflow"],"repository":{"url":"git+https://github.com/conciso/n8n-nodes-join.git","type":"git","homepage":"https://github.com/conciso/n8n-nodes-join#readme"},"description":"n8n node for joining parallel workflow branches into a single JSON object","maintainers":[{"email":"sven-torben@sven-torben.de","name":"sventorben"},{"email":"dominik@pieper.io","name":"dominikpieper"},{"email":"thorsten.kamann@conciso.de","name":"npm_conciso_thorsten"}],"readme":"# 🔗 n8n-nodes-join\n\nA powerful n8n Community Node for joining parallel workflow branches into a single JSON object. This node waits for all parallel inputs to complete and combines their data with automatic node name detection and intelligent error handling.\n\n[![npm version](https://img.shields.io/npm/v/@conciso/n8n-nodes-join.svg)](https://www.npmjs.com/package/@conciso/n8n-nodes-join)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## ✨ Features\n\n### 🔄 **Join Node**\n- **True Parallel Join**: Waits for ALL parallel inputs before executing downstream\n- **Configurable Input Count**: Set expected number of inputs (2-99)\n- **Smart Synchronization**: Uses global storage to collect data across executions\n- **Timeout Protection**: Configurable timeout to prevent infinite waiting\n- **Smart Labeling**: Uses `input_1`, `input_2`, etc. as keys\n- **Metadata Support**: Optional execution metadata and timing information\n- **Single Output**: Guarantees downstream nodes execute exactly once\n\n### 🛡️ **Quality Assurance**\n- **TypeScript**: Full type safety and IntelliSense support\n- **Professional Error Messages**: Clear, actionable error messages\n- **Timeout Handling**: Configurable timeout for parallel operations\n\n## 📦 Installation\n\nInstall the node using n8n's Community Nodes feature:\n\n1. **Via n8n Interface:**\n   - Go to **Settings** → **Community Nodes**\n   - Install package: `@conciso/n8n-nodes-join`\n\n2. **Via npm (for self-hosted n8n):**\n   ```bash\n   npm install @conciso/n8n-nodes-join\n   ```\n\nFor detailed installation instructions, see the [n8n Community Nodes documentation](https://docs.n8n.io/integrations/community-nodes/installation/).\n\n## 🚀 Usage\n\n### Problem Solved\n\nIn n8n workflows, when you connect multiple parallel nodes to a single downstream node, the downstream node executes multiple times (once for each input). The Join node solves this by:\n\n**Before (Multiple Executions):**\n```\nAPI Call 1 ──┐\nAPI Call 2 ──┤── Process Data (executes 3 times!)\nAPI Call 3 ──┘\n```\n\n**After (Single Execution):**\n```\nAPI Call 1 ──┐\nAPI Call 2 ──┤── [JOIN] ──> Process Data (executes 1 time)\nAPI Call 3 ──┘\n```\n\n### Basic Usage\n\n1. **Add parallel nodes** to your workflow (API calls, data processing, etc.)\n2. **Connect all parallel nodes** to the Join node\n3. **Connect the Join node** to your downstream processing node\n4. **Configure timeout** and error handling if needed\n\n### Output Structure\n\nThe Join node automatically creates a JSON object with `input_x` keys:\n\n```json\n{\n  \"input_1\": {\n    \"users\": [{\"id\": 1, \"name\": \"John\"}, {\"id\": 2, \"name\": \"Jane\"}]\n  },\n  \"input_2\": {\n    \"orders\": [{\"id\": 101, \"total\": 99.99}]\n  },\n  \"input_3\": {\n    \"processed\": true,\n    \"timestamp\": \"2025-01-16T21:30:00Z\"\n  }\n}\n```\n\n### With Metadata\n\nEnable \"Include Metadata\" for additional execution information:\n\n```json\n{\n  \"data\": {\n    \"input_1\": { \"users\": [...] },\n    \"input_2\": { \"orders\": [...] },\n    \"input_3\": { \"processed\": true }\n  },\n  \"metadata\": {\n    \"input_1\": {\n      \"timestamp\": \"2025-01-16T21:30:15Z\",\n      \"executionIndex\": 1\n    },\n    \"input_2\": {\n      \"timestamp\": \"2025-01-16T21:30:16Z\", \n      \"executionIndex\": 2\n    },\n    \"input_3\": {\n      \"timestamp\": \"2025-01-16T21:30:17Z\",\n      \"executionIndex\": 3\n    },\n    \"totalInputs\": 3,\n    \"executionTime\": \"2025-01-16T21:30:17Z\",\n    \"waitTime\": \"2.1s\"\n  }\n}\n```\n\n## ⚙️ Configuration\n\n### Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| **Expected Inputs** | Number | 2 | Number of parallel inputs to wait for (2-99) |\n| **Timeout (seconds)** | Number | 30 | Maximum time to wait for all inputs |\n| **Include Metadata** | Boolean | false | Include execution metadata in output |\n\n## 💡 Use Cases\n\n### 1. **Parallel API Data Gathering**\n```\nGet Users API    ──┐\nGet Orders API   ──┤── [JOIN] ──> Generate Report\nGet Products API ──┘\n```\n\n### 2. **Multi-Source Data Processing**\n```\nDatabase Query ──┐\nFile Processing ──┤── [JOIN] ──> Data Analysis\nWeb Scraping ──┘\n```\n\n### 3. **Conditional Workflow Merging**\n```\nIF: Process A ──┐\nIF: Process B ──┤── [JOIN] ──> Final Processing\nIF: Process C ──┘\n```\n\n## 🔧 Development\n\n### Prerequisites\n\n- Node.js 20+\n- npm 8+\n- n8n development environment\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/conciso/n8n-nodes-join.git\ncd n8n-nodes-join\n\n# Install dependencies\nnpm run init\n\n# Build and run in dev mode\nnpm run dev\n```\n\n### Project Structure\n\n```\nn8n-nodes-join/\n├── nodes/\n│   └── Join/\n│       ├── Join.node.ts      # Main node implementation\n│       ├── Join.node.json    # Node metadata\n│       └── join.svg          # Node icon\n├── dist/  \n├── test/                    # Test files\n├── gulpfile.js              # Build system\n└── package.json             # Package configuration\n```\n\n## 🤝 Contributing\n\nContributions are welcome!\n\n### Development Workflow\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run build and tests: `npm run build:test`\n5. Submit a pull request\n\n## 🐛 Troubleshooting\n\n### Common Issues\n\n**❌ \"No input data received\" Error**\n- Ensure all parallel nodes are connected to the Join node\n- Check that upstream nodes are producing data\n\n**❌ Timeout Issues**\n- Increase the timeout value in node configuration\n- Check for slow upstream operations\n\n**❌ Wrong Expected Inputs Configuration**\n- Ensure \"Expected Inputs\" matches the actual number of connected parallel nodes\n- If you have 4 parallel nodes, set \"Expected Inputs\" to 4\n- The node will timeout if it doesn't receive the expected number of inputs\n\n## 📚 Resources\n\n- [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)\n- [n8n Node Development Guide](https://docs.n8n.io/integrations/creating-nodes/)\n- [TypeScript Documentation](https://www.typescriptlang.org/docs/)\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- Built for the [n8n](https://n8n.io) automation platform\n- Inspired by the n8n community's need for better parallel workflow handling\n\n---\n\n**Made with ❤️ for the n8n community**\n","readmeFilename":"README.md"}