1import { assert, assertEquals, assertThrows } from "jsr:@std/assert@1";2import * as nip19 from "npm:nostr-tools@2.17.0/nip19";3import "../neon/neon.js";45const { neon } = globalThis;6const pk = "7e7e9c42a91bfef19fa929e5fda1b72e0ebc1a4c1141673e2794234d86addf4e";7const id = "d7dd5eb3ab747e16f8d0212d53032ea2a7cadef53837e5a6c66d42849fcb9027";89Deno.test("npub, nsec and note match nostr-tools", () => {10 assertEquals(neon.encode("npub", pk), nip19.npubEncode(pk));11 assertEquals(neon.encode("note", id), nip19.noteEncode(id));12 assertEquals(neon.decode(nip19.npubEncode(pk)), { type: "npub", data: pk });13 assertEquals(neon.decode("nostr:" + nip19.noteEncode(id)), { type: "note", data: id });14});1516Deno.test("nprofile, nevent and naddr cross-decode with nostr-tools", () => {17 const relays = ["wss://relay.example", "wss://r2.example/ünïcode"];18 const np = nip19.nprofileEncode({ pubkey: pk, relays });19 assertEquals(nip19.decode(neon.encode("nprofile", { pubkey: pk, relays })).data, { pubkey: pk, relays });20 assertEquals(neon.decode(np), { type: "nprofile", data: { pubkey: pk, relays } });2122 const ev = { id, relays, author: pk, kind: 1 };23 assertEquals(nip19.decode(neon.encode("nevent", ev)).data, ev);24 assertEquals(neon.decode(nip19.neventEncode(ev)).data, ev);2526 const ad = { identifier: "my-article", pubkey: pk, kind: 30023, relays };27 assertEquals(nip19.decode(neon.encode("naddr", ad)).data, ad);28 assertEquals(neon.decode(nip19.naddrEncode(ad)).data, ad);29});3031Deno.test("decode rejects bad checksums", () => {32 const np = nip19.npubEncode(pk);33 assertThrows(() => neon.decode(np.slice(0, -1) + (np.at(-1) == "q" ? "p" : "q")));34});3536Deno.test("rich escapes and links", () => {37 const npub = nip19.npubEncode(pk);38 const html = neon.rich(`<b>hi</b> see https://ex.com/a?b=1&c=2. pic https://ex.com/p.png nostr:${npub}`);39 assert(!html.includes("<b>"));40 assert(html.includes(`<a href="https://ex.com/a?b=1&c=2" target="_blank" rel="noopener">`));41 assert(html.includes(`<img src="https://ex.com/p.png"`));42 assert(html.includes(`nrn-profile="${npub}"`));43 assert(!neon.rich(`"><script>`).includes("<script"));44});