From cfd5d776c42642e46a9325d81d2da4943898e67e Mon Sep 17 00:00:00 2001 From: Lindsay Levine Date: Tue, 17 Nov 2020 11:15:56 -0500 Subject: [PATCH 1/2] use configurable functionsDir and publishDir throughout NoN --- index.js | 25 ++++++++++++++----- lib/helpers/getNextConfig.js | 12 +++++++++ lib/helpers/getNextDistDir.js | 9 +++---- lib/helpers/setupNetlifyFunctionForPage.js | 10 +++----- lib/helpers/setupStaticFileForPage.js | 10 +++++--- lib/pages/api/setup.js | 7 +++--- lib/pages/getInitialProps/setup.js | 7 +++--- lib/pages/getServerSideProps/setup.js | 7 +++--- lib/pages/getStaticProps/setup.js | 15 ++++++----- lib/pages/getStaticPropsWithFallback/setup.js | 7 +++--- .../getStaticPropsWithRevalidate/setup.js | 7 +++--- lib/pages/withoutProps/setup.js | 11 +++----- lib/steps/copyNextAssets.js | 8 +++--- lib/steps/copyPublicFiles.js | 8 +++--- lib/steps/prepareFolders.js | 11 ++++---- lib/steps/setupPages.js | 16 ++++++------ lib/steps/setupRedirects.js | 6 ++--- 17 files changed, 96 insertions(+), 80 deletions(-) create mode 100644 lib/helpers/getNextConfig.js diff --git a/index.js b/index.js index ac01af1..a796d12 100644 --- a/index.js +++ b/index.js @@ -3,17 +3,30 @@ const copyPublicFiles = require("./lib/steps/copyPublicFiles"); const copyNextAssets = require("./lib/steps/copyNextAssets"); const setupPages = require("./lib/steps/setupPages"); const setupRedirects = require("./lib/steps/setupRedirects"); +const { + NETLIFY_PUBLISH_PATH, + NETLIFY_FUNCTIONS_PATH, +} = require("./lib/config"); -const nextOnNetlify = () => { - prepareFolders(); +/** options param: + * { + * functionsDir: string to path + * publishDir: string to path + * } + */ +const nextOnNetlify = (options = {}) => { + const functionsPath = options.functionsDir || NETLIFY_FUNCTIONS_PATH; + const publishPath = options.pubishDir || NETLIFY_PUBLISH_PATH; - copyPublicFiles(); + prepareFolders({ functionsPath, publishPath }); - copyNextAssets(); + copyPublicFiles(publishPath); - setupPages(); + copyNextAssets(publishPath); - setupRedirects(); + setupPages({ functionsPath, publishPath }); + + setupRedirects(publishPath); }; module.exports = nextOnNetlify; diff --git a/lib/helpers/getNextConfig.js b/lib/helpers/getNextConfig.js new file mode 100644 index 0000000..0bd5f8b --- /dev/null +++ b/lib/helpers/getNextConfig.js @@ -0,0 +1,12 @@ +// Get next.config.js +const { PHASE_PRODUCTION_BUILD } = require("next/constants"); +const { default: loadConfig } = require("next/dist/next-server/server/config"); +const { resolve } = require("path"); + +const getNextConfig = () => { + // Load next.config.js + // Use same code as https://github.com/vercel/next.js/blob/25488f4a03db30cade4d086ba49cd9a50a2ac02e/packages/next/build/index.ts#L114 + return loadConfig(PHASE_PRODUCTION_BUILD, resolve(".")); +}; + +module.exports = getNextConfig; diff --git a/lib/helpers/getNextDistDir.js b/lib/helpers/getNextDistDir.js index 1f37fe4..23215b6 100644 --- a/lib/helpers/getNextDistDir.js +++ b/lib/helpers/getNextDistDir.js @@ -1,12 +1,9 @@ // Get the NextJS distDir specified in next.config.js -const { PHASE_PRODUCTION_BUILD } = require("next/constants"); -const { default: loadConfig } = require("next/dist/next-server/server/config"); -const { resolve, join } = require("path"); +const { join } = require("path"); +const getNextConfig = require("./getNextConfig"); const getNextDistDir = ({ nextConfigPath }) => { - // Load next.config.js - // Use same code as https://github.com/vercel/next.js/blob/25488f4a03db30cade4d086ba49cd9a50a2ac02e/packages/next/build/index.ts#L114 - const nextConfig = loadConfig(PHASE_PRODUCTION_BUILD, resolve(".")); + const nextConfig = getNextConfig(); return join(".", nextConfig.distDir); }; diff --git a/lib/helpers/setupNetlifyFunctionForPage.js b/lib/helpers/setupNetlifyFunctionForPage.js index 5f120fd..86d8c8d 100644 --- a/lib/helpers/setupNetlifyFunctionForPage.js +++ b/lib/helpers/setupNetlifyFunctionForPage.js @@ -1,17 +1,13 @@ const { copySync } = require("fs-extra"); const { join } = require("path"); -const { - NEXT_DIST_DIR, - NETLIFY_FUNCTIONS_PATH, - FUNCTION_TEMPLATE_PATH, -} = require("../config"); +const { NEXT_DIST_DIR, FUNCTION_TEMPLATE_PATH } = require("../config"); const getNetlifyFunctionName = require("./getNetlifyFunctionName"); // Create a Netlify Function for the page with the given file path -const setupNetlifyFunctionForPage = (filePath) => { +const setupNetlifyFunctionForPage = ({ filePath, functionsPath }) => { // Set function name based on file path const functionName = getNetlifyFunctionName(filePath); - const functionDirectory = join(NETLIFY_FUNCTIONS_PATH, functionName); + const functionDirectory = join(functionsPath, functionName); // Copy function template const functionTemplateCopyPath = join( diff --git a/lib/helpers/setupStaticFileForPage.js b/lib/helpers/setupStaticFileForPage.js index ffe36b7..a0f4b12 100644 --- a/lib/helpers/setupStaticFileForPage.js +++ b/lib/helpers/setupStaticFileForPage.js @@ -1,16 +1,20 @@ const { copySync } = require("fs-extra"); const { join } = require("path"); -const { NEXT_DIST_DIR, NETLIFY_PUBLISH_PATH } = require("../config"); +const { NEXT_DIST_DIR } = require("../config"); // Copy the static asset from pages/inputPath to out_publish/outputPath -const setupStaticFileForPage = (inputPath, outputPath = null) => { +const setupStaticFileForPage = ({ + inputPath, + outputPath = null, + publishPath, +}) => { // If no outputPath is set, default to the same as inputPath outputPath = outputPath || inputPath; // Perform copy operation copySync( join(NEXT_DIST_DIR, "serverless", "pages", inputPath), - join(NETLIFY_PUBLISH_PATH, outputPath), + join(publishPath, outputPath), { overwrite: false, errorOnExist: true, diff --git a/lib/pages/api/setup.js b/lib/pages/api/setup.js index e96f583..a9fd4ab 100644 --- a/lib/pages/api/setup.js +++ b/lib/pages/api/setup.js @@ -1,19 +1,18 @@ const { logTitle, logItem } = require("../../helpers/logger"); -const { NETLIFY_FUNCTIONS_PATH } = require("../../config"); const setupNetlifyFunctionForPage = require("../../helpers/setupNetlifyFunctionForPage"); const pages = require("./pages"); // Create a Netlify Function for every API endpoint -const setup = () => { +const setup = (functionsPath) => { logTitle( "💫 Setting up API endpoints as Netlify Functions in", - NETLIFY_FUNCTIONS_PATH + functionsPath ); // Create Netlify Function for every page pages.forEach(({ filePath }) => { logItem(filePath); - setupNetlifyFunctionForPage(filePath); + setupNetlifyFunctionForPage({ filePath, functionsPath }); }); }; diff --git a/lib/pages/getInitialProps/setup.js b/lib/pages/getInitialProps/setup.js index 8a7759b..6f558ff 100644 --- a/lib/pages/getInitialProps/setup.js +++ b/lib/pages/getInitialProps/setup.js @@ -1,19 +1,18 @@ const { logTitle, logItem } = require("../../helpers/logger"); -const { NETLIFY_FUNCTIONS_PATH } = require("../../config"); const setupNetlifyFunctionForPage = require("../../helpers/setupNetlifyFunctionForPage"); const pages = require("./pages"); // Create a Netlify Function for every page with getInitialProps -const setup = () => { +const setup = (functionsPath) => { logTitle( "💫 Setting up pages with getInitialProps as Netlify Functions in", - NETLIFY_FUNCTIONS_PATH + functionsPath ); // Create Netlify Function for every page pages.forEach(({ filePath }) => { logItem(filePath); - setupNetlifyFunctionForPage(filePath); + setupNetlifyFunctionForPage({ filePath, functionsPath }); }); }; diff --git a/lib/pages/getServerSideProps/setup.js b/lib/pages/getServerSideProps/setup.js index cac0a45..490ebbf 100644 --- a/lib/pages/getServerSideProps/setup.js +++ b/lib/pages/getServerSideProps/setup.js @@ -1,19 +1,18 @@ const { logTitle, logItem } = require("../../helpers/logger"); -const { NETLIFY_FUNCTIONS_PATH } = require("../../config"); const setupNetlifyFunctionForPage = require("../../helpers/setupNetlifyFunctionForPage"); const pages = require("./pages"); // Create a Netlify Function for every page with getServerSideProps -const setup = () => { +const setup = (functionsPath) => { logTitle( "💫 Setting up pages with getServerSideProps as Netlify Functions in", - NETLIFY_FUNCTIONS_PATH + functionsPath ); // Create Netlify Function for every page pages.forEach(({ filePath }) => { logItem(filePath); - setupNetlifyFunctionForPage(filePath); + setupNetlifyFunctionForPage({ filePath, functionsPath }); }); }; diff --git a/lib/pages/getStaticProps/setup.js b/lib/pages/getStaticProps/setup.js index 00e07a6..8b7df7a 100644 --- a/lib/pages/getStaticProps/setup.js +++ b/lib/pages/getStaticProps/setup.js @@ -1,6 +1,5 @@ const { join } = require("path"); const { logTitle, logItem } = require("../../helpers/logger"); -const { NETLIFY_PUBLISH_PATH } = require("../../config"); const getFilePathForRoute = require("../../helpers/getFilePathForRoute"); const isRouteWithFallback = require("../../helpers/isRouteWithFallback"); const setupStaticFileForPage = require("../../helpers/setupStaticFileForPage"); @@ -8,10 +7,10 @@ const setupNetlifyFunctionForPage = require("../../helpers/setupNetlifyFunctionF const pages = require("./pages"); // Copy pre-rendered SSG pages -const setup = () => { +const setup = ({ functionsPath, publishPath }) => { logTitle( "🔥 Copying pre-rendered pages with getStaticProps and JSON data to", - NETLIFY_PUBLISH_PATH + publishPath ); // Keep track of the functions that have been set up, so that we do not set up @@ -23,11 +22,15 @@ const setup = () => { // Copy pre-rendered HTML page const htmlPath = getFilePathForRoute(route, "html"); - setupStaticFileForPage(htmlPath); + setupStaticFileForPage({ inputPath: htmlPath, publishPath }); // Copy page's JSON data const jsonPath = getFilePathForRoute(route, "json"); - setupStaticFileForPage(jsonPath, dataRoute); + setupStaticFileForPage({ + inputPath: jsonPath, + outputPath: dataRoute, + publishPath, + }); // // Set up the Netlify function (this is ONLY for preview mode) const relativePath = getFilePathForRoute(srcRoute || route, "js"); @@ -39,7 +42,7 @@ const setup = () => { return; logItem(filePath); - setupNetlifyFunctionForPage(filePath); + setupNetlifyFunctionForPage({ filePath, functionsPath }); filePathsDone.push(filePath); }); }; diff --git a/lib/pages/getStaticPropsWithFallback/setup.js b/lib/pages/getStaticPropsWithFallback/setup.js index 40e1258..4ed8d0c 100644 --- a/lib/pages/getStaticPropsWithFallback/setup.js +++ b/lib/pages/getStaticPropsWithFallback/setup.js @@ -1,16 +1,15 @@ const { join } = require("path"); const { logTitle, logItem } = require("../../helpers/logger"); -const { NETLIFY_FUNCTIONS_PATH } = require("../../config"); const getFilePathForRoute = require("../../helpers/getFilePathForRoute"); const setupNetlifyFunctionForPage = require("../../helpers/setupNetlifyFunctionForPage"); const pages = require("./pages"); // Create a Netlify Function for every page with getStaticProps and fallback -const setup = () => { +const setup = (functionsPath) => { logTitle( "💫 Setting up pages with getStaticProps and fallback: true", "as Netlify Functions in", - NETLIFY_FUNCTIONS_PATH + functionsPath ); // Create Netlify Function for every page @@ -18,7 +17,7 @@ const setup = () => { const relativePath = getFilePathForRoute(route, "js"); const filePath = join("pages", relativePath); logItem(filePath); - setupNetlifyFunctionForPage(filePath); + setupNetlifyFunctionForPage({ filePath, functionsPath }); }); }; diff --git a/lib/pages/getStaticPropsWithRevalidate/setup.js b/lib/pages/getStaticPropsWithRevalidate/setup.js index 29f78ef..764c281 100644 --- a/lib/pages/getStaticPropsWithRevalidate/setup.js +++ b/lib/pages/getStaticPropsWithRevalidate/setup.js @@ -1,16 +1,15 @@ const { join } = require("path"); const { logTitle, logItem } = require("../../helpers/logger"); -const { NETLIFY_FUNCTIONS_PATH } = require("../../config"); const getFilePathForRoute = require("../../helpers/getFilePathForRoute"); const setupNetlifyFunctionForPage = require("../../helpers/setupNetlifyFunctionForPage"); const pages = require("./pages"); // Create a Netlify Function for every page with getStaticProps and revalidate -const setup = () => { +const setup = (functionsPath) => { logTitle( "💫 Setting up pages with getStaticProps and revalidation interval", "as Netlify Functions in", - NETLIFY_FUNCTIONS_PATH + functionsPath ); // Keep track of the functions that have been set up, so that we do not set up @@ -27,7 +26,7 @@ const setup = () => { // Set up the function logItem(filePath); - setupNetlifyFunctionForPage(filePath); + setupNetlifyFunctionForPage({ filePath, functionsPath }); filePathsDone.push(filePath); }); }; diff --git a/lib/pages/withoutProps/setup.js b/lib/pages/withoutProps/setup.js index f62ea9c..693c89c 100644 --- a/lib/pages/withoutProps/setup.js +++ b/lib/pages/withoutProps/setup.js @@ -1,17 +1,14 @@ const { join, relative } = require("path"); const { copySync } = require("fs-extra"); const { logTitle, logItem } = require("../../helpers/logger"); -const { NEXT_DIST_DIR, NETLIFY_PUBLISH_PATH } = require("../../config"); +const { NEXT_DIST_DIR } = require("../../config"); const setupStaticFileForPage = require("../../helpers/setupStaticFileForPage"); const pages = require("./pages"); // Identify all pages that have been pre-rendered and copy each one to the // Netlify publish directory. -const setup = () => { - logTitle( - "🔥 Copying pre-rendered pages without props to", - NETLIFY_PUBLISH_PATH - ); +const setup = (publishPath) => { + logTitle("🔥 Copying pre-rendered pages without props to", publishPath); // Copy each page to the Netlify publish directory pages.forEach(({ filePath }) => { @@ -19,7 +16,7 @@ const setup = () => { // The path to the file, relative to the pages directory const relativePath = relative("pages", filePath); - setupStaticFileForPage(relativePath); + setupStaticFileForPage({ inputPath: relativePath, publishPath }); }); }; diff --git a/lib/steps/copyNextAssets.js b/lib/steps/copyNextAssets.js index 6c8a191..fbd1073 100644 --- a/lib/steps/copyNextAssets.js +++ b/lib/steps/copyNextAssets.js @@ -1,15 +1,15 @@ const { join } = require("path"); const { copySync } = require("fs-extra"); const { logTitle } = require("../helpers/logger"); -const { NETLIFY_PUBLISH_PATH, NEXT_DIST_DIR } = require("../config"); +const { NEXT_DIST_DIR } = require("../config"); // Copy the NextJS' static assets from NextJS distDir to Netlify publish folder. // These need to be available for NextJS to work. -const copyNextAssets = () => { - logTitle("💼 Copying static NextJS assets to", NETLIFY_PUBLISH_PATH); +const copyNextAssets = (publishPath) => { + logTitle("💼 Copying static NextJS assets to", publishPath); copySync( join(NEXT_DIST_DIR, "static"), - join(NETLIFY_PUBLISH_PATH, "_next", "static"), + join(publishPath, "_next", "static"), { overwrite: false, errorOnExist: true, diff --git a/lib/steps/copyPublicFiles.js b/lib/steps/copyPublicFiles.js index 8ae99cf..07f10ae 100644 --- a/lib/steps/copyPublicFiles.js +++ b/lib/steps/copyPublicFiles.js @@ -1,15 +1,15 @@ const { existsSync, copySync } = require("fs-extra"); const { logTitle } = require("../helpers/logger"); -const { NETLIFY_PUBLISH_PATH, PUBLIC_PATH } = require("../config"); +const { PUBLIC_PATH } = require("../config"); // Copy files from public folder to Netlify publish folder -const copyPublicFiles = () => { +const copyPublicFiles = (publishPath) => { // Abort if no public/ folder if (!existsSync(PUBLIC_PATH)) return; // Perform copy operation - logTitle("🌍️ Copying", PUBLIC_PATH, "folder to", NETLIFY_PUBLISH_PATH); - copySync(PUBLIC_PATH, NETLIFY_PUBLISH_PATH); + logTitle("🌍️ Copying", PUBLIC_PATH, "folder to", publishPath); + copySync(PUBLIC_PATH, publishPath); }; module.exports = copyPublicFiles; diff --git a/lib/steps/prepareFolders.js b/lib/steps/prepareFolders.js index 2a57044..4cd75ce 100644 --- a/lib/steps/prepareFolders.js +++ b/lib/steps/prepareFolders.js @@ -1,16 +1,15 @@ const { emptyDirSync } = require("fs-extra"); const { logTitle, log } = require("../helpers/logger"); -const { NETLIFY_PUBLISH_PATH, NETLIFY_FUNCTIONS_PATH } = require("../config"); // Empty existing publish and functions folders -const prepareFolders = () => { +const prepareFolders = ({ functionsPath, publishPath }) => { logTitle("🚀 Next on Netlify 🚀"); - log(" ", "Functions directory:", NETLIFY_FUNCTIONS_PATH); - log(" ", "Publish directory: ", NETLIFY_PUBLISH_PATH); + log(" ", "Functions directory: ", functionsPath); + log(" ", "Publish directory: ", publishPath); log(" ", "Make sure these are set in your netlify.toml file."); - emptyDirSync(NETLIFY_PUBLISH_PATH); - emptyDirSync(NETLIFY_FUNCTIONS_PATH); + emptyDirSync(publishPath); + emptyDirSync(functionsPath); }; module.exports = prepareFolders; diff --git a/lib/steps/setupPages.js b/lib/steps/setupPages.js index 179f64f..2f521a8 100644 --- a/lib/steps/setupPages.js +++ b/lib/steps/setupPages.js @@ -1,12 +1,12 @@ // Set up all our NextJS pages according to the recipes defined in pages/ -const setupPages = () => { - require("../pages/api/setup")(); - require("../pages/getInitialProps/setup")(); - require("../pages/getServerSideProps/setup")(); - require("../pages/getStaticProps/setup")(); - require("../pages/getStaticPropsWithFallback/setup")(); - require("../pages/getStaticPropsWithRevalidate/setup")(); - require("../pages/withoutProps/setup")(); +const setupPages = ({ functionsPath, publishPath }) => { + require("../pages/api/setup")(functionsPath); + require("../pages/getInitialProps/setup")(functionsPath); + require("../pages/getServerSideProps/setup")(functionsPath); + require("../pages/getStaticProps/setup")({ functionsPath, publishPath }); + require("../pages/getStaticPropsWithFallback/setup")(functionsPath); + require("../pages/getStaticPropsWithRevalidate/setup")(functionsPath); + require("../pages/withoutProps/setup")(publishPath); }; module.exports = setupPages; diff --git a/lib/steps/setupRedirects.js b/lib/steps/setupRedirects.js index e382a52..3ab124e 100644 --- a/lib/steps/setupRedirects.js +++ b/lib/steps/setupRedirects.js @@ -1,14 +1,14 @@ const { join } = require("path"); const { existsSync, readFileSync, writeFileSync } = require("fs-extra"); const { logTitle, logItem } = require("../helpers/logger"); -const { NETLIFY_PUBLISH_PATH, CUSTOM_REDIRECTS_PATH } = require("../config"); +const { CUSTOM_REDIRECTS_PATH } = require("../config"); const getSortedRoutes = require("../helpers/getSortedRoutes"); const getNetlifyRoutes = require("../helpers/getNetlifyRoutes"); const isRootCatchAllRedirect = require("../helpers/isRootCatchAllRedirect"); // Setup _redirects file that routes all requests to the appropriate location, // such as one of the Netlify functions or one of the static files. -const setupRedirects = () => { +const setupRedirects = (publishPath) => { logTitle("🔀 Setting up redirects"); // Collect custom redirects defined by the user @@ -74,7 +74,7 @@ const setupRedirects = () => { } // Write redirects to _redirects file - writeFileSync(join(NETLIFY_PUBLISH_PATH, "_redirects"), redirects.join("\n")); + writeFileSync(join(publishPath, "_redirects"), redirects.join("\n")); }; module.exports = setupRedirects; From bffaecf43b42e85ab727a46a0164affe048e0869 Mon Sep 17 00:00:00 2001 From: ehmicky Date: Tue, 17 Nov 2020 10:12:47 -0800 Subject: [PATCH 2/2] Update index.js --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index a796d12..146c64e 100644 --- a/index.js +++ b/index.js @@ -16,7 +16,7 @@ const { */ const nextOnNetlify = (options = {}) => { const functionsPath = options.functionsDir || NETLIFY_FUNCTIONS_PATH; - const publishPath = options.pubishDir || NETLIFY_PUBLISH_PATH; + const publishPath = options.publishDir || NETLIFY_PUBLISH_PATH; prepareFolders({ functionsPath, publishPath });