node-sass-json-functions 3.3.0 → 4.0.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,19 @@
2
2
 
3
3
  ## [Unreleased][]
4
4
 
5
+ ## [4.0.0][] - 2023-05-01
6
+
7
+ ### Changed
8
+
9
+ - Use [new Sass API](https://sass-lang.com/documentation/js-api)
10
+
11
+ ### Removed
12
+
13
+ - **Node 10 support, lowest version is 12.22**
14
+ - **Legacy Sass support, lowest version is 1.45**
15
+ - Precision option; Dart Sass defaults to a sufficiently high precision for
16
+ all existing browsers
17
+
5
18
  ## [3.3.0][] - 2022-01-11
6
19
 
7
20
  ### Added
@@ -41,6 +54,9 @@
41
54
 
42
55
  <!-- prettier-ignore-end -->
43
56
 
44
- [unreleased]:
45
- https://github.com/niksy/node-sass-json-functions/compare/v3.3.0...HEAD
57
+ https://github.com/niksy/node-sass-json-functions/compare/v3.3.0...HEAD
58
+
46
59
  [3.3.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.3.0
60
+ [Unreleased]:
61
+ https://github.com/niksy/node-sass-json-functions/compare/v4.0.0...HEAD
62
+ [4.0.0]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.0
package/README.md CHANGED
@@ -16,15 +16,12 @@ npm install sass node-sass-json-functions --save
16
16
  import sass from 'sass';
17
17
  import jsonFns from 'node-sass-json-functions';
18
18
 
19
- sass.render(
20
- {
21
- file: './index.scss',
19
+ (async () => {
20
+ const result = await sass.compileAsync('./index.scss', {
22
21
  functions: { ...jsonFns }
23
- },
24
- (err, res) => {
25
- // ...
26
- }
27
- );
22
+ });
23
+ // ...
24
+ })();
28
25
  ```
29
26
 
30
27
  Module exports object with prepared functions `json-encode` and `json-decode`.
@@ -101,9 +98,9 @@ DEBUG: (foo: 1, bar: 2, 3, baz: 3 3 3, bad: (foo: 11, bar: 22, baz: 5, 4, 6, nul
101
98
 
102
99
  ## API
103
100
 
104
- ### json-encode(data[, quotes, precision])
101
+ ### json-encode(data[, quotes])
105
102
 
106
- Returns: `sass.types.String`
103
+ Returns: `sass.SassString`
107
104
 
108
105
  Encodes (`JSON.stringify`) data and returns [Sass string][sass-string]. By
109
106
  default, string is quoted with single quotes so that it can be easily used in
@@ -115,34 +112,27 @@ standard CSS values.
115
112
  alpha value, otherwise they are transformed to hex value (and it’s shorther
116
113
  version if possible)
117
114
  - [Sass strings][sass-string] are transformed to strings
118
- - Sass numbers are transformed to numbers
119
- - Sass null values and anything unresolved is transformed to null values
115
+ - [Sass numbers][sass-number] are transformed to numbers
116
+ - [Sass booleans][sass-boolean] are transformed to booleans
117
+ - [Sass null][sass-null] values and anything unresolved is transformed to null
118
+ values
120
119
 
121
120
  #### data
122
121
 
123
- Type:
124
- `sass.types.Null|sass.types.Number|sass.types.String|sass.types.Boolean|sass.types.Color|sass.types.List|sass.types.Map`
122
+ Type: `sass.Value`
125
123
 
126
124
  Data to encode (stringify).
127
125
 
128
126
  #### quotes
129
127
 
130
- Type: `sass.types.Boolean`
131
- Default: `true`
128
+ Type: `sass.SassBoolean`
129
+ Default: `sass.sassTrue`
132
130
 
133
131
  Should output string be quoted with single quotes.
134
132
 
135
- #### precision
136
-
137
- Type: `sass.types.Number`
138
- Default: `5`
139
-
140
- Number of digits after the decimal.
133
+ ### json-decode(string)
141
134
 
142
- ### json-decode(data)
143
-
144
- Returns:
145
- `sass.types.Null|sass.types.Number|sass.types.String|sass.types.Boolean|sass.types.Color|sass.types.List|sass.types.Map`
135
+ Returns: `sass.Value`
146
136
 
147
137
  Decodes (`JSON.parse`) string and returns one of [available Sass
148
138
  types][sass-types].
@@ -154,12 +144,14 @@ types][sass-types].
154
144
  - Strings are transformed to Sass numbers with units if they can be properly
155
145
  parsed with [parse-css-dimension][parse-css-dimension], otherwise they are
156
146
  transformed to [Sass strings][sass-string]
157
- - Numbers are transformed to Sass numbers
158
- - Null values and anything unresolved is transformed to Sass null values
147
+ - Numbers are transformed to [Sass numbers][sass-number]
148
+ - Booleans are transformed to [Sass booleans][sass-boolean]
149
+ - Null values and anything unresolved is transformed to [Sass null][sass-null]
150
+ values
159
151
 
160
- #### data
152
+ #### string
161
153
 
162
- Type: `sass.types.String`
154
+ Type: `sass.SassString`
163
155
 
164
156
  String to decode (parse).
165
157
 
@@ -172,11 +164,14 @@ MIT © [Ivan Nikolić](http://ivannikolic.com)
172
164
  [ci]: https://github.com/niksy/node-sass-json-functions/actions?query=workflow%3ACI
173
165
  [ci-img]: https://github.com/niksy/node-sass-json-functions/workflows/CI/badge.svg?branch=master
174
166
  [sass]: https://github.com/sass/dart-sass
175
- [sass-types]: https://github.com/sass/node-sass#functions--v300---experimental
176
- [sass-list]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#lists
177
- [sass-map]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#maps
178
- [sass-color]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#colors
179
- [sass-string]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#sass-script-strings
167
+ [sass-types]: https://sass-lang.com/documentation/js-api/classes/Value
168
+ [sass-list]: https://sass-lang.com/documentation/values/lists
169
+ [sass-map]: https://sass-lang.com/documentation/values/maps
170
+ [sass-color]: https://sass-lang.com/documentation/values/colors
171
+ [sass-number]: https://sass-lang.com/documentation/values/numbers
172
+ [sass-string]: https://sass-lang.com/documentation/values/strings
173
+ [sass-null]: https://sass-lang.com/documentation/values/null
174
+ [sass-boolean]: https://sass-lang.com/documentation/values/booleans
180
175
  [parse-color]: https://github.com/substack/parse-color
181
176
  [parse-css-dimension]: https://github.com/jedmao/parse-css-dimension
182
177
 
package/cjs/index.d.ts CHANGED
@@ -5,10 +5,10 @@ export type JsonPrimitive = string | number | boolean | null;
5
5
  export type JsonObject = {
6
6
  [x: string]: JsonValue | undefined;
7
7
  };
8
- /** @type {{ 'json-encode($value, $quotes: true, $precision: 5)': typeof encode, 'json-decode($value)': typeof decode }} */
8
+ /** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
9
9
  declare const api: {
10
- 'json-encode($value, $quotes: true, $precision: 5)': typeof encode;
11
- 'json-decode($value)': typeof decode;
10
+ 'json-encode($data, $quotes: true)': typeof encode;
11
+ 'json-decode($string)': typeof decode;
12
12
  };
13
13
  /**
14
14
  * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue
@@ -19,16 +19,20 @@ declare const api: {
19
19
  /**
20
20
  * 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.
21
21
  *
22
- * @param {sass.LegacyValue} value Data to encode (stringify).
23
- * @param {sass.types.Boolean} quotes Should output string be quoted with single quotes.
24
- * @param {sass.types.Number} precision Number of digits after the decimal.
22
+ * First argument: `sass.Value` - Data to encode (stringify).
23
+ *
24
+ * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.
25
+ *
26
+ * @param {sass.Value[]} encodeArguments
25
27
  */
26
- declare function encode(value: sass.LegacyValue, quotes: sass.types.Boolean, precision: sass.types.Number): sass.types.String;
28
+ declare function encode(encodeArguments: sass.Value[]): sass.SassString;
27
29
  /**
28
30
  * Decodes (`JSON.parse`) string and returns one of available Sass types.
29
31
  *
30
- * @param {sass.types.String} value String to decode (parse).
32
+ * First argument: `sass.SassString` - String to decode (parse).
33
+ *
34
+ * @param {sass.Value[]} decodeArguments
31
35
  */
32
- declare function decode(value: sass.types.String): sass.types.Null | sass.types.Number | sass.types.String | sass.types.Color | sass.types.List | sass.types.Map | sass.types.Boolean<true> | sass.types.Boolean<false>;
36
+ declare function decode(decodeArguments: sass.Value[]): sass.Value;
33
37
  import sass from "sass";
34
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.js"],"names":[],"mappings":";wBAKa,aAAa,GAAG,UAAU,cAAY;wBACtC,SAAS,EAAE;4BACX,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;;;;AAsC7C,2HAA2H;AAC3H,mBADW;IAAE,mDAAmD,EAAE,aAAa,CAAC;IAAC,qBAAqB,EAAE,aAAa,CAAA;CAAE,CAIrH;AA7CF;;;;;GAKG;AAEH;;;;;;GAMG;AACH,+BAJW,KAAK,WAAW,UAChB,KAAK,KAAK,QAAQ,aAClB,KAAK,KAAK,OAAO,qBAW3B;AAED;;;;GAIG;AACH,+BAFW,KAAK,KAAK,OAAO,wKAW3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.js"],"names":[],"mappings":";wBAKa,aAAa,GAAG,UAAU,cAAY;wBACtC,SAAS,EAAE;4BACX,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;;;;AA4C7C,4GAA4G;AAC5G,mBADW;IAAE,mCAAmC,EAAE,aAAa,CAAC;IAAC,sBAAsB,EAAE,aAAa,CAAA;CAAE,CAItG;AAnDF;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,yCAFW,KAAK,KAAK,EAAE,mBAWtB;AAED;;;;;;GAMG;AACH,yCAFW,KAAK,KAAK,EAAE,cAatB"}
package/cjs/index.js CHANGED
@@ -1,28 +1,22 @@
1
1
  'use strict';
2
2
 
3
3
  var sass = require('sass');
4
- var round = require('round-to');
5
4
  var rgbHex = require('rgb-hex');
6
5
  var shortHexColor = require('shorten-css-hex');
7
6
  var isPlainObject = require('is-plain-obj');
8
7
  var parseColor = require('parse-color');
9
8
  var parseUnit = require('parse-css-dimension');
9
+ var immutable = require('immutable');
10
10
 
11
11
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
12
 
13
13
  var sass__default = /*#__PURE__*/_interopDefaultLegacy(sass);
14
- var round__default = /*#__PURE__*/_interopDefaultLegacy(round);
15
14
  var rgbHex__default = /*#__PURE__*/_interopDefaultLegacy(rgbHex);
16
15
  var shortHexColor__default = /*#__PURE__*/_interopDefaultLegacy(shortHexColor);
17
16
  var isPlainObject__default = /*#__PURE__*/_interopDefaultLegacy(isPlainObject);
18
17
  var parseColor__default = /*#__PURE__*/_interopDefaultLegacy(parseColor);
19
18
  var parseUnit__default = /*#__PURE__*/_interopDefaultLegacy(parseUnit);
20
19
 
21
- /**
22
- * @typedef {object} Options
23
- * @property {number} precision Number of digits after the decimal.
24
- */
25
-
26
20
  /**
27
21
  * @typedef {import('../index').JsonValue} JsonValue
28
22
  * @typedef {import('../index').JsonObject} JsonObject
@@ -30,77 +24,73 @@ var parseUnit__default = /*#__PURE__*/_interopDefaultLegacy(parseUnit);
30
24
  */
31
25
 
32
26
  /**
33
- * @param {sass.LegacyValue|undefined} value
34
- * @param {Options} options
27
+ * @param {sass.Value|undefined} value
35
28
  */
36
- function getJsonValueFromSassValue(value, options) {
37
- let resolvedValue;
38
- if (value instanceof sass__default["default"].types.List) {
39
- resolvedValue = listToArray(value, options);
40
- } else if (value instanceof sass__default["default"].types.Map) {
41
- resolvedValue = mapToObject(value, options);
42
- } else if (value instanceof sass__default["default"].types.Color) {
43
- /** @type {[number, number, number]} */
44
- const rgbValue = [value.getR(), value.getG(), value.getB()];
45
- const alphaValue = value.getA();
46
- if (alphaValue === 1) {
47
- resolvedValue = shortHexColor__default["default"](`#${rgbHex__default["default"].apply(null, rgbValue)}`);
48
- } else {
49
- resolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;
50
- }
51
- } else if (value instanceof sass__default["default"].types.Number) {
52
- if (value.getUnit() !== '') {
53
- resolvedValue = String(
54
- round__default["default"](Number(value.getValue()), options.precision) +
55
- value.getUnit()
56
- );
57
- } else {
58
- resolvedValue = round__default["default"](Number(value.getValue()), options.precision);
59
- }
60
- } else {
61
- try {
62
- if (typeof value !== 'undefined' && 'getValue' in value) {
63
- resolvedValue = value.getValue();
64
- } else {
65
- resolvedValue = null;
66
- }
67
- } catch (error) {
68
- resolvedValue = null;
69
- }
70
- }
71
- return resolvedValue;
29
+ function getJsonValueFromSassValue(value) {
30
+ let resolvedValue;
31
+ if (value instanceof sass__default["default"].SassList) {
32
+ resolvedValue = listToArray(value);
33
+ } else if (value instanceof sass__default["default"].SassMap) {
34
+ resolvedValue = mapToObject(value);
35
+ } else if (value instanceof sass__default["default"].SassColor) {
36
+ /** @type {[number, number, number]} */
37
+ const rgbValue = [value.red, value.green, value.blue];
38
+ const alphaValue = value.alpha;
39
+ if (alphaValue === 1) {
40
+ resolvedValue = shortHexColor__default["default"](`#${rgbHex__default["default"].apply(null, rgbValue)}`);
41
+ } else {
42
+ resolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;
43
+ }
44
+ } else if (value instanceof sass__default["default"].SassNumber) {
45
+ if (value.hasUnits) {
46
+ resolvedValue = String(value.value) + value.numeratorUnits.last();
47
+ } else {
48
+ resolvedValue = Number(value.value);
49
+ }
50
+ } else if (value instanceof sass__default["default"].SassString) {
51
+ resolvedValue = String(value.text);
52
+ } else if (value instanceof sass__default["default"].SassBoolean) {
53
+ resolvedValue = Boolean(value.value);
54
+ } else {
55
+ resolvedValue = null;
56
+ }
57
+ return resolvedValue;
72
58
  }
73
59
 
74
60
  /**
75
- * @param {sass.types.List} list
76
- * @param {Options} options
61
+ * @param {sass.SassList} list
77
62
  */
78
- function listToArray(list, options) {
79
- const length = list.getLength();
80
- /** @type {JsonArray} */
81
- const data = [];
82
- for (const index of Array.from({ length }).keys()) {
83
- const value = getJsonValueFromSassValue(list.getValue(index), options);
84
- data.push(value);
85
- }
86
- return data;
63
+ function listToArray(list) {
64
+ const length = list.asList.size;
65
+ /** @type {JsonArray} */
66
+ const data = [];
67
+ for (const index of Array.from({
68
+ length
69
+ }).keys()) {
70
+ const value = getJsonValueFromSassValue(list.get(index));
71
+ data.push(value);
72
+ }
73
+ return data;
87
74
  }
88
75
 
89
76
  /**
90
- * @param {sass.types.Map} map
91
- * @param {Options} options
77
+ * @param {sass.SassMap} map
92
78
  */
93
- function mapToObject(map, options) {
94
- const length = map.getLength();
95
- /** @type {JsonObject} */
96
- const data = {};
97
- for (const index of Array.from({ length }).keys()) {
98
- // @ts-ignore
99
- const key = String(map.getKey(index).getValue());
100
- const value = getJsonValueFromSassValue(map.getValue(index), options);
101
- data[key] = value;
102
- }
103
- return data;
79
+ function mapToObject(map) {
80
+ const length = map.contents.size;
81
+ /** @type {JsonObject} */
82
+ const data = {};
83
+ for (const index of Array.from({
84
+ length
85
+ }).keys()) {
86
+ const resolvedValue = map.get(index);
87
+ if (typeof resolvedValue !== 'undefined') {
88
+ const key = String(resolvedValue.get(0));
89
+ const value = getJsonValueFromSassValue(resolvedValue.get(1));
90
+ data[key] = value;
91
+ }
92
+ }
93
+ return data;
104
94
  }
105
95
 
106
96
  /**
@@ -115,87 +105,92 @@ const unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];
115
105
  * @param {string} value
116
106
  */
117
107
  function isColor(value) {
118
- return typeof parseColor__default["default"](value).rgba !== 'undefined';
108
+ return typeof parseColor__default["default"](value).rgba !== 'undefined';
119
109
  }
120
110
 
121
111
  /**
122
112
  * @param {string} value
123
113
  */
124
114
  function parseValueToStringOrNumber(value) {
125
- let resolvedValue;
126
- try {
127
- const { value: parsedValue, unit, type } = parseUnit__default["default"](value);
128
- if (unitTypes.includes(type)) {
129
- resolvedValue = new sass__default["default"].types.Number(parsedValue, unit);
130
- } else if (type === 'percentage') {
131
- resolvedValue = new sass__default["default"].types.Number(parsedValue, '%');
132
- } else {
133
- resolvedValue = new sass__default["default"].types.String(value);
134
- }
135
- } catch (error) {
136
- resolvedValue = new sass__default["default"].types.String(value);
137
- }
138
- return resolvedValue;
115
+ let resolvedValue;
116
+ try {
117
+ const {
118
+ value: parsedValue,
119
+ unit,
120
+ type
121
+ } = parseUnit__default["default"](value);
122
+ if (unitTypes.includes(type)) {
123
+ resolvedValue = new sass__default["default"].SassNumber(parsedValue, unit);
124
+ } else if (type === 'percentage') {
125
+ resolvedValue = new sass__default["default"].SassNumber(parsedValue, '%');
126
+ } else {
127
+ resolvedValue = new sass__default["default"].SassString(value);
128
+ }
129
+ } catch (error) {
130
+ resolvedValue = new sass__default["default"].SassString(value);
131
+ }
132
+ return resolvedValue;
139
133
  }
140
134
 
141
135
  /**
142
136
  * @param {string} value
143
137
  */
144
138
  function parseValueToColor(value) {
145
- const [r, g, b, a] = parseColor__default["default"](value).rgba;
146
- return new sass__default["default"].types.Color(r, g, b, a);
139
+ const [red, green, blue, alpha] = parseColor__default["default"](value).rgba;
140
+ return new sass__default["default"].SassColor({
141
+ red,
142
+ green,
143
+ blue,
144
+ alpha
145
+ });
147
146
  }
148
147
 
149
148
  /**
150
149
  * @param {JsonValue} value
151
150
  */
152
151
  function setJsonValueToSassValue(value) {
153
- let resolvedValue;
154
- if (Array.isArray(value)) {
155
- resolvedValue = arrayToList(value);
156
- } else if (isPlainObject__default["default"](value)) {
157
- resolvedValue = objectToMap(value);
158
- } else if (isColor(String(value))) {
159
- resolvedValue = parseValueToColor(String(value));
160
- } else if (typeof value === 'string') {
161
- resolvedValue = parseValueToStringOrNumber(value);
162
- } else if (typeof value === 'number') {
163
- resolvedValue = new sass__default["default"].types.Number(value);
164
- } else if (typeof value === 'boolean') {
165
- resolvedValue = value
166
- ? sass__default["default"].types.Boolean.TRUE
167
- : sass__default["default"].types.Boolean.FALSE;
168
- } else {
169
- resolvedValue = sass__default["default"].types.Null.NULL;
170
- }
171
- return resolvedValue;
152
+ let resolvedValue;
153
+ if (Array.isArray(value)) {
154
+ resolvedValue = arrayToList(value);
155
+ } else if (isPlainObject__default["default"](value)) {
156
+ resolvedValue = objectToMap(value);
157
+ } else if (isColor(String(value))) {
158
+ resolvedValue = parseValueToColor(String(value));
159
+ } else if (typeof value === 'string') {
160
+ resolvedValue = parseValueToStringOrNumber(value);
161
+ } else if (typeof value === 'number') {
162
+ resolvedValue = new sass__default["default"].SassNumber(value);
163
+ } else if (typeof value === 'boolean') {
164
+ resolvedValue = value ? sass__default["default"].sassTrue : sass__default["default"].sassFalse;
165
+ } else {
166
+ resolvedValue = sass__default["default"].sassNull;
167
+ }
168
+ return resolvedValue;
172
169
  }
173
170
 
174
171
  /**
175
172
  * @param {JsonArray} array
176
173
  */
177
174
  function arrayToList(array) {
178
- const length = array.length;
179
- const data = new sass__default["default"].types.List(length);
180
- for (const [index, item] of array.entries()) {
181
- data.setValue(index, setJsonValueToSassValue(item));
182
- }
183
- return data;
175
+ /** @type {sass.Value[]} */
176
+ const data = [];
177
+ for (const item of array) {
178
+ data.push(setJsonValueToSassValue(item));
179
+ }
180
+ return new sass__default["default"].SassList(data);
184
181
  }
185
182
 
186
183
  /**
187
184
  * @param {JsonObject} object
188
185
  */
189
186
  function objectToMap(object) {
190
- const length = Object.keys(object).length;
191
- const data = new sass__default["default"].types.Map(length);
192
- for (const [index, [property, value = null]] of Object.entries(
193
- object
194
- ).entries()) {
195
- data.setKey(index, setJsonValueToSassValue(property));
196
- data.setValue(index, setJsonValueToSassValue(value));
197
- }
198
- return data;
187
+ /** @type {[sass.Value, sass.Value][]} */
188
+ const data = [];
189
+ for (const [property, value = null] of Object.entries(object)) {
190
+ data.push([setJsonValueToSassValue(property), setJsonValueToSassValue(value)]);
191
+ }
192
+ // eslint-disable-next-line new-cap
193
+ return new sass__default["default"].SassMap(immutable.OrderedMap(data));
199
194
  }
200
195
 
201
196
  /**
@@ -208,41 +203,47 @@ function objectToMap(object) {
208
203
  /**
209
204
  * 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.
210
205
  *
211
- * @param {sass.LegacyValue} value Data to encode (stringify).
212
- * @param {sass.types.Boolean} quotes Should output string be quoted with single quotes.
213
- * @param {sass.types.Number} precision Number of digits after the decimal.
206
+ * First argument: `sass.Value` - Data to encode (stringify).
207
+ *
208
+ * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.
209
+ *
210
+ * @param {sass.Value[]} encodeArguments
214
211
  */
215
- function encode(value, quotes, precision) {
216
- const shouldQuote = quotes.getValue();
217
- let resolvedValue = JSON.stringify(
218
- getJsonValueFromSassValue(value, { precision: precision.getValue() })
219
- );
220
- if (shouldQuote) {
221
- resolvedValue = `'${resolvedValue}'`;
222
- }
223
- return new sass__default["default"].types.String(resolvedValue);
212
+ function encode(encodeArguments) {
213
+ const [data, quotes_] = encodeArguments;
214
+ const quotes = quotes_.assertBoolean('quotes');
215
+ const shouldQuote = quotes.value;
216
+ let resolvedValue = JSON.stringify(getJsonValueFromSassValue(data));
217
+ if (shouldQuote) {
218
+ resolvedValue = `'${resolvedValue}'`;
219
+ }
220
+ return new sass__default["default"].SassString(resolvedValue);
224
221
  }
225
222
 
226
223
  /**
227
224
  * Decodes (`JSON.parse`) string and returns one of available Sass types.
228
225
  *
229
- * @param {sass.types.String} value String to decode (parse).
226
+ * First argument: `sass.SassString` - String to decode (parse).
227
+ *
228
+ * @param {sass.Value[]} decodeArguments
230
229
  */
231
- function decode(value) {
232
- /** @type {JsonValue?} */
233
- let resolvedValue = {};
234
- try {
235
- resolvedValue = JSON.parse(value.getValue());
236
- } catch (error) {
237
- resolvedValue = null;
238
- }
239
- return setJsonValueToSassValue(resolvedValue);
230
+ function decode(decodeArguments) {
231
+ const [string_] = decodeArguments;
232
+ const string = string_.assertString('string');
233
+ /** @type {JsonValue?} */
234
+ let resolvedValue = {};
235
+ try {
236
+ resolvedValue = JSON.parse(string.text);
237
+ } catch (error) {
238
+ resolvedValue = null;
239
+ }
240
+ return setJsonValueToSassValue(resolvedValue);
240
241
  }
241
242
 
242
- /** @type {{ 'json-encode($value, $quotes: true, $precision: 5)': typeof encode, 'json-decode($value)': typeof decode }} */
243
+ /** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
243
244
  const api = {
244
- 'json-encode($value, $quotes: true, $precision: 5)': encode,
245
- 'json-decode($value)': decode
245
+ 'json-encode($data, $quotes: true)': encode,
246
+ 'json-decode($string)': decode
246
247
  };
247
248
 
248
249
  module.exports = api;
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 sass from 'sass';\nimport round from 'round-to';\nimport rgbHex from 'rgb-hex';\nimport shortHexColor from 'shorten-css-hex';\n\n/**\n * @typedef {object} Options\n * @property {number} precision Number of digits after the decimal.\n */\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.LegacyValue|undefined} value\n * @param {Options} options\n */\nfunction getJsonValueFromSassValue(value, options) {\n\tlet resolvedValue;\n\tif (value instanceof sass.types.List) {\n\t\tresolvedValue = listToArray(value, options);\n\t} else if (value instanceof sass.types.Map) {\n\t\tresolvedValue = mapToObject(value, options);\n\t} else if (value instanceof sass.types.Color) {\n\t\t/** @type {[number, number, number]} */\n\t\tconst rgbValue = [value.getR(), value.getG(), value.getB()];\n\t\tconst alphaValue = value.getA();\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.types.Number) {\n\t\tif (value.getUnit() !== '') {\n\t\t\tresolvedValue = String(\n\t\t\t\tround(Number(value.getValue()), options.precision) +\n\t\t\t\t\tvalue.getUnit()\n\t\t\t);\n\t\t} else {\n\t\t\tresolvedValue = round(Number(value.getValue()), options.precision);\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tif (typeof value !== 'undefined' && 'getValue' in value) {\n\t\t\t\tresolvedValue = value.getValue();\n\t\t\t} else {\n\t\t\t\tresolvedValue = null;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tresolvedValue = null;\n\t\t}\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {sass.types.List} list\n * @param {Options} options\n */\nfunction listToArray(list, options) {\n\tconst length = list.getLength();\n\t/** @type {JsonArray} */\n\tconst data = [];\n\tfor (const index of Array.from({ length }).keys()) {\n\t\tconst value = getJsonValueFromSassValue(list.getValue(index), options);\n\t\tdata.push(value);\n\t}\n\treturn data;\n}\n\n/**\n * @param {sass.types.Map} map\n * @param {Options} options\n */\nfunction mapToObject(map, options) {\n\tconst length = map.getLength();\n\t/** @type {JsonObject} */\n\tconst data = {};\n\tfor (const index of Array.from({ length }).keys()) {\n\t\t// @ts-ignore\n\t\tconst key = String(map.getKey(index).getValue());\n\t\tconst value = getJsonValueFromSassValue(map.getValue(index), options);\n\t\tdata[key] = value;\n\t}\n\treturn data;\n}\n\nexport default getJsonValueFromSassValue;\n","import sass from 'sass';\nimport isPlainObject from 'is-plain-obj';\nimport parseColor from 'parse-color';\nimport parseUnit from 'parse-css-dimension';\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.types.Number(parsedValue, unit);\n\t\t} else if (type === 'percentage') {\n\t\t\tresolvedValue = new sass.types.Number(parsedValue, '%');\n\t\t} else {\n\t\t\tresolvedValue = new sass.types.String(value);\n\t\t}\n\t} catch (error) {\n\t\tresolvedValue = new sass.types.String(value);\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {string} value\n */\nfunction parseValueToColor(value) {\n\tconst [r, g, b, a] = parseColor(value).rgba;\n\treturn new sass.types.Color(r, g, b, a);\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.types.Number(value);\n\t} else if (typeof value === 'boolean') {\n\t\tresolvedValue = value\n\t\t\t? sass.types.Boolean.TRUE\n\t\t\t: sass.types.Boolean.FALSE;\n\t} else {\n\t\tresolvedValue = sass.types.Null.NULL;\n\t}\n\treturn resolvedValue;\n}\n\n/**\n * @param {JsonArray} array\n */\nfunction arrayToList(array) {\n\tconst length = array.length;\n\tconst data = new sass.types.List(length);\n\tfor (const [index, item] of array.entries()) {\n\t\tdata.setValue(index, setJsonValueToSassValue(item));\n\t}\n\treturn data;\n}\n\n/**\n * @param {JsonObject} object\n */\nfunction objectToMap(object) {\n\tconst length = Object.keys(object).length;\n\tconst data = new sass.types.Map(length);\n\tfor (const [index, [property, value = null]] of Object.entries(\n\t\tobject\n\t).entries()) {\n\t\tdata.setKey(index, setJsonValueToSassValue(property));\n\t\tdata.setValue(index, setJsonValueToSassValue(value));\n\t}\n\treturn data;\n}\n\nexport default setJsonValueToSassValue;\n","import sass from 'sass';\nimport getJsonValueFromSassValue from './lib/sass-to-json';\nimport setJsonValueToSassValue from './lib/json-to-sass';\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 * @param {sass.LegacyValue} value Data to encode (stringify).\n * @param {sass.types.Boolean} quotes Should output string be quoted with single quotes.\n * @param {sass.types.Number} precision Number of digits after the decimal.\n */\nfunction encode(value, quotes, precision) {\n\tconst shouldQuote = quotes.getValue();\n\tlet resolvedValue = JSON.stringify(\n\t\tgetJsonValueFromSassValue(value, { precision: precision.getValue() })\n\t);\n\tif (shouldQuote) {\n\t\tresolvedValue = `'${resolvedValue}'`;\n\t}\n\treturn new sass.types.String(resolvedValue);\n}\n\n/**\n * Decodes (`JSON.parse`) string and returns one of available Sass types.\n *\n * @param {sass.types.String} value String to decode (parse).\n */\nfunction decode(value) {\n\t/** @type {JsonValue?} */\n\tlet resolvedValue = {};\n\ttry {\n\t\tresolvedValue = JSON.parse(value.getValue());\n\t} catch (error) {\n\t\tresolvedValue = null;\n\t}\n\treturn setJsonValueToSassValue(resolvedValue);\n}\n\n/** @type {{ 'json-encode($value, $quotes: true, $precision: 5)': typeof encode, 'json-decode($value)': typeof decode }} */\nconst api = {\n\t'json-encode($value, $quotes: true, $precision: 5)': encode,\n\t'json-decode($value)': decode\n};\n\nexport default api;\n"],"names":["sass","shortHexColor","rgbHex","round","parseColor","parseUnit","isPlainObject"],"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 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 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 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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"}