diff --git a/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/redwood.toml b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/redwood.toml
new file mode 100644
index 000000000000..286d9315b1ba
--- /dev/null
+++ b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/redwood.toml
@@ -0,0 +1,10 @@
+[web]
+ port = 8910
+ apiProxyPath = "/api/functions"
+
+[api]
+ port = 8911
+ [api.paths]
+ functions = './api/src/functions'
+ graphql = './api/src/graphql'
+ generated = './api/generated'
diff --git a/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/Routes.tsx b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/Routes.tsx
new file mode 100644
index 000000000000..6e95d14b53c8
--- /dev/null
+++ b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/Routes.tsx
@@ -0,0 +1,11 @@
+import { Router, Route } from '@redwoodjs/router'
+
+const Routes = () => {
+ return (
+
+
+
+ )
+}
+
+export default Routes
diff --git a/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/pages/HomePage/HomePage.tsx b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/pages/HomePage/HomePage.tsx
new file mode 100644
index 000000000000..c184a81e8e9b
--- /dev/null
+++ b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/pages/HomePage/HomePage.tsx
@@ -0,0 +1,9 @@
+const HomePage = () => {
+ return (
+
+
HomePage
+
+ )
+}
+
+export default HomePage
diff --git a/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/pages/HomePage/useHomePage.tsx b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/pages/HomePage/useHomePage.tsx
new file mode 100644
index 000000000000..e93ada786af0
--- /dev/null
+++ b/packages/babel-config/src/plugins/__tests__/__fixtures__/route-auto-loader/failure/web/src/pages/HomePage/useHomePage.tsx
@@ -0,0 +1,5 @@
+const useHomePage = () => {
+ return 'useHomePage'
+}
+
+export default useHomePage
diff --git a/packages/babel-config/src/plugins/__tests__/babel-plugin-redwood-routes-auto-loader.test.ts b/packages/babel-config/src/plugins/__tests__/babel-plugin-redwood-routes-auto-loader.test.ts
index 9c3e63601dc2..9c27d7c93800 100644
--- a/packages/babel-config/src/plugins/__tests__/babel-plugin-redwood-routes-auto-loader.test.ts
+++ b/packages/babel-config/src/plugins/__tests__/babel-plugin-redwood-routes-auto-loader.test.ts
@@ -7,11 +7,6 @@ import { getPaths } from '@redwoodjs/project-config'
import babelRoutesAutoLoader from '../babel-plugin-redwood-routes-auto-loader'
-const FIXTURE_PATH = path.resolve(
- __dirname,
- '../../../../../__fixtures__/example-todo-main/'
-)
-
const transform = (filename: string) => {
const code = fs.readFileSync(filename, 'utf-8')
return babel.transform(code, {
@@ -21,7 +16,35 @@ const transform = (filename: string) => {
})
}
+describe('mulitiple files ending in Page.{js,jsx,ts,tsx}', () => {
+ const FAILURE_FIXTURE_PATH = path.resolve(
+ __dirname,
+ './__fixtures__/route-auto-loader/failure'
+ )
+
+ beforeAll(() => {
+ process.env.RWJS_CWD = FAILURE_FIXTURE_PATH
+ })
+
+ afterAll(() => {
+ delete process.env.RWJS_CWD
+ })
+
+ test('Fails with appropriate message', () => {
+ expect(() => {
+ transform(getPaths().web.routes)
+ }).toThrowError(
+ "Unable to find only a single file ending in 'Page.{js,jsx,ts,tsx}' in the follow page directories: 'HomePage"
+ )
+ })
+})
+
describe('page auto loader correctly imports pages', () => {
+ const FIXTURE_PATH = path.resolve(
+ __dirname,
+ '../../../../../__fixtures__/example-todo-main/'
+ )
+
let result: babel.BabelFileResult | null
beforeAll(() => {
diff --git a/packages/babel-config/src/plugins/babel-plugin-redwood-routes-auto-loader.ts b/packages/babel-config/src/plugins/babel-plugin-redwood-routes-auto-loader.ts
index 03ce0e6d3460..7457db2babcc 100644
--- a/packages/babel-config/src/plugins/babel-plugin-redwood-routes-auto-loader.ts
+++ b/packages/babel-config/src/plugins/babel-plugin-redwood-routes-auto-loader.ts
@@ -43,6 +43,26 @@ export default function (
// @NOTE: This var gets mutated inside the visitors
let pages = processPagesDir().map(withRelativeImports)
+ // Currently processPagesDir() can return duplicate entries when there are multiple files
+ // ending in Page in the individual page directories. This will cause an error upstream.
+ // Here we check for duplicates and throw a more helpful error message.
+ const duplicatePageImportNames = new Set()
+ const sortedPageImportNames = pages.map((page) => page.importName).sort()
+ for (let i = 0; i < sortedPageImportNames.length - 1; i++) {
+ if (sortedPageImportNames[i + 1] === sortedPageImportNames[i]) {
+ duplicatePageImportNames.add(sortedPageImportNames[i])
+ }
+ }
+ if (duplicatePageImportNames.size > 0) {
+ throw new Error(
+ `Unable to find only a single file ending in 'Page.{js,jsx,ts,tsx}' in the follow page directories: ${Array.from(
+ duplicatePageImportNames
+ )
+ .map((name) => `'${name}'`)
+ .join(', ')}`
+ )
+ }
+
return {
name: 'babel-plugin-redwood-routes-auto-loader',
visitor: {