@esri/hub-common 12.17.0 → 12.18.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.
@@ -1,11 +1,87 @@
1
1
  /**
2
- * Get a property out of a deeply nested object
3
- * Does not handle anything but nested object graph
2
+ * Get a property out of a deeply nested object. Supports array indexing
3
+ * and property matching.
4
+ *
5
+ * Examples:
6
+ * ```js
7
+ * getProp({a: {b: {c: 1}}}, "a.b.c") => 1
8
+ * getProp({a: {b: {c: 1}}}, "a.b.d") => undefined
9
+ * getProp({a: {b: {c: 1}}}, "a.b") => {c: 1}
10
+ * getProp({a: {b: [1,2]}}, "a.b[0]") => 1
11
+ * getProp({a: {b: {c: 1}, b2: { $use: "a.b"}}, "a.b2") => {c: 1}
12
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[1]") => {key: "y", val:3}
13
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[1].val") => 3
14
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[findBy(key,y)].val") => 3
15
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[findBy(val,1)].key") => "x"
16
+ * ```
4
17
  */
5
- export function getProp(obj, path) {
18
+ export const getProp = (obj, path) => {
6
19
  return path.split(".").reduce(function (prev, curr) {
7
- /* istanbul ignore next no need to test undefined scenario */
8
- return prev ? prev[curr] : undefined;
20
+ const match = curr.match(/\[(.*?)\]$/);
21
+ if (match) {
22
+ const indexOrFnName = match[1];
23
+ const propName = curr.replace(match[0], "");
24
+ if (parseInt(indexOrFnName, 10) > -1) {
25
+ const idx = parseInt(indexOrFnName, 10);
26
+ // check that the array exists and that the index is valid
27
+ if (Array.isArray(prev[propName]) && prev[propName][idx]) {
28
+ return prev[propName][idx];
29
+ }
30
+ else {
31
+ return undefined;
32
+ }
33
+ }
34
+ else {
35
+ // we have an operation that we want to apply to the array
36
+ return applyOperation(prev[propName], indexOrFnName);
37
+ }
38
+ }
39
+ else {
40
+ if (prev && prev[curr] !== undefined) {
41
+ if (prev[curr] !== null && prev[curr].$use) {
42
+ return getProp(obj, prev[curr].$use);
43
+ }
44
+ else {
45
+ return prev[curr];
46
+ }
47
+ }
48
+ else {
49
+ return undefined;
50
+ }
51
+ }
9
52
  }, obj);
53
+ };
54
+ function applyOperation(arr, operation) {
55
+ // split up the operation into the operationName and the arguments
56
+ // e.g. "findBy(key,'projects')" => ["findBy", "key, 'projects'"]
57
+ const parts = operation.split("(");
58
+ // lots of guards...
59
+ if (!parts || parts.length !== 2)
60
+ return undefined;
61
+ let result;
62
+ const fnName = parts[0];
63
+ const args = parts[1]
64
+ .replace(")", "")
65
+ .split(",")
66
+ .map((p) => p.trim());
67
+ switch (fnName) {
68
+ case "findBy":
69
+ const prop = args[0];
70
+ let val;
71
+ if (isNumeric(args[1])) {
72
+ val = parseFloat(args[1]);
73
+ }
74
+ else {
75
+ val = args[1].replace(/'/g, "");
76
+ }
77
+ result = arr.find((p) => p[prop] === val);
78
+ break;
79
+ default:
80
+ result = undefined;
81
+ }
82
+ return result;
83
+ }
84
+ function isNumeric(n) {
85
+ return !isNaN(parseFloat(n));
10
86
  }
11
87
  //# sourceMappingURL=get-prop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-prop.js","sourceRoot":"","sources":["../../../src/objects/get-prop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAA6B,EAAE,IAAY;IACjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAS,IAAI,EAAE,IAAI;QAC/C,6DAA6D;QAC7D,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC,EAAE,GAAG,CAAC,CAAC;AACV,CAAC"}
1
+ {"version":3,"file":"get-prop.js","sourceRoot":"","sources":["../../../src/objects/get-prop.ts"],"names":[],"mappings":"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"}
@@ -2,14 +2,89 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getProp = void 0;
4
4
  /**
5
- * Get a property out of a deeply nested object
6
- * Does not handle anything but nested object graph
5
+ * Get a property out of a deeply nested object. Supports array indexing
6
+ * and property matching.
7
+ *
8
+ * Examples:
9
+ * ```js
10
+ * getProp({a: {b: {c: 1}}}, "a.b.c") => 1
11
+ * getProp({a: {b: {c: 1}}}, "a.b.d") => undefined
12
+ * getProp({a: {b: {c: 1}}}, "a.b") => {c: 1}
13
+ * getProp({a: {b: [1,2]}}, "a.b[0]") => 1
14
+ * getProp({a: {b: {c: 1}, b2: { $use: "a.b"}}, "a.b2") => {c: 1}
15
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[1]") => {key: "y", val:3}
16
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[1].val") => 3
17
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[findBy(key,y)].val") => 3
18
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[findBy(val,1)].key") => "x"
19
+ * ```
7
20
  */
8
- function getProp(obj, path) {
21
+ exports.getProp = (obj, path) => {
9
22
  return path.split(".").reduce(function (prev, curr) {
10
- /* istanbul ignore next no need to test undefined scenario */
11
- return prev ? prev[curr] : undefined;
23
+ const match = curr.match(/\[(.*?)\]$/);
24
+ if (match) {
25
+ const indexOrFnName = match[1];
26
+ const propName = curr.replace(match[0], "");
27
+ if (parseInt(indexOrFnName, 10) > -1) {
28
+ const idx = parseInt(indexOrFnName, 10);
29
+ // check that the array exists and that the index is valid
30
+ if (Array.isArray(prev[propName]) && prev[propName][idx]) {
31
+ return prev[propName][idx];
32
+ }
33
+ else {
34
+ return undefined;
35
+ }
36
+ }
37
+ else {
38
+ // we have an operation that we want to apply to the array
39
+ return applyOperation(prev[propName], indexOrFnName);
40
+ }
41
+ }
42
+ else {
43
+ if (prev && prev[curr] !== undefined) {
44
+ if (prev[curr] !== null && prev[curr].$use) {
45
+ return exports.getProp(obj, prev[curr].$use);
46
+ }
47
+ else {
48
+ return prev[curr];
49
+ }
50
+ }
51
+ else {
52
+ return undefined;
53
+ }
54
+ }
12
55
  }, obj);
56
+ };
57
+ function applyOperation(arr, operation) {
58
+ // split up the operation into the operationName and the arguments
59
+ // e.g. "findBy(key,'projects')" => ["findBy", "key, 'projects'"]
60
+ const parts = operation.split("(");
61
+ // lots of guards...
62
+ if (!parts || parts.length !== 2)
63
+ return undefined;
64
+ let result;
65
+ const fnName = parts[0];
66
+ const args = parts[1]
67
+ .replace(")", "")
68
+ .split(",")
69
+ .map((p) => p.trim());
70
+ switch (fnName) {
71
+ case "findBy":
72
+ const prop = args[0];
73
+ let val;
74
+ if (isNumeric(args[1])) {
75
+ val = parseFloat(args[1]);
76
+ }
77
+ else {
78
+ val = args[1].replace(/'/g, "");
79
+ }
80
+ result = arr.find((p) => p[prop] === val);
81
+ break;
82
+ default:
83
+ result = undefined;
84
+ }
85
+ return result;
86
+ }
87
+ function isNumeric(n) {
88
+ return !isNaN(parseFloat(n));
13
89
  }
14
- exports.getProp = getProp;
15
90
  //# sourceMappingURL=get-prop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-prop.js","sourceRoot":"","sources":["../../../src/objects/get-prop.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,OAAO,CAAC,GAA6B,EAAE,IAAY;IACjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAS,IAAI,EAAE,IAAI;QAC/C,6DAA6D;QAC7D,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AALD,0BAKC"}
1
+ {"version":3,"file":"get-prop.js","sourceRoot":"","sources":["../../../src/objects/get-prop.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,20 @@
1
1
  /**
2
- * Get a property out of a deeply nested object
3
- * Does not handle anything but nested object graph
2
+ * Get a property out of a deeply nested object. Supports array indexing
3
+ * and property matching.
4
+ *
5
+ * Examples:
6
+ * ```js
7
+ * getProp({a: {b: {c: 1}}}, "a.b.c") => 1
8
+ * getProp({a: {b: {c: 1}}}, "a.b.d") => undefined
9
+ * getProp({a: {b: {c: 1}}}, "a.b") => {c: 1}
10
+ * getProp({a: {b: [1,2]}}, "a.b[0]") => 1
11
+ * getProp({a: {b: {c: 1}, b2: { $use: "a.b"}}, "a.b2") => {c: 1}
12
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[1]") => {key: "y", val:3}
13
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[1].val") => 3
14
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[findBy(key,y)].val") => 3
15
+ * getProp({a: [{key: "x", val:1}, {key: "y", val:3}]}, "a[findBy(val,1)].key") => "x"
16
+ * ```
4
17
  */
5
- export declare function getProp(obj: {
18
+ export declare const getProp: (obj: {
6
19
  [index: string]: any;
7
- }, path: string): any;
20
+ }, path: string) => any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esri/hub-common",
3
- "version": "12.17.0",
3
+ "version": "12.18.0",
4
4
  "description": "Common TypeScript types and utility functions for @esri/hub.js.",
5
5
  "main": "dist/node/index.js",
6
6
  "module": "dist/esm/index.js",