strip-json-comments
Advanced tools
Comparing version 4.0.0 to 5.0.0
export interface Options { | ||
/** | ||
Replace comments with whitespace instead of stripping them entirely. | ||
Strip trailing commas in addition to comments. | ||
@default true | ||
*/ | ||
readonly trailingCommas?: boolean; | ||
/** | ||
Replace comments and trailing commas with whitespace instead of stripping them entirely. | ||
@default true | ||
*/ | ||
readonly whitespace?: boolean; | ||
@@ -8,0 +15,0 @@ } |
44
index.js
@@ -19,3 +19,3 @@ const singleComment = Symbol('singleComment'); | ||
export default function stripJsonComments(jsonString, {whitespace = true} = {}) { | ||
export default function stripJsonComments(jsonString, {whitespace = true, trailingCommas = false} = {}) { | ||
if (typeof jsonString !== 'string') { | ||
@@ -30,3 +30,5 @@ throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``); | ||
let offset = 0; | ||
let buffer = ''; | ||
let result = ''; | ||
let commaIndex = -1; | ||
@@ -38,2 +40,3 @@ for (let index = 0; index < jsonString.length; index++) { | ||
if (!isInsideComment && currentCharacter === '"') { | ||
// Enter or exit string | ||
const escaped = isEscaped(jsonString, index); | ||
@@ -50,3 +53,4 @@ if (!escaped) { | ||
if (!isInsideComment && currentCharacter + nextCharacter === '//') { | ||
result += jsonString.slice(offset, index); | ||
// Enter single-line comment | ||
buffer += jsonString.slice(offset, index); | ||
offset = index; | ||
@@ -56,13 +60,16 @@ isInsideComment = singleComment; | ||
} else if (isInsideComment === singleComment && currentCharacter + nextCharacter === '\r\n') { | ||
// Exit single-line comment via \r\n | ||
index++; | ||
isInsideComment = false; | ||
result += strip(jsonString, offset, index); | ||
buffer += strip(jsonString, offset, index); | ||
offset = index; | ||
continue; | ||
} else if (isInsideComment === singleComment && currentCharacter === '\n') { | ||
// Exit single-line comment via \n | ||
isInsideComment = false; | ||
result += strip(jsonString, offset, index); | ||
buffer += strip(jsonString, offset, index); | ||
offset = index; | ||
} else if (!isInsideComment && currentCharacter + nextCharacter === '/*') { | ||
result += jsonString.slice(offset, index); | ||
// Enter multiline comment | ||
buffer += jsonString.slice(offset, index); | ||
offset = index; | ||
@@ -73,11 +80,34 @@ isInsideComment = multiComment; | ||
} else if (isInsideComment === multiComment && currentCharacter + nextCharacter === '*/') { | ||
// Exit multiline comment | ||
index++; | ||
isInsideComment = false; | ||
result += strip(jsonString, offset, index + 1); | ||
buffer += strip(jsonString, offset, index + 1); | ||
offset = index + 1; | ||
continue; | ||
} else if (trailingCommas && !isInsideComment) { | ||
if (commaIndex !== -1) { | ||
if (currentCharacter === '}' || currentCharacter === ']') { | ||
// Strip trailing comma | ||
buffer += jsonString.slice(offset, index); | ||
result += strip(buffer, 0, 1) + buffer.slice(1); | ||
buffer = ''; | ||
offset = index; | ||
commaIndex = -1; | ||
} else if (currentCharacter !== ' ' && currentCharacter !== '\t' && currentCharacter !== '\r' && currentCharacter !== '\n') { | ||
// Hit non-whitespace following a comma; comma is not trailing | ||
buffer += jsonString.slice(offset, index); | ||
offset = index; | ||
commaIndex = -1; | ||
} | ||
} else if (currentCharacter === ',') { | ||
// Flush buffer prior to this point, and save new comma index | ||
result += buffer + jsonString.slice(offset, index); | ||
buffer = ''; | ||
offset = index; | ||
commaIndex = index; | ||
} | ||
} | ||
} | ||
return result + (isInsideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset)); | ||
return result + buffer + (isInsideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset)); | ||
} |
{ | ||
"name": "strip-json-comments", | ||
"version": "4.0.0", | ||
"version": "5.0.0", | ||
"description": "Strip comments from JSON. Lets you use comments in your JSON files!", | ||
@@ -15,4 +15,5 @@ "license": "MIT", | ||
"exports": "./index.js", | ||
"types": "./index.d.ts", | ||
"engines": { | ||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0" | ||
"node": ">=14.16" | ||
}, | ||
@@ -45,7 +46,12 @@ "scripts": { | ||
"devDependencies": { | ||
"ava": "^3.15.0", | ||
"ava": "^4.3.1", | ||
"matcha": "^0.7.0", | ||
"tsd": "^0.17.0", | ||
"xo": "^0.44.0" | ||
"tsd": "^0.22.0", | ||
"xo": "^0.51.0" | ||
}, | ||
"xo": { | ||
"rules": { | ||
"complexity": "off" | ||
} | ||
} | ||
} |
@@ -20,5 +20,5 @@ # strip-json-comments | ||
```sh | ||
npm install strip-json-comments | ||
``` | ||
$ npm install strip-json-comments | ||
``` | ||
@@ -53,2 +53,9 @@ ## Usage | ||
##### trailingCommas | ||
Type: `boolean`\ | ||
Default: `false` | ||
Strip trailing commas in addition to comments. | ||
##### whitespace | ||
@@ -59,9 +66,9 @@ | ||
Replace comments with whitespace instead of stripping them entirely. | ||
Replace comments and trailing commas with whitespace instead of stripping them entirely. | ||
## Benchmark | ||
```sh | ||
npm run bench | ||
``` | ||
$ npm run bench | ||
``` | ||
@@ -68,0 +75,0 @@ ## Related |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
8460
127
88