Add support for serving well-known URIs with the @astrojs/node SSR adapter (#5832)
This commit is contained in:
parent
4b16e9ec99
commit
2303f95142
10 changed files with 84 additions and 5 deletions
6
.changeset/two-needles-buy.md
Normal file
6
.changeset/two-needles-buy.md
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
'astro': minor
|
||||||
|
'@astrojs/node': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Add support for serving well-known URIs with the @astrojs/node SSR adapter
|
|
@ -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(
|
||||||
|
|
3
packages/astro/test/fixtures/static-build-ssr/public/.well-known/apple-app-site-association
vendored
Normal file
3
packages/astro/test/fixtures/static-build-ssr/public/.well-known/apple-app-site-association
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"applinks": {}
|
||||||
|
}
|
|
@ -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');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
|
|
9
packages/integrations/node/test/fixtures/well-known-locations/package.json
vendored
Normal file
9
packages/integrations/node/test/fixtures/well-known-locations/package.json
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"name": "@test/well-known-locations",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"astro": "workspace:*",
|
||||||
|
"@astrojs/node": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
1
packages/integrations/node/test/fixtures/well-known-locations/public/.hidden/file.json
vendored
Normal file
1
packages/integrations/node/test/fixtures/well-known-locations/public/.hidden/file.json
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"applinks": {}
|
||||||
|
}
|
45
packages/integrations/node/test/well-known-locations.test.js
Normal file
45
packages/integrations/node/test/well-known-locations.test.js
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue