summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/@tufjs/canonical-json/lib/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/@tufjs/canonical-json/lib/index.js')
-rw-r--r--deps/npm/node_modules/@tufjs/canonical-json/lib/index.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/deps/npm/node_modules/@tufjs/canonical-json/lib/index.js b/deps/npm/node_modules/@tufjs/canonical-json/lib/index.js
new file mode 100644
index 0000000000..d480696de1
--- /dev/null
+++ b/deps/npm/node_modules/@tufjs/canonical-json/lib/index.js
@@ -0,0 +1,64 @@
+const COMMA = ',';
+const COLON = ':';
+const LEFT_SQUARE_BRACKET = '[';
+const RIGHT_SQUARE_BRACKET = ']';
+const LEFT_CURLY_BRACKET = '{';
+const RIGHT_CURLY_BRACKET = '}';
+
+// Recursively encodes the supplied object according to the canonical JSON form
+// as specified at http://wiki.laptop.org/go/Canonical_JSON. It's a restricted
+// dialect of JSON in which keys are lexically sorted, floats are not allowed,
+// and only double quotes and backslashes are escaped.
+function canonicalize(object) {
+ const buffer = [];
+ if (typeof object === 'string') {
+ buffer.push(canonicalizeString(object));
+ } else if (typeof object === 'boolean') {
+ buffer.push(JSON.stringify(object));
+ } else if (Number.isInteger(object)) {
+ buffer.push(JSON.stringify(object));
+ } else if (object === null) {
+ buffer.push(JSON.stringify(object));
+ } else if (Array.isArray(object)) {
+ buffer.push(LEFT_SQUARE_BRACKET);
+ let first = true;
+ object.forEach((element) => {
+ if (!first) {
+ buffer.push(COMMA);
+ }
+ first = false;
+ buffer.push(canonicalize(element));
+ });
+ buffer.push(RIGHT_SQUARE_BRACKET);
+ } else if (typeof object === 'object') {
+ buffer.push(LEFT_CURLY_BRACKET);
+ let first = true;
+ Object.keys(object)
+ .sort()
+ .forEach((property) => {
+ if (!first) {
+ buffer.push(COMMA);
+ }
+ first = false;
+ buffer.push(canonicalizeString(property));
+ buffer.push(COLON);
+ buffer.push(canonicalize(object[property]));
+ });
+ buffer.push(RIGHT_CURLY_BRACKET);
+ } else {
+ throw new TypeError('cannot encode ' + object.toString());
+ }
+
+ return buffer.join('');
+}
+
+// String canonicalization consists of escaping backslash (\) and double
+// quote (") characters and wrapping the resulting string in double quotes.
+function canonicalizeString(string) {
+ const escapedString = string.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
+ return '"' + escapedString + '"';
+}
+
+module.exports = {
+ canonicalize,
+};