node-sass-json-functions 3.2.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,26 @@
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
+
18
+ ## [3.3.0][] - 2022-01-11
19
+
20
+ ### Added
21
+
22
+ - Precision option
23
+ ([#6](https://github.com/niksy/node-sass-json-functions/issues/6))
24
+
5
25
  ## [3.2.0][] - 2021-11-10
6
26
 
7
27
  ### Added
@@ -26,10 +46,17 @@
26
46
  - **Node 4 support, lowest version is 10**
27
47
  - Precision option
28
48
 
49
+ <!-- prettier-ignore-start -->
50
+
29
51
  [3.0.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.0.0
30
- [unreleased]:
31
- https://github.com/niksy/node-sass-json-functions/compare/v3.1.0...HEAD
32
52
  [3.1.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.1.0
33
- [unreleased]:
34
- https://github.com/niksy/node-sass-json-functions/compare/v3.2.0...HEAD
35
53
  [3.2.0]: https://github.com/niksy/node-sass-json-functions/tree/v3.2.0
54
+
55
+ <!-- prettier-ignore-end -->
56
+
57
+ https://github.com/niksy/node-sass-json-functions/compare/v3.3.0...HEAD
58
+
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])
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,27 +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
- ### json-decode(data)
133
+ ### json-decode(string)
136
134
 
137
- Returns:
138
- `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`
139
136
 
140
137
  Decodes (`JSON.parse`) string and returns one of [available Sass
141
138
  types][sass-types].
@@ -147,12 +144,14 @@ types][sass-types].
147
144
  - Strings are transformed to Sass numbers with units if they can be properly
148
145
  parsed with [parse-css-dimension][parse-css-dimension], otherwise they are
149
146
  transformed to [Sass strings][sass-string]
150
- - Numbers are transformed to Sass numbers
151
- - 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
152
151
 
153
- #### data
152
+ #### string
154
153
 
155
- Type: `sass.types.String`
154
+ Type: `sass.SassString`
156
155
 
157
156
  String to decode (parse).
158
157
 
@@ -165,11 +164,14 @@ MIT © [Ivan Nikolić](http://ivannikolic.com)
165
164
  [ci]: https://github.com/niksy/node-sass-json-functions/actions?query=workflow%3ACI
166
165
  [ci-img]: https://github.com/niksy/node-sass-json-functions/workflows/CI/badge.svg?branch=master
167
166
  [sass]: https://github.com/sass/dart-sass
168
- [sass-types]: https://github.com/sass/node-sass#functions--v300---experimental
169
- [sass-list]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#lists
170
- [sass-map]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#maps
171
- [sass-color]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#colors
172
- [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
173
175
  [parse-color]: https://github.com/substack/parse-color
174
176
  [parse-css-dimension]: https://github.com/jedmao/parse-css-dimension
175
177
 
package/cjs/index.d.ts CHANGED
@@ -1,20 +1,15 @@
1
1
  export default api;
2
- export type SassType = sass.types.Null | sass.types.Number | sass.types.String | sass.types.Boolean | sass.types.Color | sass.types.List | sass.types.Map;
3
2
  export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
4
3
  export type JsonArray = JsonValue[];
5
4
  export type JsonPrimitive = string | number | boolean | null;
6
5
  export type JsonObject = {
7
6
  [x: string]: JsonValue | undefined;
8
7
  };
9
- /** @type {{ 'json-encode($value, $quotes: true)': typeof encode, 'json-decode($value)': typeof decode }} */
8
+ /** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
10
9
  declare const api: {
11
- 'json-encode($value, $quotes: true)': typeof encode;
12
- 'json-decode($value)': typeof decode;
10
+ 'json-encode($data, $quotes: true)': typeof encode;
11
+ 'json-decode($string)': typeof decode;
13
12
  };
14
- import sass from "sass";
15
- /**
16
- * @typedef {sass.types.Null|sass.types.Number|sass.types.String|sass.types.Boolean|sass.types.Color|sass.types.List|sass.types.Map} SassType
17
- */
18
13
  /**
19
14
  * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue
20
15
  * @typedef {JsonValue[]} JsonArray
@@ -24,14 +19,20 @@ import sass from "sass";
24
19
  /**
25
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.
26
21
  *
27
- * @param {SassType} value Data to encode (stringify).
28
- * @param {sass.types.Boolean} quotes Should output string be quoted with single quotes.
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
29
27
  */
30
- declare function encode(value: SassType, quotes: sass.types.Boolean): sass.types.String;
28
+ declare function encode(encodeArguments: sass.Value[]): sass.SassString;
31
29
  /**
32
30
  * Decodes (`JSON.parse`) string and returns one of available Sass types.
33
31
  *
34
- * @param {sass.types.String} value String to decode (parse).
32
+ * First argument: `sass.SassString` - String to decode (parse).
33
+ *
34
+ * @param {sass.Value[]} decodeArguments
35
35
  */
36
- declare function decode(value: sass.types.String): sass.types.Null | sass.types.Number | sass.types.String | sass.types.Boolean<true> | sass.types.Boolean<false> | sass.types.Color | sass.types.List<sass.types.SassType> | sass.types.Map<sass.types.SassType, sass.types.SassType>;
36
+ declare function decode(decodeArguments: sass.Value[]): sass.Value;
37
+ import sass from "sass";
37
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.js"],"names":[],"mappings":";uBAKa,KAAK,KAAK,CAAC,IAAI,GAAC,KAAK,KAAK,OAAO,GAAC,KAAK,KAAK,OAAO,GAAC,KAAK,KAAK,QAAQ,GAAC,KAAK,KAAK,CAAC,KAAK,GAAC,KAAK,KAAK,CAAC,IAAI,GAAC,KAAK,KAAK,IAAI;wBAGtH,aAAa,GAAG,UAAU,cAAY;wBACtC,SAAS,EAAE;4BACX,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;;;;AAmC7C,4GAA4G;AAC5G,mBADW;IAAE,oCAAoC,EAAE,aAAa,CAAC;IAAC,qBAAqB,EAAE,aAAa,CAAA;CAAE,CAItG;;AA7CF;;GAEG;AACH;;;;;GAKG;AAEH;;;;;GAKG;AACH,+BAHW,QAAQ,UACR,KAAK,KAAK,QAAQ,qBAS5B;AAED;;;;GAIG;AACH,+BAFW,KAAK,KAAK,OAAO,uOAW3B"}
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,17 +1,16 @@
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);
@@ -19,83 +18,82 @@ var parseColor__default = /*#__PURE__*/_interopDefaultLegacy(parseColor);
19
18
  var parseUnit__default = /*#__PURE__*/_interopDefaultLegacy(parseUnit);
20
19
 
21
20
  /**
22
- * @typedef {import('../index').SassType} SassType
23
21
  * @typedef {import('../index').JsonValue} JsonValue
24
22
  * @typedef {import('../index').JsonObject} JsonObject
25
23
  * @typedef {import('../index').JsonArray} JsonArray
26
24
  */
27
25
 
28
26
  /**
29
- * @param {SassType} value
27
+ * @param {sass.Value|undefined} value
30
28
  */
31
29
  function getJsonValueFromSassValue(value) {
32
- let resolvedValue;
33
- if (value instanceof sass__default["default"].types.List) {
34
- resolvedValue = listToArray(value);
35
- } else if (value instanceof sass__default["default"].types.Map) {
36
- resolvedValue = mapToObject(value);
37
- } else if (value instanceof sass__default["default"].types.Color) {
38
- /** @type {[number, number, number]} */
39
- const rgbValue = [value.getR(), value.getG(), value.getB()];
40
- const alphaValue = value.getA();
41
- if (alphaValue === 1) {
42
- resolvedValue = shortHexColor__default["default"](`#${rgbHex__default["default"].apply(null, rgbValue)}`);
43
- } else {
44
- resolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;
45
- }
46
- } else if (value instanceof sass__default["default"].types.Number) {
47
- if (value.getUnit() !== '') {
48
- resolvedValue = String(
49
- round__default["default"](Number(value.getValue()), 0) + value.getUnit()
50
- );
51
- } else {
52
- resolvedValue = round__default["default"](Number(value.getValue()), 0);
53
- }
54
- } else {
55
- try {
56
- if ('getValue' in value) {
57
- resolvedValue = value.getValue();
58
- } else {
59
- resolvedValue = null;
60
- }
61
- } catch (error) {
62
- resolvedValue = null;
63
- }
64
- }
65
- return resolvedValue;
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;
66
58
  }
67
59
 
68
60
  /**
69
- * @param {sass.types.List} list
61
+ * @param {sass.SassList} list
70
62
  */
71
63
  function listToArray(list) {
72
- const length = list.getLength();
73
- /** @type {JsonArray} */
74
- const data = [];
75
- for (const index of Array.from({ length }).keys()) {
76
- const value = getJsonValueFromSassValue(list.getValue(index));
77
- data.push(value);
78
- }
79
- return data;
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;
80
74
  }
81
75
 
82
76
  /**
83
- * @param {sass.types.Map} map
77
+ * @param {sass.SassMap} map
84
78
  */
85
79
  function mapToObject(map) {
86
- const length = map.getLength();
87
- /** @type {JsonObject} */
88
- const data = {};
89
- for (const index of Array.from({ length }).keys()) {
90
- const key = String(map.getKey(index).getValue());
91
- const value = getJsonValueFromSassValue(map.getValue(index));
92
- data[key] = value;
93
- }
94
- return data;
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;
95
94
  }
96
95
 
97
96
  /**
98
- * @typedef {import('../index').SassType} SassType
99
97
  * @typedef {import('../index').JsonValue} JsonValue
100
98
  * @typedef {import('../index').JsonObject} JsonObject
101
99
  * @typedef {import('../index').JsonArray} JsonArray
@@ -107,92 +105,94 @@ const unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];
107
105
  * @param {string} value
108
106
  */
109
107
  function isColor(value) {
110
- return typeof parseColor__default["default"](value).rgba !== 'undefined';
108
+ return typeof parseColor__default["default"](value).rgba !== 'undefined';
111
109
  }
112
110
 
113
111
  /**
114
112
  * @param {string} value
115
113
  */
116
114
  function parseValueToStringOrNumber(value) {
117
- let resolvedValue;
118
- try {
119
- const { value: parsedValue, unit, type } = parseUnit__default["default"](value);
120
- if (unitTypes.includes(type)) {
121
- resolvedValue = new sass__default["default"].types.Number(parsedValue, unit);
122
- } else if (type === 'percentage') {
123
- resolvedValue = new sass__default["default"].types.Number(parsedValue, '%');
124
- } else {
125
- resolvedValue = new sass__default["default"].types.String(value);
126
- }
127
- } catch (error) {
128
- resolvedValue = new sass__default["default"].types.String(value);
129
- }
130
- 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;
131
133
  }
132
134
 
133
135
  /**
134
136
  * @param {string} value
135
137
  */
136
138
  function parseValueToColor(value) {
137
- const [r, g, b, a] = parseColor__default["default"](value).rgba;
138
- 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
+ });
139
146
  }
140
147
 
141
148
  /**
142
149
  * @param {JsonValue} value
143
150
  */
144
151
  function setJsonValueToSassValue(value) {
145
- let resolvedValue;
146
- if (Array.isArray(value)) {
147
- resolvedValue = arrayToList(value);
148
- } else if (isPlainObject__default["default"](value)) {
149
- resolvedValue = objectToMap(value);
150
- } else if (isColor(String(value))) {
151
- resolvedValue = parseValueToColor(String(value));
152
- } else if (typeof value === 'string') {
153
- resolvedValue = parseValueToStringOrNumber(value);
154
- } else if (typeof value === 'number') {
155
- resolvedValue = new sass__default["default"].types.Number(value);
156
- } else if (typeof value === 'boolean') {
157
- resolvedValue = value
158
- ? sass__default["default"].types.Boolean.TRUE
159
- : sass__default["default"].types.Boolean.FALSE;
160
- } else {
161
- resolvedValue = sass__default["default"].types.Null.NULL;
162
- }
163
- 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;
164
169
  }
165
170
 
166
171
  /**
167
172
  * @param {JsonArray} array
168
173
  */
169
174
  function arrayToList(array) {
170
- const length = array.length;
171
- const data = new sass__default["default"].types.List(length);
172
- for (const [index, item] of array.entries()) {
173
- data.setValue(index, setJsonValueToSassValue(item));
174
- }
175
- 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);
176
181
  }
177
182
 
178
183
  /**
179
184
  * @param {JsonObject} object
180
185
  */
181
186
  function objectToMap(object) {
182
- const length = Object.keys(object).length;
183
- const data = new sass__default["default"].types.Map(length);
184
- for (const [index, [property, value = null]] of Object.entries(
185
- object
186
- ).entries()) {
187
- data.setKey(index, setJsonValueToSassValue(property));
188
- data.setValue(index, setJsonValueToSassValue(value));
189
- }
190
- 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));
191
194
  }
192
195
 
193
- /**
194
- * @typedef {sass.types.Null|sass.types.Number|sass.types.String|sass.types.Boolean|sass.types.Color|sass.types.List|sass.types.Map} SassType
195
- */
196
196
  /**
197
197
  * @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue
198
198
  * @typedef {JsonValue[]} JsonArray
@@ -203,38 +203,47 @@ function objectToMap(object) {
203
203
  /**
204
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.
205
205
  *
206
- * @param {SassType} value Data to encode (stringify).
207
- * @param {sass.types.Boolean} quotes Should output string be quoted with single quotes.
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
208
211
  */
209
- function encode(value, quotes) {
210
- const shouldQuote = quotes.getValue();
211
- let resolvedValue = JSON.stringify(getJsonValueFromSassValue(value));
212
- if (shouldQuote) {
213
- resolvedValue = `'${resolvedValue}'`;
214
- }
215
- 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);
216
221
  }
217
222
 
218
223
  /**
219
224
  * Decodes (`JSON.parse`) string and returns one of available Sass types.
220
225
  *
221
- * @param {sass.types.String} value String to decode (parse).
226
+ * First argument: `sass.SassString` - String to decode (parse).
227
+ *
228
+ * @param {sass.Value[]} decodeArguments
222
229
  */
223
- function decode(value) {
224
- /** @type {JsonValue?} */
225
- let resolvedValue = {};
226
- try {
227
- resolvedValue = JSON.parse(value.getValue());
228
- } catch (error) {
229
- resolvedValue = null;
230
- }
231
- 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);
232
241
  }
233
242
 
234
- /** @type {{ 'json-encode($value, $quotes: true)': typeof encode, 'json-decode($value)': typeof decode }} */
243
+ /** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
235
244
  const api = {
236
- 'json-encode($value, $quotes: true)': encode,
237
- 'json-decode($value)': decode
245
+ 'json-encode($data, $quotes: true)': encode,
246
+ 'json-decode($string)': decode
238
247
  };
239
248
 
240
249
  module.exports = api;