@onenexus/synergy-sass-importer
Version:
Import JavaScript/JSON files into Sass
249 lines (190 loc) • 6.94 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.isValidFile = isValidFile;
exports.transformJStoSass = transformJStoSass;
exports.isValidKey = isValidKey;
exports.parseValue = parseValue;
exports.parseList = parseList;
exports.parseMap = parseMap;
exports.valueShouldBeStringified = valueShouldBeStringified;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _isThere = require('is-there');
var _isThere2 = _interopRequireDefault(_isThere);
var _nodeSass = require('node-sass');
var _nodeSass2 = _interopRequireDefault(_nodeSass);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _deepExtend = require('deep-extend');
var _deepExtend2 = _interopRequireDefault(_deepExtend);
require('json5/lib/register');
// Enable JSON5 support
/**
* @param {*} url
* @param {*} prev
*/
exports['default'] = function (url, prev) {
if (!isValidFile(url)) return null;
global.Synergy = global.Synergy || {};
var includePaths = this.options.includePaths ? this.options.includePaths.split(_path2['default'].delimiter) : [];
var paths = [].concat(prev.slice(0, prev.lastIndexOf('/'))).concat(includePaths);
var fileName = paths.map(function (path) {
return (0, _path.resolve)(path, url);
}).filter(_isThere2['default']).pop();
if (!fileName) {
return new Error('Unable to find "' + url + '" from the following path(s): ' + paths.join(', ') + '.');
}
// Prevent file from being cached by Node's `require` on continuous builds.
// https://github.com/Updater/node-sass-json-importer/issues/21
delete require.cache[require.resolve(fileName)];
try {
var extensionlessFilename = (0, _path.basename)(fileName, (0, _path.extname)(fileName));
var data = require(fileName)['default'] || require(fileName);
if (extensionlessFilename === 'theme' || fileName.indexOf('/themes/') > -1) {
var EVALUATED_THEME = evalTheme(data);
Synergy.THEME = EVALUATED_THEME;
return { contents: transformJStoSass({ theme: EVALUATED_THEME }) };
} else {
var _extends2;
var theme = Synergy.THEME || {};
var GLOBAL_VARS = theme.SassGlobalVars || {};
if (typeof data === 'function') data = data(theme);
if (theme.modules) {
data = (0, _deepExtend2['default'])(data, theme.modules[data.name]);
GLOBAL_VARS.CellThemeProcessed = true;
}
return {
file: fileName,
contents: transformJStoSass(_extends((_extends2 = {}, _defineProperty(_extends2, extensionlessFilename, data), _defineProperty(_extends2, 'theme', theme), _extends2), GLOBAL_VARS))
};
}
} catch (error) {
return new Error('synergy-sass-importer: Error transforming JS/JSON to SASS. ' + fileName + '. ' + error);
}
};
/**
* Evaluate theme properties
* @param {*} theme
* @param {*} core
*/
function evalTheme(theme) {
var core = arguments.length <= 1 || arguments[1] === undefined ? theme : arguments[1];
return (function () {
if (!theme) return;
if (Array.isArray(theme)) return theme;
var result = {};
Object.entries(theme).forEach(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2);
var key = _ref2[0];
var value = _ref2[1];
if (typeof value === 'object') {
result[key] = evalTheme(value, core);
} else {
if (typeof value === 'function') {
result[key] = value(core);
} else {
result[key] = value;
}
}
});
return result;
})();
}
/**
* @param {*} url
*/
function isValidFile(url) {
return (/\.(js)(on(5)?|s)?$/.test(url)
);
}
/**
* @param {*} json
*/
function transformJStoSass(json) {
return Object.keys(json).filter(function (key) {
return isValidKey(key);
}).filter(function (key) {
return json[key] !== '#';
}).map(function (key) {
return '$' + key + ': ' + parseValue(json[key]) + ';';
}).join('\n');
}
/**
* @param {*} key
*/
function isValidKey(key) {
return (/^[^$@:].*/.test(key)
);
}
/**
* @param {*} value
*/
function parseValue(value) {
if (typeof value === 'function') {
return '"[function]"';
}
if (_lodash2['default'].isArray(value)) {
return parseList(value);
} else if (_lodash2['default'].isPlainObject(value)) {
return parseMap(value);
} else if (valueShouldBeStringified(value)) {
return '"' + value + '"';
} else {
return value;
}
}
/**
* @param {*} list
*/
function parseList(list) {
return '(' + list.map(function (value) {
return parseValue(value);
}).join(',') + ')';
}
/**
* @param {*} map
*/
function parseMap(map) {
var keys = Object.keys(map).map(function (key) {
try {
_nodeSass2['default'].renderSync({
data: '$foo: (' + key + ': \'value\');'
});
return key;
} catch (error) {
return '"' + key + '"';
}
});
return '(' + keys.filter(function (key) {
return isValidKey(key);
}).map(function (key) {
return key + ': ' + parseValue(map[key.replace(/"/g, "")]);
}).join(',') + ')';
}
/**
* @param {*} value
*/
function valueShouldBeStringified(value) {
try {
_nodeSass2['default'].renderSync({
data: '$foo: (key: ' + value + ');'
});
return false;
} catch (error) {
return true;
}
}
// Super-hacky: Override Babel's transpiled export to provide both
// a default CommonJS export and named exports.
// Fixes: https://github.com/Updater/node-sass-json-importer/issues/32
// TODO: Remove in 3.0.0. Upgrade to Babel6.
module.exports = exports['default'];
Object.keys(exports).forEach(function (key) {
return module.exports[key] = exports[key];
});