diff --git a/nx-dev/nx-dev/next.config.js b/nx-dev/nx-dev/next.config.js index 30d32d62b884f..ee3d1d568ae0c 100644 --- a/nx-dev/nx-dev/next.config.js +++ b/nx-dev/nx-dev/next.config.js @@ -44,8 +44,8 @@ module.exports = withNx({ // Tutorials rules.push({ - source: '/(l|latest)/(r|react)/tutorial/01-create-application', - destination: '/react-tutorial/01-create-application', + source: '/(l|latest)/(r|react)/tutorial/1-code-generation', + destination: '/react-tutorial/1-code-generation', permanent: true, }); rules.push({ @@ -58,6 +58,15 @@ module.exports = withNx({ destination: '/node-tutorial/1-code-generation', permanent: true, }); + for (const [source, destination] of Object.entries( + redirectRules.tutorialRedirects + )) { + rules.push({ + source, + destination, + permanent: true, + }); + } // Storybook rules.push({ diff --git a/nx-dev/nx-dev/redirect-rules.config.js b/nx-dev/nx-dev/redirect-rules.config.js index c7f857edbeb97..8948b1fe1c97e 100644 --- a/nx-dev/nx-dev/redirect-rules.config.js +++ b/nx-dev/nx-dev/redirect-rules.config.js @@ -321,6 +321,48 @@ const recipesUrls = { '/recipe/adding-to-monorepo': '/recipes/adopting-nx/adding-to-monorepo', }; +/** + * Tutorial Updates + */ +const oldReactTutorialPaths = [ + '/react-tutorial/01-create-application', + '/react-tutorial/02-add-e2e-test', + '/react-tutorial/03-display-todos', + '/react-tutorial/04-connect-to-api', + '/react-tutorial/05-add-node-app', + '/react-tutorial/06-proxy', + '/react-tutorial/07-share-code', + '/react-tutorial/08-create-libs', + '/react-tutorial/09-dep-graph', + '/react-tutorial/10-computation-caching', + '/react-tutorial/11-test-affected-projects', + '/react-tutorial/12-summary', +]; +const reactRedirectDestination = '/react-tutorial/1-code-generation'; +const reactTutorialRedirects = oldReactTutorialPaths.reduce((acc, path) => { + acc[path] = reactRedirectDestination; + return acc; +}, {}); +const oldNodeTutorialPaths = [ + '/node-tutorial/01-create-application', + '/node-tutorial/02-display-todos', + '/node-tutorial/03-share-code', + '/node-tutorial/04-create-libs', + '/node-tutorial/05-dep-graph', + '/node-tutorial/06-computation-caching', + '/node-tutorial/07-test-affected-projects', + '/node-tutorial/08-summary', +]; +const nodeRedirectDestination = '/node-tutorial/1-code-generation'; +const nodeTutorialRedirects = oldNodeTutorialPaths.reduce((acc, path) => { + acc[path] = nodeRedirectDestination; + return acc; +}, {}); +const tutorialRedirects = Object.assign( + reactTutorialRedirects, + nodeTutorialRedirects +); + /** * Public export API */ @@ -331,4 +373,5 @@ module.exports = { overviewUrls, recipesUrls, schemaUrls, + tutorialRedirects, }; diff --git a/nx-dev/nx-dev/redirect-rules.config.spec.js b/nx-dev/nx-dev/redirect-rules.config.spec.js index 396c0f07a148a..a4a05c118a08f 100644 --- a/nx-dev/nx-dev/redirect-rules.config.spec.js +++ b/nx-dev/nx-dev/redirect-rules.config.spec.js @@ -9,6 +9,7 @@ describe('Redirect rules configuration', () => { ...redirectRules.guideUrls, ...redirectRules.overviewUrls, ...redirectRules.schemaUrls, + ...redirectRules.tutorialRedirects, }; for (let k of Object.keys(rules)) { @@ -16,4 +17,48 @@ describe('Redirect rules configuration', () => { } }); }); + + describe('Tutorial redirects', () => { + test('old react tutorial links', () => { + const oldReactUrls = [ + '/react-tutorial/01-create-application', + '/react-tutorial/02-add-e2e-test', + '/react-tutorial/03-display-todos', + '/react-tutorial/04-connect-to-api', + '/react-tutorial/05-add-node-app', + '/react-tutorial/06-proxy', + '/react-tutorial/07-share-code', + '/react-tutorial/08-create-libs', + '/react-tutorial/09-dep-graph', + '/react-tutorial/10-computation-caching', + '/react-tutorial/11-test-affected-projects', + '/react-tutorial/12-summary', + ]; + + for (const url of oldReactUrls) { + expect(redirectRules.tutorialRedirects[url]).toEqual( + '/react-tutorial/1-code-generation' + ); + } + }); + + test('old node tutorial links', () => { + const oldNodeTutorialPaths = [ + '/node-tutorial/01-create-application', + '/node-tutorial/02-display-todos', + '/node-tutorial/03-share-code', + '/node-tutorial/04-create-libs', + '/node-tutorial/05-dep-graph', + '/node-tutorial/06-computation-caching', + '/node-tutorial/07-test-affected-projects', + '/node-tutorial/08-summary', + ]; + + for (const url of oldNodeTutorialPaths) { + expect(redirectRules.tutorialRedirects[url]).toEqual( + '/node-tutorial/1-code-generation' + ); + } + }); + }); });