mirror of
https://github.com/theoludwig/theoludwig.git
synced 2025-05-29 22:37:44 +02:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
4b7d184c91 | |||
3e18536c2e | |||
8027e2deed | |||
c21abdcc81 | |||
3382177e27 | |||
73352d4414 | |||
f11425b2c2 | |||
039f4d172b | |||
b0a608c1fa |
4
.github/workflows/Divlo.yml
vendored
4
.github/workflows/Divlo.yml
vendored
@ -2,9 +2,9 @@ name: 'Divlo'
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master, development]
|
branches: [master]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [master, development]
|
branches: [master]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ci:
|
ci:
|
||||||
|
28
.github/workflows/codeql-analysis.yml
vendored
Normal file
28
.github/workflows/codeql-analysis.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
name: 'CodeQL'
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
pull_request:
|
||||||
|
branches: [master]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: 'Analyze'
|
||||||
|
runs-on: 'ubuntu-latest'
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: ['javascript']
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: 'actions/checkout@v2'
|
||||||
|
|
||||||
|
- name: 'Initialize CodeQL'
|
||||||
|
uses: 'github/codeql-action/init@v1'
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
|
||||||
|
- name: 'Perform CodeQL Analysis'
|
||||||
|
uses: 'github/codeql-action/analyze@v1'
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@ -1,4 +1,4 @@
|
|||||||
name: 'release'
|
name: 'Release'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
workflow_run:
|
||||||
|
19
.gitignore
vendored
19
.gitignore
vendored
@ -26,10 +26,21 @@ coverage
|
|||||||
# debug
|
# debug
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
|
|
||||||
# editors
|
# IDEs and editors
|
||||||
.vscode
|
/.idea
|
||||||
.theia
|
.project
|
||||||
.idea
|
.classpath
|
||||||
|
.c9/
|
||||||
|
*.launch
|
||||||
|
.settings/
|
||||||
|
*.sublime-workspace
|
||||||
|
|
||||||
|
# IDE - VSCode
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
27
.gitpod.yml
Normal file
27
.gitpod.yml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
image: 'gitpod/workspace-full'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: 'docker-daemon'
|
||||||
|
init: 'cp .env.example .env && npm install --global npm@7 && npm ci'
|
||||||
|
command: 'sudo docker-up'
|
||||||
|
- name: 'docker-container'
|
||||||
|
init: 'echo "Waiting for docker daemon to start" &&
|
||||||
|
until docker info &> /dev/null; do sleep 1; done;'
|
||||||
|
command: 'docker-compose up'
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- port: 3000
|
||||||
|
onOpen: 'open-preview'
|
||||||
|
|
||||||
|
- port: 1080
|
||||||
|
onOpen: 'notify'
|
||||||
|
|
||||||
|
github:
|
||||||
|
prebuilds:
|
||||||
|
master: true
|
||||||
|
branches: true
|
||||||
|
pullRequests: true
|
||||||
|
pullRequestsFromForks: true
|
||||||
|
addComment: true
|
||||||
|
addBadge: true
|
||||||
|
addLabel: true
|
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"release": {
|
|
||||||
"branches": ["master"]
|
|
||||||
},
|
|
||||||
"plugins": [
|
"plugins": [
|
||||||
["@semantic-release/commit-analyzer", {
|
[
|
||||||
|
"@semantic-release/commit-analyzer",
|
||||||
|
{
|
||||||
"preset": "conventionalcommits"
|
"preset": "conventionalcommits"
|
||||||
}],
|
}
|
||||||
|
],
|
||||||
"@semantic-release/release-notes-generator",
|
"@semantic-release/release-notes-generator",
|
||||||
"@semantic-release/github"
|
"@semantic-release/github"
|
||||||
]
|
]
|
||||||
|
12
.vscode/extensions.json
vendored
Normal file
12
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"divlo.vscode-styled-jsx-syntax",
|
||||||
|
"divlo.vscode-styled-jsx-languageserver",
|
||||||
|
"standard.vscode-standard",
|
||||||
|
"mikestead.dotenv",
|
||||||
|
"editorconfig.editorconfig",
|
||||||
|
"coenraads.bracket-pair-colorizer",
|
||||||
|
"davidanson.vscode-markdownlint",
|
||||||
|
"syler.sass-indented"
|
||||||
|
]
|
||||||
|
}
|
8
.vscode/settings.json
vendored
Normal file
8
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"standard.enable": true,
|
||||||
|
"standard.engine": "ts-standard",
|
||||||
|
"standard.treatErrorsAsWarnings": true,
|
||||||
|
"standard.usePackageJson": true,
|
||||||
|
"standard.autoFixOnSave": true,
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib"
|
||||||
|
}
|
@ -47,6 +47,8 @@ Scopes define what part of the code changed.
|
|||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
|
[](https://gitpod.io/#https://github.com/Divlo/Divlo)
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
10
__test__/pages/404.test.tsx
Normal file
10
__test__/pages/404.test.tsx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { render } from '@testing-library/react'
|
||||||
|
|
||||||
|
import Error404 from 'pages/404'
|
||||||
|
|
||||||
|
describe('GET /404', () => {
|
||||||
|
it('should render', async () => {
|
||||||
|
const { getByText } = render(<Error404 />)
|
||||||
|
expect(getByText('404')).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
10
__test__/pages/500.test.tsx
Normal file
10
__test__/pages/500.test.tsx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { render } from '@testing-library/react'
|
||||||
|
|
||||||
|
import Error500 from 'pages/500'
|
||||||
|
|
||||||
|
describe('GET /500', () => {
|
||||||
|
it('should render', async () => {
|
||||||
|
const { getByText } = render(<Error500 />)
|
||||||
|
expect(getByText('500')).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
@ -16,7 +16,7 @@ export const ErrorPage: React.FC<ErrorPageProps> = props => {
|
|||||||
{t('errors:error')} <span className='important'>{statusCode}</span>
|
{t('errors:error')} <span className='important'>{statusCode}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p className='text-center'>
|
<p className='text-center'>
|
||||||
{message} <Link href='/'>{t('returnToHomePage')}</Link>
|
{message} <Link href='/'>{t('errors:returnToHomePage')}</Link>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<style jsx global>{`
|
<style jsx global>{`
|
||||||
|
10
components/Header/__test__/Header.test.tsx
Normal file
10
components/Header/__test__/Header.test.tsx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { render } from '@testing-library/react'
|
||||||
|
|
||||||
|
import { Header } from '..'
|
||||||
|
|
||||||
|
describe('<Header />', () => {
|
||||||
|
it('should render', async () => {
|
||||||
|
const { getByText } = render(<Header />)
|
||||||
|
expect(getByText('Divlo')).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
15
components/__test__/ErrorPage.test.tsx
Normal file
15
components/__test__/ErrorPage.test.tsx
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { render } from '@testing-library/react'
|
||||||
|
|
||||||
|
import { ErrorPage } from '../ErrorPage'
|
||||||
|
|
||||||
|
describe('<ErrorPage />', () => {
|
||||||
|
it('should render the message and statusCode', async () => {
|
||||||
|
const messageContent = 'message content'
|
||||||
|
const statusCode = 404
|
||||||
|
const { getByText } = render(
|
||||||
|
<ErrorPage statusCode={statusCode} message={messageContent} />
|
||||||
|
)
|
||||||
|
expect(getByText(messageContent)).toBeInTheDocument()
|
||||||
|
expect(getByText(statusCode)).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
10
components/__test__/Footer.test.tsx
Normal file
10
components/__test__/Footer.test.tsx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { render } from '@testing-library/react'
|
||||||
|
|
||||||
|
import { Footer } from '../Footer'
|
||||||
|
|
||||||
|
describe('<Footer />', () => {
|
||||||
|
it('should render', async () => {
|
||||||
|
const { getByText } = render(<Footer />)
|
||||||
|
expect(getByText('Divlo')).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
11
components/design/__test__/Input.test.tsx
Normal file
11
components/design/__test__/Input.test.tsx
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { render } from '@testing-library/react'
|
||||||
|
|
||||||
|
import { Input } from '../Input'
|
||||||
|
|
||||||
|
describe('<Input />', () => {
|
||||||
|
it('should render the label', async () => {
|
||||||
|
const labelContent = 'label content'
|
||||||
|
const { getByText } = render(<Input label={labelContent} />)
|
||||||
|
expect(getByText(labelContent)).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
@ -18,7 +18,8 @@ module.exports = {
|
|||||||
'!**/next.config.js',
|
'!**/next.config.js',
|
||||||
'!**/postcss.config.js',
|
'!**/postcss.config.js',
|
||||||
'!**/workbox-*.js',
|
'!**/workbox-*.js',
|
||||||
'!**/sw.js'
|
'!**/sw.js',
|
||||||
|
'!**/jest.config.js'
|
||||||
],
|
],
|
||||||
coverageDirectory: './coverage',
|
coverageDirectory: './coverage',
|
||||||
coverageReporters: ['text', 'cobertura']
|
coverageReporters: ['text', 'cobertura']
|
||||||
|
16797
package-lock.json
generated
16797
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -56,7 +56,7 @@
|
|||||||
"react-component-form": "1.3.0",
|
"react-component-form": "1.3.0",
|
||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
"universal-cookie": "4.0.4",
|
"universal-cookie": "4.0.4",
|
||||||
"validator": "13.5.2"
|
"validator": "13.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "12.1.1",
|
"@commitlint/cli": "12.1.1",
|
||||||
|
@ -17,21 +17,19 @@ const emailTransporter = nodemailer.createTransport({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export default async (
|
const handler = async (
|
||||||
request: NextApiRequest,
|
request: NextApiRequest,
|
||||||
response: NextApiResponse
|
response: NextApiResponse
|
||||||
): Promise<any> => {
|
): Promise<any> => {
|
||||||
if (request.method !== 'POST') {
|
if (request.method !== 'POST') {
|
||||||
return response.redirect('/404')
|
return response.redirect('/404')
|
||||||
}
|
}
|
||||||
|
const { name, email, subject, message } = request.body as {
|
||||||
let { name, email, subject, message } = request.body as {
|
|
||||||
name: string
|
name: string
|
||||||
email: string
|
email: string
|
||||||
subject: string
|
subject: string
|
||||||
message: string
|
message: string
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
validator.isEmpty(name) ||
|
validator.isEmpty(name) ||
|
||||||
validator.isEmpty(email) ||
|
validator.isEmpty(email) ||
|
||||||
@ -40,26 +38,18 @@ export default async (
|
|||||||
) {
|
) {
|
||||||
return response.status(400).json({ type: 'requiredFields' })
|
return response.status(400).json({ type: 'requiredFields' })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validator.isEmail(email)) {
|
if (!validator.isEmail(email)) {
|
||||||
return response.status(400).json({ type: 'invalidEmail' })
|
return response.status(400).json({ type: 'invalidEmail' })
|
||||||
}
|
}
|
||||||
|
|
||||||
email = validator.normalizeEmail(email) as string
|
|
||||||
message = validator.trim(message)
|
|
||||||
message = validator.escape(message)
|
|
||||||
subject = validator.trim(subject)
|
|
||||||
subject = validator.escape(subject)
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await emailTransporter.sendMail({
|
await emailTransporter.sendMail({
|
||||||
from: '"Divlo" <contact@divlo.fr>',
|
from: '"Divlo" <contact@divlo.fr>',
|
||||||
to: email,
|
to: email,
|
||||||
subject: `Contact - ${subject}`,
|
subject: `Contact - ${validator.escape(subject)}`,
|
||||||
html: `
|
html: `
|
||||||
<b>Name:</b> ${name} <br/>
|
<b>Name:</b> ${validator.escape(name)} <br/>
|
||||||
<b>Email:</b> ${email} <br/>
|
<b>Email:</b> ${validator.escape(email)} <br/>
|
||||||
<b>Message:</b> ${message}
|
<b>Message:</b> ${validator.escape(message)}
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
return response.status(201).json({ type: 'success' })
|
return response.status(201).json({ type: 'success' })
|
||||||
@ -67,3 +57,5 @@ export default async (
|
|||||||
return response.status(500).json({ type: 'serverError' })
|
return response.status(500).json({ type: 'serverError' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default handler
|
||||||
|
Reference in New Issue
Block a user