diff options
Diffstat (limited to 'packages/integrations/deno/src')
-rw-r--r-- | packages/integrations/deno/src/index.ts | 33 | ||||
-rw-r--r-- | packages/integrations/deno/src/server.ts | 51 | ||||
-rw-r--r-- | packages/integrations/deno/src/shim.ts | 5 |
3 files changed, 89 insertions, 0 deletions
diff --git a/packages/integrations/deno/src/index.ts b/packages/integrations/deno/src/index.ts new file mode 100644 index 000000000..c6f6207a5 --- /dev/null +++ b/packages/integrations/deno/src/index.ts @@ -0,0 +1,33 @@ +import type { AstroAdapter, AstroIntegration } from 'astro'; + +interface Options { + port?: number; + hostname?: string; +} + +export function getAdapter(args?: Options): AstroAdapter { + return { + name: '@astrojs/deno', + serverEntrypoint: '@astrojs/deno/server.js', + args: args ?? {}, + exports: ['stop', 'handle'] + }; +} + +export default function createIntegration(args?: Options): AstroIntegration { + return { + name: '@astrojs/deno', + hooks: { + 'astro:config:done': ({ setAdapter }) => { + setAdapter(getAdapter(args)); + }, + 'astro:build:setup': ({ vite, target }) => { + if(target === 'server') { + vite.ssr = { + noExternal: true + }; + } + } + }, + }; +} diff --git a/packages/integrations/deno/src/server.ts b/packages/integrations/deno/src/server.ts new file mode 100644 index 000000000..8e7ecf17d --- /dev/null +++ b/packages/integrations/deno/src/server.ts @@ -0,0 +1,51 @@ +import './shim.js'; +import type { SSRManifest } from 'astro'; +import { App } from 'astro/app'; +// @ts-ignore +import { Server } from "https://deno.land/std@0.132.0/http/server.ts"; + +interface Options { + port?: number; + hostname?: string; + start?: boolean; +} + +let _server: Server | undefined = undefined; +let _startPromise: Promise<void> | undefined = undefined; + +export function start(manifest: SSRManifest, options: Options) { + if(options.start === false) { + return; + } + + const app = new App(manifest); + + const handler = async (request: Request) => { + const response = await app.render(request); + return response; + }; + + _server = new Server({ + port: options.port ?? 8085, + hostname: options.hostname ?? "0.0.0.0", + handler, + //onError: options.onError, + }); + + _startPromise = _server.listenAndServe(); +} + +export function createExports(manifest: SSRManifest) { + const app = new App(manifest); + return { + async stop() { + if(_server) { + _server.close(); + } + await Promise.resolve(_startPromise); + }, + async handle(request: Request) { + return app.render(request); + } + } +} diff --git a/packages/integrations/deno/src/shim.ts b/packages/integrations/deno/src/shim.ts new file mode 100644 index 000000000..11c1c912b --- /dev/null +++ b/packages/integrations/deno/src/shim.ts @@ -0,0 +1,5 @@ + +(globalThis as any).process = { + argv: [], + env: {} +}; |