From c0d468a58ae9ce1a800a82d5329e3180698b16af Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 26 Mar 2024 13:42:00 -0700 Subject: [PATCH] Move store to paravel --- src/app/shared/Calendar.svelte | 2 +- src/app/shared/Feed.svelte | 3 +- src/app/shared/NoteCreateInline.svelte | 2 +- src/app/shared/NoteReply.svelte | 2 +- src/app/shared/PersonName.svelte | 2 +- src/app/shared/SearchResults.svelte | 5 +- src/app/state.ts | 2 +- src/app/views/ChannelsList.svelte | 2 +- src/app/views/NoteCreate.svelte | 3 +- src/app/views/OnboardingProfile.svelte | 5 +- src/engine/channels/derived.ts | 2 +- src/engine/channels/state.ts | 2 +- src/engine/core/utils/index.ts | 1 - src/engine/core/utils/storage.ts | 4 +- src/engine/core/utils/store.ts | 335 ------------------------- src/engine/events/derived.ts | 2 +- src/engine/events/state.ts | 2 +- src/engine/groups/state.ts | 2 +- src/engine/handlers/commands.ts | 3 +- src/engine/handlers/state.ts | 2 +- src/engine/labels/derived.ts | 2 +- src/engine/labels/state.ts | 2 +- src/engine/lists/derived.ts | 2 +- src/engine/lists/state.ts | 2 +- src/engine/network/utils/cursor.ts | 3 +- src/engine/network/utils/feed.ts | 3 +- src/engine/network/utils/thread.ts | 2 +- src/engine/notifications/derived.ts | 3 +- src/engine/people/derived.ts | 2 +- src/engine/people/requests.ts | 2 +- src/engine/people/state.ts | 2 +- src/engine/relays/state.ts | 2 +- src/engine/session/derived.ts | 2 +- src/engine/session/state.ts | 2 +- src/engine/topics/state.ts | 2 +- src/partials/state.ts | 4 +- src/util/router.ts | 2 +- 37 files changed, 41 insertions(+), 381 deletions(-) delete mode 100644 src/engine/core/utils/store.ts diff --git a/src/app/shared/Calendar.svelte b/src/app/shared/Calendar.svelte index 611f1a98..bdc4ce6f 100644 --- a/src/app/shared/Calendar.svelte +++ b/src/app/shared/Calendar.svelte @@ -2,6 +2,7 @@ import {fromPairs} from "ramda" import {batch} from "hurdak" import {onMount} from "svelte" + import {writable} from "@coracle.social/lib" import {getAddress, getReplyFilters} from "@coracle.social/util" import Calendar from "@event-calendar/core" import DayGrid from "@event-calendar/day-grid" @@ -15,7 +16,6 @@ hints, canSign, getRelaysFromFilters, - writable, forcePlatformRelays, load, isDeleted, diff --git a/src/app/shared/Feed.svelte b/src/app/shared/Feed.svelte index 44a16c38..7c82f8da 100644 --- a/src/app/shared/Feed.svelte +++ b/src/app/shared/Feed.svelte @@ -1,6 +1,7 @@ diff --git a/src/app/shared/SearchResults.svelte b/src/app/shared/SearchResults.svelte index e9564218..8d24cccb 100644 --- a/src/app/shared/SearchResults.svelte +++ b/src/app/shared/SearchResults.svelte @@ -1,12 +1,13 @@
-

+

2/4

Give us something to go on!

diff --git a/src/engine/channels/derived.ts b/src/engine/channels/derived.ts index 086cff7a..49dc9537 100644 --- a/src/engine/channels/derived.ts +++ b/src/engine/channels/derived.ts @@ -1,5 +1,5 @@ import {none, any, filter} from "ramda" -import {derived} from "src/engine/core/utils" +import {derived} from "@coracle.social/lib" import {pubkey} from "src/engine/session/state" import {mutes} from "src/engine/people/derived" import type {Channel} from "./model" diff --git a/src/engine/channels/state.ts b/src/engine/channels/state.ts index 0489c001..c64685cd 100644 --- a/src/engine/channels/state.ts +++ b/src/engine/channels/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Channel} from "./model" export const channels = collection("id") diff --git a/src/engine/core/utils/index.ts b/src/engine/core/utils/index.ts index d9918a75..ff88148a 100644 --- a/src/engine/core/utils/index.ts +++ b/src/engine/core/utils/index.ts @@ -1,2 +1 @@ -export * from "./store" export * from "./storage" diff --git a/src/engine/core/utils/storage.ts b/src/engine/core/utils/storage.ts index 9a4df715..fd581b70 100644 --- a/src/engine/core/utils/storage.ts +++ b/src/engine/core/utils/storage.ts @@ -1,11 +1,11 @@ import {prop, identity, pluck, splitAt, nth, sortBy} from "ramda" import {sleep, defer, chunk, randomInt, throttle} from "hurdak" import {Storage as LocalStorage} from "hurdak" +import {writable} from "@coracle.social/lib" +import type {Writable, Collection} from "@coracle.social/lib" import logger from "src/util/logger" import {sessions} from "src/engine/session/state" import {people} from "src/engine/people/state" -import type {Writable, Collection} from "./store" -import {writable} from "./store" type Store = { name: string diff --git a/src/engine/core/utils/store.ts b/src/engine/core/utils/store.ts deleted file mode 100644 index bd077fd2..00000000 --- a/src/engine/core/utils/store.ts +++ /dev/null @@ -1,335 +0,0 @@ -import {throttle} from "throttle-debounce" -import {is, identity, reject, filter, map, findIndex, equals} from "ramda" -import {ensurePlural} from "hurdak" -import logger from "src/util/logger" - -type Invalidator = (value?: T) => void -type Derivable = Readable | Readable[] -type Subscriber = (value: T) => void -type Unsubscriber = () => void -type R = Record -type M = Map - -export interface Readable { - get: () => T - subscribe(this: void, run: Subscriber, invalidate?: Invalidator): Unsubscriber - derived: (f: (v: T) => U) => Readable - throttle(t: number): Readable -} - -export class Writable implements Readable { - private value: T - private subs: Subscriber[] = [] - - constructor(defaultValue: T, t?: number) { - this.value = defaultValue - - if (t) { - this.notify = throttle(t, this.notify) - } - } - - notify = () => { - for (const sub of this.subs) { - sub(this.value) - } - } - - get() { - return this.value - } - - set(newValue: T) { - this.value = newValue - this.notify() - } - - update(f: (v: T) => T) { - this.set(f(this.value)) - } - - async updateAsync(f: (v: T) => Promise) { - this.set(await f(this.value)) - } - - subscribe(f: Subscriber) { - this.subs.push(f) - - f(this.value) - - return () => { - const idx = findIndex(equals(f), this.subs) - - this.subs.splice(idx, 1) - } - } - - derived(f: (v: T) => U): Derived { - return new Derived(this, f) - } - - throttle = (t: number) => { - return new Derived(this, identity, t) - } -} - -export class Derived implements Readable { - private callerSubs: Subscriber[] = [] - private mySubs: Unsubscriber[] = [] - private stores: Derivable - private getValue: (values: any) => T - private latestValue: T | undefined - - constructor(stores: Derivable, getValue: (values: any) => T, t = 0) { - this.stores = stores - this.getValue = getValue - - if (t) { - this.notify = throttle(t, this.notify) - } - } - - notify = () => { - this.latestValue = undefined - this.callerSubs.forEach(f => f(this.get())) - } - - getInput() { - if (is(Array, this.stores)) { - return ensurePlural(this.stores).map(s => s.get()) - } else { - return this.stores.get() - } - } - - get = (): T => { - // Recalculate if we're not subscribed, because we won't get notified when deps change - if (this.latestValue === undefined || this.mySubs.length === 0) { - this.latestValue = this.getValue(this.getInput()) - } - - return this.latestValue - } - - subscribe(f: Subscriber) { - if (this.callerSubs.length === 0) { - for (const s of ensurePlural(this.stores)) { - this.mySubs.push(s.subscribe(this.notify)) - } - } - - this.callerSubs.push(f) - - f(this.get()) - - return () => { - const idx = findIndex(equals(f), this.callerSubs) - - this.callerSubs.splice(idx, 1) - - if (this.callerSubs.length === 0) { - for (const unsub of this.mySubs.splice(0)) { - unsub() - } - } - } - } - - derived(f: (v: T) => U): Readable { - return new Derived(this, f) as Readable - } - - throttle = (t: number) => { - return new Derived(this, identity, t) - } -} - -export class Key implements Readable { - readonly pk: string - readonly key: string - private base: Writable> - private store: Readable - - constructor(base: Writable>, pk: string, key: string) { - if (!is(Map, base.get())) { - throw new Error("`key` can only be used on map collections") - } - - this.pk = pk - this.key = key - this.base = base - this.store = base.derived(m => m.get(key) as T) - } - - get = () => this.base.get().get(this.key) as T - - subscribe = (f: Subscriber) => this.store.subscribe(f) - - derived = (f: (v: T) => U) => this.store.derived(f) - - throttle = (t: number) => this.store.throttle(t) - - exists = () => this.base.get().has(this.key) - - update = (f: (v: T) => T) => - this.base.update((m: M) => { - if (!this.key) { - throw new Error(`Cannot set key: "${this.key}"`) - } - - // Make sure the pk always get set on the record - const {pk, key} = this - const oldValue = {...m.get(key), [pk]: key} - const newValue = {...f(oldValue), [pk]: key} - - m.set(this.key, newValue) - - return m - }) - - set = (v: T) => this.update(() => v) - - merge = (d: Partial) => this.update(v => ({...v, ...d})) - - remove = () => - this.base.update(m => { - m.delete(this.key) - - return m - }) - - pop = () => { - const v = this.get() - - this.remove() - - return v - } -} - -export class DerivedKey implements Readable { - readonly pk: string - readonly key: string - private base: Readable> - private store: Readable - - constructor(base: Readable>, pk: string, key: string) { - if (!is(Map, base.get())) { - throw new Error("`key` can only be used on map collections") - } - - this.pk = pk - this.key = key - this.base = base - this.store = base.derived(m => m.get(key) as T) - } - - get = () => this.base.get().get(this.key) as T - - subscribe = (f: Subscriber) => this.store.subscribe(f) - - derived = (f: (v: T) => U) => this.store.derived(f) - - throttle = (t: number) => this.store.throttle(t) - - exists = () => this.base.get().has(this.key) -} - -export class Collection implements Readable { - readonly pk: string - readonly mapStore: Writable> - readonly listStore: Readable - - constructor(pk: string, t?: number) { - this.pk = pk - this.mapStore = writable(new Map()) - this.listStore = this.mapStore.derived((m: M) => Array.from(m.values())) - - if (t) { - this.mapStore.notify = throttle(t, this.mapStore.notify) - } - } - - get = () => this.listStore.get() - - getMap = () => this.mapStore.get() - - subscribe = (f: Subscriber) => this.listStore.subscribe(f) - - derived = (f: (v: T[]) => U) => this.listStore.derived(f) - - throttle = (t: number) => this.listStore.throttle(t) - - key = (k: string) => new Key(this.mapStore, this.pk, k) - - set = (xs: T[]) => { - const m = new Map() - - for (const x of xs) { - if (!x) { - logger.error("Empty value passed to collection store") - } else if (!x[this.pk]) { - logger.error(`Value with empty ${this.pk} passed to collection store`, x) - } else { - m.set(x[this.pk], x) - } - } - - this.mapStore.set(m) - } - - update = (f: (v: T[]) => T[]) => this.set(f(this.get())) - - updateAsync = async (f: (v: T[]) => Promise) => this.set(await f(this.get())) - - reject = (f: (v: T) => boolean) => this.update(reject(f)) - - filter = (f: (v: T) => boolean) => this.update(filter(f)) - - map = (f: (v: T) => T) => this.update(map(f)) -} - -export class DerivedCollection implements Readable { - readonly listStore: Derived - readonly mapStore: Readable> - - constructor( - readonly pk: string, - stores: Derivable, - getValue: (values: any) => T[], - t = 0, - ) { - this.listStore = new Derived(stores, getValue, t) - this.mapStore = new Derived(this.listStore, xs => new Map(xs.map(x => [x[pk], x]))) - } - - get = () => this.listStore.get() - - getMap = () => this.mapStore.get() - - subscribe = (f: Subscriber) => this.listStore.subscribe(f) - - derived = (f: (v: T[]) => U) => this.listStore.derived(f) - - throttle = (t: number) => this.listStore.throttle(t) - - key = (k: string) => new DerivedKey(this.mapStore, this.pk, k) -} - -export const writable = (v: T) => new Writable(v) - -export const derived = (stores: Derivable, getValue: (values: any) => T) => - new Derived(stores, getValue) - -export const readable = (v: T) => derived(new Writable(v), identity) as Readable - -export const derivedCollection = ( - pk: string, - stores: Derivable, - getValue: (values: any) => T[], -) => new DerivedCollection(pk, stores, getValue) - -export const key = (base: Writable>, pk: string, key: string) => - new Key(base, pk, key) - -export const collection = (pk: string) => new Collection(pk) diff --git a/src/engine/events/derived.ts b/src/engine/events/derived.ts index 8f59dd93..256d1f27 100644 --- a/src/engine/events/derived.ts +++ b/src/engine/events/derived.ts @@ -1,6 +1,6 @@ import {Tags, getIdAndAddress} from "@coracle.social/util" import {whereEq, groupBy, find} from "ramda" -import {derived, DerivedCollection} from "src/engine/core/utils" +import {derived, DerivedCollection} from "@coracle.social/lib" import {pubkey} from "src/engine/session/state" import {settings} from "src/engine/session/derived" import {getWotScore} from "src/engine/people/utils" diff --git a/src/engine/events/state.ts b/src/engine/events/state.ts index b880f28e..b96e1b1a 100644 --- a/src/engine/events/state.ts +++ b/src/engine/events/state.ts @@ -1,4 +1,4 @@ -import {Collection, Writable} from "src/engine/core/utils" +import {Collection, Writable} from "@coracle.social/lib" import type {Event, ReadReceipt} from "./model" export const _events = new Collection("id", 1000) diff --git a/src/engine/groups/state.ts b/src/engine/groups/state.ts index df5c22db..e78f3f8d 100644 --- a/src/engine/groups/state.ts +++ b/src/engine/groups/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Group, GroupKey, GroupRequest, GroupAlert} from "./model" export const groups = collection("address") diff --git a/src/engine/handlers/commands.ts b/src/engine/handlers/commands.ts index 9fec1b03..87d39fc2 100644 --- a/src/engine/handlers/commands.ts +++ b/src/engine/handlers/commands.ts @@ -1,7 +1,6 @@ import {sortBy} from "ramda" -import {cached} from "@coracle.social/lib" +import {cached, derived} from "@coracle.social/lib" import {Tags} from "@coracle.social/util" -import {derived} from "src/engine/core/utils" import {load} from "src/engine/network/utils" import {hints} from "src/engine/relays/utils" import {follows} from "src/engine/people/derived" diff --git a/src/engine/handlers/state.ts b/src/engine/handlers/state.ts index 38448867..f30630bd 100644 --- a/src/engine/handlers/state.ts +++ b/src/engine/handlers/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Handler, HandlerRec} from "./model" export const handlers = collection("address") diff --git a/src/engine/labels/derived.ts b/src/engine/labels/derived.ts index 289f0d24..a92b634d 100644 --- a/src/engine/labels/derived.ts +++ b/src/engine/labels/derived.ts @@ -1,5 +1,5 @@ import {whereEq} from "ramda" -import {derivedCollection} from "src/engine/core/utils" +import {derivedCollection} from "@coracle.social/lib" import {deletes} from "src/engine/events/state" import {pubkey} from "src/engine/session/state" import type {Event} from "src/engine/events/model" diff --git a/src/engine/labels/state.ts b/src/engine/labels/state.ts index ee0acd44..6c6a4ee2 100644 --- a/src/engine/labels/state.ts +++ b/src/engine/labels/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Event} from "src/engine/events/model" export const _labels = collection("id") diff --git a/src/engine/lists/derived.ts b/src/engine/lists/derived.ts index ec88f654..f248cfe3 100644 --- a/src/engine/lists/derived.ts +++ b/src/engine/lists/derived.ts @@ -1,5 +1,5 @@ import {whereEq, sortBy} from "ramda" -import {derivedCollection} from "src/engine/core/utils" +import {derivedCollection} from "@coracle.social/lib" import {pubkey} from "src/engine/session/state" import {deletes} from "src/engine/events/state" import type {List} from "./model" diff --git a/src/engine/lists/state.ts b/src/engine/lists/state.ts index 7a601ec4..74eac794 100644 --- a/src/engine/lists/state.ts +++ b/src/engine/lists/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {List} from "./model" export const _lists = collection("naddr") diff --git a/src/engine/network/utils/cursor.ts b/src/engine/network/utils/cursor.ts index 41033ec9..c9cd776c 100644 --- a/src/engine/network/utils/cursor.ts +++ b/src/engine/network/utils/cursor.ts @@ -1,12 +1,11 @@ import {mergeLeft, pluck, min, max, identity, sortBy} from "ramda" import {first, sleep} from "hurdak" -import {now} from "@coracle.social/lib" +import {now, writable} from "@coracle.social/lib" import type {Filter} from "@coracle.social/util" import {guessFilterDelta} from "@coracle.social/util" import type {Subscription} from "@coracle.social/network" import type {Event} from "src/engine/events/model" import {sortEventsDesc} from "src/engine/events/utils" -import {writable} from "src/engine/core/utils" import {getUrls} from "./executor" import {subscribe} from "./subscribe" import {Tracker} from "./tracker" diff --git a/src/engine/network/utils/feed.ts b/src/engine/network/utils/feed.ts index 3003f641..e29e3bc2 100644 --- a/src/engine/network/utils/feed.ts +++ b/src/engine/network/utils/feed.ts @@ -1,6 +1,6 @@ import {partition, concat, prop, uniqBy, identity, without, assoc} from "ramda" import {ensurePlural, doPipe, batch} from "hurdak" -import {now} from "@coracle.social/lib" +import {now, writable} from "@coracle.social/lib" import type {Filter} from "@coracle.social/util" import { Tags, @@ -16,7 +16,6 @@ import type {DisplayEvent} from "src/engine/notes/model" import type {Event} from "src/engine/events/model" import {sortEventsDesc, unwrapRepost} from "src/engine/events/utils" import {isEventMuted, isDeleted} from "src/engine/events/derived" -import {writable} from "src/engine/core/utils" import {getUrls} from "./executor" import {subscribe} from "./subscribe" import {MultiCursor} from "./cursor" diff --git a/src/engine/network/utils/thread.ts b/src/engine/network/utils/thread.ts index e310dfd6..633d8cac 100644 --- a/src/engine/network/utils/thread.ts +++ b/src/engine/network/utils/thread.ts @@ -1,9 +1,9 @@ import {uniqBy, identity, prop, sortBy} from "ramda" import {batch} from "hurdak" +import {writable} from "@coracle.social/lib" import {Tags, getIdOrAddress, getIdFilters, getIdAndAddress} from "@coracle.social/util" import type {DisplayEvent} from "src/engine/notes/model" import type {Event} from "src/engine/events/model" -import {writable} from "src/engine/core/utils" import {hints} from "src/engine/relays/utils" import {load} from "./load" diff --git a/src/engine/notifications/derived.ts b/src/engine/notifications/derived.ts index 308af10d..22347e75 100644 --- a/src/engine/notifications/derived.ts +++ b/src/engine/notifications/derived.ts @@ -1,6 +1,6 @@ import {assoc, without, max, sortBy} from "ramda" import {seconds} from "hurdak" -import {now} from "@coracle.social/lib" +import {now, derived} from "@coracle.social/lib" import {Tags} from "@coracle.social/util" import {isLike, reactionKinds, noteKinds, repostKinds} from "src/util/nostr" import {tryJson} from "src/util/misc" @@ -8,7 +8,6 @@ import {isSeen} from "src/engine/events/derived" import {deletes} from "src/engine/events/state" import {unwrapRepost} from "src/engine/events/utils" import {events, isEventMuted} from "src/engine/events/derived" -import {derived} from "src/engine/core/utils" import {groupRequests, groupAdminKeys, groupAlerts} from "src/engine/groups/state" import {getUserCircles} from "src/engine/groups/utils" import {pubkey} from "src/engine/session/state" diff --git a/src/engine/people/derived.ts b/src/engine/people/derived.ts index d30c10d9..6fb5b3ca 100644 --- a/src/engine/people/derived.ts +++ b/src/engine/people/derived.ts @@ -1,7 +1,7 @@ import Fuse from "fuse.js" import {doPipe} from "hurdak" import {defaultTo, map, filter, sortBy} from "ramda" -import {derived} from "src/engine/core/utils" +import {derived} from "@coracle.social/lib" import {pubkey} from "src/engine/session/state" import {user} from "src/engine/session/derived" import type {Person} from "./model" diff --git a/src/engine/people/requests.ts b/src/engine/people/requests.ts index efcb7314..a196dd21 100644 --- a/src/engine/people/requests.ts +++ b/src/engine/people/requests.ts @@ -1,7 +1,7 @@ import {debounce} from "throttle-debounce" import {always} from "ramda" import {noop, sleep} from "hurdak" -import {writable} from "src/engine/core/utils" +import {writable} from "@coracle.social/lib" import {load} from "src/engine/network/utils" import {searchableRelays} from "src/engine/relays/derived" import type {Event} from "src/engine/events/model" diff --git a/src/engine/people/state.ts b/src/engine/people/state.ts index acbd51a5..d84be0b4 100644 --- a/src/engine/people/state.ts +++ b/src/engine/people/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Person} from "src/engine/people/model" export const people = collection("pubkey") diff --git a/src/engine/relays/state.ts b/src/engine/relays/state.ts index e9c32a7d..bfccc56a 100644 --- a/src/engine/relays/state.ts +++ b/src/engine/relays/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Relay} from "./model" export const relays = collection("url") diff --git a/src/engine/session/derived.ts b/src/engine/session/derived.ts index 79e92214..48a2ae12 100644 --- a/src/engine/session/derived.ts +++ b/src/engine/session/derived.ts @@ -1,4 +1,4 @@ -import {derived} from "src/engine/core/utils" +import {derived} from "@coracle.social/lib" import type {Person} from "src/engine/people/model" import {people} from "src/engine/people/state" import type {Session} from "./model" diff --git a/src/engine/session/state.ts b/src/engine/session/state.ts index 7eafb91b..696ff642 100644 --- a/src/engine/session/state.ts +++ b/src/engine/session/state.ts @@ -1,4 +1,4 @@ -import {writable} from "src/engine/core/utils" +import {writable} from "@coracle.social/lib" import type {Session} from "./model" export const env = writable>({}) diff --git a/src/engine/topics/state.ts b/src/engine/topics/state.ts index c8a09ac0..23b0f021 100644 --- a/src/engine/topics/state.ts +++ b/src/engine/topics/state.ts @@ -1,4 +1,4 @@ -import {collection} from "src/engine/core/utils" +import {collection} from "@coracle.social/lib" import type {Topic} from "./model" export const topics = collection("name") diff --git a/src/partials/state.ts b/src/partials/state.ts index d83de6f0..674ece16 100644 --- a/src/partials/state.ts +++ b/src/partials/state.ts @@ -1,9 +1,9 @@ import {debounce} from "throttle-debounce" import {prop, last, fromPairs} from "ramda" import {randomId, Storage} from "hurdak" +import type {Writable} from "@coracle.social/lib" +import {writable} from "@coracle.social/lib" import {parseHex} from "src/util/html" -import type {Writable} from "src/engine" -import {writable} from "src/engine" export const synced = (key: string, defaultValue: any) => { const store = writable(Storage.getJson(key) || defaultValue) diff --git a/src/util/router.ts b/src/util/router.ts index d7ddd71f..3f8a519d 100644 --- a/src/util/router.ts +++ b/src/util/router.ts @@ -1,9 +1,9 @@ import {takeWhile, find, filter, identity, mergeLeft, reject} from "ramda" import {first, randomId, filterVals} from "hurdak" +import {writable} from "@coracle.social/lib" import logger from "src/util/logger" import {buildQueryString, parseQueryString, updateIn} from "src/util/misc" import {globalHistory} from "src/util/history" -import {writable} from "src/engine" // Adapted from https://github.com/EmilTholin/svelte-routing/blob/master/src/utils.js