pathtrace 1.0.0-beta.1 → 1.0.0
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 +53 -5
- package/dist/index.cjs +151 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +149 -45
- package/dist/index.mjs.map +1 -1
- package/dist/path-expand/constants.d.ts +4 -0
- package/dist/path-expand/index.d.ts +2 -0
- package/dist/path-expand/module.d.ts +16 -0
- package/dist/path-expand/types.d.ts +4 -0
- package/dist/path-info/helper.d.ts +2 -0
- package/dist/path-info/index.d.ts +2 -0
- package/dist/{path-info.d.ts → path-info/module.d.ts} +1 -2
- package/dist/path-value/index.d.ts +2 -0
- package/package.json +11 -12
- package/dist/get-path-info.d.ts +0 -2
- /package/dist/{get-path-value.d.ts → path-value/get.d.ts} +0 -0
- /package/dist/{set-path-value.d.ts → path-value/set.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
# pathtrace 🔍
|
|
2
2
|
|
|
3
|
+
[](https://badge.fury.io/js/pathtrace)
|
|
4
|
+
[](https://codecov.io/gh/tada5hi/pathtrace)
|
|
3
5
|
[](https://github.com/tada5hi/pathtrace/actions/workflows/main.yml)
|
|
4
|
-
[](https://github.com/tada5hi/pathtrace/actions/workflows/codeql.yml)
|
|
5
6
|
[](https://snyk.io/test/github/tada5hi/pathtrace)
|
|
6
7
|
[](https://conventionalcommits.org)
|
|
7
8
|
|
|
8
9
|
**Pathtrace** is a library for managing nested objects and arrays.
|
|
9
|
-
It offers straightforward methods for
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
It offers straightforward methods for retrieving ([getPathValue](#getpathvalue)) and
|
|
11
|
+
setting ([setPathValue](#setpathvalue)) values at any path.
|
|
12
|
+
Additionally, [getPathInfo](#getpathinfo) provides detailed path information,
|
|
13
|
+
and the [expandPath](#expandpath) helper allows for querying and expanding paths with wildcards and globstars,
|
|
13
14
|
making it ideal for handling complex data structures efficiently.
|
|
14
15
|
|
|
15
16
|
**Table of Contents**
|
|
@@ -18,6 +19,7 @@ making it ideal for handling complex data structures efficiently.
|
|
|
18
19
|
- [Usage](#usage)
|
|
19
20
|
- [getPathValue](#getpathvalue)
|
|
20
21
|
- [setPathValue](#setpathvalue)
|
|
22
|
+
- [expandPath](#expandpath)
|
|
21
23
|
- [getPathInfo](#getpathinfo)
|
|
22
24
|
- [License](#license)
|
|
23
25
|
|
|
@@ -213,6 +215,52 @@ var modifiedObj = setPathValue(obj, 'user.contact.phone', '987-654-3210');
|
|
|
213
215
|
console.log(modifiedObj === obj); // true
|
|
214
216
|
```
|
|
215
217
|
|
|
218
|
+
### expandPath
|
|
219
|
+
|
|
220
|
+
The expandPath function takes an object and a string representing a path,
|
|
221
|
+
potentially containing wildcards (`*`) and globstars (`**`),
|
|
222
|
+
and returns an array of all possible matching paths within the object.
|
|
223
|
+
|
|
224
|
+
**Example: Wildcard (`*`) - Select all shallow paths of an array**
|
|
225
|
+
```ts
|
|
226
|
+
import { expandPath } from 'pathtrace';
|
|
227
|
+
|
|
228
|
+
const obj = {
|
|
229
|
+
foo: ['bar', 'baz'],
|
|
230
|
+
};
|
|
231
|
+
const paths = expandPath(obj, 'foo.*');
|
|
232
|
+
console.log(paths); // ['foo[0]', 'foo[1]']
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Example: Wildcard (`*`) - Select matching paths under a wildcard branch**
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
import { expandPath } from 'pathtrace';
|
|
239
|
+
|
|
240
|
+
const obj = { foo: { bar: { a: true }, baz: { a: false, b: 1 } } };
|
|
241
|
+
const paths = expandPath(obj, 'foo.*.a');
|
|
242
|
+
console.log(paths); // ['foo.bar.a', 'foo.baz.a']
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Example: Globstar (`**`) - Select all leaves that match a leaf globstar**
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
import { expandPath } from 'pathtrace';
|
|
249
|
+
|
|
250
|
+
const obj = { foo: { a: { b: { c: 1 } }, d: { e: 2 } } };
|
|
251
|
+
const paths = expandPath(obj, 'foo.**');
|
|
252
|
+
console.log(paths); // ['foo.a.b.c', 'foo.d.e']
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Example: Globstar (`**`) - Select deeply nested matching paths under a globstar branch**
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
import { expandPath } from 'pathtrace';
|
|
259
|
+
|
|
260
|
+
const obj = { foo: { a: { b: { bar: 1 } }, c: { bar: 2 } } };
|
|
261
|
+
const paths = expandPath(obj, 'foo.**.bar');
|
|
262
|
+
console.log(paths); // ['foo.a.b.bar', 'foo.c.bar']
|
|
263
|
+
```
|
|
216
264
|
|
|
217
265
|
### getPathInfo
|
|
218
266
|
|
package/dist/index.cjs
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
*/ function arrayToPath(parts) {
|
|
12
12
|
return parts.reduce((prev, segment)=>{
|
|
13
13
|
let part = '';
|
|
14
|
-
segment = segment === '\\*' ? '*' : segment;
|
|
15
14
|
segment = segment.replace(/^\[(\d+)]$/g, '\\[$1]');
|
|
16
15
|
segment = segment.replace(/\./g, '\\.');
|
|
17
16
|
if (/^\d+$/.test(segment)) {
|
|
@@ -62,6 +61,118 @@
|
|
|
62
61
|
return result;
|
|
63
62
|
}
|
|
64
63
|
|
|
64
|
+
/*
|
|
65
|
+
* Copyright (c) 2024.
|
|
66
|
+
* Author Peter Placzek (tada5hi)
|
|
67
|
+
* For the full copyright and license information,
|
|
68
|
+
* view the LICENSE file that was distributed with this source code.
|
|
69
|
+
*/ var Character;
|
|
70
|
+
(function(Character) {
|
|
71
|
+
Character["WILDCARD"] = "*";
|
|
72
|
+
Character["GLOBSTAR"] = "**";
|
|
73
|
+
})(Character || (Character = {}));
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Copyright (c) 2024.
|
|
77
|
+
* Author Peter Placzek (tada5hi)
|
|
78
|
+
* For the full copyright and license information,
|
|
79
|
+
* view the LICENSE file that was distributed with this source code.
|
|
80
|
+
*/ function isObject(input) {
|
|
81
|
+
return !!input && typeof input === 'object' && !Array.isArray(input);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function expandPathVerboseInternal(data, path, currPath = [], currMatches = []) {
|
|
85
|
+
const segments = Array.isArray(path) ? path : pathToArray(path);
|
|
86
|
+
if (!segments.length) {
|
|
87
|
+
// no more paths to traverse
|
|
88
|
+
return [
|
|
89
|
+
{
|
|
90
|
+
value: arrayToPath(currPath),
|
|
91
|
+
matches: currMatches
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
const key = segments[0];
|
|
96
|
+
const rest = segments.slice(1);
|
|
97
|
+
if (typeof data !== 'undefined' && data !== null && !isObject(data) && !Array.isArray(data)) {
|
|
98
|
+
if (key === Character.GLOBSTAR) {
|
|
99
|
+
if (!rest.length) {
|
|
100
|
+
// globstar leaves are always selected
|
|
101
|
+
return [
|
|
102
|
+
{
|
|
103
|
+
value: arrayToPath(currPath),
|
|
104
|
+
matches: currMatches
|
|
105
|
+
}
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
if (key === Character.WILDCARD) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
// value is a primitive, paths being traversed from here might be in their prototype,
|
|
114
|
+
// return the entire path
|
|
115
|
+
return [
|
|
116
|
+
{
|
|
117
|
+
value: arrayToPath([
|
|
118
|
+
...currPath,
|
|
119
|
+
...segments
|
|
120
|
+
]),
|
|
121
|
+
matches: currMatches
|
|
122
|
+
}
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
// Use a non-null value so that non-existing fields are still selected
|
|
126
|
+
data = data || {};
|
|
127
|
+
if (key === Character.WILDCARD) {
|
|
128
|
+
return Object.keys(data).flatMap((key)=>expandPathVerboseInternal(data[key], arrayToPath(rest), currPath.concat(key), currMatches.concat(key)));
|
|
129
|
+
}
|
|
130
|
+
if (key === Character.GLOBSTAR) {
|
|
131
|
+
return Object.keys(data).flatMap((key)=>{
|
|
132
|
+
const nextPath = currPath.concat(key);
|
|
133
|
+
const value = data[key];
|
|
134
|
+
// recursively find matching sub-paths & skip the first remaining segment, if it matches the current key
|
|
135
|
+
const children = expandPathVerboseInternal(value, arrayToPath(segments), nextPath, [
|
|
136
|
+
key
|
|
137
|
+
]).concat(rest[0] === key ? expandPathVerboseInternal(value, arrayToPath(rest.slice(1)), nextPath, []) : []);
|
|
138
|
+
const pathMatches = [];
|
|
139
|
+
const output = [];
|
|
140
|
+
for(let i = 0; i < children.length; i++){
|
|
141
|
+
/* istanbul ignore next */ if (pathMatches.indexOf(children[i].value) !== -1) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
pathMatches.push(children[i].value);
|
|
145
|
+
output.push({
|
|
146
|
+
value: children[i].value,
|
|
147
|
+
matches: children[i].matches.length > 0 ? [
|
|
148
|
+
...currMatches,
|
|
149
|
+
children[i].matches.flat()
|
|
150
|
+
] : currMatches
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return output;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return expandPathVerboseInternal(data[key], rest, currPath.concat(key), currMatches);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Verbose expand wildcard and glob patterns.
|
|
160
|
+
* Track wildcard/glob pattern matches.
|
|
161
|
+
*
|
|
162
|
+
* @param data
|
|
163
|
+
* @param path
|
|
164
|
+
*/ function expandPathVerbose(data, path) {
|
|
165
|
+
return expandPathVerboseInternal(data, path);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Expand wildcard and glob patterns to paths.
|
|
169
|
+
*
|
|
170
|
+
* @param data
|
|
171
|
+
* @param path
|
|
172
|
+
*/ function expandPath(data, path) {
|
|
173
|
+
return expandPathVerbose(data, path).map((el)=>el.value);
|
|
174
|
+
}
|
|
175
|
+
|
|
65
176
|
function getPathValue(data, path) {
|
|
66
177
|
const parts = Array.isArray(path) ? path : pathToArray(path);
|
|
67
178
|
let res;
|
|
@@ -86,6 +197,35 @@ function getPathValue(data, path) {
|
|
|
86
197
|
return res;
|
|
87
198
|
}
|
|
88
199
|
|
|
200
|
+
const NUMBER_REGEX = /^\d+$/;
|
|
201
|
+
function setPathValue(data, path, value) {
|
|
202
|
+
const parts = Array.isArray(path) ? path : pathToArray(path);
|
|
203
|
+
let temp = data;
|
|
204
|
+
let index = 0;
|
|
205
|
+
while(index < parts.length){
|
|
206
|
+
/* istanbul ignore next */ if (!Array.isArray(temp) && !isObject(temp)) {
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
const key = parts[index];
|
|
210
|
+
// [foo, '0']
|
|
211
|
+
if (typeof temp[key] === 'undefined') {
|
|
212
|
+
const match = NUMBER_REGEX.test(key);
|
|
213
|
+
if (match) {
|
|
214
|
+
temp[key] = [];
|
|
215
|
+
} else {
|
|
216
|
+
temp[key] = {};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (index === parts.length - 1) {
|
|
220
|
+
temp[key] = value;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
index++;
|
|
224
|
+
temp = temp[key];
|
|
225
|
+
}
|
|
226
|
+
return data;
|
|
227
|
+
}
|
|
228
|
+
|
|
89
229
|
class PathInfo {
|
|
90
230
|
get value() {
|
|
91
231
|
if (typeof this._value !== 'undefined') {
|
|
@@ -113,10 +253,9 @@ class PathInfo {
|
|
|
113
253
|
return this._parent;
|
|
114
254
|
}
|
|
115
255
|
if (this.pathParts.length > 1) {
|
|
116
|
-
|
|
117
|
-
this._parent = new PathInfo(this.data, arrayToPath(parentPathParts));
|
|
256
|
+
this._parent = new PathInfo(this.data, this.pathParts.slice(0, this.pathParts.length - 1));
|
|
118
257
|
} else {
|
|
119
|
-
this._parent = new PathInfo(this.data);
|
|
258
|
+
this._parent = new PathInfo(this.data, []);
|
|
120
259
|
}
|
|
121
260
|
return this._parent;
|
|
122
261
|
}
|
|
@@ -137,8 +276,11 @@ class PathInfo {
|
|
|
137
276
|
}
|
|
138
277
|
constructor(data, path){
|
|
139
278
|
this.data = data;
|
|
140
|
-
|
|
141
|
-
|
|
279
|
+
if (Array.isArray(path)) {
|
|
280
|
+
this.pathParts = path;
|
|
281
|
+
} else {
|
|
282
|
+
this.pathParts = pathToArray(path);
|
|
283
|
+
}
|
|
142
284
|
}
|
|
143
285
|
}
|
|
144
286
|
|
|
@@ -146,46 +288,11 @@ function getPathInfo(data, path) {
|
|
|
146
288
|
return new PathInfo(data, path);
|
|
147
289
|
}
|
|
148
290
|
|
|
149
|
-
/*
|
|
150
|
-
* Copyright (c) 2024.
|
|
151
|
-
* Author Peter Placzek (tada5hi)
|
|
152
|
-
* For the full copyright and license information,
|
|
153
|
-
* view the LICENSE file that was distributed with this source code.
|
|
154
|
-
*/ function isObject(input) {
|
|
155
|
-
return !!input && typeof input === 'object' && !Array.isArray(input);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const NUMBER_REGEX = /^\d+$/;
|
|
159
|
-
function setPathValue(data, path, value) {
|
|
160
|
-
const parts = Array.isArray(path) ? path : pathToArray(path);
|
|
161
|
-
let temp = data;
|
|
162
|
-
let index = 0;
|
|
163
|
-
while(index < parts.length){
|
|
164
|
-
/* istanbul ignore next */ if (!Array.isArray(temp) && !isObject(temp)) {
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
const key = parts[index];
|
|
168
|
-
// [foo, '0']
|
|
169
|
-
if (typeof temp[key] === 'undefined') {
|
|
170
|
-
const match = NUMBER_REGEX.test(key);
|
|
171
|
-
if (match) {
|
|
172
|
-
temp[key] = [];
|
|
173
|
-
} else {
|
|
174
|
-
temp[key] = {};
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (index === parts.length - 1) {
|
|
178
|
-
temp[key] = value;
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
index++;
|
|
182
|
-
temp = temp[key];
|
|
183
|
-
}
|
|
184
|
-
return data;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
291
|
exports.BRACKET_NUMBER_REGEX = BRACKET_NUMBER_REGEX;
|
|
292
|
+
exports.PathInfo = PathInfo;
|
|
188
293
|
exports.arrayToPath = arrayToPath;
|
|
294
|
+
exports.expandPath = expandPath;
|
|
295
|
+
exports.expandPathVerbose = expandPathVerbose;
|
|
189
296
|
exports.getPathInfo = getPathInfo;
|
|
190
297
|
exports.getPathValue = getPathValue;
|
|
191
298
|
exports.pathToArray = pathToArray;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/helpers/array-to-path.ts","../src/helpers/path-to-array.ts","../src/get-path-value.ts","../src/path-info.ts","../src/get-path-info.ts","../src/utils/is-object.ts","../src/set-path-value.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * @see https://github.com/express-validator/express-validator/blob/bec1dcbaa29002dcd21093ec84818c4671063b5d/src/field-selection.ts#L214\n * @param parts\n */\nexport function arrayToPath(parts: readonly string[]) : string {\n return parts.reduce((prev, segment) => {\n let part = '';\n segment = segment === '\\\\*' ? '*' : segment;\n\n segment = segment.replace(/^\\[(\\d+)]$/g, '\\\\[$1]');\n segment = segment.replace(/\\./g, '\\\\.');\n\n if (/^\\d+$/.test(segment)) {\n // Index access\n part = `[${segment}]`;\n } else if (prev) {\n // Object key access\n part = `.${segment}`;\n } else {\n // Top level key\n part = segment;\n }\n\n return prev + part;\n }, '');\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const BRACKET_NUMBER_REGEX = /(?<!\\\\)\\[(\\d+)]$/;\n\n/**\n * Convert string to property path array.\n *\n * @see https://github.com/lodash/lodash/blob/main/src/.internal/stringToPath.ts\n * @see https://github.com/chaijs/pathval\n *\n * @param segment\n */\nexport function pathToArray(segment: string) : string[] {\n const str = segment.replace(/([^\\\\])\\[/g, '$1.[');\n const parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n if (!parts) {\n return [];\n }\n\n const result : string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n if (\n parts[i] === 'constructor' ||\n parts[i] === '__proto__' ||\n parts[i] === 'prototype'\n ) {\n continue;\n }\n\n const regex = BRACKET_NUMBER_REGEX.exec(parts[i]);\n if (regex) {\n result.push(regex[1]);\n } else {\n result.push(parts[i].replace(/\\\\([.[\\]])/g, '$1'));\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from './helpers';\n\nexport function getPathValue(\n data: unknown,\n path: string | string[],\n): unknown {\n const parts = Array.isArray(path) ? path : pathToArray(path);\n\n let res : unknown | undefined;\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n if (temp === null || typeof temp === 'undefined') {\n break;\n }\n\n if (parts[index] in Object(temp)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n temp = temp[parts[index]];\n } else {\n break;\n }\n\n if (index === parts.length - 1) {\n res = temp;\n }\n\n index++;\n }\n\n return res;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { getPathValue } from './get-path-value';\nimport { arrayToPath, pathToArray } from './helpers';\n\nexport class PathInfo {\n protected data: unknown;\n\n protected path : string | undefined;\n\n protected pathParts: string[];\n\n protected _value: unknown;\n\n protected _parent: PathInfo | null | undefined;\n\n protected _exists: boolean | undefined;\n\n constructor(data: unknown, path?: string) {\n this.data = data;\n this.path = path;\n this.pathParts = this.path ?\n pathToArray(this.path) :\n [];\n }\n\n get value() {\n if (typeof this._value !== 'undefined') {\n return this._value;\n }\n\n if (this.pathParts.length > 0) {\n this._value = getPathValue(this.data, this.pathParts);\n } else {\n this._value = this.data;\n }\n\n return this._value;\n }\n\n get name() : string | null {\n if (this.pathParts.length > 0) {\n return this.pathParts[this.pathParts.length - 1];\n }\n\n return null;\n }\n\n get parent() : PathInfo | null {\n if (typeof this._parent !== 'undefined') {\n return this._parent;\n }\n\n if (this.pathParts.length === 0) {\n this._parent = null;\n return this._parent;\n }\n\n if (this.pathParts.length > 1) {\n const parentPathParts = this.pathParts.slice(0, this.pathParts.length - 1);\n this._parent = new PathInfo(\n this.data,\n arrayToPath(parentPathParts),\n );\n } else {\n this._parent = new PathInfo(this.data);\n }\n\n return this._parent;\n }\n\n get exists() : boolean {\n if (typeof this._exists !== 'undefined') {\n return this._exists;\n }\n\n if (!this.name || !this.parent) {\n this._exists = true;\n return this._exists;\n }\n\n if (\n this.parent.value !== null &&\n typeof this.parent.value !== 'undefined'\n ) {\n this._exists = this.name in Object(this.parent.value);\n } else {\n this._exists = false;\n }\n\n return this._exists;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PathInfo } from './path-info';\n\nexport function getPathInfo(\n data: Record<string, any>,\n path?: string,\n) : PathInfo {\n return new PathInfo(data, path);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function isObject(input: unknown) : input is Record<string, any> {\n return !!input &&\n typeof input === 'object' &&\n !Array.isArray(input);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from './helpers';\nimport { isObject } from './utils';\n\nconst NUMBER_REGEX = /^\\d+$/;\n\nexport function setPathValue(\n data: Record<string, any> | Record<string, any>[],\n path: string | string[],\n value: unknown,\n) {\n const parts = Array.isArray(path) ? path : pathToArray(path);\n\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n /* istanbul ignore next */\n if (!Array.isArray(temp) && !isObject(temp)) {\n break;\n }\n\n const key = parts[index] as keyof typeof temp;\n\n // [foo, '0']\n if (typeof temp[key] === 'undefined') {\n const match = NUMBER_REGEX.test(key);\n if (match) {\n (temp as Record<string, any>)[key] = [];\n } else {\n temp[key] = {};\n }\n }\n\n if (index === parts.length - 1) {\n temp[key] = value;\n break;\n }\n\n index++;\n temp = temp[key];\n }\n\n return data;\n}\n"],"names":["arrayToPath","parts","reduce","prev","segment","part","replace","test","BRACKET_NUMBER_REGEX","pathToArray","str","match","result","i","length","regex","exec","push","getPathValue","data","path","Array","isArray","res","temp","index","Object","PathInfo","value","_value","pathParts","name","parent","_parent","parentPathParts","slice","exists","_exists","constructor","getPathInfo","isObject","input","NUMBER_REGEX","setPathValue","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/helpers/array-to-path.ts","../src/helpers/path-to-array.ts","../src/path-expand/constants.ts","../src/utils/is-object.ts","../src/path-expand/module.ts","../src/path-value/get.ts","../src/path-value/set.ts","../src/path-info/module.ts","../src/path-info/helper.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * @see https://github.com/express-validator/express-validator/blob/bec1dcbaa29002dcd21093ec84818c4671063b5d/src/field-selection.ts#L214\n * @param parts\n */\nexport function arrayToPath(parts: readonly string[]) : string {\n return parts.reduce((prev, segment) => {\n let part = '';\n\n segment = segment.replace(/^\\[(\\d+)]$/g, '\\\\[$1]');\n segment = segment.replace(/\\./g, '\\\\.');\n\n if (/^\\d+$/.test(segment)) {\n // Index access\n part = `[${segment}]`;\n } else if (prev) {\n // Object key access\n part = `.${segment}`;\n } else {\n // Top level key\n part = segment;\n }\n\n return prev + part;\n }, '');\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const BRACKET_NUMBER_REGEX = /(?<!\\\\)\\[(\\d+)]$/;\n\n/**\n * Convert string to property path array.\n *\n * @see https://github.com/lodash/lodash/blob/main/src/.internal/stringToPath.ts\n * @see https://github.com/chaijs/pathval\n *\n * @param segment\n */\nexport function pathToArray(segment: string) : string[] {\n const str = segment.replace(/([^\\\\])\\[/g, '$1.[');\n const parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n if (!parts) {\n return [];\n }\n\n const result : string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n if (\n parts[i] === 'constructor' ||\n parts[i] === '__proto__' ||\n parts[i] === 'prototype'\n ) {\n continue;\n }\n\n const regex = BRACKET_NUMBER_REGEX.exec(parts[i]);\n if (regex) {\n result.push(regex[1]);\n } else {\n result.push(parts[i].replace(/\\\\([.[\\]])/g, '$1'));\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum Character {\n WILDCARD = '*',\n GLOBSTAR = '**',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function isObject(input: unknown) : input is Record<string, any> {\n return !!input &&\n typeof input === 'object' &&\n !Array.isArray(input);\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Character } from './constants';\nimport type { PathExpanded } from './types';\nimport { isObject } from '../utils';\nimport { arrayToPath, pathToArray } from '../helpers';\n\nfunction expandPathVerboseInternal(\n data: Record<string, any>,\n path: string | string[],\n currPath: readonly string[] = [],\n currMatches: readonly (string | string[])[] = [],\n): PathExpanded[] {\n const segments = Array.isArray(path) ? path : pathToArray(path);\n if (!segments.length) {\n // no more paths to traverse\n return [\n {\n value: arrayToPath(currPath),\n matches: currMatches,\n },\n ];\n }\n\n const key = segments[0];\n const rest = segments.slice(1);\n\n if (\n typeof data !== 'undefined' &&\n data !== null &&\n !isObject(data) &&\n !Array.isArray(data)\n ) {\n if (key === Character.GLOBSTAR) {\n if (!rest.length) {\n // globstar leaves are always selected\n return [\n {\n value: arrayToPath(currPath),\n matches: currMatches,\n },\n ];\n }\n\n return [];\n }\n\n if (key === Character.WILDCARD) {\n return [];\n }\n\n // value is a primitive, paths being traversed from here might be in their prototype,\n // return the entire path\n return [{ value: arrayToPath([...currPath, ...segments]), matches: currMatches }];\n }\n\n // Use a non-null value so that non-existing fields are still selected\n data = data || {};\n\n if (key === Character.WILDCARD) {\n return Object.keys(data)\n .flatMap((key) => expandPathVerboseInternal(\n data[key],\n arrayToPath(rest),\n currPath.concat(key),\n currMatches.concat(key),\n ));\n }\n\n if (key === Character.GLOBSTAR) {\n return Object.keys(data)\n .flatMap((key) => {\n const nextPath = currPath.concat(key);\n const value = data[key];\n\n // recursively find matching sub-paths & skip the first remaining segment, if it matches the current key\n const children = expandPathVerboseInternal(value, arrayToPath(segments), nextPath, [key])\n .concat(rest[0] === key ? expandPathVerboseInternal(value, arrayToPath(rest.slice(1)), nextPath, []) : []);\n\n const pathMatches : string[] = [];\n const output : PathExpanded[] = [];\n for (let i = 0; i < children.length; i++) {\n /* istanbul ignore next */\n if (pathMatches.indexOf(children[i].value) !== -1) {\n continue;\n }\n\n pathMatches.push(children[i].value);\n\n output.push({\n value: children[i].value,\n matches: children[i].matches.length > 0 ?\n [...currMatches, children[i].matches.flat()] :\n currMatches,\n });\n }\n\n return output;\n });\n }\n\n return expandPathVerboseInternal(data[key], rest, currPath.concat(key), currMatches);\n}\n\n/**\n * Verbose expand wildcard and glob patterns.\n * Track wildcard/glob pattern matches.\n *\n * @param data\n * @param path\n */\nexport function expandPathVerbose(\n data: Record<string, any>,\n path: string | string[],\n): PathExpanded[] {\n return expandPathVerboseInternal(data, path);\n}\n\n/**\n * Expand wildcard and glob patterns to paths.\n *\n * @param data\n * @param path\n */\nexport function expandPath(\n data: Record<string, any>,\n path: string | string[],\n): string[] {\n return expandPathVerbose(data, path)\n .map((el) => el.value);\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from '../helpers';\n\nexport function getPathValue(\n data: unknown,\n path: string | string[],\n): unknown {\n const parts = Array.isArray(path) ?\n path :\n pathToArray(path);\n\n let res : unknown | undefined;\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n if (temp === null || typeof temp === 'undefined') {\n break;\n }\n\n if (parts[index] in Object(temp)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n temp = temp[parts[index]];\n } else {\n break;\n }\n\n if (index === parts.length - 1) {\n res = temp;\n }\n\n index++;\n }\n\n return res;\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from '../helpers';\nimport { isObject } from '../utils';\n\nconst NUMBER_REGEX = /^\\d+$/;\n\nexport function setPathValue(\n data: Record<string, any> | Record<string, any>[],\n path: string | string[],\n value: unknown,\n) {\n const parts = Array.isArray(path) ?\n path :\n pathToArray(path);\n\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n /* istanbul ignore next */\n if (!Array.isArray(temp) && !isObject(temp)) {\n break;\n }\n\n const key = parts[index] as keyof typeof temp;\n\n // [foo, '0']\n if (typeof temp[key] === 'undefined') {\n const match = NUMBER_REGEX.test(key);\n if (match) {\n (temp as Record<string, any>)[key] = [];\n } else {\n temp[key] = {};\n }\n }\n\n if (index === parts.length - 1) {\n temp[key] = value;\n break;\n }\n\n index++;\n temp = temp[key];\n }\n\n return data;\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { getPathValue } from '../path-value/get';\nimport { pathToArray } from '../helpers';\n\nexport class PathInfo {\n protected data: unknown;\n\n protected pathParts: string[];\n\n protected _value: unknown;\n\n protected _parent: PathInfo | null | undefined;\n\n protected _exists: boolean | undefined;\n\n constructor(data: unknown, path: string | string[]) {\n this.data = data;\n\n if (Array.isArray(path)) {\n this.pathParts = path;\n } else {\n this.pathParts = pathToArray(path);\n }\n }\n\n get value() {\n if (typeof this._value !== 'undefined') {\n return this._value;\n }\n\n if (this.pathParts.length > 0) {\n this._value = getPathValue(this.data, this.pathParts);\n } else {\n this._value = this.data;\n }\n\n return this._value;\n }\n\n get name() : string | null {\n if (this.pathParts.length > 0) {\n return this.pathParts[this.pathParts.length - 1];\n }\n\n return null;\n }\n\n get parent() : PathInfo | null {\n if (typeof this._parent !== 'undefined') {\n return this._parent;\n }\n\n if (this.pathParts.length === 0) {\n this._parent = null;\n return this._parent;\n }\n\n if (this.pathParts.length > 1) {\n this._parent = new PathInfo(\n this.data,\n this.pathParts.slice(0, this.pathParts.length - 1),\n );\n } else {\n this._parent = new PathInfo(this.data, []);\n }\n\n return this._parent;\n }\n\n get exists() : boolean {\n if (typeof this._exists !== 'undefined') {\n return this._exists;\n }\n\n if (!this.name || !this.parent) {\n this._exists = true;\n return this._exists;\n }\n\n if (\n this.parent.value !== null &&\n typeof this.parent.value !== 'undefined'\n ) {\n this._exists = this.name in Object(this.parent.value);\n } else {\n this._exists = false;\n }\n\n return this._exists;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PathInfo } from './module';\n\nexport function getPathInfo(\n data: Record<string, any>,\n path: string | string[],\n) : PathInfo {\n return new PathInfo(data, path);\n}\n"],"names":["arrayToPath","parts","reduce","prev","segment","part","replace","test","BRACKET_NUMBER_REGEX","pathToArray","str","match","result","i","length","regex","exec","push","Character","isObject","input","Array","isArray","expandPathVerboseInternal","data","path","currPath","currMatches","segments","value","matches","key","rest","slice","GLOBSTAR","WILDCARD","Object","keys","flatMap","concat","nextPath","children","pathMatches","output","indexOf","flat","expandPathVerbose","expandPath","map","el","getPathValue","res","temp","index","NUMBER_REGEX","setPathValue","PathInfo","_value","pathParts","name","parent","_parent","exists","_exists","constructor","getPathInfo"],"mappings":";;AAAA;;;;;;;;IAWO,SAASA,WAAAA,CAAYC,KAAwB,EAAA;AAChD,IAAA,OAAOA,KAAMC,CAAAA,MAAM,CAAC,CAACC,IAAMC,EAAAA,OAAAA,GAAAA;AACvB,QAAA,IAAIC,IAAO,GAAA,EAAA,CAAA;QAEXD,OAAUA,GAAAA,OAAAA,CAAQE,OAAO,CAAC,aAAe,EAAA,QAAA,CAAA,CAAA;QACzCF,OAAUA,GAAAA,OAAAA,CAAQE,OAAO,CAAC,KAAO,EAAA,KAAA,CAAA,CAAA;QAEjC,IAAI,OAAA,CAAQC,IAAI,CAACH,OAAU,CAAA,EAAA;;AAEvBC,YAAAA,IAAAA,GAAO,CAAC,CAAC,EAAED,OAAAA,CAAQ,CAAC,CAAC,CAAA;AACzB,SAAA,MAAO,IAAID,IAAM,EAAA;;AAEbE,YAAAA,IAAAA,GAAO,CAAC,CAAC,EAAED,OAAAA,CAAQ,CAAC,CAAA;SACjB,MAAA;;YAEHC,IAAOD,GAAAA,OAAAA,CAAAA;AACX,SAAA;AAEA,QAAA,OAAOD,IAAOE,GAAAA,IAAAA,CAAAA;KACf,EAAA,EAAA,CAAA,CAAA;AACP;;AC/BA;;;;;IAOaG,MAAAA,oBAAAA,GAAuB,MAAmB,CAAA,sBAAA,EAAA;AAEvD;;;;;;;IAQO,SAASC,WAAAA,CAAYL,OAAe,EAAA;AACvC,IAAA,MAAMM,GAAMN,GAAAA,OAAAA,CAAQE,OAAO,CAAC,YAAc,EAAA,MAAA,CAAA,CAAA;IAC1C,MAAML,KAAAA,GAAQS,GAAIC,CAAAA,KAAK,CAAC,iBAAA,CAAA,CAAA;AACxB,IAAA,IAAI,CAACV,KAAO,EAAA;AACR,QAAA,OAAO,EAAE,CAAA;AACb,KAAA;AAEA,IAAA,MAAMW,SAAoB,EAAE,CAAA;AAE5B,IAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIZ,KAAMa,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AACnC,QAAA,IACIZ,KAAK,CAACY,CAAE,CAAA,KAAK,iBACbZ,KAAK,CAACY,CAAE,CAAA,KAAK,WACbZ,IAAAA,KAAK,CAACY,CAAAA,CAAE,KAAK,WACf,EAAA;AACE,YAAA,SAAA;AACJ,SAAA;AAEA,QAAA,MAAME,QAAQP,oBAAqBQ,CAAAA,IAAI,CAACf,KAAK,CAACY,CAAE,CAAA,CAAA,CAAA;AAChD,QAAA,IAAIE,KAAO,EAAA;AACPH,YAAAA,MAAAA,CAAOK,IAAI,CAACF,KAAK,CAAC,CAAE,CAAA,CAAA,CAAA;SACjB,MAAA;YACHH,MAAOK,CAAAA,IAAI,CAAChB,KAAK,CAACY,EAAE,CAACP,OAAO,CAAC,aAAe,EAAA,IAAA,CAAA,CAAA,CAAA;AAChD,SAAA;AACJ,KAAA;IAEA,OAAOM,MAAAA,CAAAA;AACX;;AC5CA;;;;;AAKC,IAAA,IAAA,SAAA,CAAA;AAEWM,CAAAA,SAAAA,SAAAA,EAAAA;;;GAAAA,SAAAA,KAAAA,SAAAA,GAAAA,EAAAA,CAAAA,CAAAA;;ACPZ;;;;;IAOO,SAASC,QAAAA,CAASC,KAAc,EAAA;IACnC,OAAO,CAAC,CAACA,KACL,IAAA,OAAOA,UAAU,QACjB,IAAA,CAACC,KAAMC,CAAAA,OAAO,CAACF,KAAAA,CAAAA,CAAAA;AACvB;;ACCA,SAASG,yBAAAA,CACLC,IAAyB,EACzBC,IAAuB,EACvBC,QAA8B,GAAA,EAAE,EAChCC,WAAAA,GAA8C,EAAE,EAAA;AAEhD,IAAA,MAAMC,WAAWP,KAAMC,CAAAA,OAAO,CAACG,IAAAA,CAAAA,GAAQA,OAAOhB,WAAYgB,CAAAA,IAAAA,CAAAA,CAAAA;IAC1D,IAAI,CAACG,QAASd,CAAAA,MAAM,EAAE;;QAElB,OAAO;AACH,YAAA;AACIe,gBAAAA,KAAAA,EAAO7B,WAAY0B,CAAAA,QAAAA,CAAAA;gBACnBI,OAASH,EAAAA,WAAAA;AACb,aAAA;AACH,SAAA,CAAA;AACL,KAAA;IAEA,MAAMI,GAAAA,GAAMH,QAAQ,CAAC,CAAE,CAAA,CAAA;IACvB,MAAMI,IAAAA,GAAOJ,QAASK,CAAAA,KAAK,CAAC,CAAA,CAAA,CAAA;AAE5B,IAAA,IACI,OAAOT,IAAAA,KAAS,WAChBA,IAAAA,IAAAA,KAAS,IACT,IAAA,CAACL,QAASK,CAAAA,IAAAA,CAAAA,IACV,CAACH,KAAAA,CAAMC,OAAO,CAACE,IACjB,CAAA,EAAA;QACE,IAAIO,GAAAA,KAAQb,SAAUgB,CAAAA,QAAQ,EAAE;YAC5B,IAAI,CAACF,IAAKlB,CAAAA,MAAM,EAAE;;gBAEd,OAAO;AACH,oBAAA;AACIe,wBAAAA,KAAAA,EAAO7B,WAAY0B,CAAAA,QAAAA,CAAAA;wBACnBI,OAASH,EAAAA,WAAAA;AACb,qBAAA;AACH,iBAAA,CAAA;AACL,aAAA;AAEA,YAAA,OAAO,EAAE,CAAA;AACb,SAAA;QAEA,IAAII,GAAAA,KAAQb,SAAUiB,CAAAA,QAAQ,EAAE;AAC5B,YAAA,OAAO,EAAE,CAAA;AACb,SAAA;;;QAIA,OAAO;AAAC,YAAA;AAAEN,gBAAAA,KAAAA,EAAO7B,WAAY,CAAA;AAAI0B,oBAAAA,GAAAA,QAAAA;AAAaE,oBAAAA,GAAAA,QAAAA;AAAS,iBAAA,CAAA;gBAAGE,OAASH,EAAAA,WAAAA;AAAY,aAAA;AAAE,SAAA,CAAA;AACrF,KAAA;;AAGAH,IAAAA,IAAAA,GAAOA,QAAQ,EAAC,CAAA;IAEhB,IAAIO,GAAAA,KAAQb,SAAUiB,CAAAA,QAAQ,EAAE;QAC5B,OAAOC,MAAAA,CAAOC,IAAI,CAACb,IAAAA,CAAAA,CACdc,OAAO,CAAC,CAACP,MAAQR,yBACdC,CAAAA,IAAI,CAACO,GAAI,CAAA,EACT/B,YAAYgC,IACZN,CAAAA,EAAAA,QAAAA,CAASa,MAAM,CAACR,GAAAA,CAAAA,EAChBJ,WAAYY,CAAAA,MAAM,CAACR,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAE/B,KAAA;IAEA,IAAIA,GAAAA,KAAQb,SAAUgB,CAAAA,QAAQ,EAAE;AAC5B,QAAA,OAAOE,OAAOC,IAAI,CAACb,IACdc,CAAAA,CAAAA,OAAO,CAAC,CAACP,GAAAA,GAAAA;YACN,MAAMS,QAAAA,GAAWd,QAASa,CAAAA,MAAM,CAACR,GAAAA,CAAAA,CAAAA;YACjC,MAAMF,KAAAA,GAAQL,IAAI,CAACO,GAAI,CAAA,CAAA;;AAGvB,YAAA,MAAMU,QAAWlB,GAAAA,yBAAAA,CAA0BM,KAAO7B,EAAAA,WAAAA,CAAY4B,WAAWY,QAAU,EAAA;AAACT,gBAAAA,GAAAA;AAAI,aAAA,CAAA,CACnFQ,MAAM,CAACP,IAAI,CAAC,CAAA,CAAE,KAAKD,GAAMR,GAAAA,yBAAAA,CAA0BM,KAAO7B,EAAAA,WAAAA,CAAYgC,KAAKC,KAAK,CAAC,KAAKO,QAAU,EAAA,EAAE,IAAI,EAAE,CAAA,CAAA;AAE7G,YAAA,MAAME,cAAyB,EAAE,CAAA;AACjC,YAAA,MAAMC,SAA0B,EAAE,CAAA;AAClC,YAAA,IAAK,IAAI9B,CAAI,GAAA,CAAA,EAAGA,IAAI4B,QAAS3B,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AACtC,2CACA,IAAI6B,WAAYE,CAAAA,OAAO,CAACH,QAAQ,CAAC5B,CAAAA,CAAE,CAACgB,KAAK,CAAM,KAAA,CAAC,CAAG,EAAA;AAC/C,oBAAA,SAAA;AACJ,iBAAA;AAEAa,gBAAAA,WAAAA,CAAYzB,IAAI,CAACwB,QAAQ,CAAC5B,CAAAA,CAAE,CAACgB,KAAK,CAAA,CAAA;AAElCc,gBAAAA,MAAAA,CAAO1B,IAAI,CAAC;AACRY,oBAAAA,KAAAA,EAAOY,QAAQ,CAAC5B,CAAE,CAAA,CAACgB,KAAK;oBACxBC,OAASW,EAAAA,QAAQ,CAAC5B,CAAE,CAAA,CAACiB,OAAO,CAAChB,MAAM,GAAG,CAClC,GAAA;AAAIa,wBAAAA,GAAAA,WAAAA;AAAac,wBAAAA,QAAQ,CAAC5B,CAAAA,CAAE,CAACiB,OAAO,CAACe,IAAI,EAAA;qBAAG,GAC5ClB,WAAAA;AACR,iBAAA,CAAA,CAAA;AACJ,aAAA;YAEA,OAAOgB,MAAAA,CAAAA;AACX,SAAA,CAAA,CAAA;AACR,KAAA;IAEA,OAAOpB,yBAAAA,CAA0BC,IAAI,CAACO,GAAAA,CAAI,EAAEC,IAAMN,EAAAA,QAAAA,CAASa,MAAM,CAACR,GAAMJ,CAAAA,EAAAA,WAAAA,CAAAA,CAAAA;AAC5E,CAAA;AAEA;;;;;;AAMC,IACM,SAASmB,iBACZtB,CAAAA,IAAyB,EACzBC,IAAuB,EAAA;AAEvB,IAAA,OAAOF,0BAA0BC,IAAMC,EAAAA,IAAAA,CAAAA,CAAAA;AAC3C,CAAA;AAEA;;;;;AAKC,IACM,SAASsB,UACZvB,CAAAA,IAAyB,EACzBC,IAAuB,EAAA;IAEvB,OAAOqB,iBAAAA,CAAkBtB,MAAMC,IAC1BuB,CAAAA,CAAAA,GAAG,CAAC,CAACC,EAAAA,GAAOA,GAAGpB,KAAK,CAAA,CAAA;AAC7B;;AC9HO,SAASqB,YAAAA,CACZ1B,IAAa,EACbC,IAAuB,EAAA;AAEvB,IAAA,MAAMxB,QAAQoB,KAAMC,CAAAA,OAAO,CAACG,IAAAA,CAAAA,GACxBA,OACAhB,WAAYgB,CAAAA,IAAAA,CAAAA,CAAAA;IAEhB,IAAI0B,GAAAA,CAAAA;AACJ,IAAA,IAAIC,IAAO5B,GAAAA,IAAAA,CAAAA;AACX,IAAA,IAAI6B,KAAQ,GAAA,CAAA,CAAA;IACZ,MAAOA,KAAAA,GAAQpD,KAAMa,CAAAA,MAAM,CAAE;AACzB,QAAA,IAAIsC,IAAS,KAAA,IAAA,IAAQ,OAAOA,IAAAA,KAAS,WAAa,EAAA;AAC9C,YAAA,MAAA;AACJ,SAAA;AAEA,QAAA,IAAInD,KAAK,CAACoD,KAAM,CAAA,IAAIjB,OAAOgB,IAAO,CAAA,EAAA;;;AAG9BA,YAAAA,IAAAA,GAAOA,IAAI,CAACnD,KAAK,CAACoD,MAAM,CAAC,CAAA;SACtB,MAAA;AACH,YAAA,MAAA;AACJ,SAAA;AAEA,QAAA,IAAIA,KAAUpD,KAAAA,KAAAA,CAAMa,MAAM,GAAG,CAAG,EAAA;YAC5BqC,GAAMC,GAAAA,IAAAA,CAAAA;AACV,SAAA;AAEAC,QAAAA,KAAAA,EAAAA,CAAAA;AACJ,KAAA;IAEA,OAAOF,GAAAA,CAAAA;AACX;;AC/BA,MAAMG,YAAe,GAAA,OAAA,CAAA;AAEd,SAASC,YACZ/B,CAAAA,IAAiD,EACjDC,IAAuB,EACvBI,KAAc,EAAA;AAEd,IAAA,MAAM5B,QAAQoB,KAAMC,CAAAA,OAAO,CAACG,IAAAA,CAAAA,GACxBA,OACAhB,WAAYgB,CAAAA,IAAAA,CAAAA,CAAAA;AAEhB,IAAA,IAAI2B,IAAO5B,GAAAA,IAAAA,CAAAA;AACX,IAAA,IAAI6B,KAAQ,GAAA,CAAA,CAAA;IACZ,MAAOA,KAAAA,GAAQpD,KAAMa,CAAAA,MAAM,CAAE;mCAEzB,IAAI,CAACO,KAAAA,CAAMC,OAAO,CAAC8B,IAAAA,CAAAA,IAAS,CAACjC,QAAAA,CAASiC,IAAO,CAAA,EAAA;AACzC,YAAA,MAAA;AACJ,SAAA;QAEA,MAAMrB,GAAAA,GAAM9B,KAAK,CAACoD,KAAM,CAAA,CAAA;;AAGxB,QAAA,IAAI,OAAOD,IAAI,CAACrB,GAAAA,CAAI,KAAK,WAAa,EAAA;YAClC,MAAMpB,KAAAA,GAAQ2C,YAAa/C,CAAAA,IAAI,CAACwB,GAAAA,CAAAA,CAAAA;AAChC,YAAA,IAAIpB,KAAO,EAAA;gBACNyC,IAA4B,CAACrB,GAAI,CAAA,GAAG,EAAE,CAAA;aACpC,MAAA;gBACHqB,IAAI,CAACrB,GAAI,CAAA,GAAG,EAAC,CAAA;AACjB,aAAA;AACJ,SAAA;AAEA,QAAA,IAAIsB,KAAUpD,KAAAA,KAAAA,CAAMa,MAAM,GAAG,CAAG,EAAA;YAC5BsC,IAAI,CAACrB,IAAI,GAAGF,KAAAA,CAAAA;AACZ,YAAA,MAAA;AACJ,SAAA;AAEAwB,QAAAA,KAAAA,EAAAA,CAAAA;QACAD,IAAOA,GAAAA,IAAI,CAACrB,GAAI,CAAA,CAAA;AACpB,KAAA;IAEA,OAAOP,IAAAA,CAAAA;AACX;;ACzCO,MAAMgC,QAAAA,CAAAA;AAqBT,IAAA,IAAI3B,KAAQ,GAAA;AACR,QAAA,IAAI,OAAO,IAAI,CAAC4B,MAAM,KAAK,WAAa,EAAA;YACpC,OAAO,IAAI,CAACA,MAAM,CAAA;AACtB,SAAA;AAEA,QAAA,IAAI,IAAI,CAACC,SAAS,CAAC5C,MAAM,GAAG,CAAG,EAAA;YAC3B,IAAI,CAAC2C,MAAM,GAAGP,YAAa,CAAA,IAAI,CAAC1B,IAAI,EAAE,IAAI,CAACkC,SAAS,CAAA,CAAA;SACjD,MAAA;AACH,YAAA,IAAI,CAACD,MAAM,GAAG,IAAI,CAACjC,IAAI,CAAA;AAC3B,SAAA;QAEA,OAAO,IAAI,CAACiC,MAAM,CAAA;AACtB,KAAA;AAEA,IAAA,IAAIE,IAAuB,GAAA;AACvB,QAAA,IAAI,IAAI,CAACD,SAAS,CAAC5C,MAAM,GAAG,CAAG,EAAA;YAC3B,OAAO,IAAI,CAAC4C,SAAS,CAAC,IAAI,CAACA,SAAS,CAAC5C,MAAM,GAAG,CAAE,CAAA,CAAA;AACpD,SAAA;QAEA,OAAO,IAAA,CAAA;AACX,KAAA;AAEA,IAAA,IAAI8C,MAA2B,GAAA;AAC3B,QAAA,IAAI,OAAO,IAAI,CAACC,OAAO,KAAK,WAAa,EAAA;YACrC,OAAO,IAAI,CAACA,OAAO,CAAA;AACvB,SAAA;AAEA,QAAA,IAAI,IAAI,CAACH,SAAS,CAAC5C,MAAM,KAAK,CAAG,EAAA;YAC7B,IAAI,CAAC+C,OAAO,GAAG,IAAA,CAAA;YACf,OAAO,IAAI,CAACA,OAAO,CAAA;AACvB,SAAA;AAEA,QAAA,IAAI,IAAI,CAACH,SAAS,CAAC5C,MAAM,GAAG,CAAG,EAAA;YAC3B,IAAI,CAAC+C,OAAO,GAAG,IAAIL,SACf,IAAI,CAAChC,IAAI,EACT,IAAI,CAACkC,SAAS,CAACzB,KAAK,CAAC,CAAA,EAAG,IAAI,CAACyB,SAAS,CAAC5C,MAAM,GAAG,CAAA,CAAA,CAAA,CAAA;SAEjD,MAAA;YACH,IAAI,CAAC+C,OAAO,GAAG,IAAIL,SAAS,IAAI,CAAChC,IAAI,EAAE,EAAE,CAAA,CAAA;AAC7C,SAAA;QAEA,OAAO,IAAI,CAACqC,OAAO,CAAA;AACvB,KAAA;AAEA,IAAA,IAAIC,MAAmB,GAAA;AACnB,QAAA,IAAI,OAAO,IAAI,CAACC,OAAO,KAAK,WAAa,EAAA;YACrC,OAAO,IAAI,CAACA,OAAO,CAAA;AACvB,SAAA;QAEA,IAAI,CAAC,IAAI,CAACJ,IAAI,IAAI,CAAC,IAAI,CAACC,MAAM,EAAE;YAC5B,IAAI,CAACG,OAAO,GAAG,IAAA,CAAA;YACf,OAAO,IAAI,CAACA,OAAO,CAAA;AACvB,SAAA;AAEA,QAAA,IACI,IAAI,CAACH,MAAM,CAAC/B,KAAK,KAAK,IAAA,IACtB,OAAO,IAAI,CAAC+B,MAAM,CAAC/B,KAAK,KAAK,WAC/B,EAAA;AACE,YAAA,IAAI,CAACkC,OAAO,GAAG,IAAI,CAACJ,IAAI,IAAIvB,MAAAA,CAAO,IAAI,CAACwB,MAAM,CAAC/B,KAAK,CAAA,CAAA;SACjD,MAAA;YACH,IAAI,CAACkC,OAAO,GAAG,KAAA,CAAA;AACnB,SAAA;QAEA,OAAO,IAAI,CAACA,OAAO,CAAA;AACvB,KAAA;IA1EAC,WAAYxC,CAAAA,IAAa,EAAEC,IAAuB,CAAE;QAChD,IAAI,CAACD,IAAI,GAAGA,IAAAA,CAAAA;QAEZ,IAAIH,KAAAA,CAAMC,OAAO,CAACG,IAAO,CAAA,EAAA;YACrB,IAAI,CAACiC,SAAS,GAAGjC,IAAAA,CAAAA;SACd,MAAA;YACH,IAAI,CAACiC,SAAS,GAAGjD,WAAYgB,CAAAA,IAAAA,CAAAA,CAAAA;AACjC,SAAA;AACJ,KAAA;AAmEJ;;ACvFO,SAASwC,WAAAA,CACZzC,IAAyB,EACzBC,IAAuB,EAAA;IAEvB,OAAO,IAAI+B,SAAShC,IAAMC,EAAAA,IAAAA,CAAAA,CAAAA;AAC9B;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './helpers';
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
2
|
+
export * from './path-expand';
|
|
3
|
+
export * from './path-value';
|
|
4
|
+
export * from './path-info';
|
package/dist/index.mjs
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/ function arrayToPath(parts) {
|
|
10
10
|
return parts.reduce((prev, segment)=>{
|
|
11
11
|
let part = '';
|
|
12
|
-
segment = segment === '\\*' ? '*' : segment;
|
|
13
12
|
segment = segment.replace(/^\[(\d+)]$/g, '\\[$1]');
|
|
14
13
|
segment = segment.replace(/\./g, '\\.');
|
|
15
14
|
if (/^\d+$/.test(segment)) {
|
|
@@ -60,6 +59,118 @@
|
|
|
60
59
|
return result;
|
|
61
60
|
}
|
|
62
61
|
|
|
62
|
+
/*
|
|
63
|
+
* Copyright (c) 2024.
|
|
64
|
+
* Author Peter Placzek (tada5hi)
|
|
65
|
+
* For the full copyright and license information,
|
|
66
|
+
* view the LICENSE file that was distributed with this source code.
|
|
67
|
+
*/ var Character;
|
|
68
|
+
(function(Character) {
|
|
69
|
+
Character["WILDCARD"] = "*";
|
|
70
|
+
Character["GLOBSTAR"] = "**";
|
|
71
|
+
})(Character || (Character = {}));
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* Copyright (c) 2024.
|
|
75
|
+
* Author Peter Placzek (tada5hi)
|
|
76
|
+
* For the full copyright and license information,
|
|
77
|
+
* view the LICENSE file that was distributed with this source code.
|
|
78
|
+
*/ function isObject(input) {
|
|
79
|
+
return !!input && typeof input === 'object' && !Array.isArray(input);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function expandPathVerboseInternal(data, path, currPath = [], currMatches = []) {
|
|
83
|
+
const segments = Array.isArray(path) ? path : pathToArray(path);
|
|
84
|
+
if (!segments.length) {
|
|
85
|
+
// no more paths to traverse
|
|
86
|
+
return [
|
|
87
|
+
{
|
|
88
|
+
value: arrayToPath(currPath),
|
|
89
|
+
matches: currMatches
|
|
90
|
+
}
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
const key = segments[0];
|
|
94
|
+
const rest = segments.slice(1);
|
|
95
|
+
if (typeof data !== 'undefined' && data !== null && !isObject(data) && !Array.isArray(data)) {
|
|
96
|
+
if (key === Character.GLOBSTAR) {
|
|
97
|
+
if (!rest.length) {
|
|
98
|
+
// globstar leaves are always selected
|
|
99
|
+
return [
|
|
100
|
+
{
|
|
101
|
+
value: arrayToPath(currPath),
|
|
102
|
+
matches: currMatches
|
|
103
|
+
}
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
if (key === Character.WILDCARD) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
// value is a primitive, paths being traversed from here might be in their prototype,
|
|
112
|
+
// return the entire path
|
|
113
|
+
return [
|
|
114
|
+
{
|
|
115
|
+
value: arrayToPath([
|
|
116
|
+
...currPath,
|
|
117
|
+
...segments
|
|
118
|
+
]),
|
|
119
|
+
matches: currMatches
|
|
120
|
+
}
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
// Use a non-null value so that non-existing fields are still selected
|
|
124
|
+
data = data || {};
|
|
125
|
+
if (key === Character.WILDCARD) {
|
|
126
|
+
return Object.keys(data).flatMap((key)=>expandPathVerboseInternal(data[key], arrayToPath(rest), currPath.concat(key), currMatches.concat(key)));
|
|
127
|
+
}
|
|
128
|
+
if (key === Character.GLOBSTAR) {
|
|
129
|
+
return Object.keys(data).flatMap((key)=>{
|
|
130
|
+
const nextPath = currPath.concat(key);
|
|
131
|
+
const value = data[key];
|
|
132
|
+
// recursively find matching sub-paths & skip the first remaining segment, if it matches the current key
|
|
133
|
+
const children = expandPathVerboseInternal(value, arrayToPath(segments), nextPath, [
|
|
134
|
+
key
|
|
135
|
+
]).concat(rest[0] === key ? expandPathVerboseInternal(value, arrayToPath(rest.slice(1)), nextPath, []) : []);
|
|
136
|
+
const pathMatches = [];
|
|
137
|
+
const output = [];
|
|
138
|
+
for(let i = 0; i < children.length; i++){
|
|
139
|
+
/* istanbul ignore next */ if (pathMatches.indexOf(children[i].value) !== -1) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
pathMatches.push(children[i].value);
|
|
143
|
+
output.push({
|
|
144
|
+
value: children[i].value,
|
|
145
|
+
matches: children[i].matches.length > 0 ? [
|
|
146
|
+
...currMatches,
|
|
147
|
+
children[i].matches.flat()
|
|
148
|
+
] : currMatches
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return output;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return expandPathVerboseInternal(data[key], rest, currPath.concat(key), currMatches);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Verbose expand wildcard and glob patterns.
|
|
158
|
+
* Track wildcard/glob pattern matches.
|
|
159
|
+
*
|
|
160
|
+
* @param data
|
|
161
|
+
* @param path
|
|
162
|
+
*/ function expandPathVerbose(data, path) {
|
|
163
|
+
return expandPathVerboseInternal(data, path);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Expand wildcard and glob patterns to paths.
|
|
167
|
+
*
|
|
168
|
+
* @param data
|
|
169
|
+
* @param path
|
|
170
|
+
*/ function expandPath(data, path) {
|
|
171
|
+
return expandPathVerbose(data, path).map((el)=>el.value);
|
|
172
|
+
}
|
|
173
|
+
|
|
63
174
|
function getPathValue(data, path) {
|
|
64
175
|
const parts = Array.isArray(path) ? path : pathToArray(path);
|
|
65
176
|
let res;
|
|
@@ -84,6 +195,35 @@ function getPathValue(data, path) {
|
|
|
84
195
|
return res;
|
|
85
196
|
}
|
|
86
197
|
|
|
198
|
+
const NUMBER_REGEX = /^\d+$/;
|
|
199
|
+
function setPathValue(data, path, value) {
|
|
200
|
+
const parts = Array.isArray(path) ? path : pathToArray(path);
|
|
201
|
+
let temp = data;
|
|
202
|
+
let index = 0;
|
|
203
|
+
while(index < parts.length){
|
|
204
|
+
/* istanbul ignore next */ if (!Array.isArray(temp) && !isObject(temp)) {
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
const key = parts[index];
|
|
208
|
+
// [foo, '0']
|
|
209
|
+
if (typeof temp[key] === 'undefined') {
|
|
210
|
+
const match = NUMBER_REGEX.test(key);
|
|
211
|
+
if (match) {
|
|
212
|
+
temp[key] = [];
|
|
213
|
+
} else {
|
|
214
|
+
temp[key] = {};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (index === parts.length - 1) {
|
|
218
|
+
temp[key] = value;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
index++;
|
|
222
|
+
temp = temp[key];
|
|
223
|
+
}
|
|
224
|
+
return data;
|
|
225
|
+
}
|
|
226
|
+
|
|
87
227
|
class PathInfo {
|
|
88
228
|
get value() {
|
|
89
229
|
if (typeof this._value !== 'undefined') {
|
|
@@ -111,10 +251,9 @@ class PathInfo {
|
|
|
111
251
|
return this._parent;
|
|
112
252
|
}
|
|
113
253
|
if (this.pathParts.length > 1) {
|
|
114
|
-
|
|
115
|
-
this._parent = new PathInfo(this.data, arrayToPath(parentPathParts));
|
|
254
|
+
this._parent = new PathInfo(this.data, this.pathParts.slice(0, this.pathParts.length - 1));
|
|
116
255
|
} else {
|
|
117
|
-
this._parent = new PathInfo(this.data);
|
|
256
|
+
this._parent = new PathInfo(this.data, []);
|
|
118
257
|
}
|
|
119
258
|
return this._parent;
|
|
120
259
|
}
|
|
@@ -135,8 +274,11 @@ class PathInfo {
|
|
|
135
274
|
}
|
|
136
275
|
constructor(data, path){
|
|
137
276
|
this.data = data;
|
|
138
|
-
|
|
139
|
-
|
|
277
|
+
if (Array.isArray(path)) {
|
|
278
|
+
this.pathParts = path;
|
|
279
|
+
} else {
|
|
280
|
+
this.pathParts = pathToArray(path);
|
|
281
|
+
}
|
|
140
282
|
}
|
|
141
283
|
}
|
|
142
284
|
|
|
@@ -144,43 +286,5 @@ function getPathInfo(data, path) {
|
|
|
144
286
|
return new PathInfo(data, path);
|
|
145
287
|
}
|
|
146
288
|
|
|
147
|
-
|
|
148
|
-
* Copyright (c) 2024.
|
|
149
|
-
* Author Peter Placzek (tada5hi)
|
|
150
|
-
* For the full copyright and license information,
|
|
151
|
-
* view the LICENSE file that was distributed with this source code.
|
|
152
|
-
*/ function isObject(input) {
|
|
153
|
-
return !!input && typeof input === 'object' && !Array.isArray(input);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const NUMBER_REGEX = /^\d+$/;
|
|
157
|
-
function setPathValue(data, path, value) {
|
|
158
|
-
const parts = Array.isArray(path) ? path : pathToArray(path);
|
|
159
|
-
let temp = data;
|
|
160
|
-
let index = 0;
|
|
161
|
-
while(index < parts.length){
|
|
162
|
-
/* istanbul ignore next */ if (!Array.isArray(temp) && !isObject(temp)) {
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
const key = parts[index];
|
|
166
|
-
// [foo, '0']
|
|
167
|
-
if (typeof temp[key] === 'undefined') {
|
|
168
|
-
const match = NUMBER_REGEX.test(key);
|
|
169
|
-
if (match) {
|
|
170
|
-
temp[key] = [];
|
|
171
|
-
} else {
|
|
172
|
-
temp[key] = {};
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (index === parts.length - 1) {
|
|
176
|
-
temp[key] = value;
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
index++;
|
|
180
|
-
temp = temp[key];
|
|
181
|
-
}
|
|
182
|
-
return data;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export { BRACKET_NUMBER_REGEX, arrayToPath, getPathInfo, getPathValue, pathToArray, setPathValue };
|
|
289
|
+
export { BRACKET_NUMBER_REGEX, PathInfo, arrayToPath, expandPath, expandPathVerbose, getPathInfo, getPathValue, pathToArray, setPathValue };
|
|
186
290
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/helpers/array-to-path.ts","../src/helpers/path-to-array.ts","../src/get-path-value.ts","../src/path-info.ts","../src/get-path-info.ts","../src/utils/is-object.ts","../src/set-path-value.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * @see https://github.com/express-validator/express-validator/blob/bec1dcbaa29002dcd21093ec84818c4671063b5d/src/field-selection.ts#L214\n * @param parts\n */\nexport function arrayToPath(parts: readonly string[]) : string {\n return parts.reduce((prev, segment) => {\n let part = '';\n segment = segment === '\\\\*' ? '*' : segment;\n\n segment = segment.replace(/^\\[(\\d+)]$/g, '\\\\[$1]');\n segment = segment.replace(/\\./g, '\\\\.');\n\n if (/^\\d+$/.test(segment)) {\n // Index access\n part = `[${segment}]`;\n } else if (prev) {\n // Object key access\n part = `.${segment}`;\n } else {\n // Top level key\n part = segment;\n }\n\n return prev + part;\n }, '');\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const BRACKET_NUMBER_REGEX = /(?<!\\\\)\\[(\\d+)]$/;\n\n/**\n * Convert string to property path array.\n *\n * @see https://github.com/lodash/lodash/blob/main/src/.internal/stringToPath.ts\n * @see https://github.com/chaijs/pathval\n *\n * @param segment\n */\nexport function pathToArray(segment: string) : string[] {\n const str = segment.replace(/([^\\\\])\\[/g, '$1.[');\n const parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n if (!parts) {\n return [];\n }\n\n const result : string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n if (\n parts[i] === 'constructor' ||\n parts[i] === '__proto__' ||\n parts[i] === 'prototype'\n ) {\n continue;\n }\n\n const regex = BRACKET_NUMBER_REGEX.exec(parts[i]);\n if (regex) {\n result.push(regex[1]);\n } else {\n result.push(parts[i].replace(/\\\\([.[\\]])/g, '$1'));\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from './helpers';\n\nexport function getPathValue(\n data: unknown,\n path: string | string[],\n): unknown {\n const parts = Array.isArray(path) ? path : pathToArray(path);\n\n let res : unknown | undefined;\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n if (temp === null || typeof temp === 'undefined') {\n break;\n }\n\n if (parts[index] in Object(temp)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n temp = temp[parts[index]];\n } else {\n break;\n }\n\n if (index === parts.length - 1) {\n res = temp;\n }\n\n index++;\n }\n\n return res;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { getPathValue } from './get-path-value';\nimport { arrayToPath, pathToArray } from './helpers';\n\nexport class PathInfo {\n protected data: unknown;\n\n protected path : string | undefined;\n\n protected pathParts: string[];\n\n protected _value: unknown;\n\n protected _parent: PathInfo | null | undefined;\n\n protected _exists: boolean | undefined;\n\n constructor(data: unknown, path?: string) {\n this.data = data;\n this.path = path;\n this.pathParts = this.path ?\n pathToArray(this.path) :\n [];\n }\n\n get value() {\n if (typeof this._value !== 'undefined') {\n return this._value;\n }\n\n if (this.pathParts.length > 0) {\n this._value = getPathValue(this.data, this.pathParts);\n } else {\n this._value = this.data;\n }\n\n return this._value;\n }\n\n get name() : string | null {\n if (this.pathParts.length > 0) {\n return this.pathParts[this.pathParts.length - 1];\n }\n\n return null;\n }\n\n get parent() : PathInfo | null {\n if (typeof this._parent !== 'undefined') {\n return this._parent;\n }\n\n if (this.pathParts.length === 0) {\n this._parent = null;\n return this._parent;\n }\n\n if (this.pathParts.length > 1) {\n const parentPathParts = this.pathParts.slice(0, this.pathParts.length - 1);\n this._parent = new PathInfo(\n this.data,\n arrayToPath(parentPathParts),\n );\n } else {\n this._parent = new PathInfo(this.data);\n }\n\n return this._parent;\n }\n\n get exists() : boolean {\n if (typeof this._exists !== 'undefined') {\n return this._exists;\n }\n\n if (!this.name || !this.parent) {\n this._exists = true;\n return this._exists;\n }\n\n if (\n this.parent.value !== null &&\n typeof this.parent.value !== 'undefined'\n ) {\n this._exists = this.name in Object(this.parent.value);\n } else {\n this._exists = false;\n }\n\n return this._exists;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PathInfo } from './path-info';\n\nexport function getPathInfo(\n data: Record<string, any>,\n path?: string,\n) : PathInfo {\n return new PathInfo(data, path);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function isObject(input: unknown) : input is Record<string, any> {\n return !!input &&\n typeof input === 'object' &&\n !Array.isArray(input);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from './helpers';\nimport { isObject } from './utils';\n\nconst NUMBER_REGEX = /^\\d+$/;\n\nexport function setPathValue(\n data: Record<string, any> | Record<string, any>[],\n path: string | string[],\n value: unknown,\n) {\n const parts = Array.isArray(path) ? path : pathToArray(path);\n\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n /* istanbul ignore next */\n if (!Array.isArray(temp) && !isObject(temp)) {\n break;\n }\n\n const key = parts[index] as keyof typeof temp;\n\n // [foo, '0']\n if (typeof temp[key] === 'undefined') {\n const match = NUMBER_REGEX.test(key);\n if (match) {\n (temp as Record<string, any>)[key] = [];\n } else {\n temp[key] = {};\n }\n }\n\n if (index === parts.length - 1) {\n temp[key] = value;\n break;\n }\n\n index++;\n temp = temp[key];\n }\n\n return data;\n}\n"],"names":["arrayToPath","parts","reduce","prev","segment","part","replace","test","BRACKET_NUMBER_REGEX","pathToArray","str","match","result","i","length","regex","exec","push","getPathValue","data","path","Array","isArray","res","temp","index","Object","PathInfo","value","_value","pathParts","name","parent","_parent","parentPathParts","slice","exists","_exists","constructor","getPathInfo","isObject","input","NUMBER_REGEX","setPathValue","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/helpers/array-to-path.ts","../src/helpers/path-to-array.ts","../src/path-expand/constants.ts","../src/utils/is-object.ts","../src/path-expand/module.ts","../src/path-value/get.ts","../src/path-value/set.ts","../src/path-info/module.ts","../src/path-info/helper.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * @see https://github.com/express-validator/express-validator/blob/bec1dcbaa29002dcd21093ec84818c4671063b5d/src/field-selection.ts#L214\n * @param parts\n */\nexport function arrayToPath(parts: readonly string[]) : string {\n return parts.reduce((prev, segment) => {\n let part = '';\n\n segment = segment.replace(/^\\[(\\d+)]$/g, '\\\\[$1]');\n segment = segment.replace(/\\./g, '\\\\.');\n\n if (/^\\d+$/.test(segment)) {\n // Index access\n part = `[${segment}]`;\n } else if (prev) {\n // Object key access\n part = `.${segment}`;\n } else {\n // Top level key\n part = segment;\n }\n\n return prev + part;\n }, '');\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const BRACKET_NUMBER_REGEX = /(?<!\\\\)\\[(\\d+)]$/;\n\n/**\n * Convert string to property path array.\n *\n * @see https://github.com/lodash/lodash/blob/main/src/.internal/stringToPath.ts\n * @see https://github.com/chaijs/pathval\n *\n * @param segment\n */\nexport function pathToArray(segment: string) : string[] {\n const str = segment.replace(/([^\\\\])\\[/g, '$1.[');\n const parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n if (!parts) {\n return [];\n }\n\n const result : string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n if (\n parts[i] === 'constructor' ||\n parts[i] === '__proto__' ||\n parts[i] === 'prototype'\n ) {\n continue;\n }\n\n const regex = BRACKET_NUMBER_REGEX.exec(parts[i]);\n if (regex) {\n result.push(regex[1]);\n } else {\n result.push(parts[i].replace(/\\\\([.[\\]])/g, '$1'));\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum Character {\n WILDCARD = '*',\n GLOBSTAR = '**',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function isObject(input: unknown) : input is Record<string, any> {\n return !!input &&\n typeof input === 'object' &&\n !Array.isArray(input);\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Character } from './constants';\nimport type { PathExpanded } from './types';\nimport { isObject } from '../utils';\nimport { arrayToPath, pathToArray } from '../helpers';\n\nfunction expandPathVerboseInternal(\n data: Record<string, any>,\n path: string | string[],\n currPath: readonly string[] = [],\n currMatches: readonly (string | string[])[] = [],\n): PathExpanded[] {\n const segments = Array.isArray(path) ? path : pathToArray(path);\n if (!segments.length) {\n // no more paths to traverse\n return [\n {\n value: arrayToPath(currPath),\n matches: currMatches,\n },\n ];\n }\n\n const key = segments[0];\n const rest = segments.slice(1);\n\n if (\n typeof data !== 'undefined' &&\n data !== null &&\n !isObject(data) &&\n !Array.isArray(data)\n ) {\n if (key === Character.GLOBSTAR) {\n if (!rest.length) {\n // globstar leaves are always selected\n return [\n {\n value: arrayToPath(currPath),\n matches: currMatches,\n },\n ];\n }\n\n return [];\n }\n\n if (key === Character.WILDCARD) {\n return [];\n }\n\n // value is a primitive, paths being traversed from here might be in their prototype,\n // return the entire path\n return [{ value: arrayToPath([...currPath, ...segments]), matches: currMatches }];\n }\n\n // Use a non-null value so that non-existing fields are still selected\n data = data || {};\n\n if (key === Character.WILDCARD) {\n return Object.keys(data)\n .flatMap((key) => expandPathVerboseInternal(\n data[key],\n arrayToPath(rest),\n currPath.concat(key),\n currMatches.concat(key),\n ));\n }\n\n if (key === Character.GLOBSTAR) {\n return Object.keys(data)\n .flatMap((key) => {\n const nextPath = currPath.concat(key);\n const value = data[key];\n\n // recursively find matching sub-paths & skip the first remaining segment, if it matches the current key\n const children = expandPathVerboseInternal(value, arrayToPath(segments), nextPath, [key])\n .concat(rest[0] === key ? expandPathVerboseInternal(value, arrayToPath(rest.slice(1)), nextPath, []) : []);\n\n const pathMatches : string[] = [];\n const output : PathExpanded[] = [];\n for (let i = 0; i < children.length; i++) {\n /* istanbul ignore next */\n if (pathMatches.indexOf(children[i].value) !== -1) {\n continue;\n }\n\n pathMatches.push(children[i].value);\n\n output.push({\n value: children[i].value,\n matches: children[i].matches.length > 0 ?\n [...currMatches, children[i].matches.flat()] :\n currMatches,\n });\n }\n\n return output;\n });\n }\n\n return expandPathVerboseInternal(data[key], rest, currPath.concat(key), currMatches);\n}\n\n/**\n * Verbose expand wildcard and glob patterns.\n * Track wildcard/glob pattern matches.\n *\n * @param data\n * @param path\n */\nexport function expandPathVerbose(\n data: Record<string, any>,\n path: string | string[],\n): PathExpanded[] {\n return expandPathVerboseInternal(data, path);\n}\n\n/**\n * Expand wildcard and glob patterns to paths.\n *\n * @param data\n * @param path\n */\nexport function expandPath(\n data: Record<string, any>,\n path: string | string[],\n): string[] {\n return expandPathVerbose(data, path)\n .map((el) => el.value);\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from '../helpers';\n\nexport function getPathValue(\n data: unknown,\n path: string | string[],\n): unknown {\n const parts = Array.isArray(path) ?\n path :\n pathToArray(path);\n\n let res : unknown | undefined;\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n if (temp === null || typeof temp === 'undefined') {\n break;\n }\n\n if (parts[index] in Object(temp)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n temp = temp[parts[index]];\n } else {\n break;\n }\n\n if (index === parts.length - 1) {\n res = temp;\n }\n\n index++;\n }\n\n return res;\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pathToArray } from '../helpers';\nimport { isObject } from '../utils';\n\nconst NUMBER_REGEX = /^\\d+$/;\n\nexport function setPathValue(\n data: Record<string, any> | Record<string, any>[],\n path: string | string[],\n value: unknown,\n) {\n const parts = Array.isArray(path) ?\n path :\n pathToArray(path);\n\n let temp = data;\n let index = 0;\n while (index < parts.length) {\n /* istanbul ignore next */\n if (!Array.isArray(temp) && !isObject(temp)) {\n break;\n }\n\n const key = parts[index] as keyof typeof temp;\n\n // [foo, '0']\n if (typeof temp[key] === 'undefined') {\n const match = NUMBER_REGEX.test(key);\n if (match) {\n (temp as Record<string, any>)[key] = [];\n } else {\n temp[key] = {};\n }\n }\n\n if (index === parts.length - 1) {\n temp[key] = value;\n break;\n }\n\n index++;\n temp = temp[key];\n }\n\n return data;\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { getPathValue } from '../path-value/get';\nimport { pathToArray } from '../helpers';\n\nexport class PathInfo {\n protected data: unknown;\n\n protected pathParts: string[];\n\n protected _value: unknown;\n\n protected _parent: PathInfo | null | undefined;\n\n protected _exists: boolean | undefined;\n\n constructor(data: unknown, path: string | string[]) {\n this.data = data;\n\n if (Array.isArray(path)) {\n this.pathParts = path;\n } else {\n this.pathParts = pathToArray(path);\n }\n }\n\n get value() {\n if (typeof this._value !== 'undefined') {\n return this._value;\n }\n\n if (this.pathParts.length > 0) {\n this._value = getPathValue(this.data, this.pathParts);\n } else {\n this._value = this.data;\n }\n\n return this._value;\n }\n\n get name() : string | null {\n if (this.pathParts.length > 0) {\n return this.pathParts[this.pathParts.length - 1];\n }\n\n return null;\n }\n\n get parent() : PathInfo | null {\n if (typeof this._parent !== 'undefined') {\n return this._parent;\n }\n\n if (this.pathParts.length === 0) {\n this._parent = null;\n return this._parent;\n }\n\n if (this.pathParts.length > 1) {\n this._parent = new PathInfo(\n this.data,\n this.pathParts.slice(0, this.pathParts.length - 1),\n );\n } else {\n this._parent = new PathInfo(this.data, []);\n }\n\n return this._parent;\n }\n\n get exists() : boolean {\n if (typeof this._exists !== 'undefined') {\n return this._exists;\n }\n\n if (!this.name || !this.parent) {\n this._exists = true;\n return this._exists;\n }\n\n if (\n this.parent.value !== null &&\n typeof this.parent.value !== 'undefined'\n ) {\n this._exists = this.name in Object(this.parent.value);\n } else {\n this._exists = false;\n }\n\n return this._exists;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PathInfo } from './module';\n\nexport function getPathInfo(\n data: Record<string, any>,\n path: string | string[],\n) : PathInfo {\n return new PathInfo(data, path);\n}\n"],"names":["arrayToPath","parts","reduce","prev","segment","part","replace","test","BRACKET_NUMBER_REGEX","pathToArray","str","match","result","i","length","regex","exec","push","Character","isObject","input","Array","isArray","expandPathVerboseInternal","data","path","currPath","currMatches","segments","value","matches","key","rest","slice","GLOBSTAR","WILDCARD","Object","keys","flatMap","concat","nextPath","children","pathMatches","output","indexOf","flat","expandPathVerbose","expandPath","map","el","getPathValue","res","temp","index","NUMBER_REGEX","setPathValue","PathInfo","_value","pathParts","name","parent","_parent","exists","_exists","constructor","getPathInfo"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PathExpanded } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Verbose expand wildcard and glob patterns.
|
|
4
|
+
* Track wildcard/glob pattern matches.
|
|
5
|
+
*
|
|
6
|
+
* @param data
|
|
7
|
+
* @param path
|
|
8
|
+
*/
|
|
9
|
+
export declare function expandPathVerbose(data: Record<string, any>, path: string | string[]): PathExpanded[];
|
|
10
|
+
/**
|
|
11
|
+
* Expand wildcard and glob patterns to paths.
|
|
12
|
+
*
|
|
13
|
+
* @param data
|
|
14
|
+
* @param path
|
|
15
|
+
*/
|
|
16
|
+
export declare function expandPath(data: Record<string, any>, path: string | string[]): string[];
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
export declare class PathInfo {
|
|
2
2
|
protected data: unknown;
|
|
3
|
-
protected path: string | undefined;
|
|
4
3
|
protected pathParts: string[];
|
|
5
4
|
protected _value: unknown;
|
|
6
5
|
protected _parent: PathInfo | null | undefined;
|
|
7
6
|
protected _exists: boolean | undefined;
|
|
8
|
-
constructor(data: unknown, path
|
|
7
|
+
constructor(data: unknown, path: string | string[]);
|
|
9
8
|
get value(): unknown;
|
|
10
9
|
get name(): string | null;
|
|
11
10
|
get parent(): PathInfo | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pathtrace",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Simplifies working with nested objects and arrays by providing easy methods to retrieve, set, and check values at any path.",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -25,15 +25,14 @@
|
|
|
25
25
|
"lint": "eslint --ext .js,.vue,.ts ./src ./test",
|
|
26
26
|
"lint:fix": "npm run lint -- --fix"
|
|
27
27
|
},
|
|
28
|
-
"bin": {
|
|
29
|
-
"authup": "dist/index.cjs"
|
|
30
|
-
},
|
|
31
28
|
"keywords": [
|
|
32
|
-
"nested-objects",
|
|
33
29
|
"path",
|
|
34
|
-
"path-retrival",
|
|
35
|
-
"javascript",
|
|
36
30
|
"path-info",
|
|
31
|
+
"path-value",
|
|
32
|
+
"expand-path",
|
|
33
|
+
"path-retrival",
|
|
34
|
+
"get-path",
|
|
35
|
+
"nested-objects",
|
|
37
36
|
"deep-access"
|
|
38
37
|
],
|
|
39
38
|
"author": {
|
|
@@ -41,7 +40,7 @@
|
|
|
41
40
|
"email": "contact@tada5hi.net",
|
|
42
41
|
"url": "https://github.com/tada5hi"
|
|
43
42
|
},
|
|
44
|
-
"license": "
|
|
43
|
+
"license": "MIT",
|
|
45
44
|
"repository": {
|
|
46
45
|
"type": "git",
|
|
47
46
|
"url": "git+https://github.com/tada5hi/pathtrace.git"
|
|
@@ -54,18 +53,18 @@
|
|
|
54
53
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
55
54
|
"@rollup/plugin-swc": "^0.3.1",
|
|
56
55
|
"@swc/jest": "^0.2.36",
|
|
57
|
-
"@tada5hi/commitlint-config": "^1.2.
|
|
58
|
-
"@tada5hi/eslint-config-typescript": "^1.2.
|
|
56
|
+
"@tada5hi/commitlint-config": "^1.2.2",
|
|
57
|
+
"@tada5hi/eslint-config-typescript": "^1.2.12",
|
|
59
58
|
"@tada5hi/semantic-release": "^0.3.1",
|
|
60
59
|
"@tada5hi/tsconfig": "^0.5.1",
|
|
61
60
|
"@types/jest": "^29.5.12",
|
|
62
|
-
"@types/node": "^22.5.
|
|
61
|
+
"@types/node": "^22.5.2",
|
|
63
62
|
"@types/pathval": "^1.1.2",
|
|
64
63
|
"cross-env": "^7.0.3",
|
|
65
64
|
"eslint": "^8.37.0",
|
|
66
65
|
"husky": "^9.0.11",
|
|
67
66
|
"jest": "^29.7.0",
|
|
68
|
-
"rollup": "^4.21.
|
|
67
|
+
"rollup": "^4.21.2",
|
|
69
68
|
"semantic-release": "^22.0.12",
|
|
70
69
|
"ts-jest": "^29.2.5",
|
|
71
70
|
"typescript": "^5.5.4"
|
package/dist/get-path-info.d.ts
DELETED
|
File without changes
|
|
File without changes
|