From ccd2662b4f59790e0a24b7d1bbac70dbb90ba656 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 26 Jan 2024 09:04:05 -0800 Subject: [PATCH 01/16] feat: add vercel deploy config --- remix.config.js | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/remix.config.js b/remix.config.js index d7e1b63c..b807b5ae 100644 --- a/remix.config.js +++ b/remix.config.js @@ -3,9 +3,7 @@ import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; /** * @type {import('@remix-run/dev').AppConfig} */ -const commonConfig = { - appDirectory: 'app', - serverModuleFormat: 'esm', +const bareConfig = { serverDependenciesToBundle: [ 'remix-i18next', '@remix-validated-form/with-zod', @@ -17,6 +15,15 @@ const commonConfig = { }, }; +/** + * @type {import('@remix-run/dev').AppConfig} + */ +const commonConfig = { + appDirectory: 'app', + serverModuleFormat: 'esm', + ...bareConfig, +}; + /** * @type {import('@remix-run/dev').AppConfig} */ @@ -28,6 +35,13 @@ const cloudflarePagesConfig = { serverMinify: true, ...commonConfig, }; +/** + * @type {import('@remix-run/dev').AppConfig} + */ +const vercelConfig = { + ignoredRouteFiles: ['**/.*'], + ...bareConfig, +}; /** * @type {import('@remix-run/dev').AppConfig} */ @@ -61,11 +75,13 @@ const buildConfig = { }; function selectConfig() { - if (!['development', 'production'].includes(process.env.NODE_ENV)) - throw new Error(`Unknown NODE_ENV: ${process.env.NODE_ENV}`); + const ENV = process.env?.NODE_ENV || process.env?.VERCEL_ENV; + if (!['preview', 'development', 'production'].includes(ENV)) + throw new Error(`Unknown ENV: ${ENV}`); if (process.env.CF_PAGES) return cloudflarePagesConfig; if (process.env.NETLIFY) return netlifyConfig; - if (process.env.NODE_ENV === 'development') return devConfig; + if (process.env.VERCEL) return vercelConfig; + if (ENV === 'development') return devConfig; if (!process.env.CF_PAGES && !process.env.NETLIFY) return buildConfig; throw new Error(`Cannot select config`); } From 36ad2bdd13cac87a1889a6d82682f0982a4b660d Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 13:42:04 -0800 Subject: [PATCH 02/16] fix: add vercel build in packagejson and configuration --- package.json | 1 + remix.config.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52e73554..af85e3ff 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "scripts": { "build:cf": "cross-env CF_PAGES=1 remix build", "build:nf": "cross-env NETLIFY=1 remix build", + "build:vl": "cross-env VERCEL=1 remix build", "build": "remix build", "dev:wrangler": "cross-env CF_PAGES=1 wrangler pages dev ./public", "dev": "remix dev", diff --git a/remix.config.js b/remix.config.js index b807b5ae..c979eb27 100644 --- a/remix.config.js +++ b/remix.config.js @@ -40,7 +40,6 @@ const cloudflarePagesConfig = { */ const vercelConfig = { ignoredRouteFiles: ['**/.*'], - ...bareConfig, }; /** * @type {import('@remix-run/dev').AppConfig} From d309cb0aa2ab1400b86431329fefa5a38e0d2d2e Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 13:50:22 -0800 Subject: [PATCH 03/16] fix: use module.exports for config file --- remix.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/remix.config.js b/remix.config.js index c979eb27..ceca95ec 100644 --- a/remix.config.js +++ b/remix.config.js @@ -85,4 +85,5 @@ function selectConfig() { throw new Error(`Cannot select config`); } -export default selectConfig(); +// export default selectConfig(); +module.exports = selectConfig(); From 5f8add038c30d87ec402cafa58e41b16af3c502a Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 13:54:55 -0800 Subject: [PATCH 04/16] fix: vercel no route convention --- remix.config.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/remix.config.js b/remix.config.js index ceca95ec..14ee2945 100644 --- a/remix.config.js +++ b/remix.config.js @@ -1,4 +1,4 @@ -import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; +// import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; /** * @type {import('@remix-run/dev').AppConfig} @@ -11,7 +11,7 @@ const bareConfig = { tailwind: true, routes(defineRoutes) { // uses the v1 convention, works in v1.15+ and v2 - return createRoutesFromFolders(defineRoutes); + // return createRoutesFromFolders(defineRoutes); }, }; @@ -85,5 +85,4 @@ function selectConfig() { throw new Error(`Cannot select config`); } -// export default selectConfig(); -module.exports = selectConfig(); +export default selectConfig(); From 8e91e0f6820d0620b1b74e23c4ecdef299abfab7 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:03:41 -0800 Subject: [PATCH 05/16] fix: more config tweaks for vercel --- remix.config.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/remix.config.js b/remix.config.js index 14ee2945..64c08886 100644 --- a/remix.config.js +++ b/remix.config.js @@ -1,4 +1,4 @@ -// import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; +import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; /** * @type {import('@remix-run/dev').AppConfig} @@ -9,9 +9,12 @@ const bareConfig = { '@remix-validated-form/with-zod', ], tailwind: true, +}; + +const routesConfig = { routes(defineRoutes) { // uses the v1 convention, works in v1.15+ and v2 - // return createRoutesFromFolders(defineRoutes); + return createRoutesFromFolders(defineRoutes); }, }; @@ -22,6 +25,7 @@ const commonConfig = { appDirectory: 'app', serverModuleFormat: 'esm', ...bareConfig, + ...routesConfig, }; /** @@ -40,6 +44,7 @@ const cloudflarePagesConfig = { */ const vercelConfig = { ignoredRouteFiles: ['**/.*'], + ...bareConfig, }; /** * @type {import('@remix-run/dev').AppConfig} From e60691f4b905ab38ace2387275272e0ec112dccb Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:07:01 -0800 Subject: [PATCH 06/16] fix: one more tweak --- remix.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/remix.config.js b/remix.config.js index 64c08886..5b6e13e4 100644 --- a/remix.config.js +++ b/remix.config.js @@ -6,6 +6,7 @@ import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; const bareConfig = { serverDependenciesToBundle: [ 'remix-i18next', + 'i18next-fs-backend', '@remix-validated-form/with-zod', ], tailwind: true, From d13bb0c411ef00603c48ef8fd89535a72a6da2a7 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:20:37 -0800 Subject: [PATCH 07/16] chore: something is off --- remix.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/remix.config.js b/remix.config.js index 5b6e13e4..64c08886 100644 --- a/remix.config.js +++ b/remix.config.js @@ -6,7 +6,6 @@ import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; const bareConfig = { serverDependenciesToBundle: [ 'remix-i18next', - 'i18next-fs-backend', '@remix-validated-form/with-zod', ], tailwind: true, From ffc60550a1fa1f5fd737c1922725b6a56d919950 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:23:55 -0800 Subject: [PATCH 08/16] fix: use bare import --- app/i18next.server.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/i18next.server.ts b/app/i18next.server.ts index a05e6e58..f88b010c 100644 --- a/app/i18next.server.ts +++ b/app/i18next.server.ts @@ -14,9 +14,7 @@ export async function getPlatformBackend() { if (IS_CF_PAGES) { return HttpBackend; } else { - return await safeRequireNodeDependency('i18next-fs-backend').then( - (module) => module.default, - ); + return await import('i18next-fs-backend').then((module) => module.default); } } From 0b59bd8e54e60f9f8c8f3c316590894dc5bd1ed1 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:27:52 -0800 Subject: [PATCH 09/16] chore: no route convention import --- remix.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/remix.config.js b/remix.config.js index 64c08886..83b1f99d 100644 --- a/remix.config.js +++ b/remix.config.js @@ -1,4 +1,4 @@ -import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; +// import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; /** * @type {import('@remix-run/dev').AppConfig} @@ -14,7 +14,7 @@ const bareConfig = { const routesConfig = { routes(defineRoutes) { // uses the v1 convention, works in v1.15+ and v2 - return createRoutesFromFolders(defineRoutes); + // return createRoutesFromFolders(defineRoutes); }, }; From 2fb6d14d5e016d7a4ff6eefa9edf6a4e76d1f052 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:29:57 -0800 Subject: [PATCH 10/16] chore: add routes config for vercel deploy --- remix.config.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/remix.config.js b/remix.config.js index 83b1f99d..a5e06931 100644 --- a/remix.config.js +++ b/remix.config.js @@ -1,4 +1,4 @@ -// import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; +import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; /** * @type {import('@remix-run/dev').AppConfig} @@ -14,7 +14,7 @@ const bareConfig = { const routesConfig = { routes(defineRoutes) { // uses the v1 convention, works in v1.15+ and v2 - // return createRoutesFromFolders(defineRoutes); + return createRoutesFromFolders(defineRoutes); }, }; @@ -45,6 +45,7 @@ const cloudflarePagesConfig = { const vercelConfig = { ignoredRouteFiles: ['**/.*'], ...bareConfig, + ...routesConfig, }; /** * @type {import('@remix-run/dev').AppConfig} From 7b7fefa7e8ec1cde82f393759ec70611b4fbad0f Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:33:21 -0800 Subject: [PATCH 11/16] chore: use safe require --- app/i18next.server.ts | 4 +++- remix.config.js | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/i18next.server.ts b/app/i18next.server.ts index f88b010c..a05e6e58 100644 --- a/app/i18next.server.ts +++ b/app/i18next.server.ts @@ -14,7 +14,9 @@ export async function getPlatformBackend() { if (IS_CF_PAGES) { return HttpBackend; } else { - return await import('i18next-fs-backend').then((module) => module.default); + return await safeRequireNodeDependency('i18next-fs-backend').then( + (module) => module.default, + ); } } diff --git a/remix.config.js b/remix.config.js index a5e06931..b807b5ae 100644 --- a/remix.config.js +++ b/remix.config.js @@ -9,9 +9,6 @@ const bareConfig = { '@remix-validated-form/with-zod', ], tailwind: true, -}; - -const routesConfig = { routes(defineRoutes) { // uses the v1 convention, works in v1.15+ and v2 return createRoutesFromFolders(defineRoutes); @@ -25,7 +22,6 @@ const commonConfig = { appDirectory: 'app', serverModuleFormat: 'esm', ...bareConfig, - ...routesConfig, }; /** @@ -45,7 +41,6 @@ const cloudflarePagesConfig = { const vercelConfig = { ignoredRouteFiles: ['**/.*'], ...bareConfig, - ...routesConfig, }; /** * @type {import('@remix-run/dev').AppConfig} From 4675a36ef58ea2f878766e24bd95746a566c6671 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Fri, 8 Mar 2024 14:38:34 -0800 Subject: [PATCH 12/16] fix: do not use safe require for vercel deployments --- app/i18next.server.ts | 3 +++ app/utils/platform-adapter.ts | 2 ++ 2 files changed, 5 insertions(+) diff --git a/app/i18next.server.ts b/app/i18next.server.ts index a05e6e58..52762671 100644 --- a/app/i18next.server.ts +++ b/app/i18next.server.ts @@ -4,6 +4,7 @@ import i18n from '~/i18n'; // your i18n configuration file import HttpBackend from 'i18next-http-backend'; import { IS_CF_PAGES, + IS_VERCEL, safeRequireNodeDependency, } from '~/utils/platform-adapter'; import { RemixI18NextOption } from 'remix-i18next/build/server'; @@ -13,6 +14,8 @@ import { findLanguageJSON } from '~/languages.server'; export async function getPlatformBackend() { if (IS_CF_PAGES) { return HttpBackend; + } else if (IS_VERCEL) { + return await import('i18next-fs-backend').then((module) => module.default); } else { return await safeRequireNodeDependency('i18next-fs-backend').then( (module) => module.default, diff --git a/app/utils/platform-adapter.ts b/app/utils/platform-adapter.ts index acb0b7bf..e0a368bb 100644 --- a/app/utils/platform-adapter.ts +++ b/app/utils/platform-adapter.ts @@ -1,5 +1,7 @@ export const IS_CF_PAGES = typeof process === 'undefined'; +export const IS_VERCEL = 'VERCEL' in process.env; + // This hack is to prevent `node` modules/packages being bundled in the // Cloudflare Pages context, which causes an error. export async function safeRequireNodeDependency(module: string) { From 51561dc37420989d240e8f5d7fb975773751efe8 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Tue, 12 Mar 2024 01:07:44 -0700 Subject: [PATCH 13/16] fix: minimal minimal config for vercel --- remix.config.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/remix.config.js b/remix.config.js index b807b5ae..efbff087 100644 --- a/remix.config.js +++ b/remix.config.js @@ -4,11 +4,6 @@ import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; * @type {import('@remix-run/dev').AppConfig} */ const bareConfig = { - serverDependenciesToBundle: [ - 'remix-i18next', - '@remix-validated-form/with-zod', - ], - tailwind: true, routes(defineRoutes) { // uses the v1 convention, works in v1.15+ and v2 return createRoutesFromFolders(defineRoutes); @@ -21,6 +16,11 @@ const bareConfig = { const commonConfig = { appDirectory: 'app', serverModuleFormat: 'esm', + serverDependenciesToBundle: [ + 'remix-i18next', + '@remix-validated-form/with-zod', + ], + tailwind: true, ...bareConfig, }; From 4b5c11da73bba4b49ddf325d0fef84d73f995910 Mon Sep 17 00:00:00 2001 From: dmi3y Date: Tue, 12 Mar 2024 01:12:53 -0700 Subject: [PATCH 14/16] fix: routes not included --- remix.config.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/remix.config.js b/remix.config.js index efbff087..74726d9e 100644 --- a/remix.config.js +++ b/remix.config.js @@ -4,10 +4,10 @@ import { createRoutesFromFolders } from '@remix-run/v1-route-convention'; * @type {import('@remix-run/dev').AppConfig} */ const bareConfig = { - routes(defineRoutes) { - // uses the v1 convention, works in v1.15+ and v2 - return createRoutesFromFolders(defineRoutes); - }, + serverDependenciesToBundle: [ + 'remix-i18next', + '@remix-validated-form/with-zod', + ], }; /** @@ -16,12 +16,12 @@ const bareConfig = { const commonConfig = { appDirectory: 'app', serverModuleFormat: 'esm', - serverDependenciesToBundle: [ - 'remix-i18next', - '@remix-validated-form/with-zod', - ], tailwind: true, ...bareConfig, + routes(defineRoutes) { + // uses the v1 convention, works in v1.15+ and v2 + return createRoutesFromFolders(defineRoutes); + }, }; /** From 5cdac5f1a64ac73efb688ec4218907e7321cfffe Mon Sep 17 00:00:00 2001 From: dmi3y Date: Tue, 12 Mar 2024 01:15:14 -0700 Subject: [PATCH 15/16] fix: maybe keep routes conventions --- remix.config.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/remix.config.js b/remix.config.js index 74726d9e..624af5b1 100644 --- a/remix.config.js +++ b/remix.config.js @@ -8,6 +8,10 @@ const bareConfig = { 'remix-i18next', '@remix-validated-form/with-zod', ], + routes(defineRoutes) { + // uses the v1 convention, works in v1.15+ and v2 + return createRoutesFromFolders(defineRoutes); + }, }; /** @@ -18,10 +22,6 @@ const commonConfig = { serverModuleFormat: 'esm', tailwind: true, ...bareConfig, - routes(defineRoutes) { - // uses the v1 convention, works in v1.15+ and v2 - return createRoutesFromFolders(defineRoutes); - }, }; /** From 7004bba48c029491a687cf3bfcbaba5b190dc1cd Mon Sep 17 00:00:00 2001 From: dmi3y Date: Sat, 23 Mar 2024 00:09:35 -0700 Subject: [PATCH 16/16] fix: better vercel detection --- app/utils/platform-adapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/platform-adapter.ts b/app/utils/platform-adapter.ts index e0a368bb..b721a47d 100644 --- a/app/utils/platform-adapter.ts +++ b/app/utils/platform-adapter.ts @@ -1,6 +1,6 @@ export const IS_CF_PAGES = typeof process === 'undefined'; -export const IS_VERCEL = 'VERCEL' in process.env; +export const IS_VERCEL = typeof process !== 'undefined' && process.env.VERCEL; // This hack is to prevent `node` modules/packages being bundled in the // Cloudflare Pages context, which causes an error.