SYMBOL INDEX (349 symbols across 38 files) FILE: esbuild.config.mjs function reporterPlugin (line 26) | function reporterPlugin() { FILE: examples/example.py class Note (line 19) | class Note: method __init__ (line 20) | def __init__(self, id, text, creation_date, modification_date, not_del... class EncryptedNote (line 30) | class EncryptedNote: method __init__ (line 31) | def __init__(self, id, modification_date, encrypted_base64, iv): class LoginData (line 37) | class LoginData: method __init__ (line 38) | def __init__(self, username, password_client_hash): class SignupData (line 42) | class SignupData(LoginData): method __init__ (line 43) | def __init__(self, username, password_client_hash, encryption_salt): class LoginResponse (line 47) | class LoginResponse: method __init__ (line 48) | def __init__(self, username, token, encryption_salt): class Credentials (line 53) | class Credentials(LoginResponse): method __init__ (line 54) | def __init__(self, username, token, encryption_salt, jwk): function main (line 58) | def main(): function usage_and_exit (line 88) | def usage_and_exit(): function signup (line 99) | def signup(username, password): function login (line 114) | def login(username, password): function create_note (line 127) | def create_note(text): function get_note (line 147) | def get_note(id): function encrypt_note (line 165) | def encrypt_note(note, key): function decrypt_note (line 179) | def decrypt_note(encrypted_note, key): function read_credentials (line 193) | def read_credentials(): function write_credentials (line 198) | def write_credentials(credentials): function import_key (line 204) | def import_key(credentials): function create_credentials (line 209) | def create_credentials(res, password): function post (line 224) | def post(pathname, body, credentials=None): function calc_password_hash (line 235) | def calc_password_hash(username, password): function bytes_to_hex_string (line 241) | def bytes_to_hex_string(bytes): function hex_string_to_bytes (line 245) | def hex_string_to_bytes(hex_string): FILE: examples/example.ts type Note (line 4) | type Note = { type EncryptedNote (line 31) | type EncryptedNote = { type LoginData (line 45) | type LoginData = { type SignupData (line 50) | type SignupData = { type LoginResponse (line 56) | type LoginResponse = { type Credentials (line 66) | type Credentials = LoginResponse & { jwk: webcrypto.JsonWebKey }; constant BASE_URL (line 68) | const BASE_URL = 'https://unforget.computing-den.com'; function main (line 70) | async function main() { function usageAndExit (line 107) | function usageAndExit() { function signup (line 119) | async function signup(username: string, password: string) { function login (line 128) | async function login(username: string, password: string) { function createNote (line 136) | async function createNote(text: string) { function getNote (line 157) | async function getNote(id?: string) { function encryptNote (line 176) | async function encryptNote(note: Note, key: webcrypto.CryptoKey): Promis... function decryptNote (line 198) | async function decryptNote(encryptedNote: EncryptedNote, key: webcrypto.... function readCredentials (line 216) | function readCredentials(): Credentials { function writeCredentials (line 223) | function writeCredentials(credentials: Credentials) { function importKey (line 232) | async function importKey(credentials: Credentials): Promise { function createCredentials (line 241) | async function createCredentials(res: LoginResponse, password: string): ... function post (line 266) | async function post(pathname: string, body?: any, credentials?: Crede... function calcPasswordHash (line 283) | async function calcPasswordHash(username: string, password: string): Pro... function bytesToHexString (line 294) | function bytesToHexString(bytes: Uint8Array): string { function hexStringToBytes (line 303) | function hexStringToBytes(str: string): Uint8Array { FILE: src/client/AboutPage.tsx function AboutPage (line 12) | function AboutPage() { FILE: src/client/App.tsx function App (line 15) | function App() { function Fallback (line 82) | function Fallback() { function Auth (line 86) | function Auth(props: { children: React.ReactNode }) { FILE: src/client/DemoPage.tsx function DemoPage (line 5) | function DemoPage() { FILE: src/client/Editor.tsx type EditorProps (line 11) | type EditorProps = { type EditorContext (line 27) | type EditorContext = { type Selection (line 33) | type Selection = { start: number; end: number; direction: 'forward' | 'b... function replaceText (line 40) | function replaceText(deleteStart: number, deleteEnd: number, text: strin... function replaceListItemPrefix (line 54) | function replaceListItemPrefix(listItem: md.ListItem, newListItem: md.Li... function cycleListStyle (line 60) | function cycleListStyle() { function focus (line 91) | function focus() { function changeCb (line 101) | function changeCb() { function keyDownCb (line 105) | function keyDownCb(e: React.KeyboardEvent) { function clickCb (line 166) | function clickCb(e: React.MouseEvent) { function pasteCb (line 193) | function pasteCb(e: React.ClipboardEvent) { FILE: src/client/ExportPage.tsx function ExportPage (line 13) | function ExportPage() { function offerDownload (line 35) | function offerDownload(filename: string, text: string) { FILE: src/client/ImportPage.tsx type ImportKeys (line 22) | type ImportKeys = keyof typeof importers; function ImportPage (line 24) | function ImportPage() { function importUnforget (line 104) | async function importUnforget(jsonFile: File): Promise { function importKeep (line 108) | async function importKeep(zipFile: File, note: t.Note): Promise { function validateGoogleKeepJson (line 152) | function validateGoogleKeepJson(json: any): string | undefined { function importApple (line 164) | async function importApple(zipFile: File, note: t.Note): Promise { function hasOption (line 232) | function hasOption(text: string, label: string): boolean { FILE: src/client/LoginPage.tsx type LoginPageProps (line 8) | type LoginPageProps = {}; function LoginPage (line 10) | function LoginPage(props: LoginPageProps) { FILE: src/client/Menu.tsx type MenuItem (line 4) | type MenuItem = { type MenuProps (line 13) | type MenuProps = { menu: MenuItem[]; side: 'left' | 'right' | 'center'; ... function Menu (line 15) | function Menu(props: MenuProps) { FILE: src/client/NotePage.tsx function NotePage (line 16) | function NotePage() { function notePageLoader (line 212) | async function notePageLoader({ params }: RouteMatch): Promise(pathname: string, body?: any, params?: Record { function getResponseContentType (line 31) | function getResponseContentType(res: Response): string | undefined { FILE: src/client/appStore.tsx function get (line 8) | function get(): t.AppStore { function set (line 12) | function set(newStore: t.AppStore) { function update (line 18) | function update(recipe: t.AppStoreRecipe) { function addListener (line 22) | function addListener(listener: t.AppStoreListener) { function removeListener (line 27) | function removeListener(listener: t.AppStoreListener) { function use (line 32) | function use(): t.AppStore { FILE: src/client/appStoreActions.tsx function initAppStore (line 16) | async function initAppStore() { function setUpDemo (line 49) | async function setUpDemo() { function updateNotes (line 58) | async function updateNotes() { function reduceNotePages (line 88) | function reduceNotePages(lastItemIndex: number) { function updateQueueCount (line 110) | async function updateQueueCount() { function login (line 121) | async function login(credentials: t.UsernamePassword, opts?: { importDem... function signup (line 134) | async function signup(credentials: t.UsernamePassword, opts?: { importDe... function logout (line 155) | async function logout() { function clearStorage (line 179) | async function clearStorage() { function gotError (line 188) | function gotError(error: Error) { function showMessage (line 193) | function showMessage(text: string, opts?: { type?: 'info' | 'error' }) { function saveNote (line 207) | async function saveNote(note: t.Note, opts?: { message?: string; immedia... function saveNotes (line 211) | async function saveNotes(notes: t.Note[], opts?: { message?: string; imm... function saveNoteAndQuickUpdateNotes (line 240) | async function saveNoteAndQuickUpdateNotes(note: t.Note) { function toggleNoteSelection (line 255) | function toggleNoteSelection(note: t.Note) { function archiveNoteSelection (line 272) | async function archiveNoteSelection() { function unarchiveNoteSelection (line 289) | async function unarchiveNoteSelection() { function moveNoteSelectionUp (line 306) | async function moveNoteSelectionUp() { function moveNoteSelectionDown (line 310) | async function moveNoteSelectionDown() { function moveNoteSelectionToTop (line 314) | async function moveNoteSelectionToTop() { function moveNoteSelectionToBottom (line 318) | async function moveNoteSelectionToBottom() { function moveNoteSelection (line 322) | async function moveNoteSelection(moveFn: (ids: string[]) => Promise any; function init (line 9) | function init() { function addListener (line 26) | function addListener(listener: Listener) { function removeListener (line 30) | function removeListener(listener: Listener) { function broadcast (line 38) | function broadcast(message: Omit { function generateIV (line 20) | function generateIV(): Uint8Array { function bytesToBase64 (line 24) | async function bytesToBase64(buffer: ArrayBuffer): Promise { function base64ToBytes (line 36) | async function base64ToBytes(base64: string): Promise { function makeEncryptionKey (line 47) | async function makeEncryptionKey(password: string, salt: string): Promis... function exportEncryptionKey (line 66) | async function exportEncryptionKey(key: CryptoKey): Promise { function importEncryptionKey (line 70) | async function importEncryptionKey(key: JsonWebKey): Promise { function encrypt (line 74) | async function encrypt(data: BufferSource, key: CryptoKey): Promise void, ms: number) { function useCallbackCancelEvent (line 12) | function useCallbackCancelEvent(cb: () => any, deps: React.DependencyLis... function useClickWithoutDrag (line 22) | function useClickWithoutDrag(cb: React.MouseEventHandler): { function useStoreAndRestoreScrollY (line 44) | function useStoreAndRestoreScrollY() { FILE: src/client/index.tsx function setup (line 16) | async function setup() { function registerServiceWorker (line 98) | async function registerServiceWorker() { function handleServiceWorkerMessage (line 124) | async function handleServiceWorkerMessage(message: t.ServiceWorkerToClie... function handleSyncEvent (line 144) | async function handleSyncEvent(event: SyncEvent) { function handleBroadcastMessage (line 169) | function handleBroadcastMessage(message: t.BroadcastChannelMessage) { FILE: src/client/logger.ts function log (line 3) | function log(...args: any[]) { function stringify (line 19) | function stringify(...args: any[]): string { FILE: src/client/router.tsx type HistoryState (line 12) | type HistoryState = { index: number; scrollY?: number }; type Route (line 14) | type Route = { type Loader (line 20) | type Loader = (match: RouteMatch) => Promise; type RouterCtxType (line 22) | type RouterCtxType = { type RouterLoadingCtxType (line 30) | type RouterLoadingCtxType = { type Params (line 34) | type Params = Record; type RouteMatch (line 37) | type RouteMatch = { route: Route; params: Params; pathname: string }; type WrappedPromise (line 39) | type WrappedPromise = { read: () => T; status: 'pending' | 'success' ... function Router (line 45) | function Router(props: { routes: Route[]; fallback: React.ReactNode }) { function Link (line 80) | function Link(props: { to: string; className?: string; children: React.R... function Suspender (line 96) | function Suspender(props: { children: Route['element'] }) { function useRouterLoading (line 106) | function useRouterLoading(): RouterLoadingCtxType { function useRouter (line 110) | function useRouter(): RouterCtxType { function matchRoute (line 114) | function matchRoute(pathname: string, routes: Route[]): RouteMatch | und... function matchParts (line 123) | function matchParts(actualParts: string[], expectedParts: string[]): Par... function getLocationPathname (line 147) | function getLocationPathname(): string { function getLocationSearch (line 152) | function getLocationSearch(): string { function getHistoryState (line 157) | function getHistoryState(): HistoryState { function subscribeToHistoryUpdates (line 161) | function subscribeToHistoryUpdates(callback: () => void) { function wrapPromise (line 172) | function wrapPromise(promise: Promise): WrappedPromise { function assertHistoryStateType (line 199) | function assertHistoryStateType(data: any) { function setUpManualScrollRestoration (line 212) | function setUpManualScrollRestoration() { function storeScrollY (line 216) | function storeScrollY() { function patchHistory (line 226) | function patchHistory() { FILE: src/client/serviceWorker.ts constant CACHE_NAME (line 12) | const CACHE_NAME = `unforget-${CACHE_VERSION}`; constant APP_STATIC_RESOURCES (line 13) | const APP_STATIC_RESOURCES = ['/', '/style.css', '/index.js', '/manifest... function installServiceWorker (line 47) | async function installServiceWorker() { function activateServiceWorker (line 58) | async function activateServiceWorker() { function handleFetch (line 83) | async function handleFetch(event: FetchEvent): Promise { function handleClientMessage (line 123) | async function handleClientMessage(client: Client, message: ClientToServ... FILE: src/client/serviceWorkerToClientApi.ts function postToClient (line 7) | function postToClient(client: Client, message: ServiceWorkerToClientMess... function postToClients (line 11) | async function postToClients(message: ServiceWorkerToClientMessage, opti... FILE: src/client/storage.ts constant DB_NAME (line 9) | const DB_NAME = 'unforget'; constant NOTES_STORE (line 10) | const NOTES_STORE = 'notes'; constant NOTES_STORE_ORDER_INDEX (line 11) | const NOTES_STORE_ORDER_INDEX = 'orderIndex'; constant NOTES_QUEUE_STORE (line 12) | const NOTES_QUEUE_STORE = 'notesQueue'; constant SETTINGS_STORE (line 13) | const SETTINGS_STORE = 'settings'; type SaveNoteQueueItem (line 15) | type SaveNoteQueueItem = { note: t.Note; resolve: () => void; reject: (e... function getStorage (line 20) | async function getStorage(): Promise { function transaction (line 70) | async function transaction( function saveNote (line 102) | async function saveNote(note: t.Note) { function saveNotes (line 106) | async function saveNotes(notes: t.Note[]) { function enqueueNote (line 112) | function enqueueNote(note: t.Note): Promise { function saveNextNotesInQueue (line 118) | async function saveNextNotesInQueue() { function saveNoteQueueItems (line 140) | async function saveNoteQueueItems(items: SaveNoteQueueItem[]) { function createNoteHeadFromNote (line 149) | function createNoteHeadFromNote(note: t.Note): t.NoteHead { function moveNotesUp (line 153) | async function moveNotesUp(ids: string[]) { function moveNotesDown (line 197) | async function moveNotesDown(ids: string[]) { function moveNotesToTop (line 242) | async function moveNotesToTop(ids: string[]) { function moveNotesToBottom (line 280) | async function moveNotesToBottom(ids: string[]) { function isSavingNote (line 317) | function isSavingNote(): boolean { function getAllNotes (line 321) | async function getAllNotes(): Promise { function getNotes (line 330) | async function getNotes(opts?: { function getNotesById (line 413) | async function getNotesById(ids: string[]): Promise<(t.Note | undefined)... function getNote (line 421) | async function getNote(id: string): Promise { function clearAll (line 425) | async function clearAll() { function waitForDBRequest (line 440) | async function waitForDBRequest(req: IDBRequest): Promise { function countQueuedNotes (line 451) | async function countQueuedNotes(): Promise { function getSetting (line 456) | async function getSetting(key: string): Promise { function clearUser (line 487) | async function clearUser() { FILE: src/client/sync.ts type SyncEvent (line 12) | type SyncEvent = type SyncListener (line 17) | type SyncListener = (event: SyncEvent) => any; function callSyncListeners (line 25) | function callSyncListeners(event: SyncEvent) { function addSyncEventListener (line 29) | function addSyncEventListener(listener: SyncListener) { function removeSyncEventListener (line 33) | function removeSyncEventListener(listener: SyncListener) { function syncInInterval (line 38) | function syncInInterval() { function sync (line 45) | async function sync() { function isSyncing (line 138) | function isSyncing(): boolean { function getDeltaSyncData (line 142) | async function getDeltaSyncData(user: t.ClientLocalUser): Promise { function mergeSyncData (line 179) | async function mergeSyncData( function mergeSyncHeadsData (line 246) | async function mergeSyncHeadsData(reqSyncHeadsData: t.SyncHeadsData, res... function requireQueueSync (line 279) | function requireQueueSync() { FILE: src/common/mdFns.ts type Range (line 11) | type Range = { start: number; end: number }; type ListItem (line 12) | type ListItem = { function isCursorOnCheckbox (line 36) | function isCursorOnCheckbox(l: ListItem, i: number) { function toggleListItemCheckbox (line 41) | function toggleListItemCheckbox(l: ListItem): ListItem { function setListItemCheckbox (line 45) | function setListItemCheckbox(l: ListItem, checked: boolean): ListItem { function removeListItemCheckbox (line 49) | function removeListItemCheckbox(l: ListItem): ListItem { function addListItemCheckbox (line 54) | function addListItemCheckbox(l: ListItem): ListItem { function removeListItemType (line 60) | function removeListItemType(l: ListItem): ListItem { function incrementListItemNumber (line 66) | function incrementListItemNumber(l: ListItem): ListItem { function parseListItem (line 75) | function parseListItem(line: string): ListItem { function getListItemCheckboxRange (line 84) | function getListItemCheckboxRange(l: ListItem): Range { function stringifyListItem (line 89) | function stringifyListItem(l: ListItem): string { function stringifyListItemPrefix (line 93) | function stringifyListItemPrefix(l: ListItem): string { function insertText (line 97) | function insertText(text: string, segment: string, range: Range): string { function getLineRangeAt (line 101) | function getLineRangeAt(text: string, i: number): Range { function getLine (line 105) | function getLine(text: string, range: Range): string { function getLineStart (line 109) | function getLineStart(text: string, i: number): number { function getLineEnd (line 114) | function getLineEnd(text: string, i: number): number { function skipWhitespaceSameLine (line 119) | function skipWhitespaceSameLine(text: string, i: number): number { FILE: src/common/types.ts type Note (line 3) | type Note = { type EncryptedNote (line 30) | type EncryptedNote = EncryptedData & { type EncryptedData (line 35) | type EncryptedData = { type DBEncryptedNote (line 43) | type DBEncryptedNote = EncryptedNote & { type DBUser (line 47) | type DBUser = { type DBClient (line 54) | type DBClient = { type SignupData (line 61) | type SignupData = { type LoginData (line 67) | type LoginData = { type LoginResponse (line 72) | type LoginResponse = { type UsernamePassword (line 78) | type UsernamePassword = { type SyncData (line 83) | type SyncData = { type SyncHeadsData (line 88) | type SyncHeadsData = { type NoteHead (line 93) | type NoteHead = { type DBNoteHead (line 98) | type DBNoteHead = NoteHead & { type DeltaSyncReq (line 102) | type DeltaSyncReq = SyncData; type DeltaSyncResNormal (line 104) | type DeltaSyncResNormal = { type DeltaSyncResRequireQueueSync (line 108) | type DeltaSyncResRequireQueueSync = { type DeltaSyncRes (line 112) | type DeltaSyncRes = DeltaSyncResNormal | DeltaSyncResRequireQueueSync; type QueueSyncReq (line 114) | type QueueSyncReq = SyncHeadsData; type QueueSyncRes (line 116) | type QueueSyncRes = SyncHeadsData; type ServerConfig (line 118) | type ServerConfig = { type ServerUserClient (line 122) | type ServerUserClient = { type ClientLocalUser (line 127) | type ClientLocalUser = { type AppStore (line 133) | type AppStore = { type AppStoreRecipe (line 153) | type AppStoreRecipe = (draft: Draft) => AppStore | void; type AppStoreListener (line 154) | type AppStoreListener = (newStore: AppStore, oldStore: AppStore) => void; type ParsedLine (line 156) | type ParsedLine = { type ServerErrorJSON (line 170) | type ServerErrorJSON = { type ServerErrorType (line 176) | type ServerErrorType = 'app_requires_update' | 'generic'; type HistoryState (line 178) | type HistoryState = { type ClientToServiceWorkerMessage (line 182) | type ClientToServiceWorkerMessage = void; type ServiceWorkerToClientMessage (line 190) | type ServiceWorkerToClientMessage = type BroadcastChannelMessage (line 198) | type BroadcastChannelMessage = FILE: src/common/util.ts constant CACHE_VERSION (line 4) | const CACHE_VERSION = 188; function assert (line 6) | function assert(condition: any, message: string): asserts condition { function isNoteNewerThan (line 10) | function isNoteNewerThan(a: t.NoteHead, b?: t.NoteHead): boolean { function escapeRegExp (line 15) | function escapeRegExp(str: string): string { function calcNewSelection (line 89) | function calcNewSelection( function bytesToHexString (line 103) | function bytesToHexString(bytes: Uint8Array): string { function hexStringToBytes (line 109) | function hexStringToBytes(str: string): BufferSource { class ServerError (line 119) | class ServerError extends Error { method constructor (line 120) | constructor( method fromJSON (line 128) | static fromJSON(json: any): ServerError { method toJSON (line 132) | toJSON() { function createNewNote (line 137) | function createNewNote(text: string): t.Note { function formatDateTime (line 152) | function formatDateTime(date: Date) { FILE: src/server/db.ts function initDB (line 9) | function initDB() { function get (line 66) | function get(): Database.Database { function getSyncNumber (line 70) | function getSyncNumber(client: t.ServerUserClient) { function getQueuedNotes (line 74) | function getQueuedNotes(client: t.ServerUserClient): t.EncryptedNote[] { function getQueuedNoteHeads (line 81) | function getQueuedNoteHeads(client: t.ServerUserClient): t.NoteHead[] { function getNotes (line 85) | function getNotes(client: t.ServerUserClient, ids?: string[]): t.Encrypt... function getNoteHeads (line 98) | function getNoteHeads(client: t.ServerUserClient): t.NoteHead[] { function dbNoteToNote (line 102) | function dbNoteToNote(dbNote: t.DBEncryptedNote): t.EncryptedNote { function logout (line 106) | function logout(token: string) { function mergeSyncData (line 116) | function mergeSyncData( function mergeSyncHeadsData (line 181) | function mergeSyncHeadsData( function importNotes (line 229) | function importNotes(username: string, notes: t.EncryptedNote[]) { function prepareInsertIntoQueue (line 263) | function prepareInsertIntoQueue(): Statement<[t.DBNoteHead]> { function preparePutNote (line 273) | function preparePutNote(): Statement<[t.DBEncryptedNote]> { FILE: src/server/index.ts constant PUBLIC (line 13) | const PUBLIC = path.join(process.cwd(), 'public'); constant DIST_PUBLIC (line 14) | const DIST_PUBLIC = path.join(process.cwd(), 'dist/public'); type Locals (line 20) | interface Locals { function loginAndRespond (line 138) | function loginAndRespond(user: t.DBUser, res: express.Response) { function calcDoublePasswordHash (line 282) | async function calcDoublePasswordHash(password_client_hash: string, pass... function computeSHA256 (line 287) | async function computeSHA256(data: Uint8Array): Promise { function authenticate (line 292) | function authenticate(_req: express.Request, res: express.Response, next... function generateRandomCryptoString (line 300) | function generateRandomCryptoString(): string { function log (line 306) | function log(res: express.Response, ...args: any[]) { function logDebug (line 310) | function logDebug(res: express.Response, ...args: any[]) { function logError (line 316) | function logError(res: express.Response, ...args: any[]) { function getClientStr (line 320) | function getClientStr(res: express.Response): string { FILE: src/server/validateEnvVars.ts type KeyType (line 10) | type KeyType = (typeof keys)[number]; type ProcessEnv (line 14) | interface ProcessEnv extends Record {}