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 +31 -4
- package/README.md +30 -28
- package/cjs/index.d.ts +14 -13
- package/cjs/index.d.ts.map +1 -1
- package/cjs/index.js +143 -134
- package/cjs/index.js.map +1 -1
- package/cjs/lib/json-to-sass.d.ts +1 -2
- package/cjs/lib/json-to-sass.d.ts.map +1 -1
- package/cjs/lib/sass-to-json.d.ts +3 -4
- package/cjs/lib/sass-to-json.d.ts.map +1 -1
- package/esm/index.d.ts +14 -13
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +143 -133
- package/esm/index.js.map +1 -1
- package/esm/lib/json-to-sass.d.ts +1 -2
- package/esm/lib/json-to-sass.d.ts.map +1 -1
- package/esm/lib/sass-to-json.d.ts +3 -4
- package/esm/lib/sass-to-json.d.ts.map +1 -1
- package/package.json +21 -19
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
|
-
|
|
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,
|
|
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,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
|
|
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
|
-
### json-decode(
|
|
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
|
-
-
|
|
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
|
-
####
|
|
152
|
+
#### string
|
|
154
153
|
|
|
155
|
-
Type: `sass.
|
|
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://
|
|
169
|
-
[sass-list]:
|
|
170
|
-
[sass-map]:
|
|
171
|
-
[sass-color]:
|
|
172
|
-
[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
|
|
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($
|
|
8
|
+
/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
|
|
10
9
|
declare const api: {
|
|
11
|
-
'json-encode($
|
|
12
|
-
'json-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
|
-
*
|
|
28
|
-
*
|
|
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(
|
|
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
|
-
*
|
|
32
|
+
* First argument: `sass.SassString` - String to decode (parse).
|
|
33
|
+
*
|
|
34
|
+
* @param {sass.Value[]} decodeArguments
|
|
35
35
|
*/
|
|
36
|
-
declare function decode(
|
|
36
|
+
declare function decode(decodeArguments: sass.Value[]): sass.Value;
|
|
37
|
+
import sass from "sass";
|
|
37
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":";
|
|
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 {
|
|
27
|
+
* @param {sass.Value|undefined} value
|
|
30
28
|
*/
|
|
31
29
|
function getJsonValueFromSassValue(value) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
} 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.
|
|
61
|
+
* @param {sass.SassList} list
|
|
70
62
|
*/
|
|
71
63
|
function listToArray(list) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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.
|
|
77
|
+
* @param {sass.SassMap} map
|
|
84
78
|
*/
|
|
85
79
|
function mapToObject(map) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
*
|
|
207
|
-
*
|
|
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(
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
*
|
|
226
|
+
* First argument: `sass.SassString` - String to decode (parse).
|
|
227
|
+
*
|
|
228
|
+
* @param {sass.Value[]} decodeArguments
|
|
222
229
|
*/
|
|
223
|
-
function decode(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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($
|
|
243
|
+
/** @type {{ 'json-encode($data, $quotes: true)': typeof encode, 'json-decode($string)': typeof decode }} */
|
|
235
244
|
const api = {
|
|
236
|
-
|
|
237
|
-
|
|
245
|
+
'json-encode($data, $quotes: true)': encode,
|
|
246
|
+
'json-decode($string)': decode
|
|
238
247
|
};
|
|
239
248
|
|
|
240
249
|
module.exports = api;
|