@nlabs/lex
Version:
68 lines (67 loc) • 9.34 kB
JavaScript
/**
* Copyright (c) 2025-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*
* PostCSS 8-compatible version of postcss-percentage plugin
* Original: https://github.com/antyakushev/postcss-percentage
*/ import Mexp from 'math-expression-evaluator';
import parser from 'postcss-value-parser';
const transformPercentage = (value, precision, floor, trimTrailingZero)=>{
// @ts-expect-error - Mexp default export type issue
const evaluator = new Mexp();
return parser(value).walk((node)=>{
if (node.type !== 'function' || node.value !== 'percentage') {
return;
}
const result = evaluator.eval(parser.stringify(node.nodes)) * 100;
let resultStr;
if (result === 0) {
resultStr = '0';
} else if (floor) {
const resultString = result.toString();
const index = resultString.indexOf('.');
resultStr = index === -1 ? resultString : resultString.substring(0, index + 1 + precision);
} else {
resultStr = result.toFixed(precision);
}
if (trimTrailingZero) {
resultStr = resultStr.replace(/\.0+$/, '').replace(/(\.\d*[1-9])0+$/, '$1');
}
resultStr += '%';
// eslint-disable-next-line no-restricted-properties
Object.assign(node, {
type: 'word',
value: resultStr
});
}).toString();
};
const postcssPercentage = (opts = {})=>{
const options = {
floor: opts.floor,
precision: opts.precision === null || opts.precision === undefined || opts.precision > 20 || opts.precision < 0 ? 6 : opts.precision,
trimTrailingZero: opts.trimTrailingZero === null || opts.trimTrailingZero === undefined ? true : opts.trimTrailingZero
};
return {
// eslint-disable-next-line @typescript-eslint/naming-convention
Once (root, { result }) {
root.walkDecls((decl)=>{
if (!decl.value || !/percentage\s*\(/.test(decl.value)) {
return;
}
try {
decl.value = transformPercentage(decl.value, options.precision, options.floor, options.trimTrailingZero);
} catch (e) {
const error = e;
decl.warn(result, error.message, {
index: decl.index,
word: decl.value
});
}
});
},
postcssPlugin: 'postcss-percentage'
};
};
postcssPercentage.postcss = true;
export default postcssPercentage;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9wb3N0Y3NzL3Bvc3Rjc3MtcGVyY2VudGFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyNS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqXG4gKiBQb3N0Q1NTIDgtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHBvc3Rjc3MtcGVyY2VudGFnZSBwbHVnaW5cbiAqIE9yaWdpbmFsOiBodHRwczovL2dpdGh1Yi5jb20vYW50eWFrdXNoZXYvcG9zdGNzcy1wZXJjZW50YWdlXG4gKi9cbmltcG9ydCBNZXhwIGZyb20gJ21hdGgtZXhwcmVzc2lvbi1ldmFsdWF0b3InO1xuaW1wb3J0IHBhcnNlciBmcm9tICdwb3N0Y3NzLXZhbHVlLXBhcnNlcic7XG5cbmludGVyZmFjZSBQb3N0Y3NzUGVyY2VudGFnZU9wdGlvbnMge1xuICBmbG9vcj86IGJvb2xlYW47XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgdHJpbVRyYWlsaW5nWmVybz86IGJvb2xlYW47XG59XG5cbmNvbnN0IHRyYW5zZm9ybVBlcmNlbnRhZ2UgPSAoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHByZWNpc2lvbjogbnVtYmVyLFxuICBmbG9vcjogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgdHJpbVRyYWlsaW5nWmVybzogYm9vbGVhbiB8IHVuZGVmaW5lZFxuKTogc3RyaW5nID0+IHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIE1leHAgZGVmYXVsdCBleHBvcnQgdHlwZSBpc3N1ZVxuICBjb25zdCBldmFsdWF0b3IgPSBuZXcgTWV4cCgpO1xuICByZXR1cm4gcGFyc2VyKHZhbHVlKS53YWxrKChub2RlKSA9PiB7XG4gICAgaWYobm9kZS50eXBlICE9PSAnZnVuY3Rpb24nIHx8IG5vZGUudmFsdWUgIT09ICdwZXJjZW50YWdlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGV2YWx1YXRvci5ldmFsKHBhcnNlci5zdHJpbmdpZnkobm9kZS5ub2RlcykpICogMTAwO1xuICAgIGxldCByZXN1bHRTdHI6IHN0cmluZztcbiAgICBpZihyZXN1bHQgPT09IDApIHtcbiAgICAgIHJlc3VsdFN0ciA9ICcwJztcbiAgICB9IGVsc2UgaWYoZmxvb3IpIHtcbiAgICAgIGNvbnN0IHJlc3VsdFN0cmluZyA9IHJlc3VsdC50b1N0cmluZygpO1xuICAgICAgY29uc3QgaW5kZXggPSByZXN1bHRTdHJpbmcuaW5kZXhPZignLicpO1xuICAgICAgcmVzdWx0U3RyID0gaW5kZXggPT09IC0xXG4gICAgICAgID8gcmVzdWx0U3RyaW5nXG4gICAgICAgIDogcmVzdWx0U3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCArIDEgKyBwcmVjaXNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRTdHIgPSByZXN1bHQudG9GaXhlZChwcmVjaXNpb24pO1xuICAgIH1cbiAgICBpZih0cmltVHJhaWxpbmdaZXJvKSB7XG4gICAgICByZXN1bHRTdHIgPSByZXN1bHRTdHJcbiAgICAgICAgLnJlcGxhY2UoL1xcLjArJC8sICcnKVxuICAgICAgICAucmVwbGFjZSgvKFxcLlxcZCpbMS05XSkwKyQvLCAnJDEnKTtcbiAgICB9XG4gICAgcmVzdWx0U3RyICs9ICclJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmFzc2lnbihub2RlLCB7XG4gICAgICB0eXBlOiAnd29yZCcgYXMgY29uc3QsXG4gICAgICB2YWx1ZTogcmVzdWx0U3RyXG4gICAgfSk7XG4gIH0pLnRvU3RyaW5nKCk7XG59O1xuXG5jb25zdCBwb3N0Y3NzUGVyY2VudGFnZSA9IChvcHRzOiBQb3N0Y3NzUGVyY2VudGFnZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGZsb29yOiBvcHRzLmZsb29yLFxuICAgIHByZWNpc2lvbjogb3B0cy5wcmVjaXNpb24gPT09IG51bGwgfHwgb3B0cy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCB8fCBvcHRzLnByZWNpc2lvbiA+IDIwIHx8IG9wdHMucHJlY2lzaW9uIDwgMFxuICAgICAgPyA2XG4gICAgICA6IG9wdHMucHJlY2lzaW9uLFxuICAgIHRyaW1UcmFpbGluZ1plcm86IG9wdHMudHJpbVRyYWlsaW5nWmVybyA9PT0gbnVsbCB8fCBvcHRzLnRyaW1UcmFpbGluZ1plcm8gPT09IHVuZGVmaW5lZFxuICAgICAgPyB0cnVlXG4gICAgICA6IG9wdHMudHJpbVRyYWlsaW5nWmVyb1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIE9uY2Uocm9vdCwge3Jlc3VsdH0pIHtcbiAgICAgIHJvb3Qud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgIGlmKCFkZWNsLnZhbHVlIHx8ICEvcGVyY2VudGFnZVxccypcXCgvLnRlc3QoZGVjbC52YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2wudmFsdWUgPSB0cmFuc2Zvcm1QZXJjZW50YWdlKFxuICAgICAgICAgICAgZGVjbC52YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnMucHJlY2lzaW9uLFxuICAgICAgICAgICAgb3B0aW9ucy5mbG9vcixcbiAgICAgICAgICAgIG9wdGlvbnMudHJpbVRyYWlsaW5nWmVyb1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyBFcnJvcjtcbiAgICAgICAgICBkZWNsLndhcm4ocmVzdWx0LCBlcnJvci5tZXNzYWdlLCB7XG4gICAgICAgICAgICBpbmRleDogZGVjbC5pbmRleCxcbiAgICAgICAgICAgIHdvcmQ6IGRlY2wudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBwb3N0Y3NzUGx1Z2luOiAncG9zdGNzcy1wZXJjZW50YWdlJ1xuICB9O1xufTtcblxucG9zdGNzc1BlcmNlbnRhZ2UucG9zdGNzcyA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IHBvc3Rjc3NQZXJjZW50YWdlO1xuXG4iXSwibmFtZXMiOlsiTWV4cCIsInBhcnNlciIsInRyYW5zZm9ybVBlcmNlbnRhZ2UiLCJ2YWx1ZSIsInByZWNpc2lvbiIsImZsb29yIiwidHJpbVRyYWlsaW5nWmVybyIsImV2YWx1YXRvciIsIndhbGsiLCJub2RlIiwidHlwZSIsInJlc3VsdCIsImV2YWwiLCJzdHJpbmdpZnkiLCJub2RlcyIsInJlc3VsdFN0ciIsInJlc3VsdFN0cmluZyIsInRvU3RyaW5nIiwiaW5kZXgiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwidG9GaXhlZCIsInJlcGxhY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJwb3N0Y3NzUGVyY2VudGFnZSIsIm9wdHMiLCJvcHRpb25zIiwidW5kZWZpbmVkIiwiT25jZSIsInJvb3QiLCJ3YWxrRGVjbHMiLCJkZWNsIiwidGVzdCIsImUiLCJlcnJvciIsIndhcm4iLCJtZXNzYWdlIiwid29yZCIsInBvc3Rjc3NQbHVnaW4iLCJwb3N0Y3NzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0NBTUMsR0FDRCxPQUFPQSxVQUFVLDRCQUE0QjtBQUM3QyxPQUFPQyxZQUFZLHVCQUF1QjtBQVExQyxNQUFNQyxzQkFBc0IsQ0FDMUJDLE9BQ0FDLFdBQ0FDLE9BQ0FDO0lBRUEsb0RBQW9EO0lBQ3BELE1BQU1DLFlBQVksSUFBSVA7SUFDdEIsT0FBT0MsT0FBT0UsT0FBT0ssSUFBSSxDQUFDLENBQUNDO1FBQ3pCLElBQUdBLEtBQUtDLElBQUksS0FBSyxjQUFjRCxLQUFLTixLQUFLLEtBQUssY0FBYztZQUMxRDtRQUNGO1FBRUEsTUFBTVEsU0FBU0osVUFBVUssSUFBSSxDQUFDWCxPQUFPWSxTQUFTLENBQUNKLEtBQUtLLEtBQUssS0FBSztRQUM5RCxJQUFJQztRQUNKLElBQUdKLFdBQVcsR0FBRztZQUNmSSxZQUFZO1FBQ2QsT0FBTyxJQUFHVixPQUFPO1lBQ2YsTUFBTVcsZUFBZUwsT0FBT00sUUFBUTtZQUNwQyxNQUFNQyxRQUFRRixhQUFhRyxPQUFPLENBQUM7WUFDbkNKLFlBQVlHLFVBQVUsQ0FBQyxJQUNuQkYsZUFDQUEsYUFBYUksU0FBUyxDQUFDLEdBQUdGLFFBQVEsSUFBSWQ7UUFDNUMsT0FBTztZQUNMVyxZQUFZSixPQUFPVSxPQUFPLENBQUNqQjtRQUM3QjtRQUNBLElBQUdFLGtCQUFrQjtZQUNuQlMsWUFBWUEsVUFDVE8sT0FBTyxDQUFDLFNBQVMsSUFDakJBLE9BQU8sQ0FBQyxtQkFBbUI7UUFDaEM7UUFDQVAsYUFBYTtRQUNiLG9EQUFvRDtRQUNwRFEsT0FBT0MsTUFBTSxDQUFDZixNQUFNO1lBQ2xCQyxNQUFNO1lBQ05QLE9BQU9ZO1FBQ1Q7SUFDRixHQUFHRSxRQUFRO0FBQ2I7QUFFQSxNQUFNUSxvQkFBb0IsQ0FBQ0MsT0FBaUMsQ0FBQyxDQUFDO0lBQzVELE1BQU1DLFVBQVU7UUFDZHRCLE9BQU9xQixLQUFLckIsS0FBSztRQUNqQkQsV0FBV3NCLEtBQUt0QixTQUFTLEtBQUssUUFBUXNCLEtBQUt0QixTQUFTLEtBQUt3QixhQUFhRixLQUFLdEIsU0FBUyxHQUFHLE1BQU1zQixLQUFLdEIsU0FBUyxHQUFHLElBQzFHLElBQ0FzQixLQUFLdEIsU0FBUztRQUNsQkUsa0JBQWtCb0IsS0FBS3BCLGdCQUFnQixLQUFLLFFBQVFvQixLQUFLcEIsZ0JBQWdCLEtBQUtzQixZQUMxRSxPQUNBRixLQUFLcEIsZ0JBQWdCO0lBQzNCO0lBRUEsT0FBTztRQUNMLGdFQUFnRTtRQUNoRXVCLE1BQUtDLElBQUksRUFBRSxFQUFDbkIsTUFBTSxFQUFDO1lBQ2pCbUIsS0FBS0MsU0FBUyxDQUFDLENBQUNDO2dCQUNkLElBQUcsQ0FBQ0EsS0FBSzdCLEtBQUssSUFBSSxDQUFDLGtCQUFrQjhCLElBQUksQ0FBQ0QsS0FBSzdCLEtBQUssR0FBRztvQkFDckQ7Z0JBQ0Y7Z0JBRUEsSUFBSTtvQkFDRjZCLEtBQUs3QixLQUFLLEdBQUdELG9CQUNYOEIsS0FBSzdCLEtBQUssRUFDVndCLFFBQVF2QixTQUFTLEVBQ2pCdUIsUUFBUXRCLEtBQUssRUFDYnNCLFFBQVFyQixnQkFBZ0I7Z0JBRTVCLEVBQUUsT0FBTTRCLEdBQUc7b0JBQ1QsTUFBTUMsUUFBUUQ7b0JBQ2RGLEtBQUtJLElBQUksQ0FBQ3pCLFFBQVF3QixNQUFNRSxPQUFPLEVBQUU7d0JBQy9CbkIsT0FBT2MsS0FBS2QsS0FBSzt3QkFDakJvQixNQUFNTixLQUFLN0IsS0FBSztvQkFDbEI7Z0JBQ0Y7WUFDRjtRQUNGO1FBQ0FvQyxlQUFlO0lBQ2pCO0FBQ0Y7QUFFQWQsa0JBQWtCZSxPQUFPLEdBQUc7QUFFNUIsZUFBZWYsa0JBQWtCIn0=