Как использовать CoffeeScript вместо JSON? Для файлов конфигурации и т.д.

JSON действительно больно использовать для локальных файлов конфигурации, так как он не поддерживает комментарии или функции и требует невероятно подробного синтаксиса (запятые, всегда используйте " для ключей). Сделать его очень подверженным ошибкам или в случае, когда функции необходимы, невозможно использовать.

Теперь я знаю, что могу просто сделать:

require('coffee-script')
config = require('config.coffee')

Однако это требует от меня сделать module.exports = {the data} внутри config.coffee, который меньше идеала. И даже позволяет показывать такие вещи, как require, которые могут сделать файлы конфигурации неустойчивыми, если мы им не доверяем.

Кто-нибудь нашел способ прочитать файлы конфигурации coffeescript, но сохранить их в безопасности?

Ответ 1

Выключает CoffeeScript поддерживает встроенную часть безопасности, установив аргумент sandbox на true с помощью вызова eval. Например.

# Prepare
fsUtil = require('fs')
coffee = require('coffee-script')

# Read
dataStr = fsUtil.readFileSync('path').toString()
data = coffee.eval(dataStr, {sandbox:true})

Вышеприведенный код будет считываться в файлах данных, а затем проверять его с помощью coffeescript в режиме песочницы.

Я создал симпатичную оболочку для этого CSON, которая поддерживает файлы coffee и js через require, и cson через указанный выше механизм и json файлы с помощью типичного JSON.parse, а также привязать значения к нотации coffeescript. Используя это, открывается следующий API:

# Include CSON
CSON = require('cson')

# Parse a file path
CSON.parseFile 'data.cson', (err,obj) ->  # async
result = CSON.parseFile('data.cson')  # sync

# Parse a string
CSON.parse src, (err,obj) ->  # async
result = CSON.parseSync(src)  # sync

# Stringify an object to CSON
CSON.stringify data, (err,str) ->  # async
result = CSON.stringifySync(obj)  # sync