Skip to content

Commit 3b79b32

Browse files
committed
insert a nested non-object value
1 parent 4ae6fc5 commit 3b79b32

File tree

4 files changed

+29
-11
lines changed

4 files changed

+29
-11
lines changed

src/nested.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
NestedValue,
1616
NestedValueWithUndefined,
1717
PossiblyNestedValue,
18+
PossiblyNestedValueWithUndefined,
1819
} from "./types";
1920
import {
2021
flatten,
@@ -139,20 +140,20 @@ export const NestedApi = ({ database }: { database: InternalDatabase }) => {
139140

140141
type InsertFunction = {
141142
(object: NestedValueWithUndefined): Promise<string>;
142-
(key: NestedKey, object: NestedValueWithUndefined): Promise<string>;
143+
(key: NestedKey, object: PossiblyNestedValueWithUndefined): Promise<string>;
143144
};
144145

145146
const insert: InsertFunction = async (
146147
keyOrObject,
147-
object?: NestedValueWithUndefined | undefined,
148+
object?: Exclude<PossiblyNestedValueWithUndefined, undefined>,
148149
): Promise<string> => {
149150
if (isNestedKey(keyOrObject)) {
150151
const joinedRootKey =
151152
typeof keyOrObject === "string" ? keyOrObject : joinKey(keyOrObject);
152153
return await addOperation({
153154
op: "INSERT",
154155
key: joinedRootKey,
155-
value: removeUndefineds(object!),
156+
value: isNestedValue(object) ? removeUndefineds(object) : object!,
156157
});
157158
} else {
158159
return await addOperation({
@@ -201,14 +202,18 @@ export const NestedApi = ({ database }: { database: InternalDatabase }) => {
201202
const { op, key, value } = entry.payload;
202203

203204
if (op === "INSERT") {
204-
if (typeof value !== "object" || !isNestedValue(value)) continue;
205-
const flattenedEntries = flatten(value).map((entry) => ({
206-
key: key === null ? entry.key : `${key}/${entry.key}`,
207-
value: entry.value,
208-
}));
209205
const hash = entry.hash;
210-
for (const flat of flattenedEntries) {
211-
yield* processEntry({ key: flat.key, value: flat.value, hash });
206+
if (isNestedValue(value)) {
207+
const flattenedEntries = flatten(value).map((entry) => ({
208+
key: key === null ? entry.key : `${key}/${entry.key}`,
209+
value: entry.value,
210+
}));
211+
for (const flat of flattenedEntries) {
212+
yield* processEntry({ key: flat.key, value: flat.value, hash });
213+
}
214+
} else {
215+
if (!key) continue;
216+
yield* processEntry({ key, value, hash });
212217
}
213218
}
214219

src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ export type NestedValue<T = DagCborEncodable> = {
1313
export type NestedValueWithUndefined = NestedValue<
1414
DagCborEncodable | undefined
1515
>;
16+
export type PossiblyNestedValueWithUndefined = PossiblyNestedValue<
17+
DagCborEncodable | undefined
18+
>;

src/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ export const isSisterKey = (key1: NestedKey, key2: NestedKey): boolean => {
5454
return true;
5555
};
5656

57-
export const isNestedValue = (x: PossiblyNestedValue): x is NestedValue => {
57+
export const isNestedValue = <T>(
58+
x: PossiblyNestedValue<T>,
59+
): x is NestedValue<T> => {
5860
return (
5961
typeof x === "object" &&
6062
!Array.isArray(x) &&

test/nested.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,14 @@ describe("Nested Database", () => {
234234
expect(actual).to.deep.equal({ b: 1, c: 3 });
235235
});
236236

237+
it("insert a nested non-object value", async () => {
238+
await db.insert(["a", "b"], 1);
239+
await db.insert(["a", "c"], 2);
240+
241+
const actual = await db.all();
242+
expect(actual).to.deep.equal({ a: { b: 1, c: 2 } });
243+
});
244+
237245
it("insert nested value containing undefined", async () => {
238246
await db.insert("a", { b: 2, c: undefined });
239247

0 commit comments

Comments
 (0)