diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59d0574..d24c886 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,11 +34,27 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - cache: 'pnpm' + cache: "pnpm" - name: Install Dependencies id: pnpm-install run: pnpm install --frozen-lockfile + - name: Pull Vercel Environment Variables for nextjs-app example + env: + VERCEL_TOKEN_E2E: ${{ secrets.VERCEL_TOKEN_E2E }} + run: | + pnpm install -g vercel + echo "Fetching env for nextjs-app/docs..." + vercel link --cwd examples/nextjs-app/docs --scope microfrontends-vtest314 --project nextjs-app-docs --yes --token $VERCEL_TOKEN_E2E + cd examples/nextjs-app/docs + vercel env pull .env --token $VERCEL_TOKEN_E2E + cd ../../../ + echo "Fetching env for appjs-app/marketing..." + vercel link --cwd examples/nextjs-app/marketing --scope microfrontends-vtest314 --project nextjs-app-marketing --yes --token $VERCEL_TOKEN_E2E + cd examples/nextjs-app/marketing + vercel env pull .env --token $VERCEL_TOKEN_E2E + cd ../../../ + - name: Run CI run: pnpm turbo typecheck lint test test:local-proxy-turbo-integration --continue diff --git a/examples/nextjs-app/marketing/microfrontends.jsonc b/examples/nextjs-app/marketing/microfrontends-custom.jsonc similarity index 62% rename from examples/nextjs-app/marketing/microfrontends.jsonc rename to examples/nextjs-app/marketing/microfrontends-custom.jsonc index 09a84c6..7570c0a 100644 --- a/examples/nextjs-app/marketing/microfrontends.jsonc +++ b/examples/nextjs-app/marketing/microfrontends-custom.jsonc @@ -1,69 +1,68 @@ -// TODO: delete this file when the build container support custom microfrontends.json naming { "$schema": "https://openapi.vercel.sh/microfrontends.json", "applications": { "nextjs-app-marketing": { "development": { "local": 3000, - "fallback": "nextjs-app-marketing.vercel.app", - }, + "fallback": "nextjs-app-marketing.vercel.app" + } }, "nextjs-app-docs": { "assetPrefix": "nextjs-app-docs", "development": { - "local": 3001, + "local": 3001 }, "routing": [ { "group": "docs", - "paths": ["/docs", "/docs/:path*", "/nextjs-app-docs/:path*"], + "paths": ["/docs", "/docs/:path*", "/nextjs-app-docs/:path*"] }, { "group": "flagged-docs-paths", "flag": "is-flagged-docs-path-enabled", - "paths": ["/flagged/docs"], + "paths": ["/flagged/docs"] }, { "group": "mid-path-wildcard", - "paths": ["/some-:hash.js"], + "paths": ["/some-:hash.js"] }, { "group": "excluding regex", - "paths": ["/city/:path((?!berlin|amsterdam).*)"], + "paths": ["/city/:path((?!berlin|amsterdam).*)"] }, { "group": "special characters", - "paths": ["/foo/hello\\(world\\)"], + "paths": ["/foo/hello\\(world\\)"] }, { "group": "dashes", - "paths": ["/foo/hello-world", "/foo/hello~world", "/foo/hello_world"], + "paths": ["/foo/hello-world", "/foo/hello~world", "/foo/hello_world"] }, { "group": "regex with numbers", - "paths": ["/foo/:path(hello1|hello2)"], + "paths": ["/foo/:path(hello1|hello2)"] }, { "group": "regex with dashes", - "paths": ["/foo/:path(hello-1|hello-2)"], + "paths": ["/foo/:path(hello-1|hello-2)"] }, { "group": "regex with escaped characters", - "paths": ["/foo/:path(hello\\(1\\)|1)"], + "paths": ["/foo/:path(hello\\(1\\)|1)"] }, { "group": "excluding regex with dashes", - "paths": ["/foo/:path((?!hello\\-3).*)"], + "paths": ["/foo/:path((?!hello\\-3).*)"] }, { "group": "path with escaped characters", - "paths": ["/bar/hello\\(3\\)"], + "paths": ["/bar/hello\\(3\\)"] }, { "group": "child rate limit", - "paths": ["/api/check-rate-limit"], - }, - ], - }, - }, + "paths": ["/api/check-rate-limit"] + } + ] + } + } } diff --git a/examples/nextjs-app/marketing/tests/microfrontends.test.ts b/examples/nextjs-app/marketing/tests/microfrontends.test.ts index e18a3a2..fa47352 100644 --- a/examples/nextjs-app/marketing/tests/microfrontends.test.ts +++ b/examples/nextjs-app/marketing/tests/microfrontends.test.ts @@ -5,7 +5,7 @@ import { validateRouting } from '@vercel/microfrontends/next/testing'; describe('microfrontends', () => { test('routing', () => { expect(() => - validateRouting('./microfrontends.jsonc', { + validateRouting('./microfrontends-custom.jsonc', { 'nextjs-app-marketing': ['/', '/city/amsterdam', '/flagged/docs'], 'nextjs-app-docs': [ '/docs', diff --git a/examples/nextjs-app/marketing/tests/middleware.test.ts b/examples/nextjs-app/marketing/tests/middleware.test.ts index bf989cb..b486e23 100644 --- a/examples/nextjs-app/marketing/tests/middleware.test.ts +++ b/examples/nextjs-app/marketing/tests/middleware.test.ts @@ -13,13 +13,16 @@ jest.mock('flags/next', () => ({ describe('middleware', () => { test('matches microfrontends paths', () => { expect(() => - validateMiddlewareConfig(config, './microfrontends.jsonc'), + validateMiddlewareConfig(config, './microfrontends-custom.jsonc'), ).not.toThrow(); }); test('rewrites for flagged paths', async () => { await expect( - validateMiddlewareOnFlaggedPaths('./microfrontends.jsonc', middleware), + validateMiddlewareOnFlaggedPaths( + './microfrontends-custom.jsonc', + middleware, + ), ).resolves.not.toThrow(); }); }); diff --git a/examples/nextjs-app/marketing/tests/next-config.test.ts b/examples/nextjs-app/marketing/tests/next-config.test.ts index 3799ac9..e479186 100644 --- a/examples/nextjs-app/marketing/tests/next-config.test.ts +++ b/examples/nextjs-app/marketing/tests/next-config.test.ts @@ -34,7 +34,7 @@ describe('next.config.ts', () => { it('next.config.js redirects and rewrites should not match any microfrontend path', async () => { const mfeConfig = loadMicrofrontendConfigForEdge( - './microfrontends.jsonc', + './microfrontends-custom.jsonc', ); const allPaths = [...getAllMicrofrontendPaths(mfeConfig)]; const errors = []; diff --git a/package.json b/package.json index f95cd54..29178c5 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build:single-spa-example": "turbo build -F single-spa-root -F single-spa-web -F single-spa-shared", "changeset": "changeset", "checks": "turbo run build lint test typecheck --continue", - "dev:nextjs-app": "turbo dev -F nextjs-app-docs -F nextjs-app-marketing", + "dev:nextjs-app": "VC_MICROFRONTENDS_CONFIG_FILE_NAME=microfrontends-custom.jsonc turbo dev -F nextjs-app-docs -F nextjs-app-marketing", "dev:nextjs-pages": "turbo dev -F nextjs-pages-dashboard -F nextjs-pages-blog", "dev:react-router": "turbo dev -F react-router-web -F react-router-docs -F react-router-vite-base-path-different-than-vercel-project-name", "dev:single-spa": "turbo dev -F single-spa-root -F single-spa-web -F single-spa-shared", @@ -48,7 +48,7 @@ "lint-staged": "^15.4.3", "prettier": "^3.4.2", "syncpack": "^13.0.1", - "turbo": "2.5.2-canary.0", + "turbo": "2.6.0", "typescript": "5.7.3" }, "packageManager": "pnpm@9.4.0", diff --git a/packages/internal-scripts/src/test-local-proxy-start.ts b/packages/internal-scripts/src/test-local-proxy-start.ts index bf8bcc7..40b1207 100644 --- a/packages/internal-scripts/src/test-local-proxy-start.ts +++ b/packages/internal-scripts/src/test-local-proxy-start.ts @@ -4,15 +4,23 @@ import { join } from 'node:path'; const WORKSPACE_ROOT = join(process.cwd(), '..', '..'); const DEV_TASKS = [ - 'nextjs-app-docs#dev', - 'nextjs-app-marketing#dev', - 'nextjs-pages-blog#dev', - 'nextjs-pages-dashboard#dev', - 'react-router-docs#dev', - 'react-router-vite-base-path-different-than-vercel-project-name#dev', - 'react-router-web#dev', - 'sveltekit-docs#dev', - 'sveltekit-web#dev', + { + task: 'nextjs-app-docs#dev', + env: { VC_MICROFRONTENDS_CONFIG_FILE_NAME: 'microfrontends-custom.jsonc' }, + }, + { + task: 'nextjs-app-marketing#dev', + env: { VC_MICROFRONTENDS_CONFIG_FILE_NAME: 'microfrontends-custom.jsonc' }, + }, + { task: 'nextjs-pages-blog#dev' }, + { task: 'nextjs-pages-dashboard#dev' }, + { task: 'react-router-docs#dev' }, + { + task: 'react-router-vite-base-path-different-than-vercel-project-name#dev', + }, + { task: 'react-router-web#dev' }, + { task: 'sveltekit-docs#dev' }, + { task: 'sveltekit-web#dev' }, ]; interface DryRunOutput { @@ -27,7 +35,7 @@ function main() { const missingProxyTask = []; const failed = []; for (const { devTask, hasProxyTask, errorMessage } of DEV_TASKS.map( - checkDevTask, + ({ task, env }) => checkDevTask(task, env), )) { if (errorMessage) { failed.push(`${devTask}: turbo dry run failed: ${errorMessage}`); @@ -45,7 +53,10 @@ function main() { } } -function checkDevTask(devTask: string): { +function checkDevTask( + devTask: string, + env: Record | undefined, +): { devTask: string; hasProxyTask: boolean; errorMessage?: string; @@ -54,6 +65,7 @@ function checkDevTask(devTask: string): { stdio: 'pipe', encoding: 'utf8', cwd: WORKSPACE_ROOT, + env: { ...process.env, ...env }, }); if (result.error) { return { devTask, hasProxyTask: false, errorMessage: result.error.message }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e16c991..899b3b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: ^13.0.1 version: 13.0.1(typescript@5.7.3) turbo: - specifier: 2.5.2-canary.0 - version: 2.5.2-canary.0 + specifier: 2.6.0 + version: 2.6.0 typescript: specifier: 5.7.3 version: 5.7.3 @@ -7570,41 +7570,41 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.5.2-canary.0: - resolution: {integrity: sha512-JO65xZrLyXdGYfv/XsvEF9vxtltO4kB/us2XP6tKCXCiNflmvSi+OTmqljLeW/gkMjblhy31t8B+FLKESdtFfg==} + turbo-darwin-64@2.6.0: + resolution: {integrity: sha512-6vHnLAubHj8Ib45Knu+oY0ZVCLO7WcibzAvt5b1E72YHqAs4y8meMAGMZM0jLqWPh/9maHDc16/qBCMxtW4pXg==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.2-canary.0: - resolution: {integrity: sha512-S6D5uOw6cIVmUkF3iiiFQSW43A/xGBMxrAGq3hGt+khsQBD+3USzJw4xCi/U2Vhgx6nhqkqbT6wQikp888SDKw==} + turbo-darwin-arm64@2.6.0: + resolution: {integrity: sha512-IU+gWMEXNBw8H0pxvE7nPEa5p6yahxbN8g/Q4Bf0AHymsAFqsScgV0peeNbWybdmY9jk1LPbALOsF2kY1I7ZiQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.2-canary.0: - resolution: {integrity: sha512-Ec2r/SiO5Ld+S+/hdBg8k7k/qLZD9TKWvWGPfpeUUM+s+EZkkSYqTYXp1aeB8mbdfVYBmP2YXcWZyH9+VoaQ4g==} + turbo-linux-64@2.6.0: + resolution: {integrity: sha512-CKoiJ2ZFJLCDsWdRlZg+ew1BkGn8iCEGdePhISVpjsGwkJwSVhVu49z2zKdBeL1IhcSKS2YALwp9ellNZANJxw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.2-canary.0: - resolution: {integrity: sha512-mHcQ2XRfW7S2OuZlh6z3gneC3yndLngtzR17w5xPa856LYYGky7OhLX05uds42oUt7v3S8KJa/FRI1P3EuGJtw==} + turbo-linux-arm64@2.6.0: + resolution: {integrity: sha512-WroVCdCvJbrhNxNdw7XB7wHAfPPJPV+IXY+ZKNed+9VdfBu/2mQNfKnvqTuFTH7n+Pdpv8to9qwhXRTJe26upg==} cpu: [arm64] os: [linux] turbo-stream@2.4.0: resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} - turbo-windows-64@2.5.2-canary.0: - resolution: {integrity: sha512-DB+7qwuc0U66F/kLnBT8U4GNQMnd0zvuqCMNVTVx89+/BQ5M5S0ybOJ9yVwwnuF8aZ4PB9fn8+xItzvlPAXkAA==} + turbo-windows-64@2.6.0: + resolution: {integrity: sha512-7pZo5aGQPR+A7RMtWCZHusarJ6y15LQ+o3jOmpMxTic/W6Bad+jSeqo07TWNIseIWjCVzrSv27+0odiYRYtQdA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.2-canary.0: - resolution: {integrity: sha512-Gj9CTE/XU58KQxuYCKl3I20XiQ31GYzm9MmKsSgRATHPl+SFge8/FVzMrTgQT3Cjke47+rzkl6gx1JQ/XaE4Mw==} + turbo-windows-arm64@2.6.0: + resolution: {integrity: sha512-1Ty+NwIksQY7AtFUCPrTpcKQE7zmd/f7aRjdT+qkqGFQjIjFYctEtN7qo4vpQPBgCfS1U3ka83A2u/9CfJQ3wQ==} cpu: [arm64] os: [win32] - turbo@2.5.2-canary.0: - resolution: {integrity: sha512-e8dN0h5kwDyafq2VS4VzAgVlIiXIHuTFMyHNRLgUTrnl3KQvMBm/ILPH4vdWM4njN9DWjOamH0esen10AQC2HA==} + turbo@2.6.0: + resolution: {integrity: sha512-kC5VJqOXo50k0/0jnJDDjibLAXalqT9j7PQ56so0pN+81VR4Fwb2QgIE9dTzT3phqOTQuEXkPh3sCpnv5Isz2g==} hasBin: true type-check@0.4.0: @@ -15751,34 +15751,34 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.5.2-canary.0: + turbo-darwin-64@2.6.0: optional: true - turbo-darwin-arm64@2.5.2-canary.0: + turbo-darwin-arm64@2.6.0: optional: true - turbo-linux-64@2.5.2-canary.0: + turbo-linux-64@2.6.0: optional: true - turbo-linux-arm64@2.5.2-canary.0: + turbo-linux-arm64@2.6.0: optional: true turbo-stream@2.4.0: {} - turbo-windows-64@2.5.2-canary.0: + turbo-windows-64@2.6.0: optional: true - turbo-windows-arm64@2.5.2-canary.0: + turbo-windows-arm64@2.6.0: optional: true - turbo@2.5.2-canary.0: + turbo@2.6.0: optionalDependencies: - turbo-darwin-64: 2.5.2-canary.0 - turbo-darwin-arm64: 2.5.2-canary.0 - turbo-linux-64: 2.5.2-canary.0 - turbo-linux-arm64: 2.5.2-canary.0 - turbo-windows-64: 2.5.2-canary.0 - turbo-windows-arm64: 2.5.2-canary.0 + turbo-darwin-64: 2.6.0 + turbo-darwin-arm64: 2.6.0 + turbo-linux-64: 2.6.0 + turbo-linux-arm64: 2.6.0 + turbo-windows-64: 2.6.0 + turbo-windows-arm64: 2.6.0 type-check@0.4.0: dependencies: diff --git a/turbo.json b/turbo.json index b2c1ff1..66c1d4d 100644 --- a/turbo.json +++ b/turbo.json @@ -1,6 +1,6 @@ { "$schema": "https://turborepo.org/schema.json", - "globalPassThroughEnv": ["MFE_DEBUG"], + "globalPassThroughEnv": ["MFE_DEBUG", "VC_MICROFRONTENDS_CONFIG_FILE_NAME"], "tasks": { "build": { "dependsOn": ["^build"],