@bhsd/common 1.3.0 → 1.4.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/dist/index.d.ts +5 -0
- package/dist/index.js +24 -18
- package/dist/index.mjs +65 -17
- package/dist/json_parse.js +60 -6
- package/package.json +13 -13
package/dist/index.d.ts
CHANGED
|
@@ -61,4 +61,9 @@ export declare const lintJSONNative: (str: string, force?: boolean) => JsonError
|
|
|
61
61
|
* @param str JSON字符串
|
|
62
62
|
*/
|
|
63
63
|
export declare const lintJSON: (str: string) => JsonError[];
|
|
64
|
+
/**
|
|
65
|
+
* 诊断JSONC字符串中的语法错误
|
|
66
|
+
* @param str JSONC字符串
|
|
67
|
+
*/
|
|
68
|
+
export declare const lintJSONC: (str: string) => JsonError[];
|
|
64
69
|
export {};
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.lintJSON = exports.lintJSONNative = exports.splitLines = exports.getObjRegex = exports.sanitizeInlineStyle = exports.splitColors = exports.numToHex = exports.rawurldecode = exports.wmf = void 0;
|
|
3
|
+
exports.lintJSONC = exports.lintJSON = exports.lintJSONNative = exports.splitLines = exports.getObjRegex = exports.sanitizeInlineStyle = exports.splitColors = exports.numToHex = exports.rawurldecode = exports.wmf = void 0;
|
|
4
4
|
exports.getRegex = getRegex;
|
|
5
5
|
const json_parse_js_1 = require("./json_parse.js");
|
|
6
6
|
exports.wmf = 'wiktionary|wiki(?:pedia|books|news|quote|source|versity|voyage)';
|
|
@@ -51,7 +51,8 @@ exports.splitColors = splitColors;
|
|
|
51
51
|
* 清理内联样式中的`{`和`}`
|
|
52
52
|
* @param style 内联样式
|
|
53
53
|
*/
|
|
54
|
-
const sanitizeInlineStyle = (style) => style.replace(/[{}]/gu, p => p === '{' ? '{' : '}')
|
|
54
|
+
const sanitizeInlineStyle = (style) => style.replace(/[{}]/gu, p => p === '{' ? '{' : '}')
|
|
55
|
+
.replace(/^[\s;]+/u, p => p.replace(/;/gu, ' '));
|
|
55
56
|
exports.sanitizeInlineStyle = sanitizeInlineStyle;
|
|
56
57
|
function getRegex(f) {
|
|
57
58
|
const map = new Map(), weakMap = new WeakMap();
|
|
@@ -141,17 +142,9 @@ const lintJSONNative = (str, force) => {
|
|
|
141
142
|
return [];
|
|
142
143
|
};
|
|
143
144
|
exports.lintJSONNative = lintJSONNative;
|
|
144
|
-
|
|
145
|
-
* 诊断JSON字符串中的语法错误
|
|
146
|
-
* @param str JSON字符串
|
|
147
|
-
*/
|
|
148
|
-
const lintJSON = (str) => {
|
|
149
|
-
if (!str.trim()) {
|
|
150
|
-
return [];
|
|
151
|
-
}
|
|
152
|
-
let errors;
|
|
145
|
+
const lintJSONBase = (str, parse) => {
|
|
153
146
|
try {
|
|
154
|
-
(
|
|
147
|
+
parse(str);
|
|
155
148
|
}
|
|
156
149
|
catch (e) {
|
|
157
150
|
if (!(e instanceof Error)) {
|
|
@@ -159,13 +152,26 @@ const lintJSON = (str) => {
|
|
|
159
152
|
if (error.message) {
|
|
160
153
|
warnings.push(error);
|
|
161
154
|
}
|
|
162
|
-
|
|
163
|
-
if (error.message) {
|
|
164
|
-
return errors;
|
|
165
|
-
}
|
|
155
|
+
return formatJsonError(str, warnings);
|
|
166
156
|
}
|
|
167
157
|
}
|
|
168
|
-
|
|
169
|
-
|
|
158
|
+
return [];
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* 诊断JSON字符串中的语法错误
|
|
162
|
+
* @param str JSON字符串
|
|
163
|
+
*/
|
|
164
|
+
const lintJSON = (str) => {
|
|
165
|
+
if (!str.trim()) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
const errors = lintJSONBase(str, json_parse_js_1.json_parse);
|
|
169
|
+
return errors[errors.length - 1]?.severity === 'error' ? errors : [...errors, ...(0, exports.lintJSONNative)(str)];
|
|
170
170
|
};
|
|
171
171
|
exports.lintJSON = lintJSON;
|
|
172
|
+
/**
|
|
173
|
+
* 诊断JSONC字符串中的语法错误
|
|
174
|
+
* @param str JSONC字符串
|
|
175
|
+
*/
|
|
176
|
+
const lintJSONC = (str) => str.trim() ? lintJSONBase(str, json_parse_js_1.jsonc_parse) : [];
|
|
177
|
+
exports.lintJSONC = lintJSONC;
|
package/dist/index.mjs
CHANGED
|
@@ -16,7 +16,7 @@ var stringify = (c) => {
|
|
|
16
16
|
}
|
|
17
17
|
return c === '"' ? `'"'` : JSON.stringify(c);
|
|
18
18
|
};
|
|
19
|
-
var
|
|
19
|
+
var factory = (jsonc) => {
|
|
20
20
|
let at;
|
|
21
21
|
let ch;
|
|
22
22
|
let text;
|
|
@@ -152,8 +152,33 @@ var json_parse = /* @__PURE__ */ (() => {
|
|
|
152
152
|
return error("Unterminated string");
|
|
153
153
|
};
|
|
154
154
|
const white = () => {
|
|
155
|
-
while (ch
|
|
156
|
-
|
|
155
|
+
while (ch) {
|
|
156
|
+
while (ch && spaces.has(ch)) {
|
|
157
|
+
next();
|
|
158
|
+
}
|
|
159
|
+
if (jsonc && ch === "/") {
|
|
160
|
+
const peek = text.charAt(at);
|
|
161
|
+
if (peek === "/") {
|
|
162
|
+
next();
|
|
163
|
+
next();
|
|
164
|
+
while (ch && ch !== "\n" && ch !== "\r") {
|
|
165
|
+
next();
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
} else if (peek === "*") {
|
|
169
|
+
next();
|
|
170
|
+
next();
|
|
171
|
+
while (ch && !(ch === "*" && text.charAt(at) === "/")) {
|
|
172
|
+
next();
|
|
173
|
+
}
|
|
174
|
+
if (ch === "*") {
|
|
175
|
+
next();
|
|
176
|
+
next();
|
|
177
|
+
}
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
157
182
|
}
|
|
158
183
|
};
|
|
159
184
|
const word = () => {
|
|
@@ -187,10 +212,19 @@ var json_parse = /* @__PURE__ */ (() => {
|
|
|
187
212
|
if (ch === "]") {
|
|
188
213
|
next();
|
|
189
214
|
return;
|
|
215
|
+
} else if (jsonc && ch === ",") {
|
|
216
|
+
next();
|
|
217
|
+
white();
|
|
218
|
+
next("]");
|
|
219
|
+
return;
|
|
190
220
|
}
|
|
191
221
|
let from;
|
|
192
222
|
while (ch) {
|
|
193
223
|
if (ch === "]") {
|
|
224
|
+
if (jsonc) {
|
|
225
|
+
next();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
194
228
|
error("Trailing comma in array", from, from + 1);
|
|
195
229
|
}
|
|
196
230
|
value();
|
|
@@ -215,10 +249,19 @@ var json_parse = /* @__PURE__ */ (() => {
|
|
|
215
249
|
if (ch === "}") {
|
|
216
250
|
next();
|
|
217
251
|
return;
|
|
252
|
+
} else if (jsonc && ch === ",") {
|
|
253
|
+
next();
|
|
254
|
+
white();
|
|
255
|
+
next("}");
|
|
256
|
+
return;
|
|
218
257
|
}
|
|
219
258
|
let from;
|
|
220
259
|
while (ch) {
|
|
221
260
|
if (ch === "}") {
|
|
261
|
+
if (jsonc) {
|
|
262
|
+
next();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
222
265
|
error("Trailing comma in object", from, from + 1);
|
|
223
266
|
}
|
|
224
267
|
from = at;
|
|
@@ -249,6 +292,8 @@ var json_parse = /* @__PURE__ */ (() => {
|
|
|
249
292
|
const value = () => {
|
|
250
293
|
white();
|
|
251
294
|
switch (ch) {
|
|
295
|
+
case "":
|
|
296
|
+
return void 0;
|
|
252
297
|
case "{":
|
|
253
298
|
return object();
|
|
254
299
|
case "[":
|
|
@@ -274,7 +319,9 @@ var json_parse = /* @__PURE__ */ (() => {
|
|
|
274
319
|
throw { warnings };
|
|
275
320
|
}
|
|
276
321
|
};
|
|
277
|
-
}
|
|
322
|
+
};
|
|
323
|
+
var json_parse = /* @__PURE__ */ factory();
|
|
324
|
+
var jsonc_parse = /* @__PURE__ */ factory(true);
|
|
278
325
|
|
|
279
326
|
// src/index.ts
|
|
280
327
|
var wmf = "wiktionary|wiki(?:pedia|books|news|quote|source|versity|voyage)";
|
|
@@ -305,7 +352,7 @@ var splitColors = (str, hsl = true) => {
|
|
|
305
352
|
}
|
|
306
353
|
return pieces;
|
|
307
354
|
};
|
|
308
|
-
var sanitizeInlineStyle = (style) => style.replace(/[{}]/gu, (p) => p === "{" ? "{" : "}");
|
|
355
|
+
var sanitizeInlineStyle = (style) => style.replace(/[{}]/gu, (p) => p === "{" ? "{" : "}").replace(/^[\s;]+/u, (p) => p.replace(/;/gu, " "));
|
|
309
356
|
function getRegex(f) {
|
|
310
357
|
const map = /* @__PURE__ */ new Map(), weakMap = /* @__PURE__ */ new WeakMap();
|
|
311
358
|
return (s) => {
|
|
@@ -375,32 +422,33 @@ var lintJSONNative = (str, force) => {
|
|
|
375
422
|
}
|
|
376
423
|
return [];
|
|
377
424
|
};
|
|
378
|
-
var
|
|
379
|
-
if (!str.trim()) {
|
|
380
|
-
return [];
|
|
381
|
-
}
|
|
382
|
-
let errors;
|
|
425
|
+
var lintJSONBase = (str, parse) => {
|
|
383
426
|
try {
|
|
384
|
-
|
|
427
|
+
parse(str);
|
|
385
428
|
} catch (e) {
|
|
386
429
|
if (!(e instanceof Error)) {
|
|
387
430
|
const { warnings, ...error } = e;
|
|
388
431
|
if (error.message) {
|
|
389
432
|
warnings.push(error);
|
|
390
433
|
}
|
|
391
|
-
|
|
392
|
-
if (error.message) {
|
|
393
|
-
return errors;
|
|
394
|
-
}
|
|
434
|
+
return formatJsonError(str, warnings);
|
|
395
435
|
}
|
|
396
436
|
}
|
|
397
|
-
|
|
398
|
-
|
|
437
|
+
return [];
|
|
438
|
+
};
|
|
439
|
+
var lintJSON = (str) => {
|
|
440
|
+
if (!str.trim()) {
|
|
441
|
+
return [];
|
|
442
|
+
}
|
|
443
|
+
const errors = lintJSONBase(str, json_parse);
|
|
444
|
+
return errors[errors.length - 1]?.severity === "error" ? errors : [...errors, ...lintJSONNative(str)];
|
|
399
445
|
};
|
|
446
|
+
var lintJSONC = (str) => str.trim() ? lintJSONBase(str, jsonc_parse) : [];
|
|
400
447
|
export {
|
|
401
448
|
getObjRegex,
|
|
402
449
|
getRegex,
|
|
403
450
|
lintJSON,
|
|
451
|
+
lintJSONC,
|
|
404
452
|
lintJSONNative,
|
|
405
453
|
numToHex,
|
|
406
454
|
rawurldecode,
|
package/dist/json_parse.js
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO NOT CONTROL.
|
|
29
29
|
*/
|
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.json_parse = void 0;
|
|
31
|
+
exports.jsonc_parse = exports.json_parse = void 0;
|
|
32
32
|
const escapee = {
|
|
33
33
|
'"': '"',
|
|
34
34
|
"\\": "\\",
|
|
@@ -46,7 +46,7 @@ const stringify = (c) => {
|
|
|
46
46
|
}
|
|
47
47
|
return c === '"' ? `'"'` : JSON.stringify(c);
|
|
48
48
|
};
|
|
49
|
-
|
|
49
|
+
const factory = (jsonc) => {
|
|
50
50
|
// This is a function that can parse a JSON text.
|
|
51
51
|
// It is a simple, recursive descent parser.
|
|
52
52
|
// It does not use eval or regular expressions,
|
|
@@ -203,9 +203,40 @@ exports.json_parse = (() => {
|
|
|
203
203
|
return error("Unterminated string");
|
|
204
204
|
};
|
|
205
205
|
const white = () => {
|
|
206
|
-
// Skip whitespace.
|
|
207
|
-
while (ch
|
|
208
|
-
|
|
206
|
+
// Skip whitespace and comments (JSONC).
|
|
207
|
+
while (ch) {
|
|
208
|
+
// Skip whitespace.
|
|
209
|
+
while (ch && spaces.has(ch)) {
|
|
210
|
+
next();
|
|
211
|
+
}
|
|
212
|
+
if (jsonc && ch === "/") {
|
|
213
|
+
const peek = text.charAt(at);
|
|
214
|
+
if (peek === "/") {
|
|
215
|
+
// Skip single-line comments.
|
|
216
|
+
next(); // skip /
|
|
217
|
+
next(); // skip /
|
|
218
|
+
// @ts-expect-error `ch` modified
|
|
219
|
+
while (ch && ch !== "\n" && ch !== "\r") {
|
|
220
|
+
next();
|
|
221
|
+
}
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
else if (peek === "*") {
|
|
225
|
+
// Skip multi-line comments.
|
|
226
|
+
next(); // skip /
|
|
227
|
+
next(); // skip *
|
|
228
|
+
// @ts-expect-error `ch` modified
|
|
229
|
+
while (ch && !(ch === "*" && text.charAt(at) === "/")) {
|
|
230
|
+
next();
|
|
231
|
+
}
|
|
232
|
+
if (ch === "*") {
|
|
233
|
+
next(); // skip *
|
|
234
|
+
next(); // skip /
|
|
235
|
+
}
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
break;
|
|
209
240
|
}
|
|
210
241
|
};
|
|
211
242
|
const word = () => {
|
|
@@ -242,9 +273,19 @@ exports.json_parse = (() => {
|
|
|
242
273
|
next();
|
|
243
274
|
return; // empty array
|
|
244
275
|
}
|
|
276
|
+
else if (jsonc && ch === ",") {
|
|
277
|
+
next();
|
|
278
|
+
white();
|
|
279
|
+
next("]");
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
245
282
|
let from;
|
|
246
283
|
while (ch) {
|
|
247
284
|
if (ch === "]") {
|
|
285
|
+
if (jsonc) {
|
|
286
|
+
next();
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
248
289
|
error("Trailing comma in array", from, from + 1);
|
|
249
290
|
}
|
|
250
291
|
value();
|
|
@@ -273,9 +314,19 @@ exports.json_parse = (() => {
|
|
|
273
314
|
next();
|
|
274
315
|
return; // empty object
|
|
275
316
|
}
|
|
317
|
+
else if (jsonc && ch === ",") {
|
|
318
|
+
next();
|
|
319
|
+
white();
|
|
320
|
+
next("}");
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
276
323
|
let from;
|
|
277
324
|
while (ch) {
|
|
278
325
|
if (ch === "}") {
|
|
326
|
+
if (jsonc) {
|
|
327
|
+
next();
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
279
330
|
error("Trailing comma in object", from, from + 1);
|
|
280
331
|
}
|
|
281
332
|
from = at;
|
|
@@ -311,6 +362,8 @@ exports.json_parse = (() => {
|
|
|
311
362
|
// or a word.
|
|
312
363
|
white();
|
|
313
364
|
switch (ch) {
|
|
365
|
+
case "":
|
|
366
|
+
return undefined;
|
|
314
367
|
case "{":
|
|
315
368
|
return object();
|
|
316
369
|
case "[":
|
|
@@ -341,4 +394,5 @@ exports.json_parse = (() => {
|
|
|
341
394
|
throw { warnings };
|
|
342
395
|
}
|
|
343
396
|
};
|
|
344
|
-
}
|
|
397
|
+
};
|
|
398
|
+
exports.json_parse = factory(), exports.jsonc_parse = factory(true);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bhsd/common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"homepage": "https://github.com/bhsd-harry/common#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/bhsd-harry/common/issues"
|
|
@@ -29,24 +29,24 @@
|
|
|
29
29
|
"test": "mocha"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@bhsd/code-standard": "^1.
|
|
33
|
-
"@stylistic/eslint-plugin": "^5.
|
|
32
|
+
"@bhsd/code-standard": "^2.1.1",
|
|
33
|
+
"@stylistic/eslint-plugin": "^5.10.0",
|
|
34
34
|
"@types/mocha": "^10.0.10",
|
|
35
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
36
|
-
"@typescript-eslint/parser": "^8.
|
|
37
|
-
"esbuild": "^0.
|
|
38
|
-
"eslint": "^9.39.
|
|
39
|
-
"eslint-plugin-es-x": "^9.
|
|
35
|
+
"@typescript-eslint/eslint-plugin": "^8.57.0",
|
|
36
|
+
"@typescript-eslint/parser": "^8.57.0",
|
|
37
|
+
"esbuild": "^0.27.4",
|
|
38
|
+
"eslint": "^9.39.4",
|
|
39
|
+
"eslint-plugin-es-x": "^9.5.0",
|
|
40
40
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
41
|
-
"eslint-plugin-jsdoc": "^
|
|
42
|
-
"eslint-plugin-jsonc": "^
|
|
41
|
+
"eslint-plugin-jsdoc": "^62.7.1",
|
|
42
|
+
"eslint-plugin-jsonc": "^3.1.1",
|
|
43
43
|
"eslint-plugin-promise": "^7.2.1",
|
|
44
|
-
"eslint-plugin-regexp": "^
|
|
45
|
-
"eslint-plugin-unicorn": "^
|
|
44
|
+
"eslint-plugin-regexp": "^3.1.0",
|
|
45
|
+
"eslint-plugin-unicorn": "^63.0.0",
|
|
46
46
|
"mocha": "^11.7.5",
|
|
47
47
|
"typescript": "^5.9.3"
|
|
48
48
|
},
|
|
49
49
|
"engines": {
|
|
50
|
-
"node": ">=
|
|
50
|
+
"node": ">=20.19.0"
|
|
51
51
|
}
|
|
52
52
|
}
|