wdb-cli
wdb-cli
lets you build and test WeaveDB instances in memory.
Create Project
npx wdb-cli create mydb && cd mydb
DB Settings
Create schema
, auth
, indexes
, and triggers
files under /db
.
/db/schema.js
export default {
notes: {
type: "object",
required: ["id", "actor", "content", "published", "likes"],
properties: {
id: { type: "string" },
actor: { type: "string", pattern: "^[a-zA-Z0-9_-]{43}quot; },
content: { type: "string", minLength: 1, maxLength: 140 },
published: { type: "integer" },
likes: { type: "integer" },
},
additionalProperties: false,
},
likes: {
type: "object",
required: ["actor", "object", "published"],
properties: {
actor: { type: "string", pattern: "^[a-zA-Z0-9_-]{43}quot; },
object: { type: "string" },
published: { type: "integer" },
},
additionalProperties: false,
},
}
/db/auth.js
export default {
notes: [
[
"add:note",
[
["fields()", ["*content"]],
["mod()", { id: "$doc", actor: "$signer", published: "$ts", likes: 0 }],
["allow()"],
],
],
],
likes: [
[
"add:like",
[
["fields()", ["*object"]],
["mod()", { actor: "$signer", published: "$ts" }],
[
"=$likes",
[
"get()",
[
"likes",
["actor", "==", "$signer"],
["object", "==", "$req.object"],
],
],
],
["=$ok", ["o", ["equals", 0], ["length"], "$likes"]],
["denyifany()", ["!$ok"]],
["allow()"],
],
],
],
}
/db/indexes.js
export default {
notes: [[["actor"], ["published", "desc"]]],
likes: [
[["object"], ["published", "desc"]],
[["actor"], ["object"]],
],
}
/db/triggers.js
export default {
likes: [
{
key: "inc_likes",
on: "create",
fn: [
["update()", [{ likes: { _$: ["inc"] } }, "notes", "$after.object"]],
],
},
],
}
Test
Write test files under /test
.
/test/main.test.js
import assert from "assert"
import { describe, it } from "node:test"
import { acc } from "wao/test"
import { DB } from "wdb-sdk"
import { init } from "./utils.js"
const actor1 = acc[1]
const actor2 = acc[2]
describe("Jots", () => {
it.only("should post notes", async () => {
const { id, db, q: mem } = await init()
const a1 = new DB({ jwk: actor1.jwk, id, mem })
const a2 = new DB({ jwk: actor2.jwk, id, mem })
const note1 = await a1.set("add:note", { content: "hello a1" }, "notes")
assert(note1.success)
const note2 = await a2.set("add:note", { content: "hello a2" }, "notes")
assert(note2.success)
const tl = await db.get("notes", ["published", "desc"])
assert(tl.length === 2)
const object = tl[0].id
const like1 = await a1.set("add:like", { object }, "likes")
assert(like1.success)
const like2 = await a2.set("add:like", { object }, "likes")
assert(like2.success)
const like3 = await a2.set("add:like", { object }, "likes")
assert(!like3.success)
assert.equal((await db.get("notes", ["likes", "desc"], 1))[0].likes, 2)
})
})
Run the tests.
yarn test-all
Deploy
yarn deploy --wallet .wallet.json --hb http://localhost:10001 --db http://localhost:6364