master 3c883daad161 cached
24 files
17.9 KB
5.7k tokens
10 symbols
1 requests
Download .txt
Repository: Code-Pop/authentication_course
Branch: master
Commit: 3c883daad161
Files: 24
Total size: 17.9 KB

Directory structure:
gitextract_ix0n5d8h/

├── .browserslistrc
├── .eslintrc.js
├── .gitignore
├── README.md
├── _server.js
├── babel.config.js
├── db/
│   └── events.json
├── package.json
├── postcss.config.js
├── public/
│   └── index.html
├── server.js
├── src/
│   ├── App.vue
│   ├── assets/
│   │   └── styles/
│   │       └── global.scss
│   ├── components/
│   │   ├── AppNav.vue
│   │   ├── EventCard.vue
│   │   ├── LoginUser.vue
│   │   └── RegisterUser.vue
│   ├── main.js
│   ├── router.js
│   ├── store.js
│   └── views/
│       ├── Authenticate.vue
│       ├── Dashboard.vue
│       └── Home.vue
└── vue.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .browserslistrc
================================================
> 1%
last 2 versions
not ie <= 8


================================================
FILE: .eslintrc.js
================================================
module.exports = {
  root: true,
  env: {
    node: true
  },
  extends: ["plugin:vue/recommended", "standard"],
  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "error" : "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off",
    "vue/max-attributes-per-line": ["error", {
      "singleline": 4,
      "multiline": {
        "max": 1,
        "allowFirstLine": false
      }
    }]
  },
  parserOptions: {
    parser: "babel-eslint"
  }
};


================================================
FILE: .gitignore
================================================
.DS_Store
node_modules
/dist

# local env files
.env.local
.env.*.local
db/user.json

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*


================================================
FILE: README.md
================================================
# authentication_course

## Project setup
```
npm install
```

### Compiles and hot-reloads for development
```
npm run serve
```
### Same as above and start backend server
```
npm run start
```
### Compiles and minifies for production
```
npm run build
```

### Run your tests
```
npm run test
```

### Lints and fixes files
```
npm run lint
```

### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).


================================================
FILE: _server.js
================================================
var express = require('express')
var jwt = require('jsonwebtoken')
var cors = require('cors')
var bodyParser = require('body-parser')
var fs = require('fs')
var events = require('./db/events.json')

const app = express()

app.use(cors())
app.use(bodyParser.json())

app.get('/', (req, res) => {
  res.json({
    message: 'Welcome to the API.'
  })
})

app.get('/dashboard', verifyToken, (req, res) => {
  jwt.verify(req.token, 'the_secret_key', err => {
    if (err) {
      res.sendStatus(401)
    } else {
      res.json({
        events: events
      })
    }
  })
})

app.post('/register', (req, res) => {
  if (req.body) {
    const user = {
      name: req.body.name,
      email: req.body.email,
      password: req.body.password
      // You'll want to encrypt the password in a live app
    }

    var data = JSON.stringify(user, null, 2)

    fs.writeFile('db/user.json', data, err => {
      if (err) {
        console.log(err)
      } else {
        console.log('Added user to user.json')
      }
    })
    // The secret key should be an evironment variable in a live app
    const token = jwt.sign({ user }, 'the_secret_key')
    res.json({
      token,
      email: user.email,
      name: user.name
    })
  } else {
    res.sendStatus(401)
  }
})

app.post('/login', (req, res) => {
  var userDB = fs.readFileSync('./db/user.json')
  var userInfo = JSON.parse(userDB)
  if (
    req.body &&
    req.body.email === userInfo.email &&
    req.body.password === userInfo.password
  ) {
    // The secret key should be an environment variable in a live app
    const token = jwt.sign({ userInfo }, 'the_secret_key')
    res.json({
      token,
      email: userInfo.email,
      name: userInfo.name
    })
  } else {
    res.sendStatus(401)
  }
})

function verifyToken (req, res, next) {
  const bearerHeader = req.headers['authorization']

  if (typeof bearerHeader !== 'undefined') {
    const bearer = bearerHeader.split(' ')
    const bearerToken = bearer[1]
    req.token = bearerToken
    next()
  } else {
    res.sendStatus(401)
  }
}

app.listen(3000, () => {
  console.log('Server started on port 3000')
})


================================================
FILE: babel.config.js
================================================
module.exports = {
  presets: ["@vue/app"]
};


================================================
FILE: db/events.json
================================================
{
  "events": [
    {
      "id": "1234",
      "title": "Puppy Parade",
      "time": "12:00",
      "date": "Feb 22, 2022"
    },
    {
      "id": "1584",
      "title": "Cat Cabaret",
      "time": "9:00",
      "date": "March 4, 2022"
    },
    {
      "id": "2794",
      "title": "Doggy Day",
      "time": "1:00",
      "date": "June 12, 2022"
    },
    {
      "id": "4619",
      "title": "Feline Frenzy",
      "time": "8:00",
      "date": "July 28, 2022"
    }
  ]
}


================================================
FILE: package.json
================================================
{
  "name": "authentication_course",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "start": "nodemon server.js & vue-cli-service serve"
  },
  "dependencies": {
    "axios": "^0.18.0",
    "body-parser": "^1.18.3",
    "cors": "^2.8.5",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.16.0",
    "express": "^4.16.4",
    "jsonwebtoken": "^8.4.0",
    "nodemon": "^1.18.10",
    "sqlite3": "^4.0.6",
    "vue": "^2.5.22",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.4.0",
    "@vue/cli-plugin-eslint": "^3.4.0",
    "@vue/cli-service": "^3.4.0",
    "@vue/eslint-config-prettier": "^4.0.1",
    "babel-eslint": "^10.0.1",
    "eslint": "^5.8.0",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-promise": "^4.0.1",
    "eslint-plugin-standard": "^4.0.0",
    "eslint-plugin-vue": "^5.0.0",
    "node-sass": "^4.11.0",
    "sass-loader": "^7.1.0",
    "vue-template-compiler": "^2.5.21"
  }
}


================================================
FILE: postcss.config.js
================================================
module.exports = {
  plugins: {
    autoprefixer: {}
  }
};


================================================
FILE: public/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>authentication_course</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but authentication_course doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>


================================================
FILE: server.js
================================================
const express = require('express')
const jwt = require('jsonwebtoken')
const cors = require('cors')
const bodyParser = require('body-parser')
const fs = require('fs')
const events = require('./db/events.json')

const app = express()

app.use(cors())
app.use(bodyParser.json())

app.get('/', (req, res) => {
  res.json({
    message: 'Welcome to the API.'
  })
})

app.get('/dashboard', verifyToken, (req, res) => {
  jwt.verify(req.token, 'the_secret_key', err => {
    if (err) {
      res.sendStatus(401)
    } else {
      res.json({
        events: events
      })
    }
  })
})

app.post('/register', (req, res) => {
  if (req.body) {
    const user = {
      name: req.body.name,
      email: req.body.email,
      password: req.body.password
      // In a production app, you'll want to encrypt the password
    }

    const data = JSON.stringify(user, null, 2)
    var dbUserEmail = require('./db/user.json').email

    if (dbUserEmail === req.body.email) {
      res.sendStatus(400)
    } else {
      fs.writeFile('./db/user.json', data, err => {
        if (err) {
          console.log(err + data)
        } else {
          const token = jwt.sign({ user }, 'the_secret_key')
          // In a production app, you'll want the secret key to be an environment variable
          res.json({
            token,
            email: user.email,
            name: user.name
          })
        }
      })
    }
  } else {
    res.sendStatus(400)
  }
})

app.post('/login', (req, res) => {
  const userDB = fs.readFileSync('./db/user.json')
  const userInfo = JSON.parse(userDB)
  if (
    req.body &&
    req.body.email === userInfo.email &&
    req.body.password === userInfo.password
  ) {
    const token = jwt.sign({ userInfo }, 'the_secret_key')
    // In a production app, you'll want the secret key to be an environment variable
    res.json({
      token,
      email: userInfo.email,
      name: userInfo.name
    })
  } else {
    res.sendStatus(400)
  }
})

// MIDDLEWARE
function verifyToken (req, res, next) {
  const bearerHeader = req.headers['authorization']

  if (typeof bearerHeader !== 'undefined') {
    const bearer = bearerHeader.split(' ')
    const bearerToken = bearer[1]
    req.token = bearerToken
    next()
  } else {
    res.sendStatus(401)
  }
}

app.listen(3000, () => {
  console.log('Server started on port 3000')
})


================================================
FILE: src/App.vue
================================================
<template>
  <div id="app">
    <app-nav />
    <router-view class="page" />
  </div>
</template>

<script>
import AppNav from './components/AppNav'

export default {
  components: { AppNav }
}
</script>

<style lang="scss">
@import './assets/styles/global.scss';
.page {
  display: flex;
  justify-content: center;
  flex-direction: column;
  align-items: center;
  min-height: calc(100vh - 56px);
}
</style>


================================================
FILE: src/assets/styles/global.scss
================================================
body {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  padding: 0em;
  margin: 0em;
}

a:visited {
  color: #2c3e50;
}

.button,
button {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 5em;
  height: 2em;
  margin: 0.5em;
  border-radius: 5px;
  background: linear-gradient(to right, #16c0b0, #84cf6a);
  font-size: 1em;
  color: white;
  border: none;
  outline: none;
}

form {
  display: flex;
  align-items: center;
  flex-direction: column;
  width: 15em;
  margin-bottom: 2em;

  p {
    color: red;
  }
}

input {
  display: block;
  box-sizing: border-box;
  width: 100%;
  height: 2.6em;
  padding: 0.5em;
  margin-bottom: 1em;
  font: 1em 'Avenir', Helvetica, sans-serif;
}

h1 {
  margin-top: 0;
}

================================================
FILE: src/components/AppNav.vue
================================================
<template>
  <div id="nav">
    <router-link to="/">
Home
</router-link>

    <template v-if="user">
      <router-link to="dashboard">
Dashboard
</router-link>

      <span class="nav-welcome">Hello, {{ user.name }}.</span>

      <button type="button" class="logoutButton" @click="logout">
Log out
</button>
    </template>

    <template v-else>
      <router-link to="authenticate" class="button">
Login
</router-link>
    </template>
  </div>
</template>

<script>
export default {
  computed: {
    user () {
      return this.$store.state.user
    }
  },
  methods: {
    logout () {
      this.$store.dispatch('logout')
    }
  }
}
</script>

<style lang="scss" scoped>
#nav {
  display: flex;
  align-items: center;
  min-height: 50px;
  padding: 0.2em 1em;
  background: linear-gradient(to right, #16c0b0, #84cf6a);
}

.nav-welcome {
  margin-left: auto;
  margin-right: 1rem;
  color: white;
}

a {
  font-weight: bold;
  color: #2c3e50;
  margin: auto 0.8em auto 0.4em;
  text-decoration: none;
  border-top: 2px solid transparent;
  border-bottom: 2px solid transparent;
}

.router-link-exact-active {
  color: white;
  border-bottom: 2px solid #fff;
}

button,
.button {
  margin-left: auto;
  background: white;
  text-decoration: none;
  color: #2c3e50;

  &.router-link-active {
    color: #2c3e50;
  }
}

.logoutButton {
  cursor: pointer;
}

.nav-welcome + button {
  margin-left: 0;
}
</style>


================================================
FILE: src/components/EventCard.vue
================================================
<template>
  <div class="event-card">
    <span>@{{ event.time }} on {{ event.date }}</span>
    <h4>{{ event.title }}</h4>
  </div>
</template>

<script>
export default {
  name: 'EventCard',
  props: {
    event: {
      type: Object,
      default: () => ({})
    }
  }
}
</script>

<style scoped>
.event-card {
  width: 13em;
  margin: 1em auto 1em auto;
  padding: 1em;
  border: solid 1px #2c3e50;
  cursor: pointer;
  transition: all 0.2s linear;
}
.event-card:hover {
  transform: scale(1.01);
  box-shadow: 0 3px 12px 0 rgba(0, 0, 0, 0.2), 0 1px 15px 0 rgba(0, 0, 0, 0.19);
}
.event-card h4 {
  font-size: 1.4em;
  margin-top: 0.5em;
  margin-bottom: 0.3em;
}
</style>


================================================
FILE: src/components/LoginUser.vue
================================================
<template>
  <form @submit.prevent="login">
    <label for="email">
      Email:
    </label>
    <input v-model="email" type="email" name="email" value>
    <label for="password">
      Password:
    </label>
    <input v-model="password" type="password" name value>
    <p v-if="status === 400">
      Invalid login info.
    </p>
    <button type="submit" name="button">
      Login
    </button>
  </form>
</template>

<script>
export default {
  name: 'LoginUser',
  data () {
    return {
      email: '',
      password: '',
      status: null
    }
  },
  methods: {
    login () {
      this.$store
        .dispatch('login', {
          email: this.email,
          password: this.password
        })
        .then(() => { this.$router.push({ name: 'dashboard' }) })
        .catch(err => { this.status = err.response.status })
    }
  }
}
</script>


================================================
FILE: src/components/RegisterUser.vue
================================================
<template>
  <div>
    <form @submit.prevent="register">
      <label for="name">
        Name:
      </label>
      <input v-model="name" type="text" name="name" value>
      <label for="email">
        Email:
      </label>
      <input v-model="email" type="email" name="email" value>

      <label for="password">
        Password:
      </label>
      <input v-model="password" type="password" name value>
      <p v-if="status === 400">
        Please enter different info.
      </p>

      <button type="submit" name="button">
        Register
      </button>
    </form>
  </div>
</template>

<script>
export default {
  name: 'RegisterUser',
  data () {
    return {
      name: '',
      email: '',
      password: '',
      status: null
    }
  },
  methods: {
    register () {
      this.$store
        .dispatch('register', {
          name: this.name,
          email: this.email,
          password: this.password
        })
        .then(() => { this.$router.push({ name: 'dashboard' }) })
        .catch(err => { this.status = err.response.status })
    }
  }
}
</script>


================================================
FILE: src/main.js
================================================
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import axios from 'axios'

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App),
  created() {
    const userString = localStorage.getItem('user')
    if (userString) {
      const userData = JSON.parse(userString)
      this.$store.commit('SET_USER_DATA', userData)
    }
    //
    axios.interceptors.response.use(
      response => response,
      error => {
        console.log(error.response)
        if (error.response.status === 401) {
          this.$router.push('/')
          this.$store.dispatch('logout')
        }
        return Promise.reject(error)
      }
    )
  }
}).$mount('#app')


================================================
FILE: src/router.js
================================================
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import Dashboard from './views/Dashboard.vue'
import Authenticate from './views/Authenticate.vue'

Vue.use(Router)

const router = new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/dashboard',
      name: 'dashboard',
      component: Dashboard
    },
    {
      path: '/authenticate',
      name: 'authenticate',
      component: Authenticate
    }
  ]
})

router.beforeEach((to, from, next) => {
  // redirect to login page if user is not logged in and trying to access a restricted page
  const publicPages = ['/authenticate', '/']
  const authRequired = !publicPages.includes(to.path)
  const loggedIn = localStorage.getItem('user')

  if (authRequired && !loggedIn) {
    return next('/authenticate')
  }

  next()
})

export default router


================================================
FILE: src/store.js
================================================
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null,
    isNewUser: true
  },
  mutations: {
    SET_USER_DATA (state, userData) {
      localStorage.setItem('user', JSON.stringify(userData))
      axios.defaults.headers.common['Authorization'] = `Bearer ${
        userData.token
      }`
      state.user = userData
    },
    LOGOUT () {
      localStorage.removeItem('user')
      location.reload()
    },
    IS_NEW_USER (state, isNewUser) {
      state.isNewUser = isNewUser
    }
  },
  actions: {
    register ({ commit }, credentials) {
      return axios
        .post('//localhost:3000/register', credentials)
        .then(({ data }) => {
          commit('SET_USER_DATA', data)
        })
    },
    login ({ commit }, credentials) {
      return axios
        .post('//localhost:3000/login', credentials)
        .then(({ data }) => {
          commit('SET_USER_DATA', data)
        })
    },
    logout ({ commit }) {
      commit('LOGOUT')
    },
    isNewUser ({ commit }, isNewUser) {
      commit('IS_NEW_USER', isNewUser)
    }
  }
})


================================================
FILE: src/views/Authenticate.vue
================================================
<template>
  <div>
    <component :is="loginOrRegister" />
    <a
      v-show="isNewUser"
      class="auth-link"
      @click="toggleComponent"
    >Don't have an account? Create one.</a>
    <a
      v-show="!isNewUser"
      class="auth-link"
      @click="toggleComponent"
    >Already have an account? Login.</a>
  </div>
</template>

<script>
import RegisterUser from '../components/RegisterUser'
import LoginUser from '../components/LoginUser'

export default {
  components: { RegisterUser, LoginUser },
  computed: {
    isNewUser () {
      return this.$store.state.isNewUser
    },
    loginOrRegister () {
      return this.isNewUser ? 'LoginUser' : 'RegisterUser'
    }
  },
  methods: {
    toggleComponent () {
      this.$store.dispatch('isNewUser', !this.isNewUser)
    }
  }
}
</script>

<style lang="scss" scoped>
.auth-link {
  font-size: 0.8em;
  text-decoration: underline;
  color: #2c3e50;
  cursor: pointer;
}
</style>


================================================
FILE: src/views/Dashboard.vue
================================================
<template>
  <div>
    <h1>Dashboard</h1>
    <template v-if="events !== 'Loading events...'">
      <EventCard v-for="event in events" :key="event.id" :event="event" />
    </template>
  </div>
</template>

<script>
import axios from 'axios'
import EventCard from '../components/EventCard'

export default {
  components: { EventCard },
  data () {
    return { events: 'Loading events...' }
  },
  created () {
    axios.get('//localhost:3000/dashboard').then(({ data }) => {
      this.events = data.events.events
    })
  }
}
</script>


================================================
FILE: src/views/Home.vue
================================================
<template>
  <div class="home">
    <h1>Welcome to the App!</h1>
    <template v-if="!this.$store.state.user">
      <div>
        To use the app, you'll need to
        <router-link to="authenticate" @click.native="isNew(false)">
          Login
        </router-link>
        or
        <router-link to="authenticate" @click.native="isNew(true)">
          Register
        </router-link>
      </div>
    </template>
  </div>
</template>

<script>
export default {
  methods: {
    isNew (isNewUser) { this.$store.dispatch('isNewUser', !isNewUser) }
  }
}
</script>


================================================
FILE: vue.config.js
================================================
const path = require("path");

module.exports = {
  pluginOptions: {
    "style-resources-loader": {
      preProcessor: "scss",
      patterns: [path.resolve(__dirname, "./src/styles/global.scss")]
    }
  }
};
Download .txt
gitextract_ix0n5d8h/

├── .browserslistrc
├── .eslintrc.js
├── .gitignore
├── README.md
├── _server.js
├── babel.config.js
├── db/
│   └── events.json
├── package.json
├── postcss.config.js
├── public/
│   └── index.html
├── server.js
├── src/
│   ├── App.vue
│   ├── assets/
│   │   └── styles/
│   │       └── global.scss
│   ├── components/
│   │   ├── AppNav.vue
│   │   ├── EventCard.vue
│   │   ├── LoginUser.vue
│   │   └── RegisterUser.vue
│   ├── main.js
│   ├── router.js
│   ├── store.js
│   └── views/
│       ├── Authenticate.vue
│       ├── Dashboard.vue
│       └── Home.vue
└── vue.config.js
Download .txt
SYMBOL INDEX (10 symbols across 4 files)

FILE: _server.js
  function verifyToken (line 81) | function verifyToken (req, res, next) {

FILE: server.js
  function verifyToken (line 86) | function verifyToken (req, res, next) {

FILE: src/main.js
  method created (line 13) | created() {

FILE: src/store.js
  method SET_USER_DATA (line 13) | SET_USER_DATA (state, userData) {
  method LOGOUT (line 20) | LOGOUT () {
  method IS_NEW_USER (line 24) | IS_NEW_USER (state, isNewUser) {
  method register (line 29) | register ({ commit }, credentials) {
  method login (line 36) | login ({ commit }, credentials) {
  method logout (line 43) | logout ({ commit }) {
  method isNewUser (line 46) | isNewUser ({ commit }, isNewUser) {
Condensed preview — 24 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (21K chars).
[
  {
    "path": ".browserslistrc",
    "chars": 33,
    "preview": "> 1%\nlast 2 versions\nnot ie <= 8\n"
  },
  {
    "path": ".eslintrc.js",
    "chars": 489,
    "preview": "module.exports = {\n  root: true,\n  env: {\n    node: true\n  },\n  extends: [\"plugin:vue/recommended\", \"standard\"],\n  rules"
  },
  {
    "path": ".gitignore",
    "chars": 227,
    "preview": ".DS_Store\nnode_modules\n/dist\n\n# local env files\n.env.local\n.env.*.local\ndb/user.json\n\n# Log files\nnpm-debug.log*\nyarn-de"
  },
  {
    "path": "README.md",
    "chars": 438,
    "preview": "# authentication_course\n\n## Project setup\n```\nnpm install\n```\n\n### Compiles and hot-reloads for development\n```\nnpm run "
  },
  {
    "path": "_server.js",
    "chars": 2130,
    "preview": "var express = require('express')\nvar jwt = require('jsonwebtoken')\nvar cors = require('cors')\nvar bodyParser = require('"
  },
  {
    "path": "babel.config.js",
    "chars": 46,
    "preview": "module.exports = {\n  presets: [\"@vue/app\"]\n};\n"
  },
  {
    "path": "db/events.json",
    "chars": 482,
    "preview": "{\n  \"events\": [\n    {\n      \"id\": \"1234\",\n      \"title\": \"Puppy Parade\",\n      \"time\": \"12:00\",\n      \"date\": \"Feb 22, 2"
  },
  {
    "path": "package.json",
    "chars": 1115,
    "preview": "{\n  \"name\": \"authentication_course\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"serve\": \"vue-cli-servi"
  },
  {
    "path": "postcss.config.js",
    "chars": 60,
    "preview": "module.exports = {\n  plugins: {\n    autoprefixer: {}\n  }\n};\n"
  },
  {
    "path": "public/index.html",
    "chars": 579,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "server.js",
    "chars": 2357,
    "preview": "const express = require('express')\nconst jwt = require('jsonwebtoken')\nconst cors = require('cors')\nconst bodyParser = r"
  },
  {
    "path": "src/App.vue",
    "chars": 410,
    "preview": "<template>\n  <div id=\"app\">\n    <app-nav />\n    <router-view class=\"page\" />\n  </div>\n</template>\n\n<script>\nimport AppNa"
  },
  {
    "path": "src/assets/styles/global.scss",
    "chars": 863,
    "preview": "body {\n  font-family: 'Avenir', Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smo"
  },
  {
    "path": "src/components/AppNav.vue",
    "chars": 1414,
    "preview": "<template>\n  <div id=\"nav\">\n    <router-link to=\"/\">\nHome\n</router-link>\n\n    <template v-if=\"user\">\n      <router-link "
  },
  {
    "path": "src/components/EventCard.vue",
    "chars": 678,
    "preview": "<template>\n  <div class=\"event-card\">\n    <span>@{{ event.time }} on {{ event.date }}</span>\n    <h4>{{ event.title }}</"
  },
  {
    "path": "src/components/LoginUser.vue",
    "chars": 860,
    "preview": "<template>\n  <form @submit.prevent=\"login\">\n    <label for=\"email\">\n      Email:\n    </label>\n    <input v-model=\"email\""
  },
  {
    "path": "src/components/RegisterUser.vue",
    "chars": 1091,
    "preview": "<template>\n  <div>\n    <form @submit.prevent=\"register\">\n      <label for=\"name\">\n        Name:\n      </label>\n      <in"
  },
  {
    "path": "src/main.js",
    "chars": 740,
    "preview": "import Vue from 'vue'\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\nimport axios"
  },
  {
    "path": "src/router.js",
    "chars": 953,
    "preview": "import Vue from 'vue'\nimport Router from 'vue-router'\nimport Home from './views/Home.vue'\nimport Dashboard from './views"
  },
  {
    "path": "src/store.js",
    "chars": 1149,
    "preview": "import Vue from 'vue'\nimport Vuex from 'vuex'\nimport axios from 'axios'\n\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n"
  },
  {
    "path": "src/views/Authenticate.vue",
    "chars": 945,
    "preview": "<template>\n  <div>\n    <component :is=\"loginOrRegister\" />\n    <a\n      v-show=\"isNewUser\"\n      class=\"auth-link\"\n     "
  },
  {
    "path": "src/views/Dashboard.vue",
    "chars": 540,
    "preview": "<template>\n  <div>\n    <h1>Dashboard</h1>\n    <template v-if=\"events !== 'Loading events...'\">\n      <EventCard v-for=\"e"
  },
  {
    "path": "src/views/Home.vue",
    "chars": 569,
    "preview": "<template>\n  <div class=\"home\">\n    <h1>Welcome to the App!</h1>\n    <template v-if=\"!this.$store.state.user\">\n      <di"
  },
  {
    "path": "vue.config.js",
    "chars": 211,
    "preview": "const path = require(\"path\");\n\nmodule.exports = {\n  pluginOptions: {\n    \"style-resources-loader\": {\n      preProcessor:"
  }
]

About this extraction

This page contains the full source code of the Code-Pop/authentication_course GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 24 files (17.9 KB), approximately 5.7k tokens, and a symbol index with 10 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!