diff options
Diffstat (limited to 'packages/idb-bridge/src/util/injectKey.ts')
-rw-r--r-- | packages/idb-bridge/src/util/injectKey.ts | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/packages/idb-bridge/src/util/injectKey.ts b/packages/idb-bridge/src/util/injectKey.ts new file mode 100644 index 000000000..89d3a01d8 --- /dev/null +++ b/packages/idb-bridge/src/util/injectKey.ts @@ -0,0 +1,48 @@ +import { KeyPath, Value, Key } from "./types"; +import canInjectKey from "./canInjectKey"; +import { DataError } from "./errors"; +import structuredClone from "./structuredClone"; + +export function injectKey(keyPath: KeyPath, value: Value, key: Key): Value { + if (Array.isArray(keyPath)) { + // tslint:disable-next-line max-line-length + throw new Error( + "The key paths used in this section are always strings and never sequences, since it is not possible to create a object store which has a key generator and also has a key path that is a sequence.", + ); + } + + const identifiers = keyPath.split("."); + if (identifiers.length === 0) { + throw new Error("Assert: identifiers is not empty"); + } + + const lastIdentifier = identifiers.pop(); + + if (lastIdentifier === null || lastIdentifier === undefined) { + throw Error(); + } + + for (const identifier of identifiers) { + if (typeof value !== "object" && !Array.isArray(value)) { + return false; + } + + const hop = value.hasOwnProperty(identifier); + if (!hop) { + return true; + } + + value = value[identifier]; + } + + if (!(typeof value === "object" || Array.isArray(value))) { + throw new Error("can't inject key"); + } + + const newValue = structuredClone(value); + newValue[lastIdentifier] = structuredClone(key); + + return newValue; +} + +export default injectKey;
\ No newline at end of file |