mirror of
https://github.com/sern-handler/cli
synced 2026-06-06 09:26:52 +00:00
Compare commits
78 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6212fb3588 | ||
|
|
2018c4381e | ||
|
|
5b0214a073 | ||
|
|
6e6ed3136d | ||
|
|
c302e1e4be | ||
|
|
e60fb42e3e | ||
|
|
5e48f27584 | ||
|
|
276b9656b8 | ||
|
|
75dff367f5 | ||
|
|
90429523c3 | ||
|
|
bed31c1f49 | ||
|
|
9271da3076 | ||
|
|
2009d1fdca | ||
|
|
f9aa2c3d20 | ||
|
|
3fa93bd903 | ||
|
|
e7c50c4d32 | ||
|
|
b1190efee3 | ||
|
|
55b1fff28e | ||
|
|
7bcbf55fb5 | ||
|
|
ebc688022e | ||
|
|
810763837c | ||
|
|
fa331ae0c0 | ||
|
|
6c034a568f | ||
|
|
9158e66bb4 | ||
|
|
af593bf84a | ||
|
|
f84e7ac8f5 | ||
|
|
08b8a13d16 | ||
|
|
c4f8e45bdc | ||
|
|
83e841a341 | ||
|
|
ab2f8016b6 | ||
|
|
93ef62bc9d | ||
|
|
e454ddaaab | ||
|
|
e3ee6d5428 | ||
|
|
02eec5f926 | ||
|
|
aa1e11b24a | ||
|
|
39817e6b4f | ||
|
|
a0d5890ea7 | ||
|
|
2fa5a360ef | ||
|
|
1e07b5f1c8 | ||
|
|
c312ca794c | ||
|
|
eee3bb8db6 | ||
|
|
d9ea304fa6 | ||
|
|
52725ea7f6 | ||
|
|
b24a053d1c | ||
|
|
419b7bce22 | ||
|
|
5a24ae4819 | ||
|
|
8f6b1c690f | ||
|
|
46ec745b88 | ||
|
|
6472683c19 | ||
|
|
2b260eb1bc | ||
|
|
428b87ee1f | ||
|
|
493189772f | ||
|
|
dff1481e19 | ||
|
|
9264dde532 | ||
|
|
ffc1e6f3eb | ||
|
|
95c20a3edf | ||
|
|
c351bd5c0b | ||
|
|
f218e6524b | ||
|
|
afd0b46ffc | ||
|
|
c730986264 | ||
|
|
03dddd4384 | ||
|
|
177766e357 | ||
|
|
7cbde33af2 | ||
|
|
58922bf69e | ||
|
|
92b713e476 | ||
|
|
94757d67cb | ||
|
|
6253571095 | ||
|
|
c4c9b11bc2 | ||
|
|
e06ae29fa1 | ||
|
|
d455a9ef30 | ||
|
|
9bd2b0f38b | ||
|
|
330b2ee92d | ||
|
|
8c45327094 | ||
|
|
361e6451a7 | ||
|
|
81eabff53e | ||
|
|
d78c20a491 | ||
|
|
a97bfdf9ee | ||
|
|
7276c2cb21 |
32
.github/workflows/auto-deprecate.yml
vendored
Normal file
32
.github/workflows/auto-deprecate.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
name: NPM Auto Deprecate
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
auto-deprecate:
|
||||
name: NPM Auto Deprecate
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Project
|
||||
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
|
||||
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
|
||||
with:
|
||||
node-version: 17
|
||||
registry-url: 'https://registry.npmjs.org/'
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm i
|
||||
- name: Deprecate dev versions
|
||||
run: npx npm-deprecate --name "*dev*" --package "@sern/cli" --message "This is a deprecated version of @sern/cli@dev. Please use the latest dev version."
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
- name: Deprecate pr versions
|
||||
run: npx npm-deprecate --name "*pr*" --package "@sern/cli" --message "This is a deprecated version of @sern/cli. Please use the latest version."
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
26
.github/workflows/continuous-delivery.yml
vendored
26
.github/workflows/continuous-delivery.yml
vendored
@@ -1,12 +1,16 @@
|
||||
name: Continuous Delivery
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'src/**'
|
||||
- 'package.json'
|
||||
|
||||
jobs:
|
||||
Build:
|
||||
name: Building
|
||||
Publish:
|
||||
name: Publishing Dev
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
@@ -14,13 +18,13 @@ jobs:
|
||||
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # tag=v3
|
||||
uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
|
||||
with:
|
||||
node-version: 17
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm i
|
||||
run: npm i && npm run build
|
||||
|
||||
- name: Link Project
|
||||
run: npm link
|
||||
@@ -28,13 +32,9 @@ jobs:
|
||||
- name: Test Sern
|
||||
run: sern
|
||||
|
||||
Publish:
|
||||
name: Publishing to npm
|
||||
runs-on: ubuntu-latest
|
||||
needs: [Build]
|
||||
steps:
|
||||
- name: Publish to npm
|
||||
run: npm publish
|
||||
run: |
|
||||
npm version premajor --preid "dev.$(git rev-parse --verify --short HEAD)" --git-tag-version=false
|
||||
npm publish --tag dev
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
|
||||
8
.github/workflows/continuous-integration.yml
vendored
8
.github/workflows/continuous-integration.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # tag=v3
|
||||
uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
|
||||
with:
|
||||
node-version: 17
|
||||
|
||||
@@ -40,15 +40,15 @@ jobs:
|
||||
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # tag=v3
|
||||
uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
|
||||
with:
|
||||
node-version: 17
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm i
|
||||
run: npm i && npm run build
|
||||
|
||||
- name: Link Project
|
||||
run: npm link
|
||||
|
||||
- name: Test Sern
|
||||
- name: Test sern
|
||||
run: sern
|
||||
|
||||
40
.github/workflows/publish.yml
vendored
Normal file
40
.github/workflows/publish.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
name: Publish
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
prNumber:
|
||||
description: The number of the PR that is being deployed
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
Publish:
|
||||
name: Publishing
|
||||
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@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
|
||||
with:
|
||||
node-version: 17
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm i
|
||||
|
||||
- name: Link Project
|
||||
run: npm link
|
||||
|
||||
- name: Test sern
|
||||
run: sern
|
||||
|
||||
- name: Publish to npm
|
||||
run: |
|
||||
TAG=$(echo 'pr-${{ github.event.inputs.prNumber }}')
|
||||
npm version premajor --preid "${TAG}.$(git rev-parse --verify --short HEAD)" --git-tag-version=false
|
||||
npm publish --tag ${TAG}
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
32
.github/workflows/release-please.yml
vendored
Normal file
32
.github/workflows/release-please.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
Release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: google-github-actions/release-please-action@v3
|
||||
id: release
|
||||
with:
|
||||
release-type: node
|
||||
bump-patch-for-minor-pre-major: true
|
||||
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
- uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
|
||||
with:
|
||||
node-version: 17
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
- run: npm i
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
- run: npm link
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
- run: sern
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
- run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
6
.npmignore
Normal file
6
.npmignore
Normal file
@@ -0,0 +1,6 @@
|
||||
renovate.json
|
||||
tsconfig.json
|
||||
.prettierignore
|
||||
.prettierrc
|
||||
.gitattributes
|
||||
.github/
|
||||
@@ -1,2 +1,3 @@
|
||||
.github/
|
||||
CHANGELOG.md
|
||||
CHANGELOG.md
|
||||
dist/
|
||||
84
CHANGELOG.md
84
CHANGELOG.md
@@ -1,6 +1,88 @@
|
||||
# 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.5.0](https://github.com/sern-handler/cli/compare/v0.4.2...v0.5.0) (2022-09-16)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* re-write to TypeScript
|
||||
|
||||
### Features
|
||||
|
||||
* add engine for node version & remove manual version check ([#72](https://github.com/sern-handler/cli/issues/72)) ([2009d1f](https://github.com/sern-handler/cli/commit/2009d1fdca9a383d219304fd3cb48a622355b7dc))
|
||||
* adds the esm template option + refactors ([#73](https://github.com/sern-handler/cli/issues/73)) ([9271da3](https://github.com/sern-handler/cli/commit/9271da30764f86225385e8ae6448b99d66687294))
|
||||
* re-write to TypeScript ([bed31c1](https://github.com/sern-handler/cli/commit/bed31c1f4995bbf7d8d0a483f562788172e29919))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 0.5.0 ([2018c43](https://github.com/sern-handler/cli/commit/2018c4381e665b9b0c5e70a203aa0dfd9fdd3cef))
|
||||
|
||||
## [0.4.2](https://github.com/sern-handler/cli/compare/v0.4.1...v0.4.2) (2022-07-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* switch to undici ([#58](https://github.com/sern-handler/cli/issues/58)) ([c4f8e45](https://github.com/sern-handler/cli/commit/c4f8e45bdc0af5a3bbd394d2b9f852f4a946114c))
|
||||
|
||||
## [0.4.1](https://github.com/sern-handler/cli/compare/v0.4.0...v0.4.1) (2022-07-07)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add `sern.config.json` ([#38](https://github.com/sern-handler/cli/issues/38)) ([3eb6383](https://github.com/sern-handler/cli/commit/3eb63835d9f6ff3f3426e017ea87344c00bb13a4))
|
||||
* add basic type checking ([eb85a7a](https://github.com/sern-handler/cli/commit/eb85a7a8f2f6252f719fd396d42cded2d9eb0918))
|
||||
* add commander and start plugins installer ([#36](https://github.com/sern-handler/cli/issues/36)) ([b2e6236](https://github.com/sern-handler/cli/commit/b2e6236dde6f4848dde6fc23a6222415824bb294))
|
||||
* add default settings for the -y flag ([#19](https://github.com/sern-handler/cli/issues/19)) ([e5f607e](https://github.com/sern-handler/cli/commit/e5f607e99875e105cbb148cab3ed1bbc3771ae35))
|
||||
* added actions and formatting stuff ([b302a8b](https://github.com/sern-handler/cli/commit/b302a8b362257fb2cea72b7e1fc66bea351c511f))
|
||||
* added help command ([ca23d17](https://github.com/sern-handler/cli/commit/ca23d17670663b62e23849e2350deef208bfc100))
|
||||
* Added version command & created readme ([#25](https://github.com/sern-handler/cli/issues/25)) ([7535a5e](https://github.com/sern-handler/cli/commit/7535a5e0267c9e682b7bc8470206c0597f5ba9a1))
|
||||
* bump all files to GitHub 🎉 ([01b39ad](https://github.com/sern-handler/cli/commit/01b39ad9b78f0a67e23ba66c10262082675eeed5))
|
||||
* cli is now functional ([65f38f3](https://github.com/sern-handler/cli/commit/65f38f3eb2b4e8e2bd136b9bd8f37f1966be1661))
|
||||
* cli is now functional ([5021d28](https://github.com/sern-handler/cli/commit/5021d28bca6ebe1cb4a548f5e595b1220f222c98))
|
||||
* create typescript dockerfile and the extra command ([#28](https://github.com/sern-handler/cli/issues/28)) ([b1a8683](https://github.com/sern-handler/cli/commit/b1a86833734258e0a22da18c2c780133c199d5cd))
|
||||
* enable extra command & jsdockerfile ([#43](https://github.com/sern-handler/cli/issues/43)) ([7cf62c0](https://github.com/sern-handler/cli/commit/7cf62c03083b8ebbb8a6a63fd8efe592344d5230))
|
||||
* **init:** add --sync flag ([#53](https://github.com/sern-handler/cli/issues/53)) ([b24a053](https://github.com/sern-handler/cli/commit/b24a053d1cb8c00d49a96b6d536dd17205b9fa0e))
|
||||
* making sern help message look better, adding ascii art ([#50](https://github.com/sern-handler/cli/issues/50)) ([9bd2b0f](https://github.com/sern-handler/cli/commit/9bd2b0f38be835a31fceeabdf60487a1424cdf7e))
|
||||
* more questions, better handling, better ui ([f931802](https://github.com/sern-handler/cli/commit/f9318024bb4c62cee1a7ddfc6af4117c22ca6020))
|
||||
* now edits the directories as per user's choice ([fec1c8e](https://github.com/sern-handler/cli/commit/fec1c8e24c5ca7752f9e74b0fc3a32716bb42299))
|
||||
* plugin command!!! ([#45](https://github.com/sern-handler/cli/issues/45)) ([895a489](https://github.com/sern-handler/cli/commit/895a48910e32813f8aa25f57302a4123fc631c2c))
|
||||
* rebase changes ([cae3c59](https://github.com/sern-handler/cli/commit/cae3c597c3da6aa836fb9c70b8555814e8fc5db0))
|
||||
* refactored code and added custom handling of commands ([0e97b7d](https://github.com/sern-handler/cli/commit/0e97b7db8afed7f625eeb0a43aa992441ab49b39))
|
||||
* **skip:** option to skip package manager selection ([#20](https://github.com/sern-handler/cli/issues/20)) ([7b1d535](https://github.com/sern-handler/cli/commit/7b1d53520f0aa35e48b72d61d2f1a85ffdfdfec8))
|
||||
* using degit to clone the templates ([ddb0285](https://github.com/sern-handler/cli/commit/ddb02850f2096d8c9ec36e766ea74e10d2efce3f))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* avoid crashing of cli when no plugin found ([#47](https://github.com/sern-handler/cli/issues/47)) ([8c45327](https://github.com/sern-handler/cli/commit/8c45327094b2560f7b5c813a1c1925920bd46038))
|
||||
* fix degit erroring when there's no cache ([fc01554](https://github.com/sern-handler/cli/commit/fc01554fae2726f4ebd39a66ef1cb634a421dd9f))
|
||||
* **install.js:** fix mistyped. cached -> cache ([fa68936](https://github.com/sern-handler/cli/commit/fa689360ce054c63dab77e8b8f0b794b3b8736e4))
|
||||
* no more crashing cli if yarn isnt present ([#24](https://github.com/sern-handler/cli/issues/24)) ([88893a3](https://github.com/sern-handler/cli/commit/88893a35cd1144867713de32c5bf52c2dc702450))
|
||||
* no more error when selecting js ([cc410bd](https://github.com/sern-handler/cli/commit/cc410bd370a751833dbc5fc04030bfa53a6c1fd2))
|
||||
* prettier things ([1265224](https://github.com/sern-handler/cli/commit/1265224bb9f93cb104915be50c1c2ea1e3924955))
|
||||
* removed useless line ([f268b1c](https://github.com/sern-handler/cli/commit/f268b1c62fd4d5823d483a33cfef2e2d7f7b127c))
|
||||
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* **init.js:** string.match -> regex.test for node version ([f760dbc](https://github.com/sern-handler/cli/commit/f760dbc6e39e098496f25a5c4ee90855a2bb3bd5))
|
||||
|
||||
### [0.2.2](https://github.com/sern-handler/cli/compare/v0.2.1...v0.2.2) (2022-07-05)
|
||||
|
||||
### [0.2.1](https://github.com/sern-handler/cli/compare/v0.2.0...v0.2.1) (2022-07-05)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* making sern help message look better, adding ascii art ([#50](https://github.com/sern-handler/cli/issues/50)) ([9bd2b0f](https://github.com/sern-handler/cli/commit/9bd2b0f38be835a31fceeabdf60487a1424cdf7e))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* avoid crashing of cli when no plugin found ([#47](https://github.com/sern-handler/cli/issues/47)) ([8c45327](https://github.com/sern-handler/cli/commit/8c45327094b2560f7b5c813a1c1925920bd46038))
|
||||
|
||||
## [0.2.0](https://github.com/sern-handler/cli/compare/v0.1.3...v0.2.0) (2022-06-22)
|
||||
|
||||
|
||||
34
README.md
34
README.md
@@ -1,6 +1,8 @@
|
||||
# Sern CLI
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/sern-handler/.github/main/cli.png" width="900px">
|
||||
</div>
|
||||
|
||||
Our CLI allows you to setup and manage Discord bot projects without writing a single line of code!
|
||||
# Features
|
||||
|
||||
😁 **User Friendly** <br>
|
||||
💦 **Simple** <br>
|
||||
@@ -25,12 +27,32 @@ pnpm add -g @sern/cli@latest
|
||||
|
||||
When you install the CLI, you can use our commands with **sern** prefix.
|
||||
|
||||
`sern <command> (opt)<flag>`
|
||||
```
|
||||
Usage: sern [options] [command]
|
||||
|
||||
Welcome to sern!
|
||||
If you're new to sern, run sern init for an interactive setup to your new bot project!
|
||||
|
||||
If you have any ideas, suggestions, bug reports, kindly join our support server: https://discord.gg/xzK5fUKT4r
|
||||
|
||||
Options:
|
||||
-V, --version output the version number
|
||||
-h, --help display help for command
|
||||
|
||||
Commands:
|
||||
init [options] Quickest way to scaffold a new project
|
||||
plugins [options] Install plugins from https://github.com/sern-handler/awesome-plugins
|
||||
extra Easy way to add extra things in your sern project
|
||||
help [command] display help for command
|
||||
|
||||
```
|
||||
|
||||
## Setting Up Your Project
|
||||
|
||||
#### TODO
|
||||
Run `sern init (-y)` for an interactive setup on a brand new project using our framework. <br>
|
||||
Adding the `-y` flag sets up project as default. ( **Note** : the default initiates a typescript project)
|
||||
|
||||
## Stats
|
||||
## Installing Plugins
|
||||
|
||||

|
||||
sern runs on your plugins. Contribute to the [repository](https://github.com/sern-handler/awesome-plugins) and then install the plugins via our cli! <br>
|
||||
Run `sern plugins` to see all installable options
|
||||
|
||||
99
dumpfiles.js
99
dumpfiles.js
@@ -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!'));
|
||||
7107
package-lock.json
generated
7107
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
38
package.json
38
package.json
@@ -1,19 +1,18 @@
|
||||
{
|
||||
"name": "@sern/cli",
|
||||
"version": "0.2.0",
|
||||
"description": "A CLI for @sern/handler",
|
||||
"exports": "./src/index.js",
|
||||
"version": "0.5.0",
|
||||
"description": "Official CLI for @sern/handler",
|
||||
"exports": "./dist/index.js",
|
||||
"bin": {
|
||||
"sern": "./src/index.js"
|
||||
"sern": "./dist/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 ."
|
||||
"fix": "prettier --write .",
|
||||
"build": "tsc",
|
||||
"watch": "tsc --watch"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -31,26 +30,27 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/sern-handler/cli/issues"
|
||||
},
|
||||
"homepage": "https://github.com/sern-handler/cli#readme",
|
||||
"homepage": "https://sern-handler.js.org",
|
||||
"dependencies": {
|
||||
"axios": "^0.27.2",
|
||||
"colorette": "^2.0.16",
|
||||
"commander": "^9.3.0",
|
||||
"execa": "^6.1.0",
|
||||
"find-up": "6.3.0",
|
||||
"ora": "^6.1.0",
|
||||
"prompts": "2.4.2"
|
||||
"prompts": "2.4.2",
|
||||
"undici": "^5.6.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/prompts": "^2.0.14",
|
||||
"cz-conventional-changelog": "3.0.1",
|
||||
"eslint": "8.18.0",
|
||||
"@favware/npm-deprecate": "1.0.5",
|
||||
"@types/prompts": "2.0.14",
|
||||
"prettier": "2.7.1",
|
||||
"standard-version": "9.5.0"
|
||||
"typescript": "4.7.4"
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "./node_modules/cz-conventional-changelog"
|
||||
}
|
||||
"engines": {
|
||||
"node": ">= 16.10.x"
|
||||
},
|
||||
"publishConfig": {
|
||||
"registry": "https://registry.npmjs.org/",
|
||||
"access": "public"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import prompts from 'prompts';
|
||||
import prompt from 'prompts';
|
||||
import { extraPrompt } from '../prompts/extra.js';
|
||||
import { create } from '../utilities/create.js';
|
||||
const { prompt } = prompts;
|
||||
|
||||
export async function extra() {
|
||||
const extra = await prompt([extraPrompt]);
|
||||
@@ -1,12 +0,0 @@
|
||||
import { cyanBright, yellowBright, green } from 'colorette';
|
||||
|
||||
export function help() {
|
||||
let guide = 'Welcome to Sern!\n';
|
||||
guide += `If you're new to ${cyanBright('Sern')}, run ${yellowBright(
|
||||
'sern init'
|
||||
)} for an interactive setup to your new bot project!\n\n`;
|
||||
guide += `${green(
|
||||
`If you have any ideas, suggestions, bug reports, kindly join our support server: https://discord.gg/xzK5fUKT4r`
|
||||
)}`;
|
||||
return guide;
|
||||
}
|
||||
18
src/commands/help.ts
Normal file
18
src/commands/help.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { cyanBright, green, magentaBright } from 'colorette';
|
||||
|
||||
export function help() {
|
||||
return `
|
||||
___ ___ _ __ _ __
|
||||
/ __|/ _ \\ '__| '_ \\
|
||||
\\__ \\ __/ | | | | |
|
||||
|___/\\___|_| |_| |_|
|
||||
|
||||
Welcome!
|
||||
If you're new to ${cyanBright('sern')}, run ${magentaBright(
|
||||
'sern init'
|
||||
)} for an interactive setup to your new bot project!
|
||||
|
||||
${green(
|
||||
`If you have any ideas, suggestions, bug reports, kindly join our support server: https://discord.gg/xzK5fUKT4r`
|
||||
)}`;
|
||||
}
|
||||
@@ -1,59 +1,48 @@
|
||||
import prompts from 'prompts';
|
||||
import ora from 'ora';
|
||||
import { greenBright, redBright, yellowBright } from 'colorette';
|
||||
import { greenBright, redBright } from 'colorette';
|
||||
import { execa } from 'execa';
|
||||
import { findUp } from 'find-up';
|
||||
import ora from 'ora';
|
||||
import prompt from 'prompts';
|
||||
import {
|
||||
cmds_dir,
|
||||
gitInit,
|
||||
lang,
|
||||
main_dir,
|
||||
gitInit,
|
||||
which_manager,
|
||||
skip_install_dep,
|
||||
name,
|
||||
skip_install_dep,
|
||||
which_manager,
|
||||
} from '../prompts/init.js';
|
||||
|
||||
import { npm } from '../utilities/npm.js';
|
||||
import { cloneRepo, installDeps } from '../utilities/install.js';
|
||||
import { editDirs, editMain } from '../utilities/edits.js';
|
||||
import { writeFile } from 'fs/promises';
|
||||
const { prompt } = prompts;
|
||||
import { editDirs, editMain } from '../utilities/edits.js';
|
||||
import { cloneRepo, installDeps } from '../utilities/install.js';
|
||||
import { npm } from '../utilities/npm.js';
|
||||
import type { PackageManagerChoice } from '../utilities/types.js';
|
||||
|
||||
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;
|
||||
export async function init(flags: Flags) {
|
||||
let data: PromptData;
|
||||
let git_init = true; // the default;
|
||||
let pm = flags.sync ? undefined : flags.y ? 'npm' : await npm();
|
||||
|
||||
if (flags.y) {
|
||||
const projectName = await prompt([name]);
|
||||
git_init = true;
|
||||
pm = 'npm';
|
||||
data = {
|
||||
name: projectName.name,
|
||||
lang: 'typescript',
|
||||
main_dir: 'src',
|
||||
cmds_dir: 'commands',
|
||||
};
|
||||
} else if (flags.sync) {
|
||||
data = (await prompt([lang, main_dir, cmds_dir])) as PromptData;
|
||||
} else {
|
||||
data = await prompt([name, lang, main_dir, cmds_dir]);
|
||||
data = (await prompt([name, lang, main_dir, cmds_dir])) as PromptData;
|
||||
git_init = (await prompt([gitInit])).gitinit;
|
||||
pm = await npm();
|
||||
}
|
||||
|
||||
const language = data.lang === 'javascript-esm' ? 'javascript' : data.lang;
|
||||
const config = {
|
||||
language: data.lang,
|
||||
language,
|
||||
paths: {
|
||||
base: data.main_dir,
|
||||
commands: data.cmds_dir,
|
||||
@@ -61,30 +50,37 @@ export async function init(flags) {
|
||||
};
|
||||
const file = JSON.stringify(config, null, 2);
|
||||
|
||||
if (Object.keys(data).length < 4) process.exit(1);
|
||||
const requiredData = flags.sync !== undefined ? 3 : 4;
|
||||
const receivedData = Object.keys(data).length;
|
||||
const incompleteDataCondition = receivedData < requiredData;
|
||||
|
||||
await cloneRepo(data.lang, data.name);
|
||||
if (incompleteDataCondition) process.exit(1);
|
||||
|
||||
if (!flags.sync) await cloneRepo(data.lang, data.name);
|
||||
|
||||
const pkg = await findUp('package.json', {
|
||||
cwd: process.cwd() + '/' + data.name,
|
||||
});
|
||||
|
||||
if (!pkg) throw new Error('No package.json found! Clone Failed');
|
||||
if (!pkg) throw new Error('No package.json found!');
|
||||
|
||||
if (pkg) {
|
||||
await writeFile(pkg.replace('package.json', 'sern.config.json'), file);
|
||||
await writeFile(pkg.replace('package.json', 'sern.config.json'), file);
|
||||
|
||||
if (flags.sync) {
|
||||
console.log('Project was successfully synced!');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
git_init ? await git(data) : console.log(`Skipping git init...\n`);
|
||||
|
||||
let choice;
|
||||
let choice: PackageManagerChoice;
|
||||
|
||||
if (pm === 'both') {
|
||||
const chosen = await prompt([which_manager]);
|
||||
choice = chosen.manager;
|
||||
choice = (await prompt([which_manager])).manager;
|
||||
} else {
|
||||
const chosen = await prompt([skip_install_dep]);
|
||||
choice = chosen.skip_install_dep ? pm : 'skip';
|
||||
choice = (
|
||||
(await prompt([skip_install_dep])).skip_install_dep ? pm : 'skip'
|
||||
) as PackageManagerChoice;
|
||||
}
|
||||
|
||||
await installDeps(choice, data.name);
|
||||
@@ -95,11 +91,8 @@ export async function init(flags) {
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* It initializes git
|
||||
* @param data - The data object that contains the name of the project.
|
||||
*/
|
||||
async function git(data) {
|
||||
/** It initializes git */
|
||||
async function git(data: Data) {
|
||||
const spin = ora({
|
||||
text: 'Initializing git...',
|
||||
spinner: 'aesthetic',
|
||||
@@ -120,13 +113,24 @@ async function git(data) {
|
||||
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) {
|
||||
/** Wait for a specified number of milliseconds, then return a promise that resolves to undefined. */
|
||||
async function wait(ms: number) {
|
||||
const wait = (await import('util')).promisify(setTimeout);
|
||||
return wait(ms);
|
||||
}
|
||||
|
||||
interface Data {
|
||||
name: string;
|
||||
}
|
||||
|
||||
interface Flags {
|
||||
y: boolean;
|
||||
sync: boolean;
|
||||
}
|
||||
|
||||
interface PromptData {
|
||||
name: string;
|
||||
lang: 'typescript' | 'javascript' | 'javascript-esm';
|
||||
main_dir: string;
|
||||
cmds_dir: string;
|
||||
}
|
||||
@@ -1,18 +1,15 @@
|
||||
import { pluginsQ } from '../prompts/plugin.js';
|
||||
import prompts from 'prompts';
|
||||
import axios from 'axios';
|
||||
import fs from 'fs';
|
||||
import { greenBright } from 'colorette';
|
||||
const { prompt } = prompts;
|
||||
import fs from 'fs';
|
||||
import prompt from 'prompts';
|
||||
import { fetch } from 'undici';
|
||||
import { pluginsQ } from '../prompts/plugin.js';
|
||||
import { fromCwd } from '../utilities/fromCwd.js';
|
||||
|
||||
/**
|
||||
* Installs plugins to project
|
||||
*/
|
||||
export async function plugins() {
|
||||
/**
|
||||
* @type {string[]}
|
||||
*/
|
||||
const e = (await prompt([await pluginsQ()])).list;
|
||||
const e: string[] = (await prompt([await pluginsQ()])).list;
|
||||
if (!e) process.exit(1);
|
||||
|
||||
for await (const url of e) {
|
||||
@@ -26,19 +23,18 @@ export async function plugins() {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} url
|
||||
* @returns File
|
||||
*/
|
||||
async function download(url) {
|
||||
const res = await axios.default.get(url);
|
||||
const data = res.data;
|
||||
const dir = `${process.cwd()}/src/plugins`;
|
||||
async function download(url: string) {
|
||||
const data = await fetch(url, { method: 'GET' })
|
||||
.then((res) => res.text())
|
||||
.catch(() => null);
|
||||
|
||||
if (!data) throw new Error('Download failed! Kindly contact developers');
|
||||
|
||||
const dir = `${fromCwd('/src/plugins')}`;
|
||||
const filedir = `${process.cwd()}/src/plugins/${url.split('/').pop()}`;
|
||||
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
const file = fs.writeFileSync(filedir, data);
|
||||
|
||||
return file;
|
||||
fs.writeFileSync(filedir, data);
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { init } from './commands/init.js';
|
||||
import { help } from './commands/help.js';
|
||||
import { extra } from './commands/extra.js';
|
||||
import { help } from './commands/help.js';
|
||||
import { init } from './commands/init.js';
|
||||
|
||||
import { Command } from 'commander';
|
||||
import { version } from './utilities/version.js';
|
||||
import { plugins } from './commands/plugins.js';
|
||||
import { version } from './utilities/version.js';
|
||||
export const program = new Command();
|
||||
|
||||
program
|
||||
@@ -19,6 +19,7 @@ program
|
||||
.command(init.name)
|
||||
.description('Quickest way to scaffold a new project')
|
||||
.option('-y', 'Finishes setup as default')
|
||||
.option('-s, --sync', 'Syncs the project and generates sern.config.json')
|
||||
.action(init);
|
||||
|
||||
program
|
||||
@@ -1,4 +1,6 @@
|
||||
export const extraPrompt = {
|
||||
import type { PromptObject } from 'prompts';
|
||||
|
||||
export const extraPrompt: PromptObject = {
|
||||
message: 'What extra feature do you want to add?',
|
||||
name: 'extra',
|
||||
type: 'select',
|
||||
@@ -1,6 +1,7 @@
|
||||
import { blueBright } from 'colorette';
|
||||
import type { PromptObject } from 'prompts';
|
||||
|
||||
export const lang = {
|
||||
export const lang: PromptObject = {
|
||||
message: 'What language do you want the project to be in?',
|
||||
name: 'lang',
|
||||
type: 'select',
|
||||
@@ -10,6 +11,11 @@ export const lang = {
|
||||
description: 'JS',
|
||||
value: 'javascript',
|
||||
},
|
||||
{
|
||||
title: 'JavaScript (ESM)',
|
||||
description: 'JS',
|
||||
value: 'javascript-esm',
|
||||
},
|
||||
{
|
||||
title: 'TypeScript',
|
||||
description: 'TS - (Recommended)',
|
||||
@@ -18,40 +24,37 @@ export const lang = {
|
||||
],
|
||||
};
|
||||
|
||||
export const main_dir = {
|
||||
export const main_dir: PromptObject = {
|
||||
message: 'What is the main directory of your project?',
|
||||
name: 'main_dir',
|
||||
type: 'text',
|
||||
initial: 'src',
|
||||
};
|
||||
|
||||
export const cmds_dir = {
|
||||
export const cmds_dir: PromptObject = {
|
||||
message: 'What is the directory of your commands?',
|
||||
name: 'cmds_dir',
|
||||
type: 'text',
|
||||
initial: 'commands',
|
||||
validate: (/** @type {string} */ dir) =>
|
||||
validate: (dir: string) =>
|
||||
dir === 'src' ? 'You can not use src as a directory' : true,
|
||||
};
|
||||
|
||||
/**
|
||||
* @type {import('prompts').PromptObject}
|
||||
*/
|
||||
export const npmInit = {
|
||||
export const npmInit: PromptObject = {
|
||||
name: 'npm_init',
|
||||
type: 'confirm',
|
||||
message: `Do you want ${blueBright('me')} to initialize npm?`,
|
||||
initial: true,
|
||||
};
|
||||
|
||||
export const gitInit = {
|
||||
export const gitInit: PromptObject = {
|
||||
name: 'gitinit',
|
||||
type: 'confirm',
|
||||
message: `Do you want to ${blueBright('me')} to initialize git?`,
|
||||
initial: true,
|
||||
};
|
||||
|
||||
export const which_manager = {
|
||||
export const which_manager: PromptObject = {
|
||||
message: `Which manager do you want to use?`,
|
||||
name: 'manager',
|
||||
type: 'select',
|
||||
@@ -75,21 +78,18 @@ export const which_manager = {
|
||||
],
|
||||
};
|
||||
|
||||
export const skip_install_dep = {
|
||||
export const skip_install_dep: PromptObject = {
|
||||
name: 'skip_install_dep',
|
||||
type: 'confirm',
|
||||
message: `Do you want ${blueBright('me')} to install dependencies?`,
|
||||
initial: false,
|
||||
};
|
||||
|
||||
/**
|
||||
* @type {import('prompts').PromptObject}
|
||||
*/
|
||||
export const name = {
|
||||
export const name: PromptObject = {
|
||||
message: 'What is your project name?',
|
||||
name: 'name',
|
||||
type: 'text',
|
||||
validate: (/**@type {string}*/ name) =>
|
||||
validate: (name: string) =>
|
||||
name.match('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$')
|
||||
? true
|
||||
: 'Invalid name',
|
||||
@@ -1,24 +0,0 @@
|
||||
import axios from 'axios';
|
||||
import { getLang } from '../utilities/getLang.js';
|
||||
async function gimmechoices() {
|
||||
const lang =
|
||||
(await getLang()) === 'typescript' ? 'TypeScript' : 'JavaScript';
|
||||
const link = `https://api.github.com/repos/sern-handler/awesome-plugins/contents/${lang}`;
|
||||
|
||||
const data = (await axios.get(link)).data;
|
||||
const choices = data.map((e) => ({
|
||||
title: e.name,
|
||||
value: e.download_url,
|
||||
}));
|
||||
return choices;
|
||||
}
|
||||
|
||||
export async function pluginsQ() {
|
||||
return {
|
||||
name: 'list',
|
||||
type: 'autocompleteMultiselect',
|
||||
message: 'What plugins do you want to install?',
|
||||
choices: await gimmechoices(),
|
||||
min: 1,
|
||||
};
|
||||
}
|
||||
43
src/prompts/plugin.ts
Normal file
43
src/prompts/plugin.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import type { Choice, PromptObject } from 'prompts';
|
||||
import { fetch } from 'undici';
|
||||
import { getLang } from '../utilities/getLang.js';
|
||||
|
||||
function upperCase(string: string | null) {
|
||||
if (string === null) {
|
||||
console.error('Lang property not found!');
|
||||
process.exit(0);
|
||||
}
|
||||
return string === 'typescript' ? 'TypeScript' : 'JavaScript';
|
||||
}
|
||||
|
||||
async function gimmechoices(): Promise<Choice[]> {
|
||||
const lang = upperCase(await getLang().catch(() => null));
|
||||
|
||||
const link = `https://api.github.com/repos/sern-handler/awesome-plugins/contents/${lang}`;
|
||||
|
||||
const resp = await fetch(link).catch(() => null);
|
||||
if (!resp)
|
||||
return [{ title: 'No plugins found!', value: '', disabled: true }];
|
||||
|
||||
const data = (await resp.json()) as Data[];
|
||||
const choices = data.map((e) => ({
|
||||
title: e.name,
|
||||
value: e.download_url,
|
||||
}));
|
||||
return choices;
|
||||
}
|
||||
|
||||
export async function pluginsQ(): Promise<PromptObject> {
|
||||
return {
|
||||
name: 'list',
|
||||
type: 'autocompleteMultiselect',
|
||||
message: 'What plugins do you want to install?',
|
||||
choices: await gimmechoices(),
|
||||
min: 1,
|
||||
};
|
||||
}
|
||||
|
||||
interface Data {
|
||||
name: string;
|
||||
download_url: string;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import { URL, fileURLToPath } from 'url';
|
||||
import { resolve, dirname } from 'node:path';
|
||||
import { readFile, mkdir, writeFile } from 'fs/promises';
|
||||
const root = new URL('../', import.meta.url);
|
||||
import { mkdir, readFile, writeFile } from 'fs/promises';
|
||||
import { dirname, resolve } from 'node:path';
|
||||
import { fileURLToPath, URL } from 'url';
|
||||
const root = new URL('../../', import.meta.url);
|
||||
|
||||
const templates = new URL('./templates/', root);
|
||||
const extraURL = new URL('./extra/', templates);
|
||||
@@ -9,13 +9,17 @@ const extraFolder = fileURLToPath(extraURL);
|
||||
|
||||
/**
|
||||
* It creates a file with the name `name.lang.sern` in the `location` directory
|
||||
* @param {string} name - The name of the file.
|
||||
* @param {string} lang - The language you want to use.
|
||||
* @param {string} location - The location of the file to be created.
|
||||
* @param {boolean} no_ext - If true, the file will be created without an extension.
|
||||
* @returns File
|
||||
* @param name - The name of the file.
|
||||
* @param lang - The language you want to use.
|
||||
* @param location - The location of the file to be created.
|
||||
* @param no_ext - If true, the file will be created without an extension.
|
||||
*/
|
||||
export async function create(name, lang, location, no_ext) {
|
||||
export async function create(
|
||||
name: string,
|
||||
lang: string,
|
||||
location: string,
|
||||
no_ext: boolean
|
||||
) {
|
||||
const file = `${name}.${lang}.sern`;
|
||||
|
||||
const target = no_ext
|
||||
@@ -27,10 +31,10 @@ export async function create(name, lang, location, no_ext) {
|
||||
|
||||
/**
|
||||
* It reads a file from a template folder, and writes it to a target folder
|
||||
* @param {string} template - The name of the file to be created.
|
||||
* @param {string} target - The location of the file to be created.
|
||||
* @param template - The name of the file to be created.
|
||||
* @param target - The location of the file to be created.
|
||||
*/
|
||||
async function createFile(template, target) {
|
||||
async function createFile(template: string, target: string) {
|
||||
const location = `${extraFolder}${template}`;
|
||||
|
||||
const file = await readFile(location, 'utf8');
|
||||
@@ -40,11 +44,11 @@ async function createFile(template, target) {
|
||||
|
||||
/**
|
||||
* It creates a directory recursively, then writes a file to it
|
||||
* @param {string} target - The path to the file you want to write to.
|
||||
* @param {string} data - The data to write to the file.
|
||||
* @param target - The path to the file you want to write to.
|
||||
* @param data - The data to write to the file.
|
||||
* @returns A promise that resolves to the result of the writeFile function.
|
||||
*/
|
||||
async function writeFileRecursive(target, data) {
|
||||
async function writeFileRecursive(target: string, data: string) {
|
||||
const resolvedTarget = resolve(target);
|
||||
const dir = dirname(resolvedTarget);
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { readFile, rename, writeFile } from 'node:fs/promises';
|
||||
import { findUp } from 'find-up';
|
||||
import { readFile, rename, writeFile } from 'node:fs/promises';
|
||||
import { fromCwd } from './fromCwd.js';
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param name - The name of the project.
|
||||
*/
|
||||
export async function editMain(name) {
|
||||
const pjLocation = await findUp('package.json', {
|
||||
cwd: process.cwd() + '/' + name,
|
||||
});
|
||||
export async function editMain(name: string) {
|
||||
const pjLocation = (await findUp('package.json', {
|
||||
cwd: fromCwd('/' + name),
|
||||
})) as string;
|
||||
|
||||
const output = JSON.parse(await readFile(pjLocation, 'utf8'));
|
||||
if (!output) throw new Error("Can't read your package.json.");
|
||||
@@ -23,36 +23,35 @@ export async function editMain(name) {
|
||||
/**
|
||||
* It renames the `src` and `commands` directories, and edits the `index.ts` file to reflect the
|
||||
* changes
|
||||
* @param {string} srcName - The name of the folder that will contain your main files.
|
||||
* @param {string} cmds_dirName - The name of the directory where your commands will be stored.
|
||||
* @param {string} name - The name of the folder you want to edit.
|
||||
* @param {'javascript' | 'typescript'} lang - The language you want to use.
|
||||
* @returns void
|
||||
* @param srcName - The name of the folder that will contain your main files.
|
||||
* @param cmds_dirName - The name of the directory where your commands will be stored.
|
||||
* @param name - The name of the folder you want to edit.
|
||||
* @param lang - The language you want to use.
|
||||
*/
|
||||
export async function editDirs(
|
||||
srcName,
|
||||
cmds_dirName,
|
||||
name,
|
||||
lang = 'typescript'
|
||||
srcName: string,
|
||||
cmds_dirName: string,
|
||||
name: string,
|
||||
lang: 'javascript' | 'typescript' | 'javascript-esm' = 'typescript'
|
||||
) {
|
||||
const path = await findUp('src', {
|
||||
cwd: process.cwd() + '/' + name,
|
||||
const path = (await findUp('src', {
|
||||
cwd: fromCwd(name),
|
||||
type: 'directory',
|
||||
});
|
||||
})) as string;
|
||||
|
||||
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,
|
||||
const cmdsPath = (await findUp('commands', {
|
||||
cwd: fromCwd(name, srcName),
|
||||
type: 'directory',
|
||||
});
|
||||
})) as string;
|
||||
|
||||
const index = await findUp(`index.${ext}`, {
|
||||
cwd: process.cwd() + '/' + name + '/' + srcName,
|
||||
});
|
||||
const index = (await findUp(`index.${ext}`, {
|
||||
cwd: fromCwd(name, srcName),
|
||||
})) as string;
|
||||
|
||||
const newCmdsPath = cmdsPath?.replace('commands', cmds_dirName);
|
||||
await rename(cmdsPath, newCmdsPath);
|
||||
@@ -66,7 +65,7 @@ export async function editDirs(
|
||||
if (!output) throw new Error("Can't read your tsconfig.json.");
|
||||
output.compilerOptions.rootDir = srcName;
|
||||
|
||||
writeFile(tsconfig, JSON.stringify(output, null, 2));
|
||||
await writeFile(tsconfig, JSON.stringify(output, null, 2));
|
||||
}
|
||||
|
||||
const output = await readFile(index, 'utf8');
|
||||
5
src/utilities/fromCwd.ts
Normal file
5
src/utilities/fromCwd.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import path from 'path';
|
||||
|
||||
export function fromCwd(...dir: string[]) {
|
||||
return path.join(...[process.cwd(), ...dir]);
|
||||
}
|
||||
@@ -3,9 +3,9 @@ import { readFile } from 'node:fs/promises';
|
||||
|
||||
/**
|
||||
* It finds the sern.config.json file, reads it, and returns the language property
|
||||
* @returns {Promise<string>} The language of the project.
|
||||
* @returns The language of the project.
|
||||
*/
|
||||
export async function getLang() {
|
||||
export async function getLang(): Promise<'typescript' | 'javascript'> {
|
||||
const sernLocation = await findUp('sern.config.json');
|
||||
|
||||
if (!sernLocation) throw new Error("Can't find sern.config.json");
|
||||
@@ -1,18 +1,18 @@
|
||||
import { execa } from 'execa';
|
||||
import { redBright } from 'colorette';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { readFile } from 'fs/promises';
|
||||
import { execa } from 'execa';
|
||||
import { findUp } from 'find-up';
|
||||
import fs from 'fs';
|
||||
import { readFile } from 'fs/promises';
|
||||
import ora from 'ora';
|
||||
import path from 'path';
|
||||
import type { PackageManagerChoice } from './types';
|
||||
|
||||
/**
|
||||
* It installs dependencies from a package.json file
|
||||
* @param {'skip' | 'npm' | 'yarn'} choice - The package manager to use.
|
||||
* @param {string} name - The name of the project
|
||||
* @returns a promise.
|
||||
* @param choice - The package manager to use.
|
||||
* @param name - The name of the project
|
||||
*/
|
||||
export async function installDeps(choice, name) {
|
||||
export async function installDeps(choice: PackageManagerChoice, name: string) {
|
||||
const pkg = await findUp('package.json', {
|
||||
cwd: process.cwd() + '/' + name,
|
||||
});
|
||||
@@ -44,10 +44,10 @@ export async function installDeps(choice, name) {
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @param lang - The language of the template
|
||||
* @param name - The name of the project
|
||||
*/
|
||||
export async function cloneRepo(lang, name) {
|
||||
export async function cloneRepo(lang: string, name: string) {
|
||||
await execa('git', [
|
||||
'clone',
|
||||
`https://github.com/sern-handler/templates.git`,
|
||||
@@ -60,13 +60,13 @@ export async function cloneRepo(lang, name) {
|
||||
* 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.
|
||||
* @param src - The source path.
|
||||
* @param dest - The destination folder where the files will be copied to.
|
||||
*/
|
||||
export function copyRecursiveSync(src, dest) {
|
||||
export function copyRecursiveSync(src: string, dest: string) {
|
||||
const exists = fs.existsSync(src);
|
||||
|
||||
const stats = exists && fs.statSync(src);
|
||||
const stats = (exists && fs.statSync(src)) as fs.Stats;
|
||||
|
||||
const isDirectory = exists && stats.isDirectory();
|
||||
if (isDirectory) {
|
||||
@@ -82,8 +82,3 @@ export function copyRecursiveSync(src, dest) {
|
||||
fs.copyFileSync(src, dest);
|
||||
}
|
||||
}
|
||||
|
||||
// async function wait(ms) {
|
||||
// const wait = (await import('util')).promisify(setTimeout);
|
||||
// return wait(ms);
|
||||
// }
|
||||
1
src/utilities/types.ts
Normal file
1
src/utilities/types.ts
Normal file
@@ -0,0 +1 @@
|
||||
export type PackageManagerChoice = 'skip' | 'npm' | 'yarn';
|
||||
@@ -1,17 +1,18 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2022",
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "NodeNext",
|
||||
"lib": ["es2017", "dom"],
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"noEmit": true,
|
||||
"strict": false,
|
||||
"noImplicitThis": true,
|
||||
"alwaysStrict": true,
|
||||
"moduleResolution": "Node",
|
||||
"outDir": "dist",
|
||||
"rootDir": "src",
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"resolveJsonModule": true
|
||||
},
|
||||
"include": ["test", "src"]
|
||||
"noImplicitAny": true,
|
||||
"strictNullChecks": true,
|
||||
"importsNotUsedAsValues": "error",
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user