var fs = require('fs')
var path = require('path')
/**
* Loads templates from the file system.
* @alias swig.loaders.fs
* @example
* swig.setDefaults({ loader: swig.loaders.fs() });
* @example
* // Load Templates from a specific directory (does not require using relative paths in your templates)
* swig.setDefaults({ loader: swig.loaders.fs(__dirname + '/templates' )});
* @param {string} [basepath=''] Path to the templates as string. Assigning this value allows you to use semi-absolute paths to templates instead of relative paths.
* @param {string} [encoding='utf8'] Template encoding
*/
module.exports = function (basepath, encoding) {
var ret = {}
encoding = encoding || 'utf8'
basepath = basepath ? path.resolve(basepath) : null
/**
* Resolves to to an absolute path or unique identifier. This is used for building correct, normalized, and absolute paths to a given template.
* @alias resolve
* @param {string} to Non-absolute identifier or pathname to a file.
* @param {string} [from] If given, should attempt to find the to path in relation to this given, known path.
* @return {string}
*/
ret.resolve = function (to, from) {
if (basepath) {
from = basepath
} else {
from = from ? path.dirname(from) : process.cwd()
}
return path.resolve(from, to)
}
/**
* Loads a single template. Given a unique identifier found by the resolve method this should return the given template.
* @alias load
* @param {string} identifier Unique identifier of a template (possibly an absolute path).
* @param {function} [cb] Asynchronous callback function. If not provided, this method should run synchronously.
* @return {string} Template source string.
*/
ret.load = function (identifier, cb) {
if (!fs || (cb && !fs.readFile) || !fs.readFileSync) {
throw new Error(
'Unable to find file ' +
identifier +
' because there is no filesystem to read from.'
)
}
identifier = ret.resolve(identifier)
if (cb) {
fs.readFile(identifier, encoding, cb)
return
}
return fs.readFileSync(identifier, encoding)
}
return ret
}