# Common Issues & Troubleshooting

Solutions to frequently encountered problems when developing OpenNoodl.

## Build Issues

### "Module not found" Errors

**Symptom**: Build fails with `Cannot find module '@noodl-xxx/...'`

**Solutions**:

1. Run `npm install` from root directory
2. Check if package exists in `packages/`
3. Verify tsconfig paths are correct
4. Try: `rm -rf node_modules && npm install`

### "Peer dependency" Warnings

**Symptom**: npm install shows peer dependency warnings

**Solutions**:

1. Check if versions are compatible
2. Update the conflicting package
3. Last resort: `npm install --legacy-peer-deps`
4. Document why in CHANGELOG.md

### TypeScript Errors After Update

**Symptom**: Types that worked before now fail

**Solutions**:

1. Run `npx tsc --noEmit` to see all errors
2. Check if `@types/*` packages need updating
3. Look for breaking changes in updated packages
4. Check `tsconfig.json` for configuration issues

### Webpack Build Hangs

**Symptom**: Build starts but never completes

**Solutions**:

1. Check for circular imports: `npx madge --circular packages/`
2. Increase Node memory: `NODE_OPTIONS=--max_old_space_size=4096`
3. Check for infinite loops in build scripts
4. Try building individual packages

## Runtime Issues

### Hot Reload Not Working

**Symptom**: Changes don't appear without full restart

**Solutions**:

1. Check webpack dev server is running
2. Verify file is being watched (check webpack config)
3. Clear browser cache
4. Check for syntax errors preventing reload
5. Restart dev server: `npm run dev`

### Node Not Appearing in Picker

**Symptom**: Created a node but it doesn't show up

**Solutions**:

1. Verify node is exported in `nodelibraryexport.js`
2. Check `category` is valid
3. Verify no JavaScript errors in node definition
4. Restart the editor

### "Cannot read property of undefined"

**Symptom**: Runtime error accessing object properties

**Solutions**:

1. Add null checks: `obj?.property`
2. Verify data is loaded before access
3. Check async timing issues
4. Add defensive initialization

### State Not Updating

**Symptom**: Changed input but output doesn't update

**Solutions**:

1. Verify `flagOutputDirty()` is called
2. Check if batching is interfering
3. Verify connection exists in graph
4. Check for conditional logic preventing update

### React Component Not Receiving Events

**Symptom**: ProjectModel/NodeLibrary events fire but React components don't update

**Solutions**:

1. **Check if using `useEventListener` hook** (most common issue):

   ```typescript
   // ✅ RIGHT - Always use useEventListener
   import { useEventListener } from '@noodl-hooks/useEventListener';

   // ❌ WRONG - Direct .on() silently fails in React
   useEffect(() => {
     ProjectModel.instance.on('event', handler, {});
   }, []);

   useEventListener(ProjectModel.instance, 'event', handler);
   ```

2. **Check singleton dependency in useEffect**:

   ```typescript
   // ❌ WRONG - Runs once before instance exists
   useEffect(() => {
     if (!ProjectModel.instance) return;
     ProjectModel.instance.on('event', handler, group);
   }, []); // Empty deps!

   // ✅ RIGHT - Re-runs when instance loads
   useEffect(() => {
     if (!ProjectModel.instance) return;
     ProjectModel.instance.on('event', handler, group);
   }, [ProjectModel.instance]); // Include singleton!
   ```

3. **Verify code is loading**:

   - Add `console.log('🔥 Module loaded')` at top of file
   - If log doesn't appear, clear caches (see Webpack issues below)

4. **Check event name matches exactly**:
   - ProjectModel events: `componentRenamed`, `componentAdded`, `componentRemoved`
   - Case-sensitive, no typos

**See also**:

- [LEARNINGS.md - React + EventDispatcher](./LEARNINGS.md#-critical-react--eventdispatcher-incompatibility-phase-0-dec-2025)
- [LEARNINGS.md - Singleton Timing](./LEARNINGS.md#-critical-singleton-dependency-timing-in-useeffect-dec-2025)

### Undo Action Doesn't Execute

**Symptom**: Action returns success and appears in undo history, but nothing happens

**Solutions**:

1. **Check if using broken pattern**:

   ```typescript
   // ❌ WRONG - Silent failure due to ptr bug
   const undoGroup = new UndoActionGroup({ label: 'Action' });
   UndoQueue.instance.push(undoGroup);
   undoGroup.push({ do: () => {...}, undo: () => {...} });
   undoGroup.do(); // NEVER EXECUTES

   // ✅ RIGHT - Use pushAndDo
   UndoQueue.instance.pushAndDo(
     new UndoActionGroup({
       label: 'Action',
       do: () => {...},
       undo: () => {...}
     })
   );
   ```

2. **Add debug logging**:

   ```typescript
   do: () => {
     console.log('🔥 ACTION EXECUTING'); // Should print immediately
     // Your action here
   }
   ```

   If log doesn't print, you have the ptr bug.

3. **Search codebase for broken pattern**:
   ```bash
   grep -r "undoGroup.push" packages/
   grep -r "undoGroup.do()" packages/
   ```
   If these appear together, fix them.

**See also**:

- [UNDO-QUEUE-PATTERNS.md](./UNDO-QUEUE-PATTERNS.md) - Complete guide
- [LEARNINGS.md - UndoActionGroup](./LEARNINGS.md#-critical-undoactiongroupdo-silent-failure-dec-2025)

### Webpack Cache Preventing Code Changes

**Symptom**: Code changes not appearing despite save/restart

**Solutions**:

1. **Verify code is loading** (add module marker):

   ```typescript
   // At top of file
   console.log('🔥 MyFile.ts LOADED - Version 2.0');
   ```

   If this doesn't appear in console, it's a cache issue.

2. **Nuclear cache clear** (when standard restart fails):

   ```bash
   # Kill processes
   killall node
   killall Electron

   # Clear ALL caches
   rm -rf packages/noodl-editor/node_modules/.cache
   rm -rf ~/Library/Application\ Support/Electron
   rm -rf ~/Library/Application\ Support/OpenNoodl  # macOS

   # Restart
   npm run dev
   ```

3. **Check build timestamp**:

   - Look for `🔥 BUILD TIMESTAMP:` in console
   - If timestamp is old, caching is active

4. **Verify in Sources tab**:
   - Open Chrome DevTools
   - Go to Sources tab
   - Find your file
   - Check if changes are there

**See also**: [LEARNINGS.md - Webpack Caching](./LEARNINGS.md#webpack-5-persistent-caching-issues-dec-2025)

## Editor Issues

### Preview Not Loading

**Symptom**: Preview panel is blank or shows error

**Solutions**:

1. Check browser console for errors
2. Verify viewer runtime is built
3. Check for JavaScript errors in project
4. Try creating a new empty project

### Property Panel Empty

**Symptom**: Selected node but no properties shown

**Solutions**:

1. Verify node has `inputs` defined
2. Check `group` values are set
3. Look for errors in property panel code
4. Verify node type is registered

### Canvas Performance Issues

**Symptom**: Node graph is slow/laggy

**Solutions**:

1. Reduce number of visible nodes
2. Check for expensive render operations
3. Verify no infinite update loops
4. Profile with Chrome DevTools

## Git Issues

### Merge Conflicts in package-lock.json

**Symptom**: Complex conflicts in lock file

**Solutions**:

1. Accept either version
2. Run `npm install` to regenerate
3. Commit the regenerated lock file

### Large File Warnings

**Symptom**: Git warns about large files

**Solutions**:

1. Check `.gitignore` includes build outputs
2. Verify `node_modules` not committed
3. Use Git LFS for large assets if needed

## Testing Issues

### Tests Timeout

**Symptom**: Tests hang or timeout

**Solutions**:

1. Check for unresolved promises
2. Verify mocks are set up correctly
3. Increase timeout if legitimately slow
4. Check for infinite loops

### Snapshot Tests Failing

**Symptom**: Snapshot doesn't match

**Solutions**:

1. Review the diff carefully
2. If change is intentional: `npm test -- -u`
3. If unexpected, investigate component changes

## Debugging Tips

### Enable Verbose Logging

```javascript
// Add to see more info
console.log('[DEBUG]', variable);

// For node execution
this.context.debugLog('Message', data);
```

### Use Chrome DevTools

1. Open editor
2. Press `Cmd+Option+I` (Mac) or `Ctrl+Shift+I` (Windows)
3. Check Console for errors
4. Use Sources for breakpoints
5. Use Network for API issues

### Inspect Node State

```javascript
// In browser console
const node = NoodlRuntime.instance.getNodeById('node-id');
console.log(node._internal);
```

### Check Event Flow

```javascript
// Add listener to see all events
model.on('*', (event, data) => {
  console.log('Event:', event, data);
});
```

## Error Messages

### "Maximum call stack size exceeded"

**Cause**: Infinite recursion or circular dependency

**Fix**:

1. Check for circular imports
2. Add base case to recursive functions
3. Break dependency cycles

### "Cannot access before initialization"

**Cause**: Temporal dead zone with `let`/`const`

**Fix**:

1. Check import order
2. Move declaration before usage
3. Check for circular imports

### "Unexpected token"

**Cause**: Syntax error or wrong file type

**Fix**:

1. Check file extension matches content
2. Verify JSON is valid
3. Check for missing brackets/quotes

### "ENOENT: no such file or directory"

**Cause**: Missing file or wrong path

**Fix**:

1. Verify file exists
2. Check path is correct (case-sensitive)
3. Ensure build step completed

## Getting Help

1. Search this document first
2. Check existing task documentation
3. Search codebase for similar patterns
4. Check GitHub issues
5. Ask in community channels

## Contributing Solutions

Found a solution not listed here? Add it!

1. Edit this file
2. Follow the format: Symptom → Solutions
3. Include specific commands when helpful
4. Submit PR with your addition
