144 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| ;(function (exports) {
 | |
|   'use strict';
 | |
| 
 | |
|   var path  = exports.path  || require('path')
 | |
|     ;
 | |
| 
 | |
|   function escapeRegExp(str) {
 | |
|     return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
 | |
|   }
 | |
| 
 | |
|   function safeResolve(basename, target) {
 | |
|     basename = path.resolve(basename);
 | |
| 
 | |
|     var targetname = path.resolve(basename, target)
 | |
|       , re = new RegExp('^' + escapeRegExp(basename) + '(/|$)')
 | |
|       ;
 | |
| 
 | |
|     return re.test(targetname) && targetname;
 | |
|   }
 | |
| 
 | |
|   exports.safeResolve = safeResolve;
 | |
|   exports.escapeRegExp = escapeRegExp;
 | |
| 
 | |
|   function create(Desi) {
 | |
|     var fsapi = Desi.fsapi || require('./node-adapters').fsapi
 | |
|       ;
 | |
| 
 | |
|     fsapi.getConfigs = function (confs) {
 | |
|       var opts = { extensions: ['yml', 'yaml', 'json'], dotfiles: false, contents: true, sha1sum: true }
 | |
|         ;
 | |
| 
 | |
|       return fsapi.getMeta(confs, opts).then(function (collections) {
 | |
|         var obj = {}
 | |
|           ;
 | |
| 
 | |
|         Object.keys(collections).forEach(function (key) {
 | |
|           var files = collections[key]
 | |
|             , keyname = key.replace(/\.(json|ya?ml|\/)$/i, '')
 | |
|             ;
 | |
| 
 | |
|           obj[keyname] = obj[keyname] || {};
 | |
| 
 | |
|           files.forEach(function (file) {
 | |
|             var filename = file.name.replace(/\.(json|ya?ml)$/i, '')
 | |
|               , data = {}
 | |
|               ;
 | |
| 
 | |
|             if (file.error) {
 | |
|               console.error(file);
 | |
|               console.error(file.error);
 | |
|               return;
 | |
|             }
 | |
| 
 | |
|             if (/\.(ya?ml)$/i.test(file.name)) {
 | |
|               try {
 | |
|                 data = Desi.YAML.parse(file.contents) || {};
 | |
|                 if ("undefined" === data) {
 | |
|                   data = {};
 | |
|                 }
 | |
|               } catch(e) {
 | |
|                 data = { error: e };
 | |
|                 console.error("Could not parse yaml for " + filename);
 | |
|                 console.error(file);
 | |
|                 console.error(e);
 | |
|               }
 | |
|             }
 | |
|             else if (/\.(json)$/i.test(file.name)) {
 | |
|               try {
 | |
|                 data = JSON.parse(file.contents) || {};
 | |
|               } catch(e) {
 | |
|                 data = { error: e };
 | |
|                 console.error("Could not parse json for " + filename);
 | |
|                 console.error(file);
 | |
|                 console.error(e);
 | |
|               }
 | |
|             } else {
 | |
|               console.error("Not sure what to do with this one...");
 | |
|               console.error(file);
 | |
|             }
 | |
| 
 | |
|             data = obj[keyname][filename] = data || obj[keyname][filename];
 | |
|             if (data) {
 | |
|               data.filename = file.name;
 | |
|             }
 | |
|             /*
 | |
|             if (!obj[keyname][filename]) {
 | |
|               obj[keyname][filename] = {};
 | |
|             }
 | |
| 
 | |
|             Object.keys(data).forEach(function (key) {
 | |
|               obj[keyname][filename][key] = data[key];
 | |
|             });
 | |
|             */
 | |
|           });
 | |
|         });
 | |
| 
 | |
|         return obj;
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     fsapi.getAllPartials = function () {
 | |
|       return fsapi.getConfigs(['partials', 'partials.yml']).then(function (results) {
 | |
|         var partials = {}
 | |
|           ;
 | |
| 
 | |
|         Object.keys(results.partials).forEach(function (key) {
 | |
|           var partial = results.partials[key]
 | |
|             ;
 | |
| 
 | |
|           Object.keys(partial).forEach(function (prop) {
 | |
|             if (partials[prop]) {
 | |
|               console.warn('partial \'' + prop + '\' overwritten by ' + key);
 | |
|             }
 | |
| 
 | |
|             partials[prop] = partial[prop];
 | |
|           });
 | |
|         });
 | |
| 
 | |
|         return partials;
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     fsapi.getAllConfigFiles = function () {
 | |
|       return fsapi.getConfigs(['config.yml', 'site.yml', 'authors']).then(function (results) {
 | |
|         var authors = results.authors
 | |
|           , config = results.config.config
 | |
|           , site = results.site.site
 | |
|           ;
 | |
| 
 | |
|         return { config: config, authors: authors, site: site };
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     return exports;
 | |
|   }
 | |
| 
 | |
|   if (exports.Desirae) {
 | |
|     create(exports.Desirae);
 | |
|   }
 | |
|   else {
 | |
|     exports.create = create;
 | |
|   }
 | |
| }('undefined' !== typeof exports && exports || window));
 |