Add support for serving well-known URIs with the @astrojs/node SSR adapter (#5832)

This commit is contained in:
HiDeoo 2023-01-11 10:52:51 +01:00 committed by GitHub
parent 4b16e9ec99
commit 2303f95142
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 84 additions and 5 deletions

View file

@ -0,0 +1,6 @@
---
'astro': minor
'@astrojs/node': minor
---
Add support for serving well-known URIs with the @astrojs/node SSR adapter

View file

@ -191,7 +191,7 @@ async function clientBuild(
if (!input.size) { if (!input.size) {
// If SSR, copy public over // If SSR, copy public over
if (ssr) { if (ssr) {
await copyFiles(settings.config.publicDir, out); await copyFiles(settings.config.publicDir, out, true);
} }
return null; return null;
@ -318,9 +318,10 @@ async function cleanServerOutput(opts: StaticBuildOptions) {
} }
} }
async function copyFiles(fromFolder: URL, toFolder: URL) { async function copyFiles(fromFolder: URL, toFolder: URL, includeDotfiles = false) {
const files = await glob('**/*', { const files = await glob('**/*', {
cwd: fileURLToPath(fromFolder), cwd: fileURLToPath(fromFolder),
dot: includeDotfiles,
}); });
await Promise.all( await Promise.all(

View file

@ -0,0 +1,3 @@
{
"applinks": {}
}

View file

@ -191,6 +191,8 @@ describe('Static build SSR', () => {
root: './fixtures/static-build-ssr/', root: './fixtures/static-build-ssr/',
}); });
await fixture.build(); await fixture.build();
const asset = await fixture.readFile('/client/nested/asset2.txt');
await fixture.readFile('/client/nested/asset2.txt');
await fixture.readFile('/client/.well-known/apple-app-site-association');
}); });
}); });

View file

@ -17,10 +17,11 @@ export function createServer(
) { ) {
const listener: http.RequestListener = (req, res) => { const listener: http.RequestListener = (req, res) => {
if (req.url) { if (req.url) {
const pathname = '/' + removeBase(req.url); let pathname = removeBase(req.url);
pathname = pathname[0] === '/' ? pathname : '/' + pathname;
const stream = send(req, encodeURI(pathname), { const stream = send(req, encodeURI(pathname), {
root: fileURLToPath(client), root: fileURLToPath(client),
dotfiles: 'deny', dotfiles: pathname.startsWith('/.well-known/') ? 'allow' : 'deny',
}); });
let forwardError = false; let forwardError = false;

View file

@ -0,0 +1,9 @@
{
"name": "@test/well-known-locations",
"version": "0.0.0",
"private": true,
"dependencies": {
"astro": "workspace:*",
"@astrojs/node": "workspace:*"
}
}

View file

@ -0,0 +1,45 @@
import nodejs from '../dist/index.js';
import { loadFixture } from './test-utils.js';
import { expect } from 'chai';
describe('test URIs beginning with a dot', () => {
/** @type {import('./test-utils').Fixture} */
let fixture;
before(async () => {
fixture = await loadFixture({
root: './fixtures/well-known-locations/',
output: 'server',
adapter: nodejs({ mode: 'standalone' }),
});
await fixture.build();
});
describe('can load well-known URIs', async () => {
let devPreview;
before(async () => {
devPreview = await fixture.preview();
});
after(async () => {
await devPreview.stop();
});
it('can load a valid well-known URI', async () => {
const res = await fixture.fetch('/.well-known/apple-app-site-association');
expect(res.status).to.equal(200);
const json = await res.json();
expect(json).to.deep.equal({ applinks: {} });
});
it('cannot load a dot folder that is not a well-known URI', async () => {
const res = await fixture.fetch('/.hidden/file.json');
expect(res.status).to.equal(404);
});
});
});

View file

@ -3097,6 +3097,14 @@ importers:
'@astrojs/node': link:../../.. '@astrojs/node': link:../../..
astro: link:../../../../../astro astro: link:../../../../../astro
packages/integrations/node/test/fixtures/well-known-locations:
specifiers:
'@astrojs/node': workspace:*
astro: workspace:*
dependencies:
'@astrojs/node': link:../../..
astro: link:../../../../../astro
packages/integrations/partytown: packages/integrations/partytown:
specifiers: specifiers:
'@builder.io/partytown': ^0.7.4 '@builder.io/partytown': ^0.7.4