node-sass-json-functions 3.3.0 → 4.0.1

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,25 @@
2
2
 
3
3
  ## [Unreleased][]
4
4
 
5
+ ## [4.0.1][] - 2023-06-13
6
+
7
+ ### Fixed
8
+
9
+ - ES module import implementation
10
+
11
+ ## [4.0.0][] - 2023-05-01
12
+
13
+ ### Changed
14
+
15
+ - Use [new Sass API](https://sass-lang.com/documentation/js-api)
16
+
17
+ ### Removed
18
+
19
+ - **Node 10 support, lowest version is 12.22**
20
+ - **Legacy Sass support, lowest version is 1.45**
21
+ - Precision option; Dart Sass defaults to a sufficiently high precision for
22
+ all existing browsers
23
+
5
24
  ## [3.3.0][] - 2022-01-11
6
25
 
7
26
  ### Added
@@ -41,6 +60,13 @@
41
60
 
42
61
  <!-- prettier-ignore-end -->
43
62
 
44
- [unreleased]:
45
- https://github.com/niksy/node-sass-json-functions/compare/v3.3.0...HEAD
63
+ https://github.com/niksy/node-sass-json-functions/compare/v3.3.0...HEAD
64
+
46
65
  [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
+ [4.0.1]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.1
69
+
70
+ https://github.com/niksy/node-sass-json-functions/compare/v4.0.0...HEAD
71
+
72
+ [4.0.0]: https://github.com/niksy/node-sass-json-functions/tree/v4.0.0
package/README.md CHANGED
@@ -13,18 +13,15 @@ npm install sass node-sass-json-functions --save
13
13
  ## Usage
14
14
 
15
15
  ```js
16
- import sass from 'sass';
16
+ import * as 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>;
33
- import sass from "sass";
36
+ declare function decode(decodeArguments: sass.Value[]): sass.Value;
37
+ import * as 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,40 @@
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
- var sass__default = /*#__PURE__*/_interopDefaultLegacy(sass);
14
- var round__default = /*#__PURE__*/_interopDefaultLegacy(round);
13
+ function _interopNamespace(e) {
14
+ if (e && e.__esModule) return e;
15
+ var n = Object.create(null);
16
+ if (e) {
17
+ Object.keys(e).forEach(function (k) {
18
+ if (k !== 'default') {
19
+ var d = Object.getOwnPropertyDescriptor(e, k);
20
+ Object.defineProperty(n, k, d.get ? d : {
21
+ enumerable: true,
22
+ get: function () { return e[k]; }
23
+ });
24
+ }
25
+ });
26
+ }
27
+ n["default"] = e;
28
+ return Object.freeze(n);
29
+ }
30
+
31
+ var sass__namespace = /*#__PURE__*/_interopNamespace(sass);
15
32
  var rgbHex__default = /*#__PURE__*/_interopDefaultLegacy(rgbHex);
16
33
  var shortHexColor__default = /*#__PURE__*/_interopDefaultLegacy(shortHexColor);
17
34
  var isPlainObject__default = /*#__PURE__*/_interopDefaultLegacy(isPlainObject);
18
35
  var parseColor__default = /*#__PURE__*/_interopDefaultLegacy(parseColor);
19
36
  var parseUnit__default = /*#__PURE__*/_interopDefaultLegacy(parseUnit);
20
37
 
21
- /**
22
- * @typedef {object} Options
23
- * @property {number} precision Number of digits after the decimal.
24
- */
25
-
26
38
  /**
27
39
  * @typedef {import('../index').JsonValue} JsonValue
28
40
  * @typedef {import('../index').JsonObject} JsonObject
@@ -30,77 +42,73 @@ var parseUnit__default = /*#__PURE__*/_interopDefaultLegacy(parseUnit);
30
42
  */
31
43
 
32
44
  /**
33
- * @param {sass.LegacyValue|undefined} value
34
- * @param {Options} options
45
+ * @param {sass.Value|undefined} value
35
46
  */
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;
47
+ function getJsonValueFromSassValue(value) {
48
+ let resolvedValue;
49
+ if (value instanceof sass__namespace.SassList) {
50
+ resolvedValue = listToArray(value);
51
+ } else if (value instanceof sass__namespace.SassMap) {
52
+ resolvedValue = mapToObject(value);
53
+ } else if (value instanceof sass__namespace.SassColor) {
54
+ /** @type {[number, number, number]} */
55
+ const rgbValue = [value.red, value.green, value.blue];
56
+ const alphaValue = value.alpha;
57
+ if (alphaValue === 1) {
58
+ resolvedValue = shortHexColor__default["default"](`#${rgbHex__default["default"].apply(null, rgbValue)}`);
59
+ } else {
60
+ resolvedValue = `rgba(${rgbValue.join(',')},${alphaValue})`;
61
+ }
62
+ } else if (value instanceof sass__namespace.SassNumber) {
63
+ if (value.hasUnits) {
64
+ resolvedValue = String(value.value) + value.numeratorUnits.last();
65
+ } else {
66
+ resolvedValue = Number(value.value);
67
+ }
68
+ } else if (value instanceof sass__namespace.SassString) {
69
+ resolvedValue = String(value.text);
70
+ } else if (value instanceof sass__namespace.SassBoolean) {
71
+ resolvedValue = Boolean(value.value);
72
+ } else {
73
+ resolvedValue = null;
74
+ }
75
+ return resolvedValue;
72
76
  }
73
77
 
74
78
  /**
75
- * @param {sass.types.List} list
76
- * @param {Options} options
79
+ * @param {sass.SassList} list
77
80
  */
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;
81
+ function listToArray(list) {
82
+ const length = list.asList.size;
83
+ /** @type {JsonArray} */
84
+ const data = [];
85
+ for (const index of Array.from({
86
+ length
87
+ }).keys()) {
88
+ const value = getJsonValueFromSassValue(list.get(index));
89
+ data.push(value);
90
+ }
91
+ return data;
87
92
  }
88
93
 
89
94
  /**
90
- * @param {sass.types.Map} map
91
- * @param {Options} options
95
+ * @param {sass.SassMap} map
92
96
  */
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;
97
+ function mapToObject(map) {
98
+ const length = map.contents.size;
99
+ /** @type {JsonObject} */
100
+ const data = {};
101
+ for (const index of Array.from({
102
+ length
103
+ }).keys()) {
104
+ const resolvedValue = map.get(index);
105
+ if (typeof resolvedValue !== 'undefined') {
106
+ const key = String(resolvedValue.get(0));
107
+ const value = getJsonValueFromSassValue(resolvedValue.get(1));
108
+ data[key] = value;
109
+ }
110
+ }
111
+ return data;
104
112
  }
105
113
 
106
114
  /**
@@ -115,87 +123,92 @@ const unitTypes = ['length', 'angle', 'resolution', 'frequency', 'time'];
115
123
  * @param {string} value
116
124
  */
117
125
  function isColor(value) {
118
- return typeof parseColor__default["default"](value).rgba !== 'undefined';
126
+ return typeof parseColor__default["default"](value).rgba !== 'undefined';
119
127
  }
120
128
 
121
129
  /**
122
130
  * @param {string} value
123
131
  */
124
132
  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;
133
+ let resolvedValue;
134
+ try {
135
+ const {
136
+ value: parsedValue,
137
+ unit,
138
+ type
139
+ } = parseUnit__default["default"](value);
140
+ if (unitTypes.includes(type)) {
141
+ resolvedValue = new sass__namespace.SassNumber(parsedValue, unit);
142
+ } else if (type === 'percentage') {
143
+ resolvedValue = new sass__namespace.SassNumber(parsedValue, '%');
144
+ } else {
145
+ resolvedValue = new sass__namespace.SassString(value);
146
+ }
147
+ } catch (error) {
148
+ resolvedValue = new sass__namespace.SassString(value);
149
+ }
150
+ return resolvedValue;
139
151
  }
140
152
 
141
153
  /**
142
154
  * @param {string} value
143
155
  */
144
156
  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);
157
+ const [red, green, blue, alpha] = parseColor__default["default"](value).rgba;
158
+ return new sass__namespace.SassColor({
159
+ red,
160
+ green,
161
+ blue,
162
+ alpha
163
+ });
147
164
  }
148
165
 
149
166
  /**
150
167
  * @param {JsonValue} value
151
168
  */
152
169
  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;
170
+ let resolvedValue;
171
+ if (Array.isArray(value)) {
172
+ resolvedValue = arrayToList(value);
173
+ } else if (isPlainObject__default["default"](value)) {
174
+ resolvedValue = objectToMap(value);
175
+ } else if (isColor(String(value))) {
176
+ resolvedValue = parseValueToColor(String(value));
177
+ } else if (typeof value === 'string') {
178
+ resolvedValue = parseValueToStringOrNumber(value);
179
+ } else if (typeof value === 'number') {
180
+ resolvedValue = new sass__namespace.SassNumber(value);
181
+ } else if (typeof value === 'boolean') {
182
+ resolvedValue = value ? sass__namespace.sassTrue : sass__namespace.sassFalse;
183
+ } else {
184
+ resolvedValue = sass__namespace.sassNull;
185
+ }
186
+ return resolvedValue;
172
187
  }
173
188
 
174
189
  /**
175
190
  * @param {JsonArray} array
176
191
  */
177
192
  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;
193
+ /** @type {sass.Value[]} */
194
+ const data = [];
195
+ for (const item of array) {
196
+ data.push(setJsonValueToSassValue(item));
197
+ }
198
+ return new sass__namespace.SassList(data);
184
199
  }
185
200
 
186
201
  /**
187
202
  * @param {JsonObject} object
188
203
  */
189
204
  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;
205
+ /** @type {[sass.Value, sass.Value][]} */
206
+ const data = [];
207
+ for (const [property, value = null] of Object.entries(object)) {
208
+ data.push([setJsonValueToSassValue(property), setJsonValueToSassValue(value)]);
209
+ }
210
+ // eslint-disable-next-line new-cap
211
+ return new sass__namespace.SassMap(immutable.OrderedMap(data));
199
212
  }
200
213
 
201
214
  /**
@@ -208,41 +221,47 @@ function objectToMap(object) {
208
221
  /**
209
222
  * 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
223
  *
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.
224
+ * First argument: `sass.Value` - Data to encode (stringify).
225
+ *
226
+ * Second argument: `sass.SassBoolean` - Should output string be quoted with single quotes.
227
+ *
228
+ * @param {sass.Value[]} encodeArguments
214
229
  */
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);
230
+ function encode(encodeArguments) {
231
+ const [data, quotes_] = encodeArguments;
232
+ const quotes = quotes_.assertBoolean('quotes');
233
+ const shouldQuote = quotes.value;
234
+ let resolvedValue = JSON.stringify(getJsonValueFromSassValue(data));
235
+ if (shouldQuote) {
236
+ resolvedValue = `'${resolvedValue}'`;
237
+ }
238
+ return new sass__namespace.SassString(resolvedValue);
224
239
  }
225
240
 
226
241
  /**
227
242
  * Decodes (`JSON.parse`) string and returns one of available Sass types.
228
243
  *
229
- * @param {sass.types.String} value String to decode (parse).
244
+ * First argument: `sass.SassString` - String to decode (parse).
245
+ *
246
+ * @param {sass.Value[]} decodeArguments
230
247
  */
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);
248
+ function decode(decodeArguments) {
249
+ const [string_] = decodeArguments;
250
+ const string = string_.assertString('string');
251
+ /** @type {JsonValue?} */
252
+ let resolvedValue = {};
253
+ try {
254
+ resolvedValue = JSON.parse(string.text);
255
+ } catch (error) {
256
+ resolvedValue = null;
257
+ }
258
+ return setJsonValueToSassValue(resolvedValue);
240
259
  }
241
260
 
242
- /** @type {{ 'json-encode($value, $quotes: true, $precision: 5)': typeof encode, 'json-decode($value)': typeof decode }} */
261
+ /** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
243
262
  const api = {
244
- 'json-encode($value, $quotes: true, $precision: 5)': encode,
245
- 'json-decode($value)': decode
263
+ 'json-encode($data, $quotes: true)': encode,
264
+ 'json-decode($string)': decode
246
265
  };
247
266
 
248
267
  module.exports = api;