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 +28 -2
- package/README.md +31 -36
- package/cjs/index.d.ts +14 -10
- package/cjs/index.d.ts.map +1 -1
- package/cjs/index.js +165 -146
- package/cjs/index.js.map +1 -1
- package/cjs/lib/json-to-sass.d.ts +2 -2
- package/cjs/lib/json-to-sass.d.ts.map +1 -1
- package/cjs/lib/sass-to-json.d.ts +3 -14
- package/cjs/lib/sass-to-json.d.ts.map +1 -1
- package/esm/index.d.ts +14 -10
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +147 -145
- package/esm/index.js.map +1 -1
- package/esm/lib/json-to-sass.d.ts +2 -2
- package/esm/lib/json-to-sass.d.ts.map +1 -1
- package/esm/lib/sass-to-json.d.ts +3 -14
- package/esm/lib/sass-to-json.d.ts.map +1 -1
- package/package.json +20 -17
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
|
-
|
|
45
|
-
|
|
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
|
-
|
|
20
|
-
{
|
|
21
|
-
file: './index.scss',
|
|
19
|
+
(async () => {
|
|
20
|
+
const result = await sass.compileAsync('./index.scss', {
|
|
22
21
|
functions: { ...jsonFns }
|
|
23
|
-
}
|
|
24
|
-
|
|
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.
|
|
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
|
|
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.
|
|
131
|
-
Default: `
|
|
128
|
+
Type: `sass.SassBoolean`
|
|
129
|
+
Default: `sass.sassTrue`
|
|
132
130
|
|
|
133
131
|
Should output string be quoted with single quotes.
|
|
134
132
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
Type: `sass.types.Number`
|
|
138
|
-
Default: `5`
|
|
139
|
-
|
|
140
|
-
Number of digits after the decimal.
|
|
133
|
+
### json-decode(string)
|
|
141
134
|
|
|
142
|
-
|
|
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
|
-
-
|
|
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
|
-
####
|
|
152
|
+
#### string
|
|
161
153
|
|
|
162
|
-
Type: `sass.
|
|
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://
|
|
176
|
-
[sass-list]:
|
|
177
|
-
[sass-map]:
|
|
178
|
-
[sass-color]:
|
|
179
|
-
[sass-
|
|
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($
|
|
8
|
+
/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
|
|
9
9
|
declare const api: {
|
|
10
|
-
'json-encode($
|
|
11
|
-
'json-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
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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(
|
|
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
|
-
*
|
|
32
|
+
* First argument: `sass.SassString` - String to decode (parse).
|
|
33
|
+
*
|
|
34
|
+
* @param {sass.Value[]} decodeArguments
|
|
31
35
|
*/
|
|
32
|
-
declare function decode(
|
|
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
|
package/cjs/index.d.ts.map
CHANGED
|
@@ -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;;;;
|
|
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
|
-
|
|
14
|
-
|
|
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.
|
|
34
|
-
* @param {Options} options
|
|
45
|
+
* @param {sass.Value|undefined} value
|
|
35
46
|
*/
|
|
36
|
-
function getJsonValueFromSassValue(value
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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.
|
|
76
|
-
* @param {Options} options
|
|
79
|
+
* @param {sass.SassList} list
|
|
77
80
|
*/
|
|
78
|
-
function listToArray(list
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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.
|
|
91
|
-
* @param {Options} options
|
|
95
|
+
* @param {sass.SassMap} map
|
|
92
96
|
*/
|
|
93
|
-
function mapToObject(map
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
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(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
*
|
|
244
|
+
* First argument: `sass.SassString` - String to decode (parse).
|
|
245
|
+
*
|
|
246
|
+
* @param {sass.Value[]} decodeArguments
|
|
230
247
|
*/
|
|
231
|
-
function decode(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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($
|
|
261
|
+
/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
|
|
243
262
|
const api = {
|
|
244
|
-
|
|
245
|
-
|
|
263
|
+
'json-encode($data, $quotes: true)': encode,
|
|
264
|
+
'json-decode($string)': decode
|
|
246
265
|
};
|
|
247
266
|
|
|
248
267
|
module.exports = api;
|