36 Commits

Author SHA1 Message Date
Allyedge
48990d5732 v0.1.2 changelog 2022-06-06 10:50:23 +02:00
Allyedge
d60da9fd3b v0.1.2 2022-06-06 10:43:47 +02:00
Allyedge
9cead56a35 feat: add extra command 2022-06-06 10:43:23 +02:00
Allyedge
e9560e8874 refactor: revert back to v0.1.1 2022-06-06 10:20:38 +02:00
EvolutionX
336d31a16d ci: update import gpg version 2022-06-05 10:26:29 +05:30
EvolutionX
dbe56fa8d9 ci: final edit release.yml 2022-06-05 10:21:12 +05:30
EvolutionX
5bc0ac68bd ci: update .goreleaser.yml 2022-06-05 10:11:57 +05:30
EvolutionX
c43f6c5a31 fix(ci): updated configuration of go releaser 2022-06-05 09:02:06 +05:30
EvolutionX
c648e0560b chore: release 0.1.2 2022-06-04 23:41:50 +05:30
EvolutionX
b9286cb45a ci: signing builds 2022-06-04 23:36:15 +05:30
Allyedge
5d7dd98c45 feat: update CLI version command 2022-06-03 13:57:49 +02:00
Evo
60aa5263a3 docs(changelog): remove standard-version 2022-06-03 10:14:19 +05:30
Allyedge
a74657d2b1 v0.1.1 2022-06-02 22:12:33 +02:00
Allyedge
b92bf721c8 chore: update workflows 2022-06-02 15:22:39 +02:00
Allyedge
5864b9f023 docs: update readme 2022-06-02 14:55:24 +02:00
Allyedge
c7c295d413 chore: set goreleaser to new tag 2022-06-02 14:12:06 +02:00
Allyedge
860960813f feat: update release.yml 2022-06-02 13:47:48 +02:00
Allyedge
dd355ae76e v0.1.0 2022-06-02 13:42:08 +02:00
Allyedge
a1938d092b refactor: clean up release branches 2022-06-02 13:06:37 +02:00
EvolutionX
93dc560e9d style(*): fixed prettier issues 2022-06-02 16:33:17 +05:30
Evo
5211ce1c7b ci(release): tryna fix release ci (#34)
* ci(release): try to fix the workflow

* chore: add actions branch

* chore: hmm

* chore(release): yeah
2022-06-02 06:39:29 +02:00
Allyedge
57c928240b feat: remove JS linter 2022-06-01 19:49:37 +02:00
Allyedge
93b74ec0a9 feat: remove JS codeql 2022-06-01 19:48:29 +02:00
Allyedge
bf4bd7a868 refactor: update release.yml 2022-06-01 19:42:02 +02:00
Allyedge
f619768bc1 refactor: update package.json 2022-06-01 19:40:40 +02:00
Allyedge
8d32cad01e feat: add go-npm, not finished yet 2022-06-01 19:38:39 +02:00
Allyedge
f7a430d979 feat: add rename package.json, finish init 2022-06-01 19:12:39 +02:00
Allyedge
159cf3f756 style: go mod tidy 2022-05-31 21:25:05 +02:00
Allyedge
f5a4771c37 style: code organization 2022-05-31 21:24:41 +02:00
Allyedge
34c27bd910 feat: add good looking logs 2022-05-31 20:48:17 +02:00
Allyedge
d45f3e04e2 feat: finish initialize, needs better logs 2022-05-31 19:05:45 +02:00
Allyedge
e7abf64230 feat: add install template, needs more features 2022-05-31 15:41:16 +02:00
Allyedge
d37af7762a feat: switch to survey and add all prompts 2022-05-30 12:22:58 +02:00
Allyedge
7d84a82a50 feat: add components to init - wip 2022-05-29 20:57:29 +02:00
Allyedge
b8dfa6891a feat: add init command, needs functionality 2022-05-29 20:13:43 +02:00
Allyedge
321b537a4d feat(go): start rewrite in go 2022-05-29 19:55:20 +02:00
41 changed files with 886 additions and 8951 deletions

1
.github/CODEOWNERS vendored
View File

@@ -1 +1,2 @@
* @Allyedge
* @EvolutionX-10

View File

@@ -0,0 +1,35 @@
name: "CodeQL Go"
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: "40 13 * * 2"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ["go"]
steps:
- name: Checkout repository
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

View File

@@ -1,65 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ main ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ main ]
schedule:
- cron: '40 13 * * 2'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

View File

@@ -1,32 +0,0 @@
name: Lint
on:
# Trigger the workflow on push or pull request,
# but only for the main branch
push:
branches:
- main
pull_request_target:
branches:
- main
jobs:
run-linters:
name: Run linters
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Set up Node.js
uses: actions/setup-node@56337c425554a6be30cdef71bf441f15be286854 # tag=v3
with:
node-version: 17
# ESLint and Prettier must be in `package.json`
- name: Install Node.js dependencies
run: npm i
- name: Run Prettier
run: npm run format

36
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
name: goreleaser
on:
push:
tags:
- "*"
permissions:
contents: write
packages: write
issues: write
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Fetch all tags
run: git fetch --force --tags
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.18
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

118
.gitignore vendored
View File

@@ -1,117 +1 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Editor Files
.vscode
.idea
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
.env.development.local
.env.development
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Extras
.vscode/
# Yarn files
.yarn/install-state.gz
.yarn/build-state.yml
node_modules

9
.goreleaser.yml Normal file
View File

@@ -0,0 +1,9 @@
builds:
- binary: sern
goos:
- windows
- darwin
- linux
goarch:
- amd64
main: ./cmd

View File

@@ -1,2 +0,0 @@
.github/
CHANGELOG.md

View File

@@ -1,5 +0,0 @@
{
"tabWidth": 4,
"useTabs": true,
"singleQuote": true
}

View File

@@ -1,27 +1,31 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
All notable changes to this project will be documented in this file.
### [0.1.1](https://github.com/sern-handler/cli/compare/v0.1.0...v0.1.1) (2022-05-09)
## 0.1.2 (2022-06-04)
The `extra` command was added. It basically helps developers to add things like Dockerfile to their projects with ease.
### Features
* added help command ([ca23d17](https://github.com/sern-handler/cli/commit/ca23d17670663b62e23849e2350deef208bfc100))
* cli is now functional ([5021d28](https://github.com/sern-handler/cli/commit/5021d28bca6ebe1cb4a548f5e595b1220f222c98))
- `extra` command
## 0.1.1 (2022-06-02)
### Bug Fixes
The `go-npm` package was replaced by one of its forks, `@gzuidhof/go-npm`.
* prettier things ([1265224](https://github.com/sern-handler/cli/commit/1265224bb9f93cb104915be50c1c2ea1e3924955))
* removed useless line ([f268b1c](https://github.com/sern-handler/cli/commit/f268b1c62fd4d5823d483a33cfef2e2d7f7b127c))
`@gzuidhof/go-npm` has updated dependencies, and it uses `esbuild`, which is great.
## 0.1.0 (2022-04-21)
### Changes
- Replace `go-npm` with `@gzuidhof/go-npm`.
## 0.1.0 (2022-06-02)
This is the CLI's initial release.
### Features
* added actions and formatting stuff ([b302a8b](https://github.com/sern-handler/cli/commit/b302a8b362257fb2cea72b7e1fc66bea351c511f))
* bump all files to GitHub 🎉 ([01b39ad](https://github.com/sern-handler/cli/commit/01b39ad9b78f0a67e23ba66c10262082675eeed5))
* more questions, better handling, better ui ([f931802](https://github.com/sern-handler/cli/commit/f9318024bb4c62cee1a7ddfc6af4117c22ca6020))
* refactored code and added custom handling of commands ([0e97b7d](https://github.com/sern-handler/cli/commit/0e97b7db8afed7f625eeb0a43aa992441ab49b39))
- `init` command
- `help` command
- `version` command

View File

@@ -1,12 +1,21 @@
# Sern CLI
[![Go](https://img.shields.io/badge/go-%2300ADD8.svg?style=for-the-badge&logo=go&logoColor=white)](https://github.com/sern-handler/cli)
[![Build](https://img.shields.io/github/workflow/status/sern-handler/cli/goreleaser?style=for-the-badge)](https://github.com/sern-handler/cli)
[![NPM](https://img.shields.io/npm/dt/@sern/cli?style=for-the-badge)](https://npmjs.com/@sern/cli)
Our CLI allows you to setup and manage Discord bot projects without writing a single line of code!
😁 **User Friendly** <br>
🔥 **Fast** <br>
💦 **Simple** <br>
🌱 **Efficient** <br>
💪 **Powerful** <br>
## License
[![GitHub License](https://img.shields.io/github/license/sern-handler/cli?style=for-the-badge)](https://github.com/sern-handler/cli)
## Installation
```sh
@@ -29,8 +38,22 @@ When you install the CLI, you can use our commands with **sern** prefix.
## Setting Up Your Project
#### TODO
To create a new project, you can simply run the following command:
```sh
sern init
```
The `init` command will ask you some questions and at the end it will generate a new project.
## Help
If you need help, you can always run the following command:
```sh
sern help
```
## Stats
![Alt](https://repobeats.axiom.co/api/embed/5eb8cf0f79fecee29cc81cd2eca5f6321981304e.svg 'Feel free to contribute')
![Alt](https://repobeats.axiom.co/api/embed/5eb8cf0f79fecee29cc81cd2eca5f6321981304e.svg "Feel free to contribute")

15
cmd/cli/extra.go Normal file
View File

@@ -0,0 +1,15 @@
package cli
import (
"github.com/sern-handler/cli/pkg/extra"
"github.com/spf13/cobra"
)
var extraCmd = &cobra.Command{
Use: "extra",
Short: "Add extra tools to your Sern project.",
Long: `Add extra tools to your Sern project to help you with the setup and development.`,
Run: func(cmd *cobra.Command, args []string) {
extra.Execute()
},
}

15
cmd/cli/init.go Normal file
View File

@@ -0,0 +1,15 @@
package cli
import (
"github.com/sern-handler/cli/pkg/initialize"
"github.com/spf13/cobra"
)
var initCmd = &cobra.Command{
Use: "init",
Short: "Initialize a new Sern project.",
Long: `Initialize a new Sern project, either with a JavaScript or a TypeScript template.`,
Run: func(cmd *cobra.Command, args []string) {
initialize.Initialize()
},
}

30
cmd/cli/root.go Normal file
View File

@@ -0,0 +1,30 @@
package cli
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "sern",
Short: "A powerful CLI tool for Sern.",
Version: "0.1.2",
Run: func(cmd *cobra.Command, args []string) {
cmd.Help()
},
}
func Execute() {
rootCmd.Flags().BoolP("help", "h", false, "Help for the Sern CLI.")
rootCmd.Flags().BoolP("version", "v", false, "The version of the Sern CLI.")
rootCmd.SetVersionTemplate("Sern CLI - Version {{.Version}}\n")
rootCmd.AddCommand(initCmd)
rootCmd.AddCommand(extraCmd)
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

7
cmd/main.go Normal file
View File

@@ -0,0 +1,7 @@
package main
import "github.com/sern-handler/cli/cmd/cli"
func main() {
cli.Execute()
}

View File

@@ -1,99 +0,0 @@
//! Message for Sern CLI developers. Please ignore this file.
const SpinnerName = [
'dots',
'dots2',
'dots3',
'dots4',
'dots5',
'dots6',
'dots7',
'dots8',
'dots9',
'dots10',
'dots11',
'dots12',
'dots8Bit',
'line',
'line2',
'pipe',
'simpleDots',
'simpleDotsScrolling',
'star',
'star2',
'flip',
'hamburger',
'growVertical',
'growHorizontal',
'balloon',
'balloon2',
'noise',
'bounce',
'boxBounce',
'boxBounce2',
'triangle',
'arc',
'circle',
'squareCorners',
'circleQuarters',
'circleHalves',
'squish',
'toggle',
'toggle2',
'toggle3',
'toggle4',
'toggle5',
'toggle6',
'toggle7',
'toggle8',
'toggle9',
'toggle10',
'toggle11',
'toggle12',
'toggle13',
'arrow',
'arrow2',
'arrow3',
'bouncingBar',
'bouncingBall',
'smiley',
'monkey',
'hearts',
'clock',
'earth',
'material',
'moon',
'runner',
'pong',
'shark',
'dqpb',
'weather',
'christmas',
'grenade',
'point',
'layer',
'betaWave',
'fingerDance',
'fistBump',
'soccerHeader',
'mindblown',
'speaker',
'orangePulse',
'bluePulse',
'orangeBluePulse',
'timeTravel',
'aesthetic',
];
// const p = new Promise((resolve) => {
// SpinnerName.forEach((spin, i, ar) => {
// setTimeout(() => {
// spinner.spinner = spin;
// spinner.text = `Initializing... ${spin}`;
// if (i === ar.length - 1) {
// resolve();
// }
// }, i * 1000);
// });
// });
// p.then(() => spinner.succeed('Finished!'));

38
go.mod Normal file
View File

@@ -0,0 +1,38 @@
module github.com/sern-handler/cli
go 1.18
require (
github.com/AlecAivazis/survey/v2 v2.3.4
github.com/go-git/go-git/v5 v5.4.2
github.com/gookit/color v1.5.0
github.com/spf13/cobra v1.4.0
)
require (
github.com/Microsoft/go-winio v0.4.16 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
github.com/acomagu/bufpipe v1.0.3 // indirect
github.com/emirpasic/gods v1.12.0 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.3.1 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
github.com/mattn/go-colorable v0.1.2 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/xanzy/ssh-agent v0.3.0 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect
golang.org/x/net v0.0.0-20210326060303-6b1517762897 // indirect
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
golang.org/x/term v0.0.0-20210503060354-a79de5458b56 // indirect
golang.org/x/text v0.3.3 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)

136
go.sum Normal file
View File

@@ -0,0 +1,136 @@
github.com/AlecAivazis/survey/v2 v2.3.4 h1:pchTU9rsLUSvWEl2Aq9Pv3k0IE2fkqtGxazskAMd9Ng=
github.com/AlecAivazis/survey/v2 v2.3.4/go.mod h1:hrV6Y/kQCLhIZXGcriDCUBtB3wnN7156gMXJ3+b23xM=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ=
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34=
github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8=
github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0=
github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4=
github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w=
golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

8095
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,54 +1,37 @@
{
"name": "@sern/cli",
"version": "0.1.1",
"description": "A CLI for @sern/handler",
"exports": "./src/index.js",
"bin": {
"sern": "./src/index.js"
},
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"release": "standard-version",
"preview": "standard-version --dry-run",
"push": "git push --follow-tags",
"format": "prettier --check .",
"fix": "prettier --write ."
},
"repository": {
"type": "git",
"url": "git+https://github.com/sern-handler/cli.git"
},
"keywords": [
"cli",
"discord",
"discord.js",
"sern",
"sern-handler"
],
"author": "EvolutionX",
"license": "MIT",
"bugs": {
"url": "https://github.com/sern-handler/cli/issues"
},
"homepage": "https://github.com/sern-handler/cli#readme",
"dependencies": {
"colorette": "^2.0.16",
"degit": "^2.8.4",
"execa": "^6.1.0",
"find-up": "6.3.0",
"ora": "^6.1.0",
"prompts": "2.4.2"
},
"devDependencies": {
"cz-conventional-changelog": "3.3.0",
"eslint": "8.15.0",
"prettier": "2.6.2",
"standard-version": "9.5.0"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
}
"name": "@sern/cli",
"version": "0.1.2",
"description": "Our CLI allows you to setup and manage Discord bot projects without writing a single line of code!",
"scripts": {
"postinstall": "go-npm install",
"preuninstall": "go-npm uninstall"
},
"repository": {
"type": "git",
"url": "git+https://github.com/sern-handler/cli.git"
},
"dependencies": {
"@gzuidhof/go-npm": "^0.1.13"
},
"keywords": [
"sern",
"cli",
"discord",
"bot",
"discord.js"
],
"contributors": [
"Allyedge",
"EvolutionX-10"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/sern-handler/cli/issues"
},
"homepage": "https://github.com/sern-handler/cli#readme",
"goBinary": {
"name": "sern",
"path": "./bin",
"url": "https://github.com/sern-handler/cli/releases/download/v{{version}}/cli_{{version}}_{{platform}}_{{arch}}.tar.gz"
}
}

34
pkg/extra/docker.go Normal file
View File

@@ -0,0 +1,34 @@
package extra
import (
"os"
"github.com/gookit/color"
"github.com/sern-handler/cli/pkg/util"
)
func addDockerfile() error {
var dockerfile string
_, err := os.Stat("tsconfig.json")
if err != nil {
dockerfile = "Dockerfile.js"
} else {
dockerfile = "Dockerfile.ts"
}
color.Info.Prompt("Adding Dockerfile...")
err = util.CopyFile("templates/extra/"+dockerfile, "Dockerfile")
if err != nil {
color.Error.Prompt("Couldn't add the Dockerfile, exiting.")
return err
}
color.Info.Prompt("Successfully added the Dockerfile.")
return nil
}

33
pkg/extra/extra.go Normal file
View File

@@ -0,0 +1,33 @@
package extra
import (
"os"
"github.com/AlecAivazis/survey/v2"
"github.com/gookit/color"
)
func Execute() {
answers := struct {
Extra string
}{}
err := survey.Ask(questions, &answers)
if err != nil {
color.Error.Prompt("Adding extras failed, exiting.")
os.Exit(1)
}
switch answers.Extra {
case "Dockerfile":
err = addDockerfile()
if err != nil {
color.Error.Prompt("Adding the Dockerfile failed, exiting.")
os.Exit(1)
}
}
}

13
pkg/extra/questions.go Normal file
View File

@@ -0,0 +1,13 @@
package extra
import "github.com/AlecAivazis/survey/v2"
var questions = []*survey.Question{
{
Name: "extra",
Prompt: &survey.Select{
Message: "What extra do you want to add?",
Options: []string{"Dockerfile"},
},
},
}

View File

@@ -0,0 +1,66 @@
package initialize
import (
"errors"
"os"
"os/exec"
"github.com/gookit/color"
"github.com/sern-handler/cli/pkg/util"
)
func installDependencies(name string, packageManager string) error {
err := os.Chdir(name)
if err != nil {
color.Error.Prompt("Couldn't change to the project's directory.")
return err
}
packageManagers := util.CheckPackageManagers()
if packageManager == "npm" && packageManagers.NPM {
err := exec.Command("npm", "install").Run()
if err != nil {
color.Error.Prompt("Couldn't install the dependencies.")
return err
}
color.Info.Prompt("Successfully installed the dependencies.")
}
if packageManager == "yarn" && packageManagers.Yarn {
err := exec.Command("yarn", "install").Run()
if err != nil {
color.Error.Prompt("Couldn't install the dependencies.")
return err
}
color.Info.Prompt("Successfully installed the dependencies.")
}
if packageManager == "skip" {
color.Warn.Prompt("Skipping the installation of the dependencies.")
}
if !packageManagers.NPM && !packageManagers.Yarn {
color.Error.Prompt("Couldn't find any package managers.")
return errors.New("couldn't find any package managers")
}
err = os.Chdir("..")
if err != nil {
color.Error.Prompt("Couldn't change to the starting directory.")
return err
}
return nil
}

View File

@@ -0,0 +1,86 @@
package initialize
import (
"fmt"
"os"
"github.com/AlecAivazis/survey/v2"
"github.com/gookit/color"
)
func Initialize() {
answers := struct {
Name string
Language string
Main string
Commands string
Package string
}{}
err := survey.Ask(questions, &answers)
if err != nil {
fmt.Println("Project initialization failed, exiting.")
os.Exit(1)
}
color.Info.Prompt("Initializing the project...")
err = cloneRepository(answers.Name, answers.Language)
if err != nil {
color.Error.Prompt("Couldn't generate the project from the templates, exiting.")
err = os.RemoveAll("templates")
if err != nil {
color.Error.Prompt("Couldn't remove the templates folder.")
}
os.Exit(1)
}
err = os.RemoveAll("templates")
if err != nil {
color.Error.Prompt("Couldn't remove the templates folder.")
}
color.Info.Prompt("Successfully generated the project from the templates.")
color.Info.Prompt("Renaming the project's folders...")
err = renameFolders(answers.Name, answers.Main, answers.Commands)
if err != nil {
color.Error.Prompt("Couldn't rename the folders, exiting.")
color.Warn.Prompt("The project was generated, but the folders weren't renamed.\n\nYou can still use the project, but you will have to rename the folders manually.")
os.Exit(1)
}
color.Info.Prompt("Successfully renamed the project's folders.")
color.Info.Prompt("Installing the dependencies...")
err = installDependencies(answers.Name, answers.Package)
if err != nil {
color.Error.Prompt("Couldn't install the dependencies, exiting.")
color.Warn.Prompt("The project was generated, but the dependencies weren't installed.\n\nYou can still use the project, but you will have to install the dependencies manually.")
os.Exit(1)
}
err = renamePackageJson(answers.Name)
if err != nil {
color.Error.Prompt("Couldn't rename the package.json file, exiting.")
color.Warn.Prompt("The project was generated, but the package.json file wasn't updated.\n\nYou can still use the project, but you will have to update the package.json file manually.")
os.Exit(1)
}
color.Success.Prompt("Project successfully initialized.")
}

14
pkg/initialize/models.go Normal file
View File

@@ -0,0 +1,14 @@
package initialize
type PackageJSON struct {
Name string `json:"name"`
Version string `json:"version"`
Description string `json:"description"`
Main string `json:"main"`
Scripts map[string]string `json:"scripts"`
Keywords []string `json:"keywords"`
Author string `json:"author"`
License string `json:"license"`
Dependencies map[string]string `json:"dependencies"`
DevDependencies map[string]string `json:"devDependencies"`
}

View File

@@ -0,0 +1,41 @@
package initialize
import "github.com/AlecAivazis/survey/v2"
var questions = []*survey.Question{
{
Name: "name",
Prompt: &survey.Input{
Message: "What is your project's name?",
},
Validate: survey.Required,
},
{
Name: "language",
Prompt: &survey.Select{
Message: "What language do you want to use?",
Options: []string{"JavaScript", "TypeScript"},
},
},
{
Name: "main",
Prompt: &survey.Input{
Message: "What is your project's main directory?",
Default: "src",
},
},
{
Name: "commands",
Prompt: &survey.Input{
Message: "What is your project's command directory?",
Default: "commands",
},
},
{
Name: "package",
Prompt: &survey.Select{
Message: "What package manager do you want to use?",
Options: []string{"npm", "yarn", "skip"},
},
},
}

76
pkg/initialize/rename.go Normal file
View File

@@ -0,0 +1,76 @@
package initialize
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"github.com/gookit/color"
)
func renameFolders(name string, main string, commands string) error {
if main != "src" {
err := os.Rename(name+"/src", name+"/"+main)
if err != nil {
color.Warn.Prompt("Couldn't rename the main folder.")
return err
}
}
if commands != "commands" {
err := os.Rename(name+"/"+main+"/commands", name+"/"+main+"/"+commands)
if err != nil {
color.Warn.Prompt("Couldn't rename the commands folder.")
return err
}
}
return nil
}
func renamePackageJson(name string) error {
file, err := ioutil.ReadFile(name + "/package.json")
if err != nil {
color.Warn.Prompt("Couldn't read the package.json file.")
return err
}
var packageJSON PackageJSON
err = json.Unmarshal(file, &packageJSON)
if err != nil {
fmt.Println(err)
color.Warn.Prompt("Couldn't unmarshal the package.json file.")
return err
}
packageJSON.Name = name
file, err = json.MarshalIndent(packageJSON, "", " ")
if err != nil {
color.Warn.Prompt("Couldn't marshal the package.json file.")
return err
}
err = ioutil.WriteFile(name+"/package.json", file, 0644)
if err != nil {
color.Warn.Prompt("Couldn't write the package.json file.")
return err
}
return nil
}

View File

@@ -0,0 +1,41 @@
package initialize
import (
"os"
"strings"
"github.com/go-git/go-git/v5"
"github.com/gookit/color"
)
func cloneRepository(name string, language string) error {
_, err := git.PlainClone("templates", false, &git.CloneOptions{
URL: "https://github.com/sern-handler/templates",
Progress: os.Stdout,
})
if err != nil {
color.Error.Prompt("Couldn't install the template.")
return err
}
err = os.Rename("templates/templates/"+strings.ToLower(language), name)
if err != nil {
color.Error.Prompt("Couldn't rename the template to the project's name.")
color.Warn.Prompt("The project was generated, but it wasn't renamed.\n\nYou can still use the project, but you will have to rename it manually.")
return err
}
err = os.RemoveAll("templates")
if err != nil {
color.Error.Prompt("Couldn't remove the templates folder.")
return err
}
return nil
}

59
pkg/util/util.go Normal file
View File

@@ -0,0 +1,59 @@
package util
import (
"io"
"os"
"os/exec"
)
type PackageManagers struct {
NPM bool
Yarn bool
}
func CheckPackageManagers() PackageManagers {
packageManagers := PackageManagers{
NPM: false,
Yarn: false,
}
_, err := exec.LookPath("npm")
if err == nil {
packageManagers.NPM = true
}
_, err = exec.LookPath("yarn")
if err == nil {
packageManagers.Yarn = true
}
return packageManagers
}
func CopyFile(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
return out.Close()
}

View File

@@ -1,17 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:base"],
"major": {
"dependencyDashboardApproval": true
},
"schedule": ["every weekend"],
"lockFileMaintenance": {
"enabled": true
},
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch"],
"matchCurrentVersion": "!/^0/"
}
]
}

View File

@@ -1,6 +0,0 @@
import { version } from '../utilities/version.js';
export function help({ flags }) {
if (flags?.includes('v') || flags?.includes('version')) return version();
console.log('This is the Sern CLI help section.\n\n' + 'Fill me up later!');
}

View File

@@ -1,109 +0,0 @@
import prompts from 'prompts';
import ora from 'ora';
import { redBright, yellowBright } from 'colorette';
import { execa } from 'execa';
import {
cmds_dir,
default_prefix,
lang,
main_dir,
gitInit,
which_manager,
skip_install_dep,
name,
} from '../prompts/init.js';
import { npm } from '../utilities/npm.js';
import { cloneRepo, installDeps } from '../utilities/install.js';
import { editDirs, editMain } from '../utilities/edits.js';
const { prompt } = prompts;
export async function init({ flags }) {
// * Check if node version is valid
const node = await execa('node', ['--version']);
if (/v1(([0-6]\.[2-9])|([0-5]\.[0-9]))/gm.test(node.stdout)) {
console.log(
yellowBright(
`\nYou are using Node ${node.stdout}\nPlease upgrade to Node 16.10.x or higher!\n`
)
);
process.exit(1);
}
let data;
let git_init;
let pm;
if (flags?.includes('y')) {
const projectName = await prompt([name]);
git_init = true;
pm = 'npm';
data = {
name: projectName.name,
lang: 'typescript',
main_dir: 'src',
cmds_dir: 'commands',
default_prefix: '!',
};
} else {
data = await prompt([name, lang, main_dir, cmds_dir, default_prefix]);
git_init = (await prompt([gitInit])).gitinit;
pm = await npm();
}
if (Object.keys(data).length < 5) process.exit(1);
await cloneRepo(data.lang, data.name);
git_init ? await git(data) : console.log(`Skipping git init...\n`);
let choice = '';
if (pm === 'both') {
const chosen = await prompt([which_manager]);
choice = chosen.manager;
} else {
const chosen = await prompt([skip_install_dep]);
choice = chosen.skip_install_dep ? pm : 'skip';
}
await installDeps(choice, data.name);
await editMain(data.name);
await editDirs(data.main_dir, data.cmds_dir, data.name);
}
/**
* It initializes git
* @param data - The data object that contains the name of the project.
*/
async function git(data) {
const spin = ora({
text: 'Initializing git...',
spinner: 'aesthetic',
}).start();
const exe = await execa('git', ['init', data.name]);
await wait(300);
if (!exe || exe?.failed) {
spin.fail(
`${redBright('Failed')} to initialize git!` +
'\nMaybe you should run git init?'
);
process.exit(1);
}
spin.succeed('Git initialized!');
}
/**
* Wait for a specified number of milliseconds, then return a promise that resolves to undefined.
* @param {number} ms - The number of milliseconds to wait.
* @returns A function that takes a single argument, ms, and returns a promise that resolves after ms
* milliseconds.
*/
async function wait(ms) {
const wait = (await import('util')).promisify(setTimeout);
return wait(ms);
}

View File

@@ -1,28 +0,0 @@
#!/usr/bin/env node
import { init } from './commands/init.js';
import { help } from './commands/help.js';
const regex = /(?<=--|-)\w+/gm;
const rawArgs = process.argv.slice(2);
const flags = rawArgs.join(' ').match(regex);
const args = rawArgs
.join(' ')
.trim()
.split(/ +/)
.filter((e) => !/(--|-)\w+/gm.test(e));
const cmdName = args[0] || '';
const commands = new Map([
['help', help],
['', help],
['init', init],
]);
const found = commands.get(cmdName);
if (found) {
await found({ args, flags });
} else console.log('Unknown Command');

View File

@@ -1,106 +0,0 @@
import { blueBright } from 'colorette';
export const lang = {
message: 'What language do you want the project to be in?',
name: 'lang',
type: 'select',
choices: [
{
title: 'JavaScript',
description: 'JS',
value: 'javascript',
disabled: true,
},
{
title: 'TypeScript',
description: 'TS',
value: 'typescript',
selected: true,
},
],
};
export const default_prefix = {
message:
'What is the default prefix for your bot? Type "none" if it is completely Application-Command based',
name: 'prefix',
type: 'text',
initial: '!',
};
export const main_dir = {
message: 'What is the main directory of your project?',
name: 'main_dir',
type: 'text',
initial: 'src',
};
export const cmds_dir = {
message: 'What is the directory of your commands?',
name: 'cmds_dir',
type: 'text',
initial: 'commands',
validate: (dir) =>
dir === 'src' ? 'You can not use src as a directory' : true,
};
/**
* @type {import('prompts').PromptObject}
*/
export const npmInit = {
name: 'npm_init',
type: 'confirm',
message: `Do you want ${blueBright('me')} to initialize npm?`,
initial: true,
};
export const gitInit = {
name: 'gitinit',
type: 'confirm',
message: `Do you want to ${blueBright('me')} to initialize git?`,
initial: true,
};
export const which_manager = {
message: `Which manager do you want to use?`,
name: 'manager',
type: 'select',
choices: [
{
title: 'NPM',
description: 'Default Package Manager',
selected: true,
value: 'npm',
},
{
title: 'Yarn',
description: 'Yarn Package Manager',
value: 'yarn',
},
{
title: 'Skip',
description: 'Skip selection',
value: 'skip',
},
],
};
export const skip_install_dep = {
name: 'skip_install_dep',
type: 'confirm',
message: `Do you want ${blueBright('me')} to install dependencies?`,
initial: false,
};
/**
* @type {import('prompts').PromptObject}
*/
export const name = {
message: 'What is your project name?',
name: 'name',
type: 'text',
validate: (name) =>
name.match('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$')
? true
: 'Invalid name',
};

View File

@@ -1,75 +0,0 @@
import { readFile, rename, writeFile } from 'node:fs/promises';
import { findUp } from 'find-up';
/**
* It takes a string, finds the package.json file in the directory of the string, and changes the name
* of the package.json file to the string.
* @param {string} name - The name of the project.
* @returns A promise.
*/
export async function editMain(name) {
const pjLocation = await findUp('package.json', {
cwd: process.cwd() + '/' + name,
});
const output = JSON.parse(await readFile(pjLocation, 'utf8'));
if (!output) throw new Error("Can't read your package.json.");
output.name = name;
return writeFile(pjLocation, JSON.stringify(output, null, 2));
}
export async function editDirs(
srcName,
cmds_dirName,
name,
lang = 'typescript'
) {
const path = await findUp('src', {
cwd: process.cwd() + '/' + name,
type: 'directory',
});
const ext = lang === 'typescript' ? 'ts' : 'js';
const newMainDir = path?.replace('src', srcName);
await rename(path, newMainDir);
const cmdsPath = await findUp('commands', {
cwd: process.cwd() + '/' + name + '/' + srcName,
type: 'directory',
});
const index = await findUp(`index.${ext}`, {
cwd: process.cwd() + '/' + name + '/' + srcName,
});
const newCmdsPath = cmdsPath?.replace('commands', cmds_dirName);
await rename(cmdsPath, newCmdsPath);
const tsconfig = await findUp('tsconfig.json', {
cwd: process.cwd() + '/' + name,
});
if (tsconfig) {
const output = JSON.parse(await readFile(tsconfig, 'utf8'));
if (!output) throw new Error("Can't read your tsconfig.json.");
output.compilerOptions.rootDir = srcName;
writeFile(tsconfig, JSON.stringify(output, null, 2));
}
const output = await readFile(index, 'utf8');
const oldfold = ext === 'ts' ? 'dist' : 'src';
const newfold = ext === 'ts' ? 'dist' : srcName;
const regex = new RegExp(`commands: '${oldfold}/commands'`);
const edit = output.replace(
regex,
`commands: '${newfold}/${cmds_dirName}'`
);
return writeFile(index, edit);
}

View File

@@ -1,97 +0,0 @@
import { execa } from 'execa';
import { redBright } from 'colorette';
import fs from 'fs';
import os from 'os';
import path from 'path';
import { readFile } from 'fs/promises';
import { findUp } from 'find-up';
import ora from 'ora';
import degit from 'degit';
/**
* It installs dependencies from a package.json file
* @param choice - The package manager to use.
* @param name - The name of the project
* @returns a promise.
*/
export async function installDeps(choice, name) {
const pkg = await findUp('package.json', {
cwd: process.cwd() + '/' + name,
});
if (!pkg) throw new Error('No package.json found!');
const output = JSON.parse(await readFile(pkg, 'utf8'));
if (!output) throw new Error("Can't read file.");
const deps = output.dependencies;
if (!deps) throw new Error("Can't find dependencies.");
if (choice === 'skip') {
return console.log('Skipped.');
}
const spin = ora({
text: `Installing dependencies...`,
spinner: 'aesthetic',
}).start();
const result = await execa(choice, ['install'], {
cwd: process.cwd() + '/' + name,
}).catch(() => null);
if (!result || result?.failed) {
spin.fail(`${redBright('Failed')} to install dependencies!`);
return process.exit(1);
} else spin.succeed(`Dependencies installed!`);
}
/**
* Clone the repo, copy the files from the repo to the new project directory, and delete the repo
* @param {string} lang - The language of the template
* @param {string} name - The name of the project
*/
export async function cloneRepo(lang, name) {
const isCached = fs.existsSync(
path.join(os.homedir(), '.degit/github/sern-handler/templates')
);
const emitter = degit('sern-handler/templates/templates', {
cache: isCached,
force: true,
});
await emitter.clone('templates');
copyRecursiveSync(`templates/${lang}`, name);
fs.rmSync('templates', { recursive: true, force: true });
}
/**
* If the source is a directory, create the destination directory and then recursively copy the
* contents of the source directory to the destination directory. If the source is not a directory,
* copy the source file to the destination file
* @param {string} src - The source path.
* @param {string} dest - The destination folder where the files will be copied to.
*/
function copyRecursiveSync(src, dest) {
const exists = fs.existsSync(src);
const stats = exists && fs.statSync(src);
const isDirectory = exists && stats.isDirectory();
if (isDirectory) {
fs.mkdirSync(dest);
fs.readdirSync(src).forEach(function (childItemName) {
copyRecursiveSync(
path.join(src, childItemName),
path.join(dest, childItemName)
);
});
} else {
fs.copyFileSync(src, dest);
}
}
// async function wait(ms) {
// const wait = (await import('util')).promisify(setTimeout);
// return wait(ms);
// }

View File

@@ -1,25 +0,0 @@
import { execa } from 'execa';
/**
* It checks if you have npm or yarn installed, and returns a string based on the result
* @returns A promise that resolves to a string.
*/
export async function npm() {
const npm = await execa('npm', ['-v']).catch(() => null);
const npm_version = npm?.stdout;
const yarn = await execa('yarn', ['-v']).catch(() => null);
const yarn_version = yarn?.stdout;
if (npm_version && !yarn_version) {
return 'npm';
}
if (!npm_version && yarn_version) {
return 'yarn';
}
if (npm_version && yarn_version) {
return 'both';
}
}

View File

@@ -1,7 +0,0 @@
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const { version: v } = require('../../package.json');
export function version() {
console.log(`SernHandler CLI v${v}`);
}

View File

@@ -0,0 +1,11 @@
FROM node:latest
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN node src/index.js

View File

@@ -0,0 +1,13 @@
FROM node:latest
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN tsc --build
RUN node dist/index.js