1export async function expressHTMLExample(
2 req: express.Request,
3 res: express.Response,
1import { BrowserContext } from "https://esm.town/v/pomdtr/browser";
2
3export default async function(ctx) {
4 return {
5 type: "open",
1import { parse } from "npm:parse5";
2
3/** function to discover a webmention endpoint */
4export default async function discover(source) {
5 // look for first Link in headers
6 let found = [];
25 let doc = parse(html);
26 let links = [];
27 (function walk(nodes) {
28 for (let n of nodes) {
29 if (n.childNodes) walk(n.childNodes);
51
52/** helper to extract a url from Link header value */
53function cleanHeader(src, h) {
54 let exp = /<([^>]*)>/;
55 let matches = h.match(exp);
69
70/** helper to extract a url from <link> tag href */
71function cleanTag(src, raw) {
72 // absolute path
73 if (raw.startsWith("/"))
4
5// formats date in SQLITE format YYYY-MM-DD
6function formatDate(date: string) {
7 let [month, day, year] = date.split("/");
8 if (month.length == 1) month = "0" + month;
12
13// insert newsletter metadata in sqlite
14async function insertRow(articleNumber: number, title: string, date: string) {
15 try {
16 await sqlite.execute({
24
25// check if newsletter id exists
26async function checkNewsletterPresent(articleNumber: number) {
27 const data = await sqlite.execute({
28 sql: `SELECT EXISTS(SELECT 1 FROM newsletter WHERE article_number=:articleNumber)`,
1export function myApi(data) {
2 return "hi " + data.name;
3}
3import { zip } from "npm:lodash-es";
4
5export async function dateMeRSS(req: Request) {
6 let { columns, rows } = await sqlite.execute(`select * from datemedocs order by LastUpdated desc limit 20`);
7 const profiles = rows.map(row =>
2import { valTownBlogJSON } from "https://esm.town/v/stevekrouse/valTownBlogJSON";
3
4export async function valTownBlogRSS() {
5 const json = await valTownBlogJSON();
6 return new Response(dataToRSS(
4import stripAnsi from "npm:strip-ansi";
5
6export default async function() {
7 const res = await db.execute(
8 "SELECT author_username, COUNT(*) AS val_count FROM vals GROUP BY author_username ORDER BY 2 DESC LIMIT 10",
3// # New Val Town User (on Clerk) -> Val Town Discord notification
4// Translates one kind of webhook (Clerk) into another (Discord)
5export async function handleDiscordNewUser(req: Request) {
6 // check custom auth secret sent from clerk
7 if (req.headers.get("auth") !== Deno.env.get("clerkNonSensitive"))
1import type { ChatCompletion, ChatCompletionCreateParamsNonStreaming, Message } from "npm:@types/openai";
2
3async function getOpenAI() {
4 // if you don't have a key, use our std library version
5 if (Deno.env.get("OPENAI_API_KEY") === undefined) {
12}
13
14function startChat(chatOptions: Omit<ChatCompletionCreateParamsNonStreaming, "messages"> & { system: string } = {
15 max_tokens: 30,
16 model: "gpt-3.5-turbo",
19 const { system, ...options } = chatOptions;
20
21 return async function gpt(strings, ...values) {
22 const openai = await getOpenAI();
23
40}
41
42// Initialize the gpt function with the system message
43const gpt = startChat({ system: "You are New Yorker cartoonist", max_tokens: 200, model: "gpt-4" });
44const answer = await gpt`Draw me cartoon depicting https://www.val.town user in their fighting TypeScript a-ha moment`;
A helper function to build a file's email
Simple functional CSS library for Val Town
LangChain (https://langchain.com) Ambassador, KubeSphere (https://kubesphere.io) Ambassador, CNCF OpenFunction (https://openfunction.dev) TOC Member.
import { OpenAI } from "https://esm.town/v/std/openai";
export default async function(req: Request): Promise<Response> {
if (req.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",