Warn when trying to access headers in SSG mode (#3021)
* Warn when trying to access headers in SSG mode * Adds a changeset * Warn when accessing headers at all + a test
This commit is contained in:
parent
42e0e0fa5c
commit
7e9d82d75e
7 changed files with 60 additions and 3 deletions
5
.changeset/odd-squids-rest.md
Normal file
5
.changeset/odd-squids-rest.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Warn when attempting to access headers in SSG mode
|
|
@ -191,6 +191,7 @@ async function generatePath(
|
|||
}
|
||||
}
|
||||
|
||||
const ssr = isBuildingToSSR(opts.astroConfig);
|
||||
const url = new URL(origin + pathname);
|
||||
const options: RenderOptions = {
|
||||
legacyBuild: false,
|
||||
|
@ -219,13 +220,13 @@ async function generatePath(
|
|||
const fullyRelativePath = relPath[0] === '.' ? relPath : './' + relPath;
|
||||
return fullyRelativePath;
|
||||
},
|
||||
request: createRequest({ url, headers: new Headers(), logging }),
|
||||
request: createRequest({ url, headers: new Headers(), logging, ssr }),
|
||||
route: pageData.route,
|
||||
routeCache,
|
||||
site: astroConfig.site
|
||||
? new URL(astroConfig.base, astroConfig.site).toString()
|
||||
: astroConfig.site,
|
||||
ssr: isBuildingToSSR(opts.astroConfig),
|
||||
ssr,
|
||||
};
|
||||
|
||||
let body: string;
|
||||
|
|
|
@ -11,6 +11,7 @@ export interface CreateRequestOptions {
|
|||
method?: string;
|
||||
body?: RequestBody | undefined;
|
||||
logging: LogOptions;
|
||||
ssr: boolean;
|
||||
}
|
||||
|
||||
export function createRequest({
|
||||
|
@ -19,6 +20,7 @@ export function createRequest({
|
|||
method = 'GET',
|
||||
body = undefined,
|
||||
logging,
|
||||
ssr
|
||||
}: CreateRequestOptions): Request {
|
||||
let headersObj =
|
||||
headers instanceof Headers
|
||||
|
@ -50,5 +52,21 @@ export function createRequest({
|
|||
},
|
||||
});
|
||||
|
||||
if(!ssr) {
|
||||
// Warn when accessing headers in SSG mode
|
||||
const _headers = request.headers;
|
||||
const headersDesc = Object.getOwnPropertyDescriptor(request, 'headers') || {};
|
||||
Object.defineProperty(request, 'headers', {
|
||||
...headersDesc,
|
||||
get() {
|
||||
warn(logging,
|
||||
'ssg',
|
||||
`Headers are not exposed in static-site generation (SSG) mode. To enable reading headers you need to set an SSR adapter in your config.`
|
||||
);
|
||||
return _headers;
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
|
|
|
@ -176,6 +176,7 @@ async function handleRequest(
|
|||
method: req.method,
|
||||
body,
|
||||
logging,
|
||||
ssr: buildingToSSR
|
||||
});
|
||||
|
||||
try {
|
||||
|
|
|
@ -114,6 +114,7 @@ export function rollupPluginAstroScanHTML(options: PluginOptions): VitePlugin {
|
|||
url: new URL(origin + pathname),
|
||||
headers: new Headers(),
|
||||
logging,
|
||||
ssr: false,
|
||||
}),
|
||||
mode: 'production',
|
||||
origin,
|
||||
|
|
|
@ -3,6 +3,9 @@ import MainHead from '../components/MainHead.astro';
|
|||
import Nav from '../components/Nav/index.jsx';
|
||||
import { test as ssrConfigTest } from '@test/static-build-pkg';
|
||||
let allPosts = await Astro.glob('./posts/*.md');
|
||||
|
||||
// Note that this just tests a warning
|
||||
Astro.request.headers;
|
||||
---
|
||||
<html>
|
||||
<head>
|
||||
|
|
|
@ -6,14 +6,32 @@ function addLeadingSlash(path) {
|
|||
return path.startsWith('/') ? path : '/' + path;
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {import('../src/core/logger/core').LogMessage} LogMessage
|
||||
*/
|
||||
|
||||
describe('Static build', () => {
|
||||
/** @type {import('./test-utils').Fixture} */
|
||||
let fixture;
|
||||
/** @type {LogMessage[]} */
|
||||
let logs = [];
|
||||
|
||||
before(async () => {
|
||||
/** @type {import('../src/core/logger/core').LogOptions} */
|
||||
const logging = {
|
||||
dest: {
|
||||
write(chunk) {
|
||||
logs.push(chunk);
|
||||
}
|
||||
},
|
||||
level: 'warn',
|
||||
};
|
||||
|
||||
|
||||
fixture = await loadFixture({
|
||||
root: './fixtures/static build/',
|
||||
});
|
||||
await fixture.build();
|
||||
await fixture.build({ logging });
|
||||
});
|
||||
|
||||
it('Builds out .astro pages', async () => {
|
||||
|
@ -137,4 +155,14 @@ describe('Static build', () => {
|
|||
const $ = cheerioLoad(html);
|
||||
expect($('#ssr-config').text()).to.equal('testing');
|
||||
});
|
||||
|
||||
it('warns when accessing headers', async () => {
|
||||
let found = false;
|
||||
for(const log of logs) {
|
||||
if(log.type === 'ssg' && /[hH]eaders are not exposed in static-site generation/.test(log.args[0])) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
expect(found).to.equal(true, 'Found the log message');
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue