19
20```
21import { api } from "https://esm.town/v/pomdtr/api";
22
23export const dynamicFolder = async () => {
24 const { data: posts } = await api(`/v1/search/vals?q=${encodeURIComponent("@post")}`);
25 return {
26 folder: "Blog",
9To use it on your own Val Town SQLite database, [fork it](https://www.val.town/v/stevekrouse/sqlite_admin/fork) to your account.
10
11It uses [basic authentication](https://www.val.town/v/pomdtr/basicAuth) with your [Val Town API Token](https://www.val.town/settings/api) as the password (leave the username field blank).
9To use it on your own Val Town SQLite database, [fork it](https://www.val.town/v/stevekrouse/sqlite_admin/fork) to your account.
10
11It uses [basic authentication](https://www.val.town/v/pomdtr/basicAuth) with your [Val Town API Token](https://www.val.town/settings/api) as the password (leave the username field blank).
1// @title My Val Town Wish List
2
3import { api } from "https://esm.town/v/pomdtr/api";
4import { extractMetadata } from "https://esm.town/v/pomdtr/extractMetadata";
5import { extractValInfo } from "https://esm.town/v/pomdtr/extractValInfo";
9export async function examplePost(req: Request) {
10 const { author, name } = extractValInfo(import.meta.url);
11 const { code, readme } = await api(`/v1/alias/${author}/${name}`);
12 const title = extractMetadata("title", code);
13 return html(await gfm(readme, { title, favicon: "🎁" }));
3Some things I'd love to see come to val town (some of these are already on the way according to the team)
4
5- [x] Editing a val's readme through the API
6- [x] A command bar (something like [paco's cmdk](https://cmdk.paco.me/) would be *dope*)
7- [ ] The ability or programmatically respond to events (like a val being run) right within Val Town
5- [ ] A bare bones CMS to edit markdown files hosted on a github (or val town readmes eventually)
6- [ ] A set of Vals for interacting with github repos via Octokit (useful for the above CMS idea)
7- [ ] A full json-server like implementation for quickly generating stub APIs based on json/valtown blob data ([begun](https://www.val.town/v/nbbaier/dbToAPI))
8- [ ] An implementation of [Convert bookmarklet to Chrome extension](https://sandbox.self.li/bookmarklet-to-extension/)
9- [ ] A tool for generating an NPM package from a Val or set of Vals (something like [dnt]- [ ] (https://github.com/denoland/dnt/))
11- [ ] A component library (this would be a wild swing for me)
12- [ ] A val to get a dependency graph of a val(s) ([started here](https://www.val.town/v/rlesser/dependency_graph) by [rlesser](https://www.val.town/u/rlesser))
13- [ ] A single val that wraps a [FeTS client](https://the-guild.dev/openapi/fets) to the API for saving a couple of lines of boilerplate
14- [ ] A val for generating OpenAPI specs from jsdoc comments within vals (sort of like [this npm package](https://www.npmjs.com/package/jsdoc-openapi))
15- [ ] Conways game of life
16
17```
18
19If you want to use an apiToken as a password:
20
21```ts
3const randomId = () => Math.random().toString(36).substring(2, 8);
4
5const createResult = await fetchJSON(`https://api.val.town/v1/vals`, {
6 method: "POST",
7 bearer: Deno.env.get("valtown"),
8 body: JSON.stringify({
9 code: `console.log(42);`,
10 name: `api_test_${randomId()}`,
11 }),
12});
14console.log("Created with name:", createResult.name);
15
16const newName = `api_test_updated_${randomId()}`;
17
18const updateResult = await fetch(`https://api.val.town/v1/vals/${createResult.id}`, {
19 method: "PUT",
20 headers: {
1Migrated from folder: A_Features/_23_12_04_Update_Vals_API/api_updates_demo
3
4export async function fetchNftMetadata(contractAddress: string, tokenId: string) {
5 const apiKey = process.env.ALCHEMY_API_KEY;
6 const rpcUrl = `https://eth-mainnet.g.alchemy.com/nft/v2/${apiKey}`;
7 const url = `${rpcUrl}/getNFTMetadata?contractAddress=${contractAddress}&tokenId=${tokenId}`;
8 const response = await fetch(url, {