From 0992642c08b1f6022b0ddbfd219d2a13d391f047 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Fri, 4 Sep 2020 08:19:12 -0500 Subject: [PATCH] Fix invalid config export errors (#16834) This corrects detecting of invalid page config exports and adds additional test cases for non-invalid config import/exports Closes: https://github.com/vercel/next.js/issues/16775 --- .../build/babel/plugins/next-page-config.ts | 41 +++++++++++++++---- .../page-config/pages/valid/config-import.js | 10 +++++ .../pages/valid/not-config-export.js | 10 +++++ .../pages/valid/not-config-import-export.js | 12 ++++++ 4 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 test/integration/page-config/pages/valid/config-import.js create mode 100644 test/integration/page-config/pages/valid/not-config-export.js create mode 100644 test/integration/page-config/pages/valid/not-config-import-export.js diff --git a/packages/next/build/babel/plugins/next-page-config.ts b/packages/next/build/babel/plugins/next-page-config.ts index 1e836f23dddb37..8f6955a4201b50 100644 --- a/packages/next/build/babel/plugins/next-page-config.ts +++ b/packages/next/build/babel/plugins/next-page-config.ts @@ -82,20 +82,47 @@ export default function nextPageConfig({ exportPath.scope.getBinding(CONFIG_KEY)?.path.node, ].filter(Boolean) - for (const declaration of declarations) { - if ( - !BabelTypes.isIdentifier(declaration.id, { - name: CONFIG_KEY, - }) - ) { - if (BabelTypes.isImportSpecifier(declaration)) { + for (const specifier of exportPath.node.specifiers) { + if (specifier.exported.name === CONFIG_KEY) { + // export {} from 'somewhere' + if (BabelTypes.isStringLiteral(exportPath.node.source)) { throw new Error( errorMessage( exportState, `Expected object but got import` ) ) + // import hello from 'world' + // export { hello as config } + } else if ( + BabelTypes.isIdentifier( + (specifier as BabelTypes.ExportSpecifier).local + ) + ) { + if ( + BabelTypes.isImportSpecifier( + exportPath.scope.getBinding( + (specifier as BabelTypes.ExportSpecifier).local.name + )?.path.node + ) + ) { + throw new Error( + errorMessage( + exportState, + `Expected object but got import` + ) + ) + } } + } + } + + for (const declaration of declarations) { + if ( + !BabelTypes.isIdentifier(declaration.id, { + name: CONFIG_KEY, + }) + ) { continue } diff --git a/test/integration/page-config/pages/valid/config-import.js b/test/integration/page-config/pages/valid/config-import.js new file mode 100644 index 00000000000000..c02078ca909c38 --- /dev/null +++ b/test/integration/page-config/pages/valid/config-import.js @@ -0,0 +1,10 @@ +// eslint-disable-next-line no-unused-vars +import { config } from '../../config' + +export const getServerSideProps = () => { + return { + props: {}, + } +} + +export default () =>

hello world

diff --git a/test/integration/page-config/pages/valid/not-config-export.js b/test/integration/page-config/pages/valid/not-config-export.js new file mode 100644 index 00000000000000..90763cd90d9204 --- /dev/null +++ b/test/integration/page-config/pages/valid/not-config-export.js @@ -0,0 +1,10 @@ +// eslint-disable-next-line no-unused-vars +export { config as notConfig } from '../../config' + +export const getServerSideProps = () => { + return { + props: {}, + } +} + +export default () =>

hello world

diff --git a/test/integration/page-config/pages/valid/not-config-import-export.js b/test/integration/page-config/pages/valid/not-config-import-export.js new file mode 100644 index 00000000000000..6f5c3c13f3bf8a --- /dev/null +++ b/test/integration/page-config/pages/valid/not-config-import-export.js @@ -0,0 +1,12 @@ +// eslint-disable-next-line no-unused-vars +import { config } from '../../config' + +export { config as notConfig } + +export const getServerSideProps = () => { + return { + props: {}, + } +} + +export default () =>

hello world