#!/usr/bin/env node const { NodeDocumentationService } = require('../dist/services/node-documentation-service'); const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor'); const { DocumentationFetcher } = require('../dist/utils/documentation-fetcher'); async function testSlackFix() { console.log('=== Testing Slack Node Fix ===\n'); const extractor = new NodeSourceExtractor(); const docsFetcher = new DocumentationFetcher(); try { // Test 1: Node source extraction console.log('1ļøāƒ£ Testing Slack node source extraction...'); const slackSource = await extractor.extractNodeSource('n8n-nodes-base.slack'); console.log(` āœ… Source code found at: ${slackSource.location}`); console.log(` šŸ“ Source length: ${slackSource.sourceCode.length} bytes`); // Extract display name from source const displayNameMatch = slackSource.sourceCode.match(/displayName\s*[:=]\s*['"`]([^'"`]+)['"`]/); console.log(` šŸ“› Display name: ${displayNameMatch ? displayNameMatch[1] : 'Not found'}`); // Test 2: Documentation fetching console.log('\n2ļøāƒ£ Testing Slack documentation fetching...'); const slackDocs = await docsFetcher.getNodeDocumentation('n8n-nodes-base.slack'); if (slackDocs) { console.log(` āœ… Documentation found`); console.log(` šŸ“„ URL: ${slackDocs.url}`); // Extract title from markdown const titleMatch = slackDocs.markdown.match(/title:\s*(.+)/); console.log(` šŸ“ Title: ${titleMatch ? titleMatch[1] : 'Not found'}`); // Check if it's the correct documentation const isNodeDoc = slackDocs.markdown.includes('Slack node') || slackDocs.markdown.includes('node documentation'); const isCredentialDoc = slackDocs.markdown.includes('Slack credentials') && !slackDocs.markdown.includes('node documentation'); console.log(` āœ… Is node documentation: ${isNodeDoc}`); console.log(` āŒ Is credential documentation: ${isCredentialDoc}`); if (isNodeDoc && !isCredentialDoc) { console.log('\nšŸŽ‰ SUCCESS: Slack node documentation is correctly fetched!'); } else { console.log('\nāš ļø WARNING: Documentation may not be correct'); } // Show first few lines of content console.log('\nšŸ“‹ Documentation preview:'); const lines = slackDocs.markdown.split('\n').slice(0, 15); lines.forEach(line => console.log(` ${line}`)); } else { console.log(' āŒ No documentation found'); } // Test 3: Complete node info using NodeDocumentationService console.log('\n3ļøāƒ£ Testing complete node info storage...'); const service = new NodeDocumentationService('./data/test-slack-fix.db'); try { // Parse node definition const nodeDefinition = { displayName: displayNameMatch ? displayNameMatch[1] : 'Slack', description: 'Send messages to Slack channels, users and conversations', category: 'Communication', icon: 'file:slack.svg', version: 2 }; // Store node info await service.storeNode({ nodeType: 'n8n-nodes-base.slack', name: 'slack', displayName: nodeDefinition.displayName, description: nodeDefinition.description, category: nodeDefinition.category, icon: nodeDefinition.icon, sourceCode: slackSource.sourceCode, credentialCode: slackSource.credentialCode, documentation: slackDocs?.markdown, documentationUrl: slackDocs?.url, packageName: 'n8n-nodes-base', version: nodeDefinition.version, hasCredentials: !!slackSource.credentialCode, isTrigger: false, isWebhook: false }); console.log(' āœ… Node info stored successfully'); // Retrieve and verify const retrievedNode = await service.getNodeInfo('n8n-nodes-base.slack'); if (retrievedNode) { console.log(' āœ… Node retrieved successfully'); console.log(` šŸ“› Display name: ${retrievedNode.displayName}`); console.log(` šŸ“ Has documentation: ${!!retrievedNode.documentation}`); console.log(` šŸ“„ Documentation URL: ${retrievedNode.documentationUrl || 'N/A'}`); } service.close(); } catch (error) { console.error(' āŒ Error with node service:', error.message); service.close(); } console.log('\nāœ… All tests completed!'); } catch (error) { console.error('\nāŒ Test failed:', error); } finally { await docsFetcher.cleanup(); } } testSlackFix().catch(console.error);