From a3dcbf647eaec6f5131fdc7662fefb296ae66931 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 1 Apr 2020 00:09:38 -0700 Subject: [PATCH] Add dynamic routes starter --- .gitignore | 4 +- assets-metadata-css-starter/package.json | 2 +- data-fetching-starter/package.json | 2 +- dynamic-routes-starter/.gitignore | 25 +++++++ dynamic-routes-starter/README.md | 30 ++++++++ dynamic-routes-starter/components/Layout.js | 64 ++++++++++++++++++ .../components/Layout.module.css | 25 +++++++ dynamic-routes-starter/lib/posts.js | 35 ++++++++++ dynamic-routes-starter/package.json | 16 +++++ dynamic-routes-starter/pages/_app.js | 5 ++ dynamic-routes-starter/pages/index.js | 50 ++++++++++++++ .../pages/posts/first-post.js | 19 ++++++ dynamic-routes-starter/posts/dps.md | 12 ++++ dynamic-routes-starter/posts/first-post.md | 8 +++ dynamic-routes-starter/public/favicon.ico | Bin 0 -> 15086 bytes .../public/images/profile.jpg | Bin 0 -> 22456 bytes dynamic-routes-starter/styles/global.css | 27 ++++++++ .../styles/utils.module.css | 44 ++++++++++++ navigate-between-pages-starter/package.json | 2 +- 19 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 dynamic-routes-starter/.gitignore create mode 100644 dynamic-routes-starter/README.md create mode 100644 dynamic-routes-starter/components/Layout.js create mode 100644 dynamic-routes-starter/components/Layout.module.css create mode 100644 dynamic-routes-starter/lib/posts.js create mode 100644 dynamic-routes-starter/package.json create mode 100644 dynamic-routes-starter/pages/_app.js create mode 100644 dynamic-routes-starter/pages/index.js create mode 100644 dynamic-routes-starter/pages/posts/first-post.js create mode 100644 dynamic-routes-starter/posts/dps.md create mode 100644 dynamic-routes-starter/posts/first-post.md create mode 100644 dynamic-routes-starter/public/favicon.ico create mode 100644 dynamic-routes-starter/public/images/profile.jpg create mode 100644 dynamic-routes-starter/styles/global.css create mode 100644 dynamic-routes-starter/styles/utils.module.css diff --git a/.gitignore b/.gitignore index c953c3a..35dcb16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .next node_modules *.log -!/yarn.lock -!/package-lock.json \ No newline at end of file +yarn.lock +package-lock.json \ No newline at end of file diff --git a/assets-metadata-css-starter/package.json b/assets-metadata-css-starter/package.json index a3319a9..b83f0be 100644 --- a/assets-metadata-css-starter/package.json +++ b/assets-metadata-css-starter/package.json @@ -8,7 +8,7 @@ "start": "next start" }, "dependencies": { - "next": "9.3.2", + "next": "9.3.3", "react": "16.13.1", "react-dom": "16.13.1" } diff --git a/data-fetching-starter/package.json b/data-fetching-starter/package.json index a3319a9..b83f0be 100644 --- a/data-fetching-starter/package.json +++ b/data-fetching-starter/package.json @@ -8,7 +8,7 @@ "start": "next start" }, "dependencies": { - "next": "9.3.2", + "next": "9.3.3", "react": "16.13.1", "react-dom": "16.13.1" } diff --git a/dynamic-routes-starter/.gitignore b/dynamic-routes-starter/.gitignore new file mode 100644 index 0000000..922d92a --- /dev/null +++ b/dynamic-routes-starter/.gitignore @@ -0,0 +1,25 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +.env* + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/dynamic-routes-starter/README.md b/dynamic-routes-starter/README.md new file mode 100644 index 0000000..ee61611 --- /dev/null +++ b/dynamic-routes-starter/README.md @@ -0,0 +1,30 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/zeit/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/zeit/next.js/) - your feedback and contributions are welcome! + +## Deploy on ZEIT Now + +The easiest way to deploy your Next.js app is to use the [ZEIT Now Platform](https://zeit.co/import?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/dynamic-routes-starter/components/Layout.js b/dynamic-routes-starter/components/Layout.js new file mode 100644 index 0000000..ab023c3 --- /dev/null +++ b/dynamic-routes-starter/components/Layout.js @@ -0,0 +1,64 @@ +import Head from 'next/head' +import styles from './Layout.module.css' +import utilStyles from '../styles/utils.module.css' +import Link from 'next/link' + +const name = 'Shu Uesugi' +export const siteTitle = 'Next.js Sample Website' + +const Page = ({ children, home }) => ( +
+ + + + + +
+ {home ? ( + <> + {name} +

{name}

+ + ) : ( + <> + + + {name} + + +

+ + {name} + +

+ + )} +
+
{children}
+ {!home && ( +
+ + ← Back to home + +
+ )} +
+) + +export default Page diff --git a/dynamic-routes-starter/components/Layout.module.css b/dynamic-routes-starter/components/Layout.module.css new file mode 100644 index 0000000..d0e3a8f --- /dev/null +++ b/dynamic-routes-starter/components/Layout.module.css @@ -0,0 +1,25 @@ +.container { + max-width: 36rem; + padding: 0 1rem; + margin: 3rem auto 6rem; +} + +.header { + display: flex; + flex-direction: column; + align-items: center; +} + +.headerImage { + width: 6rem; + height: 6rem; +} + +.headerHomeImage { + width: 8rem; + height: 8rem; +} + +.backToHome { + margin: 3rem 0 0; +} diff --git a/dynamic-routes-starter/lib/posts.js b/dynamic-routes-starter/lib/posts.js new file mode 100644 index 0000000..cdcc027 --- /dev/null +++ b/dynamic-routes-starter/lib/posts.js @@ -0,0 +1,35 @@ +import fs from 'fs' +import path from 'path' +import matter from 'gray-matter' + +const postsDirectory = path.join(process.cwd(), 'posts') + +export function getSortedPostsData() { + // Get file names under /posts + const fileNames = fs.readdirSync(postsDirectory) + const allPostsData = fileNames.map(fileName => { + // Remove ".md" from file name to get slug + const slug = fileName.replace(/\.md$/, '') + + // Read markdown file as string + const fullPath = path.join(postsDirectory, fileName) + const fileContents = fs.readFileSync(fullPath, 'utf8') + + // Use gray-matter to parse the post metadata section + const { data } = matter(fileContents) + + // Combine the data with the slug + return { + slug, + ...data + } + }) + // Sort posts by date + return allPostsData.sort((a, b) => { + if (a.date < b.date) { + return 1 + } else { + return -1 + } + }) +} diff --git a/dynamic-routes-starter/package.json b/dynamic-routes-starter/package.json new file mode 100644 index 0000000..effb377 --- /dev/null +++ b/dynamic-routes-starter/package.json @@ -0,0 +1,16 @@ +{ + "name": "my-app", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "gray-matter": "^4.0.2", + "next": "9.3.3", + "react": "16.13.1", + "react-dom": "16.13.1" + } +} diff --git a/dynamic-routes-starter/pages/_app.js b/dynamic-routes-starter/pages/_app.js new file mode 100644 index 0000000..4fd261f --- /dev/null +++ b/dynamic-routes-starter/pages/_app.js @@ -0,0 +1,5 @@ +import '../styles/global.css' + +const App = ({ Component, pageProps }) => + +export default App diff --git a/dynamic-routes-starter/pages/index.js b/dynamic-routes-starter/pages/index.js new file mode 100644 index 0000000..f2dd00e --- /dev/null +++ b/dynamic-routes-starter/pages/index.js @@ -0,0 +1,50 @@ +import Head from 'next/head' +import Layout, { siteTitle } from '../components/Layout' +import utilStyles from '../styles/utils.module.css' +import { getSortedPostsData } from '../lib/posts' + +const Home = ({ allPostsData }) => ( + + + {siteTitle} + +
+

+ Hello, I’m Shu. I write code at{' '} + ZEIT, the team behind{' '} + Next.js. You can contact me via{' '} + Twitter or{' '} + email. +

+

+ (This is a sample website - you’ll be building a site like this on{' '} + our Next.js tutorial.) +

+
+
+

Blog

+
    + {allPostsData.map(({ slug, date, title }) => ( +
  • + {title} +
    + {slug} +
    + {date} +
  • + ))} +
+
+
+) + +export async function getStaticProps() { + const allPostsData = getSortedPostsData() + return { + props: { + allPostsData + } + } +} + +export default Home diff --git a/dynamic-routes-starter/pages/posts/first-post.js b/dynamic-routes-starter/pages/posts/first-post.js new file mode 100644 index 0000000..3449b34 --- /dev/null +++ b/dynamic-routes-starter/pages/posts/first-post.js @@ -0,0 +1,19 @@ +import Head from 'next/head' +import Link from 'next/link' +import Layout from '../../components/Layout' + +const FirstPost = () => ( + + + First Post + +

First Post

+

+ + Back to home + +

+
+) + +export default FirstPost diff --git a/dynamic-routes-starter/posts/dps.md b/dynamic-routes-starter/posts/dps.md new file mode 100644 index 0000000..878a33d --- /dev/null +++ b/dynamic-routes-starter/posts/dps.md @@ -0,0 +1,12 @@ +--- +title: "DPS: Develop, Preview, Ship" +date: "2020-01-02" +--- + +[ZEIT Now](https://zeit.co/) supports the **DPS** workflow: **D**evelop, **P**review, and **S**hip: + +- **Develop**: Write code in Next.js. Keep the development server running and take advantage of its hot code reloading feature. +- **Preview**: Every time you push changes to a branch on GitHub / GitLab / BitBucket, ZEIT Now automatically creates a new deployment with a unique URL. +- **Ship**: When you’re ready to ship, merge the pull request to your default branch (e.g. `master`). ZEIT Now will automatically create a production deployment. + +By using the DPS workflow, in addition to doing code reviews, you can do *deployment previews*. Each deployment creates a unique URL that can be shared or used for integration tests. \ No newline at end of file diff --git a/dynamic-routes-starter/posts/first-post.md b/dynamic-routes-starter/posts/first-post.md new file mode 100644 index 0000000..4bd671e --- /dev/null +++ b/dynamic-routes-starter/posts/first-post.md @@ -0,0 +1,8 @@ +--- +title: "First Post" +date: "2020-01-01" +--- + +This is the first post! + +It uses the [Static Generation](https://nextjs.org/docs/basic-features/pages) feature of Next.js. \ No newline at end of file diff --git a/dynamic-routes-starter/public/favicon.ico b/dynamic-routes-starter/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4965832f2c9b0605eaa189b7c7fb11124d24e48a GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/dynamic-routes-starter/styles/global.css b/dynamic-routes-starter/styles/global.css new file mode 100644 index 0000000..9e1b0fb --- /dev/null +++ b/dynamic-routes-starter/styles/global.css @@ -0,0 +1,27 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + line-height: 1.6; + font-size: 18px; +} + +* { + box-sizing: border-box; +} + +a { + color: #0070f3; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +img { + max-width: 100%; + display: block; +} diff --git a/dynamic-routes-starter/styles/utils.module.css b/dynamic-routes-starter/styles/utils.module.css new file mode 100644 index 0000000..b043987 --- /dev/null +++ b/dynamic-routes-starter/styles/utils.module.css @@ -0,0 +1,44 @@ +.heading2Xl { + font-size: 2.5rem; + line-height: 1.2; + font-weight: 800; + letter-spacing: -0.05rem; + margin: 1rem 0; +} + +.headingLg { + font-size: 1.5rem; + line-height: 1.4; + margin: 1rem 0; +} + +.headingMd { + font-size: 1.2rem; + line-height: 1.5; +} + +.borderCircle { + border-radius: 9999px; +} + +.colorInherit { + color: inherit; +} + +.padding1px { + padding-top: 1px; +} + +.list { + list-style: none; + padding: 0; + margin: 0; +} + +.listItem { + margin: 0 0 1.25rem; +} + +.lightText { + color: #999; +} diff --git a/navigate-between-pages-starter/package.json b/navigate-between-pages-starter/package.json index a3319a9..b83f0be 100644 --- a/navigate-between-pages-starter/package.json +++ b/navigate-between-pages-starter/package.json @@ -8,7 +8,7 @@ "start": "next start" }, "dependencies": { - "next": "9.3.2", + "next": "9.3.3", "react": "16.13.1", "react-dom": "16.13.1" }