- Move 12 markdown files from root to docs/ subdirectories - Organize documentation by category: • docs/troubleshooting/ (1 file) - Technical troubleshooting guides • docs/deployment/ (4 files) - Deployment and security documentation • docs/guides/ (3 files) - Feature-specific guides • docs/planning/ (4 files) - Planning and improvement proposals Root directory cleanup: - Reduced from 16 to 4 markdown files in root - Only essential project files remain: • CLAUDE.md (AI instructions) • README.md (Main project readme) • CLEANUP_PLAN.md (Current cleanup plan) • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements) This improves: ✅ Documentation discoverability ✅ Logical organization by purpose ✅ Clean root directory ✅ Better maintainability
75 lines
1.7 KiB
JavaScript
75 lines
1.7 KiB
JavaScript
export class EventEmitter {
|
|
constructor() {
|
|
this.events = new Map();
|
|
}
|
|
|
|
on(event, listener) {
|
|
if (!this.events.has(event)) {
|
|
this.events.set(event, []);
|
|
}
|
|
this.events.get(event).push(listener);
|
|
return this; // Allow chaining
|
|
}
|
|
|
|
off(event, listener) {
|
|
if (!this.events.has(event)) {
|
|
return this;
|
|
}
|
|
|
|
const listeners = this.events.get(event);
|
|
const index = listeners.indexOf(listener);
|
|
if (index > -1) {
|
|
listeners.splice(index, 1);
|
|
}
|
|
|
|
// Remove event key if no listeners remain
|
|
if (listeners.length === 0) {
|
|
this.events.delete(event);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
emit(event, ...args) {
|
|
if (!this.events.has(event)) {
|
|
return false;
|
|
}
|
|
|
|
const listeners = this.events.get(event);
|
|
for (const listener of listeners) {
|
|
try {
|
|
listener.apply(this, args);
|
|
} catch (error) {
|
|
console.error('Error in event listener:', error);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
once(event, listener) {
|
|
const onceWrapper = (...args) => {
|
|
this.off(event, onceWrapper);
|
|
listener.apply(this, args);
|
|
};
|
|
|
|
return this.on(event, onceWrapper);
|
|
}
|
|
|
|
removeAllListeners(event) {
|
|
if (event) {
|
|
this.events.delete(event);
|
|
} else {
|
|
this.events.clear();
|
|
}
|
|
return this;
|
|
}
|
|
|
|
listenerCount(event) {
|
|
return this.events.has(event) ? this.events.get(event).length : 0;
|
|
}
|
|
|
|
eventNames() {
|
|
return Array.from(this.events.keys());
|
|
}
|
|
} |