.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / strip-json-comments / index.js
diff --git a/.config/coc/extensions/node_modules/coc-prettier/node_modules/strip-json-comments/index.js b/.config/coc/extensions/node_modules/coc-prettier/node_modules/strip-json-comments/index.js
new file mode 100644 (file)
index 0000000..bb00b38
--- /dev/null
@@ -0,0 +1,77 @@
+'use strict';
+const singleComment = Symbol('singleComment');
+const multiComment = Symbol('multiComment');
+const stripWithoutWhitespace = () => '';
+const stripWithWhitespace = (string, start, end) => string.slice(start, end).replace(/\S/g, ' ');
+
+const isEscaped = (jsonString, quotePosition) => {
+       let index = quotePosition - 1;
+       let backslashCount = 0;
+
+       while (jsonString[index] === '\\') {
+               index -= 1;
+               backslashCount += 1;
+       }
+
+       return Boolean(backslashCount % 2);
+};
+
+module.exports = (jsonString, options = {}) => {
+       if (typeof jsonString !== 'string') {
+               throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``);
+       }
+
+       const strip = options.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;
+
+       let insideString = false;
+       let insideComment = false;
+       let offset = 0;
+       let result = '';
+
+       for (let i = 0; i < jsonString.length; i++) {
+               const currentCharacter = jsonString[i];
+               const nextCharacter = jsonString[i + 1];
+
+               if (!insideComment && currentCharacter === '"') {
+                       const escaped = isEscaped(jsonString, i);
+                       if (!escaped) {
+                               insideString = !insideString;
+                       }
+               }
+
+               if (insideString) {
+                       continue;
+               }
+
+               if (!insideComment && currentCharacter + nextCharacter === '//') {
+                       result += jsonString.slice(offset, i);
+                       offset = i;
+                       insideComment = singleComment;
+                       i++;
+               } else if (insideComment === singleComment && currentCharacter + nextCharacter === '\r\n') {
+                       i++;
+                       insideComment = false;
+                       result += strip(jsonString, offset, i);
+                       offset = i;
+                       continue;
+               } else if (insideComment === singleComment && currentCharacter === '\n') {
+                       insideComment = false;
+                       result += strip(jsonString, offset, i);
+                       offset = i;
+               } else if (!insideComment && currentCharacter + nextCharacter === '/*') {
+                       result += jsonString.slice(offset, i);
+                       offset = i;
+                       insideComment = multiComment;
+                       i++;
+                       continue;
+               } else if (insideComment === multiComment && currentCharacter + nextCharacter === '*/') {
+                       i++;
+                       insideComment = false;
+                       result += strip(jsonString, offset, i + 1);
+                       offset = i + 1;
+                       continue;
+               }
+       }
+
+       return result + (insideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset));
+};