nestjs-r2-storage 1.2.4 → 1.2.6

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/README.md CHANGED
@@ -389,6 +389,20 @@ R2StorageModule.forRootAsync({
389
389
 
390
390
  ## Changelog
391
391
 
392
+ ### v1.2.6 (2025-04-20)
393
+
394
+ - Refactored getNestedValue: access key first, then handle array segments
395
+ - Refactored setNestedValue: proper handling of empty brackets [] and indexed arrays [0]
396
+ - Robust parsing of paths: user.profile.image, gallery[].photo, variants[0].images[].url
397
+
398
+ ### v1.2.5 (2025-04-20)
399
+
400
+ - Rewrote parseFieldPath to split by dot then parse each segment (fixes regex state bugs)
401
+ - Fixed getNestedValue array traversal when next key is a property (not array/index)
402
+ - Fixed setNestedValue for empty array brackets `[]` and indexed arrays `[0]`
403
+ - Added null/undefined guards throughout
404
+ - Supports: `gallery[].photo`, `variants[].images[].url`, `a[].b[0].c`
405
+
392
406
  ### v1.2.4 (2025-04-20)
393
407
 
394
408
  - Fixed parseFieldPath regex to handle keys containing dots
@@ -10,110 +10,110 @@ exports.getArrayElementPath = getArrayElementPath;
10
10
  exports.getAllArrayItemPaths = getAllArrayItemPaths;
11
11
  function parseFieldPath(path) {
12
12
  const segments = [];
13
- const regex = /([^\[\].]+)(?:\[(\d*)\])?/g;
14
- let match;
15
- while ((match = regex.exec(path)) !== null) {
16
- const hasIndex = match[2] !== undefined && match[2] !== '';
17
- const hasEmptyBrackets = match[2] === '';
13
+ const parts = path.split(".");
14
+ for (const part of parts) {
15
+ const match = part.match(/^([^\[\]]+)(?:\[(\d*)\])?$/);
16
+ if (!match)
17
+ continue;
18
+ const key = match[1];
19
+ const indexRaw = match[2];
20
+ const hasIndex = indexRaw !== undefined && indexRaw !== "";
21
+ const hasEmptyBrackets = indexRaw === "";
18
22
  segments.push({
19
- key: match[1],
20
- isArray: hasEmptyBrackets || hasIndex,
21
- arrayIndex: hasIndex ? parseInt(match[2], 10) : undefined,
23
+ key,
24
+ isArray: hasIndex || hasEmptyBrackets,
25
+ arrayIndex: hasIndex ? parseInt(indexRaw, 10) : undefined,
22
26
  });
23
27
  }
24
28
  return { segments };
25
29
  }
26
30
  function getNestedValue(obj, path) {
27
- if (!path || !obj) {
31
+ if (!path || !obj)
28
32
  return undefined;
29
- }
30
33
  const { segments } = parseFieldPath(path);
31
34
  let current = obj;
32
35
  for (let i = 0; i < segments.length; i++) {
33
36
  const segment = segments[i];
34
- if (current === null || current === undefined) {
37
+ if (current == null)
38
+ return undefined;
39
+ current = current[segment.key];
40
+ if (current == null)
35
41
  return undefined;
36
- }
37
42
  if (segment.isArray) {
38
- if (!Array.isArray(current)) {
43
+ if (!Array.isArray(current))
39
44
  return undefined;
40
- }
41
- if (i === segments.length - 1) {
42
- return current;
43
- }
44
- const nextSegment = segments[i + 1];
45
- if (nextSegment && nextSegment.key && !nextSegment.isArray && !nextSegment.arrayIndex) {
46
- return current;
47
- }
48
45
  if (segment.arrayIndex !== undefined) {
49
46
  current = current[segment.arrayIndex];
47
+ continue;
50
48
  }
51
- else {
49
+ if (i === segments.length - 1)
50
+ return current;
51
+ const next = segments[i + 1];
52
+ if (next && !next.isArray && next.arrayIndex === undefined) {
52
53
  return current;
53
54
  }
54
55
  }
55
- else {
56
- current = current[segment.key];
57
- }
58
56
  }
59
57
  return current;
60
58
  }
61
59
  function setNestedValue(obj, path, value) {
62
- if (!path) {
60
+ if (!path)
63
61
  return obj;
64
- }
65
62
  const { segments } = parseFieldPath(path);
66
63
  const result = { ...obj };
67
64
  let current = result;
68
- for (let i = 0; i < segments.length - 1; i++) {
65
+ for (let i = 0; i < segments.length; i++) {
69
66
  const segment = segments[i];
70
- const nextSegment = segments[i + 1];
71
- if (current[segment.key] === undefined) {
72
- current[segment.key] = nextSegment.isArray ? [] : {};
67
+ const isLast = i === segments.length - 1;
68
+ if (current[segment.key] == null) {
69
+ current[segment.key] = segment.isArray ? [] : {};
73
70
  }
74
- else if (segment.isArray) {
75
- current[segment.key] = [...current[segment.key]];
76
- }
77
- else {
78
- current[segment.key] = { ...current[segment.key] };
79
- }
80
- current = current[segment.key];
81
- if (segment.isArray && segment.arrayIndex !== undefined) {
82
- if (current[segment.arrayIndex] === undefined) {
83
- current[segment.arrayIndex] = {};
71
+ if (segment.isArray) {
72
+ if (!Array.isArray(current[segment.key])) {
73
+ current[segment.key] = [];
74
+ }
75
+ const arr = current[segment.key];
76
+ if (segment.arrayIndex !== undefined) {
77
+ if (!arr[segment.arrayIndex]) {
78
+ arr[segment.arrayIndex] = {};
79
+ }
80
+ if (isLast) {
81
+ arr[segment.arrayIndex] = value;
82
+ }
83
+ else {
84
+ arr[segment.arrayIndex] = { ...arr[segment.arrayIndex] };
85
+ current = arr[segment.arrayIndex];
86
+ }
84
87
  }
85
88
  else {
86
- current[segment.arrayIndex] = { ...current[segment.arrayIndex] };
89
+ if (isLast) {
90
+ arr.push(value);
91
+ }
92
+ else {
93
+ const newItem = {};
94
+ arr.push(newItem);
95
+ current = newItem;
96
+ }
87
97
  }
88
- current = current[segment.arrayIndex];
89
- }
90
- }
91
- const lastSegment = segments[segments.length - 1];
92
- if (lastSegment.isArray && lastSegment.arrayIndex !== undefined) {
93
- if (!Array.isArray(current)) {
94
- current = [];
95
98
  }
96
99
  else {
97
- current = [...current];
100
+ if (isLast) {
101
+ current[segment.key] = value;
102
+ }
103
+ else {
104
+ current[segment.key] = { ...current[segment.key] };
105
+ current = current[segment.key];
106
+ }
98
107
  }
99
- current[lastSegment.arrayIndex] = {
100
- ...current[lastSegment.arrayIndex],
101
- [lastSegment.key]: value,
102
- };
103
- }
104
- else {
105
- current[lastSegment.key] = value;
106
108
  }
107
109
  return result;
108
110
  }
109
111
  function collectNestedValues(obj, path) {
110
112
  const value = getNestedValue(obj, path);
111
- if (value === undefined) {
113
+ if (value === undefined)
112
114
  return [];
113
- }
114
- if (Array.isArray(value)) {
115
+ if (Array.isArray(value))
115
116
  return value;
116
- }
117
117
  return [value];
118
118
  }
119
119
  function isArrayPath(path) {
@@ -124,12 +124,12 @@ function getArrayBasePath(path) {
124
124
  return match ? match[1] : path;
125
125
  }
126
126
  function getArrayElementPath(path) {
127
- return path.replace('[]', '');
127
+ return path.replace("[]", "");
128
128
  }
129
129
  function getAllArrayItemPaths(path, arrayLength) {
130
130
  const basePath = getArrayBasePath(path);
131
131
  const elementPath = getArrayElementPath(path);
132
- const cleanElementPath = elementPath.replace(/^\./, '');
132
+ const cleanElementPath = elementPath.replace(/^\./, "");
133
133
  const paths = [];
134
134
  for (let i = 0; i < arrayLength; i++) {
135
135
  paths.push(`${basePath}[${i}].${cleanElementPath}`);
@@ -1 +1 @@
1
- {"version":3,"file":"nested-value.util.js","sourceRoot":"","sources":["../../../src/r2-storage/utils/nested-value.util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nested-value.util.js","sourceRoot":"","sources":["../../../src/r2-storage/utils/nested-value.util.ts"],"names":[],"mappings":"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"}