diff --git a/.github/actions/setup-runtimes-caching/action.yml b/.github/actions/setup-runtimes-caching/action.yml index 866e88de..9d98a7ec 100644 --- a/.github/actions/setup-runtimes-caching/action.yml +++ b/.github/actions/setup-runtimes-caching/action.yml @@ -66,7 +66,7 @@ runs: - uses: denoland/setup-deno@v2 name: Setup Deno with: - deno-version: v2.1.4 + deno-version: v2.5.4 - uses: oven-sh/setup-bun@v2 name: Setup Bun diff --git a/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/Program.cs b/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/Program.cs index 8301a840..75b9a97c 100644 --- a/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/Program.cs +++ b/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/Program.cs @@ -5,10 +5,12 @@ builder.AddDenoTask("vite-demo", taskName: "dev") .WithDenoPackageInstallation() .WithHttpEndpoint(env: "PORT") - .WithEndpoint(); + .WithEndpoint() + .WithHttpHealthCheck("/"); -builder.AddDenoApp("oak-demo", "main.ts", permissionFlags: ["-E", "--allow-net"]) +builder.AddDenoApp("oak-demo", "main.ts", permissionFlags: ["--allow-env", "--allow-net"]) .WithHttpEndpoint(env: "PORT") - .WithEndpoint(); + .WithEndpoint() + .WithHttpHealthCheck("/health"); builder.Build().Run(); diff --git a/examples/deno/oak-demo/deno.json b/examples/deno/oak-demo/deno.json index f0c56c57..825f383d 100644 --- a/examples/deno/oak-demo/deno.json +++ b/examples/deno/oak-demo/deno.json @@ -3,6 +3,7 @@ "dev": "deno run --allow-env --allow-net --watch main.ts" }, "imports": { + "@oak/oak": "jsr:@oak/oak@^17.1.6", "@std/assert": "jsr:@std/assert@1" } } diff --git a/examples/deno/oak-demo/deno.lock b/examples/deno/oak-demo/deno.lock index 77d4bc88..492aeaa1 100644 --- a/examples/deno/oak-demo/deno.lock +++ b/examples/deno/oak-demo/deno.lock @@ -1,18 +1,94 @@ { - "version": "4", + "version": "5", "specifiers": { + "jsr:@oak/commons@1": "1.0.1", + "jsr:@oak/oak@^17.1.6": "17.1.6", "jsr:@std/assert@1": "1.0.6", - "jsr:@std/internal@^1.0.4": "1.0.4" + "jsr:@std/bytes@1": "1.0.6", + "jsr:@std/crypto@1": "1.0.5", + "jsr:@std/encoding@1": "1.0.10", + "jsr:@std/encoding@^1.0.10": "1.0.10", + "jsr:@std/http@1": "1.0.21", + "jsr:@std/internal@^1.0.10": "1.0.10", + "jsr:@std/internal@^1.0.4": "1.0.4", + "jsr:@std/media-types@1": "1.1.0", + "jsr:@std/path@1": "1.1.2", + "npm:@types/node@*": "24.2.0", + "npm:path-to-regexp@^6.3.0": "6.3.0" }, "jsr": { + "@oak/commons@1.0.1": { + "integrity": "889ff210f0b4292591721be07244ecb1b5c118742f5273c70cf30d7cd4184d0c", + "dependencies": [ + "jsr:@std/assert", + "jsr:@std/bytes", + "jsr:@std/crypto", + "jsr:@std/encoding@1", + "jsr:@std/http", + "jsr:@std/media-types" + ] + }, + "@oak/oak@17.1.6": { + "integrity": "c7eef2eec733fba8e72b679bba3b8cf2fceccf5ef489a8b8fb43571908c0335d", + "dependencies": [ + "jsr:@oak/commons", + "jsr:@std/assert", + "jsr:@std/bytes", + "jsr:@std/http", + "jsr:@std/media-types", + "jsr:@std/path", + "npm:path-to-regexp" + ] + }, "@std/assert@1.0.6": { "integrity": "1904c05806a25d94fe791d6d883b685c9e2dcd60e4f9fc30f4fc5cf010c72207", "dependencies": [ - "jsr:@std/internal" + "jsr:@std/internal@^1.0.4" + ] + }, + "@std/bytes@1.0.6": { + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" + }, + "@std/crypto@1.0.5": { + "integrity": "0dcfbb319fe0bba1bd3af904ceb4f948cde1b92979ec1614528380ed308a3b40" + }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, + "@std/http@1.0.21": { + "integrity": "abb5c747651ee6e3ea6139858fd9b1810d2c97f53a5e6722f3b6d27a6d263edc", + "dependencies": [ + "jsr:@std/encoding@^1.0.10" ] }, "@std/internal@1.0.4": { "integrity": "62e8e4911527e5e4f307741a795c0b0a9e6958d0b3790716ae71ce085f755422" + }, + "@std/internal@1.0.10": { + "integrity": "e3be62ce42cab0e177c27698e5d9800122f67b766a0bea6ca4867886cbde8cf7" + }, + "@std/media-types@1.1.0": { + "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" + }, + "@std/path@1.1.2": { + "integrity": "c0b13b97dfe06546d5e16bf3966b1cadf92e1cc83e56ba5476ad8b498d9e3038", + "dependencies": [ + "jsr:@std/internal@^1.0.10" + ] + } + }, + "npm": { + "@types/node@24.2.0": { + "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", + "dependencies": [ + "undici-types" + ] + }, + "path-to-regexp@6.3.0": { + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + }, + "undici-types@7.10.0": { + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==" } }, "remote": { @@ -134,6 +210,7 @@ }, "workspace": { "dependencies": [ + "jsr:@oak/oak@^17.1.6", "jsr:@std/assert@1" ] } diff --git a/examples/deno/oak-demo/main.ts b/examples/deno/oak-demo/main.ts index 00c764c6..8f7e1700 100644 --- a/examples/deno/oak-demo/main.ts +++ b/examples/deno/oak-demo/main.ts @@ -1,30 +1,29 @@ -import { - Application, - Context, - Router, -} from "https://deno.land/x/oak@v12.4.0/mod.ts"; +import { Application, Router, Context } from "@oak/oak"; -const port = parseInt(Deno.env.get('PORT') || '8000'); +const port = parseInt(Deno.env.get("PORT") || "8000"); const router = new Router(); interface Weather { - Date: Date; - TemperatureC: number; + Date: Date; + TemperatureC: number; } -router - .get("/weather", async (ctx: Context) => { - let forecast: Weather[] = []; - for(var i = 0; i < 5; i++) { - const weather: Weather = { - Date: new Date(new Date().setDate(new Date().getDate() + i)), - TemperatureC: Math.round(Math.random() * 36), - }; - forecast.push(weather); +router.get("/weather", (ctx: Context) => { + const forecast: Weather[] = []; + for (let i = 0; i < 5; i++) { + const weather: Weather = { + Date: new Date(new Date().setDate(new Date().getDate() + i)), + TemperatureC: Math.round(Math.random() * 36), + }; + forecast.push(weather); } ctx.response.body = forecast; - }); +}); + +router.get("/health", (ctx: Context) => { + ctx.response.body = { status: "ok" }; +}); const app = new Application(); @@ -32,4 +31,4 @@ app.use(router.routes()); app.use(router.allowedMethods()); console.log(`Server listening on port ${port}`); -await app.listen({ port: port }); \ No newline at end of file +await app.listen({ port }); diff --git a/tests/CommunityToolkit.Aspire.Hosting.Deno.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Deno.Tests/AppHostTests.cs index 436409bf..8a8b2af9 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Deno.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Deno.Tests/AppHostTests.cs @@ -2,17 +2,18 @@ namespace CommunityToolkit.Aspire.Hosting.Deno.Tests; -#pragma warning disable CTASPIRE001 public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> { [Fact] public async Task ResourceStartsAndRespondsOk() { var appName = "vite-demo"; - var httpClient = fixture.CreateHttpClient(appName); - await fixture.App.WaitForTextAsync("VITE", appName).WaitAsync(TimeSpan.FromSeconds(30)); + await fixture.ResourceNotificationService + .WaitForResourceHealthyAsync(appName) + .WaitAsync(TimeSpan.FromSeconds(30)); + var httpClient = fixture.CreateHttpClient(appName); var response = await httpClient.GetAsync("/"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -22,10 +23,12 @@ public async Task ResourceStartsAndRespondsOk() public async Task ApiResourceStartsAndRespondsOk() { var appName = "oak-demo"; - var httpClient = fixture.CreateHttpClient(appName); - await fixture.App.WaitForTextAsync("Server listening on port ", appName).WaitAsync(TimeSpan.FromSeconds(30)); + await fixture.ResourceNotificationService + .WaitForResourceHealthyAsync(appName) + .WaitAsync(TimeSpan.FromSeconds(30)); + var httpClient = fixture.CreateHttpClient(appName); var response = await httpClient.GetAsync("/weather"); Assert.Equal(HttpStatusCode.OK, response.StatusCode);