Skip to content

Commit f8c6e3a

Browse files
committed
Add Scaleway serverless function preset
1 parent dfdff9e commit f8c6e3a

File tree

6 files changed

+87
-2
lines changed

6 files changed

+87
-2
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Scaleway
2+
3+
> Deploy Nitro apps to Scaleway.
4+
5+
**Preset:** `scaleway-serverless`
6+
7+
:read-more{title="Scaleway Serverless Functions" to="https://www.scaleway.com/en/docs/serverless-functions/"}

src/presets/_all.gen.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import _netlify from "./netlify/preset.ts";
2121
import _node from "./node/preset.ts";
2222
import _platformSh from "./platform.sh/preset.ts";
2323
import _renderCom from "./render.com/preset.ts";
24+
import _scaleway from "./scaleway/preset.ts";
2425
import _standard from "./standard/preset.ts";
2526
import _stormkit from "./stormkit/preset.ts";
2627
import _vercel from "./vercel/preset.ts";
@@ -50,6 +51,7 @@ export default [
5051
..._node,
5152
..._platformSh,
5253
..._renderCom,
54+
..._scaleway,
5355
..._standard,
5456
..._stormkit,
5557
..._vercel,

src/presets/_types.gen.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ export interface PresetOptions {
2020

2121
export const presetsWithConfig = ["awsAmplify","awsLambda","azure","cloudflare","firebase","netlify","vercel"] as const;
2222

23-
export type PresetName = "alwaysdata" | "aws-amplify" | "aws-lambda" | "azure-swa" | "base-worker" | "bun" | "cleavr" | "cloudflare-dev" | "cloudflare-durable" | "cloudflare-module" | "cloudflare-pages" | "cloudflare-pages-static" | "deno" | "deno-deploy" | "deno-server" | "digital-ocean" | "firebase-app-hosting" | "flight-control" | "genezio" | "github-pages" | "gitlab-pages" | "heroku" | "iis-handler" | "iis-node" | "koyeb" | "netlify" | "netlify-edge" | "netlify-static" | "nitro-dev" | "nitro-prerender" | "node" | "node-cluster" | "node-middleware" | "node-server" | "platform-sh" | "render-com" | "standard" | "static" | "stormkit" | "vercel" | "vercel-static" | "winterjs" | "zeabur" | "zeabur-static" | "zerops" | "zerops-static";
23+
export type PresetName = "alwaysdata" | "aws-amplify" | "aws-lambda" | "azure-swa" | "base-worker" | "bun" | "cleavr" | "cloudflare-dev" | "cloudflare-durable" | "cloudflare-module" | "cloudflare-pages" | "cloudflare-pages-static" | "deno" | "deno-deploy" | "deno-server" | "digital-ocean" | "firebase-app-hosting" | "flight-control" | "genezio" | "github-pages" | "gitlab-pages" | "heroku" | "iis-handler" | "iis-node" | "koyeb" | "netlify" | "netlify-edge" | "netlify-static" | "nitro-dev" | "nitro-prerender" | "node" | "node-cluster" | "node-middleware" | "node-server" | "platform-sh" | "render-com" | "scaleway-serverless" | "standard" | "static" | "stormkit" | "vercel" | "vercel-static" | "winterjs" | "zeabur" | "zeabur-static" | "zerops" | "zerops-static";
2424

25-
export type PresetNameInput = "alwaysdata" | "aws-amplify" | "awsAmplify" | "aws_amplify" | "aws-lambda" | "awsLambda" | "aws_lambda" | "azure-swa" | "azureSwa" | "azure_swa" | "base-worker" | "baseWorker" | "base_worker" | "bun" | "cleavr" | "cloudflare-dev" | "cloudflareDev" | "cloudflare_dev" | "cloudflare-durable" | "cloudflareDurable" | "cloudflare_durable" | "cloudflare-module" | "cloudflareModule" | "cloudflare_module" | "cloudflare-pages" | "cloudflarePages" | "cloudflare_pages" | "cloudflare-pages-static" | "cloudflarePagesStatic" | "cloudflare_pages_static" | "deno" | "deno-deploy" | "denoDeploy" | "deno_deploy" | "deno-server" | "denoServer" | "deno_server" | "digital-ocean" | "digitalOcean" | "digital_ocean" | "firebase-app-hosting" | "firebaseAppHosting" | "firebase_app_hosting" | "flight-control" | "flightControl" | "flight_control" | "genezio" | "github-pages" | "githubPages" | "github_pages" | "gitlab-pages" | "gitlabPages" | "gitlab_pages" | "heroku" | "iis-handler" | "iisHandler" | "iis_handler" | "iis-node" | "iisNode" | "iis_node" | "koyeb" | "netlify" | "netlify-edge" | "netlifyEdge" | "netlify_edge" | "netlify-static" | "netlifyStatic" | "netlify_static" | "nitro-dev" | "nitroDev" | "nitro_dev" | "nitro-prerender" | "nitroPrerender" | "nitro_prerender" | "node" | "node-cluster" | "nodeCluster" | "node_cluster" | "node-middleware" | "nodeMiddleware" | "node_middleware" | "node-server" | "nodeServer" | "node_server" | "platform-sh" | "platformSh" | "platform_sh" | "render-com" | "renderCom" | "render_com" | "standard" | "static" | "stormkit" | "vercel" | "vercel-static" | "vercelStatic" | "vercel_static" | "winterjs" | "zeabur" | "zeabur-static" | "zeaburStatic" | "zeabur_static" | "zerops" | "zerops-static" | "zeropsStatic" | "zerops_static" | (string & {});
25+
export type PresetNameInput = "alwaysdata" | "aws-amplify" | "awsAmplify" | "aws_amplify" | "aws-lambda" | "awsLambda" | "aws_lambda" | "azure-swa" | "azureSwa" | "azure_swa" | "base-worker" | "baseWorker" | "base_worker" | "bun" | "cleavr" | "cloudflare-dev" | "cloudflareDev" | "cloudflare_dev" | "cloudflare-durable" | "cloudflareDurable" | "cloudflare_durable" | "cloudflare-module" | "cloudflareModule" | "cloudflare_module" | "cloudflare-pages" | "cloudflarePages" | "cloudflare_pages" | "cloudflare-pages-static" | "cloudflarePagesStatic" | "cloudflare_pages_static" | "deno" | "deno-deploy" | "denoDeploy" | "deno_deploy" | "deno-server" | "denoServer" | "deno_server" | "digital-ocean" | "digitalOcean" | "digital_ocean" | "firebase-app-hosting" | "firebaseAppHosting" | "firebase_app_hosting" | "flight-control" | "flightControl" | "flight_control" | "genezio" | "github-pages" | "githubPages" | "github_pages" | "gitlab-pages" | "gitlabPages" | "gitlab_pages" | "heroku" | "iis-handler" | "iisHandler" | "iis_handler" | "iis-node" | "iisNode" | "iis_node" | "koyeb" | "netlify" | "netlify-edge" | "netlifyEdge" | "netlify_edge" | "netlify-static" | "netlifyStatic" | "netlify_static" | "nitro-dev" | "nitroDev" | "nitro_dev" | "nitro-prerender" | "nitroPrerender" | "nitro_prerender" | "node" | "node-cluster" | "nodeCluster" | "node_cluster" | "node-middleware" | "nodeMiddleware" | "node_middleware" | "node-server" | "nodeServer" | "node_server" | "platform-sh" | "platformSh" | "platform_sh" | "render-com" | "renderCom" | "render_com" | "scaleway-serverless" | "scalewayServerless" | "scaleway_serverless" | "standard" | "static" | "stormkit" | "vercel" | "vercel-static" | "vercelStatic" | "vercel_static" | "winterjs" | "zeabur" | "zeabur-static" | "zeaburStatic" | "zeabur_static" | "zerops" | "zerops-static" | "zeropsStatic" | "zerops_static" | (string & {});

src/presets/scaleway/preset.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { defineNitroPreset } from "../_utils/preset.ts";
2+
3+
const scalewayServerless = defineNitroPreset(
4+
{
5+
entry: "./scaleway/runtime/scaleway-serverless",
6+
rollupConfig: {
7+
output: {
8+
entryFileNames: "index.mjs",
9+
format: "esm",
10+
},
11+
},
12+
},
13+
{
14+
name: "scaleway-serverless" as const,
15+
}
16+
);
17+
18+
export default [scalewayServerless] as const;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import "#nitro/virtual/polyfills";
2+
import { useNitroApp } from "nitro/app";
3+
import { joinURL, withQuery } from "ufo";
4+
import type { serveHandler } from "@scaleway/serverless-functions";
5+
6+
const nitroApp = useNitroApp();
7+
8+
type Event = Parameters<Parameters<typeof serveHandler>[0]>[0];
9+
type Context = Parameters<Parameters<typeof serveHandler>[0]>[1];
10+
11+
export async function handler(event: Event, context: Context) {
12+
const headers = Object.fromEntries(
13+
Object.entries(event.headers!).map(([key, value]) => [key, String(value)])
14+
);
15+
16+
const url = withQuery(
17+
joinURL(
18+
headers?.["X-Forwarded-Proto"] === "http" ? "http://" : "https://",
19+
headers.host,
20+
event.path
21+
),
22+
event.queryStringParameters!
23+
);
24+
25+
const request = new Request(url, {
26+
method: event.httpMethod,
27+
headers,
28+
body: event.httpMethod === "GET" ? undefined : event.body,
29+
});
30+
return nitroApp.fetch(request);
31+
}

test/presets/scaleway.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { describe } from "vitest";
2+
import { resolve } from "pathe";
3+
import { serveHandler } from "@scaleway/serverless-functions";
4+
import { getRandomPort, waitForPort } from "get-port-please";
5+
import { setupTest, testNitro } from "../tests.ts";
6+
7+
describe("nitro:preset:scaleway", async () => {
8+
const ctx = await setupTest("scaleway-serverless");
9+
10+
testNitro(ctx, async () => {
11+
const { handler } = await import(resolve(ctx.outDir, "server/index.mjs"));
12+
const port = await getRandomPort();
13+
const server = serveHandler(handler, port);
14+
15+
ctx.server = {
16+
url: `http://127.0.0.1:${port}`,
17+
close: () => server.close(),
18+
};
19+
20+
await waitForPort(port, { host: "127.0.0.1" });
21+
22+
return async ({ url, ...options }) => {
23+
const response = await ctx.fetch(url, options);
24+
return response;
25+
};
26+
});
27+
});

0 commit comments

Comments
 (0)