mirror of
https://github.com/filiprojek/nork.git
synced 2025-02-20 01:22:58 +01:00
rewriting to oop and typescript
This commit is contained in:
237
src/app.js
237
src/app.js
@ -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
9
src/app.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import Routes from './routes'
|
||||
|
||||
export class App {
|
||||
constructor() {
|
||||
Routes.router()
|
||||
}
|
||||
}
|
||||
|
||||
new App()
|
6
src/controllers/test.ts
Normal file
6
src/controllers/test.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { Request, Response } from 'express'
|
||||
|
||||
export const root_get = (req: Request, res: Response) => {
|
||||
res.render('home')
|
||||
return true
|
||||
}
|
6
src/controllers/undefined.ts
Normal file
6
src/controllers/undefined.ts
Normal 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
16
src/global.ts
Normal 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
66
src/help.ts
Normal 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()
|
||||
}
|
||||
}
|
3
src/interfaces/GlobalInterface.ts
Normal file
3
src/interfaces/GlobalInterface.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export interface Norkcfg {
|
||||
lang: string
|
||||
}
|
15
src/interfaces/SetupInterface.ts
Normal file
15
src/interfaces/SetupInterface.ts
Normal 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
4
src/interfaces/test.ts
Normal file
@ -0,0 +1,4 @@
|
||||
export interface interfaceName {
|
||||
hello: string
|
||||
world: boolean | null | undefined
|
||||
}
|
4
src/interfaces/undefined.ts
Normal file
4
src/interfaces/undefined.ts
Normal file
@ -0,0 +1,4 @@
|
||||
export interface interfaceName {
|
||||
hello: string
|
||||
world: boolean | null | undefined
|
||||
}
|
@ -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
76
src/make.ts
Normal 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
8
src/middlewares/test.ts
Normal 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()
|
||||
})
|
8
src/middlewares/undefined.ts
Normal file
8
src/middlewares/undefined.ts
Normal 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
15
src/models/test.ts
Normal 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
15
src/models/undefined.ts
Normal 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
41
src/routes.ts
Normal 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
6
src/routes/test.ts
Normal 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
6
src/routes/undefined.ts
Normal 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
3
src/services/test.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export function helloWorld() {
|
||||
console.log('hello world')
|
||||
}
|
3
src/services/undefined.ts
Normal file
3
src/services/undefined.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export function helloWorld() {
|
||||
console.log('hello world')
|
||||
}
|
24
src/setup.ts
Normal file
24
src/setup.ts
Normal 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()
|
||||
}
|
||||
}
|
39
src/skeletons/express-ts/src/app.js
Normal file
39
src/skeletons/express-ts/src/app.js
Normal 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);
|
@ -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;
|
@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
7
src/skeletons/express-ts/src/middlewares/index.js
Normal file
7
src/skeletons/express-ts/src/middlewares/index.js
Normal 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);
|
@ -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();
|
||||
});
|
11
src/skeletons/express-ts/src/routes/index.js
Normal file
11
src/skeletons/express-ts/src/routes/index.js
Normal 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');
|
||||
});
|
26
src/skeletons/express-ts/src/routes/rootRoutes.js
Normal file
26
src/skeletons/express-ts/src/routes/rootRoutes.js
Normal 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);
|
27
src/skeletons/express-ts/src/server.js
Normal file
27
src/skeletons/express-ts/src/server.js
Normal 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);
|
||||
});
|
37
src/skeletons/express-ts/src/services/globalService.js
Normal file
37
src/skeletons/express-ts/src/services/globalService.js
Normal 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;
|
7
src/skeletons/express-ts/src/services/rootService.js
Normal file
7
src/skeletons/express-ts/src/services/rootService.js
Normal 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;
|
27
src/skeletons/express-ts/src/utils/copyAssets.js
Normal file
27
src/skeletons/express-ts/src/utils/copyAssets.js
Normal 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/');
|
11
src/skeletons/express-ts/src/utils/environment.js
Normal file
11
src/skeletons/express-ts/src/utils/environment.js
Normal 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
23
src/tests/help.test.ts
Normal 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
58
src/tests/router.test.ts
Normal 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
11
src/tests/setup.test.ts
Normal 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)
|
||||
})
|
||||
})
|
20
src/tests/test.test.ts.old
Normal file
20
src/tests/test.test.ts.old
Normal 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
11
src/tests/version.test.ts
Normal 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
10
src/version.ts
Normal 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
15
src/views/test.ejs
Normal 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
15
src/views/undefined.ejs
Normal 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>
|
Reference in New Issue
Block a user