109 lines
2.2 KiB
JavaScript
109 lines
2.2 KiB
JavaScript
// https://github.com/dawaltconley/sass-cast/blob/main/utils.js
|
|
|
|
import * as sass from 'sass-embedded'
|
|
|
|
/**
|
|
* Check if string is quoted
|
|
* @private
|
|
* @param {string} str
|
|
* @return {boolean}
|
|
*/
|
|
export const isQuoted = (str) => /^['"].*['"]$/.test(str)
|
|
|
|
/**
|
|
* Surrounds a string with quotes
|
|
* @private
|
|
* @param {string} str
|
|
* @param {string} q - quotes, double or single
|
|
* @return {string}
|
|
*/
|
|
export const quoteString = (str, q) => {
|
|
if (!q) return str
|
|
if (isQuoted(str)) {
|
|
q = str[0]
|
|
str = str.slice(1, -1)
|
|
}
|
|
let r = new RegExp(q, 'g')
|
|
return q + str.replace(r, '\\' + q) + q
|
|
}
|
|
|
|
/**
|
|
* Unquotes a string
|
|
* @private
|
|
* @param {string} str
|
|
* @return {string}
|
|
*/
|
|
export const unquoteString = (str) => (isQuoted(str) ? str.slice(1, -1) : str)
|
|
|
|
/**
|
|
* Parse a string as a Sass object
|
|
* cribbed from davidkpiano/sassport
|
|
*
|
|
* @private
|
|
* @param {string} str
|
|
* @return {Value}
|
|
*/
|
|
export const parseString = (str) => {
|
|
let result
|
|
|
|
try {
|
|
sass.compileString(`$_: ___(${str});`, {
|
|
functions: {
|
|
'___($value)': (args) => {
|
|
result = args[0]
|
|
return result
|
|
},
|
|
},
|
|
})
|
|
} catch (e) {
|
|
return str
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
/**
|
|
* Parse a string as a legacy Sass object
|
|
* cribbed from davidkpiano/sassport
|
|
*
|
|
* @private
|
|
* @param {string} str
|
|
* @return {LegacyObject}
|
|
*/
|
|
export const parseStringLegacy = (str) => {
|
|
let result
|
|
|
|
try {
|
|
sass.renderSync({
|
|
data: `$_: ___((${str}));`,
|
|
functions: {
|
|
'___($value)': (value) => {
|
|
result = value
|
|
return value
|
|
},
|
|
},
|
|
})
|
|
} catch (e) {
|
|
return str
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
/**
|
|
* Function to handle 'toString()' methods with legacy API.
|
|
*
|
|
* @private
|
|
* @param {LegacyObject} obj
|
|
* @return {string}
|
|
*/
|
|
export const legacyToString = (obj) => (obj.dartValue || obj).toString()
|
|
|
|
/**
|
|
* Return a value from an object and a list of keys.
|
|
* @private
|
|
* @param {Object|Array} obj
|
|
* @param {*[]} attrs
|
|
*/
|
|
export const getAttr = (obj, attrs) => attrs.reduce((o, attr) => o[attr], obj)
|