import { knex } from "../lib/ormish.js" ;
import { question } from "readline-sync" ;
import { main as devsvc } from "./devsvc.js" ;
import { glob , exec , mkdir , copy } from "../lib/builderator.js" ;
import path from "path" ;
import { existsSync as exists } from "fs" ;
export const description = "Initializes a fresh bando project" ;
export const options = [
[ "--force" , "DANGER! overwite config files with templates" ] ,
[ "--templates" , "what to use as a template directory" , "./commands/templates" ] ,
] ;
// I did have chalk here but not sure so removed it for now
const warn = console . warn ;
const good = console . log ;
const error = console . error ;
const dirs = [ "./debug/emails" , "./debug/errors" , "./secrets" ] ;
const copy _templates = ( templates , force ) => {
good ( "Copying templates to your project. You can commit these to git." ) ;
const source _files = glob ( ` ${ templates } /**/* ` ) ;
for ( let template of source _files ) {
// need to add a . for the path to be local
const dest = "." + template . slice ( templates . length ) ;
if ( force || ! exists ( dest ) ) {
good ( template , "->" , dest ) ;
copy ( template , dest ) ;
} else {
good ( "SKIPPING" , dest ) ;
}
}
}
export const main = async ( opts ) => {
good ( "Creating configuration directories." ) ;
dirs . forEach ( d => mkdir ( d ) ) ;
warn ( "!!! WARNING!: Do not add the contents of secrets to your git repository." ) ;
copy _templates ( opts . templates , opts . force ) ;
good ( "Starting redis for your OS so you can register an admin." ) ;
devsvc ( { start : true , noexit : true } ) ;
good ( "Generating the documentation first time..." ) ;
exec ( "npm run docs" ) ;
good ( "Documentation done." ) ;
good ( "Migrating your database just in case." ) ;
exec ( "npm run knex migrate:latest" )
good ( "In another window start the app server with: npm run DANGER_ADMIN" ) ;
question ( "When you're done hit ENTER." ) ;
// open the registration page
const url = "http://127.0.0.1:5001/client/#/register/"
good ( ` Opening ${ url } ` ) ;
if ( process . platform === "win32" ) {
exec ( ` start ${ url } ` ) ;
} else if ( process . platform === "darwin" ) {
exec ( ` open ${ url } ` ) ;
} else {
warn ( ` \n On linux you just open the link yourself: \n ${ url } \n ` ) ;
}
question ( "Register your admin user and hit ENTER." ) ;
// run a sql command to update the first user to admin
warn ( "Changing user id 1 to admin: true" ) ;
let result = await knex ( "user" ) . where ( { id : 1 } ) . update ( { admin : 1 } ) ;
if ( result !== 1 ) {
error ( ` Expected to only change one record in user but changed ${ result } . You'll have to change your user to admin manually. ` ) ;
} else {
good ( "Updated the user at id 1 to have admin access." ) ;
}
knex . destroy ( ) ;
good ( "FINISHED! You can now edit the project to make what you want." ) ;
process . exit ( 0 ) ;
}