Load environment variables in deno SSR (#3483)

* Properly shim env in Deno

* Add test for loading env vars in Deno

* Add changeset
This commit is contained in:
Matěj Volf 2022-05-31 17:41:33 +02:00 committed by GitHub
parent 1aeb1d0a00
commit b795a085f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 2 deletions

View file

@ -0,0 +1,5 @@
---
'@astrojs/deno': patch
---
Deno integration now loads environment variables in server runtime

View file

@ -22,7 +22,7 @@
"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-net ./test/"
"test": "deno test --allow-run --allow-read --allow-env --allow-net ./test/"
},
"devDependencies": {
"astro": "workspace:*",

View file

@ -1,4 +1,5 @@
(globalThis as any).process = {
argv: [],
env: {},
// @ts-ignore
env: Deno.env.toObject(),
};

View file

@ -5,6 +5,12 @@ async function startApp(cb) {
await runBuildAndStartApp('./fixtures/basics/', cb);
}
// this needs to be here and not in the specific test case, because
// the variables are loaded in the global scope of the built server
// module, which is only executed once upon the first load
const varContent = 'this is a value stored in env variable';
Deno.env.set('SOME_VARIABLE', varContent);
Deno.test({
name: 'Basics',
async fn() {
@ -39,3 +45,17 @@ Deno.test({
});
},
});
Deno.test({
name: 'Correctly loads run-time env variables',
async fn() {
await startApp(async () => {
const resp = await fetch('http://127.0.0.1:8085/');
const html = await resp.text();
const doc = new DOMParser().parseFromString(html, `text/html`);
const p = doc.querySelector('p#env-value');
assertEquals(p.innerText, varContent);
});
},
});

View file

@ -1,5 +1,6 @@
---
import ReactComponent from '../components/React.jsx';
const envValue = import.meta.env.SOME_VARIABLE;
---
<html>
<head>
@ -8,6 +9,7 @@ import ReactComponent from '../components/React.jsx';
</head>
<body>
<h1>Basic App on Deno</h1>
<p id="env-value">{envValue}</p>
<ReactComponent />
</body>
</html>