blob: 66c67dd23412d10c0cd8eef32340b91481b542ac [file] [log] [blame]
AviZi280f8012017-06-09 02:39:56 +03001/*!
Michael Landoefa037d2017-02-19 12:57:33 +02002 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
AviZi280f8012017-06-09 02:39:56 +03003 *
Michael Landoefa037d2017-02-19 12:57:33 +02004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
AviZi280f8012017-06-09 02:39:56 +03007 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Michael Landoefa037d2017-02-19 12:57:33 +020010 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
AviZi280f8012017-06-09 02:39:56 +030012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing
14 * permissions and limitations under the License.
Michael Landoefa037d2017-02-19 12:57:33 +020015 */
Michael Landoefa037d2017-02-19 12:57:33 +020016const JSONPointer = {
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020017 extractParentPointer(pointer) {
18 return pointer.replace(/\/[^\/]+$/, '');
19 },
Michael Landoefa037d2017-02-19 12:57:33 +020020
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020021 extractLastPart(pointer) {
22 const [, lastPart] = pointer.match(/\/([^\/]+)$/) || [];
23 return lastPart;
24 },
Michael Landoefa037d2017-02-19 12:57:33 +020025
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020026 extractParts(pointer = '') {
27 return pointer
28 .split('/')
29 .slice(1)
30 .map(part => part.replace(/~1/g, '/'))
31 .map(part => part.replace(/~0/g, '~'));
32 },
Michael Landoefa037d2017-02-19 12:57:33 +020033
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020034 getValue(object, pointer) {
35 let parts = JSONPointer.extractParts(pointer);
36 return parts.reduce((object, part) => object && object[part], object);
37 },
Michael Landoefa037d2017-02-19 12:57:33 +020038
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020039 setValue(object, pointer, value) {
40 let clone = obj => (Array.isArray(obj) ? [...obj] : { ...obj });
Michael Landoefa037d2017-02-19 12:57:33 +020041
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020042 let parts = JSONPointer.extractParts(pointer),
43 newObject = clone(object),
44 subObject = object,
45 subNewObject = newObject;
Michael Landoefa037d2017-02-19 12:57:33 +020046
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020047 for (let i = 0, n = parts.length - 1; i < n; ++i) {
48 let nextSubObject = subObject && subObject[parts[i]];
49 subNewObject = subNewObject[parts[i]] = nextSubObject
50 ? clone(nextSubObject)
51 : {};
52 subObject = nextSubObject;
53 }
54 subNewObject[parts[parts.length - 1]] = value;
Michael Landoefa037d2017-02-19 12:57:33 +020055
Einav Weiss Keidar7fdf7332018-03-20 14:45:40 +020056 return newObject;
57 }
Michael Landoefa037d2017-02-19 12:57:33 +020058};
59
60export default JSONPointer;