UNPKG

@onenexus/synergy-sass-importer

Version:
249 lines (190 loc) 6.94 kB
'use strict'; 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]; });