rewriting to oop and typescript

This commit is contained in:
2021-12-01 18:05:44 +01:00
parent 67d6029699
commit 1ebafbef49
123 changed files with 2129 additions and 5 deletions

View File

@ -1,237 +0,0 @@
#!/usr/bin/env node
const inquirer = require('inquirer')
const path = require('path')
const fs = require('fs-extra')
const colors = require('colors')
const pad = require('pad')
const langToLanguage = lang => {
switch (lang) {
case 'js':
return 'Javascript'
case 'ts':
return 'Typescript'
default:
return 'Unknown language'
}
}
const logError = errorMsg => {
console.log(colors.bgYellow.red(errorMsg))
return
}
const logSuccess = (msg = false) => {
if (!msg) {
msg = 'Success!'
}
console.log(colors.cyan(msg))
return
}
const logHelp = (specific = false, command = false) => {
let spc = 27
if (specific) {
// log specific help
if (specific == 'make') {
console.log(`Usage: ${specific}:[component]`)
console.log()
console.log(pad(' make controller [name]', spc), 'create a new controller')
console.log(pad(' make middleware [name]', spc), 'create a new middleware')
console.log(pad(' make model [name]', spc), 'create a new model')
console.log(pad(' make route [name]', spc), 'create a new route')
console.log(pad(' make test [name]', spc), 'create a new test')
console.log(pad(' make view [name]', spc), 'create a new view')
return
}
console.log(`Usage: ${specific} [options]`)
return
}
console.log('Usage: nork <command> [options]')
console.log()
console.log('Options:')
console.log(pad(' -v, --version', spc), 'output the version number')
console.log(pad(' -h, --help', spc), 'output usage information')
console.log()
console.log('Commands:')
console.log(pad(' create [app-name]', spc), 'create a new project')
console.log(pad(' create [app-name] -i', spc), 'create a new project in current directory')
console.log(pad(' make controller [name]', spc), 'create a new controller')
console.log(pad(' make interface [name]', spc), 'create a new interface')
console.log(pad(' make middleware [name]', spc), 'create a new middleware')
console.log(pad(' make model [name]', spc), 'create a new model')
console.log(pad(' make route [name]', spc), 'create a new route')
console.log(pad(' make service [name]', spc), 'create a new service')
console.log(pad(' make test [name]', spc), 'create a new test')
console.log(pad(' make view [name]', spc), 'create a new view')
console.log(pad(' setup', spc), 'set up an existing project for nork')
console.log()
console.log(' Run', colors.cyan('nork help <command>'), 'for detailed usage of given command.')
if (command) {
console.log(colors.red('Unknown command'), colors.bold.blue(command))
}
return
}
;(async () => {
if (process.argv[2] == 'create') {
// get info about new project
let projectPath
const data = {}
const questions = [
{
type: 'input',
name: 'project_name',
message: 'Enter project name:',
},
{
type: 'list',
message: "Pick the technology you're using:",
name: 'lang',
choices: [
{ name: 'Typescript', value: 'ts' },
{ name: 'Javascript', value: 'js' },
],
},
{
type: 'input',
name: 'author',
message: 'Enter your name:',
},
]
// remove first question if project name is already known
if (process.argv[3]) {
questions.shift()
}
let answers = await inquirer.prompt(questions)
data.project_name = answers.project_name ? answers.project_name : process.argv[3]
data.lang = answers.lang
data.author = answers.author
// copy skeleton to new project
process.argv.includes('-i') ? (projectPath = process.cwd()) : (projectPath = path.join(process.cwd(), data.project_name))
fs.copySync(path.join(__dirname, './skeletons/express-' + data.lang), projectPath)
// edit package.json file
const pkgJson = require(path.join(projectPath, 'package.json'))
pkgJson.name = data.project_name
pkgJson.author = data.author
fs.writeFile(path.join(projectPath, 'package.json'), JSON.stringify(pkgJson, null, 2), err => {
if (err) return logError(err)
})
console.log(colors.yellow('Project settings'))
console.log(colors.yellow('------------------'))
console.log(pad(colors.gray('Project name: '), 30), data.project_name)
console.log(pad(colors.gray('Author: '), 30), data.author)
console.log(pad(colors.gray('Language: '), 30), langToLanguage(data.lang))
return logSuccess(`Project ${data.project_name} created successfully!`)
}
if (process.argv[2] == 'make') {
if (!process.argv[3] || !process.argv[4]) return logHelp('make')
const component = process.argv[3]
const norkcfg = require(path.join(process.cwd(), 'norkconfig.json'))
let tsComponents = ['controller', 'middleware', 'route', 'service']
if (tsComponents.includes(component)) {
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.' + norkcfg.lang)
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.' + norkcfg.lang)
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err) {
return logError(err.message)
}
return logSuccess()
}
if (component == 'model') {
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.' + norkcfg.lang)
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.' + norkcfg.lang)
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err) {
return logError(err.message)
}
return logSuccess()
}
if (component == 'view') {
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.ejs')
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.ejs')
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err) {
return logError(err.message)
}
return logSuccess()
}
if (component == 'test') {
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.js')
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.test.js')
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err) {
return logError(err.message)
}
return logSuccess()
}
if (component == 'interface') {
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.ts')
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.ts')
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err) {
return logError(err.message)
}
return logSuccess()
}
}
if (process.argv[2] == 'setup') {
const questions = {
type: 'list',
message: "Pick the technology you're using:",
name: 'lang',
choices: [
{ name: 'Typescript', value: 'ts' },
{ name: 'Javascript', value: 'js' },
],
}
let answers = await inquirer.prompt(questions)
fs.writeJsonSync(path.join(process.cwd(), './norkconfig.json'), answers)
return logSuccess()
}
if (process.argv[2] == '-v' || process.argv[2] == '--version') {
const pkgJson = require(path.join(__dirname, '../package.json'))
return console.log('nork', pkgJson.version)
}
if (process.argv[2] == 'help' || process.argv[2] == '-h' || process.argv[2] == '--help') {
if (process.argv[3]) {
return logHelp(process.argv[3])
}
return logHelp()
}
process.argv.splice(0, 2)
logHelp(false, process.argv.join(' '))
})()

9
src/app.ts Normal file
View File

@ -0,0 +1,9 @@
import Routes from './routes'
export class App {
constructor() {
Routes.router()
}
}
new App()

6
src/controllers/test.ts Normal file
View File

@ -0,0 +1,6 @@
import { Request, Response } from 'express'
export const root_get = (req: Request, res: Response) => {
res.render('home')
return true
}

View File

@ -0,0 +1,6 @@
import { Request, Response } from 'express'
export const root_get = (req: Request, res: Response) => {
res.render('home')
return true
}

16
src/global.ts Normal file
View File

@ -0,0 +1,16 @@
import colors from 'colors'
export default class Global {
static logSuccess = (msg: boolean | string = false): string => {
if (!msg) {
msg = 'Success!'
}
console.log(colors.cyan(String(msg)))
return String(msg)
}
static logError(errorMsg: string) {
console.log(colors.bgYellow.red(errorMsg))
return
}
}

66
src/help.ts Normal file
View File

@ -0,0 +1,66 @@
import pad from 'pad'
import colors from 'colors'
export default class Help {
constructor() {
// this.logHelp()
}
// log help & returns status in string for tests
static makeHelp(): string {
const spc = 27
return `
Usage: make:[component]
${pad(' make controller [name]', spc)} create a new controller
${pad(' make middleware [name]', spc)} create a new middleware
${pad(' make model [name]', spc)} create a new model
${pad(' make route [name]', spc)} create a new route
${pad(' make test [name]', spc)} create a new test
${pad(' make view [name]', spc)} create a new view
`
}
static allHelp(): string {
const spc = 27
return `
Usage: nork <command> [options]
Options:
${pad(' -v, --version', spc)} output the version number
${pad(' -h, --help', spc)} output usage information
Commands:
${pad(' create [app-name]', spc)} create a new project
${pad(' create [app-name] -i', spc)} create a new project in current directory
${pad(' make controller [name]', spc)} create a new controller
${pad(' make interface [name]', spc)} create a new interface
${pad(' make middleware [name]', spc)} create a new middleware
${pad(' make model [name]', spc)} create a new model
${pad(' make route [name]', spc)} create a new route
${pad(' make service [name]', spc)} create a new service
${pad(' make test [name]', spc)} create a new test
${pad(' make view [name]', spc)} create a new view
${pad(' setup', spc)} set up an existing project for nork
Run ${colors.cyan('nork help <command>')} for detailed usage of given command.
`
}
static specificHelp(specific: string): string {
return `Usage: ${specific} [options]`
}
static logHelp = (specific: boolean | string = false): string => {
if (specific) {
// log specific help
if (specific == 'make') {
return this.makeHelp()
}
// else return specific help
return this.specificHelp(String(specific))
}
// if nothing return help all
return this.allHelp()
}
}

View File

@ -0,0 +1,3 @@
export interface Norkcfg {
lang: string
}

View File

@ -0,0 +1,15 @@
export interface Questions {
type: string
message: string
name: string
choices: [
{
name: string
value: string
},
{
name: string
value: string
},
]
}

4
src/interfaces/test.ts Normal file
View File

@ -0,0 +1,4 @@
export interface interfaceName {
hello: string
world: boolean | null | undefined
}

View File

@ -0,0 +1,4 @@
export interface interfaceName {
hello: string
world: boolean | null | undefined
}

View File

@ -1,9 +0,0 @@
const { getReq, getRes } = require('./modules/reqRes.module.js')
const { root_get } = require('../controllers/rootController.ts')
test('Home page render test', () => {
const req = getReq()
const res = getRes()
expect(root_get(req, res)).toBe(true)
})

76
src/make.ts Normal file
View File

@ -0,0 +1,76 @@
import path from 'path'
import fs from 'fs-extra'
import global from './global'
import { Norkcfg } from './interfaces/GlobalInterface'
export default class Make {
static component(component: string) {
// const norkcfg = require(path.join(process.cwd(), 'norkconfig.json'))
const norkcfg: Norkcfg = fs.readJsonSync(path.join(process.cwd(), 'norkconfig.json'))
const tsComponents = ['controller', 'middleware', 'route', 'service']
if (tsComponents.includes(component)) {
const src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.' + norkcfg.lang)
const dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.' + norkcfg.lang)
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err: any) {
return global.logError(err.message)
}
return global.logSuccess()
}
if (component == 'model') {
const src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.' + norkcfg.lang)
const dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.' + norkcfg.lang)
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err: any) {
return global.logError(err.message)
}
return global.logSuccess()
}
if (component == 'view') {
const src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.ejs')
const dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.ejs')
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err: any) {
return global.logError(err.message)
}
return global.logSuccess()
}
if (component == 'test') {
const src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.js')
const dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.test.js')
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err: any) {
return global.logError(err.message)
}
return global.logSuccess()
}
if (component == 'interface') {
if (norkcfg.lang != 'ts') {
return global.logError('error - this is typescript only component')
}
const src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.ts')
const dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.ts')
try {
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
} catch (err: any) {
return global.logError(err.message)
}
return global.logSuccess()
}
return global.logError(`error - unknown component ${component}`)
}
}

8
src/middlewares/test.ts Normal file
View File

@ -0,0 +1,8 @@
import { Router, Request, Response, NextFunction } from 'express'
export const router = Router()
router.use((req: Request, res: Response, next: NextFunction) => {
console.log('Hi :)')
next()
})

View File

@ -0,0 +1,8 @@
import { Router, Request, Response, NextFunction } from 'express'
export const router = Router()
router.use((req: Request, res: Response, next: NextFunction) => {
console.log('Hi :)')
next()
})

15
src/models/test.ts Normal file
View File

@ -0,0 +1,15 @@
import { Schema, model } from 'mongoose'
const modelSchema = new Schema<any>(
{
title: {
type: String,
required: true,
},
},
{
timestamps: true,
},
)
export default model('ModelName', modelSchema)

15
src/models/undefined.ts Normal file
View File

@ -0,0 +1,15 @@
import { Schema, model } from 'mongoose'
const modelSchema = new Schema<any>(
{
title: {
type: String,
required: true,
},
},
{
timestamps: true,
},
)
export default model('ModelName', modelSchema)

41
src/routes.ts Normal file
View File

@ -0,0 +1,41 @@
import Help from './help'
import Version from './version'
import Setup from './setup'
import Make from './make'
export default class Routes {
static router(): string {
if (process.argv[2] == 'help' || process.argv[2] == '-h' || process.argv[2] == '--help') {
if (process.argv[3]) {
console.log(Help.logHelp(process.argv[3]))
return 'specific help'
}
console.log(Help.logHelp())
return 'all help'
}
if (process.argv[2] == '-v' || process.argv[2] == '--version') {
console.log(Version.show())
return 'version'
}
if (process.argv[2] == 'setup') {
if (process.argv[3] != 'test') {
Setup.setup()
}
return 'setup'
}
if (process.argv[2] == 'make') {
if (process.argv[3]) {
if (process.argv[4] != 'test') {
Make.component(process.argv[3])
}
return `make ${process.argv[3]}`
}
}
console.log(Help.logHelp())
return 'all help'
}
}

6
src/routes/test.ts Normal file
View File

@ -0,0 +1,6 @@
import { Router } from 'express'
import * as rootController from '@/controllers/rootController'
export const router = Router()
router.get('/', rootController.root_get)

6
src/routes/undefined.ts Normal file
View File

@ -0,0 +1,6 @@
import { Router } from 'express'
import * as rootController from '@/controllers/rootController'
export const router = Router()
router.get('/', rootController.root_get)

3
src/services/test.ts Normal file
View File

@ -0,0 +1,3 @@
export function helloWorld() {
console.log('hello world')
}

View File

@ -0,0 +1,3 @@
export function helloWorld() {
console.log('hello world')
}

24
src/setup.ts Normal file
View File

@ -0,0 +1,24 @@
import inquirer from 'inquirer'
import fs from 'fs-extra'
import path from 'path'
import Global from './global'
import { Questions } from './interfaces/SetupInterface'
export default class Setup {
static async setup(test = false) {
if (!test) {
const questions: Questions = {
type: 'list',
message: `Pick the technology you're using:`,
name: 'lang',
choices: [
{ name: 'Typescript', value: 'ts' },
{ name: 'Javascript', value: 'js' },
],
}
const answers = await inquirer.prompt(Object(questions))
fs.writeJsonSync(path.join(process.cwd(), './norkconfig.json'), answers)
}
return Global.logSuccess()
}
}

View File

@ -0,0 +1,39 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.app = void 0;
const express_1 = __importDefault(require("express"));
const morgan_1 = __importDefault(require("morgan"));
const path_1 = __importDefault(require("path"));
const cors_1 = __importDefault(require("cors"));
const cookie_parser_1 = __importDefault(require("cookie-parser"));
const routes_1 = require("@/routes");
const middlewares_1 = require("@/middlewares");
const corsWhitelist = ['http://localhost:8080', 'http://localhost:6060'];
const corsOptions = {
origin: function (origin, callback) {
if (!origin || corsWhitelist.indexOf(origin) !== -1) {
callback(null, true);
}
else {
callback(new Error('Not allowed by CORS'));
}
},
optionsSuccessStatus: 200,
credentials: true,
};
exports.app = (0, express_1.default)();
// Middlewares
exports.app.use(middlewares_1.router);
exports.app.set('view engine', 'ejs');
exports.app.set('views', path_1.default.join(__dirname, 'views'));
exports.app.use((0, cors_1.default)(corsOptions));
exports.app.use((0, morgan_1.default)('dev'));
exports.app.use(express_1.default.urlencoded({ extended: true }));
exports.app.use(express_1.default.json());
exports.app.use(express_1.default.static(path_1.default.join(__dirname, 'public')));
exports.app.use((0, cookie_parser_1.default)());
// Routes
exports.app.use(routes_1.router);

View File

@ -0,0 +1,8 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.root_get = void 0;
const root_get = (req, res) => {
res.render('home');
return true;
};
exports.root_get = root_get;

View File

@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });

View File

@ -0,0 +1,7 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.router = void 0;
const express_1 = require("express");
const sayHiMiddleware_1 = require("@/middlewares/sayHiMiddleware");
exports.router = (0, express_1.Router)();
exports.router.use(sayHiMiddleware_1.router);

View File

@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.router = void 0;
const express_1 = require("express");
exports.router = (0, express_1.Router)();
exports.router.use((req, res, next) => {
console.log('Hi :)');
next();
});

View File

@ -0,0 +1,11 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.router = void 0;
const express_1 = require("express");
const rootRoutes_1 = require("./rootRoutes");
exports.router = (0, express_1.Router)();
exports.router.use(rootRoutes_1.router);
// 404
exports.router.use((req, res) => {
res.status(404).send('E404');
});

View File

@ -0,0 +1,26 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.router = void 0;
const express_1 = require("express");
const rootController = __importStar(require("@/controllers/rootController"));
exports.router = (0, express_1.Router)();
exports.router.get('/', rootController.root_get);

View File

@ -0,0 +1,27 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const mongoose_1 = __importDefault(require("mongoose"));
const app_1 = require("@/app");
const environment_1 = __importDefault(require("@/utils/environment"));
const globalService_1 = require("@/services/globalService");
const port = environment_1.default.APP_PORT || 8080;
// MongoDB
const dbURI = environment_1.default.DB_URI;
mongoose_1.default
.connect(dbURI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
})
.then(() => {
new globalService_1.Succ(200, 'connected to db');
app_1.app.listen(port, () => {
new globalService_1.Succ(200, `Server is listening on http://localhost:${port}`);
});
})
.catch((err) => {
new globalService_1.Err(500, err);
});

View File

@ -0,0 +1,37 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Succ = exports.Err = void 0;
const colors_1 = __importDefault(require("colors"));
class Err {
constructor(code, message) {
this.code = code;
this.message = message;
this.drop();
}
drop() {
console.log(colors_1.default.bgRed(`${this.code}`) + colors_1.default.bgBlack.red(` ${this.message}`));
return {
code: this.code,
message: this.message,
};
}
}
exports.Err = Err;
class Succ {
constructor(code, message) {
this.code = code;
this.message = message;
this.drop();
}
drop() {
console.log(colors_1.default.bgGreen.black(`${this.code}`) + colors_1.default.green.bgBlack(` ${this.message}`));
return {
code: this.code,
message: this.message,
};
}
}
exports.Succ = Succ;

View File

@ -0,0 +1,7 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.helloWorld = void 0;
const helloWorld = () => {
console.log('hello world');
};
exports.helloWorld = helloWorld;

View File

@ -0,0 +1,27 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const shell = __importStar(require("shelljs"));
// Copy all the view templates
shell.cp('-R', 'src/views', 'dist/');
shell.cp('-R', 'src/public', 'dist/');
shell.cp('-R', 'src/models', 'dist/');
shell.cp('-u', 'src/.env', 'dist/');

View File

@ -0,0 +1,11 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
require('dotenv').config({ path: path_1.default.join(__dirname, '../.env') });
exports.default = {
APP_PORT: Number(process.env.APP_PORT),
DB_URI: String(process.env.DB_URI),
};

23
src/tests/help.test.ts Normal file
View File

@ -0,0 +1,23 @@
import { assert } from 'chai'
import Help from '../help'
import pad from 'pad'
describe('should return help', () => {
it('returns all help', () => {
const help = Help.logHelp()
const correct = Help.allHelp()
assert.equal(help, correct)
})
it('returns make help', () => {
const help = Help.logHelp('make')
const correct = Help.makeHelp()
assert.equal(help, correct)
})
it('returns specific help', () => {
const help = Help.logHelp('setup')
const correct = Help.specificHelp('setup')
assert.equal(help, correct)
})
})

58
src/tests/router.test.ts Normal file
View File

@ -0,0 +1,58 @@
import { assert } from 'chai'
import Routes from '../routes'
describe('should return help', () => {
process.argv = []
it('return all help', () => {
const options = ['-h', '--help']
for (let i = 0; i < options.length; i++) {
process.argv[2] = options[i]
process.argv[3] = ''
const routes = Routes.router()
assert.equal(routes, 'all help')
}
})
it('return specific help', () => {
const options = ['-h', '--help']
for (let i = 0; i < options.length; i++) {
process.argv[2] = options[i]
process.argv[3] = 'make'
const routes = Routes.router()
assert.equal(routes, 'specific help')
}
})
})
describe('should return version', () => {
it('return version', () => {
const options = ['-v', '--version']
for (let i = 0; i < options.length; i++) {
process.argv[2] = options[i]
const routes = Routes.router()
assert.equal(routes, 'version')
}
})
})
describe('should return setup', () => {
it('return setup', () => {
process.argv[2] = 'setup'
process.argv[3] = 'test'
const routes = Routes.router()
assert.equal(routes, 'setup')
})
})
describe('should return make', () => {
const options = ['controller', 'middleware', 'route', 'service', 'model', 'view', 'test', 'interface']
for (let i = 0; i < options.length; i++) {
it(`return make ${options[i]}`, () => {
process.argv[2] = 'make'
process.argv[3] = options[i]
process.argv[4] = 'test'
const routes = Routes.router()
assert.equal(routes, `make ${options[i]}`)
})
}
})

11
src/tests/setup.test.ts Normal file
View File

@ -0,0 +1,11 @@
import { assert } from 'chai'
import Setup from '../setup'
import Global from '../global'
describe('should setup project', () => {
it('setup project', async () => {
const correct: string = Global.logSuccess()
const setup = await Setup.setup(true)
assert.equal(setup, correct)
})
})

View File

@ -0,0 +1,20 @@
import { assert } from 'chai'
import { App } from '../app'
// Describe tests
describe('some demo tests', () => {
// Create tests
it('adds two number together', () => {
assert(2 + 3 === 5)
})
it('should return Hello plus my name', () => {
assert.equal(App.sayHello('Filip'), 'Hello Filip')
assert.notEqual(App.sayHello('Adam'), 'Hello Filip')
})
it('should return Hello plus my name within instance', () => {
const app = new App('Filip')
assert.equal(app.pozdrav(), 'Hello Filip')
})
})

11
src/tests/version.test.ts Normal file
View File

@ -0,0 +1,11 @@
import { assert } from 'chai'
import Version from '../version'
import path from 'path'
describe('should return version', () => {
it('return version', () => {
const pkgJson = require(path.join(__dirname, '../../package'))
const actualVersion = pkgJson.version
assert.equal(Version.show(), `nork ${actualVersion}`)
})
})

10
src/version.ts Normal file
View File

@ -0,0 +1,10 @@
import fs from 'fs-extra'
import path from 'path'
export default class Version {
static show(): string {
const pkgJson = fs.readJsonSync(path.join(__dirname, '../package.json'))
const log = `nork ${pkgJson.version}`
return log
}
}

15
src/views/test.ejs Normal file
View File

@ -0,0 +1,15 @@
<!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">
<title>New Project</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans&display=swap" rel="stylesheet">
</head>
<body>
</body>
</html>

15
src/views/undefined.ejs Normal file
View File

@ -0,0 +1,15 @@
<!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">
<title>New Project</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans&display=swap" rel="stylesheet">
</head>
<body>
</body>
</html>