| 1 | import * as Alchemy from "alchemy"; |
| 2 | import * as Neon from "alchemy/Neon"; |
| 3 | import * as Effect from "effect/Effect"; |
| 4 | import { resources } from "./src/resources.ts"; |
| 5 | import { features } from "./src/features.ts"; |
| 6 | import { website } from "./src/website.ts"; |
| 7 | |
| 8 | export 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 | ); |