Ошибки в коде или "Так и должно было быть!"
В процессе работы над NW.js IDE я внедрил туда эдакий "sandbox", который позволяет без вреда для основного контекста запускать JavaScript-программы в основном потоке. Это нужно было мне для отладки и тестирования, чтобы я мог корректно продумать реализацию системы перехвата событий при написании поддержки плагинов.
В процессе я часто пользовался командами console.log/error/info.., которые, в общем-то, вполне меня удовлетворяли ровно до тех пор, пока в рамках окна существовала консоль вывода. Как только я перешел в тестирование собранного приложения, консоль из сборки была убрана, так как программисту давать консоль основного окна смысла нет. Я начал писать свою собственную консоль вывода и отлова ошибок.
С такой консолью команды console не работают, да и объекта такого нет.
Для отлова ошибок я в первую очередь переопределил метод window.onerror, заставив его работать "на себя", далее, поскольку у меня есть возможности управлять родительскими и дочерними объектами "process" (это уже из NodeJS), я переопределил стандартные потоки ввода/вывода для удобства (stdin/stdout).
Это всё было вполне рабочим, и тут я по ошибке где-то написал console.log (вместо нативного $log, который сам же описал), начала выскакивать ошибка об отсутствии объекта console, что более, чем логично. Но я просто по инерции (задумался я на тот момент, кажется), определил объект console, в который встроил нужный метод log.
Всё заработало (в строгом режиме)!
И только после двух дней я внезапно осознал, что сделал. По факту это решило 50% вопросов, которые у меня должны были возникнуть как заставить мою консоль внутри приложения взаимодействовать с "песочницей", в которой уже работает сам программист (пользователь IDE). Я быстренько определил класс, и объектом этого класса стал глобальный объект "console", который реализует в себе вообще всё, что только может быть нужно программисту.
Таким образом, программист вообще не подозревает что и как устроенно внутри редактора, он просто пользуется привычными методами объекта console.
Так же я переопределил метод alert/prompt/confirm, чтобы они делали некоторые нужные мне вещи незаметно для пользователя.
Вот такая вот история о том, как невнимательность привела к тому, что я избавил сам себя от большинства плясок в будущем!