1import * as Fly from "@/Fly";
2import * as Test from "@/Test/Alchemy";
3import { describe, expect } from "alchemy-test";
4import * as Effect from "effect/Effect";
5import * as pathe from "pathe";
6import { cloneFixture } from "../../Cloudflare/Utils/Fixture.ts";
7import { expectUrlContains } from "../../Cloudflare/Utils/Http.ts";
8
9const { test } = Test.make({ providers: Fly.providers(), dev: true });
10
11const fixtureDir = pathe.resolve(
12 import.meta.dirname,
13 "../../AWS/Website/fixtures/sveltekit-app",
14);
15const tempRoot = pathe.resolve(import.meta.dirname, "../../../.tmp");
16const fixtureEntries = [".gitignore", "package.json", "src", "static"];
17
18describe(
19 "Fly.Website.SvelteKit local",
20 { tags: ["provider:fly", "provider:fly:website", "local"] },
21 () => {
22 test.provider(
23 "dev runs the framework server with no cloud resources",
24 (stack) =>
25 Effect.gen(function* () {
26 yield* stack.destroy();
27
28 const rootDir = yield* cloneFixture(fixtureDir, {
29 prefix: "alchemy-sveltekit-fly-local-",
30 tempRoot,
31 entries: fixtureEntries,
32 });
33
34 const deployed = yield* stack.deploy(
35 Effect.gen(function* () {
36 const site = yield* Fly.Website.SvelteKit("Web", {
37 rootDir,
38 });
39 return { site };
40 }),
41 );
42
43 const url = deployed.site.url;
44 expect(url).toMatch(/^http:\/\/(localhost|127\.0\.0\.1):\d+\/?$/);
45 expect(deployed.site.service).toBeUndefined();
46 expect(deployed.site.app).toBeUndefined();
47 expect(deployed.site.ip).toBeUndefined();
48
49 yield* expectUrlContains(`${url}/`, "SVELTEKIT_AWS_PAGE_MARKER", {
50 timeout: "90 seconds",
51 label: "dev home page",
52 });
53 yield* expectUrlContains(
54 `${url}/api/hello?echo=roundtrip`,
55 "SVELTEKIT_AWS_API_MARKER",
56 { label: "api route (dev)" },
57 );
58 yield* expectUrlContains(
59 `${url}/prerendered`,
60 "SVELTEKIT_AWS_PRERENDERED_MARKER",
61 { label: "extra route (dev)" },
62 );
63
64 yield* stack.destroy();
65 }),
66 { timeout: 120_000 },
67 );
68 },
69);