This commit is contained in:
Damien Broqua 2022-02-13 14:03:04 +01:00
parent 6debd00e77
commit e495e11198
9 changed files with 178 additions and 0 deletions

3
.eslintignore Normal file
View File

@ -0,0 +1,3 @@
dist/**
node_modules/**
test-reports/**

22
.eslintrc.js Normal file
View File

@ -0,0 +1,22 @@
module.exports = {
'env': {
'es6': true,
'node': true,
},
'extends': [
'google',
],
'globals': {
'Atomics': 'readonly',
'SharedArrayBuffer': 'readonly',
},
'parserOptions': {
'ecmaVersion': 2018,
'sourceType': 'module',
},
'rules': {
'max-len': ['error', {'code': 180}],
'new-cap': ['error', {'capIsNewExceptions': ['ENUM', 'ARRAY', 'TEXT', 'STRING', 'ObjectId']}],
},
};

2
.gitignore vendored
View File

@ -118,3 +118,5 @@ dist
.yarn/install-state.gz .yarn/install-state.gz
.pnp.* .pnp.*
dist
yarn.lock

4
.husky/pre-commit Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged

61
package.json Normal file
View File

@ -0,0 +1,61 @@
{
"name": "nodecdtheque",
"version": "1.0.0",
"description": "Simple application to manage your CD/Vinyl collection",
"scripts": {
"start": "node ./dist/bin/www",
"dev": "npm-run-all build start",
"watch": "nodemon",
"prebuild": "rimraf dist",
"build": "babel ./src --out-dir dist",
"test": "jest",
"prepare": "husky install"
},
"repository": {
"type": "git",
"url": "git@git.darkou.fr:dbroqua/nodecdtheque.git"
},
"author": {
"name": "Damien Broqua",
"email": "contact@darkou.fr",
"url": "https://www.darkou.fr"
},
"license": "GPL-3.0-or-later",
"devDependencies": {
"@babel/cli": "^7.17.0",
"@babel/core": "^7.17.2",
"@babel/preset-env": "^7.16.11",
"eslint": "^8.9.0",
"eslint-config-google": "^0.14.0",
"husky": "^7.0.4",
"lint-staged": "^12.3.3",
"nodemon": "^2.0.15",
"npm-run-all": "^4.1.5",
"rimraf": "^3.0.2"
},
"dependencies": {
"express": "^4.17.2"
},
"nodemonConfig": {
"exec": "npm run dev",
"watch": [
"src/*"
],
"ignore": [
"**/__tests__/**",
"*.test.js",
"*.spec.js"
]
},
"babel": {
"presets": [
"@babel/preset-env"
]
},
"jest": {
"testEnvironment": "node"
},
"lint-staged": {
"src/**/*.js": "eslint --cache --fix"
}
}

14
src/app.js Normal file
View File

@ -0,0 +1,14 @@
import express from 'express';
import path from 'path';
import indexRouter from './routes/index';
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, '../public')));
app.use('/', indexRouter);
export default app;

57
src/bin/www.js Normal file
View File

@ -0,0 +1,57 @@
#!/usr/bin/env node
/**
* Module dependencies.
*/
import app from '../app';
import debugLib from 'debug';
import http from 'http';
import {port} from '../config';
const debug = debugLib('nodecdtheque:server');
const server = http.createServer(app);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Event listener for HTTP server "error" event.
* @param {*} error
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
const bind = typeof port === 'string' ?
'Pipe ' + port :
'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
const addr = server.address();
const bind = typeof addr === 'string' ?
'pipe ' + addr :
'port ' + addr.port;
debug('Listening on ' + bind);
}

4
src/config/index.js Normal file
View File

@ -0,0 +1,4 @@
module.exports = {
nodeEnv: process.env.NODE_ENV || 'development',
port: parseInt(process.env.PORT || '3001', 10),
};

11
src/routes/index.js Normal file
View File

@ -0,0 +1,11 @@
import express from 'express';
// eslint-disable-next-line new-cap
const router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', {title: 'World'});
});
export default router;