hbsig 0.0.1
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/cjs/bin_to_str.js +44 -0
- package/cjs/collect-body-keys.js +470 -0
- package/cjs/encode-array-item.js +110 -0
- package/cjs/encode-utils.js +236 -0
- package/cjs/encode.js +1318 -0
- package/cjs/erl_json.js +317 -0
- package/cjs/erl_str.js +1037 -0
- package/cjs/flat.js +222 -0
- package/cjs/http-message-signatures/httpbis.js +489 -0
- package/cjs/http-message-signatures/index.js +25 -0
- package/cjs/http-message-signatures/structured-header.js +129 -0
- package/cjs/httpsig.js +716 -0
- package/cjs/httpsig2.js +1160 -0
- package/cjs/id.js +470 -0
- package/cjs/index.js +63 -0
- package/cjs/send.js +194 -0
- package/cjs/signer-utils.js +617 -0
- package/cjs/signer.js +606 -0
- package/cjs/structured.js +296 -0
- package/cjs/test.js +27 -0
- package/cjs/utils.js +42 -0
- package/esm/bin_to_str.js +46 -0
- package/esm/collect-body-keys.js +436 -0
- package/esm/encode-array-item.js +112 -0
- package/esm/encode-utils.js +185 -0
- package/esm/encode.js +1219 -0
- package/esm/erl_json.js +289 -0
- package/esm/erl_str.js +1139 -0
- package/esm/flat.js +196 -0
- package/esm/http-message-signatures/httpbis.js +438 -0
- package/esm/http-message-signatures/index.js +4 -0
- package/esm/http-message-signatures/structured-header.js +105 -0
- package/esm/httpsig.js +658 -0
- package/esm/httpsig2.js +1097 -0
- package/esm/id.js +459 -0
- package/esm/index.js +4 -0
- package/esm/package.json +3 -0
- package/esm/send.js +124 -0
- package/esm/signer-utils.js +494 -0
- package/esm/signer.js +452 -0
- package/esm/structured.js +269 -0
- package/esm/test.js +6 -0
- package/esm/utils.js +28 -0
- package/package.json +28 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = bin_to_str;
|
|
7
|
+
/**
|
|
8
|
+
* Convert a Buffer to string if it contains valid UTF-8 text
|
|
9
|
+
* @param {Buffer} buffer - Buffer to check and potentially convert
|
|
10
|
+
* @returns {string|Buffer} - String if valid UTF-8, otherwise original Buffer
|
|
11
|
+
*/
|
|
12
|
+
function bin_to_str(buffer) {
|
|
13
|
+
if (!Buffer.isBuffer(buffer)) {
|
|
14
|
+
return buffer;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Empty buffer stays as buffer
|
|
18
|
+
if (buffer.length === 0) {
|
|
19
|
+
return buffer;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
var str = buffer.toString("utf8");
|
|
23
|
+
// Check if it's valid UTF-8 by seeing if it round-trips correctly
|
|
24
|
+
if (Buffer.from(str, "utf8").equals(buffer)) {
|
|
25
|
+
// Additional check: ensure all characters are printable or common whitespace
|
|
26
|
+
// This prevents converting binary data that happens to be valid UTF-8
|
|
27
|
+
var isPrintable = true;
|
|
28
|
+
for (var i = 0; i < str.length; i++) {
|
|
29
|
+
var code = str.charCodeAt(i);
|
|
30
|
+
// Allow printable ASCII (32-126) and common whitespace (tab, newline, carriage return)
|
|
31
|
+
if (!(code >= 32 && code <= 126) && code !== 9 && code !== 10 && code !== 13) {
|
|
32
|
+
isPrintable = false;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (isPrintable) {
|
|
37
|
+
return str;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
} catch (e) {
|
|
41
|
+
// Not valid UTF-8, return original buffer
|
|
42
|
+
}
|
|
43
|
+
return buffer;
|
|
44
|
+
}
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = collectBodyKeys;
|
|
7
|
+
var _encodeUtils = require("./encode-utils.js");
|
|
8
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
9
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
10
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
11
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
12
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
13
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
14
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
15
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
16
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
17
|
+
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
18
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
19
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
20
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
21
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
22
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
23
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
24
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
25
|
+
// Helper functions
|
|
26
|
+
var isEmpty = function isEmpty(value) {
|
|
27
|
+
if (typeof value === "string") return value === "";
|
|
28
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
29
|
+
if ((0, _encodeUtils.isPojo)(value)) return Object.keys(value).length === 0;
|
|
30
|
+
if ((0, _encodeUtils.isBytes)(value)) return value.length === 0 || value.byteLength === 0;
|
|
31
|
+
return false;
|
|
32
|
+
};
|
|
33
|
+
var hasOnlyEmptyValues = function hasOnlyEmptyValues(obj) {
|
|
34
|
+
if (!(0, _encodeUtils.isPojo)(obj)) return false;
|
|
35
|
+
return Object.values(obj).every(function (v) {
|
|
36
|
+
return typeof v === "string" && v === "" || Array.isArray(v) && v.length === 0 || (0, _encodeUtils.isPojo)(v) && Object.keys(v).length === 0;
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
var isSimpleValue = function isSimpleValue(value) {
|
|
40
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "boolean" || value === null || value === undefined || _typeof(value) === "symbol";
|
|
41
|
+
};
|
|
42
|
+
var getValueByPath = function getValueByPath(obj, path) {
|
|
43
|
+
var parts = path.split("/");
|
|
44
|
+
var value = obj;
|
|
45
|
+
var _iterator = _createForOfIteratorHelper(parts),
|
|
46
|
+
_step;
|
|
47
|
+
try {
|
|
48
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
49
|
+
var part = _step.value;
|
|
50
|
+
if (/^\d+$/.test(part)) {
|
|
51
|
+
value = value[parseInt(part) - 1];
|
|
52
|
+
} else {
|
|
53
|
+
value = value[part];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
} catch (err) {
|
|
57
|
+
_iterator.e(err);
|
|
58
|
+
} finally {
|
|
59
|
+
_iterator.f();
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
};
|
|
63
|
+
var canArrayBeInHeader = function canArrayBeInHeader(array) {
|
|
64
|
+
// Empty arrays can be in headers
|
|
65
|
+
if (array.length === 0) return true;
|
|
66
|
+
|
|
67
|
+
// Arrays with objects must go to body
|
|
68
|
+
if (array.some(function (item) {
|
|
69
|
+
return (0, _encodeUtils.isPojo)(item);
|
|
70
|
+
})) return false;
|
|
71
|
+
|
|
72
|
+
// Arrays with binary data must go to body
|
|
73
|
+
if (array.some(function (item) {
|
|
74
|
+
return (0, _encodeUtils.isBytes)(item) && item.length > 0;
|
|
75
|
+
})) return false;
|
|
76
|
+
|
|
77
|
+
// Arrays with non-ASCII strings must go to body
|
|
78
|
+
if (array.some(function (item) {
|
|
79
|
+
return typeof item === "string" && (0, _encodeUtils.hasNonAscii)(item);
|
|
80
|
+
})) return false;
|
|
81
|
+
|
|
82
|
+
// Arrays with nested arrays must go to body (to match original behavior)
|
|
83
|
+
if (array.some(function (item) {
|
|
84
|
+
return Array.isArray(item);
|
|
85
|
+
})) return false;
|
|
86
|
+
|
|
87
|
+
// Arrays with nested arrays that have objects must go to body
|
|
88
|
+
if (array.some(function (item) {
|
|
89
|
+
return Array.isArray(item) && item.some(function (subItem) {
|
|
90
|
+
return (0, _encodeUtils.isPojo)(subItem);
|
|
91
|
+
});
|
|
92
|
+
})) return false;
|
|
93
|
+
|
|
94
|
+
// Simple arrays of primitives can stay in headers
|
|
95
|
+
return true;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// Array analysis helper
|
|
99
|
+
var analyzeArray = function analyzeArray(array) {
|
|
100
|
+
var analysis = {
|
|
101
|
+
hasObjects: false,
|
|
102
|
+
hasArrays: false,
|
|
103
|
+
hasNonObjects: false,
|
|
104
|
+
hasArraysOfObjects: false,
|
|
105
|
+
hasEmptyStrings: false,
|
|
106
|
+
hasEmptyObjects: false,
|
|
107
|
+
hasNonEmptyObjects: false,
|
|
108
|
+
hasObjectsWithOnlyEmptyValues: false,
|
|
109
|
+
hasOnlyEmptyElements: true
|
|
110
|
+
};
|
|
111
|
+
var _iterator2 = _createForOfIteratorHelper(array),
|
|
112
|
+
_step2;
|
|
113
|
+
try {
|
|
114
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
115
|
+
var item = _step2.value;
|
|
116
|
+
if ((0, _encodeUtils.isPojo)(item)) {
|
|
117
|
+
analysis.hasObjects = true;
|
|
118
|
+
if (Object.keys(item).length === 0) {
|
|
119
|
+
analysis.hasEmptyObjects = true;
|
|
120
|
+
} else {
|
|
121
|
+
analysis.hasNonEmptyObjects = true;
|
|
122
|
+
if (hasOnlyEmptyValues(item)) {
|
|
123
|
+
analysis.hasObjectsWithOnlyEmptyValues = true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
} else if (Array.isArray(item)) {
|
|
127
|
+
analysis.hasArrays = true;
|
|
128
|
+
if (item.some(function (subItem) {
|
|
129
|
+
return (0, _encodeUtils.isPojo)(subItem);
|
|
130
|
+
})) {
|
|
131
|
+
analysis.hasArraysOfObjects = true;
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
analysis.hasNonObjects = true;
|
|
135
|
+
}
|
|
136
|
+
if (typeof item === "string" && item === "") {
|
|
137
|
+
analysis.hasEmptyStrings = true;
|
|
138
|
+
}
|
|
139
|
+
if (!isEmpty(item)) {
|
|
140
|
+
analysis.hasOnlyEmptyElements = false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
} catch (err) {
|
|
144
|
+
_iterator2.e(err);
|
|
145
|
+
} finally {
|
|
146
|
+
_iterator2.f();
|
|
147
|
+
}
|
|
148
|
+
return analysis;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// Body key collector class
|
|
152
|
+
var BodyKeyCollector = /*#__PURE__*/function () {
|
|
153
|
+
function BodyKeyCollector(obj) {
|
|
154
|
+
_classCallCheck(this, BodyKeyCollector);
|
|
155
|
+
this.obj = obj;
|
|
156
|
+
this.keys = [];
|
|
157
|
+
}
|
|
158
|
+
return _createClass(BodyKeyCollector, [{
|
|
159
|
+
key: "collect",
|
|
160
|
+
value: function collect() {
|
|
161
|
+
this.processRootObject();
|
|
162
|
+
return this.deduplicateAndFilter();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Process top-level object
|
|
166
|
+
}, {
|
|
167
|
+
key: "processRootObject",
|
|
168
|
+
value: function processRootObject() {
|
|
169
|
+
var objKeys = Object.keys(this.obj);
|
|
170
|
+
for (var _i = 0, _Object$entries = Object.entries(this.obj); _i < _Object$entries.length; _i++) {
|
|
171
|
+
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
172
|
+
key = _Object$entries$_i[0],
|
|
173
|
+
value = _Object$entries$_i[1];
|
|
174
|
+
if (this.isSpecialDataBodyField(key, value, objKeys)) {
|
|
175
|
+
this.keys.push(key);
|
|
176
|
+
} else if (Array.isArray(value) && value.length > 0) {
|
|
177
|
+
// Check if array can stay in header
|
|
178
|
+
if (!canArrayBeInHeader(value)) {
|
|
179
|
+
this.processRootArray(key, value);
|
|
180
|
+
}
|
|
181
|
+
} else if ((0, _encodeUtils.isPojo)(value)) {
|
|
182
|
+
this.processRootNestedObject(key, value);
|
|
183
|
+
} else if (this.needsBodyKey(key, value)) {
|
|
184
|
+
this.keys.push(key);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Check if field is special data/body field
|
|
190
|
+
}, {
|
|
191
|
+
key: "isSpecialDataBodyField",
|
|
192
|
+
value: function isSpecialDataBodyField(key, value, objKeys) {
|
|
193
|
+
if ((key === "data" || key === "body") && isSimpleValue(value) && objKeys.length > 1) {
|
|
194
|
+
var otherKey = key === "data" ? "body" : "data";
|
|
195
|
+
var otherValue = this.obj[otherKey];
|
|
196
|
+
if (otherValue && (0, _encodeUtils.isPojo)(otherValue) && Object.keys(otherValue).length > 0) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Check if value needs a body key
|
|
205
|
+
}, {
|
|
206
|
+
key: "needsBodyKey",
|
|
207
|
+
value: function needsBodyKey(key, value) {
|
|
208
|
+
return (0, _encodeUtils.isBytes)(value) && value.length > 0 || typeof value === "string" && value.includes("\n") || typeof value === "string" && (0, _encodeUtils.hasNonAscii)(value);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Process root-level arrays
|
|
212
|
+
}, {
|
|
213
|
+
key: "processRootArray",
|
|
214
|
+
value: function processRootArray(key, array) {
|
|
215
|
+
var _this = this;
|
|
216
|
+
var analysis = analyzeArray(array);
|
|
217
|
+
var bodyPartCounter = 1;
|
|
218
|
+
if (analysis.hasArraysOfObjects) {
|
|
219
|
+
// Handle arrays of arrays containing objects
|
|
220
|
+
array.forEach(function (item, index) {
|
|
221
|
+
if (Array.isArray(item)) {
|
|
222
|
+
item.forEach(function (subItem, subIndex) {
|
|
223
|
+
if ((0, _encodeUtils.isPojo)(subItem)) {
|
|
224
|
+
_this.keys.push("".concat(key, "/").concat(index + 1, "/").concat(subIndex + 1));
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
this.keys.push(key);
|
|
230
|
+
} else if (analysis.hasObjects && (analysis.hasEmptyStrings || analysis.hasEmptyObjects) && !analysis.hasObjectsWithOnlyEmptyValues) {
|
|
231
|
+
// Mixed array: only non-empty objects get parts
|
|
232
|
+
array.forEach(function (item) {
|
|
233
|
+
if ((0, _encodeUtils.isPojo)(item) && Object.keys(item).length > 0) {
|
|
234
|
+
var path = "".concat(key, "/").concat(bodyPartCounter);
|
|
235
|
+
_this.keys.push(path);
|
|
236
|
+
_this.addNestedObjectPaths(item, path);
|
|
237
|
+
}
|
|
238
|
+
bodyPartCounter++;
|
|
239
|
+
});
|
|
240
|
+
this.keys.push(key);
|
|
241
|
+
} else if (analysis.hasObjects) {
|
|
242
|
+
// Regular array with objects
|
|
243
|
+
var skipEmptyObjects = analysis.hasOnlyEmptyElements;
|
|
244
|
+
array.forEach(function (item) {
|
|
245
|
+
if ((0, _encodeUtils.isPojo)(item)) {
|
|
246
|
+
if (!(skipEmptyObjects && Object.keys(item).length === 0)) {
|
|
247
|
+
var path = "".concat(key, "/").concat(bodyPartCounter);
|
|
248
|
+
_this.keys.push(path);
|
|
249
|
+
if (Object.keys(item).length > 0) {
|
|
250
|
+
_this.addNestedObjectPaths(item, path);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
} else if (typeof item === "string" && item === "") {
|
|
254
|
+
_this.keys.push("".concat(key, "/").concat(bodyPartCounter));
|
|
255
|
+
}
|
|
256
|
+
bodyPartCounter++;
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// Add main array key conditionally
|
|
260
|
+
if (!analysis.hasObjectsWithOnlyEmptyValues || analysis.hasNonObjects) {
|
|
261
|
+
if (!analysis.hasOnlyEmptyElements) {
|
|
262
|
+
this.keys.push(key);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
} else {
|
|
266
|
+
// Simple array without objects
|
|
267
|
+
var hasOnlyEmptyArraysOrObjects = array.every(function (item) {
|
|
268
|
+
return isEmpty(item) && (Array.isArray(item) || (0, _encodeUtils.isPojo)(item) || typeof item === "string");
|
|
269
|
+
});
|
|
270
|
+
if (hasOnlyEmptyArraysOrObjects || !array.every(isEmpty)) {
|
|
271
|
+
this.keys.push(key);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Add paths for nested objects within an object
|
|
277
|
+
}, {
|
|
278
|
+
key: "addNestedObjectPaths",
|
|
279
|
+
value: function addNestedObjectPaths(obj, basePath) {
|
|
280
|
+
for (var _i2 = 0, _Object$entries2 = Object.entries(obj); _i2 < _Object$entries2.length; _i2++) {
|
|
281
|
+
var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2),
|
|
282
|
+
nestedKey = _Object$entries2$_i[0],
|
|
283
|
+
nestedValue = _Object$entries2$_i[1];
|
|
284
|
+
if ((0, _encodeUtils.isPojo)(nestedValue) && Object.keys(nestedValue).length > 0) {
|
|
285
|
+
this.keys.push("".concat(basePath, "/").concat(nestedKey));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Process root-level nested object
|
|
291
|
+
}, {
|
|
292
|
+
key: "processRootNestedObject",
|
|
293
|
+
value: function processRootNestedObject(key, obj) {
|
|
294
|
+
// Check for arrays with only empty elements
|
|
295
|
+
for (var _i3 = 0, _Object$entries3 = Object.entries(obj); _i3 < _Object$entries3.length; _i3++) {
|
|
296
|
+
var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2),
|
|
297
|
+
k = _Object$entries3$_i[0],
|
|
298
|
+
v = _Object$entries3$_i[1];
|
|
299
|
+
if (Array.isArray(v) && v.length > 0 && v.every(isEmpty)) {
|
|
300
|
+
this.keys.push("".concat(key, "/").concat(k));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Traverse the object
|
|
305
|
+
this.traverse(obj, key);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Traverse nested structures
|
|
309
|
+
}, {
|
|
310
|
+
key: "traverse",
|
|
311
|
+
value: function traverse(current, path) {
|
|
312
|
+
var hasSimpleFields = false;
|
|
313
|
+
var nestedPaths = [];
|
|
314
|
+
var hasArraysWithObjects = false;
|
|
315
|
+
|
|
316
|
+
// First pass: analyze structure
|
|
317
|
+
for (var _i4 = 0, _Object$entries4 = Object.entries(current); _i4 < _Object$entries4.length; _i4++) {
|
|
318
|
+
var _Object$entries4$_i = _slicedToArray(_Object$entries4[_i4], 2),
|
|
319
|
+
key = _Object$entries4$_i[0],
|
|
320
|
+
value = _Object$entries4$_i[1];
|
|
321
|
+
var fullPath = path ? "".concat(path, "/").concat(key) : key;
|
|
322
|
+
var result = this.analyzeFieldInTraversal(value, fullPath, nestedPaths);
|
|
323
|
+
hasSimpleFields = hasSimpleFields || result.hasSimpleFields;
|
|
324
|
+
hasArraysWithObjects = hasArraysWithObjects || result.hasArraysWithObjects;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Add current path if needed
|
|
328
|
+
if (hasSimpleFields || hasArraysWithObjects && path) {
|
|
329
|
+
this.keys.push(path);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Second pass: check for arrays with only empty elements
|
|
333
|
+
for (var _i5 = 0, _Object$entries5 = Object.entries(current); _i5 < _Object$entries5.length; _i5++) {
|
|
334
|
+
var _Object$entries5$_i = _slicedToArray(_Object$entries5[_i5], 2),
|
|
335
|
+
_key = _Object$entries5$_i[0],
|
|
336
|
+
_value = _Object$entries5$_i[1];
|
|
337
|
+
var _fullPath = path ? "".concat(path, "/").concat(_key) : _key;
|
|
338
|
+
if (Array.isArray(_value) && _value.length > 0 && _value.every(isEmpty)) {
|
|
339
|
+
this.keys.push(_fullPath);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Traverse nested objects
|
|
344
|
+
for (var _i6 = 0, _nestedPaths = nestedPaths; _i6 < _nestedPaths.length; _i6++) {
|
|
345
|
+
var nestedPath = _nestedPaths[_i6];
|
|
346
|
+
var nestedObj = getValueByPath(this.obj, nestedPath);
|
|
347
|
+
if ((0, _encodeUtils.isPojo)(nestedObj)) {
|
|
348
|
+
this.traverse(nestedObj, nestedPath);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Analyze a field during traversal
|
|
354
|
+
}, {
|
|
355
|
+
key: "analyzeFieldInTraversal",
|
|
356
|
+
value: function analyzeFieldInTraversal(value, fullPath, nestedPaths) {
|
|
357
|
+
var hasSimpleFields = false;
|
|
358
|
+
var hasArraysWithObjects = false;
|
|
359
|
+
if (Array.isArray(value)) {
|
|
360
|
+
if (value.length === 0) {
|
|
361
|
+
hasSimpleFields = true;
|
|
362
|
+
} else {
|
|
363
|
+
var analysis = analyzeArray(value);
|
|
364
|
+
if (analysis.hasObjects) {
|
|
365
|
+
hasArraysWithObjects = true;
|
|
366
|
+
this.processArrayInTraversal(value, fullPath, nestedPaths, analysis);
|
|
367
|
+
if (analysis.hasNonObjects) {
|
|
368
|
+
hasSimpleFields = true;
|
|
369
|
+
// Only add to keys if array can't be in header
|
|
370
|
+
if (!canArrayBeInHeader(value)) {
|
|
371
|
+
this.keys.push(fullPath);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
} else {
|
|
375
|
+
hasSimpleFields = true;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
} else if ((0, _encodeUtils.isPojo)(value)) {
|
|
379
|
+
if (Object.keys(value).length === 0) {
|
|
380
|
+
hasSimpleFields = true;
|
|
381
|
+
} else if (hasOnlyEmptyValues(value)) {
|
|
382
|
+
this.keys.push(fullPath);
|
|
383
|
+
} else {
|
|
384
|
+
var hasArraysWithOnlyEmptyElements = Object.entries(value).some(function (_ref) {
|
|
385
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
386
|
+
k = _ref2[0],
|
|
387
|
+
v = _ref2[1];
|
|
388
|
+
return Array.isArray(v) && v.length > 0 && v.every(isEmpty);
|
|
389
|
+
});
|
|
390
|
+
if (hasArraysWithOnlyEmptyElements) {
|
|
391
|
+
this.keys.push(fullPath);
|
|
392
|
+
}
|
|
393
|
+
nestedPaths.push(fullPath);
|
|
394
|
+
}
|
|
395
|
+
} else if ((0, _encodeUtils.isBytes)(value) && value.length > 0 || isSimpleValue(value)) {
|
|
396
|
+
hasSimpleFields = true;
|
|
397
|
+
}
|
|
398
|
+
return {
|
|
399
|
+
hasSimpleFields: hasSimpleFields,
|
|
400
|
+
hasArraysWithObjects: hasArraysWithObjects
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Process arrays found during traversal
|
|
405
|
+
}, {
|
|
406
|
+
key: "processArrayInTraversal",
|
|
407
|
+
value: function processArrayInTraversal(array, fullPath, nestedPaths, analysis) {
|
|
408
|
+
var _this2 = this;
|
|
409
|
+
if ((analysis.hasEmptyStrings || analysis.hasEmptyObjects) && analysis.hasNonEmptyObjects) {
|
|
410
|
+
// Special case: only non-empty objects get parts
|
|
411
|
+
array.forEach(function (item, index) {
|
|
412
|
+
if ((0, _encodeUtils.isPojo)(item) && Object.keys(item).length > 0) {
|
|
413
|
+
var itemPath = "".concat(fullPath, "/").concat(index + 1);
|
|
414
|
+
_this2.keys.push(itemPath);
|
|
415
|
+
nestedPaths.push(itemPath);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
} else if (analysis.hasObjectsWithOnlyEmptyValues && !analysis.hasNonObjects) {
|
|
419
|
+
// Objects with only empty values
|
|
420
|
+
array.forEach(function (item, index) {
|
|
421
|
+
if ((0, _encodeUtils.isPojo)(item)) {
|
|
422
|
+
var itemPath = "".concat(fullPath, "/").concat(index + 1);
|
|
423
|
+
_this2.keys.push(itemPath);
|
|
424
|
+
if (Object.keys(item).length > 0) {
|
|
425
|
+
nestedPaths.push(itemPath);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
} else {
|
|
430
|
+
// Normal case
|
|
431
|
+
array.forEach(function (item, index) {
|
|
432
|
+
if ((0, _encodeUtils.isPojo)(item)) {
|
|
433
|
+
var itemPath = "".concat(fullPath, "/").concat(index + 1);
|
|
434
|
+
_this2.keys.push(itemPath);
|
|
435
|
+
if (Object.keys(item).length > 0) {
|
|
436
|
+
nestedPaths.push(itemPath);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Deduplicate and filter results
|
|
444
|
+
}, {
|
|
445
|
+
key: "deduplicateAndFilter",
|
|
446
|
+
value: function deduplicateAndFilter() {
|
|
447
|
+
var _this3 = this;
|
|
448
|
+
var uniqueKeys = _toConsumableArray(new Set(this.keys));
|
|
449
|
+
return uniqueKeys.filter(function (k) {
|
|
450
|
+
if (!k) return false;
|
|
451
|
+
|
|
452
|
+
// Check if this is a path to an element inside an array with only empty elements
|
|
453
|
+
var parts = k.split("/");
|
|
454
|
+
if (parts.length >= 2 && /^\d+$/.test(parts[parts.length - 1])) {
|
|
455
|
+
var arrayPath = parts.slice(0, -1).join("/");
|
|
456
|
+
var arrayValue = getValueByPath(_this3.obj, arrayPath);
|
|
457
|
+
if (Array.isArray(arrayValue) && arrayValue.every(isEmpty)) {
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return true;
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
}]);
|
|
465
|
+
}();
|
|
466
|
+
function collectBodyKeys(obj) {
|
|
467
|
+
var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
468
|
+
var collector = new BodyKeyCollector(obj);
|
|
469
|
+
return collector.collect();
|
|
470
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = encodeArrayItem;
|
|
7
|
+
var _encodeUtils = require("./encode-utils.js");
|
|
8
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
9
|
+
// Helper to generate the correct number of backslashes for a given nesting level
|
|
10
|
+
function getBackslashes(level) {
|
|
11
|
+
return "\\".repeat(Math.pow(2, level) - 1);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Helper to encode primitive values at a specific nesting level
|
|
15
|
+
function encodePrimitiveAtLevel(value, level) {
|
|
16
|
+
var bs = getBackslashes(level);
|
|
17
|
+
if (typeof value === "number") {
|
|
18
|
+
if (Number.isInteger(value)) {
|
|
19
|
+
return "".concat(bs, "\"(ao-type-integer) ").concat(value).concat(bs, "\"");
|
|
20
|
+
} else {
|
|
21
|
+
return "".concat(bs, "\"(ao-type-float) ").concat((0, _encodeUtils.formatFloat)(value)).concat(bs, "\"");
|
|
22
|
+
}
|
|
23
|
+
} else if (typeof value === "string") {
|
|
24
|
+
return "".concat(bs, "\"").concat(value).concat(bs, "\"");
|
|
25
|
+
} else if (value === null) {
|
|
26
|
+
var innerBs = getBackslashes(level + 1);
|
|
27
|
+
return "".concat(bs, "\"(ao-type-atom) ").concat(innerBs, "\"null").concat(innerBs, "\"").concat(bs, "\"");
|
|
28
|
+
} else if (value === undefined) {
|
|
29
|
+
var _innerBs = getBackslashes(level + 1);
|
|
30
|
+
return "".concat(bs, "\"(ao-type-atom) ").concat(_innerBs, "\"undefined").concat(_innerBs, "\"").concat(bs, "\"");
|
|
31
|
+
} else if (_typeof(value) === "symbol") {
|
|
32
|
+
var desc = value.description || "Symbol.for()";
|
|
33
|
+
var _innerBs2 = getBackslashes(level + 1);
|
|
34
|
+
return "".concat(bs, "\"(ao-type-atom) ").concat(_innerBs2, "\"").concat(desc).concat(_innerBs2, "\"").concat(bs, "\"");
|
|
35
|
+
} else if (typeof value === "boolean") {
|
|
36
|
+
var _innerBs3 = getBackslashes(level + 1);
|
|
37
|
+
return "".concat(bs, "\"(ao-type-atom) ").concat(_innerBs3, "\"").concat(value).concat(_innerBs3, "\"").concat(bs, "\"");
|
|
38
|
+
} else {
|
|
39
|
+
return "".concat(bs, "\"").concat(String(value)).concat(bs, "\"");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Recursive function to handle arrays at any nesting level
|
|
44
|
+
function encodeArrayAtLevel(items, level) {
|
|
45
|
+
// The original code only goes 3 levels deep for arrays
|
|
46
|
+
if (level >= 3) {
|
|
47
|
+
var bs = getBackslashes(level);
|
|
48
|
+
var stringItems = items.map(function (item) {
|
|
49
|
+
if (typeof item === "number") {
|
|
50
|
+
if (Number.isInteger(item)) {
|
|
51
|
+
return "".concat(bs, "\"(ao-type-integer) ").concat(item).concat(bs, "\"");
|
|
52
|
+
} else {
|
|
53
|
+
return "".concat(bs, "\"(ao-type-float) ").concat((0, _encodeUtils.formatFloat)(item)).concat(bs, "\"");
|
|
54
|
+
}
|
|
55
|
+
} else if (typeof item === "string") {
|
|
56
|
+
return "".concat(bs, "\"").concat(item).concat(bs, "\"");
|
|
57
|
+
} else {
|
|
58
|
+
return "".concat(bs, "\"").concat(String(item)).concat(bs, "\"");
|
|
59
|
+
}
|
|
60
|
+
}).join(", ");
|
|
61
|
+
return "".concat(getBackslashes(level - 1), "\"(ao-type-list) ").concat(stringItems).concat(getBackslashes(level - 1), "\"");
|
|
62
|
+
}
|
|
63
|
+
var encodedItems = items.map(function (item) {
|
|
64
|
+
if (Array.isArray(item)) {
|
|
65
|
+
return encodeArrayAtLevel(item, level + 1);
|
|
66
|
+
} else {
|
|
67
|
+
return encodePrimitiveAtLevel(item, level);
|
|
68
|
+
}
|
|
69
|
+
}).join(", ");
|
|
70
|
+
if (level === 0) {
|
|
71
|
+
return "\"(ao-type-list) ".concat(encodedItems, "\"");
|
|
72
|
+
} else {
|
|
73
|
+
var _bs = getBackslashes(level - 1);
|
|
74
|
+
return "".concat(_bs, "\"(ao-type-list) ").concat(encodedItems).concat(_bs, "\"");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function encodeArrayItem(item) {
|
|
78
|
+
if (typeof item === "number") {
|
|
79
|
+
if (Number.isInteger(item)) {
|
|
80
|
+
return "\"(ao-type-integer) ".concat(item, "\"");
|
|
81
|
+
} else {
|
|
82
|
+
return "\"(ao-type-float) ".concat((0, _encodeUtils.formatFloat)(item), "\"");
|
|
83
|
+
}
|
|
84
|
+
} else if (typeof item === "string") {
|
|
85
|
+
return "\"".concat(item, "\"");
|
|
86
|
+
} else if (item === null) {
|
|
87
|
+
return "\"(ao-type-atom) \\\"null\\\"\"";
|
|
88
|
+
} else if (item === undefined) {
|
|
89
|
+
return "\"(ao-type-atom) \\\"undefined\\\"\"";
|
|
90
|
+
} else if (_typeof(item) === "symbol") {
|
|
91
|
+
var desc = item.description || "Symbol.for()";
|
|
92
|
+
return "\"(ao-type-atom) \\\"".concat(desc, "\\\"\"");
|
|
93
|
+
} else if (typeof item === "boolean") {
|
|
94
|
+
return "\"(ao-type-atom) \\\"".concat(item, "\\\"\"");
|
|
95
|
+
} else if (Array.isArray(item)) {
|
|
96
|
+
return encodeArrayAtLevel(item, 1);
|
|
97
|
+
} else if ((0, _encodeUtils.isBytes)(item)) {
|
|
98
|
+
var buffer = (0, _encodeUtils.toBuffer)(item);
|
|
99
|
+
if (buffer.length === 0 || buffer.byteLength === 0) {
|
|
100
|
+
return "\"\"";
|
|
101
|
+
}
|
|
102
|
+
return "\"(ao-type-binary)\"";
|
|
103
|
+
} else if ((0, _encodeUtils.isPojo)(item)) {
|
|
104
|
+
var json = JSON.stringify(item);
|
|
105
|
+
var escaped = json.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
106
|
+
return "\"(ao-type-map) ".concat(escaped, "\"");
|
|
107
|
+
} else {
|
|
108
|
+
return "\"".concat(String(item), "\"");
|
|
109
|
+
}
|
|
110
|
+
}
|