1import * as Prisma from "@/Prisma/index.ts";
2import * as Test from "@/Test/Alchemy.ts";
3import { describe, expect } from "alchemy-test";
4import * as Effect from "effect/Effect";
5import * as Path from "effect/Path";
6import { bodyContaining } from "./Fixture.ts";
7
8const frameworks = [
9 ["astro", "Astro", Prisma.Website.Astro],
10 ["foldkit", "Foldkit", Prisma.Website.Foldkit],
11 ["nextjs", "Next.js", Prisma.Website.Nextjs],
12 ["nuxt", "Nuxt", Prisma.Website.Nuxt],
13 ["octane", "Octane", Prisma.Website.Octane],
14 ["react-router", "React Router", Prisma.Website.ReactRouter],
15 ["solidstart", "SolidStart", Prisma.Website.SolidStart],
16 ["sveltekit", "SvelteKit", Prisma.Website.SvelteKit],
17 ["tanstack-start", "TanStack Start", Prisma.Website.TanStackStart],
18 ["vinext", "vinext", Prisma.Website.Vinext],
19 ["vite", "Vite", Prisma.Website.Vite],
20 ["vocs", "Prisma", Prisma.Website.Vocs],
21 ["waku", "Waku", Prisma.Website.Waku],
22 [
23 "static-built",
24 "Static site on Prisma",
25 (id: string, props: { rootDir: string }) =>
26 Prisma.Website.StaticSite(id, {
27 ...props,
28 command: "bun run build",
29 outdir: "dist",
30 }),
31 ],
32 [
33 "static",
34 "Static site on Prisma",
35 (id: string, props: { rootDir: string }) =>
36 Prisma.Website.StaticSite(id, {
37 ...props,
38 command: "bun run build",
39 outdir: "dist",
40 dev: { command: "bun run dev:site" },
41 }),
42 ],
43] as const;
44
45describe.sequential(
46 "Prisma Website native frameworks",
47 { tags: ["provider:prisma", "provider:prisma:website", "local"] },
48 () => {
49 for (const [slug, title, website] of frameworks) {
50 const { test } = Test.make({ providers: Prisma.providers(), dev: true });
51 test.provider(
52 slug,
53 (stack) =>
54 Effect.gen(function* () {
55 yield* stack.destroy();
56 const path = yield* Path.Path;
57 const rootDir = yield* path.fromFileUrl(
58 new URL(
59 `../../../../../examples/prisma-website-${slug === "static-built" ? "static" : slug}/`,
60 import.meta.url,
61 ),
62 );
63 const { site } = yield* stack.deploy(
64 Effect.gen(function* () {
65 return { site: yield* website("Web", { rootDir }) };
66 }),
67 );
68 expect(site.url).toMatch(/^http:\/\/(localhost|127\.0\.0\.1):\d+/);
69 expect(site.compute).toBeUndefined();
70 expect(site.project).toBeUndefined();
71 const url = String(site.url).replace(/\/+$/, "");
72 yield* bodyContaining(`${url}/`, title);
73 yield* bodyContaining(`${url}/example.json`, "framework");
74 yield* stack.destroy();
75 }),
76 { timeout: 120_000 },
77 );
78 }
79 },
80);