summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/swift-pigs-shave.md5
-rw-r--r--packages/integrations/deno/package.json7
-rw-r--r--packages/integrations/deno/src/index.ts32
-rw-r--r--packages/integrations/deno/src/server.ts6
-rw-r--r--packages/integrations/deno/test/deps.js1
-rw-r--r--packages/integrations/deno/test/dynamic-import.test.js21
-rw-r--r--packages/integrations/deno/test/fixtures/dynimport/astro.config.mjs9
-rw-r--r--packages/integrations/deno/test/fixtures/dynimport/package.json9
-rw-r--r--packages/integrations/deno/test/fixtures/dynimport/src/components/Thing.astro4
-rw-r--r--packages/integrations/deno/test/fixtures/dynimport/src/pages/index.astro11
-rw-r--r--packages/integrations/deno/test/helpers.js50
-rw-r--r--pnpm-lock.yaml11
12 files changed, 157 insertions, 9 deletions
diff --git a/.changeset/swift-pigs-shave.md b/.changeset/swift-pigs-shave.md
new file mode 100644
index 000000000..f07f5c5e9
--- /dev/null
+++ b/.changeset/swift-pigs-shave.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/deno': patch
+---
+
+Fix for using Astro.glob when using the Deno Deploy adapter
diff --git a/packages/integrations/deno/package.json b/packages/integrations/deno/package.json
index f1b65d62b..6a94327e8 100644
--- a/packages/integrations/deno/package.json
+++ b/packages/integrations/deno/package.json
@@ -22,7 +22,12 @@
"build": "astro-scripts build \"src/**/*.ts\" && tsc",
"build:ci": "astro-scripts build \"src/**/*.ts\"",
"dev": "astro-scripts dev \"src/**/*.ts\"",
- "test": "deno test --allow-run --allow-read --allow-env --allow-net ./test/"
+ "test:import": "deno test --allow-run --allow-env --allow-read --allow-net --ignore=test/dynamic-import.test.js ./test/",
+ "test:subprocess": "deno test --allow-run --allow-env --allow-net ./test/dynamic-import.test.js",
+ "test": "npm run test:import && npm run test:subprocess"
+ },
+ "dependencies": {
+ "esbuild": "^0.14.42"
},
"devDependencies": {
"astro": "workspace:*",
diff --git a/packages/integrations/deno/src/index.ts b/packages/integrations/deno/src/index.ts
index aef1f8383..6fd19e53e 100644
--- a/packages/integrations/deno/src/index.ts
+++ b/packages/integrations/deno/src/index.ts
@@ -1,4 +1,8 @@
import type { AstroAdapter, AstroIntegration } from 'astro';
+import { fileURLToPath } from 'url';
+import esbuild from 'esbuild';
+import * as npath from 'path';
+import * as fs from 'fs';
interface Options {
port?: number;
@@ -15,14 +19,20 @@ export function getAdapter(args?: Options): AstroAdapter {
}
export default function createIntegration(args?: Options): AstroIntegration {
+ let _buildConfig: any;
+ let _vite: any;
return {
name: '@astrojs/deno',
hooks: {
'astro:config:done': ({ setAdapter }) => {
setAdapter(getAdapter(args));
},
+ 'astro:build:start': ({ buildConfig }) => {
+ _buildConfig = buildConfig;
+ },
'astro:build:setup': ({ vite, target }) => {
if (target === 'server') {
+ _vite = vite;
vite.resolve = vite.resolve || {};
vite.resolve.alias = vite.resolve.alias || {};
@@ -41,6 +51,28 @@ export default function createIntegration(args?: Options): AstroIntegration {
};
}
},
+ 'astro:build:done': async () => {
+ const entryUrl = new URL(_buildConfig.serverEntry, _buildConfig.server);
+ const pth = fileURLToPath(entryUrl);
+ await esbuild.build({
+ target: 'es2020',
+ platform: 'browser',
+ entryPoints: [pth],
+ outfile: pth,
+ allowOverwrite: true,
+ format: 'esm',
+ bundle: true,
+ external: [ "@astrojs/markdown-remark"]
+ });
+
+ // Remove chunks, if they exist. Since we have bundled via esbuild these chunks are trash.
+ try {
+ const chunkFileNames = _vite?.build?.rollupOptions?.output?.chunkFileNames ?? 'chunks/chunk.[hash].mjs';
+ const chunkPath = npath.dirname(chunkFileNames);
+ const chunksDirUrl = new URL(chunkPath + '/', _buildConfig.server);
+ await fs.promises.rm(chunksDirUrl, { recursive: true, force: true });
+ } catch {}
+ }
},
};
}
diff --git a/packages/integrations/deno/src/server.ts b/packages/integrations/deno/src/server.ts
index 157d06751..d1bed9aec 100644
--- a/packages/integrations/deno/src/server.ts
+++ b/packages/integrations/deno/src/server.ts
@@ -32,13 +32,15 @@ export function start(manifest: SSRManifest, options: Options) {
return fetch(localPath.toString());
};
+ const port = options.port ?? 8085;
_server = new Server({
- port: options.port ?? 8085,
+ port,
hostname: options.hostname ?? '0.0.0.0',
handler,
});
- _startPromise = _server.listenAndServe();
+ _startPromise = Promise.resolve(_server.listenAndServe());
+ console.error(`Server running on port ${port}`);
}
export function createExports(manifest: SSRManifest, options: Options) {
diff --git a/packages/integrations/deno/test/deps.js b/packages/integrations/deno/test/deps.js
index 80410a338..0fd0a6673 100644
--- a/packages/integrations/deno/test/deps.js
+++ b/packages/integrations/deno/test/deps.js
@@ -1,3 +1,4 @@
export * from 'https://deno.land/std@0.110.0/path/mod.ts';
export * from 'https://deno.land/std@0.132.0/testing/asserts.ts';
export * from 'https://deno.land/x/deno_dom/deno-dom-wasm.ts';
+export * from 'https://deno.land/std@0.142.0/streams/conversion.ts';
diff --git a/packages/integrations/deno/test/dynamic-import.test.js b/packages/integrations/deno/test/dynamic-import.test.js
new file mode 100644
index 000000000..56d7fe5a2
--- /dev/null
+++ b/packages/integrations/deno/test/dynamic-import.test.js
@@ -0,0 +1,21 @@
+import { runBuildAndStartAppFromSubprocess } from './helpers.js';
+import { assertEquals, assert, DOMParser } from './deps.js';
+
+async function startApp(cb) {
+ await runBuildAndStartAppFromSubprocess('./fixtures/dynimport/', cb);
+}
+
+Deno.test({
+ name: 'Dynamic import',
+ async fn() {
+ await startApp(async () => {
+ const resp = await fetch('http://127.0.0.1:8085/');
+ assertEquals(resp.status, 200);
+ const html = await resp.text();
+ assert(html);
+ const doc = new DOMParser().parseFromString(html, `text/html`);
+ const div = doc.querySelector('#thing');
+ assert(div, 'div exists');
+ });
+ },
+});
diff --git a/packages/integrations/deno/test/fixtures/dynimport/astro.config.mjs b/packages/integrations/deno/test/fixtures/dynimport/astro.config.mjs
new file mode 100644
index 000000000..e56fe2e98
--- /dev/null
+++ b/packages/integrations/deno/test/fixtures/dynimport/astro.config.mjs
@@ -0,0 +1,9 @@
+import { defineConfig } from 'astro/config';
+import deno from '@astrojs/deno';
+
+export default defineConfig({
+ adapter: deno(),
+ experimental: {
+ ssr: true
+ }
+})
diff --git a/packages/integrations/deno/test/fixtures/dynimport/package.json b/packages/integrations/deno/test/fixtures/dynimport/package.json
new file mode 100644
index 000000000..5dcf7da6e
--- /dev/null
+++ b/packages/integrations/deno/test/fixtures/dynimport/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/deno-astro-dynimport",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "astro": "workspace:*",
+ "@astrojs/deno": "workspace:*"
+ }
+}
diff --git a/packages/integrations/deno/test/fixtures/dynimport/src/components/Thing.astro b/packages/integrations/deno/test/fixtures/dynimport/src/components/Thing.astro
new file mode 100644
index 000000000..8d8ef929a
--- /dev/null
+++ b/packages/integrations/deno/test/fixtures/dynimport/src/components/Thing.astro
@@ -0,0 +1,4 @@
+---
+
+---
+<div id="thing">testing</div>
diff --git a/packages/integrations/deno/test/fixtures/dynimport/src/pages/index.astro b/packages/integrations/deno/test/fixtures/dynimport/src/pages/index.astro
new file mode 100644
index 000000000..852cb6201
--- /dev/null
+++ b/packages/integrations/deno/test/fixtures/dynimport/src/pages/index.astro
@@ -0,0 +1,11 @@
+---
+const { default: Thing } = await import('../components/Thing.astro');
+---
+<html>
+ <head>
+ <title>testing</title>
+ </head>
+ <body>
+ <Thing />
+ </body>
+</html>
diff --git a/packages/integrations/deno/test/helpers.js b/packages/integrations/deno/test/helpers.js
index 3a3fb0c17..74c7f9fca 100644
--- a/packages/integrations/deno/test/helpers.js
+++ b/packages/integrations/deno/test/helpers.js
@@ -1,4 +1,4 @@
-import { fromFileUrl } from './deps.js';
+import { readableStreamFromReader, fromFileUrl } from './deps.js';
const dir = new URL('./', import.meta.url);
export async function runBuild(fixturePath) {
@@ -10,14 +10,52 @@ export async function runBuild(fixturePath) {
return async () => await proc.close();
}
-export async function runBuildAndStartApp(fixturePath, cb) {
- const url = new URL(fixturePath, dir);
- const close = await runBuild(fixturePath);
- const mod = await import(new URL('./dist/server/entry.mjs', url));
+export async function startModFromImport(baseUrl) {
+ const entryUrl = new URL('./dist/server/entry.mjs', baseUrl);
+ const mod = await import(entryUrl);
+
if (!mod.running()) {
mod.start();
}
+
+ return () => mod.stop();
+}
+
+export async function startModFromSubprocess(baseUrl) {
+ const entryUrl = new URL('./dist/server/entry.mjs', baseUrl);
+ let proc = Deno.run({
+ cmd: ['deno', 'run', '--allow-env', '--allow-net', fromFileUrl(entryUrl)],
+ cwd: fromFileUrl(baseUrl),
+ stderr: 'piped'
+ });
+ const stderr = readableStreamFromReader(proc.stderr);
+ const dec = new TextDecoder();
+ for await(let bytes of stderr) {
+ let msg = dec.decode(bytes);
+ if(msg.includes(`Server running`)) {
+ break;
+ }
+ }
+ return () => proc.close();
+}
+
+export async function runBuildAndStartApp(fixturePath, cb) {
+ const url = new URL(fixturePath, dir);
+ const close = await runBuild(fixturePath);
+ const stop = await startModFromImport(url);
+
+ await cb();
+ await stop();
+ await close();
+}
+
+
+export async function runBuildAndStartAppFromSubprocess(fixturePath, cb) {
+ const url = new URL(fixturePath, dir);
+ const close = await runBuild(fixturePath);
+ const stop = await startModFromSubprocess(url);
+
await cb();
- await mod.stop();
+ await stop();
await close();
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index eb89d0e20..1b00d4aa8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1645,6 +1645,9 @@ importers:
specifiers:
astro: workspace:*
astro-scripts: workspace:*
+ esbuild: ^0.14.42
+ dependencies:
+ esbuild: 0.14.42
devDependencies:
astro: link:../../astro
astro-scripts: link:../../../scripts
@@ -1659,6 +1662,14 @@ importers:
'@astrojs/react': link:../../../../react
astro: link:../../../../../astro
+ packages/integrations/deno/test/fixtures/dynimport:
+ specifiers:
+ '@astrojs/deno': workspace:*
+ astro: workspace:*
+ dependencies:
+ '@astrojs/deno': link:../../..
+ astro: link:../../../../../astro
+
packages/integrations/lit:
specifiers:
'@lit-labs/ssr': ^2.2.0