vertex-notes 0.3.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-23CKP3YP.js +27 -0
- package/dist/{chunk-PBF5EE4Y.js → chunk-DRIWYEQE.js} +0 -1
- package/dist/{chunk-AU5U4RDS.js → chunk-K5SQERJ7.js} +151 -16
- package/dist/{chunk-4TVWJ4LN.js → chunk-LXT34CD7.js} +2 -3
- package/dist/commands/capture.js +3 -4
- package/dist/commands/daily.js +3 -4
- package/dist/commands/delete.js +3 -4
- package/dist/commands/edit.js +3 -8
- package/dist/commands/export.js +3 -4
- package/dist/commands/hello.js +1 -2
- package/dist/commands/help.js +1 -2
- package/dist/commands/howto.js +0 -1
- package/dist/commands/import.js +3 -4
- package/dist/commands/interactive.js +45 -4
- package/dist/commands/login.js +2 -3
- package/dist/commands/logout.js +1 -2
- package/dist/commands/new.js +3 -4
- package/dist/commands/notes.js +3 -4
- package/dist/commands/restore.js +3 -4
- package/dist/commands/search.js +3 -4
- package/dist/commands/status.js +3 -4
- package/dist/commands/syntax.js +0 -1
- package/dist/commands/tags.js +3 -4
- package/dist/commands/today.js +3 -4
- package/dist/commands/trash/empty.js +7 -5
- package/dist/commands/trash/index.js +3 -4
- package/dist/commands/view.js +3 -4
- package/dist/commands/whoami.js +1 -2
- package/dist/index.js +0 -1
- package/dist/lib/client.js +3 -4
- package/dist/lib/config.js +1 -2
- package/dist/lib/file-cleanup.js +7 -0
- package/package.json +1 -1
- package/dist/chunk-4TVWJ4LN.js.map +0 -1
- package/dist/chunk-AU5U4RDS.js.map +0 -1
- package/dist/chunk-PBF5EE4Y.js.map +0 -1
- package/dist/commands/capture.js.map +0 -1
- package/dist/commands/daily.js.map +0 -1
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/edit.js.map +0 -1
- package/dist/commands/export.js.map +0 -1
- package/dist/commands/hello.js.map +0 -1
- package/dist/commands/help.js.map +0 -1
- package/dist/commands/howto.js.map +0 -1
- package/dist/commands/import.js.map +0 -1
- package/dist/commands/interactive.js.map +0 -1
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/notes.js.map +0 -1
- package/dist/commands/restore.js.map +0 -1
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/syntax.js.map +0 -1
- package/dist/commands/tags.js.map +0 -1
- package/dist/commands/today.js.map +0 -1
- package/dist/commands/trash/empty.js.map +0 -1
- package/dist/commands/trash/index.js.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/commands/whoami.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/client.js.map +0 -1
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/md-to-tiptap.js +0 -250
- package/dist/lib/md-to-tiptap.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/interactive.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { listNotes, getBlocksForNote, saveNoteContent, exportNoteAsMarkdown, type Block } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\nimport { markdownToTiptap } from \"@vertex/core\";\n\ninterface TuiItem {\n kind: \"text\" | \"todo\" | \"heading\" | \"code\" | \"mermaid\" | \"math\" | \"callout\" | \"divider\" | \"bullet\" | \"quote\" | \"file\" | \"image\";\n text: string;\n checked: boolean;\n level?: number;\n language?: string;\n variant?: string;\n raw?: Record<string, unknown>;\n}\n\nconst DIM = \"\\x1b[90m\";\nconst BOLD = \"\\x1b[1m\";\nconst GREEN = \"\\x1b[32m\";\nconst CYAN = \"\\x1b[36m\";\nconst YELLOW = \"\\x1b[33m\";\nconst PURPLE = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\nconst STRIKE = \"\\x1b[9m\";\n\nfunction extractText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractText).join(\"\");\n}\n\nfunction blocksToItems(blocks: Block[]): TuiItem[] {\n const items: TuiItem[] = [];\n for (const b of blocks) {\n const meta = b.metadata as Record<string, unknown>;\n const tiptap = meta.tiptap as Record<string, unknown> | undefined;\n if (!tiptap) {\n if (b.content.trim()) items.push({ kind: \"text\", text: b.content, checked: false });\n continue;\n }\n\n const type = tiptap.type as string;\n const attrs = (tiptap.attrs ?? {}) as Record<string, unknown>;\n\n switch (type) {\n case \"heading\":\n items.push({ kind: \"heading\", text: extractText(tiptap), checked: false, level: (attrs.level as number) ?? 1 });\n break;\n case \"taskList\":\n for (const child of (tiptap.content ?? []) as Array<Record<string, unknown>>) {\n const ca = (child.attrs ?? {}) as Record<string, unknown>;\n items.push({ kind: \"todo\", text: extractText(child), checked: ca.checked === true });\n }\n break;\n case \"bulletList\":\n for (const child of (tiptap.content ?? []) as Array<Record<string, unknown>>) {\n items.push({ kind: \"bullet\", text: extractText(child), checked: false });\n }\n break;\n case \"orderedList\":\n (tiptap.content as Array<Record<string, unknown>> ?? []).forEach((child, idx) => {\n items.push({ kind: \"text\", text: `${idx + 1}. ${extractText(child)}`, checked: false });\n });\n break;\n case \"codeBlock\":\n items.push({ kind: \"code\", text: extractText(tiptap), checked: false, language: (attrs.language as string) ?? \"\" });\n break;\n case \"mermaidBlock\":\n items.push({ kind: \"mermaid\", text: extractText(tiptap), checked: false });\n break;\n case \"mathBlock\":\n items.push({ kind: \"math\", text: extractText(tiptap), checked: false });\n break;\n case \"calloutBlock\":\n items.push({ kind: \"callout\", text: extractText(tiptap), checked: false, variant: (attrs.variant as string) ?? \"info\" });\n break;\n case \"blockquote\":\n items.push({ kind: \"quote\", text: extractText(tiptap), checked: false });\n break;\n case \"horizontalRule\":\n items.push({ kind: \"divider\", text: \"\", checked: false });\n break;\n case \"image\":\n items.push({ kind: \"image\", text: (attrs.alt as string) || (attrs.src as string) || \"image\", checked: false });\n break;\n case \"fileBlock\":\n items.push({ kind: \"file\", text: (attrs.filename as string) || \"file\", checked: false });\n break;\n default: {\n const text = extractText(tiptap);\n if (text.trim()) items.push({ kind: \"text\", text, checked: false });\n }\n }\n }\n return items;\n}\n\nfunction renderItem(item: TuiItem, selected: boolean): string {\n const ptr = selected ? `${CYAN} ▸ ${R}` : \" \";\n\n switch (item.kind) {\n case \"heading\": {\n const hashes = \"#\".repeat(item.level ?? 1);\n return `${ptr}${BOLD}${hashes} ${item.text}${R}`;\n }\n case \"todo\": {\n const box = item.checked ? `${GREEN}[✓]${R}` : `${DIM}[ ]${R}`;\n const text = item.checked ? `${DIM}${STRIKE}${item.text}${R}` : item.text;\n return `${ptr}${box} ${text}`;\n }\n case \"bullet\":\n return `${ptr}${DIM}•${R} ${item.text}`;\n case \"code\":\n return `${ptr}${DIM}┌ code${item.language ? ` (${item.language})` : \"\"}${R}\\n${item.text.split(\"\\n\").map((l) => ` ${DIM}│${R} ${l}`).join(\"\\n\")}\\n ${DIM}└──${R}`;\n case \"mermaid\":\n return `${ptr}${PURPLE}┌ mermaid${R}\\n${item.text.split(\"\\n\").map((l) => ` ${PURPLE}│${R} ${DIM}${l}${R}`).join(\"\\n\")}\\n ${PURPLE}└──${R}`;\n case \"math\":\n return `${ptr}${YELLOW}┌ math${R}\\n${item.text.split(\"\\n\").map((l) => ` ${YELLOW}│${R} ${l}`).join(\"\\n\")}\\n ${YELLOW}└──${R}`;\n case \"callout\":\n return `${ptr}${CYAN}[${(item.variant ?? \"info\").toUpperCase()}]${R} ${item.text}`;\n case \"quote\":\n return `${ptr}${DIM}▎${R} ${DIM}${item.text}${R}`;\n case \"divider\":\n return ` ${DIM}────────────────────────────${R}`;\n case \"image\":\n return `${ptr}${DIM}[image: ${item.text}]${R}`;\n case \"file\":\n return `${ptr}${DIM}[file: ${item.text}]${R}`;\n default:\n return `${ptr}${item.text}`;\n }\n}\n\nfunction render(items: TuiItem[], cursor: number, mode: string, inputBuffer: string, noteTitle: string): void {\n process.stdout.write(\"\\x1bc\");\n process.stdout.write(`${BOLD} ${noteTitle}${R}\\n`);\n process.stdout.write(`${DIM} ─────────────────────────────────────${R}\\n\\n`);\n\n for (let i = 0; i < items.length; i++) {\n process.stdout.write(renderItem(items[i], i === cursor) + \"\\n\");\n }\n\n if (items.length === 0) {\n process.stdout.write(` ${DIM}(empty)${R}\\n`);\n }\n\n process.stdout.write(`\\n${DIM} ─────────────────────────────────────${R}\\n`);\n\n if (mode === \"input-todo\") {\n process.stdout.write(` ${YELLOW}New todo:${R} ${inputBuffer}\\x1b[7m \\x1b[0m\\n`);\n } else if (mode === \"input-text\") {\n process.stdout.write(` ${YELLOW}New text:${R} ${inputBuffer}\\x1b[7m \\x1b[0m\\n`);\n } else {\n process.stdout.write(` ${DIM}↑↓ move Enter toggle t todo n text d delete e edit in $EDITOR s save q quit${R}\\n`);\n }\n}\n\nexport default class Interactive extends Command {\n static override description = \"Interactive note editor with todo toggling\";\n\n static override args = {\n title: Args.string({ description: \"Note title (partial match)\", required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(Interactive);\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId });\n const query = args.title.toLowerCase();\n const match = notes.find((n) => !n.deleted_at && n.title.toLowerCase().includes(query));\n\n if (!match) {\n this.error(`No note matching \"${args.title}\"`);\n }\n\n const blocks = await getBlocksForNote(client, match.id);\n let items = blocksToItems(blocks);\n let cursor = 0;\n let dirty = false;\n let mode = \"normal\";\n let inputBuffer = \"\";\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding(\"utf8\");\n\n render(items, cursor, mode, inputBuffer, match.title);\n\n const cleanup = () => {\n process.stdin.setRawMode(false);\n process.stdout.write(\"\\x1bc\");\n };\n\n const save = async () => {\n const md = items.map((item) => {\n switch (item.kind) {\n case \"heading\": return `${\"#\".repeat(item.level ?? 1)} ${item.text}`;\n case \"todo\": return `- [${item.checked ? \"x\" : \" \"}] ${item.text}`;\n case \"bullet\": return `- ${item.text}`;\n case \"code\": return `\\`\\`\\`${item.language ?? \"\"}\\n${item.text}\\n\\`\\`\\``;\n case \"mermaid\": return `\\`\\`\\`mermaid\\n${item.text}\\n\\`\\`\\``;\n case \"math\": return `$$\\n${item.text}\\n$$`;\n case \"callout\": return `> [!${item.variant ?? \"info\"}]\\n> ${item.text}`;\n case \"quote\": return `> ${item.text}`;\n case \"divider\": return \"---\";\n case \"image\": return ``;\n case \"file\": return `> [!file]\\n> ${item.text}`;\n default: return item.text;\n }\n }).join(\"\\n\\n\");\n\n const tiptap = markdownToTiptap(md);\n await saveNoteContent(client, match.id, userId, tiptap);\n dirty = false;\n };\n\n const openEditor = async () => {\n cleanup();\n const { tmpdir } = await import(\"node:os\");\n const { join } = await import(\"node:path\");\n const { writeFileSync, readFileSync } = await import(\"node:fs\");\n const { execSync } = await import(\"node:child_process\");\n\n const md = await exportNoteAsMarkdown(client, match.id);\n const tmpFile = join(tmpdir(), `vertex-${match.id}.md`);\n writeFileSync(tmpFile, md, \"utf-8\");\n\n const editor = process.env.EDITOR || process.env.VISUAL || \"vim\";\n try { execSync(`${editor} \"${tmpFile}\"`, { stdio: \"inherit\" }); } catch { /* */ }\n\n const edited = readFileSync(tmpFile, \"utf-8\");\n if (edited !== md) {\n const tiptap = markdownToTiptap(edited);\n await saveNoteContent(client, match.id, userId, tiptap);\n }\n\n const newBlocks = await getBlocksForNote(client, match.id);\n items = blocksToItems(newBlocks);\n cursor = Math.min(cursor, Math.max(0, items.length - 1));\n dirty = false;\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n render(items, cursor, mode, inputBuffer, match.title);\n };\n\n process.stdin.on(\"data\", async (key: string) => {\n if (mode === \"input-todo\" || mode === \"input-text\") {\n if (key === \"\\r\" || key === \"\\n\") {\n if (inputBuffer.trim()) {\n const newItem: TuiItem = mode === \"input-todo\"\n ? { kind: \"todo\", text: inputBuffer.trim(), checked: false }\n : { kind: \"text\", text: inputBuffer.trim(), checked: false };\n items.splice(cursor + 1, 0, newItem);\n cursor = Math.min(cursor + 1, items.length - 1);\n dirty = true;\n }\n mode = \"normal\";\n inputBuffer = \"\";\n } else if (key === \"\\x1b\") {\n mode = \"normal\";\n inputBuffer = \"\";\n } else if (key === \"\\x7f\") {\n inputBuffer = inputBuffer.slice(0, -1);\n } else if (key >= \" \") {\n inputBuffer += key;\n }\n render(items, cursor, mode, inputBuffer, match.title);\n return;\n }\n\n if (key === \"\\x1b[A\") {\n cursor = Math.max(0, cursor - 1);\n } else if (key === \"\\x1b[B\") {\n cursor = Math.min(items.length - 1, cursor + 1);\n } else if (key === \"\\r\" || key === \"\\n\") {\n if (items[cursor]?.kind === \"todo\") {\n items[cursor].checked = !items[cursor].checked;\n dirty = true;\n }\n } else if (key === \"t\") {\n mode = \"input-todo\";\n inputBuffer = \"\";\n } else if (key === \"n\") {\n mode = \"input-text\";\n inputBuffer = \"\";\n } else if (key === \"d\") {\n if (items.length > 0) {\n items.splice(cursor, 1);\n cursor = Math.min(cursor, items.length - 1);\n dirty = true;\n }\n } else if (key === \"e\") {\n if (dirty) await save();\n await openEditor();\n return;\n } else if (key === \"s\") {\n await save();\n render(items, cursor, mode, inputBuffer, match.title);\n process.stdout.write(` ${GREEN}Saved!${R}\\n`);\n return;\n } else if (key === \"q\" || key === \"\\x03\") {\n if (dirty) await save();\n cleanup();\n this.log(dirty ? `Saved: ${match.title}` : \"No changes.\");\n process.exit(0);\n }\n\n render(items, cursor, mode, inputBuffer, match.title);\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { createServer } from \"node:http\";\nimport { createInterface } from \"node:readline\";\nimport { createSupabaseClient } from \"@vertex/core\";\nimport { loadConfig, saveConfig } from \"../lib/config.js\";\n\nexport default class Login extends Command {\n static override description = \"Log in to Vertex\";\n\n async run(): Promise<void> {\n const config = loadConfig();\n\n this.log(\"\\n How would you like to log in?\\n\");\n this.log(\" 1) GitHub\");\n this.log(\" 2) Google\");\n this.log(\" 3) Email & Password\\n\");\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const choice = await new Promise<string>((resolve) => {\n rl.question(\" Choice (1/2/3): \", (ans) => { rl.close(); resolve(ans.trim()); });\n });\n\n if (choice === \"3\") {\n await this.emailLogin(config);\n return;\n }\n\n const provider = choice === \"2\" ? \"google\" : \"github\";\n await this.oauthLogin(config, provider);\n }\n\n private async emailLogin(config: ReturnType<typeof loadConfig>): Promise<void> {\n const rl1 = createInterface({ input: process.stdin, output: process.stdout });\n const email = await new Promise<string>((resolve) => {\n rl1.question(\" Email: \", (ans) => { rl1.close(); resolve(ans.trim()); });\n });\n\n const rl2 = createInterface({ input: process.stdin, output: process.stdout });\n const password = await new Promise<string>((resolve) => {\n rl2.question(\" Password: \", (ans) => { rl2.close(); resolve(ans.trim()); });\n });\n\n const rl3 = createInterface({ input: process.stdin, output: process.stdout });\n const isSignup = await new Promise<string>((resolve) => {\n rl3.question(\" Sign in or sign up? (in/up): \", (ans) => { rl3.close(); resolve(ans.trim().toLowerCase()); });\n });\n\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n\n if (isSignup === \"up\") {\n const { error } = await client.auth.signUp({ email, password });\n if (error) {\n this.error(`Sign up failed: ${error.message}`);\n }\n this.log(\" Check your email to confirm your account, then run: vertex login\");\n process.exit(0);\n }\n\n const { data, error } = await client.auth.signInWithPassword({ email, password });\n if (error) {\n this.error(`Login failed: ${error.message}`);\n }\n\n if (data.session) {\n saveConfig({\n accessToken: data.session.access_token,\n refreshToken: data.session.refresh_token,\n userId: data.session.user.id,\n email: data.session.user.email,\n });\n this.log(` Logged in as ${data.session.user.email}`);\n }\n process.exit(0);\n }\n\n private async oauthLogin(config: ReturnType<typeof loadConfig>, provider: \"github\" | \"google\"): Promise<void> {\n const port = 54321;\n const redirectUrl = `http://localhost:${port}/callback`;\n\n this.log(` Opening browser for ${provider} login...`);\n\n const tokenPromise = new Promise<{ access_token: string; refresh_token: string }>((resolve, reject) => {\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n\n if (url.pathname === \"/callback\") {\n const accessToken = url.searchParams.get(\"access_token\");\n const refreshToken = url.searchParams.get(\"refresh_token\");\n\n if (accessToken && refreshToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<h2 style='font-family:sans-serif;text-align:center;margin-top:40vh'>Logged in! You can close this tab.</h2>\");\n server.close();\n resolve({ access_token: accessToken, refresh_token: refreshToken });\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n <html><body>\n <script>\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const at = params.get(\"access_token\");\n const rt = params.get(\"refresh_token\");\n if (at && rt) {\n window.location.href = \"/callback?access_token=\" + encodeURIComponent(at) + \"&refresh_token=\" + encodeURIComponent(rt);\n } else {\n document.body.innerHTML = \"<h2 style='font-family:sans-serif;text-align:center;margin-top:40vh'>Login failed. Try again.</h2>\";\n }\n </script>\n <h2 style=\"font-family:sans-serif;text-align:center;margin-top:40vh\">Completing login...</h2>\n </body></html>\n `);\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n server.listen(port, () => {\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n client.auth.signInWithOAuth({\n provider,\n options: { redirectTo: redirectUrl, skipBrowserRedirect: false },\n }).then(({ data }) => {\n if (data.url) {\n console.log(`\\n If browser doesn't open, visit:\\n ${data.url}\\n`);\n import(\"node:child_process\").then(({ exec }) => {\n const cmd = process.platform === \"darwin\" ? \"open\"\n : process.platform === \"win32\" ? 'start \"\"'\n : \"xdg-open\";\n exec(`${cmd} \"${data.url}\"`);\n });\n }\n });\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error(\"Login timed out after 120 seconds\"));\n }, 120_000);\n });\n\n try {\n const tokens = await tokenPromise;\n\n const client = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey);\n const { data } = await client.auth.setSession({\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n });\n\n saveConfig({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n userId: data.session?.user.id,\n email: data.session?.user.email,\n });\n\n this.log(` Logged in as ${data.session?.user.email ?? \"unknown\"}`);\n process.exit(0);\n } catch (err) {\n this.error(`Login failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAIhC,IAAqB,QAArB,cAAmC,QAAQ;AAAA,EACzC,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,WAAW;AAE1B,SAAK,IAAI,qCAAqC;AAC9C,SAAK,IAAI,aAAa;AACtB,SAAK,IAAI,aAAa;AACtB,SAAK,IAAI,yBAAyB;AAElC,UAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,UAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,YAAY;AACpD,SAAG,SAAS,sBAAsB,CAAC,QAAQ;AAAE,WAAG,MAAM;AAAG,gBAAQ,IAAI,KAAK,CAAC;AAAA,MAAG,CAAC;AAAA,IACjF,CAAC;AAED,QAAI,WAAW,KAAK;AAClB,YAAM,KAAK,WAAW,MAAM;AAC5B;AAAA,IACF;AAEA,UAAM,WAAW,WAAW,MAAM,WAAW;AAC7C,UAAM,KAAK,WAAW,QAAQ,QAAQ;AAAA,EACxC;AAAA,EAEA,MAAc,WAAW,QAAsD;AAC7E,UAAM,MAAM,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC5E,UAAM,QAAQ,MAAM,IAAI,QAAgB,CAAC,YAAY;AACnD,UAAI,SAAS,aAAa,CAAC,QAAQ;AAAE,YAAI,MAAM;AAAG,gBAAQ,IAAI,KAAK,CAAC;AAAA,MAAG,CAAC;AAAA,IAC1E,CAAC;AAED,UAAM,MAAM,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC5E,UAAM,WAAW,MAAM,IAAI,QAAgB,CAAC,YAAY;AACtD,UAAI,SAAS,gBAAgB,CAAC,QAAQ;AAAE,YAAI,MAAM;AAAG,gBAAQ,IAAI,KAAK,CAAC;AAAA,MAAG,CAAC;AAAA,IAC7E,CAAC;AAED,UAAM,MAAM,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC5E,UAAM,WAAW,MAAM,IAAI,QAAgB,CAAC,YAAY;AACtD,UAAI,SAAS,mCAAmC,CAAC,QAAQ;AAAE,YAAI,MAAM;AAAG,gBAAQ,IAAI,KAAK,EAAE,YAAY,CAAC;AAAA,MAAG,CAAC;AAAA,IAC9G,CAAC;AAED,UAAM,SAAS,qBAAqB,OAAO,aAAa,OAAO,eAAe;AAE9E,QAAI,aAAa,MAAM;AACrB,YAAM,EAAE,OAAAA,OAAM,IAAI,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,SAAS,CAAC;AAC9D,UAAIA,QAAO;AACT,aAAK,MAAM,mBAAmBA,OAAM,OAAO,EAAE;AAAA,MAC/C;AACA,WAAK,IAAI,oEAAoE;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK,mBAAmB,EAAE,OAAO,SAAS,CAAC;AAChF,QAAI,OAAO;AACT,WAAK,MAAM,iBAAiB,MAAM,OAAO,EAAE;AAAA,IAC7C;AAEA,QAAI,KAAK,SAAS;AAChB,iBAAW;AAAA,QACT,aAAa,KAAK,QAAQ;AAAA,QAC1B,cAAc,KAAK,QAAQ;AAAA,QAC3B,QAAQ,KAAK,QAAQ,KAAK;AAAA,QAC1B,OAAO,KAAK,QAAQ,KAAK;AAAA,MAC3B,CAAC;AACD,WAAK,IAAI,kBAAkB,KAAK,QAAQ,KAAK,KAAK,EAAE;AAAA,IACtD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,MAAc,WAAW,QAAuC,UAA8C;AAC5G,UAAM,OAAO;AACb,UAAM,cAAc,oBAAoB,IAAI;AAE5C,SAAK,IAAI,yBAAyB,QAAQ,WAAW;AAErD,UAAM,eAAe,IAAI,QAAyD,CAAC,SAAS,WAAW;AACrG,YAAM,SAAS,aAAa,CAAC,KAAK,QAAQ;AACxC,cAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,oBAAoB,IAAI,EAAE;AAE9D,YAAI,IAAI,aAAa,aAAa;AAChC,gBAAM,cAAc,IAAI,aAAa,IAAI,cAAc;AACvD,gBAAM,eAAe,IAAI,aAAa,IAAI,eAAe;AAEzD,cAAI,eAAe,cAAc;AAC/B,gBAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,gBAAI,IAAI,8GAA8G;AACtH,mBAAO,MAAM;AACb,oBAAQ,EAAE,cAAc,aAAa,eAAe,aAAa,CAAC;AAClE;AAAA,UACF;AAEA,cAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,cAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAeP;AACD;AAAA,QACF;AAEA,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI,WAAW;AAAA,MACrB,CAAC;AAED,aAAO,OAAO,MAAM,MAAM;AACxB,cAAM,SAAS,qBAAqB,OAAO,aAAa,OAAO,eAAe;AAC9E,eAAO,KAAK,gBAAgB;AAAA,UAC1B;AAAA,UACA,SAAS,EAAE,YAAY,aAAa,qBAAqB,MAAM;AAAA,QACjE,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM;AACpB,cAAI,KAAK,KAAK;AACZ,oBAAQ,IAAI;AAAA;AAAA,IAA0C,KAAK,GAAG;AAAA,CAAI;AAClE,mBAAO,eAAoB,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM;AAC9C,oBAAM,MAAM,QAAQ,aAAa,WAAW,SACxC,QAAQ,aAAa,UAAU,aAC/B;AACJ,mBAAK,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG;AAAA,YAC7B,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,iBAAW,MAAM;AACf,eAAO,MAAM;AACb,eAAO,IAAI,MAAM,mCAAmC,CAAC;AAAA,MACvD,GAAG,IAAO;AAAA,IACZ,CAAC;AAED,QAAI;AACF,YAAM,SAAS,MAAM;AAErB,YAAM,SAAS,qBAAqB,OAAO,aAAa,OAAO,eAAe;AAC9E,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK,WAAW;AAAA,QAC5C,cAAc,OAAO;AAAA,QACrB,eAAe,OAAO;AAAA,MACxB,CAAC;AAED,iBAAW;AAAA,QACT,aAAa,OAAO;AAAA,QACpB,cAAc,OAAO;AAAA,QACrB,QAAQ,KAAK,SAAS,KAAK;AAAA,QAC3B,OAAO,KAAK,SAAS,KAAK;AAAA,MAC5B,CAAC;AAED,WAAK,IAAI,kBAAkB,KAAK,SAAS,KAAK,SAAS,SAAS,EAAE;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,KAAK;AACZ,WAAK,MAAM,iBAAiB,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAAA,IACxE;AAAA,EACF;AACF;","names":["error"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { clearConfig } from \"../lib/config.js\";\n\nexport default class Logout extends Command {\n static override description = \"Log out of Vertex\";\n\n async run(): Promise<void> {\n clearConfig();\n this.log(\"Logged out.\");\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,eAAe;AAGxB,IAAqB,SAArB,cAAoC,QAAQ;AAAA,EAC1C,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,gBAAY;AACZ,SAAK,IAAI,aAAa;AAAA,EACxB;AACF;","names":[]}
|
package/dist/commands/new.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/new.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { createNote } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nexport default class New extends Command {\n static override description = \"Create a new note\";\n\n static override args = {\n title: Args.string({ description: \"Note title\", default: \"Untitled\" }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(New);\n const client = await getClient();\n const userId = await getUserId();\n const note = await createNote(client, { user_id: userId, title: args.title });\n this.log(`Created: ${note.title} (${note.id})`);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAI9B,IAAqB,MAArB,MAAqB,aAAY,QAAQ;AAAA,EACvC,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,cAAc,SAAS,WAAW,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,IAAG;AACrC,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,OAAO,MAAM,WAAW,QAAQ,EAAE,SAAS,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC5E,SAAK,IAAI,YAAY,KAAK,KAAK,KAAK,KAAK,EAAE,GAAG;AAAA,EAChD;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/notes.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { listNotes } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nfunction formatDate(dateStr: string): string {\n const d = new Date(dateStr);\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nfunction pad(str: string, len: number): string {\n return str.length > len ? str.slice(0, len - 1) + \"…\" : str.padEnd(len);\n}\n\nexport default class Notes extends Command {\n static override description = \"List all notes\";\n\n async run(): Promise<void> {\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId });\n const active = notes.filter((n) => !n.deleted_at);\n\n if (active.length === 0) {\n this.log(\"No notes yet. Create one: vertex new\");\n return;\n }\n\n this.log(`\\n ${pad(\"Title\", 40)} ${pad(\"Type\", 10)} ${pad(\"Updated\", 20)}`);\n this.log(` ${\"─\".repeat(40)} ${\"─\".repeat(10)} ${\"─\".repeat(20)}`);\n for (const n of active) {\n const type = n.note_type === \"regular\" ? \"\" : n.note_type;\n this.log(` ${pad(n.title, 40)} ${pad(type, 10)} ${formatDate(n.updated_at)}`);\n }\n this.log(`\\n ${active.length} note(s)\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,eAAe;AAIxB,SAAS,WAAW,SAAyB;AAC3C,QAAM,IAAI,IAAI,KAAK,OAAO;AAC1B,SAAO,EAAE,mBAAmB,SAAS,EAAE,OAAO,SAAS,KAAK,WAAW,MAAM,WAAW,QAAQ,UAAU,CAAC;AAC7G;AAEA,SAAS,IAAI,KAAa,KAAqB;AAC7C,SAAO,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,WAAM,IAAI,OAAO,GAAG;AACxE;AAEA,IAAqB,QAArB,cAAmC,QAAQ;AAAA,EACzC,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,OAAO,CAAC;AACzD,UAAM,SAAS,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAEhD,QAAI,OAAO,WAAW,GAAG;AACvB,WAAK,IAAI,sCAAsC;AAC/C;AAAA,IACF;AAEA,SAAK,IAAI;AAAA,IAAO,IAAI,SAAS,EAAE,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,EAAE;AAC3E,SAAK,IAAI,KAAK,SAAI,OAAO,EAAE,CAAC,IAAI,SAAI,OAAO,EAAE,CAAC,IAAI,SAAI,OAAO,EAAE,CAAC,EAAE;AAClE,eAAW,KAAK,QAAQ;AACtB,YAAM,OAAO,EAAE,cAAc,YAAY,KAAK,EAAE;AAChD,WAAK,IAAI,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,UAAU,CAAC,EAAE;AAAA,IAC/E;AACA,SAAK,IAAI;AAAA,IAAO,OAAO,MAAM;AAAA,CAAY;AAAA,EAC3C;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/restore.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { listNotes, restoreNote } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nexport default class Restore extends Command {\n static override description = \"Restore a note from trash\";\n\n static override args = {\n title: Args.string({ description: \"Note title (partial match)\", required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(Restore);\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId, include_deleted: true });\n const query = args.title.toLowerCase();\n const match = notes.find((n) => n.deleted_at && n.title.toLowerCase().includes(query));\n\n if (!match) {\n this.error(`No trashed note matching \"${args.title}\"`);\n }\n\n await restoreNote(client, match.id);\n this.log(`Restored: ${match.title}`);\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAI9B,IAAqB,UAArB,MAAqB,iBAAgB,QAAQ;AAAA,EAC3C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,8BAA8B,UAAU,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,QAAO;AACzC,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,QAAQ,iBAAiB,KAAK,CAAC;AAChF,UAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,UAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE,SAAS,KAAK,CAAC;AAErF,QAAI,CAAC,OAAO;AACV,WAAK,MAAM,6BAA6B,KAAK,KAAK,GAAG;AAAA,IACvD;AAEA,UAAM,YAAY,QAAQ,MAAM,EAAE;AAClC,SAAK,IAAI,aAAa,MAAM,KAAK,EAAE;AAAA,EACrC;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/search.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { executeQuery } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nexport default class Search extends Command {\n static override description = \"Search notes (#tag, type:todo, keywords)\";\n\n static override args = {\n query: Args.string({ description: \"Search query\", required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(Search);\n const client = await getClient();\n const userId = await getUserId();\n const results = await executeQuery(client, userId, args.query);\n\n if (results.length === 0) {\n this.log(\"No results.\");\n return;\n }\n\n for (const r of results) {\n const preview = r.block.content.slice(0, 80).replace(/\\n/g, \" \");\n this.log(` [${r.block.type}] ${r.noteTitle}`);\n this.log(` ${preview}${r.block.content.length > 80 ? \"…\" : \"\"}`);\n this.log(\"\");\n }\n this.log(` ${results.length} result(s)`);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAI9B,IAAqB,SAArB,MAAqB,gBAAe,QAAQ;AAAA,EAC1C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,gBAAgB,UAAU,KAAK,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,OAAM;AACxC,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,UAAU,MAAM,aAAa,QAAQ,QAAQ,KAAK,KAAK;AAE7D,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,aAAa;AACtB;AAAA,IACF;AAEA,eAAW,KAAK,SAAS;AACvB,YAAM,UAAU,EAAE,MAAM,QAAQ,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG;AAC/D,WAAK,IAAI,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE;AAC7C,WAAK,IAAI,OAAO,OAAO,GAAG,EAAE,MAAM,QAAQ,SAAS,KAAK,WAAM,EAAE,EAAE;AAClE,WAAK,IAAI,EAAE;AAAA,IACb;AACA,SAAK,IAAI,KAAK,QAAQ,MAAM,YAAY;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/status.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { VERTEX_VERSION, listNotes, getStorageInfo, formatFileSize } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\nimport { loadConfig } from \"../lib/config.js\";\n\nexport default class Status extends Command {\n static override description = \"Show account status and storage usage\";\n\n async run(): Promise<void> {\n const config = loadConfig();\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId });\n const active = notes.filter((n) => !n.deleted_at);\n const trashed = notes.filter((n) => n.deleted_at);\n const { used, cap } = await getStorageInfo(client, userId);\n const pct = cap > 0 ? Math.round((used / cap) * 100) : 0;\n\n this.log(`\\n Vertex v${VERTEX_VERSION}`);\n this.log(` User: ${config.email ?? \"unknown\"}`);\n this.log(` Notes: ${active.length} active, ${trashed.length} trashed`);\n this.log(` Storage: ${formatFileSize(used)} / ${formatFileSize(cap)} (${pct}%)`);\n this.log(\"\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAKxB,IAAqB,SAArB,cAAoC,QAAQ;AAAA,EAC1C,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,OAAO,CAAC;AACzD,UAAM,SAAS,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAChD,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU;AAChD,UAAM,EAAE,MAAM,IAAI,IAAI,MAAM,eAAe,QAAQ,MAAM;AACzD,UAAM,MAAM,MAAM,IAAI,KAAK,MAAO,OAAO,MAAO,GAAG,IAAI;AAEvD,SAAK,IAAI;AAAA,YAAe,cAAc,EAAE;AACxC,SAAK,IAAI,cAAc,OAAO,SAAS,SAAS,EAAE;AAClD,SAAK,IAAI,cAAc,OAAO,MAAM,YAAY,QAAQ,MAAM,UAAU;AACxE,SAAK,IAAI,cAAc,eAAe,IAAI,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,GAAG,IAAI;AAChF,SAAK,IAAI,EAAE;AAAA,EACb;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/syntax.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\n\nconst D = \"\\x1b[90m\";\nconst B = \"\\x1b[1m\";\nconst C = \"\\x1b[36m\";\nconst Y = \"\\x1b[33m\";\nconst G = \"\\x1b[32m\";\nconst P = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\n\nexport default class Syntax extends Command {\n static override description = \"Show all Vertex markdown syntax for writing notes\";\n\n async run(): Promise<void> {\n this.log(`\n${B}${P} Vertex Markdown Syntax — Complete Reference${R}\n${D} For AI agents and humans writing Vertex notes from the terminal.${R}\n${D} ──────────────────────────────────────────────────────────${R}\n\n${C}${B} RULES${R}\n${D} • Each block must be separated by a blank line${R}\n${D} • First # Heading 1 in a note becomes the note title${R}\n${D} • Tags must start with a letter: #valid #123invalid${R}\n${D} • Wiki links are case-insensitive: [[My Note]] matches \"my note\"${R}\n${D} • Indent with spaces, not tabs${R}\n\n${C}${B} ━━━ TEXT & HEADINGS ━━━${R}\n\n${Y} # Heading 1${R} ${D}← note title${R}\n${Y} ## Heading 2${R} ${D}← section${R}\n${Y} ### Heading 3${R} ${D}← subsection${R}\n${Y} #### Heading 4${R} ${D}← minor heading${R}\n\n${Y} Plain paragraph text.${R} ${D}← just text on a line${R}\n${Y} **bold** *italic* \\`code\\` ~~strike~~${R}\n\n${C}${B} ━━━ LINKS & TAGS ━━━${R}\n\n${Y} [[Note Title]]${R} ${D}← wiki link (navigates to note)${R}\n${Y} #tagname${R} ${D}← tag (auto-created, purple pill)${R}\n${Y} #parent/child${R} ${D}← scoped tag (creates hierarchy)${R}\n${Y} #work/frontend${R} ${D}← example: parent=work, child=frontend${R}\n\n${C}${B} ━━━ LISTS ━━━${R}\n\n${Y} - Bullet item one${R}\n${Y} - Bullet item two${R}\n${Y} - Bullet item three${R}\n\n${Y} 1. Numbered item one${R}\n${Y} 2. Numbered item two${R}\n${Y} 3. Numbered item three${R}\n\n${Y} - [ ] Open todo task${R}\n${Y} - [x] Completed todo task${R}\n${Y} - [ ] Another open task #work${R} ${D}← tags work inside tasks${R}\n\n${C}${B} ━━━ BLOCKQUOTE ━━━${R}\n\n${Y} > Single line quote${R}\n\n${Y} > Multi-line quote${R}\n${Y} > continues with > prefix${R}\n${Y} > on each line${R}\n\n${C}${B} ━━━ DIVIDER ━━━${R}\n\n${Y} ---${R} ${D}← horizontal rule${R}\n\n${C}${B} ━━━ CODE BLOCK ━━━${R}\n\n${Y} \\`\\`\\`javascript${R}\n${Y} function greet(name) {${R}\n${Y} return \\`Hello, \\${name}!\\`;${R}\n${Y} }${R}\n${Y} \\`\\`\\`${R}\n\n${D} Languages: python, javascript, typescript, rust, go, java,${R}\n${D} c, cpp, csharp, ruby, php, swift, kotlin, sql, html, css,${R}\n${D} json, yaml, xml, markdown, bash, shell, dockerfile, graphql${R}\n\n${C}${B} ━━━ MERMAID DIAGRAM ━━━${R}\n${D} Use \\`\\`\\`mermaid to open, \\`\\`\\` to close. All Mermaid syntax works.${R}\n\n${D} Flowchart:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph TD;${R}\n${Y} A[Start] --> B{Decision};${R}\n${Y} B -->|Yes| C[Do X];${R}\n${Y} B -->|No| D[Do Y];${R}\n${Y} C --> E[End];${R}\n${Y} D --> E;${R}\n${Y} \\`\\`\\`${R}\n\n${D} Sequence diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} sequenceDiagram${R}\n${Y} Client->>Server: Request${R}\n${Y} Server->>DB: Query${R}\n${Y} DB-->>Server: Result${R}\n${Y} Server-->>Client: Response${R}\n${Y} \\`\\`\\`${R}\n\n${D} ER diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} erDiagram${R}\n${Y} USER ||--o{ POST : writes${R}\n${Y} POST ||--o{ COMMENT : has${R}\n${Y} USER ||--o{ COMMENT : writes${R}\n${Y} \\`\\`\\`${R}\n\n${D} Class diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} classDiagram${R}\n${Y} class Animal {${R}\n${Y} +String name${R}\n${Y} +eat() void${R}\n${Y} }${R}\n${Y} Animal <|-- Dog${R}\n${Y} Animal <|-- Cat${R}\n${Y} \\`\\`\\`${R}\n\n${D} Also: gantt, pie, stateDiagram, flowchart, gitGraph, mindmap${R}\n\n${C}${B} ━━━ MATH (LaTeX) ━━━${R}\n\n${C} Inline math (within text):${R}\n${Y} The formula $E = mc^2$ is famous.${R}\n${Y} Solve for $x$ where $ax^2 + bx + c = 0$.${R}\n\n${C} Block math (standalone):${R}\n${D} Use $$ on its own line to open and close. KaTeX syntax.${R}\n\n${Y} $$${R}\n${Y} E = mc^2${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\frac{-b \\\\pm \\\\sqrt{b^2 - 4ac}}{2a}${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\sum_{i=1}^{n} i = \\\\frac{n(n+1)}{2}${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\int_0^\\\\infty e^{-x^2} dx = \\\\frac{\\\\sqrt{\\\\pi}}{2}${R}\n${Y} $$${R}\n\n${D} Common LaTeX: \\\\frac{a}{b} \\\\sqrt{x} x^{2} x_{i}${R}\n${D} \\\\sum \\\\prod \\\\int \\\\lim \\\\infty \\\\alpha \\\\beta \\\\pi${R}\n${D} \\\\text{label} \\\\mathbb{R} \\\\vec{v} \\\\hat{x} \\\\bar{x}${R}\n${D} Matrices: \\\\begin{pmatrix} a & b \\\\\\\\ c & d \\\\end{pmatrix}${R}\n\n${C}${B} ━━━ CALLOUT BLOCKS ━━━${R}\n${D} 4 variants: info, warning, error, tip${R}\n\n${Y} > [!info]${R}\n${Y} > This is an informational note.${R}\n\n${Y} > [!warning]${R}\n${Y} > Be careful about this.${R}\n\n${Y} > [!error]${R}\n${Y} > Something went wrong.${R}\n\n${Y} > [!tip]${R}\n${Y} > Helpful suggestion here.${R}\n\n${D} Multi-line callout:${R}\n${Y} > [!info]${R}\n${Y} > Line one of the callout.${R}\n${Y} > Line two continues here.${R}\n${Y} > Each line needs the > prefix.${R}\n\n${C}${B} ━━━ QUERY BLOCK (live search) ━━━${R}\n\n${Y} > [!query]${R}\n${Y} > type:todo status:open${R}\n\n${Y} > [!query]${R}\n${Y} > #work type:todo${R}\n\n${D} Queries: keyword, #tag, type:todo/code/heading, status:open/done${R}\n\n${C}${B} ━━━ INLINE LINK ━━━${R}\n\n${Y} [Link Text](https://example.com)${R}\n${D} Opens in new tab. Works in paragraphs, lists, todos, callouts.${R}\n\n${C}${B} ━━━ EMBED (link preview) ━━━${R}\n\n${Y} > [!embed]${R}\n${Y} > https://www.youtube.com/watch?v=VIDEO_ID${R}\n\n${Y} > [!embed]${R}\n${Y} > https://github.com/user/repo${R}\n${D} YouTube → embedded video player${R}\n${D} Other URLs → preview card with title, description, image${R}\n\n${C}${B} ━━━ IMAGE ━━━${R}\n\n${Y} ${R}\n\n${C}${B} ━━━ FILE ATTACHMENT ━━━${R}\n\n${Y} > [!file]${R}\n${Y} > [document.pdf](https://example.com/file.pdf)${R}\n${Y} > application/pdf 149780${R}\n\n${D} Format: > [filename](url) then > mimetype size_in_bytes${R}\n\n${D} ──────────────────────────────────────────────────────────${R}\n\n${C}${B} COMMANDS${R}\n ${G}vertex new \"Title\"${R} ${D}← create empty note${R}\n ${G}vertex edit \"Title\"${R} ${D}← edit in $EDITOR${R}\n ${G}vertex import file.md${R} ${D}← import markdown as new note${R}\n ${G}vertex import file.md -t \"T\"${R} ${D}← import with custom title${R}\n ${G}vertex export \"Title\"${R} ${D}← print as markdown${R}\n ${G}vertex export \"Title\" -o out.md${R} ${D}← save to file${R}\n ${G}vertex view \"Title\"${R} ${D}← quick view (same as export)${R}\n ${G}vertex syntax${R} ${D}← this reference${R}\n\n${C}${B} AI USAGE${R}\n${D} Any AI can create Vertex notes. Write a .md file using${R}\n${D} the syntax above, then:${R}\n\n ${G}vertex import note.md -t \"My Note\"${R}\n\n${D} Or edit an existing note directly:${R}\n\n ${G}vertex edit \"My Note\"${R}\n\n${D} The note will render with rich blocks (mermaid diagrams,${R}\n${D} LaTeX math, syntax-highlighted code, callouts, etc.)${R}\n${D} in the Vertex web app at ${P}https://vertex-alu.pages.dev${R}\n\n${C}${B} FULL EXAMPLE${R}\n${D} ──────────────────────────────────────────────────────────${R}\n${Y} # Project Notes${R}\n${Y} ${R}\n${Y} Overview of the #project with [[Related Note]] link.${R}\n${Y} ${R}\n${Y} ## Architecture${R}\n${Y} ${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph LR;${R}\n${Y} Client --> API --> DB;${R}\n${Y} \\`\\`\\`${R}\n${Y} ${R}\n${Y} ## Key Formula${R}\n${Y} ${R}\n${Y} $$${R}\n${Y} O(n \\\\log n)${R}\n${Y} $$${R}\n${Y} ${R}\n${Y} ## Code${R}\n${Y} ${R}\n${Y} \\`\\`\\`python${R}\n${Y} print(\"hello\")${R}\n${Y} \\`\\`\\`${R}\n${Y} ${R}\n${Y} > [!tip]${R}\n${Y} > Remember to test edge cases.${R}\n${Y} ${R}\n${Y} ## Tasks${R}\n${Y} ${R}\n${Y} - [x] Design complete${R}\n${Y} - [ ] Implementation pending #work${R}\n${D} ──────────────────────────────────────────────────────────${R}\n`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/tags.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { getUserTags } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nexport default class Tags extends Command {\n static override description = \"List all tags\";\n\n async run(): Promise<void> {\n const client = await getClient();\n const userId = await getUserId();\n const tags = await getUserTags(client, userId);\n\n if (tags.length === 0) {\n this.log(\"No tags yet.\");\n return;\n }\n\n for (const t of tags) {\n this.log(` #${t.name}`);\n }\n this.log(`\\n ${tags.length} tag(s)`);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,eAAe;AAIxB,IAAqB,OAArB,cAAkC,QAAQ;AAAA,EACxC,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,OAAO,MAAM,YAAY,QAAQ,MAAM;AAE7C,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AAEA,eAAW,KAAK,MAAM;AACpB,WAAK,IAAI,MAAM,EAAE,IAAI,EAAE;AAAA,IACzB;AACA,SAAK,IAAI;AAAA,IAAO,KAAK,MAAM,SAAS;AAAA,EACtC;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/today.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { listNotes } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nexport default class Today extends Command {\n static override description = \"Open latest daily note in interactive mode\";\n\n async run(): Promise<void> {\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId, note_type: \"daily\" as \"daily\" });\n const dailies = notes.filter((n) => !n.deleted_at).sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n if (dailies.length === 0) {\n this.log(\"No daily notes yet. Create one: vertex daily\");\n return;\n }\n\n const { default: Interactive } = await import(\"./interactive.js\");\n const cmd = new Interactive(this.argv, this.config);\n await cmd.init();\n process.argv = [process.argv[0], process.argv[1], dailies[0].title];\n await Interactive.run([dailies[0].title]);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,eAAe;AAIxB,IAAqB,QAArB,cAAmC,QAAQ;AAAA,EACzC,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,QAAQ,WAAW,QAAmB,CAAC;AACxF,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;AAErI,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,8CAA8C;AACvD;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,YAAY,IAAI,MAAM,OAAO,kBAAkB;AAChE,UAAM,MAAM,IAAI,YAAY,KAAK,MAAM,KAAK,MAAM;AAClD,UAAM,IAAI,KAAK;AACf,YAAQ,OAAO,CAAC,QAAQ,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK;AAClE,UAAM,YAAY,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/trash/empty.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { emptyTrash } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../../lib/client.js\";\n\nexport default class TrashEmpty extends Command {\n static override description = \"Permanently delete all trashed notes\";\n\n async run(): Promise<void> {\n const client = await getClient();\n const userId = await getUserId();\n const count = await emptyTrash(client, userId);\n this.log(`Permanently deleted ${count} note(s).`);\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,eAAe;AAIxB,IAAqB,aAArB,cAAwC,QAAQ;AAAA,EAC9C,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,WAAW,QAAQ,MAAM;AAC7C,SAAK,IAAI,uBAAuB,KAAK,WAAW;AAAA,EAClD;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/trash/index.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { listNotes } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../../lib/client.js\";\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nexport default class Trash extends Command {\n static override description = \"List trashed notes\";\n\n async run(): Promise<void> {\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId, include_deleted: true });\n const trashed = notes.filter((n) => n.deleted_at);\n\n if (trashed.length === 0) {\n this.log(\"Trash is empty.\");\n return;\n }\n\n for (const n of trashed) {\n this.log(` ${n.title.padEnd(40)} deleted ${formatDate(n.deleted_at!)}`);\n }\n this.log(`\\n ${trashed.length} note(s) in trash`);\n this.log(\" Use: vertex restore <title> | vertex trash:empty\");\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,eAAe;AAIxB,SAAS,WAAW,SAAyB;AAC3C,SAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB,SAAS,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC;AACzF;AAEA,IAAqB,QAArB,cAAmC,QAAQ;AAAA,EACzC,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,QAAQ,iBAAiB,KAAK,CAAC;AAChF,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU;AAEhD,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,iBAAiB;AAC1B;AAAA,IACF;AAEA,eAAW,KAAK,SAAS;AACvB,WAAK,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,YAAY,WAAW,EAAE,UAAW,CAAC,EAAE;AAAA,IACzE;AACA,SAAK,IAAI;AAAA,IAAO,QAAQ,MAAM,mBAAmB;AACjD,SAAK,IAAI,oDAAoD;AAAA,EAC/D;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/view.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { listNotes, exportNoteAsMarkdown } from \"@vertex/core\";\nimport { getClient, getUserId } from \"../lib/client.js\";\n\nexport default class View extends Command {\n static override description = \"View a note as markdown\";\n\n static override args = {\n title: Args.string({ description: \"Note title (partial match)\", required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(View);\n const client = await getClient();\n const userId = await getUserId();\n const notes = await listNotes(client, { user_id: userId });\n const query = args.title.toLowerCase();\n const match = notes.find((n) => !n.deleted_at && n.title.toLowerCase().includes(query));\n\n if (!match) {\n this.error(`No note matching \"${args.title}\"`);\n }\n\n const md = await exportNoteAsMarkdown(client, match.id);\n this.log(md);\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAI9B,IAAqB,OAArB,MAAqB,cAAa,QAAQ;AAAA,EACxC,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,8BAA8B,UAAU,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,KAAI;AACtC,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,MAAM,UAAU,QAAQ,EAAE,SAAS,OAAO,CAAC;AACzD,UAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,UAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE,SAAS,KAAK,CAAC;AAEtF,QAAI,CAAC,OAAO;AACV,WAAK,MAAM,qBAAqB,KAAK,KAAK,GAAG;AAAA,IAC/C;AAEA,UAAM,KAAK,MAAM,qBAAqB,QAAQ,MAAM,EAAE;AACtD,SAAK,IAAI,EAAE;AAAA,EACb;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/whoami.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\nimport { loadConfig, isLoggedIn } from \"../lib/config.js\";\n\nexport default class Whoami extends Command {\n static override description = \"Show logged-in user\";\n\n async run(): Promise<void> {\n if (!isLoggedIn()) {\n this.log(\"Not logged in. Run: vertex login\");\n return;\n }\n const config = loadConfig();\n this.log(config.email ?? \"Logged in (no email on file)\");\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,eAAe;AAGxB,IAAqB,SAArB,cAAoC,QAAQ;AAAA,EAC1C,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,QAAI,CAAC,WAAW,GAAG;AACjB,WAAK,IAAI,kCAAkC;AAC3C;AAAA,IACF;AACA,UAAM,SAAS,WAAW;AAC1B,SAAK,IAAI,OAAO,SAAS,8BAA8B;AAAA,EACzD;AACF;","names":[]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { run } from \"@oclif/core\";\n"],"mappings":";AAAA,SAAS,WAAW;","names":[]}
|
package/dist/lib/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/lib/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/lib/md-to-tiptap.js
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
// src/lib/md-to-tiptap.ts
|
|
2
|
-
function markdownToTiptap(md) {
|
|
3
|
-
const lines = md.split("\n");
|
|
4
|
-
const nodes = [];
|
|
5
|
-
let i = 0;
|
|
6
|
-
while (i < lines.length) {
|
|
7
|
-
const line = lines[i];
|
|
8
|
-
if (line.match(/^#{1,4}\s/)) {
|
|
9
|
-
const match = line.match(/^(#{1,4})\s(.*)$/);
|
|
10
|
-
if (match) {
|
|
11
|
-
nodes.push({
|
|
12
|
-
type: "heading",
|
|
13
|
-
attrs: { level: match[1].length },
|
|
14
|
-
content: parseInline(match[2])
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
i++;
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
if (line.match(/^```mermaid/)) {
|
|
21
|
-
const mermaidLines = [];
|
|
22
|
-
i++;
|
|
23
|
-
while (i < lines.length && !lines[i].startsWith("```")) {
|
|
24
|
-
mermaidLines.push(lines[i]);
|
|
25
|
-
i++;
|
|
26
|
-
}
|
|
27
|
-
if (i < lines.length) i++;
|
|
28
|
-
nodes.push({
|
|
29
|
-
type: "mermaidBlock",
|
|
30
|
-
content: [{ type: "text", text: mermaidLines.join("\n") }]
|
|
31
|
-
});
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
if (line.startsWith("```")) {
|
|
35
|
-
const langMatch = line.match(/^```(\w*)/);
|
|
36
|
-
const language = langMatch?.[1] || "plaintext";
|
|
37
|
-
const codeLines = [];
|
|
38
|
-
i++;
|
|
39
|
-
while (i < lines.length && !lines[i].startsWith("```")) {
|
|
40
|
-
codeLines.push(lines[i]);
|
|
41
|
-
i++;
|
|
42
|
-
}
|
|
43
|
-
if (i < lines.length) i++;
|
|
44
|
-
nodes.push({
|
|
45
|
-
type: "codeBlock",
|
|
46
|
-
attrs: { language },
|
|
47
|
-
content: [{ type: "text", text: codeLines.join("\n") }]
|
|
48
|
-
});
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (line.startsWith("$$")) {
|
|
52
|
-
const mathLines = [];
|
|
53
|
-
i++;
|
|
54
|
-
while (i < lines.length && !lines[i].startsWith("$$")) {
|
|
55
|
-
mathLines.push(lines[i]);
|
|
56
|
-
i++;
|
|
57
|
-
}
|
|
58
|
-
if (i < lines.length) i++;
|
|
59
|
-
nodes.push({
|
|
60
|
-
type: "mathBlock",
|
|
61
|
-
content: [{ type: "text", text: mathLines.join("\n") }]
|
|
62
|
-
});
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
if (line.match(/^>\s*\[!(\w+)\]\s*$/)) {
|
|
66
|
-
const variantMatch = line.match(/^>\s*\[!(\w+)\]\s*$/);
|
|
67
|
-
const variant = variantMatch?.[1] ?? "info";
|
|
68
|
-
if (variant === "query") {
|
|
69
|
-
const queryLines = [];
|
|
70
|
-
i++;
|
|
71
|
-
while (i < lines.length && lines[i].match(/^>\s/)) {
|
|
72
|
-
queryLines.push(lines[i].replace(/^>\s?/, ""));
|
|
73
|
-
i++;
|
|
74
|
-
}
|
|
75
|
-
nodes.push({
|
|
76
|
-
type: "queryBlock",
|
|
77
|
-
content: [{ type: "text", text: queryLines.join("\n") }]
|
|
78
|
-
});
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
if (variant === "embed") {
|
|
82
|
-
i++;
|
|
83
|
-
const embedUrl = lines[i]?.replace(/^>\s?/, "").trim() ?? "";
|
|
84
|
-
i++;
|
|
85
|
-
nodes.push({
|
|
86
|
-
type: "linkPreview",
|
|
87
|
-
attrs: { url: embedUrl }
|
|
88
|
-
});
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
if (variant === "file") {
|
|
92
|
-
i++;
|
|
93
|
-
const linkLine = lines[i]?.replace(/^>\s?/, "") ?? "";
|
|
94
|
-
const linkMatch = linkLine.match(/^\[(.+?)\]\((.+?)\)$/);
|
|
95
|
-
i++;
|
|
96
|
-
const metaLine = lines[i]?.replace(/^>\s?/, "") ?? "";
|
|
97
|
-
const metaParts = metaLine.split(" ");
|
|
98
|
-
i++;
|
|
99
|
-
nodes.push({
|
|
100
|
-
type: "fileBlock",
|
|
101
|
-
attrs: {
|
|
102
|
-
filename: linkMatch?.[1] ?? "file",
|
|
103
|
-
src: linkMatch?.[2] ?? "",
|
|
104
|
-
filetype: metaParts[0] ?? "",
|
|
105
|
-
filesize: parseInt(metaParts[1] ?? "0", 10) || 0
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
const calloutLines = [];
|
|
111
|
-
i++;
|
|
112
|
-
while (i < lines.length && lines[i].match(/^>\s/)) {
|
|
113
|
-
calloutLines.push(lines[i].replace(/^>\s?/, ""));
|
|
114
|
-
i++;
|
|
115
|
-
}
|
|
116
|
-
nodes.push({
|
|
117
|
-
type: "calloutBlock",
|
|
118
|
-
attrs: { variant },
|
|
119
|
-
content: [{ type: "paragraph", content: parseInline(calloutLines.join("\n")) }]
|
|
120
|
-
});
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
if (line.match(/^>\s/)) {
|
|
124
|
-
const quoteLines = [];
|
|
125
|
-
while (i < lines.length && lines[i].match(/^>\s?/)) {
|
|
126
|
-
quoteLines.push(lines[i].replace(/^>\s?/, ""));
|
|
127
|
-
i++;
|
|
128
|
-
}
|
|
129
|
-
nodes.push({
|
|
130
|
-
type: "blockquote",
|
|
131
|
-
content: [{ type: "paragraph", content: parseInline(quoteLines.join("\n")) }]
|
|
132
|
-
});
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
if (line.match(/^---\s*$/)) {
|
|
136
|
-
nodes.push({ type: "horizontalRule" });
|
|
137
|
-
i++;
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
if (line.match(/^!\[.*?\]\(.*?\)$/)) {
|
|
141
|
-
const imgMatch = line.match(/^!\[(.*?)\]\((.*?)\)$/);
|
|
142
|
-
if (imgMatch) {
|
|
143
|
-
nodes.push({
|
|
144
|
-
type: "image",
|
|
145
|
-
attrs: { src: imgMatch[2], alt: imgMatch[1] }
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
i++;
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (line.match(/^[-*]\s\[[ x]\]\s/)) {
|
|
152
|
-
const taskItems = [];
|
|
153
|
-
while (i < lines.length && lines[i].match(/^[-*]\s\[[ x]\]\s/)) {
|
|
154
|
-
const m = lines[i].match(/^[-*]\s\[([ x])\]\s(.*)$/);
|
|
155
|
-
if (m) {
|
|
156
|
-
taskItems.push({
|
|
157
|
-
type: "taskItem",
|
|
158
|
-
attrs: { checked: m[1] === "x" },
|
|
159
|
-
content: [{ type: "paragraph", content: parseInline(m[2]) }]
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
i++;
|
|
163
|
-
}
|
|
164
|
-
nodes.push({ type: "taskList", content: taskItems });
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
if (line.match(/^[-*]\s/)) {
|
|
168
|
-
const items = [];
|
|
169
|
-
while (i < lines.length && lines[i].match(/^[-*]\s/)) {
|
|
170
|
-
const text = lines[i].replace(/^[-*]\s/, "");
|
|
171
|
-
items.push({
|
|
172
|
-
type: "listItem",
|
|
173
|
-
content: [{ type: "paragraph", content: parseInline(text) }]
|
|
174
|
-
});
|
|
175
|
-
i++;
|
|
176
|
-
}
|
|
177
|
-
nodes.push({ type: "bulletList", content: items });
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
if (line.match(/^\d+\.\s/)) {
|
|
181
|
-
const items = [];
|
|
182
|
-
while (i < lines.length && lines[i].match(/^\d+\.\s/)) {
|
|
183
|
-
const text = lines[i].replace(/^\d+\.\s/, "");
|
|
184
|
-
items.push({
|
|
185
|
-
type: "listItem",
|
|
186
|
-
content: [{ type: "paragraph", content: parseInline(text) }]
|
|
187
|
-
});
|
|
188
|
-
i++;
|
|
189
|
-
}
|
|
190
|
-
nodes.push({ type: "orderedList", content: items });
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
if (line.trim() === "") {
|
|
194
|
-
i++;
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
const paraLines = [];
|
|
198
|
-
while (i < lines.length && lines[i].trim() !== "" && !lines[i].match(/^#{1,4}\s/) && !lines[i].match(/^```/) && !lines[i].match(/^\$\$/) && !lines[i].match(/^---\s*$/) && !lines[i].match(/^[-*]\s/) && !lines[i].match(/^\d+\.\s/) && !lines[i].match(/^>\s/) && !lines[i].match(/^!\[/)) {
|
|
199
|
-
paraLines.push(lines[i]);
|
|
200
|
-
i++;
|
|
201
|
-
}
|
|
202
|
-
nodes.push({
|
|
203
|
-
type: "paragraph",
|
|
204
|
-
content: parseInline(paraLines.join("\n"))
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
if (nodes.length === 0) {
|
|
208
|
-
nodes.push({ type: "paragraph" });
|
|
209
|
-
}
|
|
210
|
-
return { type: "doc", content: nodes };
|
|
211
|
-
}
|
|
212
|
-
function parseInline(text) {
|
|
213
|
-
if (!text) return [];
|
|
214
|
-
if (text.length > 1e4) return [{ type: "text", text }];
|
|
215
|
-
const nodes = [];
|
|
216
|
-
const regex = /(\*\*([^*]+)\*\*|\*([^*]+)\*|`([^`]+)`|~~([^~]+)~~|\[\[([^\]]+)\]\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\[([^\]]+)\]\(([^)]+)\)|(?<!\$)\$([^\$\n]+)\$(?!\$))/g;
|
|
217
|
-
let lastIndex = 0;
|
|
218
|
-
let match;
|
|
219
|
-
while ((match = regex.exec(text)) !== null) {
|
|
220
|
-
if (match.index > lastIndex) {
|
|
221
|
-
nodes.push({ type: "text", text: text.slice(lastIndex, match.index) });
|
|
222
|
-
}
|
|
223
|
-
if (match[2]) {
|
|
224
|
-
nodes.push({ type: "text", text: match[2], marks: [{ type: "bold" }] });
|
|
225
|
-
} else if (match[3]) {
|
|
226
|
-
nodes.push({ type: "text", text: match[3], marks: [{ type: "italic" }] });
|
|
227
|
-
} else if (match[4]) {
|
|
228
|
-
nodes.push({ type: "text", text: match[4], marks: [{ type: "code" }] });
|
|
229
|
-
} else if (match[5]) {
|
|
230
|
-
nodes.push({ type: "text", text: match[5], marks: [{ type: "strike" }] });
|
|
231
|
-
} else if (match[6]) {
|
|
232
|
-
nodes.push({ type: "text", text: `[[${match[6]}]]` });
|
|
233
|
-
} else if (match[7]) {
|
|
234
|
-
nodes.push({ type: "text", text: `#${match[7]}` });
|
|
235
|
-
} else if (match[8] && match[9]) {
|
|
236
|
-
nodes.push({ type: "text", text: match[8], marks: [{ type: "link", attrs: { href: match[9], target: "_blank" } }] });
|
|
237
|
-
} else if (match[10]) {
|
|
238
|
-
nodes.push({ type: "inlineMath", attrs: { formula: match[10] } });
|
|
239
|
-
}
|
|
240
|
-
lastIndex = match.index + match[0].length;
|
|
241
|
-
}
|
|
242
|
-
if (lastIndex < text.length) {
|
|
243
|
-
nodes.push({ type: "text", text: text.slice(lastIndex) });
|
|
244
|
-
}
|
|
245
|
-
return nodes.length > 0 ? nodes : [{ type: "text", text: text || " " }];
|
|
246
|
-
}
|
|
247
|
-
export {
|
|
248
|
-
markdownToTiptap
|
|
249
|
-
};
|
|
250
|
-
//# sourceMappingURL=md-to-tiptap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/md-to-tiptap.ts"],"sourcesContent":["interface TiptapNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n text?: string;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n}\n\nexport function markdownToTiptap(md: string): Record<string, unknown> {\n const lines = md.split(\"\\n\");\n const nodes: TiptapNode[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.match(/^#{1,4}\\s/)) {\n const match = line.match(/^(#{1,4})\\s(.*)$/);\n if (match) {\n nodes.push({\n type: \"heading\",\n attrs: { level: match[1].length },\n content: parseInline(match[2]),\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^```mermaid/)) {\n const mermaidLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith(\"```\")) {\n mermaidLines.push(lines[i]);\n i++;\n }\n if (i < lines.length) i++;\n nodes.push({\n type: \"mermaidBlock\",\n content: [{ type: \"text\", text: mermaidLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.startsWith(\"```\")) {\n const langMatch = line.match(/^```(\\w*)/);\n const language = langMatch?.[1] || \"plaintext\";\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith(\"```\")) {\n codeLines.push(lines[i]);\n i++;\n }\n if (i < lines.length) i++;\n nodes.push({\n type: \"codeBlock\",\n attrs: { language },\n content: [{ type: \"text\", text: codeLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.startsWith(\"$$\")) {\n const mathLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith(\"$$\")) {\n mathLines.push(lines[i]);\n i++;\n }\n if (i < lines.length) i++;\n nodes.push({\n type: \"mathBlock\",\n content: [{ type: \"text\", text: mathLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/)) {\n const variantMatch = line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/);\n const variant = variantMatch?.[1] ?? \"info\";\n\n if (variant === \"query\") {\n const queryLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n queryLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"queryBlock\",\n content: [{ type: \"text\", text: queryLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (variant === \"embed\") {\n i++;\n const embedUrl = lines[i]?.replace(/^>\\s?/, \"\").trim() ?? \"\";\n i++;\n nodes.push({\n type: \"linkPreview\",\n attrs: { url: embedUrl },\n });\n continue;\n }\n\n if (variant === \"file\") {\n i++;\n const linkLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const linkMatch = linkLine.match(/^\\[(.+?)\\]\\((.+?)\\)$/);\n i++;\n const metaLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const metaParts = metaLine.split(\" \");\n i++;\n nodes.push({\n type: \"fileBlock\",\n attrs: {\n filename: linkMatch?.[1] ?? \"file\",\n src: linkMatch?.[2] ?? \"\",\n filetype: metaParts[0] ?? \"\",\n filesize: parseInt(metaParts[1] ?? \"0\", 10) || 0,\n },\n });\n continue;\n }\n\n const calloutLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n calloutLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"calloutBlock\",\n attrs: { variant },\n content: [{ type: \"paragraph\", content: parseInline(calloutLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^>\\s/)) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].match(/^>\\s?/)) {\n quoteLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"blockquote\",\n content: [{ type: \"paragraph\", content: parseInline(quoteLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^---\\s*$/)) {\n nodes.push({ type: \"horizontalRule\" });\n i++;\n continue;\n }\n\n if (line.match(/^!\\[.*?\\]\\(.*?\\)$/)) {\n const imgMatch = line.match(/^!\\[(.*?)\\]\\((.*?)\\)$/);\n if (imgMatch) {\n nodes.push({\n type: \"image\",\n attrs: { src: imgMatch[2], alt: imgMatch[1] },\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const taskItems: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const m = lines[i].match(/^[-*]\\s\\[([ x])\\]\\s(.*)$/);\n if (m) {\n taskItems.push({\n type: \"taskItem\",\n attrs: { checked: m[1] === \"x\" },\n content: [{ type: \"paragraph\", content: parseInline(m[2]) }],\n });\n }\n i++;\n }\n nodes.push({ type: \"taskList\", content: taskItems });\n continue;\n }\n\n if (line.match(/^[-*]\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s/)) {\n const text = lines[i].replace(/^[-*]\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"bulletList\", content: items });\n continue;\n }\n\n if (line.match(/^\\d+\\.\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s/)) {\n const text = lines[i].replace(/^\\d+\\.\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"orderedList\", content: items });\n continue;\n }\n\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== \"\" &&\n !lines[i].match(/^#{1,4}\\s/) &&\n !lines[i].match(/^```/) &&\n !lines[i].match(/^\\$\\$/) &&\n !lines[i].match(/^---\\s*$/) &&\n !lines[i].match(/^[-*]\\s/) &&\n !lines[i].match(/^\\d+\\.\\s/) &&\n !lines[i].match(/^>\\s/) &&\n !lines[i].match(/^!\\[/)\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n nodes.push({\n type: \"paragraph\",\n content: parseInline(paraLines.join(\"\\n\")),\n });\n }\n\n if (nodes.length === 0) {\n nodes.push({ type: \"paragraph\" });\n }\n\n return { type: \"doc\", content: nodes };\n}\n\nfunction parseInline(text: string): TiptapNode[] {\n if (!text) return [];\n if (text.length > 10000) return [{ type: \"text\", text }];\n\n const nodes: TiptapNode[] = [];\n const regex = /(\\*\\*([^*]+)\\*\\*|\\*([^*]+)\\*|`([^`]+)`|~~([^~]+)~~|\\[\\[([^\\]]+)\\]\\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\\[([^\\]]+)\\]\\(([^)]+)\\)|(?<!\\$)\\$([^\\$\\n]+)\\$(?!\\$))/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex, match.index) });\n }\n\n if (match[2]) {\n nodes.push({ type: \"text\", text: match[2], marks: [{ type: \"bold\" }] });\n } else if (match[3]) {\n nodes.push({ type: \"text\", text: match[3], marks: [{ type: \"italic\" }] });\n } else if (match[4]) {\n nodes.push({ type: \"text\", text: match[4], marks: [{ type: \"code\" }] });\n } else if (match[5]) {\n nodes.push({ type: \"text\", text: match[5], marks: [{ type: \"strike\" }] });\n } else if (match[6]) {\n nodes.push({ type: \"text\", text: `[[${match[6]}]]` });\n } else if (match[7]) {\n nodes.push({ type: \"text\", text: `#${match[7]}` });\n } else if (match[8] && match[9]) {\n nodes.push({ type: \"text\", text: match[8], marks: [{ type: \"link\", attrs: { href: match[9], target: \"_blank\" } }] });\n } else if (match[10]) {\n nodes.push({ type: \"inlineMath\", attrs: { formula: match[10] } });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n\n return nodes.length > 0 ? nodes : [{ type: \"text\", text: text || \" \" }];\n}\n"],"mappings":"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","names":[]}
|