diff --git a/.eslintignore b/.eslintignore index b3d6172497..02d3a94276 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,6 +4,8 @@ lib demos packages/runtime/src/templates/edge packages/runtime/src/templates/edge-shared +packages/runtime/src/templates/vendor +packages/runtime/src/templates/vendor.ts packages/runtime/lib packages/runtime/dist-types jestSetup.js diff --git a/.github/workflows/cypress-canary.yml b/.github/workflows/cypress-canary.yml index ad0bf3e367..9098e29add 100644 --- a/.github/workflows/cypress-canary.yml +++ b/.github/workflows/cypress-canary.yml @@ -47,6 +47,10 @@ jobs: with: node-version: '16' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + - run: npm install - name: Cypress run diff --git a/.github/workflows/cypress-demo-nx.yml b/.github/workflows/cypress-demo-nx.yml index db76a52105..779b61b0be 100644 --- a/.github/workflows/cypress-demo-nx.yml +++ b/.github/workflows/cypress-demo-nx.yml @@ -47,6 +47,10 @@ jobs: with: node-version: '16' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + - run: npm install - name: Cypress run diff --git a/.github/workflows/cypress-demo-static.yml b/.github/workflows/cypress-demo-static.yml index d97ea8a304..79901e290b 100644 --- a/.github/workflows/cypress-demo-static.yml +++ b/.github/workflows/cypress-demo-static.yml @@ -51,6 +51,10 @@ jobs: with: node-version: '16' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + - run: npm install - name: Cypress run diff --git a/.github/workflows/cypress-demo.yml b/.github/workflows/cypress-demo.yml index 02ba753907..2e9b4e218d 100644 --- a/.github/workflows/cypress-demo.yml +++ b/.github/workflows/cypress-demo.yml @@ -51,6 +51,10 @@ jobs: with: node-version: '16' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + - run: npm install - name: Cypress run diff --git a/.github/workflows/cypress-middleware.yml b/.github/workflows/cypress-middleware.yml index 0a67c7c93d..66c1376ed1 100644 --- a/.github/workflows/cypress-middleware.yml +++ b/.github/workflows/cypress-middleware.yml @@ -51,6 +51,10 @@ jobs: with: node-version: '16' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + - run: npm install - name: Cypress run diff --git a/.github/workflows/e2e-appdir.yml b/.github/workflows/e2e-appdir.yml index 9f521cafdf..816928421e 100644 --- a/.github/workflows/e2e-appdir.yml +++ b/.github/workflows/e2e-appdir.yml @@ -16,6 +16,9 @@ jobs: test-files: ${{ steps['set-test-files'].outputs['test-files'] }} steps: - uses: actions/checkout@v3 + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - run: npm install - id: set-test-files name: Get test files @@ -42,6 +45,9 @@ jobs: with: node-version: '16' cache: 'npm' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - run: npm install - name: Install Netlify CLI run: npm install -g netlify-cli diff --git a/.github/workflows/e2e-next.yml b/.github/workflows/e2e-next.yml index c78a2b56d0..b47442186d 100644 --- a/.github/workflows/e2e-next.yml +++ b/.github/workflows/e2e-next.yml @@ -44,6 +44,9 @@ jobs: with: node-version: '16' cache: 'npm' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - run: npm install - name: Install Netlify CLI run: npm install -g netlify-cli diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 3333747124..ebe2281a88 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -15,6 +15,9 @@ jobs: cache: 'npm' check-latest: true registry-url: 'https://registry.npmjs.org' + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - name: Install core dependencies run: npm ci --no-audit - name: Extract tag and version diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index d3ba9e8543..c8f4be2782 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -26,6 +26,10 @@ jobs: check-latest: true registry-url: 'https://registry.npmjs.org' if: ${{ steps.release.outputs.releases_created }} + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + if: ${{ steps.release.outputs.releases_created }} - name: Install dependencies run: CI=1 npm ci if: ${{ steps.release.outputs.releases_created }} diff --git a/.github/workflows/test-deno.yml b/.github/workflows/test-deno.yml deleted file mode 100644 index 14b2392291..0000000000 --- a/.github/workflows/test-deno.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Deno tests - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Git Checkout Deno Module - uses: actions/checkout@v3 - - name: Use Deno Version ${{ matrix.deno-version }} - uses: denolib/setup-deno@v2 - with: - deno-version: vx.x.x - - name: Test Deno - run: deno test packages/runtime/src/templates/edge-shared/ diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 9c3dc4328f..516b3a628c 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -24,6 +24,9 @@ jobs: with: node-version: 18 check-latest: true + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - name: Install netlify-cli and npm run: npm install -g netlify-cli npm - name: NPM Install diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index afc54d6ac0..802f286fd6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,12 +31,17 @@ jobs: with: node-version: 16 check-latest: true + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - name: NPM Install run: npm install - name: Linting run: npm run format:ci - name: Run tests against next@latest run: npm test + - name: Run Deno tests + run: npm run test:deno canary: name: Unit tests (Canary) runs-on: ${{ matrix.os }} @@ -54,6 +59,9 @@ jobs: with: node-version: 16 check-latest: true + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x - name: NPM Install run: npm install - name: Install Next.js Canary diff --git a/.prettierignore b/.prettierignore index d65b076d46..d3a57abb2b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -26,4 +26,5 @@ test/e2e **/CHANGELOG.md packages/runtime/lib -packages/runtime/dist-types \ No newline at end of file +packages/runtime/dist-types +packages/runtime/src/templates/vendor diff --git a/.vscode/settings.json b/.vscode/settings.json index 5e1acb3317..8774b0b89d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,8 @@ "deno.enablePaths": [ "packages/runtime/src/templates/edge", "packages/runtime/src/templates/edge-shared", + "packages/runtime/src/templates/vendor", + "packages/runtime/src/templates/vendor.ts", "demos/middleware/.netlify/edge-functions", "demos/server-components/.netlify/edge-functions", ], diff --git a/packages/runtime/.gitignore b/packages/runtime/.gitignore new file mode 100644 index 0000000000..656660c31b --- /dev/null +++ b/packages/runtime/.gitignore @@ -0,0 +1 @@ +src/templates/vendor diff --git a/packages/runtime/html_rewriter.patch b/packages/runtime/html_rewriter.patch new file mode 100644 index 0000000000..d948bcb78a --- /dev/null +++ b/packages/runtime/html_rewriter.patch @@ -0,0 +1,4 @@ +56c56 +< fetch(new URL("./vendor/html_rewriter_bg.wasm", import.meta.url).href) +--- +> fetch("https://deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/html_rewriter_bg.wasm") diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 4fa214414f..7903101385 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -7,6 +7,7 @@ "lib/**/*", "src/templates/edge/*", "src/templates/edge-shared/*", + "src/templates/vendor/*", "index.js", "manifest.yml" ], @@ -52,7 +53,9 @@ "publish:install": "npm ci", "publish:test": "cd .. && npm ci && npm test", "clean": "rimraf lib dist-types", - "build": "tsc", + "build": "run-s build:*", + "build:vendor": "rimraf src/templates/vendor && deno vendor src/templates/vendor.ts --output=src/templates/vendor && patch src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/index.ts html_rewriter.patch", + "build:tsc": "tsc", "watch": "tsc --watch", "prepare": "npm run build" }, diff --git a/packages/runtime/src/helpers/edge.ts b/packages/runtime/src/helpers/edge.ts index cdf5227b5c..dadc6da9bc 100644 --- a/packages/runtime/src/helpers/edge.ts +++ b/packages/runtime/src/helpers/edge.ts @@ -378,6 +378,7 @@ export const writeEdgeFunctions = async ({ const nextConfig = nextConfigFile.config const usesAppDir = nextConfig.experimental?.appDir + await copy(getEdgeTemplatePath('../vendor'), join(edgeFunctionRoot, 'vendor')) await copy(getEdgeTemplatePath('../edge-shared'), join(edgeFunctionRoot, 'edge-shared')) await writeJSON(join(edgeFunctionRoot, 'edge-shared', 'nextConfig.json'), nextConfig) await copy(join(publish, 'prerender-manifest.json'), join(edgeFunctionRoot, 'edge-shared', 'prerender-manifest.json')) diff --git a/packages/runtime/src/templates/edge-shared/next-utils.ts b/packages/runtime/src/templates/edge-shared/next-utils.ts index e55c9a4d2d..1515411957 100644 --- a/packages/runtime/src/templates/edge-shared/next-utils.ts +++ b/packages/runtime/src/templates/edge-shared/next-utils.ts @@ -7,10 +7,10 @@ */ // Deno imports -import type { Key } from 'https://deno.land/x/path_to_regexp@v6.2.1/index.ts' +import type { Key } from '../vendor/deno.land/x/path_to_regexp@v6.2.1/index.ts' -import { compile, pathToRegexp } from 'https://deno.land/x/path_to_regexp@v6.2.1/index.ts' -import { getCookies } from 'https://deno.land/std@0.148.0/http/cookie.ts' +import { compile, pathToRegexp } from '../vendor/deno.land/x/path_to_regexp@v6.2.1/index.ts' +import { getCookies } from '../vendor/deno.land/std@0.175.0/http/cookie.ts' // Inlined/re-implemented types diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index f679ad2037..70a2752192 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -1,5 +1,5 @@ import type { Context } from 'https://edge.netlify.com' -import { ElementHandlers, HTMLRewriter } from 'https://deno.land/x/html_rewriter@v0.1.0-pre.17/index.ts' +import { ElementHandlers, HTMLRewriter } from '../vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/index.ts' export interface FetchEventResult { response: Response diff --git a/packages/runtime/src/templates/edge/next-dev.js b/packages/runtime/src/templates/edge/next-dev.js index 5980b6a919..27bbea795b 100644 --- a/packages/runtime/src/templates/edge/next-dev.js +++ b/packages/runtime/src/templates/edge/next-dev.js @@ -1,6 +1,6 @@ -import { NextRequest } from 'https://esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/request.js' -import { NextResponse } from 'https://esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/response.js' -import { fromFileUrl } from 'https://deno.land/std@0.151.0/path/mod.ts' +import { NextRequest } from '../vendor/esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/request.js' +import { NextResponse } from '../vendor/esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/response.js' +import { fromFileUrl } from '../vendor/deno.land/std@0.175.0/path/mod.ts' import { buildResponse, isFunction } from '../edge-shared/utils.ts' globalThis.NFRequestContextMap ||= new Map() diff --git a/packages/runtime/src/templates/edge/shims.js b/packages/runtime/src/templates/edge/shims.js index b52983c27c..b0a8ac3a06 100644 --- a/packages/runtime/src/templates/edge/shims.js +++ b/packages/runtime/src/templates/edge/shims.js @@ -1,11 +1,11 @@ // @ts-check // deno-lint-ignore-file prefer-const no-unused-vars -import { decode as _base64Decode } from 'https://deno.land/std@0.175.0/encoding/base64.ts' -import BufferCompat from 'https://deno.land/std@0.175.0/node/buffer.ts' -import EventsCompat from 'https://deno.land/std@0.175.0/node/events.ts' -import AsyncHooksCompat from 'https://deno.land/std@0.175.0/node/async_hooks.ts' -import AssertCompat from 'https://deno.land/std@0.175.0/node/assert.ts' -import UtilCompat from 'https://deno.land/std@0.175.0/node/util.ts' +import { decode as _base64Decode } from '../vendor/deno.land/std@0.175.0/encoding/base64.ts' +import BufferCompat from '../vendor/deno.land/std@0.175.0/node/buffer.ts' +import EventsCompat from '../vendor/deno.land/std@0.175.0/node/events.ts' +import AsyncHooksCompat from '../vendor/deno.land/std@0.175.0/node/async_hooks.ts' +import AssertCompat from '../vendor/deno.land/std@0.175.0/node/assert.ts' +import UtilCompat from '../vendor/deno.land/std@0.175.0/node/util.ts' /** * These are the shims, polyfills and other kludges to make Next.js work in standards-compliant runtime. diff --git a/packages/runtime/src/templates/vendor.ts b/packages/runtime/src/templates/vendor.ts new file mode 100644 index 0000000000..a38cbdb84b --- /dev/null +++ b/packages/runtime/src/templates/vendor.ts @@ -0,0 +1,21 @@ +// this file isn't meant to be imported. +// it's a list of all external modules that we use, +// and we vendor those into the `vendor/` directory +// for consumption in other files. +// Vendoring happens automatically as part of runtime `build` script. +// You can trigger just vendoring without full package build by running `build:vendor` script. + +import 'https://deno.land/std@0.175.0/encoding/base64.ts' +import 'https://deno.land/std@0.175.0/http/cookie.ts' +import 'https://deno.land/std@0.175.0/node/buffer.ts' +import 'https://deno.land/std@0.175.0/node/events.ts' +import 'https://deno.land/std@0.175.0/node/async_hooks.ts' +import 'https://deno.land/std@0.175.0/node/assert.ts' +import 'https://deno.land/std@0.175.0/node/util.ts' +import 'https://deno.land/std@0.175.0/path/mod.ts' + +import 'https://deno.land/x/path_to_regexp@v6.2.1/index.ts' +import 'https://deno.land/x/html_rewriter@v0.1.0-pre.17/index.ts' + +import 'https://esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/request.js' +import 'https://esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/response.js' diff --git a/packages/runtime/tsconfig.json b/packages/runtime/tsconfig.json index b8b6b575cd..7e2bfdc5b0 100644 --- a/packages/runtime/tsconfig.json +++ b/packages/runtime/tsconfig.json @@ -10,6 +10,7 @@ ], "exclude": [ "src/templates/edge/*", - "src/templates/edge-shared/*" + "src/templates/edge-shared/*", + "src/templates/vendor/*" ] } \ No newline at end of file