Setup Log - tobkle/gitcms GitHub Wiki

Documentation of Setup

Next.js with Typescript

2021-01-07

npx create-react-app gitcms
touch tsconfig.js
npm i -D typescript @types/react @types/node
mkdir ./src
tsconfig.json: add baseUrl: './src'
mv styles src/
mv pages src/
rm src/styles/*
src/pages/_app.js > _app.tsx
src/pages/index.js > index.tsx
remove all content create empty functional component with react snippet: rafce IndexPage
git init
adding types to index.tsx and _app.tsx

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": "./src",
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve"
  },
  "exclude": ["node_modules"],
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
}

Eslint, Prettier

2021-01-07

npm i -D 
    "@types/webpack-env": "^1.16.0",
    "@typescript-eslint/eslint-plugin": "^4.12.0",
    "@typescript-eslint/parser": "^4.12.0",
    "eslint": "^7.17.0",
    "eslint-config-prettier": "^7.1.0",
    "eslint-plugin-prettier": "^3.3.1",
    "eslint-plugin-react": "^7.22.0",
    "eslint-plugin-react-hooks": "^4.2.0",
    "husky": "^4.3.7",
    "lint-staged": "^10.5.3",
    "prettier": "^2.2.1",
    "pretty-quick": "^3.1.0",
    "typescript": "^4.1.3"

package.json

  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "eslint --ext .ts,.tsx",
    "lint:fix": "eslint --ext .ts,.tsx --fix"
  },
  "husky": {
    "hooks": {
      "pre-commit": "pretty-quick --staged && npm run lint"
    }
  },

.prettierrc

{
  "semi": true,
  "singleQuote": true
}

.eslintrc.json

{
  "parser": "@typescript-eslint/parser",
  "extends": [
    "plugin:@typescript-eslint/recommended",
    "plugin:react/recommended",
    "plugin:prettier/recommended"
  ],
  "plugins": ["@typescript-eslint", "react", "react-hooks", "prettier"],
  "rules": {
    "react/react-in-jsx-scope": "off",
    "@typescript-eslint/no-explicit-any": "off",
    "react/prop-types": "off",
    "react-hooks/rules-of-hooks": "warn",
    "react-hooks/exhaustive-deps": "warn"
  },
  "globals": {
    "React": "writable"
  }
}

PostCSS Autoprefixer

2021-01-07

npm i -D
    "postcss": "^8.2.3",
    "autoprefixer": "^10.2.0",

package.json

  "browserslist": [
    "> 1%"
  ],

TailwindCSS

2021-07-01

npm i -D tailwindcss@latest
npx tailwindcss init -p --full
npm i -D
    "tailwindcss": "^2.0.2",
    "tailwindcss-children": "^2.1.0",
    "@tailwindcss/aspect-ratio": "^0.2.0",
    "@tailwindcss/forms": "^0.2.1",
    "@tailwindcss/typography": "^0.3.1",
    "@headlessui/react": "^0.2.0"
npm i -D @fullhuman/postcss-purgecss postcss-import postcss-preset-env
npm i -D cssnano

it automatically generates:

  • tailwind.config.js
  • postcss.config.js

tailwind.config.json

  plugins: [
    require('@tailwindcss/forms'),
    require('@tailwindcss/aspect-ratio'),
    require('@tailwindcss/typography'),
    require('tailwindcss-children'),
  ],

src/styles/tailwind.css

/* purgecss start ignore */
@import 'tailwindcss/base';
/* purgecss end ignore */
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

src/pages/_app.js

import 'styles/tailwind.css';

postcss.config.js

const purgecss = [
  '@fullhuman/postcss-purgecss',
  {
    content: ['./components/**/*.js', './pages/**/*.js'],
    defaultExtractor: (content) => content.match(/[\w-/:]+(?<!:)/g) || [],
  },
];

module.exports = {
  plugins: [
    'tailwindcss',
    ...(process.env.NODE_ENV === 'production' ? [purgecss] : []),
    'postcss-preset-env',
  ],
};

Next-Auth Prisma

2021-01-07

  • Login with Github OAuth
  • Login with Google OAuth
  • Login with Email Verification
npm i next-auth nodemailer @prisma/client
npm i -D @prisma/cli

.env

NEXTAUTH_URL=
AUTH_SECRET=
JWT_SECRET=
DATABASE_URL="postgresql:..."
EMAIL_SERVER=
EMAIL_FROM=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_PERSONAL_ACCESS_TOKEN=
GITHUB_USER=
GITHUB_REPO=
GOOGLE_ID=
GOOGLE_SECRET=
CMS_CONTENT_FOLDER=
CMS_CONTENT_TYPE_FILE=

src/pages/_app.tsx src/pages/api/auth/[...next_auth].tsx lib/emails/verification-emails.tsx

npx @prisma/cli init

generates prisma/prisma.schema

Copy the SQL commands from next-auth docu into new PostgreSQL Database and execute

npx @client/cli generate

Writing to Github

2021-01-07

npm i @octokit/rest
npm i slugify
npm i react-query

src/pages/api/github/publish.ts src/components/post.ts src/pages/_app.tsx src/lib/helpers.ts

Create Site

2021-01-08

Schema Enhancements:

  • Site
  • Maintainer

Create a new site and assign owner /api/site/create

List sites for a owner (maintainer) /api/site/index

Get all Repos /api/github/repos

Check if a repo already exists /api/github/repoexists

Show one Site in Admin mode /pages/site/[id].tsx

Form for Site Creation /components/site/create.tsx

List for Sites of User /components/site/list.tsx

Proxy for react-form-hooks /hooks/use-form.ts

Proxy for useSWR /hooks/use-swr.ts

Proxy for useSession /hooks/use-session.ts

Style Lint

2021-01-09

Had some issues with css styling with tailwindcss: .vscode/settings.json

  "scss.validate": false
  "less.validate": false
  "css.validate": false,

npm install --save-dev stylelint stylelint-config-standard npx stylelint "**/*.css" --fix

Storybook

2021-01-09

Storybook relies still on Postcss 7 as Tailwind 2.0 on PostCss 8 had to to use compat 7 mode: Tailwind 2.0 Compatibility Mode

npm uninstall tailwindcss postcss autoprefixer
npm install tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9

Adding...

npx sb init
    "@babel/core": "^7.12.10",
    "@storybook/addon-actions": "^6.1.11",
    "@storybook/addon-essentials": "^6.1.11",
    "@storybook/addon-links": "^6.1.11",
    "@storybook/cli": "^6.1.11",
    "@storybook/react": "^6.1.11",
    "babel-loader": "^8.2.2",
npm i -D css-loader style-loader
rm yarn.lock
npm i

cp tsconfig.json > .storybook adjust the paths with ../ adjust .storybook/main.ts adjust .storybook/preview.ts to import the tailwind.css

Invite

2021-01-11

src/components/sites/invite src/pages/api/site/invite

Post Form updated

2021-01-11

src/components/sites/post src/pages/api/github/publish

Content Type, Heroicons as React Components

2021-01-16 2021-01-17

Added Content Type Definition Added Content Type Fields Definition CRUD content types on Github

src/pages/site/[siteId]/type

src/components/ui/... select link image icon tree src/components/icons/...