@loaders.gl/json
Version:
Framework-independent loader for JSON and streaming JSON formats
106 lines (90 loc) • 2.1 kB
text/typescript
// loaders.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
/**
* A parser for a minimal subset of the jsonpath standard
* Full JSON path parsers for JS exist but are quite large (bundle size)
*
* Supports
*
* `$.component.component.component`
*/
export default class JSONPath {
path: string[];
constructor(path: JSONPath | string[] | string | null = null) {
this.path = ['$'];
if (path instanceof JSONPath) {
// @ts-ignore
this.path = [...path.path];
return;
}
if (Array.isArray(path)) {
this.path.push(...path);
return;
}
// Parse a string as a JSONPath
if (typeof path === 'string') {
this.path = path.split('.');
if (this.path[0] !== '$') {
throw new Error('JSONPaths must start with $');
}
}
}
clone(): JSONPath {
return new JSONPath(this);
}
toString(): string {
return this.path.join('.');
}
push(name: string): void {
this.path.push(name);
}
pop() {
return this.path.pop();
}
set(name: string): void {
this.path[this.path.length - 1] = name;
}
equals(other: JSONPath): boolean {
if (!this || !other || this.path.length !== other.path.length) {
return false;
}
for (let i = 0; i < this.path.length; ++i) {
if (this.path[i] !== other.path[i]) {
return false;
}
}
return true;
}
/**
* Sets the value pointed at by path
* TODO - handle root path
* @param object
* @param value
*/
setFieldAtPath(object, value) {
const path = [...this.path];
path.shift();
const field = path.pop();
for (const component of path) {
object = object[component];
}
// @ts-ignore
object[field] = value;
}
/**
* Gets the value pointed at by path
* TODO - handle root path
* @param object
*/
getFieldAtPath(object) {
const path = [...this.path];
path.shift();
const field = path.pop();
for (const component of path) {
object = object[component];
}
// @ts-ignore
return object[field];
}
}