UNPKG

@bespunky/angular-zen

Version:

The Angular tools you always wished were there.

46 lines 7.56 kB
function isArrayIndexer(path) { const numericIndexerRegex = /^\w+\[\d+\]$/; return numericIndexerRegex.test(path); } function accessArrayProperty(value, arrayPath) { if (!value) throw new Error(`Cannot access ${arrayPath}. 'value' is ${value}`); if (typeof value !== 'object') throw new Error(`Cannot access ${arrayPath}. ${value} is not an object.`); const pathRegex = /^(?<property>(\w+))\[(?<index>(\d+))\]$/; const lookup = pathRegex.exec(arrayPath)?.groups; if (!(lookup && lookup['property'] && lookup['index'])) throw new Error(` Tried to access array on at '${arrayPath}', but the path is invalid. Expected a path of the shape 'propertyName[index].' `); const { property, index } = lookup; const array = value[property]; if (!Array.isArray(array)) throw new TypeError(`Array property access failed. Value at '${property}' is not an array.`); return { get: () => array[+index], set: (newValue) => array[+index] = newValue }; } export function access(value, path) { if (!path) return { get: () => value, set: () => void 0 }; const parts = path.split('.').filter(part => part !== ''); while (parts.length > 1) { const nextPath = parts.shift(); if (typeof value !== 'object') throw new Error(``); value = (isArrayIndexer(nextPath) ? accessArrayProperty(value, nextPath).get() : value[nextPath]); } const lastPath = parts.shift(); return { get: isArrayIndexer(lastPath) ? () => accessArrayProperty(value, lastPath).get() : () => value[lastPath], set: isArrayIndexer(lastPath) ? (newValue) => accessArrayProperty(value, lastPath).set(newValue) : (newValue) => value[lastPath] = newValue }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLW9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci16ZW4vdXRpbHMvc3JjL2FjY2Vzcy1vYmplY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUVoQyxNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztJQUUzQyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBSSxLQUFjLEVBQUUsU0FBaUI7SUFFN0QsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFrQixTQUFVLGdCQUFpQixLQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRW5GLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWtCLFNBQVUsS0FBTSxLQUFNLG9CQUFvQixDQUFDLENBQUM7SUFFN0csTUFBTSxTQUFTLEdBQUcseUNBQXlDLENBQUM7SUFFNUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFakQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQzsyQ0FDb0IsU0FBVTs7U0FFN0MsQ0FBQyxDQUFDO0lBRVAsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFbkMsTUFBTSxLQUFLLEdBQUksS0FBaUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUzRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDJDQUE0QyxRQUFTLG9CQUFvQixDQUFDLENBQUM7SUFFMUgsT0FBTztRQUNILEdBQUcsRUFBRSxHQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDM0IsR0FBRyxFQUFFLENBQUMsUUFBVyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRO0tBQ2pELENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBSSxLQUE4QixFQUFFLElBQVk7SUFFbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQU0sRUFBRSxDQUFDLEtBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUVsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztJQUUxRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN2QjtRQUNJLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQVksQ0FBQztRQUV6QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELEtBQUssR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQTRCLENBQUM7S0FDaEk7SUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFZLENBQUM7SUFFekMsT0FBTztRQUNILEdBQUcsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxHQUFNLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFPO1lBQzFELENBQUMsQ0FBQyxHQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFNO1FBQ25DLEdBQUcsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDLFFBQVcsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUksS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUMsUUFBVyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUTtLQUNwRCxDQUFBO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGlzQXJyYXlJbmRleGVyKHBhdGg6IHN0cmluZyk6IGJvb2xlYW5cbntcbiAgICBjb25zdCBudW1lcmljSW5kZXhlclJlZ2V4ID0gL15cXHcrXFxbXFxkK1xcXSQvO1xuXG4gICAgcmV0dXJuIG51bWVyaWNJbmRleGVyUmVnZXgudGVzdChwYXRoKTtcbn1cblxuZnVuY3Rpb24gYWNjZXNzQXJyYXlQcm9wZXJ0eTxUPih2YWx1ZTogdW5rbm93biwgYXJyYXlQYXRoOiBzdHJpbmcpXG57XG4gICAgaWYgKCF2YWx1ZSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWNjZXNzICR7IGFycmF5UGF0aCB9LiAndmFsdWUnIGlzICR7IHZhbHVlIH1gKTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhY2Nlc3MgJHsgYXJyYXlQYXRoIH0uICR7IHZhbHVlIH0gaXMgbm90IGFuIG9iamVjdC5gKTtcblxuICAgIGNvbnN0IHBhdGhSZWdleCA9IC9eKD88cHJvcGVydHk+KFxcdyspKVxcWyg/PGluZGV4PihcXGQrKSlcXF0kLztcblxuICAgIGNvbnN0IGxvb2t1cCA9IHBhdGhSZWdleC5leGVjKGFycmF5UGF0aCk/Lmdyb3VwcztcbiAgICBcbiAgICBpZiAoIShsb29rdXAgJiYgbG9va3VwWydwcm9wZXJ0eSddICYmIGxvb2t1cFsnaW5kZXgnXSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgICAgICBUcmllZCB0byBhY2Nlc3MgYXJyYXkgb24gYXQgJyR7IGFycmF5UGF0aCB9JywgYnV0IHRoZSBwYXRoIGlzIGludmFsaWQuXG4gICAgICAgICAgICBFeHBlY3RlZCBhIHBhdGggb2YgdGhlIHNoYXBlICdwcm9wZXJ0eU5hbWVbaW5kZXhdLidcbiAgICAgICAgYCk7XG4gICAgXG4gICAgY29uc3QgeyBwcm9wZXJ0eSwgaW5kZXggfSA9IGxvb2t1cDtcblxuICAgIGNvbnN0IGFycmF5ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wZXJ0eV07XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBBcnJheSBwcm9wZXJ0eSBhY2Nlc3MgZmFpbGVkLiBWYWx1ZSBhdCAnJHsgcHJvcGVydHkgfScgaXMgbm90IGFuIGFycmF5LmApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0OiAoKTogVCA9PiBhcnJheVsraW5kZXhdLFxuICAgICAgICBzZXQ6IChuZXdWYWx1ZTogVCkgPT4gYXJyYXlbK2luZGV4XSA9IG5ld1ZhbHVlXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFjY2VzczxUPih2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHBhdGg6IHN0cmluZylcbntcbiAgICBpZiAoIXBhdGgpIHJldHVybiB7IGdldDogKCk6IFQgPT4gdmFsdWUgYXMgVCwgc2V0OiAoKSA9PiB2b2lkIDAgfTtcblxuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpLmZpbHRlcihwYXJ0ID0+IHBhcnQgIT09ICcnKTtcblxuICAgIHdoaWxlIChwYXJ0cy5sZW5ndGggPiAxKVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV4dFBhdGggPSBwYXJ0cy5zaGlmdCgpIGFzIHN0cmluZztcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgdGhyb3cgbmV3IEVycm9yKGBgKTtcblxuICAgICAgICB2YWx1ZSA9IChpc0FycmF5SW5kZXhlcihuZXh0UGF0aCkgPyBhY2Nlc3NBcnJheVByb3BlcnR5KHZhbHVlLCBuZXh0UGF0aCkuZ2V0KCkgOiB2YWx1ZVtuZXh0UGF0aF0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RQYXRoID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQ6IGlzQXJyYXlJbmRleGVyKGxhc3RQYXRoKVxuICAgICAgICAgICAgPyAoKTogVCA9PiBhY2Nlc3NBcnJheVByb3BlcnR5KHZhbHVlLCBsYXN0UGF0aCkuZ2V0KCkgYXMgVFxuICAgICAgICAgICAgOiAoKTogVCA9PiB2YWx1ZVtsYXN0UGF0aF0gYXMgVCxcbiAgICAgICAgc2V0OiBpc0FycmF5SW5kZXhlcihsYXN0UGF0aClcbiAgICAgICAgICAgID8gKG5ld1ZhbHVlOiBUKSA9PiBhY2Nlc3NBcnJheVByb3BlcnR5PFQ+KHZhbHVlLCBsYXN0UGF0aCkuc2V0KG5ld1ZhbHVlKVxuICAgICAgICAgICAgOiAobmV3VmFsdWU6IFQpID0+IHZhbHVlW2xhc3RQYXRoXSA9IG5ld1ZhbHVlXG4gICAgfVxufSJdfQ==