1import * as Alchemy from "alchemy";
2import * as Neon from "alchemy/Neon";
3import * as Effect from "effect/Effect";
4import { resources } from "./src/resources.ts";
5import { features } from "./src/features.ts";
6import { website } from "./src/website.ts";
7
8export default Alchemy.Stack(
9 "NeonUploadNativeTutorial",
10 {
11 providers: Neon.providers(),
12 state: Alchemy.localState(),
13 },
14 Effect.gen(function* () {
15 const { branch, uploads, auth, appOrigin } = yield* resources;
16 const api = yield* Neon.Function("Api", {
17 branch,
18 main: "./src/native.ts",
19 env: {
20 APP_ORIGIN: appOrigin,
21 UPLOAD_BUCKET: uploads.bucketName,
22 AUTH_URL: auth.baseUrl,
23 AUTH_JWKS_URL: auth.jwksUrl,
24 },
25 });
26 yield* Neon.FunctionTrigger("ProcessUploads", {
27 function: api,
28 name: "ProcessUploads",
29 type: "storage_object_created",
30 storageObjectCreated: { bucket: uploads, prefix: "incoming/" },
31 path: "/jobs/upload",
32 });
33 return { ...(yield* website(api)), ...(yield* features) };
34 }),
35);