3await init("small");
4
5export function render(html: string) {
6 return mdToHtml(html);
7}
1export default async function(req: Request): Promise<Response> {
2 const statusDoc = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418";
3 const text = `I am a teapot 🫖\n\n${statusDoc}`;
4import { fetchTweet } from "https://esm.town/v/vladimyr/fetchTweet";
5
6export default async function(req: Request): Promise<Response> {
7 const reqURL = new URL(req.url);
8 const query = reqURL.pathname.slice(1);
22}
23
24export async function postEval(post, args?) {
25 const code = post.text.split("```")[1]
26 .trim()
31}
32
33export async function fetchPost(url: string | URL) {
34 const postURL = new URL(url);
35 if (["x.com", "twitter.com"].includes(postURL.hostname)) {
6export const DEFAULT_PREFIX = `${getValNameFromUrl(import.meta.url)}:`;
7
8export async function poll(url = URL, { initialDelay = 1000, tries = 10, retryMs = 1000, log = true }) {
9 for (let i = 0; i < tries; i++) {
10 try {
27}
28
29export function provideBlob(getValue: (() => Promise<any> | any) | Promise<any>, prefix = DEFAULT_PREFIX) {
30 const id = crypto.randomUUID();
31
54 // https://stackoverflow.com/a/9899701
55 // licence: CC BY-SA 4.0
56 function docReady(fn) {
57 if (document.readyState === "complete" || document.readyState === "interactive") {
58 setTimeout(fn, 1);
103}
104
105export async function getProvidedBlob(id: string, deleteOnSuccess = true, prefix = DEFAULT_PREFIX) {
106 const name = `${prefix}${id}`;
107 const value = await blob.get(name);
110}
111
112export default async function(req: Request) {
113 if (req.method === "OPTIONS") {
114 return new Response("OK", {
5import { provideBlob } from "https://esm.town/v/postpostscript/provideBlob";
6
7export default async function(req: Request): Promise<Response> {
8 const expensiveContent = provideBlob(async () => {
9 await delay(2000 + Math.random() * 3000);
10import { provideBlob } from "https://esm.town/v/postpostscript/provideBlob";
11
12export default async function(req: Request) {
13 const image = provideBlob(async () => {
14 const png = new Image(100, 100);
6const app = new Hono();
7
8function getValUrl() {
9 const val = rootRef();
10 return `https://${val.userHandle}-${val.valName}.web.val.run`;
36`;
37
38function rowObjects(data) {
39 return data.rows.map(row => {
40 return data.columns.reduce((obj, column, index) => {
51}
52
53export default async function() {
54 const API_KEY = Deno.env.get("YOUTUBE_API_KEY");
55 const CHANNEL_ID = Deno.env.get("YOUTUBE_CHANNEL_ID");
57
58 const allComments = [];
59 async function fetchComments(pageToken: string = ""): Promise<void> {
60 const url =
61 `https://www.googleapis.com/youtube/v3/commentThreads?key=${API_KEY}&textFormat=plainText&part=snippet&allThreadsRelatedToChannelId=${CHANNEL_ID}&pageToken=${pageToken}`;
2import { ValRef } from "https://esm.town/v/andreterron/ValRef?v=1";
3
4export function rootValRef(): ValRef | undefined {
5 const val = rootRef();
6 return val
26- [ ] add visible output for non-query statements
27- [ ] add schema viewing
28- [x] add export to CSV, and JSON (CSV and JSON helper functions written in [this val](https://www.val.town/v/nbbaier/sqliteExportHelpers))
29- [ ] add export to sqlite
30- [ ] add refresh to table list sidebar after `CREATE/DROP/ALTER` statements
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": "*",