summaryrefslogtreecommitdiff
path: root/packages/integrations
diff options
context:
space:
mode:
authorGravatar Erika <3019731+Princesseuh@users.noreply.github.com> 2023-01-09 22:59:20 +0100
committerGravatar GitHub <noreply@github.com> 2023-01-09 16:59:20 -0500
commit1f92d64ea35c03fec43aff64eaf704dc5a9eb30a (patch)
tree08f65d274320dbff2b7a869032adb0f725a4aa64 /packages/integrations
parent9bb08bfe8c400d468de454c69810e18794263439 (diff)
downloadastro-1f92d64ea35c03fec43aff64eaf704dc5a9eb30a.tar.gz
astro-1f92d64ea35c03fec43aff64eaf704dc5a9eb30a.tar.zst
astro-1f92d64ea35c03fec43aff64eaf704dc5a9eb30a.zip
Drop Node 14 support (#5782)
* chore: Update engines field * fix(deps): Remove node-fetch * feat(polyfills): Remove node-fetch for undici * feat(webapi): Remove node-fetch from the webapis polyfills for undici * feat(core): Remove node-fetch for undici in Astro core * feat(telemetry): Remove node-fetch for undici * feat(node): Remove node-fetch for undici in node integration * feat(vercel): Remove node-fetch for undici in Vercel integration * chore: update lockfile * chore: update lockfile * chore: changeset * fix(set): Fix set directives not streaming correctly on Node 16 * Try another approach * Debugging * Debug fetch * Use global fetch if there is one * changeset for lit * Remove web-streams-polyfill * Remove web-streams-polyfill license note * Update .changeset/stupid-wolves-explain.md Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com> Co-authored-by: Matthew Phillips <matthew@skypack.dev> Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
Diffstat (limited to 'packages/integrations')
-rw-r--r--packages/integrations/lit/server-shim.js9
-rw-r--r--packages/integrations/mdx/package.json2
-rw-r--r--packages/integrations/node/package.json4
-rw-r--r--packages/integrations/node/src/response-iterator.ts2
-rw-r--r--packages/integrations/preact/package.json2
-rw-r--r--packages/integrations/react/package.json2
-rw-r--r--packages/integrations/solid/package.json2
-rw-r--r--packages/integrations/svelte/package.json2
-rw-r--r--packages/integrations/vercel/src/serverless/entrypoint.ts11
-rw-r--r--packages/integrations/vercel/src/serverless/request-transform.ts (renamed from packages/integrations/vercel/src/serverless/request-transform/node18.ts)0
-rw-r--r--packages/integrations/vercel/src/serverless/request-transform/legacy.ts111
-rw-r--r--packages/integrations/vue/package.json2
12 files changed, 18 insertions, 131 deletions
diff --git a/packages/integrations/lit/server-shim.js b/packages/integrations/lit/server-shim.js
index 9a4c7e408..873d3cd82 100644
--- a/packages/integrations/lit/server-shim.js
+++ b/packages/integrations/lit/server-shim.js
@@ -1,5 +1,12 @@
import { installWindowOnGlobal } from '@lit-labs/ssr/lib/dom-shim.js';
-installWindowOnGlobal();
+
+if(typeof fetch === 'function') {
+ const _fetch = fetch;
+ installWindowOnGlobal();
+ globalThis.fetch = window.fetch = _fetch;
+} else {
+ installWindowOnGlobal();
+}
window.global = window;
document.getElementsByTagName = () => [];
diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json
index d9e138893..8ca5c9bfd 100644
--- a/packages/integrations/mdx/package.json
+++ b/packages/integrations/mdx/package.json
@@ -71,6 +71,6 @@
"vite": "^4.0.3"
},
"engines": {
- "node": "^14.18.0 || >=16.12.0"
+ "node": ">=16.12.0"
}
}
diff --git a/packages/integrations/node/package.json b/packages/integrations/node/package.json
index 3e3bd2258..779b8792b 100644
--- a/packages/integrations/node/package.json
+++ b/packages/integrations/node/package.json
@@ -37,12 +37,12 @@
"astro": "workspace:^2.0.0-beta.0"
},
"devDependencies": {
- "@types/node-fetch": "^2.6.2",
"@types/send": "^0.17.1",
"astro": "workspace:*",
"astro-scripts": "workspace:*",
"chai": "^4.3.6",
"mocha": "^9.2.2",
- "node-mocks-http": "^1.11.0"
+ "node-mocks-http": "^1.11.0",
+ "undici": "^5.14.0"
}
}
diff --git a/packages/integrations/node/src/response-iterator.ts b/packages/integrations/node/src/response-iterator.ts
index 7700e9331..becd8be1b 100644
--- a/packages/integrations/node/src/response-iterator.ts
+++ b/packages/integrations/node/src/response-iterator.ts
@@ -4,7 +4,7 @@
* - https://github.com/apollographql/apollo-client/blob/main/src/utilities/common/responseIterator.ts
*/
-import type { Response as NodeResponse } from 'node-fetch';
+import type { Response as NodeResponse } from 'undici';
import { Readable as NodeReadableStream } from 'stream';
interface NodeStreamIterator<T> {
diff --git a/packages/integrations/preact/package.json b/packages/integrations/preact/package.json
index 609321616..acb94c320 100644
--- a/packages/integrations/preact/package.json
+++ b/packages/integrations/preact/package.json
@@ -47,6 +47,6 @@
"preact": "^10.6.5"
},
"engines": {
- "node": "^14.18.0 || >=16.12.0"
+ "node": ">=16.12.0"
}
}
diff --git a/packages/integrations/react/package.json b/packages/integrations/react/package.json
index 677d0d24a..4bc1c1afa 100644
--- a/packages/integrations/react/package.json
+++ b/packages/integrations/react/package.json
@@ -52,6 +52,6 @@
"@types/react-dom": "^17.0.17 || ^18.0.6"
},
"engines": {
- "node": "^14.18.0 || >=16.12.0"
+ "node": ">=16.12.0"
}
}
diff --git a/packages/integrations/solid/package.json b/packages/integrations/solid/package.json
index 94f654e82..334b0fb81 100644
--- a/packages/integrations/solid/package.json
+++ b/packages/integrations/solid/package.json
@@ -44,6 +44,6 @@
"solid-js": "^1.4.3"
},
"engines": {
- "node": "^14.18.0 || >=16.12.0"
+ "node": ">=16.12.0"
}
}
diff --git a/packages/integrations/svelte/package.json b/packages/integrations/svelte/package.json
index 6a073d4b8..1ad7abcc5 100644
--- a/packages/integrations/svelte/package.json
+++ b/packages/integrations/svelte/package.json
@@ -47,6 +47,6 @@
"astro": "workspace:^2.0.0-beta.0"
},
"engines": {
- "node": "^14.18.0 || >=16.12.0"
+ "node": ">=16.12.0"
}
}
diff --git a/packages/integrations/vercel/src/serverless/entrypoint.ts b/packages/integrations/vercel/src/serverless/entrypoint.ts
index daa811015..71ad2bfae 100644
--- a/packages/integrations/vercel/src/serverless/entrypoint.ts
+++ b/packages/integrations/vercel/src/serverless/entrypoint.ts
@@ -3,21 +3,12 @@ import type { SSRManifest } from 'astro';
import { App } from 'astro/app';
import type { IncomingMessage, ServerResponse } from 'node:http';
-import * as requestTransformLegacy from './request-transform/legacy.js';
-import * as requestTransformNode18 from './request-transform/node18.js';
+import { getRequest, setResponse } from './request-transform';
polyfill(globalThis, {
exclude: 'window document',
});
-// Node 18+ has a new API for request/response, while older versions use node-fetch
-// When we drop support for Node 14, we can remove the legacy code by switching to undici
-
-const nodeVersion = parseInt(process.version.split('.')[0].slice(1)); // 'v14.17.0' -> 14
-
-const { getRequest, setResponse } =
- nodeVersion >= 18 ? requestTransformNode18 : requestTransformLegacy;
-
export const createExports = (manifest: SSRManifest) => {
const app = new App(manifest);
diff --git a/packages/integrations/vercel/src/serverless/request-transform/node18.ts b/packages/integrations/vercel/src/serverless/request-transform.ts
index a42bac1f5..a42bac1f5 100644
--- a/packages/integrations/vercel/src/serverless/request-transform/node18.ts
+++ b/packages/integrations/vercel/src/serverless/request-transform.ts
diff --git a/packages/integrations/vercel/src/serverless/request-transform/legacy.ts b/packages/integrations/vercel/src/serverless/request-transform/legacy.ts
deleted file mode 100644
index 7212431c7..000000000
--- a/packages/integrations/vercel/src/serverless/request-transform/legacy.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import type { App } from 'astro/app';
-import type { IncomingMessage, ServerResponse } from 'node:http';
-import { Readable } from 'node:stream';
-
-const clientAddressSymbol = Symbol.for('astro.clientAddress');
-
-/*
- Credits to the SvelteKit team
- https://github.com/sveltejs/kit/blob/69913e9fda054fa6a62a80e2bb4ee7dca1005796/packages/kit/src/node.js
-*/
-
-function get_raw_body(req: IncomingMessage) {
- return new Promise<Uint8Array | null>((fulfil, reject) => {
- const h = req.headers;
-
- if (!h['content-type']) {
- return fulfil(null);
- }
-
- req.on('error', reject);
-
- const length = Number(h['content-length']);
-
- // https://github.com/jshttp/type-is/blob/c1f4388c71c8a01f79934e68f630ca4a15fffcd6/index.js#L81-L95
- if (isNaN(length) && h['transfer-encoding'] == null) {
- return fulfil(null);
- }
-
- let data = new Uint8Array(length || 0);
-
- if (length > 0) {
- let offset = 0;
- req.on('data', (chunk) => {
- const new_len = offset + Buffer.byteLength(chunk);
-
- if (new_len > length) {
- return reject({
- status: 413,
- reason: 'Exceeded "Content-Length" limit',
- });
- }
-
- data.set(chunk, offset);
- offset = new_len;
- });
- } else {
- req.on('data', (chunk) => {
- const new_data = new Uint8Array(data.length + chunk.length);
- new_data.set(data, 0);
- new_data.set(chunk, data.length);
- data = new_data;
- });
- }
-
- req.on('end', () => {
- fulfil(data);
- });
- });
-}
-
-export async function getRequest(base: string, req: IncomingMessage): Promise<Request> {
- let headers = req.headers as Record<string, string>;
- if (req.httpVersionMajor === 2) {
- // we need to strip out the HTTP/2 pseudo-headers because node-fetch's
- // Request implementation doesn't like them
- headers = Object.assign({}, headers);
- delete headers[':method'];
- delete headers[':path'];
- delete headers[':authority'];
- delete headers[':scheme'];
- }
- const request = new Request(base + req.url, {
- method: req.method,
- headers,
- body: await get_raw_body(req), // TODO stream rather than buffer
- });
- Reflect.set(request, clientAddressSymbol, headers['x-forwarded-for']);
- return request;
-}
-
-export async function setResponse(
- app: App,
- res: ServerResponse,
- response: Response
-): Promise<void> {
- const headers = Object.fromEntries(response.headers);
-
- if (response.headers.has('set-cookie')) {
- // @ts-expect-error (headers.raw() is non-standard)
- headers['set-cookie'] = response.headers.raw()['set-cookie'];
- }
-
- if (app.setCookieHeaders) {
- const setCookieHeaders: Array<string> = Array.from(app.setCookieHeaders(response));
- if (setCookieHeaders.length) {
- res.setHeader('Set-Cookie', setCookieHeaders);
- }
- }
-
- res.writeHead(response.status, headers);
-
- if (response.body instanceof Readable) {
- response.body.pipe(res);
- } else {
- if (response.body) {
- res.write(await response.arrayBuffer());
- }
-
- res.end();
- }
-}
diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json
index c0655a85d..a8b9b8fd8 100644
--- a/packages/integrations/vue/package.json
+++ b/packages/integrations/vue/package.json
@@ -54,6 +54,6 @@
"astro": "workspace:^2.0.0-beta.0"
},
"engines": {
- "node": "^14.18.0 || >=16.12.0"
+ "node": ">=16.12.0"
}
}