From 7ba942ca24b4e85ff1eeb447f94150aa97dfc7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8Curda?= Date: Mon, 12 Aug 2024 12:22:22 +0200 Subject: [PATCH] Feat: Example NextJS app with pages router #DS-1393 --- .prettierignore | 3 + examples/next-with-pages-router/.eslintignore | 18 +++ examples/next-with-pages-router/.eslintrc.js | 109 ++++++++++++++++++ examples/next-with-pages-router/.gitignore | 8 ++ examples/next-with-pages-router/README.md | 21 ++++ .../next-with-pages-router/next.config.mjs | 19 +++ examples/next-with-pages-router/package.json | 32 +++++ .../next-with-pages-router/public/favicon.ico | Bin 0 -> 15406 bytes .../next-with-pages-router/src/pages/_app.tsx | 6 + .../src/pages/_document.tsx | 15 +++ .../src/pages/index.tsx | 5 + .../src/styles/globals.scss | 1 + .../tsconfig.eslint.json | 4 + examples/next-with-pages-router/tsconfig.json | 30 +++++ yarn.lock | 21 ++++ 15 files changed, 292 insertions(+) create mode 100644 examples/next-with-pages-router/.eslintignore create mode 100644 examples/next-with-pages-router/.eslintrc.js create mode 100644 examples/next-with-pages-router/.gitignore create mode 100644 examples/next-with-pages-router/README.md create mode 100644 examples/next-with-pages-router/next.config.mjs create mode 100644 examples/next-with-pages-router/package.json create mode 100644 examples/next-with-pages-router/public/favicon.ico create mode 100644 examples/next-with-pages-router/src/pages/_app.tsx create mode 100644 examples/next-with-pages-router/src/pages/_document.tsx create mode 100644 examples/next-with-pages-router/src/pages/index.tsx create mode 100644 examples/next-with-pages-router/src/styles/globals.scss create mode 100644 examples/next-with-pages-router/tsconfig.eslint.json create mode 100644 examples/next-with-pages-router/tsconfig.json diff --git a/.prettierignore b/.prettierignore index 2837f95f1d..66e867740f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -62,3 +62,6 @@ makefile # Shell Scripts *.sh + +# Favicon +*.ico diff --git a/examples/next-with-pages-router/.eslintignore b/examples/next-with-pages-router/.eslintignore new file mode 100644 index 0000000000..cc36ce8bf9 --- /dev/null +++ b/examples/next-with-pages-router/.eslintignore @@ -0,0 +1,18 @@ +# .eslintignore + +node_modules + +# NOTE: +# The following directives are only relevant when linting the whole +# project directory, ie. running `eslint .` ⚠️ + +# If you compile JavaScript into some output folder, exclude it here +dist +build + +# Highly recommended to re-include JavaScript dotfiles to lint them +# (This will cause .eslintrc.js to be linted by ESLint 🤘) +!.*.js + +# Some tools use this pattern for their configuration files. Lint them! +!*.config.js diff --git a/examples/next-with-pages-router/.eslintrc.js b/examples/next-with-pages-router/.eslintrc.js new file mode 100644 index 0000000000..373793ce92 --- /dev/null +++ b/examples/next-with-pages-router/.eslintrc.js @@ -0,0 +1,109 @@ +module.exports = { + extends: [ + '../../.eslintrc', + '@lmc-eu/eslint-config-react', + '@lmc-eu/eslint-config-typescript', + '@lmc-eu/eslint-config-typescript/react', + 'prettier', + 'plugin:prettier/recommended', + '@lmc-eu/eslint-config-jest', + 'plugin:@next/next/recommended', + ], + env: { + jest: true, + }, + plugins: ['promise', 'react', '@typescript-eslint', 'prettier', 'react-refresh'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + project: './tsconfig.eslint.json', + }, + rules: { + // @see: https://github.com/ArnaudBarre/eslint-plugin-react-refresh + 'react-refresh/only-export-components': 'warn', + // @TODO: add to typescript config + 'react/jsx-filename-extension': ['error', { extensions: ['.js', '.jsx', '.ts', '.tsx'] }], + // we like to use props spreading for additional props in this case + 'react/jsx-props-no-spreading': 'off', // Used inside HOC, that is fine. + // prefer arrow function over function expression + 'react/function-component-definition': [ + 'warn', + { namedComponents: 'arrow-function', unnamedComponents: 'arrow-function' }, + ], + // we have missing displayName attribute in our components + // it is good for debugging + // @see: https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/display-name.md + 'react/display-name': 'off', + // ignore UNSTABLE_ prefix in component names + 'react/jsx-pascal-case': [ + 'error', + { + allowAllCaps: true, + ignore: ['UNSTABLE_*'], + }, + ], + // ignore UNSAFE and UNSTABLE_ prefixes + camelcase: [ + 'error', + { + properties: 'never', + ignoreDestructuring: false, + allow: ['^UNSAFE_', '^UNSTABLE_'], + }, + ], + // allow ++ in for loops + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + // allow reassign in properties + 'no-param-reassign': ['warn', { props: false }], + // support monorepos + 'import/no-extraneous-dependencies': [ + 'error', + { + packageDir: ['./', '../../'], + peerDependencies: true, + }, + ], + 'import/order': [ + 'error', + { + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + pathGroups: [ + { + pattern: '**', + group: 'internal', + }, + { + pattern: '..', + group: 'parent', + position: 'after', + }, + ], + pathGroupsExcludedImportTypes: ['builtin'], + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + 'newlines-between': 'never', + }, + ], + // disable double quotes + quotes: ['warn', 'single'], + // use useIsomorphicLayoutEffect instead of useLayoutEffect + // @see: https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a + 'no-restricted-imports': [ + 'error', + // Disabling using of useLayoutEffect from react + { + name: 'react', + importNames: ['useLayoutEffect'], + message: '`useLayoutEffect` causes a warning in SSR. Use `useIsomorphicLayoutEffect`', + }, + ], + // allow empty interfaces with single extends (e.g. interface Foo extends SpiritBar {}) + // interface which extends some other interface is not considered as meaningful interface + // we need this for meeting our component API conventions + // @see: https://typescript-eslint.io/rules/no-empty-interface/ + '@typescript-eslint/no-empty-interface': ['error', { allowSingleExtends: true }], + 'react/react-in-jsx-scope': 'off', + }, +}; diff --git a/examples/next-with-pages-router/.gitignore b/examples/next-with-pages-router/.gitignore new file mode 100644 index 0000000000..d4e98f1435 --- /dev/null +++ b/examples/next-with-pages-router/.gitignore @@ -0,0 +1,8 @@ +# production +/build + +# vercel +.vercel + +# typescript +next-env.d.ts diff --git a/examples/next-with-pages-router/README.md b/examples/next-with-pages-router/README.md new file mode 100644 index 0000000000..50111fda49 --- /dev/null +++ b/examples/next-with-pages-router/README.md @@ -0,0 +1,21 @@ +# Example Next.js application with pages router + +This application is used to demonstrate the configuration of a Next.js application with an App router for use with the Spirit Design System. + +## Getting Started + +First, run the development server: + +```bash +yarn dev +``` + +In case of error `npm error ERR! code ENOWORKSPACES`, please use `npx another telemetry disable`. For more information see [NPM error code ENOWORKSPACES with NextJS][npm-error-enoworkspaces]. + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `src/pages/index.tsx`. The page auto-updates as you edit the file. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +[npm-error-enoworkspaces]: https://github.com/vercel/turborepo/issues/4183 diff --git a/examples/next-with-pages-router/next.config.mjs b/examples/next-with-pages-router/next.config.mjs new file mode 100644 index 0000000000..bc51c896bd --- /dev/null +++ b/examples/next-with-pages-router/next.config.mjs @@ -0,0 +1,19 @@ +import path, { dirname } from 'path'; +import { fileURLToPath } from 'url'; + +const pathDir = dirname(fileURLToPath(import.meta.url)); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + transpilePackages: ['@lmc-eu/spirit-web-react'], + reactStrictMode: true, + sassOptions: { + fiber: false, + includePaths: [ + path.join(pathDir, '../../node_modules'), + path.join(pathDir, '../../node_modules/@lmc-eu/spirit-design-tokens/scss'), + ], + }, +}; + +export default nextConfig; diff --git a/examples/next-with-pages-router/package.json b/examples/next-with-pages-router/package.json new file mode 100644 index 0000000000..46178a6ea1 --- /dev/null +++ b/examples/next-with-pages-router/package.json @@ -0,0 +1,32 @@ +{ + "name": "@almacareer/spirit-example-next-with-pages-router", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@lmc-eu/spirit-design-tokens": "workspace:^", + "@lmc-eu/spirit-web": "workspace:^", + "@lmc-eu/spirit-web-react": "workspace:^", + "next": "14.2.3", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@babel/preset-typescript": "^7.24.7", + "@next/eslint-plugin-next": "^14.2.5", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "typescript": "4.7.4" + }, + "description": "This is a [Next.js](https://nextjs.org/) project with demo Spirit Design System components and pages router", + "main": "index.js", + "author": "Spirit Design System Team" +} diff --git a/examples/next-with-pages-router/public/favicon.ico b/examples/next-with-pages-router/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ef2bb45fd3a5b5b91ec5ccde88a03e2639f8db39 GIT binary patch literal 15406 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 HO@aRanDt`8 literal 0 HcmV?d00001 diff --git a/examples/next-with-pages-router/src/pages/_app.tsx b/examples/next-with-pages-router/src/pages/_app.tsx new file mode 100644 index 0000000000..694638667b --- /dev/null +++ b/examples/next-with-pages-router/src/pages/_app.tsx @@ -0,0 +1,6 @@ +import type { AppProps } from 'next/app'; +import '../styles/globals.scss'; + +const App = ({ Component, pageProps }: AppProps) => ; + +export default App; diff --git a/examples/next-with-pages-router/src/pages/_document.tsx b/examples/next-with-pages-router/src/pages/_document.tsx new file mode 100644 index 0000000000..0711ae3717 --- /dev/null +++ b/examples/next-with-pages-router/src/pages/_document.tsx @@ -0,0 +1,15 @@ +import { Html, Head, Main, NextScript } from 'next/document'; + +const Document = () => { + return ( + + + +
+ + + + ); +}; + +export default Document; diff --git a/examples/next-with-pages-router/src/pages/index.tsx b/examples/next-with-pages-router/src/pages/index.tsx new file mode 100644 index 0000000000..7d4bb4584a --- /dev/null +++ b/examples/next-with-pages-router/src/pages/index.tsx @@ -0,0 +1,5 @@ +import { Heading } from '@lmc-eu/spirit-web-react'; + +const Home = () => Spirit Pages App; + +export default Home; diff --git a/examples/next-with-pages-router/src/styles/globals.scss b/examples/next-with-pages-router/src/styles/globals.scss new file mode 100644 index 0000000000..b2ee58bb42 --- /dev/null +++ b/examples/next-with-pages-router/src/styles/globals.scss @@ -0,0 +1 @@ +@import '@lmc-eu/spirit-web/src/scss'; diff --git a/examples/next-with-pages-router/tsconfig.eslint.json b/examples/next-with-pages-router/tsconfig.eslint.json new file mode 100644 index 0000000000..dc13a26063 --- /dev/null +++ b/examples/next-with-pages-router/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["./", "./.eslintrc.js"] +} diff --git a/examples/next-with-pages-router/tsconfig.json b/examples/next-with-pages-router/tsconfig.json new file mode 100644 index 0000000000..bc009a580c --- /dev/null +++ b/examples/next-with-pages-router/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "useUnknownInCatchVariables": false, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"], + "@lmc-eu/spirit-web-react": ["../../node_modules/@lmc-eu/spirit-web-react/src"], + "@lmc-eu/spirit-design-tokens": ["../../node_modules/@lmc-eu/spirit-design-tokens/src/js"] + }, + "forceConsistentCasingInFileNames": true + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock index 5dc17587b5..0da6957c42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,6 +32,27 @@ __metadata: languageName: unknown linkType: soft +"@almacareer/spirit-example-next-with-pages-router@workspace:examples/next-with-pages-router": + version: 0.0.0-use.local + resolution: "@almacareer/spirit-example-next-with-pages-router@workspace:examples/next-with-pages-router" + dependencies: + "@babel/preset-typescript": "npm:^7.24.7" + "@lmc-eu/spirit-design-tokens": "workspace:^" + "@lmc-eu/spirit-web": "workspace:^" + "@lmc-eu/spirit-web-react": "workspace:^" + "@next/eslint-plugin-next": "npm:^14.2.5" + "@types/node": "npm:^20" + "@types/react": "npm:^18" + "@types/react-dom": "npm:^18" + eslint: "npm:^8" + eslint-config-next: "npm:14.2.5" + next: "npm:14.2.3" + react: "npm:^18" + react-dom: "npm:^18" + typescript: "npm:4.7.4" + languageName: unknown + linkType: soft + "@almacareer/spirit-exporters-variables-scss@workspace:exporters/variables-scss": version: 0.0.0-use.local resolution: "@almacareer/spirit-exporters-variables-scss@workspace:exporters/variables-scss"