node-sass-json-functions 4.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## [Unreleased][]
4
4
 
5
+ ## [4.1.0][] - 2023-09-20
6
+
7
+ ### Changed
8
+
9
+ - Parse calc values to true values instead of null
10
+ ([#7](https://github.com/niksy/node-sass-json-functions/issues/7))
11
+
12
+ ## [4.0.2][] - 2023-08-16
13
+
14
+ ### Fixed
15
+
16
+ - Quoted strings for map keys
17
+ ([#9](https://github.com/niksy/node-sass-json-functions/issues/9))
18
+
5
19
  ## [4.0.1][] - 2023-06-13
6
20
 
7
21
  ### Fixed
@@ -57,16 +71,13 @@
57
71
  [3.0.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.0.0
58
72
  [3.1.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.1.0
59
73
  [3.2.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.2.0
60
-
61
- <!-- prettier-ignore-end -->
62
-
63
- https://github.com/niksy/node-sass-json-functions/compare/v3.3.0...HEAD
64
-
65
74
  [3.3.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.3.0
66
- [Unreleased]:
67
- https://github.com/niksy/node-sass-json-functions/compare/v4.0.1...HEAD
68
75
  [4.0.1]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.1
76
+ [4.0.0]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.0
77
+ [Unreleased]:
78
+ https://github.com/niksy/node-sass-json-functions/compare/v4.1.0...HEAD
79
+ [4.1.0]: https://github.com/niksy/node-sass-json-functions/tree/v4.1.0
69
80
 
70
- https://github.com/niksy/node-sass-json-functions/compare/v4.0.0...HEAD
81
+ https://github.com/niksy/node-sass-json-functions/compare/v4.0.2...HEAD
71
82
 
72
- [4.0.0]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.0
83
+ [4.0.2]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.2
package/README.md CHANGED
@@ -55,7 +55,10 @@ $map: (
55
55
  bag: 'foo bar'
56
56
  ),
57
57
  qux: rgba(255, 255, 255, 0.5),
58
- corgle: red
58
+ corgle: red,
59
+ george: calc(42px + 42%),
60
+ lexi: calc(42px / 2),
61
+ oliver: calc(42px + 10px + 10px)
59
62
  );
60
63
 
61
64
  body {
@@ -73,7 +76,7 @@ body {
73
76
  content: '[1,2,"3",[4,5,6],{"foo":"bar baz"}]';
74
77
  content: '{"foo":1,"bar":[2,3],"baz":"3 3 3","bad":{"foo":11,"bar":22,"baz":[5,4,6,null,1,"1.23457px"],"bag":"foo bar"},"qux":"rgba(255,255,255,0.5)","corgle":"#f00"}';
75
78
  content: [1,2,"3",[4,5,6],{"foo":"bar baz"}];
76
- content: {"foo":1,"bar":[2,3],"baz":"3 3 3","bad":{"foo":11,"bar":22,"baz":[5,4,6,null,1,"1.23457px"],"bag":"foo bar"},"qux":"rgba(255,255,255,0.5)","corgle":"#f00"};
79
+ content: {"foo":1,"bar":[2,3],"baz":"3 3 3","bad":{"foo":11,"bar":22,"baz":[5,4,6,null,1,"1.23457px"],"bag":"foo bar"},"qux":"rgba(255,255,255,0.5)","corgle":"#f00","george":"calc(42px + 42%)","lexi":"21px","oliver":"62px"};
77
80
  }
78
81
  ```
79
82
 
@@ -83,7 +86,7 @@ Input:
83
86
 
84
87
  ```scss
85
88
  $array: '[1,2,"3",[4,5,6],{"foo":"bar baz"}]';
86
- $object: '{"foo":1,"bar":[2,3],"baz":"3 3 3","bad":{"foo":11,"bar":22,"baz":[5,4,6,null,1,"1.23456789px"],"bag":"foo bar"},"qux":"rgba(255,255,255,0.5)","corgle":"#f00"}';
89
+ $object: '{"foo":1,"bar":[2,3],"baz":"3 3 3","bad":{"foo":11,"bar":22,"baz":[5,4,6,null,1,"1.23456789px"],"bag":"foo bar"},"qux":"rgba(255,255,255,0.5)","corgle":"#f00","george":"calc(42px + 42%)","lexi":"21px","oliver":"calc(42px + 10px + 10px)"}';
87
90
 
88
91
  @debug json-decode($array);
89
92
  @debug json-decode($object);
@@ -93,7 +96,7 @@ Output:
93
96
 
94
97
  ```sh
95
98
  DEBUG: 1, 2, 3, 4, 5, 6, (foo: bar baz)
96
- DEBUG: (foo: 1, bar: 2, 3, baz: 3 3 3, bad: (foo: 11, bar: 22, baz: 5, 4, 6, null, 1, 1.23456789px, bag: foo bar), qux: rgba(255, 255, 255, 0.5), corgle: red)
99
+ DEBUG: (foo: 1, bar: 2, 3, baz: 3 3 3, bad: (foo: 11, bar: 22, baz: 5, 4, 6, null, 1, 1.23456789px, bag: foo bar), qux: rgba(255, 255, 255, 0.5), corgle: red, george: calc(42px + 42%), lexi: 21px, oliver: "calc(42px + 10px + 10px)")
97
100
  ```
98
101
 
99
102
  ## API
@@ -111,6 +114,8 @@ standard CSS values.
111
114
  - [Sass colors][sass-color] are transformed to `rgba()` syntax if they have
112
115
  alpha value, otherwise they are transformed to hex value (and it’s shorther
113
116
  version if possible)
117
+ - [Sass calculations][sass-calculation] are transformed to values
118
+ corresponding to calculation result (string or number)
114
119
  - [Sass strings][sass-string] are transformed to strings
115
120
  - [Sass numbers][sass-number] are transformed to numbers
116
121
  - [Sass booleans][sass-boolean] are transformed to booleans
@@ -141,6 +146,9 @@ types][sass-types].
141
146
  - Objects are transformed to [Sass maps][sass-map]
142
147
  - Anything properly parsed with [parse-color][parse-color] is transformed to
143
148
  [Sass color][sass-color]
149
+ - Calculations (`calc()` values) are transformed to [Sass
150
+ calculations][sass-calculation] for simple operations and to [Sass
151
+ strings][sass-string] for everything else
144
152
  - Strings are transformed to Sass numbers with units if they can be properly
145
153
  parsed with [parse-css-dimension][parse-css-dimension], otherwise they are
146
154
  transformed to [Sass strings][sass-string]
@@ -172,6 +180,7 @@ MIT © [Ivan Nikolić](http://ivannikolic.com)
172
180
  [sass-string]: https://sass-lang.com/documentation/values/strings
173
181
  [sass-null]: https://sass-lang.com/documentation/values/null
174
182
  [sass-boolean]: https://sass-lang.com/documentation/values/booleans
183
+ [sass-calculation]: https://sass-lang.com/documentation/values/calculations
175
184
  [parse-color]: https://github.com/substack/parse-color
176
185
  [parse-css-dimension]: https://github.com/jedmao/parse-css-dimension
177
186
 
package/cjs/index.js CHANGED
@@ -7,6 +7,7 @@ var isPlainObject = require('is-plain-obj');
7
7
  var parseColor = require('parse-color');
8
8
  var parseUnit = require('parse-css-dimension');
9
9
  var immutable = require('immutable');
10
+ var postcssValuesParser = require('postcss-values-parser');
10
11
 
11
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
13
 
@@ -45,6 +46,7 @@ var parseUnit__default = /*#__PURE__*/_interopDefaultLegacy(parseUnit);
45
46
  * @param {sass.Value|undefined} value
46
47
  */
47
48
  function getJsonValueFromSassValue(value) {
49
+ var _resolvedValue;
48
50
  let resolvedValue;
49
51
  if (value instanceof sass__namespace.SassList) {
50
52
  resolvedValue = listToArray(value);
@@ -69,10 +71,14 @@ function getJsonValueFromSassValue(value) {
69
71
  resolvedValue = String(value.text);
70
72
  } else if (value instanceof sass__namespace.SassBoolean) {
71
73
  resolvedValue = Boolean(value.value);
72
- } else {
74
+ } else if (typeof value === 'undefined') {
75
+ resolvedValue = null;
76
+ } else if (value.isTruthy) {
77
+ resolvedValue = value.toString();
78
+ } else if (value.realNull) {
73
79
  resolvedValue = null;
74
80
  }
75
- return resolvedValue;
81
+ return (_resolvedValue = resolvedValue) !== null && _resolvedValue !== void 0 ? _resolvedValue : null;
76
82
  }
77
83
 
78
84
  /**
@@ -103,7 +109,7 @@ function mapToObject(map) {
103
109
  }).keys()) {
104
110
  const resolvedValue = map.get(index);
105
111
  if (typeof resolvedValue !== 'undefined') {
106
- const key = String(resolvedValue.get(0));
112
+ const key = String(getJsonValueFromSassValue(resolvedValue.get(0)));
107
113
  const value = getJsonValueFromSassValue(resolvedValue.get(1));
108
114
  data[key] = value;
109
115
  }
@@ -129,7 +135,27 @@ function isColor(value) {
129
135
  /**
130
136
  * @param {string} value
131
137
  */
132
- function parseValueToStringOrNumber(value) {
138
+ function isCalculation(value) {
139
+ if (!value.includes('calc')) {
140
+ return false;
141
+ }
142
+ try {
143
+ const root = postcssValuesParser.parse(value);
144
+ const node = root.first;
145
+ return (node === null || node === void 0 ? void 0 : node.type) === 'func' && node.name === 'calc';
146
+ } catch {
147
+ return false;
148
+ }
149
+ }
150
+
151
+ /**
152
+ * @param {string} value
153
+ * @param {{forceNumber: boolean}=} options
154
+ */
155
+ function parseValueToStringOrNumber(value, options) {
156
+ const {
157
+ forceNumber = false
158
+ } = options !== null && options !== void 0 ? options : {};
133
159
  let resolvedValue;
134
160
  try {
135
161
  const {
@@ -141,6 +167,8 @@ function parseValueToStringOrNumber(value) {
141
167
  resolvedValue = new sass__namespace.SassNumber(parsedValue, unit);
142
168
  } else if (type === 'percentage') {
143
169
  resolvedValue = new sass__namespace.SassNumber(parsedValue, '%');
170
+ } else if (forceNumber && !Number.isNaN(Number(value))) {
171
+ resolvedValue = new sass__namespace.SassNumber(Number(value));
144
172
  } else {
145
173
  resolvedValue = new sass__namespace.SassString(value);
146
174
  }
@@ -163,6 +191,50 @@ function parseValueToColor(value) {
163
191
  });
164
192
  }
165
193
 
194
+ /**
195
+ * @typedef {object} CalculationContainer
196
+ * @property {?sass.CalculationOperator} operator
197
+ * @property {?sass.CalculationValue} left
198
+ * @property {?sass.CalculationValue} right
199
+ */
200
+
201
+ /**
202
+ * @param {string} value
203
+ */
204
+ function parseValueToCalculation(value) {
205
+ const root = postcssValuesParser.parse(value);
206
+ const node = root.first;
207
+ let calc = /** @type {CalculationContainer} */{
208
+ operator: null,
209
+ left: null,
210
+ right: null
211
+ };
212
+ if ((node === null || node === void 0 ? void 0 : node.type) === 'func' && node.name === 'calc') {
213
+ if (node.nodes.length > 3) {
214
+ return parseValueToStringOrNumber(value);
215
+ }
216
+ node.nodes.forEach((node, index) => {
217
+ if (node.type === 'operator') {
218
+ calc.operator = /** @type {sass.CalculationOperator} */
219
+ node.value;
220
+ } else if (index === 0) {
221
+ calc.left = parseValueToStringOrNumber(node.toString());
222
+ } else {
223
+ calc.right = parseValueToStringOrNumber(node.toString(), {
224
+ forceNumber: true
225
+ });
226
+ }
227
+ });
228
+ }
229
+ try {
230
+ return sass__namespace.SassCalculation.calc(new sass__namespace.CalculationOperation(
231
+ // @ts-ignore
232
+ calc.operator, calc.left, calc.right));
233
+ } catch {
234
+ return parseValueToStringOrNumber(value);
235
+ }
236
+ }
237
+
166
238
  /**
167
239
  * @param {JsonValue} value
168
240
  */
@@ -174,6 +246,8 @@ function setJsonValueToSassValue(value) {
174
246
  resolvedValue = objectToMap(value);
175
247
  } else if (isColor(String(value))) {
176
248
  resolvedValue = parseValueToColor(String(value));
249
+ } else if (isCalculation(String(value))) {
250
+ resolvedValue = parseValueToCalculation(String(value));
177
251
  } else if (typeof value === 'string') {
178
252
  resolvedValue = parseValueToStringOrNumber(value);
179
253
  } else if (typeof value === 'number') {
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../lib/sass-to-json.js","../lib/json-to-sass.js","../index.js"],"sourcesContent":["import * as sass from 'sass';\nimport rgbHex from 'rgb-hex';\nimport shortHexColor from 'shorten-css-hex';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\n/**\n * @param {sass.Value|undefined} value\n */\nfunction getJsonValueFromSassValue(value) {\n\tlet resolvedValue;\n\tif (value instanceof sass.SassList) {\n\t\tresolvedValue = listToArray(value);\n\t} else if (value instanceof sass.SassMap) {\n\t\tresolvedValue = mapToObject(value);\n\t} else if (value instanceof sass.SassColor) {\n\t\t/** @type {[number, number, number]} */\n\t\tconst rgbValue = [value.red, value.green, value.blue];\n\t\tconst alphaValue = value.alpha;\n\t\tif (alphaValue === 1) {\n\t\t\tresolvedValue = shortHexColor(`#${rgbHex.apply(null, rgbValue)}`);\n\t\t} else {\n\t\t\tresolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;\n\t\t}\n\t} else if (value instanceof sass.SassNumber) {\n\t\tif (value.hasUnits) {\n\t\t\tresolvedValue = String(value.value) + value.numeratorUnits.last();\n\t\t} else {\n\t\t\tresolvedValue = Number(value.value);\n\t\t}\n\t} else if (value instanceof sass.SassString) {\n\t\tresolvedValue = String(value.text);\n\t} else if (value instanceof sass.SassBoolean) {\n\t\tresolvedValue = Boolean(value.value);\n\t} else {\n\t\tresolvedValue = null;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {sass.SassList} list\n */\nfunction listToArray(list) {\n\tconst length = list.asList.size;\n\t/** @type {JsonArray} */\n\tconst data = [];\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst value = getJsonValueFromSassValue(list.get(index));\n\t\tdata.push(value);\n\t}\n\treturn data;\n}\n\n/**\n * @param {sass.SassMap} map\n */\nfunction mapToObject(map) {\n\tconst length = map.contents.size;\n\t/** @type {JsonObject} */\n\tconst data = {};\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst resolvedValue = map.get(index);\n\t\tif (typeof resolvedValue !== 'undefined') {\n\t\t\tconst key = String(resolvedValue.get(0));\n\t\t\tconst value = getJsonValueFromSassValue(resolvedValue.get(1));\n\t\t\tdata[key] = value;\n\t\t}\n\t}\n\treturn data;\n}\n\nexport default getJsonValueFromSassValue;\n","import * as sass from 'sass';\nimport isPlainObject from 'is-plain-obj';\nimport parseColor from 'parse-color';\nimport parseUnit from 'parse-css-dimension';\nimport { OrderedMap } from 'immutable';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\nconst unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];\n\n/**\n * @param {string} value\n */\nfunction isColor(value) {\n\treturn typeof parseColor(value).rgba !== 'undefined';\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToStringOrNumber(value) {\n\tlet resolvedValue;\n\ttry {\n\t\tconst { value: parsedValue, unit, type } = parseUnit(value);\n\t\tif (unitTypes.includes(type)) {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, unit);\n\t\t} else if (type === 'percentage') {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, '%');\n\t\t} else {\n\t\t\tresolvedValue = new sass.SassString(value);\n\t\t}\n\t} catch (error) {\n\t\tresolvedValue = new sass.SassString(value);\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToColor(value) {\n\tconst [red, green, blue, alpha] = parseColor(value).rgba;\n\treturn new sass.SassColor({\n\t\tred,\n\t\tgreen,\n\t\tblue,\n\t\talpha\n\t});\n}\n\n/**\n * @param {JsonValue} value\n */\nfunction setJsonValueToSassValue(value) {\n\tlet resolvedValue;\n\tif (Array.isArray(value)) {\n\t\tresolvedValue = arrayToList(value);\n\t} else if (isPlainObject(value)) {\n\t\tresolvedValue = objectToMap(value);\n\t} else if (isColor(String(value))) {\n\t\tresolvedValue = parseValueToColor(String(value));\n\t} else if (typeof value === 'string') {\n\t\tresolvedValue = parseValueToStringOrNumber(value);\n\t} else if (typeof value === 'number') {\n\t\tresolvedValue = new sass.SassNumber(value);\n\t} else if (typeof value === 'boolean') {\n\t\tresolvedValue = value ? sass.sassTrue : sass.sassFalse;\n\t} else {\n\t\tresolvedValue = sass.sassNull;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {JsonArray} array\n */\nfunction arrayToList(array) {\n\t/** @type {sass.Value[]} */\n\tconst data = [];\n\tfor (const item of array) {\n\t\tdata.push(setJsonValueToSassValue(item));\n\t}\n\treturn new sass.SassList(data);\n}\n\n/**\n * @param {JsonObject} object\n */\nfunction objectToMap(object) {\n\t/** @type {[sass.Value, sass.Value][]} */\n\tconst data = [];\n\tfor (const [property, value = null] of Object.entries(object)) {\n\t\tdata.push([\n\t\t\tsetJsonValueToSassValue(property),\n\t\t\tsetJsonValueToSassValue(value)\n\t\t]);\n\t}\n\t// eslint-disable-next-line new-cap\n\treturn new sass.SassMap(OrderedMap(data));\n}\n\nexport default setJsonValueToSassValue;\n","import * as sass from 'sass';\nimport getJsonValueFromSassValue from './lib/sass-to-json.js';\nimport setJsonValueToSassValue from './lib/json-to-sass.js';\n\n/**\n * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue\n * @typedef {JsonValue[]} JsonArray\n * @typedef {string | number | boolean | null} JsonPrimitive\n * @typedef {{[Key in string]?: JsonValue}} JsonObject\n */\n\n/**\n * Encodes (`JSON.stringify`) data and returns Sass string. By default, string is quoted with single quotes so that it can be easily used in standard CSS values.\n *\n * First argument: `sass.Value` - Data to encode (stringify).\n *\n * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.\n *\n * @param {sass.Value[]} encodeArguments\n */\nfunction encode(encodeArguments) {\n\tconst [data, quotes_] = encodeArguments;\n\tconst quotes = quotes_.assertBoolean('quotes');\n\tconst shouldQuote = quotes.value;\n\tlet resolvedValue = JSON.stringify(getJsonValueFromSassValue(data));\n\tif (shouldQuote) {\n\t\tresolvedValue = `'${resolvedValue}'`;\n\t}\n\treturn new sass.SassString(resolvedValue);\n}\n\n/**\n * Decodes (`JSON.parse`) string and returns one of available Sass types.\n *\n * First argument: `sass.SassString` - String to decode (parse).\n *\n * @param {sass.Value[]} decodeArguments\n */\nfunction decode(decodeArguments) {\n\tconst [string_] = decodeArguments;\n\tconst string = string_.assertString('string');\n\t/** @type {JsonValue?} */\n\tlet resolvedValue = {};\n\ttry {\n\t\tresolvedValue = JSON.parse(string.text);\n\t} catch (error) {\n\t\tresolvedValue = null;\n\t}\n\treturn setJsonValueToSassValue(resolvedValue);\n}\n\n/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */\nconst api = {\n\t'json-encode($data, $quotes: true)': encode,\n\t'json-decode($string)': decode\n};\n\nexport default api;\n"],"names":["getJsonValueFromSassValue","value","resolvedValue","sass","SassList","listToArray","SassMap","mapToObject","SassColor","rgbValue","red","green","blue","alphaValue","alpha","shortHexColor","rgbHex","apply","join","SassNumber","hasUnits","String","numeratorUnits","last","Number","SassString","text","SassBoolean","Boolean","list","length","asList","size","data","index","Array","from","keys","get","push","map","contents","key","unitTypes","isColor","parseColor","rgba","parseValueToStringOrNumber","parsedValue","unit","type","parseUnit","includes","error","parseValueToColor","setJsonValueToSassValue","isArray","arrayToList","isPlainObject","objectToMap","sassTrue","sassFalse","sassNull","array","item","object","property","Object","entries","OrderedMap","encode","encodeArguments","quotes_","quotes","assertBoolean","shouldQuote","JSON","stringify","decode","decodeArguments","string_","string","assertString","parse","api"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../lib/sass-to-json.js","../lib/json-to-sass.js","../index.js"],"sourcesContent":["import * as sass from 'sass';\nimport rgbHex from 'rgb-hex';\nimport shortHexColor from 'shorten-css-hex';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\n/**\n * @param {sass.Value|undefined} value\n */\nfunction getJsonValueFromSassValue(value) {\n\tlet resolvedValue;\n\tif (value instanceof sass.SassList) {\n\t\tresolvedValue = listToArray(value);\n\t} else if (value instanceof sass.SassMap) {\n\t\tresolvedValue = mapToObject(value);\n\t} else if (value instanceof sass.SassColor) {\n\t\t/** @type {[number, number, number]} */\n\t\tconst rgbValue = [value.red, value.green, value.blue];\n\t\tconst alphaValue = value.alpha;\n\t\tif (alphaValue === 1) {\n\t\t\tresolvedValue = shortHexColor(`#${rgbHex.apply(null, rgbValue)}`);\n\t\t} else {\n\t\t\tresolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;\n\t\t}\n\t} else if (value instanceof sass.SassNumber) {\n\t\tif (value.hasUnits) {\n\t\t\tresolvedValue = String(value.value) + value.numeratorUnits.last();\n\t\t} else {\n\t\t\tresolvedValue = Number(value.value);\n\t\t}\n\t} else if (value instanceof sass.SassString) {\n\t\tresolvedValue = String(value.text);\n\t} else if (value instanceof sass.SassBoolean) {\n\t\tresolvedValue = Boolean(value.value);\n\t} else if (typeof value === 'undefined') {\n\t\tresolvedValue = null;\n\t} else if (value.isTruthy) {\n\t\tresolvedValue = value.toString();\n\t} else if (value.realNull) {\n\t\tresolvedValue = null;\n\t}\n\treturn resolvedValue ?? null;\n}\n\n/**\n * @param {sass.SassList} list\n */\nfunction listToArray(list) {\n\tconst length = list.asList.size;\n\t/** @type {JsonArray} */\n\tconst data = [];\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst value = getJsonValueFromSassValue(list.get(index));\n\t\tdata.push(value);\n\t}\n\treturn data;\n}\n\n/**\n * @param {sass.SassMap} map\n */\nfunction mapToObject(map) {\n\tconst length = map.contents.size;\n\t/** @type {JsonObject} */\n\tconst data = {};\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst resolvedValue = map.get(index);\n\t\tif (typeof resolvedValue !== 'undefined') {\n\t\t\tconst key = String(getJsonValueFromSassValue(resolvedValue.get(0)));\n\t\t\tconst value = getJsonValueFromSassValue(resolvedValue.get(1));\n\t\t\tdata[key] = value;\n\t\t}\n\t}\n\treturn data;\n}\n\nexport default getJsonValueFromSassValue;\n","import * as sass from 'sass';\nimport isPlainObject from 'is-plain-obj';\nimport parseColor from 'parse-color';\nimport parseUnit from 'parse-css-dimension';\nimport { OrderedMap } from 'immutable';\nimport { parse } from 'postcss-values-parser';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\nconst unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];\n\n/**\n * @param {string} value\n */\nfunction isColor(value) {\n\treturn typeof parseColor(value).rgba !== 'undefined';\n}\n\n/**\n * @param {string} value\n */\nfunction isCalculation(value) {\n\tif (!value.includes('calc')) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst root = parse(value);\n\t\tconst node = root.first;\n\t\treturn node?.type === 'func' && node.name === 'calc';\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * @param {string} value\n * @param {{forceNumber: boolean}=} options\n */\nfunction parseValueToStringOrNumber(value, options) {\n\tconst { forceNumber = false } = options ?? {};\n\tlet resolvedValue;\n\ttry {\n\t\tconst { value: parsedValue, unit, type } = parseUnit(value);\n\t\tif (unitTypes.includes(type)) {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, unit);\n\t\t} else if (type === 'percentage') {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, '%');\n\t\t} else if (forceNumber && !Number.isNaN(Number(value))) {\n\t\t\tresolvedValue = new sass.SassNumber(Number(value));\n\t\t} else {\n\t\t\tresolvedValue = new sass.SassString(value);\n\t\t}\n\t} catch (error) {\n\t\tresolvedValue = new sass.SassString(value);\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToColor(value) {\n\tconst [red, green, blue, alpha] = parseColor(value).rgba;\n\treturn new sass.SassColor({\n\t\tred,\n\t\tgreen,\n\t\tblue,\n\t\talpha\n\t});\n}\n\n/**\n * @typedef {object} CalculationContainer\n * @property {?sass.CalculationOperator} operator\n * @property {?sass.CalculationValue} left\n * @property {?sass.CalculationValue} right\n */\n\n/**\n * @param {string} value\n */\nfunction parseValueToCalculation(value) {\n\tconst root = parse(value);\n\tconst node = root.first;\n\n\tlet calc = /** @type {CalculationContainer} */ ({\n\t\toperator: null,\n\t\tleft: null,\n\t\tright: null\n\t});\n\tif (node?.type === 'func' && node.name === 'calc') {\n\t\tif (node.nodes.length > 3) {\n\t\t\treturn parseValueToStringOrNumber(value);\n\t\t}\n\t\tnode.nodes.forEach((node, index) => {\n\t\t\tif (node.type === 'operator') {\n\t\t\t\tcalc.operator = /** @type {sass.CalculationOperator} */ (\n\t\t\t\t\tnode.value\n\t\t\t\t);\n\t\t\t} else if (index === 0) {\n\t\t\t\tcalc.left = parseValueToStringOrNumber(node.toString());\n\t\t\t} else {\n\t\t\t\tcalc.right = parseValueToStringOrNumber(node.toString(), {\n\t\t\t\t\tforceNumber: true\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\ttry {\n\t\treturn sass.SassCalculation.calc(\n\t\t\tnew sass.CalculationOperation(\n\t\t\t\t// @ts-ignore\n\t\t\t\tcalc.operator,\n\t\t\t\tcalc.left,\n\t\t\t\tcalc.right\n\t\t\t)\n\t\t);\n\t} catch {\n\t\treturn parseValueToStringOrNumber(value);\n\t}\n}\n\n/**\n * @param {JsonValue} value\n */\nfunction setJsonValueToSassValue(value) {\n\tlet resolvedValue;\n\tif (Array.isArray(value)) {\n\t\tresolvedValue = arrayToList(value);\n\t} else if (isPlainObject(value)) {\n\t\tresolvedValue = objectToMap(value);\n\t} else if (isColor(String(value))) {\n\t\tresolvedValue = parseValueToColor(String(value));\n\t} else if (isCalculation(String(value))) {\n\t\tresolvedValue = parseValueToCalculation(String(value));\n\t} else if (typeof value === 'string') {\n\t\tresolvedValue = parseValueToStringOrNumber(value);\n\t} else if (typeof value === 'number') {\n\t\tresolvedValue = new sass.SassNumber(value);\n\t} else if (typeof value === 'boolean') {\n\t\tresolvedValue = value ? sass.sassTrue : sass.sassFalse;\n\t} else {\n\t\tresolvedValue = sass.sassNull;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {JsonArray} array\n */\nfunction arrayToList(array) {\n\t/** @type {sass.Value[]} */\n\tconst data = [];\n\tfor (const item of array) {\n\t\tdata.push(setJsonValueToSassValue(item));\n\t}\n\treturn new sass.SassList(data);\n}\n\n/**\n * @param {JsonObject} object\n */\nfunction objectToMap(object) {\n\t/** @type {[sass.Value, sass.Value][]} */\n\tconst data = [];\n\tfor (const [property, value = null] of Object.entries(object)) {\n\t\tdata.push([\n\t\t\tsetJsonValueToSassValue(property),\n\t\t\tsetJsonValueToSassValue(value)\n\t\t]);\n\t}\n\t// eslint-disable-next-line new-cap\n\treturn new sass.SassMap(OrderedMap(data));\n}\n\nexport default setJsonValueToSassValue;\n","import * as sass from 'sass';\nimport getJsonValueFromSassValue from './lib/sass-to-json.js';\nimport setJsonValueToSassValue from './lib/json-to-sass.js';\n\n/**\n * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue\n * @typedef {JsonValue[]} JsonArray\n * @typedef {string | number | boolean | null} JsonPrimitive\n * @typedef {{[Key in string]?: JsonValue}} JsonObject\n */\n\n/**\n * Encodes (`JSON.stringify`) data and returns Sass string. By default, string is quoted with single quotes so that it can be easily used in standard CSS values.\n *\n * First argument: `sass.Value` - Data to encode (stringify).\n *\n * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.\n *\n * @param {sass.Value[]} encodeArguments\n */\nfunction encode(encodeArguments) {\n\tconst [data, quotes_] = encodeArguments;\n\tconst quotes = quotes_.assertBoolean('quotes');\n\tconst shouldQuote = quotes.value;\n\tlet resolvedValue = JSON.stringify(getJsonValueFromSassValue(data));\n\tif (shouldQuote) {\n\t\tresolvedValue = `'${resolvedValue}'`;\n\t}\n\treturn new sass.SassString(resolvedValue);\n}\n\n/**\n * Decodes (`JSON.parse`) string and returns one of available Sass types.\n *\n * First argument: `sass.SassString` - String to decode (parse).\n *\n * @param {sass.Value[]} decodeArguments\n */\nfunction decode(decodeArguments) {\n\tconst [string_] = decodeArguments;\n\tconst string = string_.assertString('string');\n\t/** @type {JsonValue?} */\n\tlet resolvedValue = {};\n\ttry {\n\t\tresolvedValue = JSON.parse(string.text);\n\t} catch (error) {\n\t\tresolvedValue = null;\n\t}\n\treturn setJsonValueToSassValue(resolvedValue);\n}\n\n/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */\nconst api = {\n\t'json-encode($data, $quotes: true)': encode,\n\t'json-decode($string)': decode\n};\n\nexport default api;\n"],"names":["getJsonValueFromSassValue","value","_resolvedValue","resolvedValue","sass","SassList","listToArray","SassMap","mapToObject","SassColor","rgbValue","red","green","blue","alphaValue","alpha","shortHexColor","rgbHex","apply","join","SassNumber","hasUnits","String","numeratorUnits","last","Number","SassString","text","SassBoolean","Boolean","isTruthy","toString","realNull","list","length","asList","size","data","index","Array","from","keys","get","push","map","contents","key","unitTypes","isColor","parseColor","rgba","isCalculation","includes","root","parse","node","first","type","name","parseValueToStringOrNumber","options","forceNumber","parsedValue","unit","parseUnit","isNaN","error","parseValueToColor","parseValueToCalculation","calc","operator","left","right","nodes","forEach","SassCalculation","CalculationOperation","setJsonValueToSassValue","isArray","arrayToList","isPlainObject","objectToMap","sassTrue","sassFalse","sassNull","array","item","object","property","Object","entries","OrderedMap","encode","encodeArguments","quotes_","quotes","assertBoolean","shouldQuote","JSON","stringify","decode","decodeArguments","string_","string","assertString","api"],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  export default setJsonValueToSassValue;
2
+ export type CalculationContainer = {
3
+ operator: sass.CalculationOperator | null;
4
+ left: sass.CalculationValue | null;
5
+ right: sass.CalculationValue | null;
6
+ };
2
7
  export type JsonValue = import('../index').JsonValue;
3
8
  export type JsonObject = import('../index').JsonObject;
4
9
  export type JsonArray = import('../index').JsonArray;
@@ -1 +1 @@
1
- {"version":3,"file":"json-to-sass.d.ts","sourceRoot":"","sources":["../../lib/json-to-sass.js"],"names":[],"mappings":";wBAOa,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AA6CzC;;GAEG;AACH,gDAFW,SAAS,cAoBnB"}
1
+ {"version":3,"file":"json-to-sass.d.ts","sourceRoot":"","sources":["../../lib/json-to-sass.js"],"names":[],"mappings":";;cA6Ee,KAAK,mBAAmB;UACxB,KAAK,gBAAgB;WACrB,KAAK,gBAAgB;;wBAvEvB,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AAoHzC;;GAEG;AACH,gDAFW,SAAS,cAsBnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"sass-to-json.d.ts","sourceRoot":"","sources":["../../lib/sass-to-json.js"],"names":[],"mappings":";wBAKa,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AAHzC;;;;GAIG;AAEH;;GAEG;AACH,kDAFW,KAAK,KAAK,GAAC,SAAS,mGA+B9B"}
1
+ {"version":3,"file":"sass-to-json.d.ts","sourceRoot":"","sources":["../../lib/sass-to-json.js"],"names":[],"mappings":";wBAKa,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AAHzC;;;;GAIG;AAEH;;GAEG;AACH,kDAFW,KAAK,KAAK,GAAC,SAAS,mGAmC9B"}
package/esm/index.js CHANGED
@@ -5,6 +5,7 @@ import isPlainObject from 'is-plain-obj';
5
5
  import parseColor from 'parse-color';
6
6
  import parseUnit from 'parse-css-dimension';
7
7
  import { OrderedMap } from 'immutable';
8
+ import { parse } from 'postcss-values-parser';
8
9
 
9
10
  /**
10
11
  * @typedef {import('../index').JsonValue} JsonValue
@@ -16,6 +17,7 @@ import { OrderedMap } from 'immutable';
16
17
  * @param {sass.Value|undefined} value
17
18
  */
18
19
  function getJsonValueFromSassValue(value) {
20
+ var _resolvedValue;
19
21
  let resolvedValue;
20
22
  if (value instanceof sass.SassList) {
21
23
  resolvedValue = listToArray(value);
@@ -40,10 +42,14 @@ function getJsonValueFromSassValue(value) {
40
42
  resolvedValue = String(value.text);
41
43
  } else if (value instanceof sass.SassBoolean) {
42
44
  resolvedValue = Boolean(value.value);
43
- } else {
45
+ } else if (typeof value === 'undefined') {
46
+ resolvedValue = null;
47
+ } else if (value.isTruthy) {
48
+ resolvedValue = value.toString();
49
+ } else if (value.realNull) {
44
50
  resolvedValue = null;
45
51
  }
46
- return resolvedValue;
52
+ return (_resolvedValue = resolvedValue) !== null && _resolvedValue !== void 0 ? _resolvedValue : null;
47
53
  }
48
54
 
49
55
  /**
@@ -74,7 +80,7 @@ function mapToObject(map) {
74
80
  }).keys()) {
75
81
  const resolvedValue = map.get(index);
76
82
  if (typeof resolvedValue !== 'undefined') {
77
- const key = String(resolvedValue.get(0));
83
+ const key = String(getJsonValueFromSassValue(resolvedValue.get(0)));
78
84
  const value = getJsonValueFromSassValue(resolvedValue.get(1));
79
85
  data[key] = value;
80
86
  }
@@ -100,7 +106,27 @@ function isColor(value) {
100
106
  /**
101
107
  * @param {string} value
102
108
  */
103
- function parseValueToStringOrNumber(value) {
109
+ function isCalculation(value) {
110
+ if (!value.includes('calc')) {
111
+ return false;
112
+ }
113
+ try {
114
+ const root = parse(value);
115
+ const node = root.first;
116
+ return (node === null || node === void 0 ? void 0 : node.type) === 'func' && node.name === 'calc';
117
+ } catch {
118
+ return false;
119
+ }
120
+ }
121
+
122
+ /**
123
+ * @param {string} value
124
+ * @param {{forceNumber: boolean}=} options
125
+ */
126
+ function parseValueToStringOrNumber(value, options) {
127
+ const {
128
+ forceNumber = false
129
+ } = options !== null && options !== void 0 ? options : {};
104
130
  let resolvedValue;
105
131
  try {
106
132
  const {
@@ -112,6 +138,8 @@ function parseValueToStringOrNumber(value) {
112
138
  resolvedValue = new sass.SassNumber(parsedValue, unit);
113
139
  } else if (type === 'percentage') {
114
140
  resolvedValue = new sass.SassNumber(parsedValue, '%');
141
+ } else if (forceNumber && !Number.isNaN(Number(value))) {
142
+ resolvedValue = new sass.SassNumber(Number(value));
115
143
  } else {
116
144
  resolvedValue = new sass.SassString(value);
117
145
  }
@@ -134,6 +162,50 @@ function parseValueToColor(value) {
134
162
  });
135
163
  }
136
164
 
165
+ /**
166
+ * @typedef {object} CalculationContainer
167
+ * @property {?sass.CalculationOperator} operator
168
+ * @property {?sass.CalculationValue} left
169
+ * @property {?sass.CalculationValue} right
170
+ */
171
+
172
+ /**
173
+ * @param {string} value
174
+ */
175
+ function parseValueToCalculation(value) {
176
+ const root = parse(value);
177
+ const node = root.first;
178
+ let calc = /** @type {CalculationContainer} */{
179
+ operator: null,
180
+ left: null,
181
+ right: null
182
+ };
183
+ if ((node === null || node === void 0 ? void 0 : node.type) === 'func' && node.name === 'calc') {
184
+ if (node.nodes.length > 3) {
185
+ return parseValueToStringOrNumber(value);
186
+ }
187
+ node.nodes.forEach((node, index) => {
188
+ if (node.type === 'operator') {
189
+ calc.operator = /** @type {sass.CalculationOperator} */
190
+ node.value;
191
+ } else if (index === 0) {
192
+ calc.left = parseValueToStringOrNumber(node.toString());
193
+ } else {
194
+ calc.right = parseValueToStringOrNumber(node.toString(), {
195
+ forceNumber: true
196
+ });
197
+ }
198
+ });
199
+ }
200
+ try {
201
+ return sass.SassCalculation.calc(new sass.CalculationOperation(
202
+ // @ts-ignore
203
+ calc.operator, calc.left, calc.right));
204
+ } catch {
205
+ return parseValueToStringOrNumber(value);
206
+ }
207
+ }
208
+
137
209
  /**
138
210
  * @param {JsonValue} value
139
211
  */
@@ -145,6 +217,8 @@ function setJsonValueToSassValue(value) {
145
217
  resolvedValue = objectToMap(value);
146
218
  } else if (isColor(String(value))) {
147
219
  resolvedValue = parseValueToColor(String(value));
220
+ } else if (isCalculation(String(value))) {
221
+ resolvedValue = parseValueToCalculation(String(value));
148
222
  } else if (typeof value === 'string') {
149
223
  resolvedValue = parseValueToStringOrNumber(value);
150
224
  } else if (typeof value === 'number') {
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../lib/sass-to-json.js","../lib/json-to-sass.js","../index.js"],"sourcesContent":["import * as sass from 'sass';\nimport rgbHex from 'rgb-hex';\nimport shortHexColor from 'shorten-css-hex';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\n/**\n * @param {sass.Value|undefined} value\n */\nfunction getJsonValueFromSassValue(value) {\n\tlet resolvedValue;\n\tif (value instanceof sass.SassList) {\n\t\tresolvedValue = listToArray(value);\n\t} else if (value instanceof sass.SassMap) {\n\t\tresolvedValue = mapToObject(value);\n\t} else if (value instanceof sass.SassColor) {\n\t\t/** @type {[number, number, number]} */\n\t\tconst rgbValue = [value.red, value.green, value.blue];\n\t\tconst alphaValue = value.alpha;\n\t\tif (alphaValue === 1) {\n\t\t\tresolvedValue = shortHexColor(`#${rgbHex.apply(null, rgbValue)}`);\n\t\t} else {\n\t\t\tresolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;\n\t\t}\n\t} else if (value instanceof sass.SassNumber) {\n\t\tif (value.hasUnits) {\n\t\t\tresolvedValue = String(value.value) + value.numeratorUnits.last();\n\t\t} else {\n\t\t\tresolvedValue = Number(value.value);\n\t\t}\n\t} else if (value instanceof sass.SassString) {\n\t\tresolvedValue = String(value.text);\n\t} else if (value instanceof sass.SassBoolean) {\n\t\tresolvedValue = Boolean(value.value);\n\t} else {\n\t\tresolvedValue = null;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {sass.SassList} list\n */\nfunction listToArray(list) {\n\tconst length = list.asList.size;\n\t/** @type {JsonArray} */\n\tconst data = [];\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst value = getJsonValueFromSassValue(list.get(index));\n\t\tdata.push(value);\n\t}\n\treturn data;\n}\n\n/**\n * @param {sass.SassMap} map\n */\nfunction mapToObject(map) {\n\tconst length = map.contents.size;\n\t/** @type {JsonObject} */\n\tconst data = {};\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst resolvedValue = map.get(index);\n\t\tif (typeof resolvedValue !== 'undefined') {\n\t\t\tconst key = String(resolvedValue.get(0));\n\t\t\tconst value = getJsonValueFromSassValue(resolvedValue.get(1));\n\t\t\tdata[key] = value;\n\t\t}\n\t}\n\treturn data;\n}\n\nexport default getJsonValueFromSassValue;\n","import * as sass from 'sass';\nimport isPlainObject from 'is-plain-obj';\nimport parseColor from 'parse-color';\nimport parseUnit from 'parse-css-dimension';\nimport { OrderedMap } from 'immutable';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\nconst unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];\n\n/**\n * @param {string} value\n */\nfunction isColor(value) {\n\treturn typeof parseColor(value).rgba !== 'undefined';\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToStringOrNumber(value) {\n\tlet resolvedValue;\n\ttry {\n\t\tconst { value: parsedValue, unit, type } = parseUnit(value);\n\t\tif (unitTypes.includes(type)) {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, unit);\n\t\t} else if (type === 'percentage') {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, '%');\n\t\t} else {\n\t\t\tresolvedValue = new sass.SassString(value);\n\t\t}\n\t} catch (error) {\n\t\tresolvedValue = new sass.SassString(value);\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToColor(value) {\n\tconst [red, green, blue, alpha] = parseColor(value).rgba;\n\treturn new sass.SassColor({\n\t\tred,\n\t\tgreen,\n\t\tblue,\n\t\talpha\n\t});\n}\n\n/**\n * @param {JsonValue} value\n */\nfunction setJsonValueToSassValue(value) {\n\tlet resolvedValue;\n\tif (Array.isArray(value)) {\n\t\tresolvedValue = arrayToList(value);\n\t} else if (isPlainObject(value)) {\n\t\tresolvedValue = objectToMap(value);\n\t} else if (isColor(String(value))) {\n\t\tresolvedValue = parseValueToColor(String(value));\n\t} else if (typeof value === 'string') {\n\t\tresolvedValue = parseValueToStringOrNumber(value);\n\t} else if (typeof value === 'number') {\n\t\tresolvedValue = new sass.SassNumber(value);\n\t} else if (typeof value === 'boolean') {\n\t\tresolvedValue = value ? sass.sassTrue : sass.sassFalse;\n\t} else {\n\t\tresolvedValue = sass.sassNull;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {JsonArray} array\n */\nfunction arrayToList(array) {\n\t/** @type {sass.Value[]} */\n\tconst data = [];\n\tfor (const item of array) {\n\t\tdata.push(setJsonValueToSassValue(item));\n\t}\n\treturn new sass.SassList(data);\n}\n\n/**\n * @param {JsonObject} object\n */\nfunction objectToMap(object) {\n\t/** @type {[sass.Value, sass.Value][]} */\n\tconst data = [];\n\tfor (const [property, value = null] of Object.entries(object)) {\n\t\tdata.push([\n\t\t\tsetJsonValueToSassValue(property),\n\t\t\tsetJsonValueToSassValue(value)\n\t\t]);\n\t}\n\t// eslint-disable-next-line new-cap\n\treturn new sass.SassMap(OrderedMap(data));\n}\n\nexport default setJsonValueToSassValue;\n","import * as sass from 'sass';\nimport getJsonValueFromSassValue from './lib/sass-to-json.js';\nimport setJsonValueToSassValue from './lib/json-to-sass.js';\n\n/**\n * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue\n * @typedef {JsonValue[]} JsonArray\n * @typedef {string | number | boolean | null} JsonPrimitive\n * @typedef {{[Key in string]?: JsonValue}} JsonObject\n */\n\n/**\n * Encodes (`JSON.stringify`) data and returns Sass string. By default, string is quoted with single quotes so that it can be easily used in standard CSS values.\n *\n * First argument: `sass.Value` - Data to encode (stringify).\n *\n * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.\n *\n * @param {sass.Value[]} encodeArguments\n */\nfunction encode(encodeArguments) {\n\tconst [data, quotes_] = encodeArguments;\n\tconst quotes = quotes_.assertBoolean('quotes');\n\tconst shouldQuote = quotes.value;\n\tlet resolvedValue = JSON.stringify(getJsonValueFromSassValue(data));\n\tif (shouldQuote) {\n\t\tresolvedValue = `'${resolvedValue}'`;\n\t}\n\treturn new sass.SassString(resolvedValue);\n}\n\n/**\n * Decodes (`JSON.parse`) string and returns one of available Sass types.\n *\n * First argument: `sass.SassString` - String to decode (parse).\n *\n * @param {sass.Value[]} decodeArguments\n */\nfunction decode(decodeArguments) {\n\tconst [string_] = decodeArguments;\n\tconst string = string_.assertString('string');\n\t/** @type {JsonValue?} */\n\tlet resolvedValue = {};\n\ttry {\n\t\tresolvedValue = JSON.parse(string.text);\n\t} catch (error) {\n\t\tresolvedValue = null;\n\t}\n\treturn setJsonValueToSassValue(resolvedValue);\n}\n\n/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */\nconst api = {\n\t'json-encode($data, $quotes: true)': encode,\n\t'json-decode($string)': decode\n};\n\nexport default api;\n"],"names":["getJsonValueFromSassValue","value","resolvedValue","sass","SassList","listToArray","SassMap","mapToObject","SassColor","rgbValue","red","green","blue","alphaValue","alpha","shortHexColor","rgbHex","apply","join","SassNumber","hasUnits","String","numeratorUnits","last","Number","SassString","text","SassBoolean","Boolean","list","length","asList","size","data","index","Array","from","keys","get","push","map","contents","key","unitTypes","isColor","parseColor","rgba","parseValueToStringOrNumber","parsedValue","unit","type","parseUnit","includes","error","parseValueToColor","setJsonValueToSassValue","isArray","arrayToList","isPlainObject","objectToMap","sassTrue","sassFalse","sassNull","array","item","object","property","Object","entries","OrderedMap","encode","encodeArguments","quotes_","quotes","assertBoolean","shouldQuote","JSON","stringify","decode","decodeArguments","string_","string","assertString","parse","api"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../lib/sass-to-json.js","../lib/json-to-sass.js","../index.js"],"sourcesContent":["import * as sass from 'sass';\nimport rgbHex from 'rgb-hex';\nimport shortHexColor from 'shorten-css-hex';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\n/**\n * @param {sass.Value|undefined} value\n */\nfunction getJsonValueFromSassValue(value) {\n\tlet resolvedValue;\n\tif (value instanceof sass.SassList) {\n\t\tresolvedValue = listToArray(value);\n\t} else if (value instanceof sass.SassMap) {\n\t\tresolvedValue = mapToObject(value);\n\t} else if (value instanceof sass.SassColor) {\n\t\t/** @type {[number, number, number]} */\n\t\tconst rgbValue = [value.red, value.green, value.blue];\n\t\tconst alphaValue = value.alpha;\n\t\tif (alphaValue === 1) {\n\t\t\tresolvedValue = shortHexColor(`#${rgbHex.apply(null, rgbValue)}`);\n\t\t} else {\n\t\t\tresolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;\n\t\t}\n\t} else if (value instanceof sass.SassNumber) {\n\t\tif (value.hasUnits) {\n\t\t\tresolvedValue = String(value.value) + value.numeratorUnits.last();\n\t\t} else {\n\t\t\tresolvedValue = Number(value.value);\n\t\t}\n\t} else if (value instanceof sass.SassString) {\n\t\tresolvedValue = String(value.text);\n\t} else if (value instanceof sass.SassBoolean) {\n\t\tresolvedValue = Boolean(value.value);\n\t} else if (typeof value === 'undefined') {\n\t\tresolvedValue = null;\n\t} else if (value.isTruthy) {\n\t\tresolvedValue = value.toString();\n\t} else if (value.realNull) {\n\t\tresolvedValue = null;\n\t}\n\treturn resolvedValue ?? null;\n}\n\n/**\n * @param {sass.SassList} list\n */\nfunction listToArray(list) {\n\tconst length = list.asList.size;\n\t/** @type {JsonArray} */\n\tconst data = [];\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst value = getJsonValueFromSassValue(list.get(index));\n\t\tdata.push(value);\n\t}\n\treturn data;\n}\n\n/**\n * @param {sass.SassMap} map\n */\nfunction mapToObject(map) {\n\tconst length = map.contents.size;\n\t/** @type {JsonObject} */\n\tconst data = {};\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst resolvedValue = map.get(index);\n\t\tif (typeof resolvedValue !== 'undefined') {\n\t\t\tconst key = String(getJsonValueFromSassValue(resolvedValue.get(0)));\n\t\t\tconst value = getJsonValueFromSassValue(resolvedValue.get(1));\n\t\t\tdata[key] = value;\n\t\t}\n\t}\n\treturn data;\n}\n\nexport default getJsonValueFromSassValue;\n","import * as sass from 'sass';\nimport isPlainObject from 'is-plain-obj';\nimport parseColor from 'parse-color';\nimport parseUnit from 'parse-css-dimension';\nimport { OrderedMap } from 'immutable';\nimport { parse } from 'postcss-values-parser';\n\n/**\n * @typedef {import('../index').JsonValue} JsonValue\n * @typedef {import('../index').JsonObject} JsonObject\n * @typedef {import('../index').JsonArray} JsonArray\n */\n\nconst unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];\n\n/**\n * @param {string} value\n */\nfunction isColor(value) {\n\treturn typeof parseColor(value).rgba !== 'undefined';\n}\n\n/**\n * @param {string} value\n */\nfunction isCalculation(value) {\n\tif (!value.includes('calc')) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst root = parse(value);\n\t\tconst node = root.first;\n\t\treturn node?.type === 'func' && node.name === 'calc';\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * @param {string} value\n * @param {{forceNumber: boolean}=} options\n */\nfunction parseValueToStringOrNumber(value, options) {\n\tconst { forceNumber = false } = options ?? {};\n\tlet resolvedValue;\n\ttry {\n\t\tconst { value: parsedValue, unit, type } = parseUnit(value);\n\t\tif (unitTypes.includes(type)) {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, unit);\n\t\t} else if (type === 'percentage') {\n\t\t\tresolvedValue = new sass.SassNumber(parsedValue, '%');\n\t\t} else if (forceNumber && !Number.isNaN(Number(value))) {\n\t\t\tresolvedValue = new sass.SassNumber(Number(value));\n\t\t} else {\n\t\t\tresolvedValue = new sass.SassString(value);\n\t\t}\n\t} catch (error) {\n\t\tresolvedValue = new sass.SassString(value);\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToColor(value) {\n\tconst [red, green, blue, alpha] = parseColor(value).rgba;\n\treturn new sass.SassColor({\n\t\tred,\n\t\tgreen,\n\t\tblue,\n\t\talpha\n\t});\n}\n\n/**\n * @typedef {object} CalculationContainer\n * @property {?sass.CalculationOperator} operator\n * @property {?sass.CalculationValue} left\n * @property {?sass.CalculationValue} right\n */\n\n/**\n * @param {string} value\n */\nfunction parseValueToCalculation(value) {\n\tconst root = parse(value);\n\tconst node = root.first;\n\n\tlet calc = /** @type {CalculationContainer} */ ({\n\t\toperator: null,\n\t\tleft: null,\n\t\tright: null\n\t});\n\tif (node?.type === 'func' && node.name === 'calc') {\n\t\tif (node.nodes.length > 3) {\n\t\t\treturn parseValueToStringOrNumber(value);\n\t\t}\n\t\tnode.nodes.forEach((node, index) => {\n\t\t\tif (node.type === 'operator') {\n\t\t\t\tcalc.operator = /** @type {sass.CalculationOperator} */ (\n\t\t\t\t\tnode.value\n\t\t\t\t);\n\t\t\t} else if (index === 0) {\n\t\t\t\tcalc.left = parseValueToStringOrNumber(node.toString());\n\t\t\t} else {\n\t\t\t\tcalc.right = parseValueToStringOrNumber(node.toString(), {\n\t\t\t\t\tforceNumber: true\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\ttry {\n\t\treturn sass.SassCalculation.calc(\n\t\t\tnew sass.CalculationOperation(\n\t\t\t\t// @ts-ignore\n\t\t\t\tcalc.operator,\n\t\t\t\tcalc.left,\n\t\t\t\tcalc.right\n\t\t\t)\n\t\t);\n\t} catch {\n\t\treturn parseValueToStringOrNumber(value);\n\t}\n}\n\n/**\n * @param {JsonValue} value\n */\nfunction setJsonValueToSassValue(value) {\n\tlet resolvedValue;\n\tif (Array.isArray(value)) {\n\t\tresolvedValue = arrayToList(value);\n\t} else if (isPlainObject(value)) {\n\t\tresolvedValue = objectToMap(value);\n\t} else if (isColor(String(value))) {\n\t\tresolvedValue = parseValueToColor(String(value));\n\t} else if (isCalculation(String(value))) {\n\t\tresolvedValue = parseValueToCalculation(String(value));\n\t} else if (typeof value === 'string') {\n\t\tresolvedValue = parseValueToStringOrNumber(value);\n\t} else if (typeof value === 'number') {\n\t\tresolvedValue = new sass.SassNumber(value);\n\t} else if (typeof value === 'boolean') {\n\t\tresolvedValue = value ? sass.sassTrue : sass.sassFalse;\n\t} else {\n\t\tresolvedValue = sass.sassNull;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {JsonArray} array\n */\nfunction arrayToList(array) {\n\t/** @type {sass.Value[]} */\n\tconst data = [];\n\tfor (const item of array) {\n\t\tdata.push(setJsonValueToSassValue(item));\n\t}\n\treturn new sass.SassList(data);\n}\n\n/**\n * @param {JsonObject} object\n */\nfunction objectToMap(object) {\n\t/** @type {[sass.Value, sass.Value][]} */\n\tconst data = [];\n\tfor (const [property, value = null] of Object.entries(object)) {\n\t\tdata.push([\n\t\t\tsetJsonValueToSassValue(property),\n\t\t\tsetJsonValueToSassValue(value)\n\t\t]);\n\t}\n\t// eslint-disable-next-line new-cap\n\treturn new sass.SassMap(OrderedMap(data));\n}\n\nexport default setJsonValueToSassValue;\n","import * as sass from 'sass';\nimport getJsonValueFromSassValue from './lib/sass-to-json.js';\nimport setJsonValueToSassValue from './lib/json-to-sass.js';\n\n/**\n * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue\n * @typedef {JsonValue[]} JsonArray\n * @typedef {string | number | boolean | null} JsonPrimitive\n * @typedef {{[Key in string]?: JsonValue}} JsonObject\n */\n\n/**\n * Encodes (`JSON.stringify`) data and returns Sass string. By default, string is quoted with single quotes so that it can be easily used in standard CSS values.\n *\n * First argument: `sass.Value` - Data to encode (stringify).\n *\n * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.\n *\n * @param {sass.Value[]} encodeArguments\n */\nfunction encode(encodeArguments) {\n\tconst [data, quotes_] = encodeArguments;\n\tconst quotes = quotes_.assertBoolean('quotes');\n\tconst shouldQuote = quotes.value;\n\tlet resolvedValue = JSON.stringify(getJsonValueFromSassValue(data));\n\tif (shouldQuote) {\n\t\tresolvedValue = `'${resolvedValue}'`;\n\t}\n\treturn new sass.SassString(resolvedValue);\n}\n\n/**\n * Decodes (`JSON.parse`) string and returns one of available Sass types.\n *\n * First argument: `sass.SassString` - String to decode (parse).\n *\n * @param {sass.Value[]} decodeArguments\n */\nfunction decode(decodeArguments) {\n\tconst [string_] = decodeArguments;\n\tconst string = string_.assertString('string');\n\t/** @type {JsonValue?} */\n\tlet resolvedValue = {};\n\ttry {\n\t\tresolvedValue = JSON.parse(string.text);\n\t} catch (error) {\n\t\tresolvedValue = null;\n\t}\n\treturn setJsonValueToSassValue(resolvedValue);\n}\n\n/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */\nconst api = {\n\t'json-encode($data, $quotes: true)': encode,\n\t'json-decode($string)': decode\n};\n\nexport default api;\n"],"names":["getJsonValueFromSassValue","value","_resolvedValue","resolvedValue","sass","SassList","listToArray","SassMap","mapToObject","SassColor","rgbValue","red","green","blue","alphaValue","alpha","shortHexColor","rgbHex","apply","join","SassNumber","hasUnits","String","numeratorUnits","last","Number","SassString","text","SassBoolean","Boolean","isTruthy","toString","realNull","list","length","asList","size","data","index","Array","from","keys","get","push","map","contents","key","unitTypes","isColor","parseColor","rgba","isCalculation","includes","root","parse","node","first","type","name","parseValueToStringOrNumber","options","forceNumber","parsedValue","unit","parseUnit","isNaN","error","parseValueToColor","parseValueToCalculation","calc","operator","left","right","nodes","forEach","SassCalculation","CalculationOperation","setJsonValueToSassValue","isArray","arrayToList","isPlainObject","objectToMap","sassTrue","sassFalse","sassNull","array","item","object","property","Object","entries","OrderedMap","encode","encodeArguments","quotes_","quotes","assertBoolean","shouldQuote","JSON","stringify","decode","decodeArguments","string_","string","assertString","api"],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  export default setJsonValueToSassValue;
2
+ export type CalculationContainer = {
3
+ operator: sass.CalculationOperator | null;
4
+ left: sass.CalculationValue | null;
5
+ right: sass.CalculationValue | null;
6
+ };
2
7
  export type JsonValue = import('../index').JsonValue;
3
8
  export type JsonObject = import('../index').JsonObject;
4
9
  export type JsonArray = import('../index').JsonArray;
@@ -1 +1 @@
1
- {"version":3,"file":"json-to-sass.d.ts","sourceRoot":"","sources":["../../lib/json-to-sass.js"],"names":[],"mappings":";wBAOa,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AA6CzC;;GAEG;AACH,gDAFW,SAAS,cAoBnB"}
1
+ {"version":3,"file":"json-to-sass.d.ts","sourceRoot":"","sources":["../../lib/json-to-sass.js"],"names":[],"mappings":";;cA6Ee,KAAK,mBAAmB;UACxB,KAAK,gBAAgB;WACrB,KAAK,gBAAgB;;wBAvEvB,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AAoHzC;;GAEG;AACH,gDAFW,SAAS,cAsBnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"sass-to-json.d.ts","sourceRoot":"","sources":["../../lib/sass-to-json.js"],"names":[],"mappings":";wBAKa,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AAHzC;;;;GAIG;AAEH;;GAEG;AACH,kDAFW,KAAK,KAAK,GAAC,SAAS,mGA+B9B"}
1
+ {"version":3,"file":"sass-to-json.d.ts","sourceRoot":"","sources":["../../lib/sass-to-json.js"],"names":[],"mappings":";wBAKa,OAAO,UAAU,EAAE,SAAS;yBAC5B,OAAO,UAAU,EAAE,UAAU;wBAC7B,OAAO,UAAU,EAAE,SAAS;AAHzC;;;;GAIG;AAEH;;GAEG;AACH,kDAFW,KAAK,KAAK,GAAC,SAAS,mGAmC9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-sass-json-functions",
3
- "version": "4.0.1",
3
+ "version": "4.1.0",
4
4
  "description": "JSON encode and decode functions for node-sass.",
5
5
  "license": "MIT",
6
6
  "author": "Ivan Nikolić <niksy5@gmail.com> (http://ivannikolic.com)",
@@ -35,7 +35,7 @@
35
35
  "prerelease": "npm run lint && npm run lint:types && npm run build && npm run module-check",
36
36
  "release": "np --no-release-draft",
37
37
  "test": "BABEL_ENV=test nyc mocha --require @babel/register --require esm 'test/**/*.js' && nyc check-coverage",
38
- "test:watch": "nodemon --exec npm test",
38
+ "test:watch": "nodemon -e js,scss --exec npm test",
39
39
  "version": "if [ $(git rev-parse --abbrev-ref HEAD) == 'master' ]; then sed -i '' '/\\[unreleased\\]:/d' CHANGELOG.md && version-changelog CHANGELOG.md && changelog-verify CHANGELOG.md && git add CHANGELOG.md; else echo; fi"
40
40
  },
41
41
  "dependencies": {
@@ -43,6 +43,7 @@
43
43
  "is-plain-obj": "^3.0.0",
44
44
  "parse-color": "^1.0.0",
45
45
  "parse-css-dimension": "^1.1.0",
46
+ "postcss-values-parser": "^6.0.2",
46
47
  "rgb-hex": "^3.0.0",
47
48
  "round-to": "^5.0.0",
48
49
  "shorten-css-hex": "^1.1.0"
@@ -76,13 +77,13 @@
76
77
  "nyc": "^15.1.0",
77
78
  "prettier": "^2.4.0",
78
79
  "rollup": "^2.32.1",
79
- "sass": "^1.47.0",
80
+ "sass": "^1.67.0",
80
81
  "sass-true": "^6.0.1",
81
82
  "typescript": "^4.3.5",
82
83
  "version-changelog": "^3.1.1"
83
84
  },
84
85
  "peerDependencies": {
85
- "sass": ">=1.45"
86
+ "sass": ">=1.64"
86
87
  },
87
88
  "engines": {
88
89
  "node": ">=12.22"