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.
Files changed (44) hide show
  1. package/cjs/bin_to_str.js +44 -0
  2. package/cjs/collect-body-keys.js +470 -0
  3. package/cjs/encode-array-item.js +110 -0
  4. package/cjs/encode-utils.js +236 -0
  5. package/cjs/encode.js +1318 -0
  6. package/cjs/erl_json.js +317 -0
  7. package/cjs/erl_str.js +1037 -0
  8. package/cjs/flat.js +222 -0
  9. package/cjs/http-message-signatures/httpbis.js +489 -0
  10. package/cjs/http-message-signatures/index.js +25 -0
  11. package/cjs/http-message-signatures/structured-header.js +129 -0
  12. package/cjs/httpsig.js +716 -0
  13. package/cjs/httpsig2.js +1160 -0
  14. package/cjs/id.js +470 -0
  15. package/cjs/index.js +63 -0
  16. package/cjs/send.js +194 -0
  17. package/cjs/signer-utils.js +617 -0
  18. package/cjs/signer.js +606 -0
  19. package/cjs/structured.js +296 -0
  20. package/cjs/test.js +27 -0
  21. package/cjs/utils.js +42 -0
  22. package/esm/bin_to_str.js +46 -0
  23. package/esm/collect-body-keys.js +436 -0
  24. package/esm/encode-array-item.js +112 -0
  25. package/esm/encode-utils.js +185 -0
  26. package/esm/encode.js +1219 -0
  27. package/esm/erl_json.js +289 -0
  28. package/esm/erl_str.js +1139 -0
  29. package/esm/flat.js +196 -0
  30. package/esm/http-message-signatures/httpbis.js +438 -0
  31. package/esm/http-message-signatures/index.js +4 -0
  32. package/esm/http-message-signatures/structured-header.js +105 -0
  33. package/esm/httpsig.js +658 -0
  34. package/esm/httpsig2.js +1097 -0
  35. package/esm/id.js +459 -0
  36. package/esm/index.js +4 -0
  37. package/esm/package.json +3 -0
  38. package/esm/send.js +124 -0
  39. package/esm/signer-utils.js +494 -0
  40. package/esm/signer.js +452 -0
  41. package/esm/structured.js +269 -0
  42. package/esm/test.js +6 -0
  43. package/esm/utils.js +28 -0
  44. 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
+ }