summaryrefslogtreecommitdiff
path: root/packages/integrations/deno/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/deno/src')
-rw-r--r--packages/integrations/deno/src/index.ts33
-rw-r--r--packages/integrations/deno/src/server.ts51
-rw-r--r--packages/integrations/deno/src/shim.ts5
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: {}
+};