mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
Compare commits
357 Commits
api-update
...
renovate/g
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5974f7d6e3 | ||
|
|
fb6e8c2cfc | ||
|
|
0eecb08e87 | ||
|
|
c67748c7df | ||
|
|
efee0fdbe2 | ||
|
|
797442ece3 | ||
|
|
513ac8edf4 | ||
|
|
81a0180d05 | ||
|
|
89d7409536 | ||
|
|
aa802f761e | ||
|
|
2414992b73 | ||
|
|
70c6236802 | ||
|
|
1f25aa64b9 | ||
|
|
7cddee30aa | ||
|
|
e7286eee9f | ||
|
|
a67450328e | ||
|
|
47401f46a3 | ||
|
|
1059065980 | ||
|
|
974c30fa6c | ||
|
|
3a569726d8 | ||
|
|
1b7f2a49a8 | ||
|
|
97fa2a2d78 | ||
|
|
a52ad270d8 | ||
|
|
3f703c17b8 | ||
|
|
f9e7eaf92d | ||
|
|
52e145600d | ||
|
|
59d08ef207 | ||
|
|
7deb79e907 | ||
|
|
f2d4b5bda1 | ||
|
|
a575b3ed74 | ||
|
|
2042559b4d | ||
|
|
220a60ecf8 | ||
|
|
55715d5659 | ||
|
|
d0c3b7469e | ||
|
|
eabfb81819 | ||
|
|
1789ccb2f2 | ||
|
|
25c5891ade | ||
|
|
2106cdc1d0 | ||
|
|
61e82fdc7b | ||
|
|
3755b95b1a | ||
|
|
06807ea77f | ||
|
|
3fd3f1c236 | ||
|
|
92623d2914 | ||
|
|
a91f260a86 | ||
|
|
dda0e3395b | ||
|
|
9a8904f5ae | ||
|
|
04c4625bfa | ||
|
|
91b3768e37 | ||
|
|
d6f49d1d97 | ||
|
|
8ecd30cf18 | ||
|
|
a19edaf883 | ||
|
|
90e55dfa14 | ||
|
|
2106522812 | ||
|
|
ce8c4bf649 | ||
|
|
e89b918390 | ||
|
|
f8b69ae542 | ||
|
|
48f9f6ec16 | ||
|
|
86ebb221ed | ||
|
|
4efdbb21fb | ||
|
|
07b11b357b | ||
|
|
ac7f47c590 | ||
| 45cbda7b42 | |||
|
|
5cad432589 | ||
|
|
044a10dace | ||
|
|
9d5c6c714f | ||
|
|
4f2387119a | ||
|
|
a6fa4e3dcb | ||
|
|
c281832db2 | ||
|
|
a359f73fa2 | ||
| 655bb8d358 | |||
| e8d5029834 | |||
|
|
b0399f9507 | ||
|
|
b962dae36c | ||
|
|
c73cf96cb2 | ||
|
|
7458befe8a | ||
|
|
efe49391e8 | ||
|
|
3140f80c10 | ||
|
|
504cdee7b2 | ||
|
|
c7661f272c | ||
|
|
daac37c288 | ||
|
|
a579e272d0 | ||
|
|
2051aa1ac0 | ||
|
|
237c8537c6 | ||
|
|
77fb00d386 | ||
|
|
89f6bbb975 | ||
|
|
8ef4ee87e9 | ||
|
|
fd39858636 | ||
|
|
132b625070 | ||
|
|
03439fec43 | ||
|
|
fc87e99ed0 | ||
|
|
a08541a8e7 | ||
|
|
8bd5eb4949 | ||
|
|
e1059f93f7 | ||
|
|
800531453f | ||
|
|
c9f2d75665 | ||
|
|
e59e0b9d40 | ||
|
|
26ccd118ff | ||
|
|
4b97d86908 | ||
|
|
b1c82448bd | ||
|
|
d80081384a | ||
|
|
50253ca322 | ||
|
|
215aca2f46 | ||
|
|
a7f5ea269f | ||
|
|
52d6368440 | ||
|
|
1e723a4154 | ||
|
|
5fe13f43d2 | ||
|
|
ab9d39306a | ||
|
|
d429f3adbf | ||
|
|
5e011b471e | ||
|
|
41344608c6 | ||
|
|
7a72cc4fe3 | ||
|
|
70cca0dbb0 | ||
|
|
7798e36458 | ||
|
|
9144485c39 | ||
|
|
cf15b67ede | ||
|
|
57cc94ff81 | ||
|
|
6a2a5b4565 | ||
|
|
5fdc1eda7f | ||
|
|
e00d1df32e | ||
|
|
31c221bd5e | ||
|
|
0aba4a6606 | ||
|
|
e9c7661804 | ||
|
|
446417bfb9 | ||
|
|
6b58ef731b | ||
|
|
b62129bf04 | ||
|
|
3d121ff01c | ||
|
|
d201087d4f | ||
|
|
1af4a2bed4 | ||
|
|
edcaed083e | ||
|
|
a4fe2c50df | ||
|
|
9ea991626d | ||
|
|
64f20f1cf5 | ||
|
|
41cc72fe63 | ||
|
|
d983f95906 | ||
|
|
c1f690633c | ||
|
|
8544d301ef | ||
|
|
52bcba9cfc | ||
|
|
21febd2c90 | ||
|
|
11daebb30a | ||
|
|
b817f98c10 | ||
|
|
563f583318 | ||
|
|
e4c7bfe686 | ||
|
|
69fa4908c3 | ||
|
|
4fa28d605f | ||
|
|
079b554f8b | ||
|
|
dec56335b9 | ||
|
|
50be972d4f | ||
|
|
507d183970 | ||
|
|
90edd4f91e | ||
|
|
5f11142599 | ||
|
|
7a635f9978 | ||
|
|
a17aeac558 | ||
|
|
af6ebed348 | ||
|
|
2f96b7634d | ||
|
|
97741faa69 | ||
|
|
94070d99e8 | ||
|
|
473be775f0 | ||
|
|
36af102251 | ||
|
|
cee740ea3f | ||
|
|
2fd7697300 | ||
|
|
f9609ce6cd | ||
|
|
a3064aa915 | ||
|
|
0a53a48521 | ||
|
|
05037b5315 | ||
|
|
06a3e69210 | ||
|
|
74c4b77d4b | ||
|
|
d381ff568e | ||
|
|
6db5c71506 | ||
|
|
507c9e7939 | ||
|
|
09610d0501 | ||
|
|
0862bf92d0 | ||
|
|
62162f6b8c | ||
|
|
eb501db09a | ||
|
|
964848a4e2 | ||
|
|
78dead1b49 | ||
|
|
39e6d6d2f9 | ||
|
|
5aff57ed6d | ||
|
|
4095471346 | ||
|
|
f7b9c52df1 | ||
|
|
d20d01524b | ||
|
|
5684c060bc | ||
|
|
ca8b31f280 | ||
|
|
ce9a0831a6 | ||
|
|
3a32968a17 | ||
|
|
e549f8bc3e | ||
|
|
3ab73459ad | ||
|
|
16af2e996d | ||
|
|
4f9a842b0e | ||
|
|
5dfd1a1fc1 | ||
|
|
c45a10c950 | ||
|
|
b45ba34f3c | ||
|
|
facee79c90 | ||
|
|
306eee071d | ||
|
|
00d55208a0 | ||
|
|
49fad801a5 | ||
|
|
c9f44ce72b | ||
|
|
a9a2528faf | ||
|
|
529edb7da5 | ||
|
|
f236dc05e2 | ||
|
|
c78936a225 | ||
|
|
1860b898f3 | ||
|
|
fd10772a9b | ||
|
|
cd36bd8a47 | ||
|
|
dda7f41231 | ||
|
|
371a57194c | ||
|
|
bfcc160a39 | ||
|
|
86fa531eb6 | ||
|
|
58052e94cb | ||
|
|
96f4281121 | ||
|
|
f9ae7c003b | ||
|
|
ec211d5a8d | ||
|
|
3faf83bbf7 | ||
|
|
8eed099503 | ||
|
|
e2874be4e7 | ||
|
|
1d6751a9cd | ||
|
|
f6afafa352 | ||
|
|
b4b195dc95 | ||
|
|
33f14467ec | ||
|
|
cb95105c1c | ||
|
|
845b82feef | ||
|
|
833a323f3c | ||
|
|
42e5f20425 | ||
|
|
2b25e6bfbb | ||
|
|
1a27341092 | ||
|
|
4680e451bb | ||
|
|
917d8b0d1b | ||
|
|
b8492ee45d | ||
|
|
08aac1d67a | ||
|
|
a13df6fb42 | ||
|
|
7089f5c0dc | ||
|
|
559c1a7a7b | ||
|
|
ac27d168e2 | ||
|
|
d1e6ec4589 | ||
|
|
ff379d03be | ||
|
|
1e4e933db2 | ||
|
|
ce960f4c8d | ||
|
|
1130456045 | ||
|
|
1617d2dcc3 | ||
|
|
ddacbd6e38 | ||
|
|
d69819e9fc | ||
|
|
49e4ba623f | ||
|
|
1b6c413fc2 | ||
|
|
e986535935 | ||
|
|
c30aac476c | ||
|
|
f9622d3788 | ||
|
|
f286a24686 | ||
|
|
166934d749 | ||
|
|
01d79177e8 | ||
|
|
50dac7fb46 | ||
|
|
714d23d401 | ||
|
|
565c4fc35a | ||
|
|
8d18c4b182 | ||
|
|
71cec6f142 | ||
|
|
14556223fd | ||
|
|
59c1c9c6a9 | ||
|
|
a120136f55 | ||
|
|
9b2d7eea5f | ||
|
|
4d7aa97b66 | ||
|
|
83eadcd2e5 | ||
|
|
c0bf346841 | ||
|
|
73c161fffe | ||
|
|
ee763301d0 | ||
|
|
c5f6eb9794 | ||
|
|
ec8a61a9ee | ||
|
|
87c17dbe10 | ||
|
|
790ce1681c | ||
|
|
cbad7380e1 | ||
|
|
ad36875be2 | ||
|
|
50288867a5 | ||
|
|
6b8995d149 | ||
|
|
82bbddac8d | ||
|
|
03936eb2ea | ||
|
|
c4019f7a08 | ||
|
|
992619f8e5 | ||
|
|
b995560ec6 | ||
|
|
f01ef9b86c | ||
|
|
702c5750fc | ||
|
|
d5d1b4129b | ||
|
|
7658d3e3ab | ||
|
|
9c1abc6b2e | ||
|
|
20bc135a7d | ||
|
|
8a373de880 | ||
|
|
395549c173 | ||
|
|
dbc180fa78 | ||
|
|
ff5c161469 | ||
|
|
82637245f3 | ||
|
|
bc3ed918da | ||
|
|
62bfcb1eb7 | ||
|
|
fbf54c9d36 | ||
|
|
b999918b71 | ||
|
|
224ce97fe8 | ||
|
|
f52dd01ca5 | ||
|
|
b8841e926d | ||
|
|
f0f54cb7f2 | ||
|
|
ebe759f5e0 | ||
|
|
58d97e08a5 | ||
|
|
21a438768b | ||
|
|
b3ed8da68f | ||
|
|
c5bd94131d | ||
|
|
3dec347ef0 | ||
|
|
4e9530f4d7 | ||
|
|
0da1b5a4dc | ||
|
|
8a7a671300 | ||
|
|
bf8a5d5a11 | ||
|
|
74378f0f12 | ||
|
|
0559fcca96 | ||
|
|
70d7bdb8c5 | ||
|
|
b6ea3da23f | ||
|
|
75a6a04db5 | ||
|
|
24fae252a7 | ||
|
|
d70a2a1d5e | ||
|
|
0d6e592614 | ||
|
|
44ee2f4440 | ||
|
|
b560d56346 | ||
|
|
344229b65f | ||
|
|
ca728f755b | ||
|
|
d8d6330260 | ||
|
|
c17c49bb17 | ||
|
|
7da7bff700 | ||
|
|
a0587f59d4 | ||
|
|
d62be87c9a | ||
|
|
35a200f055 | ||
|
|
d96681bfb5 | ||
|
|
d1b034b826 | ||
|
|
2387add445 | ||
|
|
7bf15a2d5d | ||
|
|
07e6dabce1 | ||
|
|
8e3feb81ca | ||
|
|
9a16c20dad | ||
|
|
17eb816ec9 | ||
|
|
79be5096d3 | ||
|
|
4fea383519 | ||
|
|
ca9ac52fae | ||
|
|
9cb25a585a | ||
|
|
17033254d4 | ||
|
|
2f5e0fc772 | ||
|
|
a35ceb9531 | ||
|
|
fbbd79babc | ||
|
|
501745b7ea | ||
|
|
6ea84ac8cd | ||
|
|
76c4333a81 | ||
|
|
ac459593a0 | ||
|
|
c5dac42da0 | ||
|
|
ef2200c257 | ||
|
|
fcb5f6747c | ||
|
|
dd75650a46 | ||
|
|
4872590b28 | ||
|
|
cc127bd040 | ||
|
|
9dd82a3cfb | ||
|
|
9340cf229c | ||
|
|
7c97fa9461 | ||
|
|
ef22aca5ff | ||
|
|
e71b63d261 | ||
|
|
e677ce0839 | ||
|
|
371f9d711a | ||
|
|
a5320dddb9 | ||
|
|
92b83c8d32 |
11
.eslintrc
11
.eslintrc
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"extends": ["plugin:@typescript-eslint/recommended"],
|
||||
"parserOptions": { "ecmaVersion": "latest", "sourceType": "script" },
|
||||
"rules": {
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
"quotes": [2, "single", { "avoidEscape": true, "allowTemplateLiterals" : true }],
|
||||
"semi": ["error", "always"],
|
||||
"@typescript-eslint/no-empty-interface": 0
|
||||
}
|
||||
}
|
||||
3
.github/CODEOWNERS
vendored
3
.github/CODEOWNERS
vendored
@@ -1,2 +1 @@
|
||||
src/* @jacoobes
|
||||
docs/* @Murtatrxx
|
||||
* @jacoobes
|
||||
|
||||
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
open_collective: sern
|
||||
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[BUG] Write a descriptive title."
|
||||
labels: bug
|
||||
assignees: EvolutionX-10, jacoobes, Murtatrxx
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Versioning**
|
||||
NodeJS version:
|
||||
DiscordJS version:
|
||||
SernHandler version:
|
||||
Channel: (e.g. beta)
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Sern Community Support
|
||||
url: https://discord.gg/9w8jzsR48U
|
||||
about: Please ask and answer questions here.
|
||||
43
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
43
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Ask for things that are not in sern
|
||||
title: "[Feature] Request a feature"
|
||||
labels: feature
|
||||
assignees: EvolutionX-10, jacoobes, Murtatrxx
|
||||
|
||||
---
|
||||
Request a new feature!
|
||||
---
|
||||
### Is your proposal related to a problem?
|
||||
|
||||
<!--
|
||||
Provide a clear and concise description of what the problem is.
|
||||
For example, "I'm always frustrated when..."
|
||||
-->
|
||||
|
||||
(Write your answer here.)
|
||||
|
||||
### Describe the solution you'd like
|
||||
|
||||
<!--
|
||||
Provide a clear and concise description of what you want to happen.
|
||||
-->
|
||||
|
||||
(Describe your proposed solution here.)
|
||||
|
||||
### Describe alternatives you've considered
|
||||
|
||||
<!--
|
||||
Let us know about other solutions you've tried or researched.
|
||||
-->
|
||||
|
||||
(Write your answer here.)
|
||||
|
||||
### Additional context
|
||||
|
||||
<!--
|
||||
Is there anything else you can add about the proposal?
|
||||
You might want to link to related issues here, if you haven't already.
|
||||
-->
|
||||
|
||||
(Write your answer here.)
|
||||
26
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
26
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# Description
|
||||
|
||||
Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change.
|
||||
|
||||
Fixes # (issue)
|
||||
|
||||
## Type of change
|
||||
|
||||
Please delete options that are not relevant.
|
||||
|
||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||
- [ ] This change requires a documentation update
|
||||
|
||||
# Checklist:
|
||||
|
||||
- [ ] My code follows the style guidelines of this project
|
||||
- [ ] I have performed a self-review of my code
|
||||
- [ ] I have commented my code, particularly in hard-to-understand areas
|
||||
- [ ] I have made corresponding changes to the documentation
|
||||
- [ ] My changes generate no new warnings
|
||||
- [ ] I have added tests that prove my fix is effective or that my feature works
|
||||
- [ ] New and existing unit tests pass locally with my changes
|
||||
- [ ] Any dependent changes have been merged and published in downstream modules
|
||||
|
||||
38
.github/SECURITY.md
vendored
38
.github/SECURITY.md
vendored
@@ -6,14 +6,44 @@ Project is currently under heavy development but you can try out our [npm packag
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 0.1.0 @ dev | :white_check_mark: |
|
||||
| 2.6.1 | YES |
|
||||
| 2.6.0 | YES |
|
||||
| 2.5.3 | YES |
|
||||
| 2.5.2 | YES |
|
||||
| 2.5.1 | YES |
|
||||
| 2.5.0 | YES |
|
||||
| 2.1.1 | NO |
|
||||
| 2.1.0 | NO |
|
||||
| 2.0.0 | NO |
|
||||
| 1.2.1 | NO |
|
||||
| 1.2.0 | NO |
|
||||
| 1.1.0 | NO |
|
||||
1.0.1 | NO
|
||||
1.0.0 | NO
|
||||
1.1.9 @ beta | NO
|
||||
1.1.8 @ beta | NO
|
||||
1.1.7 @ beta | NO
|
||||
1.1.6 @ beta | NO
|
||||
1.1.5 @ beta | NO
|
||||
1.1.4 @ beta | NO
|
||||
1.1.3 @ beta | NO
|
||||
1.1.2 @ beta | NO
|
||||
1.1.1 @ beta | NO
|
||||
1.1.0 @ beta | NO
|
||||
1.0.4 @ beta | NO
|
||||
1.0.3 @ beta | NO
|
||||
1.0.2 @ beta | NO
|
||||
1.0.1 @ beta | NO
|
||||
1.0.0 @ beta | NO
|
||||
0.0.1 @ dev | NO (TRY IT)
|
||||
|
||||
* Dev versions might include bugs, use it with your own risk.
|
||||
|
||||
* Dev versions might include bugs and not supported use stable versions.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
You can report a vulnerability by opening an issue on the [project's GitHub](https://github.com/SernHandler/Sern/issues) repository.
|
||||
You can report a vulnerability by opening an issue on the [project's GitHub](https://github.com/sern-handler/handler/issues) repository.
|
||||
|
||||
Please provide as much information as possible when reporting a vulnerability. We are lookin information for, the affected version, and the steps to reproduce the vulnerability.
|
||||
Please provide as much information as possible when reporting a vulnerability. We are looking information for, the affected version, and the steps to reproduce the vulnerability.
|
||||
|
||||
Be patient, we are working on fixing all reported vulnerabilities.
|
||||
|
||||
37
.github/workflows/codeql-analysis.yml
vendored
37
.github/workflows/codeql-analysis.yml
vendored
@@ -1,37 +0,0 @@
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
schedule:
|
||||
- cron: '37 20 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'javascript' ]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
20
.github/workflows/dependency-review.yml
vendored
Normal file
20
.github/workflows/dependency-review.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# Dependency Review Action
|
||||
#
|
||||
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
||||
#
|
||||
# Source repository: https://github.com/actions/dependency-review-action
|
||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
||||
name: 'Dependency Review'
|
||||
on: [pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@0efb1d1d84fc9633afcdaad14c485cbbc90ef46c # v2
|
||||
34
.github/workflows/npm-publish-dev.yml
vendored
Normal file
34
.github/workflows/npm-publish-dev.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Continuous Delivery
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'src/**'
|
||||
- 'package.json'
|
||||
|
||||
jobs:
|
||||
Publish:
|
||||
name: Publishing Dev
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3
|
||||
with:
|
||||
node-version: 18
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm i && npm run build:dev
|
||||
|
||||
- name: Publish to npm
|
||||
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 }}
|
||||
36
.github/workflows/npm-publish.yml
vendored
36
.github/workflows/npm-publish.yml
vendored
@@ -1,30 +1,22 @@
|
||||
name: NPM / Publish
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [created]
|
||||
|
||||
workflow_dispatch:
|
||||
# We only publish if the version of sern handler is different. workflow automatically cancels if verson is the same
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
jobs:
|
||||
build:
|
||||
test-and-publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
|
||||
- uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3
|
||||
with:
|
||||
node-version: 16
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
|
||||
publish-npm:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
node-version: 18
|
||||
- run: npm i
|
||||
- run: npm run build:prod
|
||||
- uses: JS-DevTools/npm-publish@0f451a94170d1699fd50710966d48fb26194d939 # v1
|
||||
with:
|
||||
node-version: 16
|
||||
registry-url: https://registry.npmjs.org/
|
||||
- run: npm ci
|
||||
- run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
||||
token: ${{ secrets.NPM_TOKEN }}
|
||||
access: "public"
|
||||
|
||||
14
.github/workflows/release-please.yml
vendored
Normal file
14
.github/workflows/release-please.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
name: release-please
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
release-please:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: googleapis/release-please-action@db8f2c60ee802b3748b512940dde88eabd7b7e01 # v3
|
||||
with:
|
||||
release-type: node
|
||||
package-name: release-please-action
|
||||
bump-patch-for-minor-pre-major: true
|
||||
|
||||
41
.github/workflows/test.yml
vendored
41
.github/workflows/test.yml
vendored
@@ -1,29 +1,28 @@
|
||||
name: Test
|
||||
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
|
||||
|
||||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
run-tests:
|
||||
name: Run Tests
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x, 19.x, 20.x]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 17
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- run: npm run test
|
||||
|
||||
13
.gitignore
vendored
13
.gitignore
vendored
@@ -82,5 +82,18 @@ dist
|
||||
# VisualStudio Config file
|
||||
.vs
|
||||
|
||||
# VSCode settings and cache
|
||||
.vscode
|
||||
|
||||
# IntelliJ IDEA Config file
|
||||
.idea/
|
||||
|
||||
# Yarn files
|
||||
.yarn/install-state.gz
|
||||
.yarn/build-state.yml
|
||||
|
||||
.yalc
|
||||
|
||||
yalc.lock
|
||||
|
||||
*.svg
|
||||
|
||||
19
.npmignore
19
.npmignore
@@ -1,5 +1,4 @@
|
||||
src/
|
||||
tsconfig.json
|
||||
docs/
|
||||
.gitignore
|
||||
|
||||
@@ -9,7 +8,7 @@ logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
.yarn
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
@@ -54,6 +53,7 @@ typings/
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
@@ -81,9 +81,7 @@ typings/
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# TypeScript build output
|
||||
dist
|
||||
|
||||
test
|
||||
# VisualStudio Config file
|
||||
.vs
|
||||
|
||||
@@ -106,4 +104,13 @@ CODE_OF_CONDUCT.md
|
||||
|
||||
babel.config.js
|
||||
|
||||
tests/
|
||||
tsup.config.js
|
||||
|
||||
tsconfig-base.json
|
||||
|
||||
tsconfig-cjs.json
|
||||
|
||||
tsconfig-esm.json
|
||||
|
||||
renovate.json
|
||||
fortnite
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
README.md
|
||||
.github/
|
||||
*.md
|
||||
dist/
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"semi": true,
|
||||
"trailingComma": "all",
|
||||
"singleQuote": true,
|
||||
"printWidth": 100,
|
||||
"tabWidth": 4,
|
||||
"arrowParens": "avoid"
|
||||
}
|
||||
440
CHANGELOG.md
Normal file
440
CHANGELOG.md
Normal file
@@ -0,0 +1,440 @@
|
||||
# Changelog
|
||||
|
||||
## [4.2.6](https://github.com/sern-handler/handler/compare/v4.2.5...v4.2.6) (2025-09-22)
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 4.2.6 ([#402](https://github.com/sern-handler/handler/issues/402)) ([0eecb08](https://github.com/sern-handler/handler/commit/0eecb08e87e26102030ccf6ef38ddd81051ec373))
|
||||
|
||||
## [4.2.5](https://github.com/sern-handler/handler/compare/v4.2.4...v4.2.5) (2025-08-31)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* make message module warn rather than throwing ([#399](https://github.com/sern-handler/handler/issues/399)) ([797442e](https://github.com/sern-handler/handler/commit/797442ece3999bf2cb6b5ba0688ce0177e72a22f))
|
||||
|
||||
## [4.2.4](https://github.com/sern-handler/handler/compare/v4.2.3...v4.2.4) (2025-03-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* flat autocomplete ([#395](https://github.com/sern-handler/handler/issues/395)) ([89d7409](https://github.com/sern-handler/handler/commit/89d74095363befddc3222b9e5c89c35e7c6457b9))
|
||||
|
||||
## [4.2.3](https://github.com/sern-handler/handler/compare/v4.2.2...v4.2.3) (2025-03-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* autocomplete sdt.module not present ([#393](https://github.com/sern-handler/handler/issues/393)) ([2414992](https://github.com/sern-handler/handler/commit/2414992b73a40065464b20f2d53826c78fcd3a5f))
|
||||
|
||||
## [4.2.2](https://github.com/sern-handler/handler/compare/v4.2.1...v4.2.2) (2025-02-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* faster autocomplete lookup ([#387](https://github.com/sern-handler/handler/issues/387)) ([974c30f](https://github.com/sern-handler/handler/commit/974c30fa6cccaae7b1c2c3246ffa9eecb6bc7bf9))
|
||||
|
||||
## [4.2.1](https://github.com/sern-handler/handler/compare/v4.2.0...v4.2.1) (2025-01-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* context-interactions error ([#382](https://github.com/sern-handler/handler/issues/382)) ([a52ad27](https://github.com/sern-handler/handler/commit/a52ad270d843e92db5bf2049d07527eed59d428c))
|
||||
|
||||
## [4.2.0](https://github.com/sern-handler/handler/compare/v4.1.1...v4.2.0) (2025-01-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* 4.2.0 load multiple directories & `handleModuleErrors` ([#378](https://github.com/sern-handler/handler/issues/378)) ([f9e7eaf](https://github.com/sern-handler/handler/commit/f9e7eaf92d22b76d3d02a1bbe8324ca6813f48f8))
|
||||
|
||||
## [4.1.1](https://github.com/sern-handler/handler/compare/v4.1.0...v4.1.1) (2025-01-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* remove rxjs ([#376](https://github.com/sern-handler/handler/issues/376)) ([59d08ef](https://github.com/sern-handler/handler/commit/59d08ef207c486ce1cf0aba267e6f862838e0dfb))
|
||||
* This puts the light back into lightweight (\- 4.1 MB)
|
||||
|
||||
## [4.1.0](https://github.com/sern-handler/handler/compare/v4.0.3...v4.1.0) (2025-01-06)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* moduleinfo-in-eventplugins ([#373](https://github.com/sern-handler/handler/issues/373)) ([220a60e](https://github.com/sern-handler/handler/commit/220a60ecf853df8d288de2533c669562a430c3f9))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* update github username ([#371](https://github.com/sern-handler/handler/issues/371)) ([55715d5](https://github.com/sern-handler/handler/commit/55715d565990fe686159f3c1eda3754d1262c72c))
|
||||
|
||||
## [4.0.3](https://github.com/sern-handler/handler/compare/v4.0.2...v4.0.3) (2024-10-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* async presence ([#369](https://github.com/sern-handler/handler/issues/369)) ([eabfb81](https://github.com/sern-handler/handler/commit/eabfb81819b53a4656d8eac6e21cfb488b724a42))
|
||||
* fix eventModule typing for Discord events ([#368](https://github.com/sern-handler/handler/issues/368)) ([1789ccb](https://github.com/sern-handler/handler/commit/1789ccb2f22f502f87538fecdb07106ff7110434))
|
||||
|
||||
## [4.0.2](https://github.com/sern-handler/handler/compare/v4.0.1...v4.0.2) (2024-08-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* type issue ([2106cdc](https://github.com/sern-handler/handler/commit/2106cdc1d033f88b6ee4ccca6754fe7a595a9328))
|
||||
|
||||
## [4.0.1](https://github.com/sern-handler/handler/compare/v4.0.0...v4.0.1) (2024-07-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add SDT typings to autocomplete commands ([#363](https://github.com/sern-handler/handler/issues/363)) ([92623d2](https://github.com/sern-handler/handler/commit/92623d2914fb80e31365f06cf896bb37f36fc814))
|
||||
|
||||
## [4.0.0](https://github.com/sern-handler/handler/compare/v3.3.4...v4.0.0) (2024-07-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* v4 ([#361](https://github.com/sern-handler/handler/issues/361)) ([9a8904f](https://github.com/sern-handler/handler/commit/9a8904f5aed4fa36b018ad73bbe58049bae33274))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 4.0.0 ([dda0e33](https://github.com/sern-handler/handler/commit/dda0e3395b6704862bfd3fda2a201e2cb9b45d2f))
|
||||
|
||||
## [3.3.4](https://github.com/sern-handler/handler/compare/v3.3.3...v3.3.4) (2024-03-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* sern emitter err ([#358](https://github.com/sern-handler/handler/issues/358)) ([90e55df](https://github.com/sern-handler/handler/commit/90e55dfa1466c91e5da48922251309331921b1ef))
|
||||
|
||||
## [3.3.3](https://github.com/sern-handler/handler/compare/v3.3.2...v3.3.3) (2024-02-25)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* rm deprecated class modules, clean up, rm indirection ([#355](https://github.com/sern-handler/handler/issues/355)) ([48f9f6e](https://github.com/sern-handler/handler/commit/48f9f6ec16e650d574bd24dcbb0ed176933bfe17))
|
||||
* singleton init not being fired when inserting function ([07b11b3](https://github.com/sern-handler/handler/commit/07b11b357baac0c3c7055c022bc353995c80f766))
|
||||
* typings and cleanup ([#356](https://github.com/sern-handler/handler/issues/356)) ([ce8c4bf](https://github.com/sern-handler/handler/commit/ce8c4bf6492b9680fb1c1a530d3e0028f214ad2f))
|
||||
|
||||
## [3.3.2](https://github.com/sern-handler/handler/compare/v3.3.1...v3.3.2) (2024-01-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* presence feature not working on cjs applications ([#351](https://github.com/sern-handler/handler/issues/351)) ([4f23871](https://github.com/sern-handler/handler/commit/4f2387119acfde036d0d1626553e9050f55627d1))
|
||||
|
||||
## [3.3.1](https://github.com/sern-handler/handler/compare/v3.3.0...v3.3.1) (2024-01-07)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* crashing when slash command is used as text command ([#349](https://github.com/sern-handler/handler/issues/349)) ([a359f73](https://github.com/sern-handler/handler/commit/a359f73fa24127a4964d411c8c1c0dfea5edc0f1))
|
||||
|
||||
|
||||
### Reverts
|
||||
|
||||
* the last commit ([655bb8d](https://github.com/sern-handler/handler/commit/655bb8d35815fe0ce9797d8b169310a07b284ae0))
|
||||
|
||||
## [3.3.0](https://github.com/sern-handler/handler/compare/v3.2.1...v3.3.0) (2023-12-27)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* presence ([#345](https://github.com/sern-handler/handler/issues/345)) ([7458bef](https://github.com/sern-handler/handler/commit/7458befe8a5900480cd71900df02a8364837dc00))
|
||||
|
||||
## [3.2.1](https://github.com/sern-handler/handler/compare/v3.2.0...v3.2.1) (2023-12-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* logger swap failing ([daac37c](https://github.com/sern-handler/handler/commit/daac37c28858c42b21042bdcb8141239db634e7d))
|
||||
|
||||
## [3.2.0](https://github.com/sern-handler/handler/compare/v3.1.1...v3.2.0) (2023-12-15)
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 3.2.0 ([237c853](https://github.com/sern-handler/handler/commit/237c8537c66052309d7e13a7e6e0a4f7995c2558))
|
||||
|
||||
## [3.1.1](https://github.com/sern-handler/handler/compare/v3.1.0...v3.1.1) (2023-11-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* queuing events ([fd39858](https://github.com/sern-handler/handler/commit/fd39858636d3038abb6d91021b65c99c488a3d6e))
|
||||
* queuing events ([#332](https://github.com/sern-handler/handler/issues/332)) @Benzo-Fury ([#333](https://github.com/sern-handler/handler/issues/333)) ([fd39858](https://github.com/sern-handler/handler/commit/fd39858636d3038abb6d91021b65c99c488a3d6e))
|
||||
|
||||
## [3.1.0](https://github.com/sern-handler/handler/compare/v3.0.2...v3.1.0) (2023-09-04)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add guaranteed `channelId` and `userId` getters to `Context` ([#320](https://github.com/sern-handler/handler/issues/320)) ([50253ca](https://github.com/sern-handler/handler/commit/50253ca322e7d6dbd2313139c0187a1028f71109))
|
||||
* dispose hooks (deprecate useContainerRaw) ([#323](https://github.com/sern-handler/handler/issues/323)) ([26ccd11](https://github.com/sern-handler/handler/commit/26ccd118ff8cbcde94158a4d09fc0df18da9f254))
|
||||
|
||||
## [3.0.2](https://github.com/sern-handler/handler/compare/v3.0.1...v3.0.2) (2023-08-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* invalid id for cts, mts, cjs, mjs files, node paths ([#318](https://github.com/sern-handler/handler/issues/318)) ([a7f5ea2](https://github.com/sern-handler/handler/commit/a7f5ea269fb344e221d10dbdc26a1611ffc8138f))
|
||||
|
||||
## [3.0.1](https://github.com/sern-handler/handler/compare/v3.0.0...v3.0.1) (2023-08-05)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* collectors ([4134460](https://github.com/sern-handler/handler/commit/41344608c677b6069c46412f5f16e4337182ca7d))
|
||||
|
||||
## [3.0.0](https://github.com/sern-handler/handler/compare/v2.6.3...v3.0.0) (2023-07-29)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* v3 ([#294](https://github.com/sern-handler/handler/issues/294))
|
||||
|
||||
### Features
|
||||
|
||||
* v3 ([#294](https://github.com/sern-handler/handler/issues/294)) ([7798e36](https://github.com/sern-handler/handler/commit/7798e36458c7f555d2bcb8a5857a6db47b7211da))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 3.0.0 ([70cca0d](https://github.com/sern-handler/handler/commit/70cca0dbb01e70b47a8c899b1fc4f43dee5ed8ed))
|
||||
|
||||
## [2.6.3](https://github.com/sern-handler/handler/compare/v2.6.2...v2.6.3) (2023-06-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* autocomplete nested option and merge main ([5fdc1ed](https://github.com/sern-handler/handler/commit/5fdc1eda7f4fcc1f94af7eca661660c0edeb3251))
|
||||
|
||||
## [2.6.2](https://github.com/sern-handler/handler/compare/v2.6.1...v2.6.2) (2023-04-15)
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 2.6.2 ([c1f6906](https://github.com/sern-handler/handler/commit/c1f690633c55ba41db1e035b7c16f9e19c70b385))
|
||||
|
||||
## [2.6.1](https://github.com/sern-handler/handler/compare/v2.6.0...v2.6.1) (2023-03-17)
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 2.6.1 ([f9609ce](https://github.com/sern-handler/handler/commit/f9609ce6cd777fa0eb595d8c48d57905bbce5966))
|
||||
|
||||
## [2.6.0](https://github.com/sern-handler/handler/compare/v2.5.3...v2.6.0) (2023-03-09)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* adding pure annotation for better tree shaking ([d20d015](https://github.com/sern-handler/handler/commit/d20d01524b872549da501e21feec147ab204f397))
|
||||
|
||||
## [2.5.3](https://github.com/sern-handler/handler/compare/v2.5.2...v2.5.3) (2023-02-16)
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 2.5.3 ([ce9a083](https://github.com/sern-handler/handler/commit/ce9a0831a6e47dd38648f34653f0bd89b1d2e48e))
|
||||
|
||||
## [2.5.2](https://github.com/sern-handler/handler/compare/v2.5.1...v2.5.2) (2023-02-16)
|
||||
|
||||
|
||||
### Reverts
|
||||
|
||||
* version ([facee79](https://github.com/sern-handler/handler/commit/facee79c904ad663d3c57ce56fb825419fcc12f9))
|
||||
|
||||
## [2.5.1](https://github.com/sern-handler/handler/compare/v2.5.0...v2.5.1) (2023-02-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Adding my bot to readme ([#210](https://github.com/sern-handler/handler/issues/210)) ([96f4281](https://github.com/sern-handler/handler/commit/96f42811218e4898a47e75a8138ccd452ae2c5c2))
|
||||
* Adding the WIP to my bot ([86fa531](https://github.com/sern-handler/handler/commit/86fa531eb620d2ac649bad6decb29d5c55a25445))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* autocomplete ([1860b89](https://github.com/sern-handler/handler/commit/1860b898f3a231840e2a8b781e007ef9d6f587a4))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 2.5.1 ([c78936a](https://github.com/sern-handler/handler/commit/c78936a22574da4af71826f5b5f72f354a4eb06a))
|
||||
|
||||
## [2.5.0](https://github.com/sern-handler/handler/compare/v2.1.1...v2.5.0) (2023-01-30)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* simpler plugins ([#193](https://github.com/sern-handler/handler/issues/193))
|
||||
|
||||
### Features
|
||||
|
||||
* simpler plugins ([#193](https://github.com/sern-handler/handler/issues/193)) ([33f1446](https://github.com/sern-handler/handler/commit/33f14467ec413e003a82503c8a77cb42a6194281))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 2.5.0 ([b4b195d](https://github.com/sern-handler/handler/commit/b4b195dc9586736760d0b78caa8589f3d6131f8a))
|
||||
|
||||
## [2.1.1](https://github.com/sern-handler/handler/compare/v2.1.0...v2.1.1) (2022-12-31)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* modals remapping ([a13df6f](https://github.com/sern-handler/handler/commit/a13df6fb424d256476284da49024dbe56e82baab))
|
||||
|
||||
## [2.1.0](https://github.com/sern-handler/handler/compare/v2.0.0...v2.1.0) (2022-12-30)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* grammar ([c30aac4](https://github.com/sern-handler/handler/commit/c30aac476cdc2094de34f9f67b5805204cc5e4dd))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* multi parameter events ([e986535](https://github.com/sern-handler/handler/commit/e98653593566ef4635493e0c997bd107a7a3a2a2))
|
||||
|
||||
## [2.0.0](https://github.com/sern-handler/handler/compare/v1.2.1...v2.0.0) (2022-12-28)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* (2.0 global services) ([#156](https://github.com/sern-handler/handler/issues/156))
|
||||
|
||||
### Features
|
||||
|
||||
* (2.0 global services) ([#156](https://github.com/sern-handler/handler/issues/156)) ([1455622](https://github.com/sern-handler/handler/commit/14556223fd6f79b797fb2aee03e795d4f4e94a8b))
|
||||
|
||||
## [1.2.1](https://github.com/sern-handler/handler/compare/v1.2.0...v1.2.1) (2022-10-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **autocomplete:** now support multiple autocomplete options ([#147](https://github.com/sern-handler/handler/issues/147)) ([cbad738](https://github.com/sern-handler/handler/commit/cbad7380e1993b96c643f365726457f63e4fbd5d))
|
||||
|
||||
## [1.2.0](https://github.com/sern-handler/handler/compare/v1.1.0...v1.2.0) (2022-09-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* allow constructable modules ([#133](https://github.com/sern-handler/handler/issues/133)) ([03936eb](https://github.com/sern-handler/handler/commit/03936eb2ea1d1af7cada04d77bb8345d63a5e20f))
|
||||
* classmodules@arcs ([#143](https://github.com/sern-handler/handler/issues/143)) ([5028886](https://github.com/sern-handler/handler/commit/50288867a5b171511941a1be3877d721694e9f77))
|
||||
* update CODEOWNERS ([6b8995d](https://github.com/sern-handler/handler/commit/6b8995d149c857558415a6c151a3f575ec373445))
|
||||
|
||||
|
||||
### Reverts
|
||||
|
||||
* feat of allow constructable modules ([#138](https://github.com/sern-handler/handler/issues/138)) ([82bbdda](https://github.com/sern-handler/handler/commit/82bbddac8d656b60b3a1fb2471ea03ee5224f5c3))
|
||||
|
||||
## [1.1.0](https://github.com/sern-handler/handler/compare/v1.0.0...v1.1.0) (2022-08-29)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add proper error handling ([#115](https://github.com/sern-handler/handler/issues/115)) ([395549c](https://github.com/sern-handler/handler/commit/395549c173cb62a18205e451bf2cb5579ba9a6e0))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* release 1.1.0 ([8a373de](https://github.com/sern-handler/handler/commit/8a373de880ff18df85af812adf9f6f6a4f45028d))
|
||||
|
||||
## 1.0.0 (2022-08-15)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* improve quality of code, refactorings, QOL intellisense (#64)
|
||||
|
||||
### Features
|
||||
|
||||
* add .prettierignore and ignore README.md ([7ae5ecf](https://github.com/sern-handler/handler/commit/7ae5ecf1a64700d667e85420ae4b2eaf31781d85))
|
||||
* Add castings for res ([2697e35](https://github.com/sern-handler/handler/commit/2697e35b2e5b754ea9d0d84db3720fb68b3f43db))
|
||||
* Add DefinetlyDefined type, more todo statements ([c8c0c84](https://github.com/sern-handler/handler/commit/c8c0c841db2423e29d69bbc1a3ab590bfebb5d5b))
|
||||
* add discord.js as a peerDependency instead ([b3ed8da](https://github.com/sern-handler/handler/commit/b3ed8da68f55b69a7fe1697cd88c552243cc637f))
|
||||
* add docs/ to npmignore ([f90342d](https://github.com/sern-handler/handler/commit/f90342d6b140241f7a6a95dea71c05bf309a7a52))
|
||||
* add externallyUsed.ts and support BothCommands again ([fc81bfc](https://github.com/sern-handler/handler/commit/fc81bfc6d75e4722486766715abe7271ad21cd7f))
|
||||
* add feature-request.md ([#92](https://github.com/sern-handler/handler/issues/92)) ([0d6e592](https://github.com/sern-handler/handler/commit/0d6e592614f0d4eeaaa9ffe5ba245fe002f5b907))
|
||||
* add frontmatter ([#95](https://github.com/sern-handler/handler/issues/95)) ([75a6a04](https://github.com/sern-handler/handler/commit/75a6a04db56551049387e38979bb7ef21356f303))
|
||||
* Add messageComponent handler ([d29298c](https://github.com/sern-handler/handler/commit/d29298c17a1d67146bdddb9cf07a16924c55ed3a))
|
||||
* add version.txt ([4fea383](https://github.com/sern-handler/handler/commit/4fea383519b9905c17c7679587f69b530c08cec8))
|
||||
* added conventional commits ([741cf13](https://github.com/sern-handler/handler/commit/741cf13fd56ac49ebca6f73ecc3a2209f00e774d))
|
||||
* Added SECURITY file & formatted some TypeScript code ([779011a](https://github.com/sern-handler/handler/commit/779011a124ab76bbfb19a2a11889bf9255cbd360))
|
||||
* adding better typings, refactoring ([99e2a99](https://github.com/sern-handler/handler/commit/99e2a997edaac1ba880e56bf782ecd1fa5e96b4c))
|
||||
* Adding docs to some data structures, moving to default from export files ([0ae541d](https://github.com/sern-handler/handler/commit/0ae541daba4c5d2aa3e612ab4b78fd6a858717ad))
|
||||
* adding modal and autocomplete support ([77856ce](https://github.com/sern-handler/handler/commit/77856ce5d0d8d1e2e2f5a971269224a4174bc205))
|
||||
* adding refactoring for repetitive event plugin processing ([475b073](https://github.com/sern-handler/handler/commit/475b0736d573bb8969b2a0eb9180231aa8618a0e))
|
||||
* Adding sern event listeners, overriding and typing methods ([115d1a4](https://github.com/sern-handler/handler/commit/115d1a49b52eb45d9b68ba015f8f734b902e9a60))
|
||||
* Adding TextInput map & starting event plugins for message components ([6ac9720](https://github.com/sern-handler/handler/commit/6ac9720260040afb12d232b002c28db99b18e093))
|
||||
* Aliases optional ([430315a](https://github.com/sern-handler/handler/commit/430315ad02060121e75604aee40c246c71a7e8d2))
|
||||
* better looking typings for modules ([53bc080](https://github.com/sern-handler/handler/commit/53bc080a290fd5064993aa0d98497d4b239ac8f3))
|
||||
* broadening EventPlugin default generic type, reformat with prettier ([88dcdee](https://github.com/sern-handler/handler/commit/88dcdee818e42405234ef502087226a8c042c92f))
|
||||
* CodeQL ([7012da6](https://github.com/sern-handler/handler/commit/7012da60530c2b0b5d8cc97b417a80cd8031f51f))
|
||||
* delete partition.ts ([f6d584c](https://github.com/sern-handler/handler/commit/f6d584cf99abdb292985f812e64553a37ab51a01))
|
||||
* Edited event names for more conciseness, finished basic event emitters ([3f64a8a](https://github.com/sern-handler/handler/commit/3f64a8aa0a47a09f822d54f2b3f03bc42faa10f7))
|
||||
* finished interactionCreate.ts handling? (need test) ([97907b7](https://github.com/sern-handler/handler/commit/97907b746fc94d6e8b65e2fec1cce4b0c3160491))
|
||||
* finishing autocomplete!! ([d63423c](https://github.com/sern-handler/handler/commit/d63423cfc458cb9ab07b9900a7c4d2f7ea8d71b9))
|
||||
* finishing optionData for autocomplete changes, adding class for builder ([b08eebf](https://github.com/sern-handler/handler/commit/b08eebf6850acaee3b56bb1c60aec2a026a5144c))
|
||||
* Finishing up autocomplete, need to test ([d50b801](https://github.com/sern-handler/handler/commit/d50b8013ee343b2be0ed232938e9f5f91c43b493))
|
||||
* fix duplicate ([c5bd941](https://github.com/sern-handler/handler/commit/c5bd94131dfb20b2c69b7eeb96f3ad89d6de43f4))
|
||||
* **handler:** adding higher-order-function wrappers to increase readability and shorten code ([0f0b0fb](https://github.com/sern-handler/handler/commit/0f0b0fb61c80654179e2c6d6f69e50c70114201b))
|
||||
* **handler:** command plugins work?! ([70bd12d](https://github.com/sern-handler/handler/commit/70bd12dd61182f48445c707a9199421b1dba586e))
|
||||
* **handler:** progress on event plugins ([2f61399](https://github.com/sern-handler/handler/commit/2f61399b5e5ad53ee3165e19cb74dd279b827b99))
|
||||
* **higherorders.ts:** a new function that acts as a command options builder ([651009c](https://github.com/sern-handler/handler/commit/651009c9ed5e8e04cf44fa4438f94a9e119aa8f8))
|
||||
* improve quality of code, refactorings, QOL intellisense ([#64](https://github.com/sern-handler/handler/issues/64)) ([e71b63d](https://github.com/sern-handler/handler/commit/e71b63d261d86b17ddc05fbee999f63623d8c6d1))
|
||||
* Improved TypeScript experince ([dad3042](https://github.com/sern-handler/handler/commit/dad3042a644b0e47d01319f48eefe01632678cc3))
|
||||
* interactionCreate.ts refactoring ([c4e8e51](https://github.com/sern-handler/handler/commit/c4e8e517b3f4bb6baca902251a0afa22b2548450))
|
||||
* Making name required in auto cmp interactions ([ac8a2f4](https://github.com/sern-handler/handler/commit/ac8a2f4c86a1c426d32e388a5439a8696db52279))
|
||||
* move name and description out of OptionsData[] ([93942bd](https://github.com/sern-handler/handler/commit/93942bd0e7d0ac688d20159cab2c70c3285085f4))
|
||||
* Optional plugins to reduce bloat ([2b81d53](https://github.com/sern-handler/handler/commit/2b81d53503209a738b70d238512c82542d3d88e8))
|
||||
* **prefix:** make defaultPrefix optional ([f6b88dc](https://github.com/sern-handler/handler/commit/f6b88dcdc80c407e14f4d6ae73eb27e75d195e18))
|
||||
* **readme.md:** added basic command examples ([63b2d3a](https://github.com/sern-handler/handler/commit/63b2d3a5723ac6e1f0baa0de8b65640cecd7d634))
|
||||
* remove comments about prev commit ([a220949](https://github.com/sern-handler/handler/commit/a2209494bdd05ca89176aff82f7d3afce0b8de46))
|
||||
* remove copyright bloat ([48737ef](https://github.com/sern-handler/handler/commit/48737efea3c0fce572238701e72335293333379f))
|
||||
* remove externallyUsed.ts ([3dec347](https://github.com/sern-handler/handler/commit/3dec347ef0957845601f0eb2acb3f1815d1e9ca1))
|
||||
* Revamp Docs ([#47](https://github.com/sern-handler/handler/issues/47)) ([163e48f](https://github.com/sern-handler/handler/commit/163e48f3eb38d37500cefc8d0c722c083a3070c7))
|
||||
* **sern.ts:** adding logging instead of large complaining messages from bot ([00a5fa4](https://github.com/sern-handler/handler/commit/00a5fa43ad9e0b4c7d5ef1f2772a4cb186768837))
|
||||
* **sern.ts:** beginning to add new basic logger system ([ef9d53e](https://github.com/sern-handler/handler/commit/ef9d53e6b1a9009eab5ce9ff9f8b5542d1d7cf7f))
|
||||
* **sern.ts:** changed how module is passed around, now has name property at runtime ([40fb723](https://github.com/sern-handler/handler/commit/40fb7231436331c97fa791eab3b8b51636e826f1))
|
||||
* **sern.ts:** changing default value of args in text based cmd to string[], from string ([1397974](https://github.com/sern-handler/handler/commit/1397974fb6e6d8c1b1e82db8272ef0a57916022c))
|
||||
* **sern.ts:** changing default value of args in text based cmd to string[], from string ([e0541f7](https://github.com/sern-handler/handler/commit/e0541f777bc3dcb1ec0c0cccf219b9fa66199a2b))
|
||||
* **sern.ts:** changing text-based command parser fn value to string[] ([b11f999](https://github.com/sern-handler/handler/commit/b11f9996749977a16e516523af7a8e2a9e6521ae))
|
||||
* **sern.ts:** renaming Module.delegate to Module.execute ([8702876](https://github.com/sern-handler/handler/commit/870287674aa7eccbe1fc890d1cf2cd808982b801))
|
||||
* should be able to register other nodejs event emitters ([b8cda35](https://github.com/sern-handler/handler/commit/b8cda351e1f549422692c633255ac1d6c7d78a9b))
|
||||
* shrink package size, improve dev deps, esm and cjs support ([#98](https://github.com/sern-handler/handler/issues/98)) ([74378f0](https://github.com/sern-handler/handler/commit/74378f0f12cf5d16b90ddbc01fb42505e0235c39))
|
||||
* update example ([0da1b5a](https://github.com/sern-handler/handler/commit/0da1b5a4dc6823807880ade03728b466fe895190))
|
||||
* Updated Readme design ([369586f](https://github.com/sern-handler/handler/commit/369586f378f807ba9906167b5ada197c2c95e411))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* accidentally imported wildcard from wrong place & namespace ([8782cad](https://github.com/sern-handler/handler/commit/8782cad9cddbb24c03c2bfff96d3377aceb5f542))
|
||||
* autocomplete in nested form ([#97](https://github.com/sern-handler/handler/issues/97)) ([70d7bdb](https://github.com/sern-handler/handler/commit/70d7bdb8c53a1990addc5c9fd54427f194833b4e))
|
||||
* Change discord server link ([#62](https://github.com/sern-handler/handler/issues/62)) ([e677ce0](https://github.com/sern-handler/handler/commit/e677ce083966dedc945d236034e2ce4a7a586e05))
|
||||
* **codeql-analysis.yml:** Fixed autobuild issue on some TS files & deleted more unused comments ([e51c7ff](https://github.com/sern-handler/handler/commit/e51c7ffed038f0519a37f4339406c28546d92c83))
|
||||
* crash on collectors ([#89](https://github.com/sern-handler/handler/issues/89)) ([a0587f5](https://github.com/sern-handler/handler/commit/a0587f59d43d62642c033e0bb843902f9e6dc0c4))
|
||||
* crash on collectors pt ([7da7bff](https://github.com/sern-handler/handler/commit/7da7bff700f8e46e72412ca5d379a6edbc14e10a))
|
||||
* didn't run prettier, now i am ([6c144de](https://github.com/sern-handler/handler/commit/6c144defcacd7732e15292f6c3e5eaea7944bc32))
|
||||
* Fix return type of sernModule ([cf85a5d](https://github.com/sern-handler/handler/commit/cf85a5db6413e2b8b42143f70964f7a19789e1ff))
|
||||
* Fixed renovate warning ([#77](https://github.com/sern-handler/handler/issues/77)) ([76c4333](https://github.com/sern-handler/handler/commit/76c4333a817006100f0b99d73bb455e82797d3d9))
|
||||
* Fixed typo in Security.md ([c35def9](https://github.com/sern-handler/handler/commit/c35def99c93e77a0c932a1b8f1da06cd45fde294))
|
||||
* **handler.ts:** added the changes of Module<T>.execute to type delegate (now type execute) ([f062a33](https://github.com/sern-handler/handler/commit/f062a338687be4b3ac64c048a63bdcb895282d2d))
|
||||
* linting issue in markup.ts ([dac665d](https://github.com/sern-handler/handler/commit/dac665d6281a29ec79663adb26a3e5c5243e6ae0))
|
||||
* Non-exhaustiveness led to commands not registering readyEvent.ts ([b266508](https://github.com/sern-handler/handler/commit/b26650818e2c193c326356359b38412117ea6186))
|
||||
* prettier changes again ([d5bb992](https://github.com/sern-handler/handler/commit/d5bb9922dfdb14e4f7e95ad5acd470765b7a90c2))
|
||||
* prettier wants lf line ending ([571a804](https://github.com/sern-handler/handler/commit/571a8044b027afee91466219a841817dd55ef455))
|
||||
* **sern.ts:** checking ctx instanceof Message always returned false ([7166947](https://github.com/sern-handler/handler/commit/7166947d28f3be1a6e1c44385eb7946731784f58))
|
||||
* Standard for of does not resolve promises. Switched to for await ([66b9f51](https://github.com/sern-handler/handler/commit/66b9f51fa73cf07a589671d13ca4c65a9c8193a1))
|
||||
* **utilexports.ts:** forgot to remove the deleted feat of option builder ([1cff46c](https://github.com/sern-handler/handler/commit/1cff46c0ab5959d8e0f0fe89f1e6cd4c6cebff19))
|
||||
|
||||
|
||||
### Reverts
|
||||
|
||||
* Move enums to enums.ts ([40a10bf](https://github.com/sern-handler/handler/commit/40a10bf32b9a1c6afbf85bdaeb2a7918c15ac7a8))
|
||||
* Re-add plugins overload ([b9b5919](https://github.com/sern-handler/handler/commit/b9b59197df7d9bbeac3df68ebe6f7cea1ce50677))
|
||||
* remove version.txt ([ca9ac52](https://github.com/sern-handler/handler/commit/ca9ac52fae32108b4cb90b201204d5c358c5ef7b))
|
||||
@@ -1,5 +1,5 @@
|
||||
# Code of Conduct
|
||||
All participants of SernHandler are expected to abide by our Code of Conduct, both online and during in-person events that are hosted and/or associated with SernHandler.
|
||||
All participants of sern are expected to abide by our Code of Conduct, both online and during in-person events that are hosted and/or associated with sern.
|
||||
|
||||
# The Pledge
|
||||
In the interest of fostering an open and welcoming environment, we pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
@@ -26,7 +26,7 @@ Examples of behaviour that contributes to creating a positive environment includ
|
||||
• Other conduct which you know could reasonably be considered inappropriate in a professional setting. <br/>
|
||||
• Enforcement. <br/>
|
||||
|
||||
Violations of the Code of Conduct may be reported by sending a message to [discord server](https://discord.com/). All reports will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Further details of specific enforcement policies may be posted separately.
|
||||
Violations of the Code of Conduct may be reported by reaching us on our [discord server](https://discord.com/). All reports will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
We hold the right and responsibility to remove comments or other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any members for other behaviours that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
**Copyright (c) 2022 Sern**
|
||||
Copyright (c) 2025 sern
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,5 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
End license text.
|
||||
120
README.md
120
README.md
@@ -1,83 +1,79 @@
|
||||
# SernHandler
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/sern-handler/.github/main/banner.png" width="900px" />
|
||||
</div>
|
||||
|
||||
<a href="https://www.npmjs.com/package/@sern/handler"><img src="https://img.shields.io/npm/v/@sern/handler?maxAge=3600" alt="NPM version" /></a>
|
||||
<a href="https://www.npmjs.com/package/@sern/handler"><img src="https://img.shields.io/npm/dt/@sern/handler?maxAge=3600" alt="NPM downloads" /></a>
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
<h1 align="center">Handlers. Redefined.</h1>
|
||||
<h4 align="center">A complete, customizable, typesafe, & reactive framework for discord bots</h4>
|
||||
|
||||
A customizable, batteries-included, powerful discord.js framework to automate and streamline your bot development.
|
||||
<div align="center" styles="margin-top: 10px">
|
||||
<img src="https://img.shields.io/badge/open-source-brightgreen" />
|
||||
<img src="https://img.shields.io/badge/built_with-sern-pink?labelColor=%230C3478&color=%23ed5087&link=https%3A%2F%2Fsern.dev"/>
|
||||
<a href="https://www.npmjs.com/package/@sern/handler"><img src="https://img.shields.io/npm/v/@sern/handler?maxAge=3600" alt="NPM version" /></a>
|
||||
<a href="https://www.npmjs.com/package/@sern/handler"><img src="https://img.shields.io/npm/dt/@sern/handler?maxAge=3600" alt="NPM downloads" /></a>
|
||||
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-brightgreen" alt="License MIT" /></a>
|
||||
<a href="https://sern.dev"><img alt="docs.rs" src="https://img.shields.io/docsrs/docs" /></a>
|
||||
<img alt="Lines of code" src="https://img.shields.io/badge/total%20lines-2k-blue" />
|
||||
</div>
|
||||
|
||||
## Why?
|
||||
- For you. A framework that's tailored to your exact needs.
|
||||
- Lightweight. Does a lot while being small.
|
||||
- Latest features. Support for discord.js v14 and all of its interactions.
|
||||
- Start quickly. Plug and play or customize to your liking.
|
||||
- Works with [bun](https://bun.sh/) and [node](https://nodejs.org/en) out the box!
|
||||
- Use it with TypeScript or JavaScript. CommonJS and ESM supported.
|
||||
- Active and growing community, always here to help. [Join us](https://sern.dev/discord)
|
||||
- Unleash its full potential with a powerful CLI and awesome plugins.
|
||||
|
||||
## Installation
|
||||
## 📜 Installation
|
||||
[Start here!!](https://sern.dev/v4/reference/getting-started)
|
||||
|
||||
```sh
|
||||
npm install @sern/handler
|
||||
```
|
||||
## 👶 Basic Usage
|
||||
<details><summary>ping.ts</summary>
|
||||
|
||||
```sh
|
||||
yarn add @sern/handler
|
||||
```
|
||||
|
||||
```sh
|
||||
pnpm add @sern/handler
|
||||
```
|
||||
|
||||
## Basic Usage
|
||||
|
||||
#### ` index.js (CommonJS)`
|
||||
|
||||
```js
|
||||
const { Client, GatewayIntentBits } = require('discord.js');
|
||||
const { Sern } = require('sern-handler');
|
||||
const { defaultPrefix, token } = require('./config.json');
|
||||
|
||||
const client = new Client({
|
||||
intents: [
|
||||
GatewayIntentBits.Guilds,
|
||||
GatewayIntentBits.GuildMembers,
|
||||
GatewayIntentBits.GuildMessages
|
||||
]
|
||||
```ts
|
||||
export default commandModule({
|
||||
type: CommandType.Slash,
|
||||
//Installed plugin to publish to discord api and allow access to owners only.
|
||||
plugins: [publish(), ownerOnly()],
|
||||
description: 'A ping pong command',
|
||||
execute(ctx) {
|
||||
ctx.reply('Hello owner of the bot');
|
||||
}
|
||||
});
|
||||
|
||||
Sern.init({
|
||||
client,
|
||||
defaultPrefix,
|
||||
commands : 'src/commands',
|
||||
});
|
||||
|
||||
client.login(token);
|
||||
```
|
||||
</details>
|
||||
|
||||
#### ` ping.js (CommonJS)`
|
||||
# Show off your sern Discord Bot!
|
||||
|
||||
```js
|
||||
const { Sern, CommandType } = require('@sern/handler');
|
||||
## Badge
|
||||
- Copy this and add it to your [README.md](https://img.shields.io/badge/built_with-sern-pink?labelColor=%230C3478&color=%23ed5087&link=https%3A%2F%2Fsern.dev)
|
||||
<img src="https://img.shields.io/badge/built_with-sern-pink?labelColor=%230C3478&color=%23ed5087&link=https%3A%2F%2Fsern.dev">
|
||||
|
||||
exports.default = {
|
||||
description: 'A ping pong command',
|
||||
type: CommandType.Slash,
|
||||
execute(ctx) {
|
||||
ctx.reply('pong!');
|
||||
}
|
||||
};
|
||||
```
|
||||
## 🤖 Bots Using sern
|
||||
- [Community Bot](https://github.com/sern-handler/sern-community) - The community bot for our [Discord server](https://sern.dev/discord).
|
||||
- [Vinci](https://github.com/SrIzan10/vinci) - The bot for Mara Turing.
|
||||
- [Bask](https://github.com/baskbotml/bask) - Listen to your favorite artists on Discord.
|
||||
- [Murayama](https://github.com/murayamabot/murayama) - :pepega:
|
||||
- [Protector](https://github.com/GlitchApotamus/Protector) - Just a simple bot to help enhance a private Minecraft server.
|
||||
- [SmokinWeed 💨](https://github.com/Peter-MJ-Parker/sern-bud) - A fun bot for a small, but growing server.
|
||||
- [Man Nomic](https://github.com/jacoobes/man-nomic) - A simple information bot to provide information to the nomic-ai Discord community.
|
||||
- [Linear-Discord](https://github.com/sern-handler/linear-discord) - Display and manage a linear dashboard.
|
||||
- [ZenithBot](https://github.com/CodeCraftersHaven/ZenithBot) - A versatile bot coded in TypeScript, designed to enhance server management and user interaction through its robust features.
|
||||
|
||||
See our [templates](https://github.com/sern-handler/templates) for TypeScript examples and more
|
||||
## 💻 CLI
|
||||
|
||||
## CLI
|
||||
It is **highly encouraged** to use the [command line interface](https://github.com/sern-handler/cli) for your project. Don't forget to view it.
|
||||
|
||||
We are providing a [command line interface](https://github.com/sern-handler/cli) for better & easier bot developement. Don't forget to view it.
|
||||
|
||||
## Links
|
||||
|
||||
- [Official Documentation](https://sern-handler.js.org)
|
||||
- [Support Server](https://discord.com/invite/Yvb7DnqjXX)
|
||||
## 🔗 Links
|
||||
|
||||
## Contribute
|
||||
- [Official Documentation and Guide](https://sern.dev)
|
||||
- [Support Server](https://sern.dev/discord)
|
||||
|
||||
- Read our contribution [guidelines](https://github.com/sern-handler/handler) carefully
|
||||
## 👋 Contribute
|
||||
- Read our contribution [guidelines](https://github.com/sern-handler/handler/blob/main/.github/CONTRIBUTING.md) carefully
|
||||
- Pull up on [issues](https://github.com/sern-handler/handler/issues) and report bugs
|
||||
- All kinds of contributions are welcomed.
|
||||
|
||||
## Roadmap
|
||||
|
||||
You can check our [roadmap](https://github.com/sern-handler/roadmap) to see what's going to be added or patched in the future.
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript'],
|
||||
};
|
||||
@@ -1 +0,0 @@
|
||||
TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false.
|
||||
@@ -1 +0,0 @@
|
||||
sern-handler.js.org
|
||||
@@ -1,110 +0,0 @@
|
||||
:root {
|
||||
--light-hl-0: #000000;
|
||||
--dark-hl-0: #d4d4d4;
|
||||
--light-hl-1: #af00db;
|
||||
--dark-hl-1: #c586c0;
|
||||
--light-hl-2: #001080;
|
||||
--dark-hl-2: #9cdcfe;
|
||||
--light-hl-3: #a31515;
|
||||
--dark-hl-3: #ce9178;
|
||||
--light-hl-4: #0000ff;
|
||||
--dark-hl-4: #569cd6;
|
||||
--light-hl-5: #0070c1;
|
||||
--dark-hl-5: #4fc1ff;
|
||||
--light-hl-6: #795e26;
|
||||
--dark-hl-6: #dcdcaa;
|
||||
--light-hl-7: #008000;
|
||||
--dark-hl-7: #6a9955;
|
||||
--light-hl-8: #cd3131;
|
||||
--dark-hl-8: #f44747;
|
||||
--light-code-background: #f5f5f5;
|
||||
--dark-code-background: #1e1e1e;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--hl-0: var(--light-hl-0);
|
||||
--hl-1: var(--light-hl-1);
|
||||
--hl-2: var(--light-hl-2);
|
||||
--hl-3: var(--light-hl-3);
|
||||
--hl-4: var(--light-hl-4);
|
||||
--hl-5: var(--light-hl-5);
|
||||
--hl-6: var(--light-hl-6);
|
||||
--hl-7: var(--light-hl-7);
|
||||
--hl-8: var(--light-hl-8);
|
||||
--code-background: var(--light-code-background);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--hl-0: var(--dark-hl-0);
|
||||
--hl-1: var(--dark-hl-1);
|
||||
--hl-2: var(--dark-hl-2);
|
||||
--hl-3: var(--dark-hl-3);
|
||||
--hl-4: var(--dark-hl-4);
|
||||
--hl-5: var(--dark-hl-5);
|
||||
--hl-6: var(--dark-hl-6);
|
||||
--hl-7: var(--dark-hl-7);
|
||||
--hl-8: var(--dark-hl-8);
|
||||
--code-background: var(--dark-code-background);
|
||||
}
|
||||
}
|
||||
|
||||
body.light {
|
||||
--hl-0: var(--light-hl-0);
|
||||
--hl-1: var(--light-hl-1);
|
||||
--hl-2: var(--light-hl-2);
|
||||
--hl-3: var(--light-hl-3);
|
||||
--hl-4: var(--light-hl-4);
|
||||
--hl-5: var(--light-hl-5);
|
||||
--hl-6: var(--light-hl-6);
|
||||
--hl-7: var(--light-hl-7);
|
||||
--hl-8: var(--light-hl-8);
|
||||
--code-background: var(--light-code-background);
|
||||
}
|
||||
|
||||
body.dark {
|
||||
--hl-0: var(--dark-hl-0);
|
||||
--hl-1: var(--dark-hl-1);
|
||||
--hl-2: var(--dark-hl-2);
|
||||
--hl-3: var(--dark-hl-3);
|
||||
--hl-4: var(--dark-hl-4);
|
||||
--hl-5: var(--dark-hl-5);
|
||||
--hl-6: var(--dark-hl-6);
|
||||
--hl-7: var(--dark-hl-7);
|
||||
--hl-8: var(--dark-hl-8);
|
||||
--code-background: var(--dark-code-background);
|
||||
}
|
||||
|
||||
.hl-0 {
|
||||
color: var(--hl-0);
|
||||
}
|
||||
.hl-1 {
|
||||
color: var(--hl-1);
|
||||
}
|
||||
.hl-2 {
|
||||
color: var(--hl-2);
|
||||
}
|
||||
.hl-3 {
|
||||
color: var(--hl-3);
|
||||
}
|
||||
.hl-4 {
|
||||
color: var(--hl-4);
|
||||
}
|
||||
.hl-5 {
|
||||
color: var(--hl-5);
|
||||
}
|
||||
.hl-6 {
|
||||
color: var(--hl-6);
|
||||
}
|
||||
.hl-7 {
|
||||
color: var(--hl-7);
|
||||
}
|
||||
.hl-8 {
|
||||
color: var(--hl-8);
|
||||
}
|
||||
pre,
|
||||
code {
|
||||
background: var(--code-background);
|
||||
}
|
||||
@@ -1,907 +0,0 @@
|
||||
.tsd-kind-icon {
|
||||
display: block;
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
text-indent: -20px;
|
||||
}
|
||||
.tsd-kind-icon:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
margin: 0 3px 2px 0;
|
||||
background-image: url(./icons.png);
|
||||
}
|
||||
@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) {
|
||||
.tsd-kind-icon:before {
|
||||
background-image: url(./icons@2x.png);
|
||||
background-size: 238px 204px;
|
||||
}
|
||||
}
|
||||
|
||||
.tsd-signature.tsd-kind-icon:before {
|
||||
background-position: 0 -153px;
|
||||
}
|
||||
|
||||
.tsd-kind-object-literal > .tsd-kind-icon:before {
|
||||
background-position: 0px -17px;
|
||||
}
|
||||
.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -17px;
|
||||
}
|
||||
.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -17px;
|
||||
}
|
||||
|
||||
.tsd-kind-class > .tsd-kind-icon:before {
|
||||
background-position: 0px -34px;
|
||||
}
|
||||
.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -34px;
|
||||
}
|
||||
.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -34px;
|
||||
}
|
||||
|
||||
.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before {
|
||||
background-position: 0px -51px;
|
||||
}
|
||||
.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -51px;
|
||||
}
|
||||
.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -51px;
|
||||
}
|
||||
|
||||
.tsd-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: 0px -68px;
|
||||
}
|
||||
.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -68px;
|
||||
}
|
||||
.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -68px;
|
||||
}
|
||||
|
||||
.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before {
|
||||
background-position: 0px -85px;
|
||||
}
|
||||
.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -85px;
|
||||
}
|
||||
.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -85px;
|
||||
}
|
||||
|
||||
.tsd-kind-namespace > .tsd-kind-icon:before {
|
||||
background-position: 0px -102px;
|
||||
}
|
||||
.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -102px;
|
||||
}
|
||||
.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -102px;
|
||||
}
|
||||
|
||||
.tsd-kind-module > .tsd-kind-icon:before {
|
||||
background-position: 0px -102px;
|
||||
}
|
||||
.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -102px;
|
||||
}
|
||||
.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -102px;
|
||||
}
|
||||
|
||||
.tsd-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: 0px -119px;
|
||||
}
|
||||
.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -119px;
|
||||
}
|
||||
.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -119px;
|
||||
}
|
||||
|
||||
.tsd-kind-enum-member > .tsd-kind-icon:before {
|
||||
background-position: 0px -136px;
|
||||
}
|
||||
.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -136px;
|
||||
}
|
||||
.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -136px;
|
||||
}
|
||||
|
||||
.tsd-kind-signature > .tsd-kind-icon:before {
|
||||
background-position: 0px -153px;
|
||||
}
|
||||
.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -153px;
|
||||
}
|
||||
.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -153px;
|
||||
}
|
||||
|
||||
.tsd-kind-type-alias > .tsd-kind-icon:before {
|
||||
background-position: 0px -170px;
|
||||
}
|
||||
.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -170px;
|
||||
}
|
||||
.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -170px;
|
||||
}
|
||||
|
||||
.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before {
|
||||
background-position: 0px -187px;
|
||||
}
|
||||
.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -17px -187px;
|
||||
}
|
||||
.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -34px -187px;
|
||||
}
|
||||
|
||||
.tsd-kind-variable > .tsd-kind-icon:before {
|
||||
background-position: -136px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -0px;
|
||||
}
|
||||
.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -0px;
|
||||
}
|
||||
|
||||
.tsd-kind-property > .tsd-kind-icon:before {
|
||||
background-position: -136px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -0px;
|
||||
}
|
||||
.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -0px;
|
||||
}
|
||||
|
||||
.tsd-kind-get-signature > .tsd-kind-icon:before {
|
||||
background-position: -136px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -17px;
|
||||
}
|
||||
.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -17px;
|
||||
}
|
||||
|
||||
.tsd-kind-set-signature > .tsd-kind-icon:before {
|
||||
background-position: -136px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -34px;
|
||||
}
|
||||
.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -34px;
|
||||
}
|
||||
|
||||
.tsd-kind-accessor > .tsd-kind-icon:before {
|
||||
background-position: -136px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -51px;
|
||||
}
|
||||
.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -51px;
|
||||
}
|
||||
|
||||
.tsd-kind-function > .tsd-kind-icon:before {
|
||||
background-position: -136px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -68px;
|
||||
}
|
||||
.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -68px;
|
||||
}
|
||||
|
||||
.tsd-kind-method > .tsd-kind-icon:before {
|
||||
background-position: -136px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -68px;
|
||||
}
|
||||
.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -68px;
|
||||
}
|
||||
|
||||
.tsd-kind-call-signature > .tsd-kind-icon:before {
|
||||
background-position: -136px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -68px;
|
||||
}
|
||||
.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -68px;
|
||||
}
|
||||
|
||||
.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before {
|
||||
background-position: -136px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited
|
||||
> .tsd-kind-icon:before {
|
||||
background-position: -102px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -85px;
|
||||
}
|
||||
.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -85px;
|
||||
}
|
||||
|
||||
.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before {
|
||||
background-position: -136px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited
|
||||
> .tsd-kind-icon:before {
|
||||
background-position: -102px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -85px;
|
||||
}
|
||||
.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -85px;
|
||||
}
|
||||
|
||||
.tsd-kind-constructor > .tsd-kind-icon:before {
|
||||
background-position: -136px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -102px;
|
||||
}
|
||||
.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -102px;
|
||||
}
|
||||
|
||||
.tsd-kind-constructor-signature > .tsd-kind-icon:before {
|
||||
background-position: -136px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -102px;
|
||||
}
|
||||
.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -102px;
|
||||
}
|
||||
|
||||
.tsd-kind-index-signature > .tsd-kind-icon:before {
|
||||
background-position: -136px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -119px;
|
||||
}
|
||||
.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -119px;
|
||||
}
|
||||
|
||||
.tsd-kind-event > .tsd-kind-icon:before {
|
||||
background-position: -136px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -136px;
|
||||
}
|
||||
.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -136px;
|
||||
}
|
||||
|
||||
.tsd-is-static > .tsd-kind-icon:before {
|
||||
background-position: -136px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -153px;
|
||||
}
|
||||
.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -153px;
|
||||
}
|
||||
|
||||
.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before {
|
||||
background-position: -136px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -170px;
|
||||
}
|
||||
|
||||
.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before {
|
||||
background-position: -136px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -170px;
|
||||
}
|
||||
|
||||
.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before {
|
||||
background-position: -136px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -170px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -170px;
|
||||
}
|
||||
|
||||
.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before {
|
||||
background-position: -136px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -153px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before {
|
||||
background-position: -51px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -68px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -85px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -102px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before {
|
||||
background-position: -170px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {
|
||||
background-position: -187px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {
|
||||
background-position: -119px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before {
|
||||
background-position: -204px -187px;
|
||||
}
|
||||
.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {
|
||||
background-position: -221px -187px;
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 9.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 480 B |
Binary file not shown.
|
Before Width: | Height: | Size: 855 B |
@@ -1,992 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>Handler - SernHandler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li><a href="Sern.Handler.html">Handler</a></li>
|
||||
</ul>
|
||||
<h1>Class Handler</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel tsd-hierarchy">
|
||||
<h3>Hierarchy</h3>
|
||||
<ul class="tsd-hierarchy">
|
||||
<li><span class="target">Handler</span></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Constructors</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-constructor tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#constructor" class="tsd-kind-icon">constructor</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section tsd-is-private tsd-is-private-protected">
|
||||
<h3>Properties</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-property tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#wrapper" class="tsd-kind-icon">wrapper</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section">
|
||||
<h3>Accessors</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#client" class="tsd-kind-icon">client</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#commandDir" class="tsd-kind-icon">command<wbr />Dir</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#prefix" class="tsd-kind-icon">prefix</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#privateServers" class="tsd-kind-icon">private<wbr />Servers</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section tsd-is-private tsd-is-private-protected">
|
||||
<h3>Methods</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#commandResult" class="tsd-kind-icon">command<wbr />Result</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private">
|
||||
<a href="Sern.Handler.html#findModuleFrom" class="tsd-kind-icon">find<wbr />Module<wbr />From</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#interactionResult" class="tsd-kind-icon">interaction<wbr />Result</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#registerModules" class="tsd-kind-icon">register<wbr />Modules</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#reloadSlash" class="tsd-kind-icon">reload<wbr />Slash</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Constructors</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class">
|
||||
<a id="constructor" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
new <wbr />Handler<span class="tsd-signature-symbol">(</span>wrapper<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><a href="../interfaces/Sern.Wrapper.html" class="tsd-signature-type" data-tsd-kind="Interface"
|
||||
>Wrapper</a
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><a href="Sern.Handler.html" class="tsd-signature-type" data-tsd-kind="Class">Handler</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L36"
|
||||
>handler/sern.ts:36</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>
|
||||
wrapper:
|
||||
<a href="../interfaces/Sern.Wrapper.html" class="tsd-signature-type" data-tsd-kind="Interface"
|
||||
>Wrapper</a
|
||||
>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>The data that is required to run sern handler</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <a href="Sern.Handler.html" class="tsd-signature-type" data-tsd-kind="Class">Handler</a>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group tsd-is-private tsd-is-private-protected">
|
||||
<h2>Properties</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class tsd-is-private">
|
||||
<a id="wrapper" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagPrivate">Private</span> wrapper<a
|
||||
href="#wrapper"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
wrapper<span class="tsd-signature-symbol">:</span>
|
||||
<a href="../interfaces/Sern.Wrapper.html" class="tsd-signature-type" data-tsd-kind="Interface"
|
||||
>Wrapper</a
|
||||
>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L28"
|
||||
>handler/sern.ts:28</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Accessors</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a id="client" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
client<a href="#client" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
<span class="tsd-signature-symbol">get</span> client<span class="tsd-signature-symbol">(</span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">Client</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L246"
|
||||
>handler/sern.ts:246</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<dl class="tsd-comment-tags">
|
||||
<dt>readonly</dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
</div>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">Client</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div><p>the discord.js client (DiscordJS#Client));</p></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a id="commandDir" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
command<wbr />Dir<a href="#commandDir" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
<span class="tsd-signature-symbol">get</span> commandDir<span class="tsd-signature-symbol">(</span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L237"
|
||||
>handler/sern.ts:237</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<dl class="tsd-comment-tags">
|
||||
<dt>readonly</dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
</div>
|
||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4>
|
||||
<div><p>Directory of the commands folder</p></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a id="prefix" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
prefix<a href="#prefix" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
<span class="tsd-signature-symbol">get</span> prefix<span class="tsd-signature-symbol">(</span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L228"
|
||||
>handler/sern.ts:228</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<dl class="tsd-comment-tags">
|
||||
<dt>readonly</dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
</div>
|
||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4>
|
||||
<div><p>The prefix used for legacy commands</p></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a id="privateServers" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
private<wbr />Servers<a href="#privateServers" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
<span class="tsd-signature-symbol">get</span> privateServers<span class="tsd-signature-symbol">(</span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-symbol">{ </span>id<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>test<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">[]</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L255"
|
||||
>handler/sern.ts:255</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<dl class="tsd-comment-tags">
|
||||
<dt>readonly</dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
</div>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-symbol">{ </span>id<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>test<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">[]</span>
|
||||
</h4>
|
||||
<div><p>[]} Private server ID for testing or personal use</p></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group tsd-is-private tsd-is-private-protected">
|
||||
<h2>Methods</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a id="commandResult" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagPrivate">Private</span> command<wbr />Result<a
|
||||
href="#commandResult"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
command<wbr />Result<span class="tsd-signature-symbol">(</span>module<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">CommandVal</span>, message<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">Message</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">></span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span
|
||||
><a href="../modules/Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L112"
|
||||
>handler/sern.ts:112</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>module: <span class="tsd-signature-type">CommandVal</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>Command file information</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
message: <span class="tsd-signature-type">Message</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">boolean</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>The message object</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span
|
||||
><a
|
||||
href="../modules/Types.html#possibleOutput"
|
||||
class="tsd-signature-type"
|
||||
data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div><p>Takes return value and replies it, if possible input</p></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section
|
||||
class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private"
|
||||
>
|
||||
<a id="findModuleFrom" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagPrivate">Private</span> find<wbr />Module<wbr />From<a
|
||||
href="#findModuleFrom"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
find<wbr />Module<wbr />From<span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">(</span>ctx<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span
|
||||
><span class="tsd-signature-type">CommandVal</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L194"
|
||||
>handler/sern.ts:194</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
<ul class="tsd-type-parameters">
|
||||
<li>
|
||||
<h4>
|
||||
T<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">CommandInteraction</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">CacheType</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> | </span
|
||||
><span class="tsd-signature-type">Message</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>ctx: <span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>name of possible command</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">undefined</span
|
||||
><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">CommandVal</span>
|
||||
</h4>
|
||||
<div></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a id="interactionResult" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagPrivate">Private</span> interaction<wbr />Result<a
|
||||
href="#interactionResult"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
interaction<wbr />Result<span class="tsd-signature-symbol">(</span>module<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">CommandVal</span>, interaction<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">CommandInteraction</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">CacheType</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span
|
||||
><span class="tsd-signature-symbol"> | </span
|
||||
><a href="../modules/Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L88"
|
||||
>handler/sern.ts:88</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>module: <span class="tsd-signature-type">CommandVal</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>Command file information</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
interaction: <span class="tsd-signature-type">CommandInteraction</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">CacheType</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>The Discord.js command interaction (DiscordJS#CommandInteraction))</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span
|
||||
><a
|
||||
href="../modules/Types.html#possibleOutput"
|
||||
class="tsd-signature-type"
|
||||
data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div><p>Takes return value and replies it, if possible input</p></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a id="registerModules" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagPrivate">Private</span> register<wbr />Modules<a
|
||||
href="#registerModules"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
register<wbr />Modules<span class="tsd-signature-symbol">(</span>modArr<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-symbol">{ </span>absPath<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>mod<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><a href="../interfaces/Sern.Module.html" class="tsd-signature-type" data-tsd-kind="Interface"
|
||||
>Module</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">unknown</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">; </span>name<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L142"
|
||||
>handler/sern.ts:142</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>This function chains <code>Files.buildData</code></p>
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>
|
||||
modArr: <span class="tsd-signature-symbol">{ </span>absPath<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">; </span>mod<span class="tsd-signature-symbol">: </span
|
||||
><a href="../interfaces/Sern.Module.html" class="tsd-signature-type" data-tsd-kind="Interface"
|
||||
>Module</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">unknown</span
|
||||
><span class="tsd-signature-symbol">></span
|
||||
><span class="tsd-signature-symbol">; </span>name<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">[]</span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>module information</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a id="reloadSlash" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagPrivate">Private</span> reload<wbr />Slash<a
|
||||
href="#reloadSlash"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
reload<wbr />Slash<span class="tsd-signature-symbol">(</span>cmdName<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span>, description<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span>, options<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">ApplicationCommandOptionData</span
|
||||
><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L207"
|
||||
>handler/sern.ts:207</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>cmdName: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>name of command</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>description: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>description of command</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
options: <span class="tsd-signature-type">ApplicationCommandOptionData</span
|
||||
><span class="tsd-signature-symbol">[]</span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>any options for the slash command</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="current tsd-kind-class tsd-parent-kind-namespace">
|
||||
<a href="Sern.Handler.html" class="tsd-kind-icon">Handler</a>
|
||||
<ul>
|
||||
<li class="tsd-kind-constructor tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#constructor" class="tsd-kind-icon">constructor</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#wrapper" class="tsd-kind-icon">wrapper</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#client" class="tsd-kind-icon">client</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#commandDir" class="tsd-kind-icon">command<wbr />Dir</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#prefix" class="tsd-kind-icon">prefix</a>
|
||||
</li>
|
||||
<li class="tsd-kind-get-signature tsd-parent-kind-class">
|
||||
<a href="Sern.Handler.html#privateServers" class="tsd-kind-icon">private<wbr />Servers</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#commandResult" class="tsd-kind-icon">command<wbr />Result</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-private">
|
||||
<a href="Sern.Handler.html#findModuleFrom" class="tsd-kind-icon">find<wbr />Module<wbr />From</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#interactionResult" class="tsd-kind-icon">interaction<wbr />Result</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#registerModules" class="tsd-kind-icon">register<wbr />Modules</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<a href="Sern.Handler.html#reloadSlash" class="tsd-kind-icon">reload<wbr />Slash</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Legend</h2>
|
||||
<div class="tsd-legend-group">
|
||||
<ul class="tsd-legend">
|
||||
<li class="tsd-kind-property tsd-parent-kind-class tsd-is-private">
|
||||
<span class="tsd-kind-icon">Private property</span>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private">
|
||||
<span class="tsd-kind-icon">Private method</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-legend">
|
||||
<li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,204 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>CommandType - SernHandler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li><a href="Sern.CommandType.html">CommandType</a></li>
|
||||
</ul>
|
||||
<h1>Enumeration CommandType</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Enumeration members</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-enum-member tsd-parent-kind-enum">
|
||||
<a href="Sern.CommandType.html#SLASH" class="tsd-kind-icon">SLASH</a>
|
||||
</li>
|
||||
<li class="tsd-kind-enum-member tsd-parent-kind-enum">
|
||||
<a href="Sern.CommandType.html#TEXT" class="tsd-kind-icon">TEXT</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Enumeration members</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-enum-member tsd-parent-kind-enum">
|
||||
<a id="SLASH" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
SLASH<a href="#SLASH" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">SLASH<span class="tsd-signature-symbol"> = 2</span></div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L303"
|
||||
>handler/sern.ts:303</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-enum-member tsd-parent-kind-enum">
|
||||
<a id="TEXT" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
TEXT<a href="#TEXT" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">TEXT<span class="tsd-signature-symbol"> = 1</span></div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L302"
|
||||
>handler/sern.ts:302</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="current tsd-kind-enum tsd-parent-kind-namespace">
|
||||
<a href="Sern.CommandType.html" class="tsd-kind-icon">Command<wbr />Type</a>
|
||||
<ul>
|
||||
<li class="tsd-kind-enum-member tsd-parent-kind-enum">
|
||||
<a href="Sern.CommandType.html#SLASH" class="tsd-kind-icon">SLASH</a>
|
||||
</li>
|
||||
<li class="tsd-kind-enum-member tsd-parent-kind-enum">
|
||||
<a href="Sern.CommandType.html#TEXT" class="tsd-kind-icon">TEXT</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
168
docs/index.html
168
docs/index.html
@@ -1,168 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>SernHandler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="assets/style.css" />
|
||||
<link rel="stylesheet" href="assets/highlight.css" />
|
||||
<script async src="assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base=".">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container"><h1>sern-handler</h1></div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<div class="tsd-panel tsd-typography">
|
||||
<a href="#sern-handler" id="sern-handler" style="color: inherit; text-decoration: none">
|
||||
<h1>Sern Handler</h1>
|
||||
</a>
|
||||
<a href="https://www.npmjs.com/package/sern-handler">
|
||||
<img src="https://img.shields.io/npm/v/sern_handler?maxAge=3600" alt="NPM version"
|
||||
/></a>
|
||||
<a href="https://www.npmjs.com/package/sern-handler"
|
||||
><img src="https://img.shields.io/npm/dt/sern_handler?maxAge=3600" alt="NPM downloads"
|
||||
/></a>
|
||||
<a href="https://www.npmjs.com/package/sern-handler"
|
||||
><img src="https://img.shields.io/badge/builds-stable" alt="Builds Passing"
|
||||
/></a>
|
||||
|
||||
<p>
|
||||
Sern can automate and streamline development of your discord bot with new version compatibility and full
|
||||
customization.
|
||||
</p>
|
||||
<ul>
|
||||
<li>A reincarnation of <a href="https://github.com/jacoobes/sern_handler">this old project</a></li>
|
||||
</ul>
|
||||
|
||||
<a href="#installation" id="installation" style="color: inherit; text-decoration: none">
|
||||
<h2>Installation</h2>
|
||||
</a>
|
||||
<pre><code class="language-sh"><span class="hl-0">npm install sern-handler</span>
|
||||
</code></pre>
|
||||
<pre><code class="language-sh"><span class="hl-0">yarn add sern-handler</span>
|
||||
</code></pre>
|
||||
<pre><code class="language-sh"><span class="hl-0">pnpm add sern-handler</span>
|
||||
</code></pre>
|
||||
|
||||
<a href="#basic-usage" id="basic-usage" style="color: inherit; text-decoration: none">
|
||||
<h2>Basic Usage</h2>
|
||||
</a>
|
||||
|
||||
<a href="#indexjs" id="indexjs" style="color: inherit; text-decoration: none">
|
||||
<h4><code>index.js</code></h4>
|
||||
</a>
|
||||
<pre><code class="language-js"><span class="hl-1">import</span><span class="hl-0"> { </span><span class="hl-2">Client</span><span class="hl-0">, </span><span class="hl-2">Intents</span><span class="hl-0"> } </span><span class="hl-1">from</span><span class="hl-0"> </span><span class="hl-3">'discord.js'</span><span class="hl-0">;</span><br/><span class="hl-1">import</span><span class="hl-0"> { </span><span class="hl-2">Sern</span><span class="hl-0"> } </span><span class="hl-1">from</span><span class="hl-0"> </span><span class="hl-3">'sern-handler'</span><span class="hl-0">;</span><br/><span class="hl-1">import</span><span class="hl-0"> { </span><span class="hl-2">prefix</span><span class="hl-0">, </span><span class="hl-2">token</span><span class="hl-0"> } </span><span class="hl-1">from</span><span class="hl-0"> </span><span class="hl-3">'../src/secrets.json'</span><span class="hl-0">;</span><br/><br/><span class="hl-4">const</span><span class="hl-0"> </span><span class="hl-5">client</span><span class="hl-0"> = </span><span class="hl-4">new</span><span class="hl-0"> </span><span class="hl-6">Client</span><span class="hl-0">({</span><br/><span class="hl-0"> </span><span class="hl-2">intents:</span><span class="hl-0"> [</span><br/><span class="hl-0"> </span><span class="hl-2">Intents</span><span class="hl-0">.</span><span class="hl-5">FLAGS</span><span class="hl-0">.</span><span class="hl-5">GUILDS</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">Intents</span><span class="hl-0">.</span><span class="hl-5">FLAGS</span><span class="hl-0">.</span><span class="hl-5">GUILD_MESSAGES</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">Intents</span><span class="hl-0">.</span><span class="hl-5">FLAGS</span><span class="hl-0">.</span><span class="hl-5">GUILD_MEMBERS</span><br/><span class="hl-0"> ]</span><br/><span class="hl-0">});</span><br/><br/><span class="hl-4">new</span><span class="hl-0"> </span><span class="hl-2">Sern</span><span class="hl-0">.</span><span class="hl-6">Handler</span><span class="hl-0">({</span><br/><span class="hl-0"> </span><span class="hl-2">client</span><span class="hl-0">, </span><br/><span class="hl-0"> </span><span class="hl-2">prefix</span><span class="hl-0">, </span><br/><span class="hl-0"> </span><span class="hl-2">commands :</span><span class="hl-0"> </span><span class="hl-3">'dist/commands'</span><span class="hl-0">, </span><br/><span class="hl-0"> </span><span class="hl-2">privateServers :</span><span class="hl-0"> [ </span><br/><span class="hl-0"> {</span><br/><span class="hl-0"> </span><span class="hl-2">test :</span><span class="hl-0"> </span><span class="hl-4">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">id:</span><span class="hl-0"> </span><span class="hl-3">'server-id'</span><br/><span class="hl-0"> }</span><br/><span class="hl-0"> ],</span><br/><span class="hl-0"> </span><span class="hl-6">init</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">async</span><span class="hl-0"> (</span><span class="hl-2">handler</span><span class="hl-0">) </span><span class="hl-4">=></span><span class="hl-0"> {</span><br/><span class="hl-0"> </span><span class="hl-7">// Optional function to initialize anything else on bot startup</span><br/><span class="hl-0"> },</span><br/><span class="hl-0">});</span><br/><br/><br/><span class="hl-2">client</span><span class="hl-0">.</span><span class="hl-6">login</span><span class="hl-0">(</span><span class="hl-2">token</span><span class="hl-0">);</span>
|
||||
</code></pre>
|
||||
|
||||
<a href="#pingjs" id="pingjs" style="color: inherit; text-decoration: none">
|
||||
<h4><code>ping.js</code></h4>
|
||||
</a>
|
||||
<pre><code class="language-js"><span class="hl-1">import</span><span class="hl-0"> { </span><span class="hl-2">Sern</span><span class="hl-0">, </span><span class="hl-2">Types</span><span class="hl-0"> } </span><span class="hl-1">from</span><span class="hl-0"> </span><span class="hl-3">'sern-handler'</span><span class="hl-0">;</span><br/><span class="hl-1">import</span><span class="hl-0"> { </span><span class="hl-2">Ok</span><span class="hl-0"> } </span><span class="hl-1">from</span><span class="hl-0"> </span><span class="hl-3">'ts-results'</span><span class="hl-0">;</span><br/><br/><span class="hl-1">export</span><span class="hl-0"> </span><span class="hl-1">default</span><span class="hl-0"> {</span><br/><span class="hl-0"> </span><span class="hl-2">alias:</span><span class="hl-0"> [],</span><br/><span class="hl-0"> </span><span class="hl-2">desc :</span><span class="hl-0"> </span><span class="hl-3">'A ping pong command'</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">visibility :</span><span class="hl-0"> </span><span class="hl-3">'private'</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">test :</span><span class="hl-0"> </span><span class="hl-4">false</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">type:</span><span class="hl-0"> </span><span class="hl-2">Sern</span><span class="hl-0">.</span><span class="hl-2">CommandType</span><span class="hl-0">.</span><span class="hl-5">SLASH</span><span class="hl-0"> | </span><span class="hl-2">Sern</span><span class="hl-0">.</span><span class="hl-2">CommandType</span><span class="hl-0">.</span><span class="hl-5">TEXT</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-6">execute</span><span class="hl-2"> :</span><span class="hl-0"> </span><span class="hl-4">async</span><span class="hl-0"> ({ </span><span class="hl-2">message</span><span class="hl-0">, </span><span class="hl-2">interaction</span><span class="hl-0"> }, </span><span class="hl-2">args</span><span class="hl-0">) </span><span class="hl-4">=></span><span class="hl-0"> {</span><br/><span class="hl-0"> </span><span class="hl-2">interaction</span><span class="hl-0">.</span><span class="hl-6">reply</span><span class="hl-0">({ </span><span class="hl-2">content:</span><span class="hl-0"> </span><span class="hl-3">'Pong! })</span><span class="hl-8">;</span><br/><span class="hl-0"> }</span><br/><span class="hl-0">};</span>
|
||||
</code></pre>
|
||||
<p>See <a href="https://sernhandler.js.org">documentation</a> for TypeScript examples and more</p>
|
||||
|
||||
<a href="#links-" id="links-" style="color: inherit; text-decoration: none">
|
||||
<h2>Links <img src="https://img.shields.io/badge/Coming-Soon-purple" alt="link" /></h2>
|
||||
</a>
|
||||
<ul>
|
||||
<li><a href="https://tmp.com">Official Documentation</a></li>
|
||||
<li><a href="https://tmp.com">Example Bot</a></li>
|
||||
<li><a href="https://google.com">Discord Server</a></li>
|
||||
</ul>
|
||||
|
||||
<a href="#contribute" id="contribute" style="color: inherit; text-decoration: none">
|
||||
<h2>Contribute</h2>
|
||||
</a>
|
||||
<ul>
|
||||
<li>
|
||||
Pull up on <a href="https://github.com/jacoobes/Sern/issues">issues</a> and tell me if there are bugs
|
||||
</li>
|
||||
<li>All kinds of contributions are welcomed!</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class="current"><a href="modules.html">Exports</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky"><ul></ul></nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,559 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>Module | sern-handler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li><a href="Sern.Module.html">Module</a></li>
|
||||
</ul>
|
||||
<h1>Interface Module<T></h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel tsd-comment">
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>An object that gets imported and acts as a command.</p>
|
||||
</div>
|
||||
<dl class="tsd-comment-tags">
|
||||
<dt>property</dt>
|
||||
<dd><p>{string} desc</p></dd>
|
||||
<dt>property</dt>
|
||||
<dd><p>{Visibility} visibility</p></dd>
|
||||
<dt>property</dt>
|
||||
<dd><p>{CommandType} type</p></dd>
|
||||
<dt>property</dt>
|
||||
<dd>
|
||||
<p>
|
||||
{(eventParams : Context, args : Ok<T=string>) => Awaitable<possibleOutput | void>}
|
||||
execute
|
||||
</p>
|
||||
</dd>
|
||||
<dt>prop</dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
</div>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-type-parameters">
|
||||
<h3>Type parameters</h3>
|
||||
<ul class="tsd-type-parameters">
|
||||
<li>
|
||||
<h4>T = <span class="tsd-signature-type">string</span></h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-hierarchy">
|
||||
<h3>Hierarchy</h3>
|
||||
<ul class="tsd-hierarchy">
|
||||
<li><span class="target">Module</span></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Properties</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#alias" class="tsd-kind-icon">alias</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#desc" class="tsd-kind-icon">desc</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#test" class="tsd-kind-icon">test</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#type" class="tsd-kind-icon">type</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#visibility" class="tsd-kind-icon">visibility</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section">
|
||||
<h3>Methods</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#execute" class="tsd-kind-icon">execute</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#parse" class="tsd-kind-icon">parse</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Properties</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="alias" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
alias<a href="#alias" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
alias<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">[]</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L288"
|
||||
>handler/sern.ts:288</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="desc" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
desc<a href="#desc" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
desc<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L289"
|
||||
>handler/sern.ts:289</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="test" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
test<a href="#test" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
test<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L292"
|
||||
>handler/sern.ts:292</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="type" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
type<a href="#type" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
type<span class="tsd-signature-symbol">:</span>
|
||||
<a href="../enums/Sern.CommandType.html" class="tsd-signature-type" data-tsd-kind="Enumeration"
|
||||
>CommandType</a
|
||||
>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L291"
|
||||
>handler/sern.ts:291</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="visibility" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
visibility<a href="#visibility" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
visibility<span class="tsd-signature-symbol">:</span>
|
||||
<a href="../modules/Types.html#Visibility" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>Visibility</a
|
||||
>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L290"
|
||||
>handler/sern.ts:290</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Methods</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
|
||||
<a id="execute" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
execute<a href="#execute" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
execute<span class="tsd-signature-symbol">(</span>eventParams<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><a href="../modules/Types.html#Context" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>Context</a
|
||||
>, args<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Ok</span
|
||||
><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Awaitable</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span
|
||||
><span class="tsd-signature-symbol"> | </span
|
||||
><a href="../modules/Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L293"
|
||||
>handler/sern.ts:293</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>
|
||||
eventParams:
|
||||
<a href="../modules/Types.html#Context" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>Context</a
|
||||
>
|
||||
</h5>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
args: <span class="tsd-signature-type">Ok</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns <span class="tsd-signature-type">Awaitable</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span
|
||||
><span class="tsd-signature-symbol"> | </span
|
||||
><a
|
||||
href="../modules/Types.html#possibleOutput"
|
||||
class="tsd-signature-type"
|
||||
data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
|
||||
<a id="parse" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagOptional">Optional</span> parse<a
|
||||
href="#parse"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
parse<span class="tsd-signature-symbol">(</span>ctx<span class="tsd-signature-symbol">: </span
|
||||
><a href="../modules/Types.html#Context" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>Context</a
|
||||
>, args<span class="tsd-signature-symbol">: </span
|
||||
><a href="../modules/Types.html#Arg" class="tsd-signature-type" data-tsd-kind="Type alias">Arg</a
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><a href="../modules/Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L294"
|
||||
>handler/sern.ts:294</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>
|
||||
ctx:
|
||||
<a href="../modules/Types.html#Context" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>Context</a
|
||||
>
|
||||
</h5>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
args:
|
||||
<a href="../modules/Types.html#Arg" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>Arg</a
|
||||
>
|
||||
</h5>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns
|
||||
<a href="../modules/Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="current tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Sern.Module.html" class="tsd-kind-icon">Module</a>
|
||||
<ul>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#alias" class="tsd-kind-icon">alias</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#desc" class="tsd-kind-icon">desc</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#test" class="tsd-kind-icon">test</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#type" class="tsd-kind-icon">type</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#visibility" class="tsd-kind-icon">visibility</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#execute" class="tsd-kind-icon">execute</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface">
|
||||
<a href="Sern.Module.html#parse" class="tsd-kind-icon">parse</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Legend</h2>
|
||||
<div class="tsd-legend-group">
|
||||
<ul class="tsd-legend">
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface"><span class="tsd-kind-icon">Method</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,409 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>Wrapper | sern-handler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li><a href="Sern.Wrapper.html">Wrapper</a></li>
|
||||
</ul>
|
||||
<h1>Interface Wrapper</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel tsd-comment">
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>An object to be passed into Sern.Handler constructor.</p>
|
||||
</div>
|
||||
<dl class="tsd-comment-tags">
|
||||
<dt>property</dt>
|
||||
<dd><p>{readonly Client} client</p></dd>
|
||||
<dt>property</dt>
|
||||
<dd><p>{readonly string} prefix</p></dd>
|
||||
<dt>property</dt>
|
||||
<dd><p>{readonly string} commands</p></dd>
|
||||
<dt>prop</dt>
|
||||
<dd><p>{(handler : Handler) => void)} init</p></dd>
|
||||
<dt>property</dt>
|
||||
<dd><p>{readonly {test: boolean, id: string}[]} privateServers</p></dd>
|
||||
</dl>
|
||||
</div>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-hierarchy">
|
||||
<h3>Hierarchy</h3>
|
||||
<ul class="tsd-hierarchy">
|
||||
<li><span class="target">Wrapper</span></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Properties</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#client" class="tsd-kind-icon">client</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#commands" class="tsd-kind-icon">commands</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#prefix" class="tsd-kind-icon">prefix</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#privateServers" class="tsd-kind-icon">private<wbr />Servers</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section">
|
||||
<h3>Methods</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#init" class="tsd-kind-icon">init</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Properties</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="client" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagReadonly">Readonly</span> client<a
|
||||
href="#client"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
client<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Client</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">boolean</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L270"
|
||||
>handler/sern.ts:270</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="commands" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagReadonly">Readonly</span> commands<a
|
||||
href="#commands"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
commands<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L272"
|
||||
>handler/sern.ts:272</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="prefix" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagReadonly">Readonly</span> prefix<a
|
||||
href="#prefix"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
prefix<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L271"
|
||||
>handler/sern.ts:271</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||
<a id="privateServers" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagReadonly">Readonly</span> private<wbr />Servers<a
|
||||
href="#privateServers"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
private<wbr />Servers<span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-symbol">{ </span>id<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>test<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">[]</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L274"
|
||||
>handler/sern.ts:274</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Methods</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
|
||||
<a id="init" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
<span class="tsd-flag ts-flagOptional">Optional</span> init<a
|
||||
href="#init"
|
||||
aria-label="Permalink"
|
||||
class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
init<span class="tsd-signature-symbol">(</span>handler<span class="tsd-signature-symbol">: </span
|
||||
><a href="../classes/Sern.Handler.html" class="tsd-signature-type" data-tsd-kind="Class">Handler</a
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">void</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/sern.ts#L273"
|
||||
>handler/sern.ts:273</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>
|
||||
handler:
|
||||
<a href="../classes/Sern.Handler.html" class="tsd-signature-type" data-tsd-kind="Class"
|
||||
>Handler</a
|
||||
>
|
||||
</h5>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="../modules/Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="../modules/Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="current tsd-kind-interface tsd-parent-kind-namespace">
|
||||
<a href="Sern.Wrapper.html" class="tsd-kind-icon">Wrapper</a>
|
||||
<ul>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#client" class="tsd-kind-icon">client</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#commands" class="tsd-kind-icon">commands</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#prefix" class="tsd-kind-icon">prefix</a>
|
||||
</li>
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#privateServers" class="tsd-kind-icon">private<wbr />Servers</a>
|
||||
</li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface">
|
||||
<a href="Sern.Wrapper.html#init" class="tsd-kind-icon">init</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Legend</h2>
|
||||
<div class="tsd-legend-group">
|
||||
<ul class="tsd-legend">
|
||||
<li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li>
|
||||
<li class="tsd-kind-method tsd-parent-kind-interface"><span class="tsd-kind-icon">Method</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,115 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>SernHandler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="assets/style.css" />
|
||||
<link rel="stylesheet" href="assets/highlight.css" />
|
||||
<script async src="assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base=".">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="index.html" class="title">SernHandler - Develop faster. Grow more.</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container"><h1>sern-handler</h1></div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Namespaces</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-namespace"><a href="modules/Sern.html" class="tsd-kind-icon">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Types.html" class="tsd-kind-icon">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Utils.html" class="tsd-kind-icon">Utils</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class="current"><a href="modules.html">Exports</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="modules/Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky"><ul></ul></nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,155 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>Sern | sern-handler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="Sern.html">Sern</a></li>
|
||||
</ul>
|
||||
<h1>Namespace Sern</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Enumerations</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-enum tsd-parent-kind-namespace">
|
||||
<a href="../enums/Sern.CommandType.html" class="tsd-kind-icon">Command<wbr />Type</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section">
|
||||
<h3>Classes</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-class tsd-parent-kind-namespace">
|
||||
<a href="../classes/Sern.Handler.html" class="tsd-kind-icon">Handler</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section">
|
||||
<h3>Interfaces</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="../interfaces/Sern.Module.html" class="tsd-kind-icon">Module</a>
|
||||
</li>
|
||||
<li class="tsd-kind-interface tsd-parent-kind-namespace">
|
||||
<a href="../interfaces/Sern.Wrapper.html" class="tsd-kind-icon">Wrapper</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="tsd-kind-enum tsd-parent-kind-namespace">
|
||||
<a href="../enums/Sern.CommandType.html" class="tsd-kind-icon">Command<wbr />Type</a>
|
||||
</li>
|
||||
<li class="tsd-kind-class tsd-parent-kind-namespace">
|
||||
<a href="../classes/Sern.Handler.html" class="tsd-kind-icon">Handler</a>
|
||||
</li>
|
||||
<li class="tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="../interfaces/Sern.Module.html" class="tsd-kind-icon">Module</a>
|
||||
</li>
|
||||
<li class="tsd-kind-interface tsd-parent-kind-namespace">
|
||||
<a href="../interfaces/Sern.Wrapper.html" class="tsd-kind-icon">Wrapper</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,533 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>Types | sern-handler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="Types.html">Types</a></li>
|
||||
</ul>
|
||||
<h1>Namespace Types</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Type aliases</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#Arg" class="tsd-kind-icon">Arg</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#Context" class="tsd-kind-icon">Context</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Types.html#Nullable" class="tsd-kind-icon">Nullable</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Types.html#ParseType" class="tsd-kind-icon">Parse<wbr />Type</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#SlashOptions" class="tsd-kind-icon">Slash<wbr />Options</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#Visibility" class="tsd-kind-icon">Visibility</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#execute" class="tsd-kind-icon">execute</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Types.html#possibleOutput" class="tsd-kind-icon">possible<wbr />Output</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Type aliases</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a id="Arg" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Arg<a href="#Arg" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Arg<span class="tsd-signature-symbol">:</span>
|
||||
<a href="Types.html#ParseType" class="tsd-signature-type" data-tsd-kind="Type alias">ParseType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>slash<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><a href="Types.html#SlashOptions" class="tsd-signature-type" data-tsd-kind="Type alias">SlashOptions</a
|
||||
><span class="tsd-signature-symbol">; </span>text<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L30"
|
||||
>types/handler.ts:30</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a id="Context" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Context<a href="#Context" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Context<span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-symbol">{ </span>interaction<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">Option</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">CommandInteraction</span><span class="tsd-signature-symbol">></span
|
||||
><span class="tsd-signature-symbol">; </span>message<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">Option</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">Message</span><span class="tsd-signature-symbol">></span
|
||||
><span class="tsd-signature-symbol"> }</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L25"
|
||||
>types/handler.ts:25</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-type-declaration">
|
||||
<h4>Type declaration</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li class="tsd-parameter">
|
||||
<h5>
|
||||
interaction<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">Option</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">CommandInteraction</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
</li>
|
||||
<li class="tsd-parameter">
|
||||
<h5>
|
||||
message<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Option</span
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">Message</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a id="Nullable" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Nullable<a href="#Nullable" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Nullable<span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">null</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L17"
|
||||
>types/handler.ts:17</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
<ul class="tsd-type-parameters">
|
||||
<li><h4>T</h4></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a id="ParseType" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Parse<wbr />Type<a href="#ParseType" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Parse<wbr />Type<span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-symbol">{</span> <span class="tsd-signature-symbol">[ </span
|
||||
><span class="tsd-signature-type">K</span><span class="tsd-signature-symbol"> in </span
|
||||
><span class="tsd-signature-symbol">keyof </span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">]</span><span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">K</span
|
||||
><span class="tsd-signature-symbol">]</span><span class="tsd-signature-symbol"> extends </span
|
||||
><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol"> ? </span
|
||||
><span class="tsd-signature-symbol">[</span>k<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">K</span><span class="tsd-signature-symbol">, </span>args<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">K</span
|
||||
><span class="tsd-signature-symbol">]</span><span class="tsd-signature-symbol">]</span
|
||||
><span class="tsd-signature-symbol"> : </span><span class="tsd-signature-type">never</span>
|
||||
<span class="tsd-signature-symbol">}</span><span class="tsd-signature-symbol">[</span
|
||||
><span class="tsd-signature-symbol">keyof </span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">]</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L20"
|
||||
>types/handler.ts:20</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
<ul class="tsd-type-parameters">
|
||||
<li><h4>T</h4></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a id="SlashOptions" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Slash<wbr />Options<a href="#SlashOptions" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Slash<wbr />Options<span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-type">Omit</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type">CommandInteractionOptionResolver</span
|
||||
><span class="tsd-signature-symbol">, </span
|
||||
><span class="tsd-signature-type">"getMessage"</span
|
||||
><span class="tsd-signature-symbol"> | </span
|
||||
><span class="tsd-signature-type">"getFocused"</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L33"
|
||||
>types/handler.ts:33</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a id="Visibility" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Visibility<a href="#Visibility" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Visibility<span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-type">"private"</span><span class="tsd-signature-symbol"> | </span
|
||||
><span class="tsd-signature-type">"public"</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L13"
|
||||
>types/handler.ts:13</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a id="execute" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
execute<a href="#execute" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
execute<span class="tsd-signature-symbol">:</span>
|
||||
<a href="../interfaces/Sern.Module.html" class="tsd-signature-type" data-tsd-kind="Interface">Module</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">unknown</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">[</span
|
||||
><a href="../interfaces/Sern.Module.html#execute"
|
||||
><span class="tsd-signature-type">"execute"</span></a
|
||||
><span class="tsd-signature-symbol">]</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L18"
|
||||
>types/handler.ts:18</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a id="possibleOutput" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
possible<wbr />Output<a href="#possibleOutput" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
possible<wbr />Output<span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">(</span
|
||||
><span class="tsd-signature-type">MessagePayload</span><span class="tsd-signature-symbol"> & </span
|
||||
><span class="tsd-signature-type">MessageOptions</span><span class="tsd-signature-symbol">)</span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a href="https://github.com/sern-handler/Sern/blob/29d92ca/src/types/handler.ts#L16"
|
||||
>types/handler.ts:16</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
<ul class="tsd-type-parameters">
|
||||
<li>
|
||||
<h4>T = <span class="tsd-signature-type">string</span></h4>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="Sern.html">Sern</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="Types.html">Types</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#Arg" class="tsd-kind-icon">Arg</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#Context" class="tsd-kind-icon">Context</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Types.html#Nullable" class="tsd-kind-icon">Nullable</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Types.html#ParseType" class="tsd-kind-icon">Parse<wbr />Type</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#SlashOptions" class="tsd-kind-icon">Slash<wbr />Options</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#Visibility" class="tsd-kind-icon">Visibility</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace">
|
||||
<a href="Types.html#execute" class="tsd-kind-icon">execute</a>
|
||||
</li>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Types.html#possibleOutput" class="tsd-kind-icon">possible<wbr />Output</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,659 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="default">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge" />
|
||||
<title>Utils | sern-handler</title>
|
||||
<meta name="description" content="Documentation for sern-handler" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="stylesheet" href="../assets/style.css" />
|
||||
<link rel="stylesheet" href="../assets/highlight.css" />
|
||||
<script async src="../assets/search.js" id="search-script"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
document.body.classList.add(localStorage.getItem('tsd-theme') || 'os');
|
||||
</script>
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-base="..">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label
|
||||
><input type="text" id="tsd-search-field" />
|
||||
</div>
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
<a href="../index.html" class="title">sern-handler</a>
|
||||
</div>
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-inherited"
|
||||
>Inherited</label
|
||||
><input type="checkbox" id="tsd-filter-externals" checked /><label
|
||||
class="tsd-widget"
|
||||
for="tsd-filter-externals"
|
||||
>Externals</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
<li><a href="../modules.html">sern-handler</a></li>
|
||||
<li><a href="Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
<h1>Namespace Utils</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
<section class="tsd-index-section">
|
||||
<h3>Type aliases</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Utils.html#ArgType" class="tsd-kind-icon">Arg<wbr />Type</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-index-section">
|
||||
<h3>Functions</h3>
|
||||
<ul class="tsd-index-list">
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#parseBool" class="tsd-kind-icon">parse<wbr />Bool</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#parseInt" class="tsd-kind-icon">parse<wbr />Int</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#toArr" class="tsd-kind-icon">to<wbr />Arr</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#toNegativeInt" class="tsd-kind-icon">to<wbr />Negative<wbr />Int</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#toPositiveInt" class="tsd-kind-icon">to<wbr />Positive<wbr />Int</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Type aliases</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a id="ArgType" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
Arg<wbr />Type<a href="#ArgType" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">
|
||||
Arg<wbr />Type<span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">:</span>
|
||||
<span class="tsd-signature-type">Result</span><span class="tsd-signature-symbol"><</span
|
||||
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
|
||||
><span class="tsd-signature-symbol">, </span
|
||||
><a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</div>
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a
|
||||
href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/utilities/preprocessors/args.ts#L8"
|
||||
>handler/utilities/preprocessors/args.ts:8</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>
|
||||
Wrapper type taking <code>Ok(T)</code> or <code>Err(possibleOutput)</code> e.g
|
||||
<code>Result<T, possibleOutput</code>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
<ul class="tsd-type-parameters">
|
||||
<li><h4>T</h4></li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
<section class="tsd-panel-group tsd-member-group">
|
||||
<h2>Functions</h2>
|
||||
<section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a id="parseBool" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
parse<wbr />Bool<a href="#parseBool" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-function tsd-parent-kind-namespace">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
parse<wbr />Bool<span class="tsd-signature-symbol">(</span>arg<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span>, onFailure<span class="tsd-signature-symbol">?: </span
|
||||
><a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span>, regexes<span class="tsd-signature-symbol">?: </span
|
||||
><span class="tsd-signature-symbol">{ </span>noRegex<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">RegExp</span
|
||||
><span class="tsd-signature-symbol">; </span>yesRegex<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">RegExp</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span
|
||||
><a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">boolean</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a
|
||||
href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/utilities/preprocessors/args.ts#L31"
|
||||
>handler/utilities/preprocessors/args.ts:31</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>arg: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>command arguments</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
onFailure:
|
||||
<a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> = ...</span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>If cannot parse <code>arg</code> into boolean.</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
regexes: <span class="tsd-signature-symbol">{ </span>noRegex<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">RegExp</span
|
||||
><span class="tsd-signature-symbol">; </span>yesRegex<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">RegExp</span><span class="tsd-signature-symbol"> }</span
|
||||
><span class="tsd-signature-symbol"> = ...</span>
|
||||
</h5>
|
||||
<ul class="tsd-parameters">
|
||||
<li class="tsd-parameter">
|
||||
<h5>
|
||||
no<wbr />Regex<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">RegExp</span>
|
||||
</h5>
|
||||
</li>
|
||||
<li class="tsd-parameter">
|
||||
<h5>
|
||||
yes<wbr />Regex<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">RegExp</span>
|
||||
</h5>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns
|
||||
<a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">boolean</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div>
|
||||
<p>attemps to parse <code>args</code> as a boolean</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a id="parseInt" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
parse<wbr />Int<a href="#parseInt" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-function tsd-parent-kind-namespace">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
parse<wbr />Int<span class="tsd-signature-symbol">(</span>arg<span class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span>, onFailure<span class="tsd-signature-symbol">: </span
|
||||
><a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span
|
||||
><a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">number</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a
|
||||
href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/utilities/preprocessors/args.ts#L17"
|
||||
>handler/utilities/preprocessors/args.ts:17</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>arg: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>command arguments</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
onFailure:
|
||||
<a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>if <code>Number.parseInt</code> returns NaN</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns
|
||||
<a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">number</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div>
|
||||
<p>Attempts to use <code>Number.parseInt()</code> on <code>arg</code></p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a id="toArr" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
to<wbr />Arr<a href="#toArr" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-function tsd-parent-kind-namespace">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
to<wbr />Arr<span class="tsd-signature-symbol">(</span>arg<span class="tsd-signature-symbol">: </span
|
||||
><span class="tsd-signature-type">string</span>, sep<span class="tsd-signature-symbol">?: </span
|
||||
><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span
|
||||
><a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a
|
||||
href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/utilities/preprocessors/args.ts#L55"
|
||||
>handler/utilities/preprocessors/args.ts:55</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>arg: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>command arguments</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
sep: <span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol"> = ' '</span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>default separator = ' '</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns
|
||||
<a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a id="toNegativeInt" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
to<wbr />Negative<wbr />Int<a href="#toNegativeInt" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-function tsd-parent-kind-namespace">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
to<wbr />Negative<wbr />Int<span class="tsd-signature-symbol">(</span>arg<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span>, onFailure<span class="tsd-signature-symbol">: </span
|
||||
><a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span
|
||||
><a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">number</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a
|
||||
href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/utilities/preprocessors/args.ts#L76"
|
||||
>handler/utilities/preprocessors/args.ts:76</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>arg: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>command arguments</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
onFailure:
|
||||
<a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>delegates <code>parseInt</code></p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns
|
||||
<a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">number</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a id="toPositiveInt" class="tsd-anchor"></a>
|
||||
<h3 class="tsd-anchor-link">
|
||||
to<wbr />Positive<wbr />Int<a href="#toPositiveInt" aria-label="Permalink" class="tsd-anchor-icon"
|
||||
><svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon icon-tabler icon-tabler-link"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="2"
|
||||
stroke="currentColor"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path>
|
||||
<path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg
|
||||
></a>
|
||||
</h3>
|
||||
<ul class="tsd-signatures tsd-kind-function tsd-parent-kind-namespace">
|
||||
<li class="tsd-signature tsd-kind-icon">
|
||||
to<wbr />Positive<wbr />Int<span class="tsd-signature-symbol">(</span>arg<span
|
||||
class="tsd-signature-symbol"
|
||||
>: </span
|
||||
><span class="tsd-signature-type">string</span>, onFailure<span class="tsd-signature-symbol">: </span
|
||||
><a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span
|
||||
><span class="tsd-signature-symbol">: </span
|
||||
><a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">number</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tsd-descriptions">
|
||||
<li class="tsd-description">
|
||||
<aside class="tsd-sources">
|
||||
<ul>
|
||||
<li>
|
||||
Defined in
|
||||
<a
|
||||
href="https://github.com/sern-handler/Sern/blob/29d92ca/src/handler/utilities/preprocessors/args.ts#L66"
|
||||
>handler/utilities/preprocessors/args.ts:66</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
<li>
|
||||
<h5>arg: <span class="tsd-signature-type">string</span></h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>command arguments</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h5>
|
||||
onFailure:
|
||||
<a href="Types.html#possibleOutput" class="tsd-signature-type" data-tsd-kind="Type alias"
|
||||
>possibleOutput</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h5>
|
||||
<div class="tsd-comment tsd-typography">
|
||||
<div class="lead">
|
||||
<p>delegates <code>Utils.parseInt</code></p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 class="tsd-returns-title">
|
||||
Returns
|
||||
<a href="Utils.html#ArgType" class="tsd-signature-type" data-tsd-kind="Type alias">ArgType</a
|
||||
><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">number</span
|
||||
><span class="tsd-signature-symbol">></span>
|
||||
</h4>
|
||||
<div></div>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
<li class=""><a href="../modules.html">Exports</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="Sern.html">Sern</a></li>
|
||||
<li class="tsd-kind-namespace"><a href="Types.html">Types</a></li>
|
||||
<li class="current tsd-kind-namespace"><a href="Utils.html">Utils</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul>
|
||||
<li class="tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter">
|
||||
<a href="Utils.html#ArgType" class="tsd-kind-icon">Arg<wbr />Type</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#parseBool" class="tsd-kind-icon">parse<wbr />Bool</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#parseInt" class="tsd-kind-icon">parse<wbr />Int</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#toArr" class="tsd-kind-icon">to<wbr />Arr</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#toNegativeInt" class="tsd-kind-icon">to<wbr />Negative<wbr />Int</a>
|
||||
</li>
|
||||
<li class="tsd-kind-function tsd-parent-kind-namespace">
|
||||
<a href="Utils.html#toPositiveInt" class="tsd-kind-icon">to<wbr />Positive<wbr />Int</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="with-border-bottom">
|
||||
<div class="container">
|
||||
<h2>Settings</h2>
|
||||
<p>
|
||||
Theme
|
||||
<select id="theme">
|
||||
<option value="os">OS</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
<div class="overlay"></div>
|
||||
<script src="../assets/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
194
jest.config.ts
194
jest.config.ts
@@ -1,194 +0,0 @@
|
||||
/*
|
||||
* For a detailed explanation regarding each configuration property and type check, visit:
|
||||
* https://jestjs.io/docs/configuration
|
||||
*/
|
||||
|
||||
export default {
|
||||
// All imported modules in your tests should be mocked automatically
|
||||
// automock: false,
|
||||
|
||||
// Stop running tests after `n` failures
|
||||
// bail: 0,
|
||||
|
||||
// The directory where Jest should store its cached dependency information
|
||||
// cacheDirectory: "C:\\Users\\jeyus\\AppData\\Local\\Temp\\jest",
|
||||
|
||||
// Automatically clear mock calls, instances and results before every test
|
||||
clearMocks: true,
|
||||
|
||||
// Indicates whether the coverage information should be collected while executing the test
|
||||
collectCoverage: true,
|
||||
|
||||
// An array of glob patterns indicating a set of files for which coverage information should be collected
|
||||
// collectCoverageFrom: undefined,
|
||||
|
||||
// The directory where Jest should output its coverage files
|
||||
coverageDirectory: 'coverage',
|
||||
|
||||
// An array of regexp pattern strings used to skip coverage collection
|
||||
// coveragePathIgnorePatterns: [
|
||||
// "\\\\node_modules\\\\"
|
||||
// ],
|
||||
|
||||
// Indicates which provider should be used to instrument code for coverage
|
||||
coverageProvider: 'v8',
|
||||
|
||||
// A list of reporter names that Jest uses when writing coverage reports
|
||||
// coverageReporters: [
|
||||
// "json",
|
||||
// "text",
|
||||
// "lcov",
|
||||
// "clover"
|
||||
// ],
|
||||
|
||||
// An object that configures minimum threshold enforcement for coverage results
|
||||
// coverageThreshold: undefined,
|
||||
|
||||
// A path to a custom dependency extractor
|
||||
// dependencyExtractor: undefined,
|
||||
|
||||
// Make calling deprecated APIs throw helpful error messages
|
||||
// errorOnDeprecated: false,
|
||||
|
||||
// Force coverage collection from ignored files using an array of glob patterns
|
||||
// forceCoverageMatch: [],
|
||||
|
||||
// A path to a module which exports an async function that is triggered once before all test suites
|
||||
// globalSetup: undefined,
|
||||
|
||||
// A path to a module which exports an async function that is triggered once after all test suites
|
||||
// globalTeardown: undefined,
|
||||
|
||||
// A set of global variables that need to be available in all test environments
|
||||
// globals: {},
|
||||
|
||||
// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
|
||||
// maxWorkers: "50%",
|
||||
|
||||
// An array of directory names to be searched recursively up from the requiring module's location
|
||||
// moduleDirectories: [
|
||||
// "node_modules"
|
||||
// ],
|
||||
|
||||
// An array of file extensions your modules use
|
||||
// moduleFileExtensions: [
|
||||
// "js",
|
||||
// "jsx",
|
||||
// "ts",
|
||||
// "tsx",
|
||||
// "json",
|
||||
// "node"
|
||||
// ],
|
||||
|
||||
// A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
|
||||
// moduleNameMapper: {},
|
||||
|
||||
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
|
||||
// modulePathIgnorePatterns: [],
|
||||
|
||||
// Activates notifications for test results
|
||||
// notify: false,
|
||||
|
||||
// An enum that specifies notification mode. Requires { notify: true }
|
||||
// notifyMode: "failure-change",
|
||||
|
||||
// A preset that is used as a base for Jest's configuration
|
||||
// preset: undefined,
|
||||
|
||||
// Run tests from one or more projects
|
||||
// projects: undefined,
|
||||
|
||||
// Use this configuration option to add custom reporters to Jest
|
||||
// reporters: undefined,
|
||||
|
||||
// Automatically reset mock state before every test
|
||||
// resetMocks: false,
|
||||
|
||||
// Reset the module registry before running each individual test
|
||||
// resetModules: false,
|
||||
|
||||
// A path to a custom resolver
|
||||
// resolver: undefined,
|
||||
|
||||
// Automatically restore mock state and implementation before every test
|
||||
// restoreMocks: false,
|
||||
|
||||
// The root directory that Jest should scan for tests and modules within
|
||||
// rootDir: undefined,
|
||||
|
||||
// A list of paths to directories that Jest should use to search for files in
|
||||
// roots: [
|
||||
// "<rootDir>"
|
||||
// ],
|
||||
|
||||
// Allows you to use a custom runner instead of Jest's default test runner
|
||||
// runner: "jest-runner",
|
||||
|
||||
// The paths to modules that run some code to configure or set up the testing environment before each test
|
||||
// setupFiles: [],
|
||||
|
||||
// A list of paths to modules that run some code to configure or set up the testing framework before each test
|
||||
// setupFilesAfterEnv: [],
|
||||
|
||||
// The number of seconds after which a test is considered as slow and reported as such in the results.
|
||||
// slowTestThreshold: 5,
|
||||
|
||||
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
|
||||
// snapshotSerializers: [],
|
||||
|
||||
// The test environment that will be used for testing
|
||||
// testEnvironment: "jest-environment-node",
|
||||
|
||||
// Options that will be passed to the testEnvironment
|
||||
// testEnvironmentOptions: {},
|
||||
|
||||
// Adds a location field to test results
|
||||
// testLocationInResults: false,
|
||||
|
||||
// The glob patterns Jest uses to detect test files
|
||||
// testMatch: [
|
||||
// "**/__tests__/**/*.[jt]s?(x)",
|
||||
// "**/?(*.)+(spec|test).[tj]s?(x)"
|
||||
// ],
|
||||
|
||||
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
|
||||
// testPathIgnorePatterns: [
|
||||
// "\\\\node_modules\\\\"
|
||||
// ],
|
||||
|
||||
// The regexp pattern or array of patterns that Jest uses to detect test files
|
||||
// testRegex: [],
|
||||
|
||||
// This option allows the use of a custom results processor
|
||||
// testResultsProcessor: undefined,
|
||||
|
||||
// This option allows use of a custom test runner
|
||||
// testRunner: "jest-circus/runner",
|
||||
|
||||
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
|
||||
// testURL: "http://localhost",
|
||||
|
||||
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
|
||||
// timers: "real",
|
||||
|
||||
// A map from regular expressions to paths to transformers
|
||||
// transform: undefined,
|
||||
|
||||
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
|
||||
// transformIgnorePatterns: [
|
||||
// "\\\\node_modules\\\\",
|
||||
// "\\.pnp\\.[^\\\\]+$"
|
||||
// ],
|
||||
|
||||
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
|
||||
// unmockedModulePathPatterns: undefined,
|
||||
|
||||
// Indicates whether each individual test should be reported during the run
|
||||
// verbose: undefined,
|
||||
|
||||
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
|
||||
// watchPathIgnorePatterns: [],
|
||||
|
||||
// Whether to use watchman for file crawling
|
||||
// watchman: true,
|
||||
};
|
||||
22190
package-lock.json
generated
22190
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
144
package.json
144
package.json
@@ -1,53 +1,97 @@
|
||||
{
|
||||
"name": "@sern/handler",
|
||||
"version": "1.0.1-beta",
|
||||
"description": "A customizable, batteries-included, powerful discord.js framework to automate and streamline bot development.",
|
||||
"main": "dist/index.js",
|
||||
"scripts": {
|
||||
"compile": "tsc",
|
||||
"watch": "tsc -w",
|
||||
"lint": "eslint src/**/*.ts",
|
||||
"format": "eslint src/**/*.ts --fix",
|
||||
"release": "standard-version && git push --follow-tags",
|
||||
"test": "jest --coverage --verbose",
|
||||
"commit": "cz"
|
||||
},
|
||||
"keywords": [
|
||||
"sern-handler",
|
||||
"sern",
|
||||
"handler",
|
||||
"sern handler",
|
||||
"wrapper",
|
||||
"discord.js",
|
||||
"framework"
|
||||
],
|
||||
"author": "SernDevs",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"discord.js": "^14.0.0-dev.1647259751.2297c2b",
|
||||
"rxjs": "^7.5.5",
|
||||
"ts-pattern": "^4.0.2",
|
||||
"ts-results": "^3.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^8.8.0",
|
||||
"@typescript-eslint/parser": "^5.10.2",
|
||||
"@typescript-eslint/eslint-plugin": "^5.10.2",
|
||||
"@babel/core": "^7.17.2",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/preset-typescript": "^7.16.7",
|
||||
"@types/jest": "^27.4.0",
|
||||
"babel-jest": "^27.5.1",
|
||||
"cz-conventional-changelog": "3.0.1",
|
||||
"jest": "^27.5.1",
|
||||
"prettier": "2.6.2",
|
||||
"standard-version": "^9.3.2",
|
||||
"typedoc": "^0.22.11",
|
||||
"typescript": "^4.5.5"
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "cz-conventional-changelog"
|
||||
"name": "@sern/handler",
|
||||
"packageManager": "yarn@3.5.0",
|
||||
"version": "4.2.6",
|
||||
"description": "A complete, customizable, typesafe, & reactive framework for discord bots.",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./dist/index.js",
|
||||
"require": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"watch": "tsc --watch",
|
||||
"lint": "eslint src/**/*.ts",
|
||||
"format": "eslint src/**/*.ts --fix",
|
||||
"build:dev": "tsc",
|
||||
"build:prod": "tsc",
|
||||
"prepare": "tsc",
|
||||
"pretty": "prettier --write .",
|
||||
"tdd": "vitest",
|
||||
"benchmark": "vitest bench",
|
||||
"test": "vitest --run",
|
||||
"analyze-imports": "npx depcruise src --include-only \"^src\" --output-type dot | dot -T svg > dependency-graph.svg"
|
||||
},
|
||||
"keywords": [
|
||||
"sern-handler",
|
||||
"sern",
|
||||
"handler",
|
||||
"sern handler",
|
||||
"wrapper",
|
||||
"discord.js",
|
||||
"framework"
|
||||
],
|
||||
"author": "SernDevs",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sern/ioc": "^1.1.2",
|
||||
"callsites": "^3.1.0",
|
||||
"cron": "^3.1.7",
|
||||
"deepmerge": "^4.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@faker-js/faker": "^8.0.1",
|
||||
"@types/node": "^20.0.0",
|
||||
"@types/node-cron": "^3.0.11",
|
||||
"@typescript-eslint/eslint-plugin": "5.58.0",
|
||||
"@typescript-eslint/parser": "5.59.1",
|
||||
"discord.js": "^14.22.1",
|
||||
"eslint": "8.39.0",
|
||||
"typescript": "5.0.2",
|
||||
"vitest": "^1.6.0"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"extends": [
|
||||
"plugin:@typescript-eslint/recommended"
|
||||
],
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "script"
|
||||
},
|
||||
"rules": {
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
"quotes": [
|
||||
2,
|
||||
"single",
|
||||
{
|
||||
"avoidEscape": true,
|
||||
"allowTemplateLiterals": true
|
||||
}
|
||||
],
|
||||
"semi": [
|
||||
"error",
|
||||
"always"
|
||||
],
|
||||
"@typescript-eslint/no-empty-interface": 0,
|
||||
"@typescript-eslint/ban-types": 0,
|
||||
"@typescript-eslint/no-explicit-any": "off"
|
||||
}
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/sern-handler/handler.git"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 20.0.x"
|
||||
},
|
||||
"homepage": "https://sern.dev",
|
||||
"overrides": {
|
||||
"ws": "8.17.1"
|
||||
},
|
||||
"resolutions": {
|
||||
"ws": "8.17.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
19
renovate.json
Normal file
19
renovate.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"extends": [
|
||||
"config:base",
|
||||
"helpers:pinGitHubActionDigests",
|
||||
"group:allNonMajor"
|
||||
],
|
||||
"major": {
|
||||
"dependencyDashboardApproval": true,
|
||||
"reviewers": ["EvolutionX-10", "jacoobes", "Murtatrxx"]
|
||||
},
|
||||
"minor": {
|
||||
"reviewers": ["jacoobes", "Murtatrxx"]
|
||||
},
|
||||
"schedule": ["every weekend"],
|
||||
"lockFileMaintenance": {
|
||||
"enabled": true,
|
||||
"automerge": true
|
||||
}
|
||||
}
|
||||
124
src/core/functions.ts
Normal file
124
src/core/functions.ts
Normal file
@@ -0,0 +1,124 @@
|
||||
import type { Module, SernAutocompleteData, SernOptionsData } from '../types/core-modules';
|
||||
import type {
|
||||
AnySelectMenuInteraction,
|
||||
ButtonInteraction,
|
||||
ChatInputCommandInteraction,
|
||||
MessageContextMenuCommandInteraction,
|
||||
ModalSubmitInteraction,
|
||||
UserContextMenuCommandInteraction,
|
||||
AutocompleteInteraction,
|
||||
} from 'discord.js';
|
||||
import { ApplicationCommandOptionType, InteractionType } from 'discord.js';
|
||||
import { PluginType } from './structures/enums';
|
||||
import type { Payload, UnpackedDependencies } from '../types/utility';
|
||||
import path from 'node:path'
|
||||
|
||||
export const createSDT = (module: Module, deps: UnpackedDependencies, params: string|undefined) => {
|
||||
return {
|
||||
state: {},
|
||||
deps,
|
||||
params,
|
||||
type: module.type,
|
||||
module: {
|
||||
name: module.name,
|
||||
description: module.description,
|
||||
locals: module.locals,
|
||||
meta: module.meta
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the first character(s) _[depending on prefix length]_ of the message
|
||||
* @param msg
|
||||
* @param prefix The prefix to remove
|
||||
* @returns The message without the prefix
|
||||
* @example
|
||||
* message.content = '!ping';
|
||||
* console.log(fmt(message.content, '!'));
|
||||
* // [ 'ping' ]
|
||||
*/
|
||||
export function fmt(msg: string, prefix?: string): string[] {
|
||||
if(!prefix) throw Error("Unable to parse message without prefix");
|
||||
return msg.slice(prefix.length).trim().split(/\s+/g);
|
||||
}
|
||||
|
||||
|
||||
export function partitionPlugins<T,V>
|
||||
(arr: Array<{ type: PluginType }> = []): [T[], V[]] {
|
||||
const controlPlugins = [];
|
||||
const initPlugins = [];
|
||||
for (const el of arr) {
|
||||
switch (el.type) {
|
||||
case PluginType.Control: controlPlugins.push(el); break;
|
||||
case PluginType.Init: initPlugins.push(el); break;
|
||||
}
|
||||
}
|
||||
return [controlPlugins, initPlugins] as [T[], V[]];
|
||||
}
|
||||
|
||||
export const createLookupTable = (options: SernOptionsData[]): Map<string, SernAutocompleteData> => {
|
||||
const table = new Map<string, SernAutocompleteData>();
|
||||
_createLookupTable(table, options, "<parent>");
|
||||
return table;
|
||||
}
|
||||
|
||||
const _createLookupTable = (table: Map<string, SernAutocompleteData>, options: SernOptionsData[], parent: string) => {
|
||||
for (const opt of options) {
|
||||
const name = path.posix.join(parent, opt.name)
|
||||
switch(opt.type) {
|
||||
case ApplicationCommandOptionType.Subcommand: {
|
||||
_createLookupTable(table, opt.options ?? [], name);
|
||||
} break;
|
||||
case ApplicationCommandOptionType.SubcommandGroup: {
|
||||
_createLookupTable(table, opt.options ?? [], name);
|
||||
} break;
|
||||
default: {
|
||||
if(Reflect.get(opt, 'autocomplete') === true) {
|
||||
table.set(name, opt as SernAutocompleteData)
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface InteractionTypable {
|
||||
type: InteractionType;
|
||||
}
|
||||
//discord.js pls fix ur typings or i will >:(
|
||||
type AnyMessageComponentInteraction = AnySelectMenuInteraction | ButtonInteraction;
|
||||
type AnyCommandInteraction =
|
||||
| ChatInputCommandInteraction
|
||||
| MessageContextMenuCommandInteraction
|
||||
| UserContextMenuCommandInteraction;
|
||||
|
||||
export function isMessageComponent(i: InteractionTypable): i is AnyMessageComponentInteraction {
|
||||
return i.type === InteractionType.MessageComponent;
|
||||
}
|
||||
export function isCommand(i: InteractionTypable): i is AnyCommandInteraction {
|
||||
return i.type === InteractionType.ApplicationCommand;
|
||||
}
|
||||
export function isContextCommand(i: AnyCommandInteraction): i is MessageContextMenuCommandInteraction | UserContextMenuCommandInteraction {
|
||||
return i.isContextMenuCommand();
|
||||
}
|
||||
export function isAutocomplete(i: InteractionTypable): i is AutocompleteInteraction {
|
||||
return i.type === InteractionType.ApplicationCommandAutocomplete;
|
||||
}
|
||||
|
||||
export function isModal(i: InteractionTypable): i is ModalSubmitInteraction {
|
||||
return i.type === InteractionType.ModalSubmit;
|
||||
}
|
||||
|
||||
export function resultPayload<T extends 'success'|'warning'|'failure'>
|
||||
(type: T, module?: Module, reason?: unknown) {
|
||||
return { type, module, reason } as Payload & { type : T };
|
||||
}
|
||||
|
||||
export function pipe<T>(arg: unknown, firstFn: Function, ...fns: Function[]): T {
|
||||
let result = firstFn(arg);
|
||||
for (let fn of fns) {
|
||||
result = fn(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
74
src/core/id.ts
Normal file
74
src/core/id.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import { ApplicationCommandType, ComponentType, type Interaction, InteractionType } from 'discord.js';
|
||||
import { CommandType, EventType } from './structures/enums';
|
||||
|
||||
const parseParams = (event: { customId: string }, append: string) => {
|
||||
const hasSlash = event.customId.indexOf('/')
|
||||
if(hasSlash === -1) {
|
||||
return { id:event.customId+append };
|
||||
}
|
||||
const baseid = event.customId.substring(0, hasSlash);
|
||||
const params = event.customId.substring(hasSlash+1);
|
||||
return { id: baseid+append, params }
|
||||
}
|
||||
/**
|
||||
* Construct unique ID for a given interaction object.
|
||||
* @param event The interaction object for which to create an ID.
|
||||
* @returns An array of unique string IDs based on the type and properties of the interaction object.
|
||||
*/
|
||||
export function reconstruct<T extends Interaction>(event: T) {
|
||||
switch (event.type) {
|
||||
case InteractionType.MessageComponent: {
|
||||
const data = parseParams(event, `_C${event.componentType}`)
|
||||
return [data];
|
||||
}
|
||||
case InteractionType.ApplicationCommand:
|
||||
case InteractionType.ApplicationCommandAutocomplete:
|
||||
return [{ id: `${event.commandName}_A${event.commandType}` }, { id: `${event.commandName}_B` }];
|
||||
//Modal interactions are classified as components for sern
|
||||
case InteractionType.ModalSubmit: {
|
||||
const data = parseParams(event, '_M');
|
||||
return [data];
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
* A magic number to represent any commandtype that is an ApplicationCommand.
|
||||
*/
|
||||
const PUBLISHABLE = 0b000000001111;
|
||||
|
||||
|
||||
const TypeMap = new Map<number, number>([[CommandType.Text, 0],
|
||||
[CommandType.Both, 0],
|
||||
[CommandType.Slash, ApplicationCommandType.ChatInput],
|
||||
[CommandType.CtxUser, ApplicationCommandType.User],
|
||||
[CommandType.CtxMsg, ApplicationCommandType.Message],
|
||||
[CommandType.Button, ComponentType.Button],
|
||||
[CommandType.StringSelect, ComponentType.StringSelect],
|
||||
[CommandType.Modal, InteractionType.ModalSubmit],
|
||||
[CommandType.UserSelect, ComponentType.UserSelect],
|
||||
[CommandType.MentionableSelect, ComponentType.MentionableSelect],
|
||||
[CommandType.RoleSelect, ComponentType.RoleSelect],
|
||||
[CommandType.ChannelSelect, ComponentType.ChannelSelect]]);
|
||||
|
||||
/*
|
||||
* Generates an id based on name and CommandType.
|
||||
* A is for any ApplicationCommand. C is for any ComponentCommand
|
||||
* Then, another number fetched from TypeMap
|
||||
*/
|
||||
export function create(name: string, type: CommandType | EventType) {
|
||||
if(type == CommandType.Text) {
|
||||
return `${name}_T`;
|
||||
}
|
||||
if(type == CommandType.Both) {
|
||||
return `${name}_B`;
|
||||
}
|
||||
if(type == CommandType.Modal) {
|
||||
return `${name}_M`;
|
||||
}
|
||||
const am = (PUBLISHABLE & type) !== 0 ? 'A' : 'C';
|
||||
return `${name}_${am}${TypeMap.get(type)!}`
|
||||
}
|
||||
|
||||
|
||||
|
||||
55
src/core/interfaces.ts
Normal file
55
src/core/interfaces.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import type { AnyFunction } from '../types/utility';
|
||||
|
||||
|
||||
/**
|
||||
* Represents an initialization contract.
|
||||
* Let dependencies implement this to initiate some logic.
|
||||
*/
|
||||
export interface Init {
|
||||
init(): unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a Disposable contract.
|
||||
* Let dependencies implement this to dispose and cleanup.
|
||||
*/
|
||||
export interface Disposable {
|
||||
dispose(): unknown;
|
||||
}
|
||||
|
||||
|
||||
export interface Emitter {
|
||||
addListener(eventName: string | symbol, listener: AnyFunction): this;
|
||||
removeListener(eventName: string | symbol, listener: AnyFunction): this;
|
||||
emit(eventName: string | symbol, ...payload: any[]): boolean;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @since 2.0.0
|
||||
*/
|
||||
export interface ErrorHandling {
|
||||
/**
|
||||
* @deprecated
|
||||
* Version 4 will remove this method
|
||||
*/
|
||||
crash(err: Error): never;
|
||||
/**
|
||||
* A function that is called on every throw.
|
||||
* @param error
|
||||
*/
|
||||
updateAlive(error: Error): void;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.0.0
|
||||
*/
|
||||
export interface Logging<T = unknown> {
|
||||
error(payload: LogPayload<T>): void;
|
||||
warning(payload: LogPayload<T>): void;
|
||||
info(payload: LogPayload<T>): void;
|
||||
debug(payload: LogPayload<T>): void;
|
||||
}
|
||||
|
||||
export type LogPayload<T = unknown> = { message: T };
|
||||
163
src/core/ioc.ts
Normal file
163
src/core/ioc.ts
Normal file
@@ -0,0 +1,163 @@
|
||||
import { Service as $Service, Services as $Services } from '@sern/ioc/global'
|
||||
import { Container } from '@sern/ioc';
|
||||
import * as Contracts from './interfaces';
|
||||
import * as __Services from './structures/default-services';
|
||||
import type { Logging } from './interfaces';
|
||||
import { __init_container, useContainerRaw } from '@sern/ioc/global';
|
||||
import { EventEmitter } from 'node:events';
|
||||
import { Client } from 'discord.js';
|
||||
import { Module } from '../types/core-modules';
|
||||
import { UnpackFunction } from '../types/utility';
|
||||
|
||||
export function disposeAll(logger: Logging|undefined) {
|
||||
useContainerRaw()
|
||||
?.disposeAll()
|
||||
.then(() => logger?.info({ message: 'Cleaning container and crashing' }));
|
||||
}
|
||||
|
||||
type Insertable = | ((container: Dependencies) => object)
|
||||
| object
|
||||
|
||||
const dependencyBuilder = (container: Container) => {
|
||||
return {
|
||||
/**
|
||||
* Insert a dependency into your container.
|
||||
* Supply the correct key and dependency
|
||||
*/
|
||||
add(key: keyof Dependencies, v: Insertable) {
|
||||
if(typeof v !== 'function') {
|
||||
container.addSingleton(key, v)
|
||||
} else {
|
||||
//@ts-ignore
|
||||
container.addWiredSingleton(key, (cntr) => v(cntr))
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @param key the key of the dependency
|
||||
* @param v The dependency to swap out.
|
||||
* Swap out a preexisting dependency.
|
||||
*/
|
||||
swap(key: keyof Dependencies, v: Insertable) {
|
||||
if(typeof v !== 'function') {
|
||||
container.swap(key, v);
|
||||
} else {
|
||||
container.swap(key, v(container.deps()));
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
type ValidDependencyConfig =
|
||||
(c: ReturnType<typeof dependencyBuilder>) => any
|
||||
|
||||
/**
|
||||
* makeDependencies constructs a dependency injection container for sern handler to use.
|
||||
* This is required to start the handler, and is to be called before Sern.init.
|
||||
* @example
|
||||
* ```ts
|
||||
* await makeDependencies(({ add }) => {
|
||||
* add('@sern/client', new Client({ intents, partials })
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
export async function makeDependencies (conf: ValidDependencyConfig) {
|
||||
const container = await __init_container({ autowire: false });
|
||||
//We only include logger if it does not exist
|
||||
const includeLogger = !container.hasKey('@sern/logger');
|
||||
|
||||
if(includeLogger) {
|
||||
container.addSingleton('@sern/logger', new __Services.DefaultLogging);
|
||||
}
|
||||
container.addSingleton('@sern/errors', new __Services.DefaultErrorHandling);
|
||||
container.addSingleton('@sern/modules', new Map);
|
||||
container.addSingleton('@sern/emitter', new EventEmitter({ captureRejections: true }))
|
||||
container.addSingleton('@sern/scheduler', new __Services.TaskScheduler)
|
||||
conf(dependencyBuilder(container));
|
||||
await container.ready();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The Service api, which allows users to access dependencies in places IOC cannot reach.
|
||||
* To obtain intellisense, ensure a .d.ts file exists in the root of compilation.
|
||||
* Our scaffolding tool takes care of this.
|
||||
* Note: this method only works AFTER your container has been initiated
|
||||
* @since 3.0.0
|
||||
* @example
|
||||
* ```ts
|
||||
* const client = Service('@sern/client');
|
||||
* ```
|
||||
* @param key a key that corresponds to a dependency registered.
|
||||
* @throws if container is absent or not present
|
||||
*/
|
||||
export function Service<const T extends keyof Dependencies>(key: T) {
|
||||
return $Service(key) as Dependencies[T]
|
||||
}
|
||||
/**
|
||||
* @since 3.0.0
|
||||
* The plural version of {@link Service}
|
||||
* @throws if container is absent or not present
|
||||
* @returns array of dependencies, in the same order of keys provided
|
||||
*
|
||||
*/
|
||||
export function Services<const T extends (keyof Dependencies)[]>(...keys: [...T]) {
|
||||
return $Services<T, IntoDependencies<T>>(...keys)
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Creates a singleton object.
|
||||
* @param cb
|
||||
*/
|
||||
export function single<T>(cb: () => T) {
|
||||
console.log('The `single` function is deprecated and has no effect')
|
||||
return cb();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* @since 2.0.0
|
||||
* Creates a transient object
|
||||
* @param cb
|
||||
*/
|
||||
export function transient<T>(cb: () => () => T) {
|
||||
console.log('The `transient` function is deprecated and has no effect')
|
||||
return cb()();
|
||||
}
|
||||
|
||||
export type DependencyFromKey<T extends keyof Dependencies> = Dependencies[T];
|
||||
|
||||
|
||||
|
||||
export type IntoDependencies<Tuple extends [...any[]]> = {
|
||||
[Index in keyof Tuple]: UnpackFunction<NonNullable<DependencyFromKey<Tuple[Index]>>>; //Unpack and make NonNullable
|
||||
} & { length: Tuple['length'] };
|
||||
|
||||
export interface CoreDependencies {
|
||||
/**
|
||||
* discord.js client.
|
||||
*/
|
||||
'@sern/client': Client;
|
||||
/**
|
||||
* sern emitter listens to events that happen throughout
|
||||
* the handler. some include module.register, module.activate.
|
||||
*/
|
||||
'@sern/emitter': Contracts.Emitter;
|
||||
/**
|
||||
* An error handler which is the final step before
|
||||
* the sern process actually crashes.
|
||||
*/
|
||||
'@sern/errors': Contracts.ErrorHandling;
|
||||
/**
|
||||
* Optional logger. Performs ... logging
|
||||
*/
|
||||
'@sern/logger'?: Contracts.Logging;
|
||||
/**
|
||||
* Readonly module store. sern stores these
|
||||
* by module.meta.id -> Module
|
||||
*/
|
||||
'@sern/modules': Map<string, Module>;
|
||||
|
||||
'@sern/scheduler': __Services.TaskScheduler
|
||||
}
|
||||
|
||||
70
src/core/module-loading.ts
Normal file
70
src/core/module-loading.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import path from 'node:path';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { readdir } from 'fs/promises';
|
||||
import assert from 'node:assert';
|
||||
import * as Id from './id'
|
||||
import { Module } from '../types/core-modules';
|
||||
|
||||
export const parseCallsite = (site: string) => {
|
||||
const pathobj = path.posix.parse(site.replace(/file:\\?/, "")
|
||||
.split(path.sep)
|
||||
.join(path.posix.sep))
|
||||
return { name: pathobj.name,
|
||||
absPath : path.posix.format(pathobj) }
|
||||
}
|
||||
|
||||
export const shouldHandle = (pth: string, filenam: string) => {
|
||||
const file_name = filenam+path.extname(pth);
|
||||
let newPath = path.join(path.dirname(pth), file_name)
|
||||
.replace(/file:\\?/, "");
|
||||
return { exists: existsSync(newPath),
|
||||
path: 'file://'+newPath };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Import any module based on the absolute path.
|
||||
* This can accept four types of exported modules
|
||||
* commonjs, javascript :
|
||||
* ```js
|
||||
* exports = commandModule({ })
|
||||
* //or
|
||||
* exports.default = commandModule({ })
|
||||
* ```
|
||||
* esm javascript, typescript, and commonjs typescript
|
||||
* export default commandModule({})
|
||||
*/
|
||||
export async function importModule<T>(absPath: string) {
|
||||
let fileModule = await import(absPath);
|
||||
|
||||
let commandModule: Module = fileModule.default;
|
||||
|
||||
assert(commandModule , `No default export @ ${absPath}`);
|
||||
if ('default' in commandModule) {
|
||||
commandModule = commandModule.default as Module;
|
||||
}
|
||||
const p = path.parse(absPath)
|
||||
commandModule.name ??= p.name; commandModule.description ??= "...";
|
||||
commandModule.meta = {
|
||||
id: Id.create(commandModule.name, commandModule.type),
|
||||
absPath,
|
||||
};
|
||||
return { module: commandModule as T };
|
||||
}
|
||||
|
||||
|
||||
export async function* readRecursive(dir: string): AsyncGenerator<string> {
|
||||
const files = await readdir(dir, { withFileTypes: true });
|
||||
for (const file of files) {
|
||||
const fullPath = path.posix.join(dir, file.name);
|
||||
if (file.isDirectory()) {
|
||||
if (!file.name.startsWith('!')) {
|
||||
yield* readRecursive(fullPath);
|
||||
}
|
||||
} else if (!file.name.startsWith('!')) {
|
||||
yield "file:///"+path.resolve(fullPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
135
src/core/modules.ts
Normal file
135
src/core/modules.ts
Normal file
@@ -0,0 +1,135 @@
|
||||
import type { ClientEvents } from 'discord.js';
|
||||
import { EventType } from '../core/structures/enums';
|
||||
import type {
|
||||
InputCommand,
|
||||
InputEvent,
|
||||
Module,
|
||||
ScheduledTask,
|
||||
} from '../types/core-modules';
|
||||
import { partitionPlugins } from './functions'
|
||||
import type { Awaitable } from '../types/utility';
|
||||
|
||||
/**
|
||||
* Creates a command module with standardized structure and plugin support.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @param {InputCommand} mod - Command module configuration
|
||||
* @returns {Module} Processed command module ready for registration
|
||||
*
|
||||
* @example
|
||||
* // Basic slash command
|
||||
* export default commandModule({
|
||||
* type: CommandType.Slash,
|
||||
* description: "Ping command",
|
||||
* execute: async (ctx) => {
|
||||
* await ctx.reply("Pong! 🏓");
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* @example
|
||||
* // Command with component interaction
|
||||
* export default commandModule({
|
||||
* type: CommandType.Slash,
|
||||
* description: "Interactive command",
|
||||
* execute: async (ctx) => {
|
||||
* const button = new ButtonBuilder({
|
||||
* customId: "btn/someData",
|
||||
* label: "Click me",
|
||||
* style: ButtonStyle.Primary
|
||||
* });
|
||||
* await ctx.reply({
|
||||
* content: "Interactive message",
|
||||
* components: [new ActionRowBuilder().addComponents(button)]
|
||||
* });
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
export function commandModule(mod: InputCommand): Module {
|
||||
const [onEvent, plugins] = partitionPlugins(mod.plugins);
|
||||
return { ...mod,
|
||||
onEvent,
|
||||
plugins,
|
||||
locals: {} } as Module;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an event module for handling Discord.js or custom events.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @template T - Event name from ClientEvents
|
||||
* @param {InputEvent<T>} mod - Event module configuration
|
||||
* @returns {Module} Processed event module ready for registration
|
||||
* @throws {Error} If ControlPlugins are used in event modules
|
||||
*
|
||||
* @example
|
||||
* // Discord event listener
|
||||
* export default eventModule({
|
||||
* type: EventType.Discord,
|
||||
* execute: async (message) => {
|
||||
* console.log(`${message.author.tag}: ${message.content}`);
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* @example
|
||||
* // Custom sern event
|
||||
* export default eventModule({
|
||||
* type: EventType.Sern,
|
||||
* execute: async (eventData) => {
|
||||
* // Handle sern-specific event
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
export function eventModule<T extends keyof ClientEvents = keyof ClientEvents>(mod: InputEvent<T>): Module {
|
||||
const [onEvent, plugins] = partitionPlugins(mod.plugins);
|
||||
if(onEvent.length !== 0) throw Error("Event modules cannot have ControlPlugins");
|
||||
return { ...mod,
|
||||
plugins,
|
||||
locals: {} } as Module;
|
||||
}
|
||||
|
||||
/** Create event modules from discord.js client events,
|
||||
* This was an {@link eventModule} for discord events,
|
||||
* where typings were bad.
|
||||
* @deprecated Use {@link eventModule} instead
|
||||
* @param mod
|
||||
*/
|
||||
export function discordEvent<T extends keyof ClientEvents>(mod: {
|
||||
name: T;
|
||||
once?: boolean;
|
||||
execute: (...args: ClientEvents[T]) => Awaitable<unknown>;
|
||||
}) {
|
||||
return eventModule({ type: EventType.Discord, ...mod, });
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a scheduled task that can be executed at specified intervals using cron patterns
|
||||
*
|
||||
* @param {ScheduledTask} ism - The scheduled task configuration object
|
||||
* @param {string} ism.trigger - A cron pattern that determines when the task should execute
|
||||
* Format: "* * * * *" (minute hour day month day-of-week)
|
||||
* @param {Function} ism.execute - The function to execute when the task is triggered
|
||||
* @param {Object} ism.execute.context - The execution context passed to the task
|
||||
*
|
||||
* @returns {ScheduledTask} The configured scheduled task
|
||||
*
|
||||
* @example
|
||||
* // Create a task that runs every minute
|
||||
* export default scheduledTask({
|
||||
* trigger: "* * * * *",
|
||||
* execute: (context) => {
|
||||
* console.log("Task executed!");
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* @remarks
|
||||
* - Tasks must be placed in the 'tasks' directory specified in your config
|
||||
* - The file name serves as a unique identifier for the task
|
||||
* - Tasks can be cancelled using deps['@sern/scheduler'].kill(uuid)
|
||||
*
|
||||
* @see {@link https://crontab.guru/} for testing and creating cron patterns
|
||||
*/
|
||||
export function scheduledTask(ism: ScheduledTask): ScheduledTask {
|
||||
return ism
|
||||
}
|
||||
|
||||
137
src/core/plugin.ts
Normal file
137
src/core/plugin.ts
Normal file
@@ -0,0 +1,137 @@
|
||||
import { CommandType, PluginType } from './structures/enums';
|
||||
import type { Plugin, PluginResult, CommandArgs, InitArgs } from '../types/core-plugin';
|
||||
import { Err, Ok } from './structures/result';
|
||||
import type { Dictionary } from '../types/utility';
|
||||
|
||||
export function makePlugin<V extends unknown[]>(
|
||||
type: PluginType,
|
||||
execute: (...args: any[]) => any,
|
||||
): Plugin<V> {
|
||||
return { type, execute } as Plugin<V>;
|
||||
}
|
||||
/**
|
||||
* @since 2.5.0
|
||||
*/
|
||||
export function EventInitPlugin(execute: (args: InitArgs) => PluginResult) {
|
||||
return makePlugin(PluginType.Init, execute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an initialization plugin for command preprocessing and modification
|
||||
*
|
||||
* @since 2.5.0
|
||||
* @template I - Extends CommandType to enforce type safety for command modules
|
||||
*
|
||||
* @param {function} execute - Function to execute during command initialization
|
||||
* @param {InitArgs<T>} execute.args - The initialization arguments
|
||||
* @param {T} execute.args.module - The command module being initialized
|
||||
* @param {string} execute.args.absPath - The absolute path to the module file
|
||||
* @param {Dependencies} execute.args.deps - Dependency injection container
|
||||
*
|
||||
* @returns {Plugin} A plugin that runs during command initialization
|
||||
*
|
||||
* @example
|
||||
* // Plugin to update command description
|
||||
* export const updateDescription = (description: string) => {
|
||||
* return CommandInitPlugin(({ deps }) => {
|
||||
* if(description.length > 100) {
|
||||
* deps.logger?.info({ message: "Invalid description" })
|
||||
* return controller.stop("From updateDescription: description is invalid");
|
||||
* }
|
||||
* module.description = description;
|
||||
* return controller.next();
|
||||
* });
|
||||
* };
|
||||
*
|
||||
* @example
|
||||
* // Plugin to store registration date in module locals
|
||||
* export const dateRegistered = () => {
|
||||
* return CommandInitPlugin(({ module }) => {
|
||||
* module.locals.registered = Date.now()
|
||||
* return controller.next();
|
||||
* });
|
||||
* };
|
||||
*
|
||||
* @remarks
|
||||
* - Init plugins can modify how commands are loaded and perform preprocessing
|
||||
* - The module.locals object can be used to store custom plugin-specific data
|
||||
* - Be careful when modifying module fields as multiple plugins may interact with them
|
||||
* - Use controller.next() to continue to the next plugin
|
||||
* - Use controller.stop(reason) to halt plugin execution
|
||||
*/
|
||||
export function CommandInitPlugin<I extends CommandType>(
|
||||
execute: (args: InitArgs) => PluginResult
|
||||
): Plugin {
|
||||
return makePlugin(PluginType.Init, execute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a control plugin for command preprocessing, filtering, and state management
|
||||
*
|
||||
* @since 2.5.0
|
||||
* @template I - Extends CommandType to enforce type safety for command modules
|
||||
*
|
||||
* @param {function} execute - Function to execute during command control flow
|
||||
* @param {CommandArgs<I>} execute.args - The command arguments array
|
||||
* @param {Context} execute.args[0] - The discord context (e.g., guild, channel, user info, interaction)
|
||||
* @param {SDT} execute.args[1] - The State, Dependencies, Params, Module, and Type object
|
||||
*
|
||||
* @returns {Plugin} A plugin that runs during command execution flow
|
||||
*
|
||||
* @example
|
||||
* // Plugin to restrict command to specific guild
|
||||
* export const inGuild = (guildId: string) => {
|
||||
* return CommandControlPlugin((ctx, sdt) => {
|
||||
* if(ctx.guild.id !== guildId) {
|
||||
* return controller.stop();
|
||||
* }
|
||||
* return controller.next();
|
||||
* });
|
||||
* };
|
||||
*
|
||||
* @example
|
||||
* // Plugins passing state through the chain
|
||||
* const plugin1 = CommandControlPlugin((ctx, sdt) => {
|
||||
* return controller.next({ 'plugin1/data': 'from plugin1' });
|
||||
* });
|
||||
*
|
||||
* const plugin2 = CommandControlPlugin((ctx, sdt) => {
|
||||
* return controller.next({ 'plugin2/data': ctx.user.id });
|
||||
* });
|
||||
*
|
||||
* export default commandModule({
|
||||
* type: CommandType.Slash,
|
||||
* plugins: [plugin1, plugin2],
|
||||
* execute: (ctx, sdt) => {
|
||||
* console.log(sdt.state); // Access accumulated state
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* @remarks
|
||||
* - Control plugins are executed in order when a discord.js event is emitted
|
||||
* - Use controller.next() to continue to next plugin or controller.stop() to halt execution
|
||||
* - State can be passed between plugins using controller.next({ key: value })
|
||||
* - State keys should be namespaced to avoid collisions (e.g., 'plugin-name/key')
|
||||
* - Final accumulated state is passed to the command's execute function
|
||||
* - All plugins must succeed for the command to execute
|
||||
* - Plugins have access to dependencies through the sdt.deps object
|
||||
* - Useful for implementing preconditions, filters, and command preprocessing
|
||||
*/
|
||||
export function CommandControlPlugin<I extends CommandType>(
|
||||
execute: (...args: CommandArgs<I>) => PluginResult,
|
||||
) {
|
||||
return makePlugin(PluginType.Control, execute);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* The object passed into every plugin to control a command's behavior
|
||||
*/
|
||||
export const controller = {
|
||||
next: (val?: Dictionary) => Ok(val),
|
||||
stop: (val?: string) => Err(val),
|
||||
};
|
||||
|
||||
|
||||
export type Controller = typeof controller;
|
||||
65
src/core/presences.ts
Normal file
65
src/core/presences.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import type { ActivitiesOptions } from "discord.js";
|
||||
import type { IntoDependencies } from "./ioc";
|
||||
import type { Emitter } from "./interfaces";
|
||||
import { Awaitable } from "../types/utility";
|
||||
|
||||
type Status = 'online' | 'idle' | 'invisible' | 'dnd'
|
||||
type PresenceReduce = (previous: Presence.Result) => Awaitable<Presence.Result>;
|
||||
|
||||
export const Presence = {
|
||||
/**
|
||||
* A small wrapper to provide type inference.
|
||||
* Create a Presence module which **MUST** be put in a file called presence.(language-extension)
|
||||
* adjacent to the file where **Sern.init** is CALLED.
|
||||
*/
|
||||
module : <T extends (keyof Dependencies)[]>(conf: Presence.Config<T>) => conf,
|
||||
/**
|
||||
* Create a Presence body which can be either:
|
||||
* - once, the presence is activated only once.
|
||||
* - repeated, per cycle or event, the presence can be changed.
|
||||
*/
|
||||
of : (root: Omit<Presence.Result, 'repeat' | 'onRepeat'>) => {
|
||||
return {
|
||||
/**
|
||||
* @example
|
||||
* Presence
|
||||
* .of({ activities: [{ name: "deez nuts" }] }) //starts presence with "deez nuts".
|
||||
* .repeated(prev => {
|
||||
* return {
|
||||
* afk: true,
|
||||
* activities: prev.activities?.map(s => ({ ...s, name: s.name+"s" }))
|
||||
* };
|
||||
* }, 10000)) //every 10 s, the callback sets the presence to the value returned.
|
||||
*/
|
||||
repeated: (onRepeat: PresenceReduce, repeat: number | [Emitter, string]) => {
|
||||
return { repeat, onRepeat, ...root }
|
||||
},
|
||||
/**
|
||||
* @example
|
||||
* ```ts
|
||||
* Presence.of({
|
||||
* activities: [{ name: "Chilling out" }]
|
||||
* }).once() // Sets the presence once, with what's provided in '.of()'
|
||||
* ```
|
||||
*/
|
||||
once: () => root
|
||||
};
|
||||
}
|
||||
}
|
||||
export declare namespace Presence {
|
||||
export type Config<T extends (keyof Dependencies)[]> = {
|
||||
inject?: [...T]
|
||||
execute: (...v: IntoDependencies<T>) => Awaitable<Presence.Result>;
|
||||
|
||||
}
|
||||
|
||||
export interface Result {
|
||||
status?: Status;
|
||||
afk?: boolean;
|
||||
activities?: ActivitiesOptions[];
|
||||
shardId?: number[];
|
||||
repeat?: number | [Emitter, string];
|
||||
onRepeat?: PresenceReduce
|
||||
}
|
||||
}
|
||||
|
||||
131
src/core/structures/context.ts
Normal file
131
src/core/structures/context.ts
Normal file
@@ -0,0 +1,131 @@
|
||||
import type {
|
||||
BaseInteraction,
|
||||
ChatInputCommandInteraction,
|
||||
Client,
|
||||
InteractionReplyOptions,
|
||||
Message,
|
||||
MessageReplyOptions,
|
||||
Snowflake,
|
||||
User,
|
||||
} from 'discord.js';
|
||||
import { Result, Ok, Err, val } from './result';
|
||||
import * as assert from 'assert';
|
||||
import type { ReplyOptions } from '../../types/utility';
|
||||
import { fmt } from '../functions'
|
||||
import { SernError } from './enums';
|
||||
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* Provides values shared between
|
||||
* Message and ChatInputCommandInteraction
|
||||
*/
|
||||
export class Context {
|
||||
|
||||
get options() {
|
||||
if(this.isMessage()) {
|
||||
const [, ...rest] = fmt(this.message.content, this.prefix);
|
||||
return rest;
|
||||
}
|
||||
return this.interaction.options;
|
||||
}
|
||||
|
||||
|
||||
protected constructor(protected ctx: Result<Message, ChatInputCommandInteraction>,
|
||||
private __prefix?: string) { }
|
||||
public get prefix() {
|
||||
return this.__prefix;
|
||||
}
|
||||
public get id(): Snowflake {
|
||||
return val(this.ctx).id
|
||||
}
|
||||
|
||||
public get channel() {
|
||||
return val(this.ctx).channel;
|
||||
}
|
||||
|
||||
public get channelId(): Snowflake {
|
||||
return val(this.ctx).channelId;
|
||||
}
|
||||
|
||||
/**
|
||||
* If context is holding a message, message.author
|
||||
* else, interaction.user
|
||||
*/
|
||||
public get user(): User {
|
||||
if(this.ctx.ok) {
|
||||
return this.ctx.value.author;
|
||||
}
|
||||
return this.ctx.error.user;
|
||||
|
||||
}
|
||||
|
||||
public get userId(): Snowflake {
|
||||
return this.user.id;
|
||||
}
|
||||
|
||||
public get createdTimestamp(): number {
|
||||
return val(this.ctx).createdTimestamp;
|
||||
}
|
||||
|
||||
public get guild() {
|
||||
return val(this.ctx).guild;
|
||||
}
|
||||
|
||||
public get guildId() {
|
||||
return val(this.ctx).guildId;
|
||||
}
|
||||
/*
|
||||
* interactions can return APIGuildMember if the guild it is emitted from is not cached
|
||||
*/
|
||||
public get member() {
|
||||
return val(this.ctx).member;
|
||||
}
|
||||
|
||||
get message(): Message {
|
||||
if(this.ctx.ok) {
|
||||
return this.ctx.value;
|
||||
}
|
||||
throw Error(SernError.MismatchEvent);
|
||||
}
|
||||
public isMessage(): this is Context & { ctx: Result<Message, never> } {
|
||||
return this.ctx.ok;
|
||||
}
|
||||
|
||||
public isSlash(): this is Context & { ctx: Result<never, ChatInputCommandInteraction> } {
|
||||
return !this.isMessage();
|
||||
}
|
||||
|
||||
get interaction(): ChatInputCommandInteraction {
|
||||
if(!this.ctx.ok) {
|
||||
return this.ctx.error;
|
||||
}
|
||||
throw Error(SernError.MismatchEvent);
|
||||
}
|
||||
|
||||
|
||||
public get client(): Client {
|
||||
return val(this.ctx).client;
|
||||
}
|
||||
|
||||
public get inGuild(): boolean {
|
||||
return val(this.ctx).inGuild()
|
||||
}
|
||||
|
||||
public async reply(content: ReplyOptions) {
|
||||
if(this.ctx.ok) {
|
||||
return this.ctx.value.reply(content as MessageReplyOptions)
|
||||
}
|
||||
interface FetchReply { fetchReply: true };
|
||||
return this.ctx.error.reply(content as InteractionReplyOptions & FetchReply)
|
||||
|
||||
}
|
||||
|
||||
static wrap(wrappable: BaseInteraction | Message, prefix?: string): Context {
|
||||
if ('interaction' in wrappable) {
|
||||
return new Context(Ok(wrappable), prefix);
|
||||
}
|
||||
assert.ok(wrappable.isChatInputCommand(), "Context created with bad interaction.");
|
||||
return new Context(Err(wrappable), prefix);
|
||||
}
|
||||
}
|
||||
89
src/core/structures/default-services.ts
Normal file
89
src/core/structures/default-services.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import { ScheduledTask } from '../../types/core-modules';
|
||||
import type { LogPayload, Logging, ErrorHandling, Disposable } from '../interfaces';
|
||||
import { CronJob } from 'cron';
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @since 2.0.0
|
||||
* Version 4.0.0 will internalize this api. Please refrain from using the defaults!
|
||||
*/
|
||||
export class DefaultErrorHandling implements ErrorHandling {
|
||||
crash(err: Error): never {
|
||||
throw err;
|
||||
}
|
||||
updateAlive(err: Error) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @since 2.0.0
|
||||
* Version 4.0.0 will internalize this api. Please refrain from using ModuleStore!
|
||||
*/
|
||||
export class DefaultLogging implements Logging {
|
||||
private date() { return new Date() }
|
||||
debug(payload: LogPayload): void {
|
||||
console.debug(`DEBUG: ${this.date().toISOString()} -> ${payload.message}`);
|
||||
}
|
||||
|
||||
error(payload: LogPayload): void {
|
||||
console.error(`ERROR: ${this.date().toISOString()} -> ${payload.message}`);
|
||||
}
|
||||
|
||||
info(payload: LogPayload): void {
|
||||
console.info(`INFO: ${this.date().toISOString()} -> ${payload.message}`);
|
||||
}
|
||||
|
||||
warning(payload: LogPayload): void {
|
||||
console.warn(`WARN: ${this.date().toISOString()} -> ${payload.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export class TaskScheduler implements Disposable {
|
||||
private __tasks: Map<string, CronJob<any, any>> = new Map();
|
||||
|
||||
schedule(uuid: string, task: ScheduledTask, deps: Dependencies) {
|
||||
if (this.__tasks.has(uuid)) {
|
||||
throw Error("while scheduling a task \
|
||||
found another task of same name. Not scheduling " +
|
||||
uuid + "again." );
|
||||
}
|
||||
try {
|
||||
const onTick = async function(this: CronJob) {
|
||||
task.execute({ id: uuid,
|
||||
lastTimeExecution: this.lastExecution,
|
||||
nextTimeExecution: this.nextDate().toJSDate() }, { deps })
|
||||
}
|
||||
const job = CronJob.from({ cronTime: task.trigger, onTick, timeZone: task.timezone });
|
||||
job.start();
|
||||
this.__tasks.set(uuid, job);
|
||||
} catch (error) {
|
||||
throw Error(`while scheduling a task ${uuid} ` + error);
|
||||
}
|
||||
}
|
||||
|
||||
kill(taskName: string): boolean {
|
||||
const job = this.__tasks.get(taskName);
|
||||
if (job) {
|
||||
job.stop();
|
||||
this.__tasks.delete(taskName);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
get tasks(): string[] {
|
||||
return Array.from(this.__tasks.keys());
|
||||
}
|
||||
|
||||
dispose() {
|
||||
this.__tasks.forEach((_, id) => {
|
||||
this.kill(id);
|
||||
this.__tasks.delete(id);
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
134
src/core/structures/enums.ts
Normal file
134
src/core/structures/enums.ts
Normal file
@@ -0,0 +1,134 @@
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* A bitfield that discriminates command modules
|
||||
* @enum { number }
|
||||
* @example
|
||||
* ```ts
|
||||
* export default commandModule({
|
||||
* // highlight-next-line
|
||||
* type : CommandType.Text,
|
||||
* name : 'a text command'
|
||||
* execute(message) {
|
||||
* console.log(message.content)
|
||||
* }
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
export enum CommandType {
|
||||
Text = 1 << 0,
|
||||
Slash = 1 << 1,
|
||||
Both = 3,
|
||||
CtxUser = 1 << 2,
|
||||
CtxMsg = 1 << 3,
|
||||
Button = 1 << 4,
|
||||
StringSelect = 1 << 5,
|
||||
Modal = 1 << 6,
|
||||
UserSelect = 1 << 7,
|
||||
RoleSelect = 1 << 8,
|
||||
MentionableSelect = 1 << 9,
|
||||
ChannelSelect = 1 << 10,
|
||||
}
|
||||
|
||||
/**
|
||||
* A bitfield that discriminates event modules
|
||||
* @enum { number }
|
||||
* @example
|
||||
* ```ts
|
||||
* export default eventModule({
|
||||
* //highlight-next-line
|
||||
* type : EventType.Discord,
|
||||
* name : 'guildMemberAdd'
|
||||
* execute(member : GuildMember) {
|
||||
* console.log(member)
|
||||
* }
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
export enum EventType {
|
||||
/**
|
||||
* The EventType for handling discord events
|
||||
*/
|
||||
Discord,
|
||||
/**
|
||||
* The EventType for handling sern events
|
||||
*/
|
||||
Sern,
|
||||
/**
|
||||
* The EventType for handling external events.
|
||||
* Could be for example, `process` events, database events
|
||||
*/
|
||||
External,
|
||||
}
|
||||
|
||||
/**
|
||||
* A bitfield that discriminates plugins
|
||||
* @enum { number }
|
||||
* @example
|
||||
* ```ts
|
||||
* export default function myPlugin() : EventPlugin<CommandType.Text> {
|
||||
* //highlight-next-line
|
||||
* type : PluginType.Event,
|
||||
* execute([ctx, args], controller) {
|
||||
* return controller.next();
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
export enum PluginType {
|
||||
/**
|
||||
* The PluginType for InitPlugins
|
||||
*/
|
||||
Init = 1,
|
||||
/**
|
||||
* The PluginType for EventPlugins
|
||||
*/
|
||||
Control = 2,
|
||||
}
|
||||
/**
|
||||
* @deprecated - Use strings 'success' | 'failure' | 'warning'
|
||||
* @enum { string }
|
||||
*/
|
||||
export enum PayloadType {
|
||||
Success = 'success',
|
||||
Failure = 'failure',
|
||||
Warning = 'warning',
|
||||
}
|
||||
|
||||
/**
|
||||
* @enum { string }
|
||||
*/
|
||||
export const enum SernError {
|
||||
/**
|
||||
* Throws when registering an invalid module.
|
||||
* This means it is undefined or an invalid command type was provided
|
||||
*/
|
||||
InvalidModuleType = 'Detected an unknown module type',
|
||||
/**
|
||||
* Attempted to lookup module in command module store. Nothing was found!
|
||||
*/
|
||||
UndefinedModule = `A module could not be detected`,
|
||||
/**
|
||||
* Attempted to lookup module in command module store. Nothing was found!
|
||||
*/
|
||||
MismatchModule = `A module type mismatched with event emitted!`,
|
||||
/**
|
||||
* Unsupported interaction at this moment.
|
||||
*/
|
||||
NotSupportedInteraction = `This interaction is not supported.`,
|
||||
/**
|
||||
* One plugin called `controller.stop()` (end command execution / loading)
|
||||
*/
|
||||
PluginFailure = `A plugin failed to call controller.next()`,
|
||||
/**
|
||||
* A crash that occurs when accessing an invalid property of Context
|
||||
*/
|
||||
MismatchEvent = `You cannot use message when an interaction fired or vice versa`,
|
||||
/**
|
||||
* Unsupported feature attempted to access at this time
|
||||
*/
|
||||
NotSupportedYet = `This feature is not supported yet`,
|
||||
/**
|
||||
* Required Dependency not found
|
||||
*/
|
||||
MissingRequired = `@sern/client is required but was not found`,
|
||||
}
|
||||
20
src/core/structures/result.ts
Normal file
20
src/core/structures/result.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
export type Result<Ok, Err> =
|
||||
| { ok: true; value: Ok }
|
||||
| { ok: false; error: Err };
|
||||
|
||||
export const Ok = <Ok>(value: Ok) => ({ ok: true, value } as const);
|
||||
export const Err = <Err>(error: Err) => ({ ok: false, error } as const);
|
||||
|
||||
export const val = <O, E>(r: Result<O, E>) => r.ok ? r.value : r.error;
|
||||
export const EMPTY_ERR = Err(undefined);
|
||||
|
||||
/**
|
||||
* Wrap an async operation that may throw an Error (`try-catch` style) into checked exception style
|
||||
* @param op The operation function
|
||||
*/
|
||||
export async function wrapAsync<T, E = unknown>(op: () => Promise<T>): Promise<Result<T, E>> {
|
||||
try { return op()
|
||||
.then(Ok)
|
||||
.catch(Err); }
|
||||
catch (e) { return Promise.resolve(Err(e as E)); }
|
||||
}
|
||||
@@ -1,232 +0,0 @@
|
||||
import type {
|
||||
CommandInteraction,
|
||||
Interaction,
|
||||
MessageComponentInteraction,
|
||||
ModalSubmitInteraction,
|
||||
SelectMenuInteraction,
|
||||
} from 'discord.js';
|
||||
import { concatMap, fromEvent, map, Observable, of, throwError } from 'rxjs';
|
||||
import type Wrapper from '../structures/wrapper';
|
||||
import * as Files from '../utilities/readFile';
|
||||
import { match } from 'ts-pattern';
|
||||
import { SernError } from '../structures/errors';
|
||||
import Context from '../structures/context';
|
||||
import { controller } from '../sern';
|
||||
import type { Module } from '../structures/module';
|
||||
import {
|
||||
isButton,
|
||||
isChatInputCommand,
|
||||
isMessageCtxMenuCmd,
|
||||
isPromise,
|
||||
isSelectMenu,
|
||||
isUserContextMenuCmd,
|
||||
} from '../utilities/predicates';
|
||||
import { filterCorrectModule } from './observableHandling';
|
||||
import { CommandType } from '../structures/enums';
|
||||
import type { Result } from 'ts-results';
|
||||
import type { AutocompleteInteraction } from 'discord.js';
|
||||
|
||||
function applicationCommandHandler(mod: Module | undefined, interaction: CommandInteraction) {
|
||||
const mod$ = <T extends CommandType>(cmdTy: T) => of(mod).pipe(filterCorrectModule(cmdTy));
|
||||
return (
|
||||
match(interaction)
|
||||
.when(isChatInputCommand, i => {
|
||||
const ctx = Context.wrap(i);
|
||||
return mod$(CommandType.Slash).pipe(
|
||||
concatMap(m => {
|
||||
return of(
|
||||
m.onEvent.map(e => e.execute([ctx, ['slash', i.options]], controller)),
|
||||
).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return m.execute(ctx, ['slash', i.options]);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}),
|
||||
);
|
||||
})
|
||||
//Todo: refactor so that we dont have to have two separate branches. They're near identical!!
|
||||
//Only thing that differs is type of interaction
|
||||
.when(isMessageCtxMenuCmd, ctx => {
|
||||
return mod$(CommandType.MenuMsg).pipe(
|
||||
concatMap(m => {
|
||||
return of(m.onEvent.map(e => e.execute([ctx], controller))).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return m.execute(ctx);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}),
|
||||
);
|
||||
})
|
||||
.when(isUserContextMenuCmd, ctx => {
|
||||
return mod$(CommandType.MenuUser).pipe(
|
||||
concatMap(m => {
|
||||
return of(m.onEvent.map(e => e.execute([ctx], controller))).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return m.execute(ctx);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}),
|
||||
);
|
||||
})
|
||||
.run()
|
||||
);
|
||||
}
|
||||
|
||||
function messageComponentInteractionHandler(
|
||||
mod: Module | undefined,
|
||||
interaction: MessageComponentInteraction,
|
||||
) {
|
||||
const mod$ = <T extends CommandType>(ty: T) => of(mod).pipe(filterCorrectModule(ty));
|
||||
//Todo: refactor so that we dont have to have two separate branches. They're near identical!!
|
||||
//Only thing that differs is type of interaction
|
||||
return match(interaction)
|
||||
.when(isButton, ctx => {
|
||||
return mod$(CommandType.Button).pipe(
|
||||
concatMap(m => {
|
||||
return of(m.onEvent.map(e => e.execute([ctx], controller))).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return m.execute(ctx);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}),
|
||||
);
|
||||
})
|
||||
.when(isSelectMenu, (ctx: SelectMenuInteraction) => {
|
||||
return mod$(CommandType.MenuSelect).pipe(
|
||||
concatMap(m => {
|
||||
return of(m.onEvent.map(e => e.execute([ctx], controller))).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return m.execute(ctx);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}),
|
||||
);
|
||||
})
|
||||
.otherwise(() => throwError(() => SernError.NotSupportedInteraction));
|
||||
}
|
||||
|
||||
function modalHandler(modul: Module | undefined, ctx: ModalSubmitInteraction) {
|
||||
return of(modul).pipe(
|
||||
filterCorrectModule(CommandType.Modal),
|
||||
concatMap(mod => {
|
||||
return of(mod.onEvent.map(e => e.execute([ctx], controller))).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return mod.execute(ctx);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
function autoCmpHandler(mod: Module | undefined, interaction: AutocompleteInteraction) {
|
||||
return of(mod).pipe(
|
||||
filterCorrectModule(CommandType.Slash),
|
||||
concatMap(mod => {
|
||||
const choice = interaction.options.getFocused(true);
|
||||
const selectedOption = mod.options?.find(o => o.autocomplete && o.name === choice.name);
|
||||
if (selectedOption !== undefined && selectedOption.autocomplete) {
|
||||
return of(
|
||||
selectedOption.command.onEvent.map(e => e.execute([interaction], controller)),
|
||||
).pipe(
|
||||
map(res => ({
|
||||
mod,
|
||||
res,
|
||||
execute() {
|
||||
return selectedOption.command.execute(interaction);
|
||||
},
|
||||
})),
|
||||
);
|
||||
}
|
||||
return throwError(
|
||||
() =>
|
||||
SernError.NotSupportedInteraction +
|
||||
` There is probably no autocomplete tag for this option`,
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
export function onInteractionCreate(wrapper: Wrapper) {
|
||||
const { client } = wrapper;
|
||||
|
||||
const interactionEvent$ = <Observable<Interaction>>fromEvent(client, 'interactionCreate');
|
||||
|
||||
interactionEvent$
|
||||
.pipe(
|
||||
/*processing plugins*/
|
||||
concatMap(interaction => {
|
||||
if (interaction.isCommand()) {
|
||||
const modul =
|
||||
Files.ApplicationCommands[interaction.commandType].get(
|
||||
interaction.commandName,
|
||||
) ?? Files.BothCommands.get(interaction.commandName);
|
||||
return applicationCommandHandler(modul, interaction);
|
||||
}
|
||||
if (interaction.isMessageComponent()) {
|
||||
const modul = Files.MessageCompCommands[interaction.componentType].get(
|
||||
interaction.customId,
|
||||
);
|
||||
return messageComponentInteractionHandler(modul, interaction);
|
||||
}
|
||||
if (interaction.isModalSubmit()) {
|
||||
const modul = Files.ModalSubmitCommands.get(interaction.customId);
|
||||
return modalHandler(modul, interaction);
|
||||
}
|
||||
if (interaction.isAutocomplete()) {
|
||||
const modul =
|
||||
Files.ApplicationCommands['1'].get(interaction.commandName) ??
|
||||
Files.BothCommands.get(interaction.commandName);
|
||||
return autoCmpHandler(modul, interaction);
|
||||
}
|
||||
return throwError(() => SernError.NotSupportedInteraction);
|
||||
}),
|
||||
)
|
||||
.subscribe({
|
||||
async next({ mod, res: eventPluginRes, execute }) {
|
||||
const ePlugArr: Result<void, void>[] = [];
|
||||
for await (const res of eventPluginRes) {
|
||||
if (isPromise(res)) {
|
||||
ePlugArr.push(res);
|
||||
}
|
||||
ePlugArr.push(res as Awaited<Result<void, void>>);
|
||||
}
|
||||
if (ePlugArr.every(e => e.ok)) {
|
||||
await execute();
|
||||
wrapper.sernEmitter?.emit('module.activate', { success: true, module: mod! });
|
||||
} else {
|
||||
wrapper.sernEmitter?.emit('module.activate', {
|
||||
success: false,
|
||||
module: mod!,
|
||||
reason: SernError.PluginFailure,
|
||||
});
|
||||
}
|
||||
},
|
||||
error(err) {
|
||||
wrapper.sernEmitter?.emit('error', err);
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
import type { Message } from 'discord.js';
|
||||
import { concatMap, from, fromEvent, map, Observable, of } from 'rxjs';
|
||||
import type { Args } from '../..';
|
||||
import { controller } from '../sern';
|
||||
import Context from '../structures/context';
|
||||
import type Wrapper from '../structures/wrapper';
|
||||
import { fmt } from '../utilities/messageHelpers';
|
||||
import * as Files from '../utilities/readFile';
|
||||
import { filterCorrectModule, ignoreNonBot } from './observableHandling';
|
||||
import { CommandType } from '../structures/enums';
|
||||
import { SernError } from '../structures/errors';
|
||||
|
||||
export const onMessageCreate = (wrapper: Wrapper) => {
|
||||
const { client, defaultPrefix } = wrapper;
|
||||
if (defaultPrefix === undefined) return;
|
||||
|
||||
const messageEvent$ = <Observable<Message>>fromEvent(client, 'messageCreate');
|
||||
|
||||
const processMessage$ = messageEvent$.pipe(
|
||||
ignoreNonBot(defaultPrefix),
|
||||
map(message => {
|
||||
const [prefix, ...rest] = fmt(message, defaultPrefix);
|
||||
return {
|
||||
ctx: Context.wrap(message),
|
||||
args: <Args>['text', rest],
|
||||
mod:
|
||||
Files.TextCommands.text.get(prefix) ??
|
||||
Files.BothCommands.get(prefix) ??
|
||||
Files.TextCommands.aliases.get(prefix),
|
||||
};
|
||||
}),
|
||||
);
|
||||
const ensureModuleType$ = processMessage$.pipe(
|
||||
concatMap(payload =>
|
||||
of(payload.mod).pipe(
|
||||
filterCorrectModule(CommandType.Text),
|
||||
map(mod => ({ ...payload, mod })),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
const processEventPlugins$ = ensureModuleType$.pipe(
|
||||
concatMap(({ ctx, args, mod }) => {
|
||||
const res = Promise.all(
|
||||
mod.onEvent.map(ePlug => {
|
||||
return ePlug.execute([ctx, args], controller);
|
||||
}),
|
||||
);
|
||||
return from(res).pipe(map(res => ({ mod, ctx, args, res })));
|
||||
}),
|
||||
);
|
||||
|
||||
processEventPlugins$.subscribe({
|
||||
next({ mod, ctx, args, res }) {
|
||||
if (res.every(pl => pl.ok)) {
|
||||
Promise.resolve(mod.execute(ctx, args)).then(() => {
|
||||
wrapper.sernEmitter?.emit('module.activate', { success: true, module: mod! });
|
||||
});
|
||||
} else {
|
||||
wrapper.sernEmitter?.emit('module.activate', {
|
||||
success: false,
|
||||
module: mod!,
|
||||
reason: SernError.PluginFailure,
|
||||
});
|
||||
}
|
||||
},
|
||||
error(e) {
|
||||
wrapper.sernEmitter?.emit('error', e);
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
import type { Message } from 'discord.js';
|
||||
import { Observable, throwError } from 'rxjs';
|
||||
import { SernError } from '../structures/errors';
|
||||
import type { Module, ModuleDefs } from '../structures/module';
|
||||
import { correctModuleType } from '../utilities/predicates';
|
||||
export function filterCorrectModule<T extends keyof ModuleDefs>(cmdType: T) {
|
||||
return (src: Observable<Module | undefined>) =>
|
||||
new Observable<ModuleDefs[T]>(subscriber => {
|
||||
return src.subscribe({
|
||||
next(mod) {
|
||||
if (mod === undefined) {
|
||||
return throwError(() => SernError.UndefinedModule);
|
||||
}
|
||||
if (correctModuleType(mod, cmdType)) {
|
||||
subscriber.next(mod!);
|
||||
} else {
|
||||
return throwError(() => SernError.MismatchModule);
|
||||
}
|
||||
},
|
||||
error: e => subscriber.error(e),
|
||||
complete: () => subscriber.complete(),
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function ignoreNonBot(prefix: string) {
|
||||
return (src: Observable<Message>) =>
|
||||
new Observable<Message>(subscriber => {
|
||||
return src.subscribe({
|
||||
next(m) {
|
||||
const messageFromHumanAndHasPrefix =
|
||||
!m.author.bot &&
|
||||
m.content
|
||||
.slice(0, prefix.length)
|
||||
.localeCompare(prefix, undefined, { sensitivity: 'accent' }) === 0;
|
||||
if (messageFromHumanAndHasPrefix) {
|
||||
subscriber.next(m);
|
||||
}
|
||||
},
|
||||
error: e => subscriber.error(e),
|
||||
complete: () => subscriber.complete(),
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
import {
|
||||
concat,
|
||||
concatMap,
|
||||
from,
|
||||
fromEvent,
|
||||
map,
|
||||
Observable,
|
||||
of,
|
||||
skip,
|
||||
take,
|
||||
throwError,
|
||||
} from 'rxjs';
|
||||
import { basename } from 'path';
|
||||
import * as Files from '../utilities/readFile';
|
||||
import type Wrapper from '../structures/wrapper';
|
||||
import { controller } from '../sern';
|
||||
import type { Result } from 'ts-results';
|
||||
import { Err, Ok } from 'ts-results';
|
||||
import type { Awaitable } from 'discord.js';
|
||||
import { ApplicationCommandType, ComponentType } from 'discord.js';
|
||||
import type { Module } from '../structures/module';
|
||||
import { match } from 'ts-pattern';
|
||||
import { SernError } from '../structures/errors';
|
||||
import type { DefinitelyDefined } from '../../types/handler';
|
||||
import { CommandType, PluginType } from '../structures/enums';
|
||||
|
||||
export const onReady = (wrapper: Wrapper) => {
|
||||
const { client, commands } = wrapper;
|
||||
const ready$ = fromEvent(client, 'ready').pipe(take(1), skip(1));
|
||||
const processCommandFiles$ = Files.buildData(commands).pipe(
|
||||
map(({ mod, absPath }) => {
|
||||
if (mod?.name === undefined) {
|
||||
const name = Files.fmtFileName(basename(absPath));
|
||||
return { name, ...mod };
|
||||
}
|
||||
return mod;
|
||||
}),
|
||||
);
|
||||
const processPlugins$ = processCommandFiles$.pipe(
|
||||
concatMap(mod => {
|
||||
if (mod.type === CommandType.Autocomplete) {
|
||||
return throwError(
|
||||
() =>
|
||||
SernError.NonValidModuleType +
|
||||
`. You cannot use command plugins and Autocomplete.`,
|
||||
);
|
||||
}
|
||||
const cmdPluginsRes =
|
||||
mod.plugins?.map(plug => {
|
||||
return {
|
||||
...plug,
|
||||
name: plug?.name ?? 'Unnamed Plugin',
|
||||
execute: plug.execute(client, mod, controller),
|
||||
};
|
||||
}) ?? [];
|
||||
return of({ mod, cmdPluginsRes });
|
||||
}),
|
||||
);
|
||||
|
||||
(
|
||||
concat(ready$, processPlugins$) as Observable<{
|
||||
mod: DefinitelyDefined<Module, { name: string }>;
|
||||
cmdPluginsRes: {
|
||||
execute: Awaitable<Result<void, void>>;
|
||||
type: PluginType.Command;
|
||||
name: string;
|
||||
description: string;
|
||||
}[];
|
||||
}>
|
||||
)
|
||||
.pipe(
|
||||
concatMap(pl =>
|
||||
from(
|
||||
Promise.all(
|
||||
pl.cmdPluginsRes.map(async e => ({ ...e, execute: await e.execute })),
|
||||
),
|
||||
).pipe(map(res => ({ ...pl, cmdPluginsRes: res }))),
|
||||
),
|
||||
)
|
||||
.subscribe(({ mod, cmdPluginsRes }) => {
|
||||
const loadedPluginsCorrectly = cmdPluginsRes.every(res => res.execute.ok);
|
||||
if (loadedPluginsCorrectly) {
|
||||
const res = registerModule(mod);
|
||||
if (res.err) {
|
||||
throw Error(
|
||||
SernError.NonValidModuleType +
|
||||
', or loading modules was handled incorrectly. ' +
|
||||
'Check commands path and command files!',
|
||||
);
|
||||
}
|
||||
wrapper.sernEmitter?.emit('module.register', { success: true, module: mod });
|
||||
} else {
|
||||
wrapper.sernEmitter?.emit('module.register', {
|
||||
success: false,
|
||||
module: mod,
|
||||
reason: SernError.PluginFailure,
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function registerModule(mod: DefinitelyDefined<Module, { name: string }>): Result<void, void> {
|
||||
const name = mod.name;
|
||||
return match<Module>(mod)
|
||||
.with({ type: CommandType.Text }, mod => {
|
||||
mod.alias?.forEach(a => Files.TextCommands.aliases.set(a, mod));
|
||||
Files.TextCommands.text.set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.Slash }, mod => {
|
||||
Files.ApplicationCommands[ApplicationCommandType.ChatInput].set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.Both }, mod => {
|
||||
Files.BothCommands.set(name, mod);
|
||||
mod.alias?.forEach(a => Files.TextCommands.aliases.set(a, mod));
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.MenuUser }, mod => {
|
||||
Files.ApplicationCommands[ApplicationCommandType.User].set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.MenuMsg }, mod => {
|
||||
Files.ApplicationCommands[ApplicationCommandType.Message].set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.Button }, mod => {
|
||||
Files.ApplicationCommands[ComponentType.Button].set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.MenuSelect }, mod => {
|
||||
Files.MessageCompCommands[ComponentType.SelectMenu].set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.with({ type: CommandType.Modal }, mod => {
|
||||
Files.ModalSubmitCommands.set(name, mod);
|
||||
return Ok.EMPTY;
|
||||
})
|
||||
.otherwise(() => Err.EMPTY);
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
//
|
||||
// Plugins can be inserted on all commands and are emitted
|
||||
//
|
||||
// 1. on ready event, where all commands are loaded.
|
||||
// 2. on corresponding observable (command triggers)
|
||||
//
|
||||
// The goal of plugins is to organize commands and
|
||||
// provide extensions to repetitive patterns
|
||||
// examples include refreshing modules,
|
||||
// categorizing commands, cooldowns, permissions, etc.
|
||||
// Plugins are reminiscent of middleware in express.
|
||||
//
|
||||
|
||||
import type { Awaitable, Client } from 'discord.js';
|
||||
import type { Err, Ok, Result } from 'ts-results';
|
||||
import type { Module, Override } from '../..';
|
||||
import { CommandType } from '../..';
|
||||
import type { AutocompleteCommand, BaseModule, ModuleDefs } from '../structures/module';
|
||||
import { PluginType } from '../structures/enums';
|
||||
|
||||
export interface Controller {
|
||||
next: () => Ok<void>;
|
||||
stop: () => Err<void>;
|
||||
}
|
||||
|
||||
type BasePlugin = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: PluginType;
|
||||
}
|
||||
>;
|
||||
|
||||
export type CommandPlugin<T extends keyof ModuleDefs = keyof ModuleDefs> = {
|
||||
[K in T]: Override<
|
||||
BasePlugin,
|
||||
{
|
||||
type: PluginType.Command;
|
||||
execute: (
|
||||
wrapper: Client,
|
||||
module: ModuleDefs[T],
|
||||
controller: Controller,
|
||||
) => Awaitable<Result<void, void>>;
|
||||
}
|
||||
>;
|
||||
}[T];
|
||||
export type EventPlugin<T extends keyof ModuleDefs = keyof ModuleDefs> = {
|
||||
[K in T]: Override<
|
||||
BasePlugin,
|
||||
{
|
||||
type: PluginType.Event;
|
||||
execute: (
|
||||
event: Parameters<ModuleDefs[K]['execute']>,
|
||||
controller: Controller,
|
||||
) => Awaitable<Result<void, void>>;
|
||||
}
|
||||
>;
|
||||
}[T];
|
||||
|
||||
//Syntactic sugar on hold
|
||||
// export function plugins<T extends keyof ModuleDefs>(
|
||||
// ...plug: (EventPlugin<T> | CommandPlugin<T>)[]
|
||||
// ) {
|
||||
// return plug;
|
||||
// }
|
||||
|
||||
type ModuleNoPlugins = {
|
||||
[T in keyof ModuleDefs]: Omit<ModuleDefs[T], 'plugins' | 'onEvent'>;
|
||||
};
|
||||
|
||||
function isEventPlugin<T extends CommandType>(
|
||||
e: CommandPlugin<T> | EventPlugin<T>,
|
||||
): e is EventPlugin<T> {
|
||||
return e.type === PluginType.Event;
|
||||
}
|
||||
function isCommandPlugin<T extends CommandType>(
|
||||
e: CommandPlugin<T> | EventPlugin<T>,
|
||||
): e is CommandPlugin<T> {
|
||||
return !isEventPlugin(e);
|
||||
}
|
||||
//TODO: I WANT BETTER TYPINGS AHHHHHHHHHHHHHHH
|
||||
export function sernModule<T extends CommandType>(
|
||||
plugin: (CommandPlugin<T> | EventPlugin<T>)[],
|
||||
mod: ModuleNoPlugins[T],
|
||||
): Module {
|
||||
const onEvent = plugin.filter(isEventPlugin);
|
||||
const plugins = plugin.filter(isCommandPlugin);
|
||||
if (mod.type === CommandType.Autocomplete) {
|
||||
throw new Error(
|
||||
'You cannot use this function declaration for Autocomplete Interactions! use the raw object for options or' +
|
||||
'sernAutoComplete function',
|
||||
);
|
||||
} else
|
||||
return {
|
||||
onEvent,
|
||||
plugins,
|
||||
...mod,
|
||||
} as Module;
|
||||
}
|
||||
|
||||
export function sernAutocomplete(
|
||||
onEvent: EventPlugin<CommandType.Autocomplete>[],
|
||||
mod: Omit<AutocompleteCommand, 'type' | 'name' | 'description' | 'onEvent'>,
|
||||
): Omit<AutocompleteCommand, 'type' | 'name' | 'description'> {
|
||||
return {
|
||||
onEvent,
|
||||
...mod,
|
||||
};
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
import type { DiscordEvent, EventEmitterRegister } from '../types/handler';
|
||||
|
||||
import type Wrapper from './structures/wrapper';
|
||||
import { fromEvent } from 'rxjs';
|
||||
import { onReady } from './events/readyEvent';
|
||||
import { onMessageCreate } from './events/messageEvent';
|
||||
import { onInteractionCreate } from './events/interactionCreate';
|
||||
import { Err, Ok } from 'ts-results';
|
||||
import { isDiscordEvent } from './utilities/predicates';
|
||||
import type { Client } from 'discord.js';
|
||||
|
||||
export function init(wrapper: Wrapper) {
|
||||
const { events, client } = wrapper;
|
||||
if (events !== undefined) {
|
||||
eventObserver(client, events);
|
||||
}
|
||||
onReady(wrapper);
|
||||
onMessageCreate(wrapper);
|
||||
onInteractionCreate(wrapper);
|
||||
}
|
||||
|
||||
function eventObserver(client: Client, events: (DiscordEvent | EventEmitterRegister)[]) {
|
||||
events.forEach(event => {
|
||||
if (isDiscordEvent(event)) {
|
||||
fromEvent(client, event[0], event[1]).subscribe();
|
||||
} else {
|
||||
fromEvent(event[0], event[1], event[2]).subscribe();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export const controller = {
|
||||
next: () => Ok.EMPTY,
|
||||
stop: () => Err.EMPTY,
|
||||
};
|
||||
@@ -1,48 +0,0 @@
|
||||
import { EventEmitter } from 'events';
|
||||
import type { Module } from './structures/module';
|
||||
|
||||
type Payload =
|
||||
| { success: true; module: Module }
|
||||
| { success: false; module: Module | undefined; reason: string | Error };
|
||||
|
||||
type SernEventsMapping = {
|
||||
['module.register']: [Payload];
|
||||
['module.activate']: [Payload];
|
||||
['error']: [Error | string];
|
||||
};
|
||||
|
||||
export default class SernEmitter extends EventEmitter {
|
||||
/**
|
||||
* Listening to sern events with on. This event stays on until a crash or a normal exit
|
||||
* @param eventName
|
||||
* @param listener what to do with the data
|
||||
*/
|
||||
public override on<T extends keyof SernEventsMapping>(
|
||||
eventName: T,
|
||||
listener: (...args: SernEventsMapping[T][]) => void,
|
||||
): this {
|
||||
return super.on(eventName, listener);
|
||||
}
|
||||
/**
|
||||
* Listening to sern events with on. This event stays on until a crash or a normal exit
|
||||
* @param eventName
|
||||
* @param listener what to do with the data
|
||||
*/
|
||||
public override once<T extends keyof SernEventsMapping>(
|
||||
eventName: T,
|
||||
listener: (...args: SernEventsMapping[T][]) => void,
|
||||
): this {
|
||||
return super.once(eventName, listener);
|
||||
}
|
||||
/**
|
||||
* Listening to sern events with on. This event stays on until a crash or a normal exit
|
||||
* @param eventName
|
||||
* @param args the arguments for emitting the { eventName }
|
||||
*/
|
||||
public override emit<T extends keyof SernEventsMapping>(
|
||||
eventName: T,
|
||||
...args: SernEventsMapping[T]
|
||||
): boolean {
|
||||
return super.emit(eventName, ...args);
|
||||
}
|
||||
}
|
||||
@@ -1,157 +0,0 @@
|
||||
import type { APIGuildMember } from 'discord-api-types/v9';
|
||||
import type {
|
||||
ChatInputCommandInteraction,
|
||||
Client,
|
||||
Guild,
|
||||
GuildMember,
|
||||
InteractionReplyOptions,
|
||||
Message,
|
||||
ReplyMessageOptions,
|
||||
Snowflake,
|
||||
TextBasedChannel,
|
||||
User,
|
||||
} from 'discord.js';
|
||||
import { None, Option, Some } from 'ts-results';
|
||||
import type { Nullish } from '../../types/handler';
|
||||
import { ExternallyUsed } from '../utilities/externallyUsed';
|
||||
|
||||
function firstSome<T>(...args: Option<T>[]): Nullish<T> {
|
||||
for (const op of args) {
|
||||
if (op.some) return op.val;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//Could I refactor with Either monad?
|
||||
/**
|
||||
* Provides values shared between
|
||||
* Message and ChatInputCommandInteraction
|
||||
*/
|
||||
export default class Context {
|
||||
private constructor(
|
||||
private oMsg: Option<Message> = None,
|
||||
private oInterac: Option<ChatInputCommandInteraction> = None,
|
||||
) {
|
||||
this.oMsg = oMsg;
|
||||
this.oInterac = oInterac;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the Message object. Crashes if module type is
|
||||
* CommandType.Slash or the event fired in a Both command was
|
||||
* ChatInputCommandInteraction
|
||||
*/
|
||||
@ExternallyUsed
|
||||
public get message() {
|
||||
return this.oMsg.unwrap();
|
||||
}
|
||||
/**
|
||||
* Getting the ChatInputCommandInteraction object. Crashes if module type is
|
||||
* CommandType.Text or the event fired in a Both command was
|
||||
* Message
|
||||
*/
|
||||
@ExternallyUsed
|
||||
public get interaction() {
|
||||
return this.oInterac.unwrap();
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get id(): Snowflake {
|
||||
return firstSome(
|
||||
this.oInterac.map(i => i.id),
|
||||
this.oMsg.map(m => m.id),
|
||||
)!;
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get channel(): Nullish<TextBasedChannel> {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.channel),
|
||||
this.oInterac.map(i => i.channel),
|
||||
);
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get user(): User {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.author),
|
||||
this.oInterac.map(i => i.user),
|
||||
)!;
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get createdTimestamp(): number {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.createdTimestamp),
|
||||
this.oInterac.map(i => i.createdTimestamp),
|
||||
)!;
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get guild(): Guild {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.guild),
|
||||
this.oInterac.map(i => i.guild),
|
||||
)!;
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get guildId(): Snowflake {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.guildId),
|
||||
this.oInterac.map(i => i.guildId),
|
||||
)!;
|
||||
}
|
||||
|
||||
/*
|
||||
* interactions can return APIGuildMember if the guild it is emitted from is not cached
|
||||
*/
|
||||
@ExternallyUsed
|
||||
public get member(): Nullish<GuildMember | APIGuildMember> {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.member),
|
||||
this.oInterac.map(i => i.member),
|
||||
);
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get client(): Client {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.client),
|
||||
this.oInterac.map(i => i.client),
|
||||
)!;
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public get inGuild(): boolean {
|
||||
return firstSome(
|
||||
this.oMsg.map(m => m.inGuild()),
|
||||
this.oInterac.map(i => i.inGuild()),
|
||||
)!;
|
||||
}
|
||||
|
||||
static wrap(wrappable: ChatInputCommandInteraction | Message): Context {
|
||||
if ('token' in wrappable) {
|
||||
return new Context(None, Some(wrappable));
|
||||
}
|
||||
return new Context(Some(wrappable), None);
|
||||
}
|
||||
|
||||
@ExternallyUsed
|
||||
public isEmpty() {
|
||||
return this.oMsg.none && this.oInterac.none;
|
||||
}
|
||||
|
||||
//TODO: make this queueable
|
||||
@ExternallyUsed
|
||||
public reply(content: Omit<InteractionReplyOptions, 'fetchReply'> | ReplyMessageOptions) {
|
||||
return firstSome(
|
||||
this.oInterac.map(i => {
|
||||
return i.reply(content as InteractionReplyOptions).then(() => i.fetchReply());
|
||||
}),
|
||||
this.oMsg.map(m => {
|
||||
return m.reply(content as ReplyMessageOptions);
|
||||
}),
|
||||
)!;
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
/**
|
||||
* @enum { number };
|
||||
*/
|
||||
enum CommandType {
|
||||
Text = 0b00000001,
|
||||
Slash = 0b00000010,
|
||||
MenuUser = 0b00000100,
|
||||
MenuMsg = 0b00001000,
|
||||
Button = 0b00010000,
|
||||
MenuSelect = 0b00100000,
|
||||
Modal = 0b01000000,
|
||||
Autocomplete = 0b10000000,
|
||||
Both = 0b0000011,
|
||||
}
|
||||
|
||||
enum PluginType {
|
||||
Command = 0b01,
|
||||
Event = 0b10,
|
||||
}
|
||||
|
||||
export { CommandType, PluginType };
|
||||
@@ -1,7 +0,0 @@
|
||||
export enum SernError {
|
||||
NonValidModuleType = 'Detected an unknown module type',
|
||||
UndefinedModule = `A module could not be detected at`,
|
||||
MismatchModule = `A module type mismatched with event emitted!`,
|
||||
NotSupportedInteraction = `This interaction is not supported.`,
|
||||
PluginFailure = `A plugin failed to call controller.next()`,
|
||||
}
|
||||
@@ -1,201 +0,0 @@
|
||||
import type {
|
||||
ApplicationCommandAttachmentOption,
|
||||
ApplicationCommandChannelOptionData,
|
||||
ApplicationCommandChoicesData,
|
||||
ApplicationCommandNonOptionsData,
|
||||
ApplicationCommandNumericOptionData,
|
||||
ApplicationCommandOptionData,
|
||||
ApplicationCommandSubCommandData,
|
||||
ApplicationCommandSubGroupData,
|
||||
Awaitable,
|
||||
BaseApplicationCommandOptionsData,
|
||||
ButtonInteraction,
|
||||
MessageContextMenuCommandInteraction,
|
||||
ModalSubmitInteraction,
|
||||
SelectMenuInteraction,
|
||||
UserContextMenuCommandInteraction,
|
||||
} from 'discord.js';
|
||||
import type { Args, Override } from '../../types/handler';
|
||||
import type { CommandPlugin, EventPlugin } from '../plugins/plugin';
|
||||
import type Context from './context';
|
||||
import { CommandType, PluginType } from './enums';
|
||||
import type { AutocompleteInteraction } from 'discord.js';
|
||||
import type { ApplicationCommandOptionType } from 'discord.js';
|
||||
|
||||
export interface BaseModule {
|
||||
type: CommandType | PluginType;
|
||||
name?: string;
|
||||
description: string;
|
||||
execute: (ctx: Context, args: Args) => Awaitable<void>;
|
||||
}
|
||||
|
||||
//possible refactoring types into interfaces and not types
|
||||
export type TextCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.Text;
|
||||
onEvent: EventPlugin<CommandType.Text>[];
|
||||
plugins: CommandPlugin[];
|
||||
alias?: string[];
|
||||
}
|
||||
>;
|
||||
|
||||
export type SlashCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.Slash;
|
||||
onEvent: EventPlugin<CommandType.Slash>[];
|
||||
plugins: CommandPlugin[];
|
||||
options?: SernOptionsData[];
|
||||
}
|
||||
>;
|
||||
|
||||
export type BothCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.Both;
|
||||
onEvent: EventPlugin<CommandType.Both>[];
|
||||
plugins: CommandPlugin[];
|
||||
alias?: string[];
|
||||
options?: SernOptionsData[];
|
||||
}
|
||||
>;
|
||||
|
||||
export type ContextMenuUser = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.MenuUser;
|
||||
onEvent: EventPlugin<CommandType.MenuUser>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: UserContextMenuCommandInteraction) => Awaitable<void>;
|
||||
}
|
||||
>;
|
||||
|
||||
export type ContextMenuMsg = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.MenuMsg;
|
||||
onEvent: EventPlugin<CommandType.MenuMsg>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: MessageContextMenuCommandInteraction) => Awaitable<void>;
|
||||
}
|
||||
>;
|
||||
|
||||
export type ButtonCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.Button;
|
||||
onEvent: EventPlugin<CommandType.Button>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: ButtonInteraction) => Awaitable<void>;
|
||||
}
|
||||
>;
|
||||
|
||||
export type SelectMenuCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.MenuSelect;
|
||||
onEvent: EventPlugin<CommandType.MenuSelect>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: SelectMenuInteraction) => Awaitable<void>;
|
||||
}
|
||||
>;
|
||||
|
||||
export type ModalSubmitCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.Modal;
|
||||
onEvent: EventPlugin<CommandType.Modal>[];
|
||||
plugins: CommandPlugin[];
|
||||
execute: (ctx: ModalSubmitInteraction) => Awaitable<void>;
|
||||
}
|
||||
>;
|
||||
|
||||
// Autocomplete commands are a little different
|
||||
// They can't have command plugins as they are
|
||||
// in conjunction with chat input commands
|
||||
// TODO: possibly in future, allow Autocmp commands in separate files?
|
||||
export type AutocompleteCommand = Override<
|
||||
BaseModule,
|
||||
{
|
||||
type: CommandType.Autocomplete;
|
||||
name: string;
|
||||
onEvent: EventPlugin<CommandType.Autocomplete>[];
|
||||
execute: (ctx: AutocompleteInteraction) => Awaitable<void>;
|
||||
}
|
||||
>;
|
||||
|
||||
export type Module =
|
||||
| TextCommand
|
||||
| SlashCommand
|
||||
| BothCommand
|
||||
| ContextMenuUser
|
||||
| ContextMenuMsg
|
||||
| ButtonCommand
|
||||
| SelectMenuCommand
|
||||
| ModalSubmitCommand
|
||||
| AutocompleteCommand;
|
||||
|
||||
//https://stackoverflow.com/questions/64092736/alternative-to-switch-statement-for-typescript-discriminated-union
|
||||
// Explicit Module Definitions for mapping
|
||||
export type ModuleDefs = {
|
||||
[CommandType.Text]: TextCommand;
|
||||
[CommandType.Slash]: SlashCommand;
|
||||
[CommandType.Both]: BothCommand;
|
||||
[CommandType.MenuMsg]: ContextMenuMsg;
|
||||
[CommandType.MenuUser]: ContextMenuUser;
|
||||
[CommandType.Button]: ButtonCommand;
|
||||
[CommandType.MenuSelect]: SelectMenuCommand;
|
||||
[CommandType.Modal]: ModalSubmitCommand;
|
||||
[CommandType.Autocomplete]: AutocompleteCommand;
|
||||
};
|
||||
|
||||
//TODO: support deeply nested Autocomplete
|
||||
// objective: construct union of ApplicationCommandOptionData change any Autocomplete data
|
||||
// into Sern autocomplete data.
|
||||
|
||||
export type SernAutocompleteData = Override<
|
||||
BaseApplicationCommandOptionsData,
|
||||
{
|
||||
autocomplete: true;
|
||||
type:
|
||||
| ApplicationCommandOptionType.String
|
||||
| ApplicationCommandOptionType.Number
|
||||
| ApplicationCommandOptionType.Integer;
|
||||
command: Omit<AutocompleteCommand, 'type' | 'name' | 'description'>;
|
||||
}
|
||||
>;
|
||||
|
||||
/**
|
||||
* Type that just uses SernAutocompleteData and not regular autocomplete
|
||||
*/
|
||||
export type BaseOptions =
|
||||
| ApplicationCommandChoicesData
|
||||
| ApplicationCommandNonOptionsData
|
||||
| ApplicationCommandChannelOptionData
|
||||
| ApplicationCommandNumericOptionData
|
||||
| ApplicationCommandAttachmentOption
|
||||
| SernAutocompleteData;
|
||||
|
||||
export type SernSubCommandData = Override<
|
||||
Omit<BaseApplicationCommandOptionsData, 'required'>,
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand;
|
||||
options?: BaseOptions[];
|
||||
}
|
||||
>;
|
||||
|
||||
export type SernSubCommandGroupData = Override<
|
||||
Omit<BaseApplicationCommandOptionsData, 'required'>,
|
||||
{
|
||||
type: ApplicationCommandOptionType.SubcommandGroup;
|
||||
options?: SernSubCommandData[];
|
||||
}
|
||||
>;
|
||||
|
||||
export type SernOptionsData<U extends ApplicationCommandOptionData = ApplicationCommandOptionData> =
|
||||
U extends ApplicationCommandSubCommandData
|
||||
? SernSubCommandData
|
||||
: U extends ApplicationCommandSubGroupData
|
||||
? SernSubCommandGroupData
|
||||
: BaseOptions;
|
||||
@@ -1,28 +0,0 @@
|
||||
import Context from './context';
|
||||
import type {
|
||||
BothCommand,
|
||||
Module,
|
||||
SlashCommand,
|
||||
TextCommand,
|
||||
SernOptionsData,
|
||||
BaseOptions,
|
||||
SernAutocompleteData,
|
||||
SernSubCommandData,
|
||||
SernSubCommandGroupData,
|
||||
} from './module';
|
||||
import type Wrapper from './wrapper';
|
||||
|
||||
export * from './enums';
|
||||
export {
|
||||
Context,
|
||||
SlashCommand,
|
||||
TextCommand,
|
||||
BothCommand,
|
||||
Module,
|
||||
Wrapper,
|
||||
SernOptionsData,
|
||||
BaseOptions,
|
||||
SernAutocompleteData,
|
||||
SernSubCommandData,
|
||||
SernSubCommandGroupData,
|
||||
};
|
||||
@@ -1,21 +0,0 @@
|
||||
import type { Client } from 'discord.js';
|
||||
import type { DiscordEvent, EventEmitterRegister } from '../../types/handler';
|
||||
import type SernEmitter from '../sernEmitter';
|
||||
|
||||
/**
|
||||
* An object to be passed into Sern.Handler constructor.
|
||||
* @typedef {object} Wrapper
|
||||
* @property {readonly Client} client
|
||||
* @property {readonly string} defaultPrefix
|
||||
* @property {readonly string} commands
|
||||
* @prop { readonly DiscordEvent[] } events
|
||||
*/
|
||||
interface Wrapper {
|
||||
readonly client: Client;
|
||||
readonly sernEmitter?: SernEmitter;
|
||||
readonly defaultPrefix?: string;
|
||||
readonly commands: string;
|
||||
readonly events?: (DiscordEvent | EventEmitterRegister)[];
|
||||
}
|
||||
|
||||
export default Wrapper;
|
||||
@@ -1,18 +0,0 @@
|
||||
/**
|
||||
* This function denotes usage of decorated method is external
|
||||
* Also, makes method appear 'used' in IDEs
|
||||
* @param _target
|
||||
* @param _propertyKey
|
||||
* @param _descriptor
|
||||
* @constructor
|
||||
*/
|
||||
export function ExternallyUsed(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
_target: unknown,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
_propertyKey: string,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
_descriptor: PropertyDescriptor,
|
||||
) {
|
||||
return void 0;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import type { Message } from 'discord.js';
|
||||
|
||||
/**
|
||||
* Checks if the author of message is a bot or not
|
||||
* @param message The message to check
|
||||
* @returns `true` if the author of the message is a bot, `false` otherwise
|
||||
* @example
|
||||
* isBot(message) ? 'yes it is a bot' : 'no it is not a bot';
|
||||
*/
|
||||
export function isNotFromBot(message: Message) {
|
||||
return !message.author.bot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the message **starts** with the prefix
|
||||
* @param message The message to check
|
||||
* @param prefix The prefix to check for
|
||||
* @returns `true` if the message starts with the prefix, `false` otherwise
|
||||
* @example
|
||||
* hasPrefix(message, '!') ? 'yes it does' : 'no it does not';
|
||||
*/
|
||||
export function hasPrefix(message: Message, prefix?: string) {
|
||||
return message.content.startsWith(prefix!);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the first character(s) _[depending on prefix length]_ of the message
|
||||
* @param msg
|
||||
* @param prefix The prefix to remove
|
||||
* @returns The message without the prefix
|
||||
* @example
|
||||
* message.content = '!ping';
|
||||
* console.log(fmt(message, '!'));
|
||||
* // [ 'ping' ]
|
||||
*/
|
||||
export function fmt(msg: Message, prefix: string): string[] {
|
||||
return msg.content.slice(prefix.length).trim().split(/\s+/g);
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
import type { Module, ModuleDefs } from '../structures/module';
|
||||
import type {
|
||||
Awaitable,
|
||||
ButtonInteraction,
|
||||
ChatInputCommandInteraction,
|
||||
CommandInteraction,
|
||||
MessageComponentInteraction,
|
||||
MessageContextMenuCommandInteraction,
|
||||
SelectMenuInteraction,
|
||||
UserContextMenuCommandInteraction,
|
||||
} from 'discord.js';
|
||||
import type { DiscordEvent, EventEmitterRegister } from '../..';
|
||||
|
||||
export function correctModuleType<T extends keyof ModuleDefs>(
|
||||
plug: Module | undefined,
|
||||
type: T,
|
||||
): plug is ModuleDefs[T] {
|
||||
// Another way to check if type is equivalent,
|
||||
// It will check based on flag system instead
|
||||
return plug !== undefined && (plug.type & type) !== 0;
|
||||
}
|
||||
|
||||
export function isChatInputCommand(i: CommandInteraction): i is ChatInputCommandInteraction {
|
||||
return i.isChatInputCommand();
|
||||
}
|
||||
|
||||
export function isButton(i: MessageComponentInteraction): i is ButtonInteraction {
|
||||
return i.isButton();
|
||||
}
|
||||
|
||||
export function isSelectMenu(i: MessageComponentInteraction): i is SelectMenuInteraction {
|
||||
return i.isSelectMenu();
|
||||
}
|
||||
|
||||
export function isMessageCtxMenuCmd(
|
||||
i: CommandInteraction,
|
||||
): i is MessageContextMenuCommandInteraction {
|
||||
return i.isMessageContextMenuCommand();
|
||||
}
|
||||
|
||||
export function isUserContextMenuCmd(
|
||||
i: CommandInteraction,
|
||||
): i is UserContextMenuCommandInteraction {
|
||||
return i.isUserContextMenuCommand();
|
||||
}
|
||||
|
||||
export function isPromise<T>(promiseLike: Awaitable<T>): promiseLike is Promise<T> {
|
||||
const keys = new Set(Object.keys(promiseLike));
|
||||
return keys.has('then') && keys.has('catch');
|
||||
}
|
||||
|
||||
export function isDiscordEvent(el: DiscordEvent | EventEmitterRegister): el is DiscordEvent {
|
||||
return el.length === 2;
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
import { ApplicationCommandType, ComponentType } from 'discord.js';
|
||||
import { readdirSync, statSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
import { from, Observable } from 'rxjs';
|
||||
import type { Module } from '../structures/module';
|
||||
|
||||
//Maybe move this? this probably doesnt belong in utlities/
|
||||
export const BothCommands = new Map<string, Module>();
|
||||
export const ApplicationCommands = {
|
||||
[ApplicationCommandType.User]: new Map<string, Module>(),
|
||||
[ApplicationCommandType.Message]: new Map<string, Module>(),
|
||||
[ApplicationCommandType.ChatInput]: new Map<string, Module>(),
|
||||
} as { [K in ApplicationCommandType]: Map<string, Module> };
|
||||
|
||||
export const MessageCompCommands = {
|
||||
[ComponentType.Button]: new Map<string, Module>(),
|
||||
[ComponentType.SelectMenu]: new Map<string, Module>(),
|
||||
[ComponentType.TextInput]: new Map<string, Module>(),
|
||||
};
|
||||
export const TextCommands = {
|
||||
text: new Map<string, Module>(),
|
||||
aliases: new Map<string, Module>(),
|
||||
};
|
||||
export const ModalSubmitCommands = new Map<string, Module>();
|
||||
// Courtesy @Townsy45
|
||||
function readPath(dir: string, arrayOfFiles: string[] = []): string[] {
|
||||
try {
|
||||
const files = readdirSync(dir);
|
||||
for (const file of files) {
|
||||
if (statSync(dir + '/' + file).isDirectory()) readPath(dir + '/' + file, arrayOfFiles);
|
||||
else arrayOfFiles.push(join(dir, '/', file));
|
||||
}
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
return arrayOfFiles;
|
||||
}
|
||||
|
||||
export const fmtFileName = (n: string) => n.substring(0, n.length - 3);
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {Observable<{ mod: Module; absPath: string; }[]>} data from command files
|
||||
* @param commandDir
|
||||
*/
|
||||
|
||||
export function buildData(commandDir: string): Observable<{
|
||||
mod: Module;
|
||||
absPath: string;
|
||||
}> {
|
||||
return from(
|
||||
getCommands(commandDir).map(absPath => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const mod = <Module>require(absPath).default;
|
||||
return { mod, absPath };
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
export function getCommands(dir: string): string[] {
|
||||
return readPath(join(process.cwd(), dir));
|
||||
}
|
||||
74
src/handlers/event-utils.ts
Normal file
74
src/handlers/event-utils.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import type { Emitter, Logging } from '../core/interfaces';
|
||||
import { SernError } from '../core/structures/enums'
|
||||
import { Ok, wrapAsync} from '../core/structures/result';
|
||||
import type { Module } from '../types/core-modules';
|
||||
import { inspect } from 'node:util'
|
||||
import { resultPayload } from '../core/functions'
|
||||
import merge from 'deepmerge'
|
||||
|
||||
|
||||
interface ExecutePayload {
|
||||
module: Module;
|
||||
args: unknown[];
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
|
||||
function isObject(item: unknown) {
|
||||
return (item && typeof item === 'object' && !Array.isArray(item));
|
||||
}
|
||||
|
||||
//_module is frozen, preventing from mutations
|
||||
export async function callInitPlugins(_module: Module, deps: Dependencies, emit?: boolean) {
|
||||
let module = _module;
|
||||
const emitter = deps['@sern/emitter'];
|
||||
for(const plugin of module.plugins ?? []) {
|
||||
const result = await plugin.execute({ module, absPath: module.meta.absPath, deps });
|
||||
if (!result) throw Error("Plugin did not return anything. " + inspect(plugin, false, Infinity, true));
|
||||
if(!result.ok) {
|
||||
if(emit) {
|
||||
emitter?.emit('module.register',
|
||||
resultPayload('failure', module, result.error ?? SernError.PluginFailure));
|
||||
}
|
||||
throw Error((result.error ?? SernError.PluginFailure) +
|
||||
'on module ' + module.name + " " + module.meta.absPath);
|
||||
}
|
||||
}
|
||||
return module
|
||||
}
|
||||
|
||||
export function executeModule(emitter: Emitter, logger: Logging|undefined, { module, args } : ExecutePayload) {
|
||||
|
||||
const moduleCalled = wrapAsync(async () => {
|
||||
return module.execute(...args);
|
||||
})
|
||||
moduleCalled
|
||||
.then((res) => {
|
||||
if(res.ok) {
|
||||
emitter.emit('module.activate', resultPayload('success', module))
|
||||
} else {
|
||||
if(!emitter.emit('error', resultPayload('failure', module, res.error))) {
|
||||
// node crashes here.
|
||||
logger?.error({ 'message': res.error })
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
throw err
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
export async function callPlugins({ args, module }: ExecutePayload) {
|
||||
let state = {};
|
||||
for(const plugin of module.onEvent??[]) {
|
||||
const result = await plugin.execute(...args);
|
||||
if(!result.ok) {
|
||||
return result;
|
||||
}
|
||||
if(isObject(result.value)) {
|
||||
state = merge(state, result.value!);
|
||||
}
|
||||
}
|
||||
return Ok(state);
|
||||
}
|
||||
74
src/handlers/interaction.ts
Normal file
74
src/handlers/interaction.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import type { Module, SernAutocompleteData } from '../types/core-modules'
|
||||
import { callPlugins, executeModule } from './event-utils';
|
||||
import { SernError } from '../core/structures/enums'
|
||||
import { createSDT, isAutocomplete, isCommand, isContextCommand, isMessageComponent, isModal, resultPayload } from '../core/functions'
|
||||
import type { UnpackedDependencies } from '../types/utility';
|
||||
import * as Id from '../core/id'
|
||||
import { Context } from '../core/structures/context';
|
||||
import path from 'node:path';
|
||||
|
||||
|
||||
|
||||
export function interactionHandler(deps: UnpackedDependencies, defaultPrefix?: string) {
|
||||
//i wish javascript had clojure destructuring
|
||||
const { '@sern/client': client,
|
||||
'@sern/modules': moduleManager,
|
||||
'@sern/logger': log,
|
||||
'@sern/emitter': reporter } = deps
|
||||
|
||||
client.on('interactionCreate', async (event) => {
|
||||
|
||||
//returns array of possible ids
|
||||
const possibleIds = Id.reconstruct(event);
|
||||
|
||||
let modules = possibleIds
|
||||
.map(({ id, params }) => ({ module: moduleManager.get(id)!, params }))
|
||||
.filter(({ module }) => module !== undefined);
|
||||
|
||||
if(modules.length == 0) {
|
||||
return;
|
||||
}
|
||||
const { module, params } = modules.at(0)!;
|
||||
let payload;
|
||||
// handles autocomplete
|
||||
if(isAutocomplete(event)) {
|
||||
const lookupTable = module.locals['@sern/lookup-table'] as Map<string, SernAutocompleteData>
|
||||
const subCommandGroup = event.options.getSubcommandGroup(false) ?? "",
|
||||
subCommand = event.options.getSubcommand(false) ?? "",
|
||||
option = event.options.getFocused(true),
|
||||
fullPath = path.posix.join("<parent>", subCommandGroup, subCommand, option.name)
|
||||
|
||||
const resolvedModule = (lookupTable.get(fullPath)!.command) as Module
|
||||
payload= { module: resolvedModule , //autocomplete is not a true "module" warning cast!
|
||||
args: [event, createSDT(module, deps, params)] };
|
||||
// either CommandTypes Slash | ContextMessage | ContextUesr
|
||||
} else if(isCommand(event)) {
|
||||
const sdt = createSDT(module, deps, params)
|
||||
// handle CommandType.CtxUser || CommandType.CtxMsg
|
||||
if(isContextCommand(event)) {
|
||||
payload= { module, args: [event, sdt] };
|
||||
} else {
|
||||
// handle CommandType.Slash || CommandType.Both
|
||||
payload= { module, args: [Context.wrap(event, defaultPrefix), sdt] };
|
||||
}
|
||||
// handles modals or components
|
||||
} else if (isModal(event) || isMessageComponent(event)) {
|
||||
payload= { module, args: [event, createSDT(module, deps, params)] }
|
||||
} else {
|
||||
throw Error("Unknown interaction while handling in interactionCreate event " + event)
|
||||
}
|
||||
const result = await callPlugins(payload)
|
||||
if(!result.ok) {
|
||||
reporter.emit('module.activate', resultPayload('failure', module, result.error ?? SernError.PluginFailure))
|
||||
return
|
||||
}
|
||||
if(payload.args.length !== 2) {
|
||||
throw Error ('Invalid payload')
|
||||
}
|
||||
//@ts-ignore assigning final state from plugin
|
||||
payload.args[1].state = result.value
|
||||
|
||||
// note: do not await this. will be blocking if long task (ie waiting for modal input)
|
||||
executeModule(reporter, log, payload);
|
||||
});
|
||||
}
|
||||
54
src/handlers/message.ts
Normal file
54
src/handlers/message.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import type { Message } from 'discord.js';
|
||||
import { callPlugins, executeModule } from './event-utils';
|
||||
import { SernError } from '../core/structures/enums'
|
||||
import { createSDT, fmt, resultPayload } from '../core/functions'
|
||||
import type { UnpackedDependencies } from '../types/utility';
|
||||
import type { Module } from '../types/core-modules';
|
||||
import { Context } from '../core/structures/context';
|
||||
|
||||
/**
|
||||
* Ignores messages from any person / bot except itself
|
||||
* @param prefix
|
||||
*/
|
||||
function isBotOrNoPrefix(msg: Message, prefix: string) {
|
||||
return msg.author.bot || !hasPrefix(prefix, msg.content);
|
||||
}
|
||||
|
||||
function hasPrefix(prefix: string, content: string) {
|
||||
const prefixInContent = content.slice(0, prefix.length);
|
||||
return prefixInContent.localeCompare(prefix, undefined, { sensitivity: 'accent' }) === 0;
|
||||
}
|
||||
|
||||
export function messageHandler (deps: UnpackedDependencies, defaultPrefix?: string) {
|
||||
const {"@sern/emitter": emitter,
|
||||
'@sern/logger': log,
|
||||
'@sern/modules': mg,
|
||||
'@sern/client': client} = deps
|
||||
|
||||
if (!defaultPrefix) {
|
||||
log?.debug({ message: 'No prefix found. message handler shutting down' });
|
||||
return;
|
||||
}
|
||||
client.on('messageCreate', async message => {
|
||||
if(isBotOrNoPrefix(message, defaultPrefix)) {
|
||||
return
|
||||
}
|
||||
const [prefix] = fmt(message.content, defaultPrefix);
|
||||
let module = mg.get(`${prefix}_T`) ?? mg.get(`${prefix}_B`) as Module;
|
||||
if(!module) {
|
||||
log?.warning({ message: 'Possibly undefined behavior: could not find a static id to resolve' });
|
||||
}
|
||||
const payload = { module, args: [Context.wrap(message, defaultPrefix), createSDT(module, deps, undefined)] }
|
||||
const result = await callPlugins(payload)
|
||||
if (!result.ok) {
|
||||
emitter.emit('module.activate', resultPayload('failure', module, result.error ?? SernError.PluginFailure))
|
||||
return
|
||||
}
|
||||
|
||||
//@ts-ignore
|
||||
payload.args[1].state = result.value
|
||||
|
||||
executeModule(emitter, log, payload)
|
||||
})
|
||||
|
||||
}
|
||||
99
src/handlers/presence.ts
Normal file
99
src/handlers/presence.ts
Normal file
@@ -0,0 +1,99 @@
|
||||
import { Presence } from "../core/presences";
|
||||
import { Services } from "../core/ioc";
|
||||
import * as Files from "../core/module-loading";
|
||||
type SetPresence = (conf: Presence.Result) => Promise<unknown>
|
||||
|
||||
const parseConfig = async (conf: Promise<Presence.Result>, setPresence: SetPresence) => {
|
||||
const result = await conf;
|
||||
|
||||
if ('repeat' in result) {
|
||||
const { onRepeat, repeat } = result;
|
||||
// Validate configuration
|
||||
if (repeat === undefined) {
|
||||
throw new Error("repeat option is undefined");
|
||||
}
|
||||
if (onRepeat === undefined) {
|
||||
throw new Error("onRepeat callback is undefined, but repeat exists");
|
||||
}
|
||||
// Initial state
|
||||
let currentState = result;
|
||||
const processState = async (state: typeof currentState) => {
|
||||
try {
|
||||
const result = onRepeat(state);
|
||||
// If it's a promise, await it, otherwise use the value directly
|
||||
return result instanceof Promise ? await result : result;
|
||||
} catch (error) {
|
||||
// TODO process error
|
||||
//console.error(error);
|
||||
return state; // Return previous state on error
|
||||
}
|
||||
};
|
||||
// Handle numeric interval
|
||||
if (typeof repeat === 'number') {
|
||||
// Return a promise that never resolves (or resolves on cleanup)
|
||||
return new Promise((resolve) => {
|
||||
// Immediately return initial state
|
||||
processState(currentState);
|
||||
|
||||
// Set up interval
|
||||
let isProcessing = false;
|
||||
const intervalId = setInterval(() => {
|
||||
// Skip if previous operation is still running
|
||||
if (isProcessing) return;
|
||||
isProcessing = true;
|
||||
|
||||
processState(currentState)
|
||||
.then(newState => {
|
||||
currentState = newState;
|
||||
return setPresence(currentState)
|
||||
})
|
||||
.catch(console.error)
|
||||
.finally(() => {
|
||||
isProcessing = false;
|
||||
});
|
||||
}, repeat);
|
||||
|
||||
// Optional: Return cleanup function
|
||||
return () => clearInterval(intervalId);
|
||||
});
|
||||
}
|
||||
// Handle event-based repeat
|
||||
else {
|
||||
const handler = async () => {
|
||||
currentState = await onRepeat(currentState);
|
||||
await setPresence(currentState);
|
||||
};
|
||||
let has_registered = false;
|
||||
return new Promise((resolve) => {
|
||||
const [target, eventName] = repeat;
|
||||
|
||||
// Immediately return initial state
|
||||
processState(currentState);
|
||||
|
||||
// Set up event listener
|
||||
if(!has_registered) {
|
||||
target.addListener(eventName, handler);
|
||||
has_registered=true;
|
||||
}
|
||||
// Optional: Return cleanup function
|
||||
return () => target.removeListener(eventName, handler);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// No repeat configuration, just return the result
|
||||
return setPresence(result);
|
||||
};
|
||||
|
||||
export const presenceHandler = async (path: string, setPresence: SetPresence) => {
|
||||
const presence = await
|
||||
Files.importModule<Presence.Config<(keyof Dependencies)[]>>(path)
|
||||
.then(({ module }) => {
|
||||
//fetch services with the order preserved, passing it to the execute fn
|
||||
const fetchedServices = Services(...module.inject ?? []);
|
||||
return async () => module.execute(...fetchedServices);
|
||||
})
|
||||
|
||||
return parseConfig(presence(), setPresence);
|
||||
|
||||
}
|
||||
58
src/handlers/ready.ts
Normal file
58
src/handlers/ready.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import * as Files from "../core/module-loading";
|
||||
import { once } from "node:events";
|
||||
import { createLookupTable, resultPayload } from "../core/functions";
|
||||
import { CommandType } from "../core/structures/enums";
|
||||
import { Module, SernOptionsData } from "../types/core-modules";
|
||||
import type { UnpackedDependencies, Wrapper } from "../types/utility";
|
||||
import { callInitPlugins } from "./event-utils";
|
||||
import { SernAutocompleteData } from "..";
|
||||
import { Events } from "discord.js";
|
||||
|
||||
export default async function (
|
||||
dirs: string | string[],
|
||||
deps: UnpackedDependencies,
|
||||
) {
|
||||
const {
|
||||
"@sern/client": client,
|
||||
"@sern/logger": log,
|
||||
"@sern/emitter": sEmitter,
|
||||
"@sern/modules": commands,
|
||||
} = deps;
|
||||
log?.info({ message: "Waiting on discord client to be ready..." });
|
||||
await once(client, Events.ClientReady);
|
||||
log?.info({ message: "Client signaled ready, registering modules" });
|
||||
|
||||
// https://observablehq.com/@ehouais/multiple-promises-as-an-async-generator
|
||||
// possibly optimize to concurrently import modules
|
||||
|
||||
const directories = Array.isArray(dirs) ? dirs : [dirs];
|
||||
|
||||
for (const dir of directories) {
|
||||
for await (const path of Files.readRecursive(dir)) {
|
||||
const { module } = await Files.importModule<Module>(path);
|
||||
const validType =
|
||||
module.type >= CommandType.Text &&
|
||||
module.type <= CommandType.ChannelSelect;
|
||||
if (!validType) {
|
||||
throw Error(
|
||||
`Found ${module.name} at ${module.meta.absPath}, which has incorrect \`type\``,
|
||||
);
|
||||
}
|
||||
const resultModule = await callInitPlugins(module, deps, true);
|
||||
|
||||
if (
|
||||
module.type === CommandType.Both ||
|
||||
module.type === CommandType.Slash
|
||||
) {
|
||||
const options = (Reflect.get(module, "options") ??
|
||||
[]) as SernOptionsData[];
|
||||
const lookupTable = createLookupTable(options);
|
||||
module.locals["@sern/lookup-table"] = lookupTable;
|
||||
}
|
||||
// FREEZE! no more writing!!
|
||||
commands.set(resultModule.meta.id, Object.freeze(resultModule));
|
||||
sEmitter.emit("module.register", resultPayload("success", resultModule));
|
||||
}
|
||||
}
|
||||
sEmitter.emit("modulesLoaded");
|
||||
}
|
||||
21
src/handlers/tasks.ts
Normal file
21
src/handlers/tasks.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import * as Files from '../core/module-loading'
|
||||
import { UnpackedDependencies, Wrapper } from "../types/utility";
|
||||
import type { ScheduledTask } from "../types/core-modules";
|
||||
import { relative } from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
export const registerTasks = async (tasksDirs: string | string[], deps: UnpackedDependencies) => {
|
||||
const taskManager = deps['@sern/scheduler']
|
||||
|
||||
const directories = Array.isArray(tasksDirs) ? tasksDirs : [tasksDirs];
|
||||
|
||||
for (const dir of directories) {
|
||||
for await (const path of Files.readRecursive(dir)) {
|
||||
let { module } = await Files.importModule<ScheduledTask>(path);
|
||||
//module.name is assigned by Files.importModule<>
|
||||
// the id created for the task is unique
|
||||
const uuid = module.name+"/"+relative(dir,fileURLToPath(path))
|
||||
taskManager.schedule(uuid, module, deps)
|
||||
}
|
||||
}
|
||||
}
|
||||
62
src/handlers/user-defined-events.ts
Normal file
62
src/handlers/user-defined-events.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import { EventType, SernError } from '../core/structures/enums';
|
||||
import { callInitPlugins } from './event-utils'
|
||||
import { EventModule } from '../types/core-modules';
|
||||
import * as Files from '../core/module-loading'
|
||||
import type { UnpackedDependencies } from '../types/utility';
|
||||
import type { Emitter } from '../core/interfaces';
|
||||
import { inspect } from 'util'
|
||||
import { resultPayload } from '../core/functions';
|
||||
import type { Wrapper } from '../'
|
||||
|
||||
export default async function(deps: UnpackedDependencies, wrapper: Wrapper) {
|
||||
const eventModules: EventModule[] = [];
|
||||
const eventDirs = Array.isArray(wrapper.events!) ? wrapper.events! : [wrapper.events!];
|
||||
|
||||
for (const dir of eventDirs) {
|
||||
for await (const path of Files.readRecursive(dir)) {
|
||||
let { module } = await Files.importModule<EventModule>(path);
|
||||
await callInitPlugins(module, deps)
|
||||
eventModules.push(module);
|
||||
}
|
||||
}
|
||||
|
||||
const logger = deps['@sern/logger'], report = deps['@sern/emitter'];
|
||||
for (const module of eventModules) {
|
||||
let source: Emitter;
|
||||
|
||||
switch (module.type) {
|
||||
case EventType.Sern:
|
||||
source=deps['@sern/emitter'];
|
||||
break
|
||||
case EventType.Discord:
|
||||
source=deps['@sern/client'];
|
||||
break
|
||||
case EventType.External:
|
||||
source=deps[module.emitter] as Emitter;
|
||||
break
|
||||
default: throw Error(SernError.InvalidModuleType + ' while creating event handler');
|
||||
}
|
||||
if(!source && typeof source !== 'object') {
|
||||
throw Error(`${source} cannot be constructed into an event listener`)
|
||||
}
|
||||
|
||||
if(!('addListener' in source && 'removeListener' in source)) {
|
||||
throw Error('source must implement Emitter')
|
||||
}
|
||||
const execute = async (...args: any[]) => {
|
||||
try {
|
||||
if(args) {
|
||||
if('once' in module) { source.removeListener(String(module.name!), execute); }
|
||||
await Reflect.apply(module.execute, null, args);
|
||||
}
|
||||
} catch(e) {
|
||||
const err = e instanceof Error ? e : Error(inspect(e, { colors: true }));
|
||||
if(!report.emit('error', resultPayload('failure', module, err))) {
|
||||
logger?.error({ message: inspect(err) });
|
||||
}
|
||||
}
|
||||
}
|
||||
source.addListener(String(module.name!), execute)
|
||||
}
|
||||
}
|
||||
|
||||
59
src/index.ts
59
src/index.ts
@@ -1,4 +1,55 @@
|
||||
export * as Sern from './handler/sern';
|
||||
export * from './types/handler';
|
||||
export * from './handler/structures/structxports';
|
||||
export * from './handler/plugins/plugin';
|
||||
export * as Sern from './sern';
|
||||
|
||||
export type {
|
||||
Module,
|
||||
CommandModule,
|
||||
EventModule,
|
||||
BothCommand,
|
||||
ContextMenuMsg,
|
||||
ContextMenuUser,
|
||||
SlashCommand,
|
||||
TextCommand,
|
||||
ButtonCommand,
|
||||
StringSelectCommand,
|
||||
MentionableSelectCommand,
|
||||
UserSelectCommand,
|
||||
ChannelSelectCommand,
|
||||
RoleSelectCommand,
|
||||
ModalSubmitCommand,
|
||||
DiscordEventCommand,
|
||||
SernEventCommand,
|
||||
ExternalEventCommand,
|
||||
CommandModuleDefs,
|
||||
EventModuleDefs,
|
||||
SernAutocompleteData,
|
||||
SernOptionsData,
|
||||
SernSubCommandData,
|
||||
SernSubCommandGroupData,
|
||||
SDT,
|
||||
ScheduledTask
|
||||
} from './types/core-modules';
|
||||
|
||||
export type {
|
||||
PluginResult,
|
||||
InitPlugin,
|
||||
ControlPlugin,
|
||||
Plugin,
|
||||
AnyPlugin,
|
||||
} from './types/core-plugin';
|
||||
|
||||
|
||||
export type { Payload, SernEventsMapping, Wrapper } from './types/utility';
|
||||
|
||||
export {
|
||||
commandModule,
|
||||
eventModule,
|
||||
discordEvent,
|
||||
scheduledTask
|
||||
} from './core/modules';
|
||||
|
||||
export * from './core/presences'
|
||||
export * from './core/interfaces'
|
||||
export * from './core/plugin';
|
||||
export { CommandType, PluginType, PayloadType, EventType } from './core/structures/enums';
|
||||
export { Context } from './core/structures/context';
|
||||
export { type CoreDependencies, makeDependencies, single, transient, Service, Services } from './core/ioc';
|
||||
|
||||
80
src/sern.ts
Normal file
80
src/sern.ts
Normal file
@@ -0,0 +1,80 @@
|
||||
//side effect: global container
|
||||
import { useContainerRaw } from '@sern/ioc/global';
|
||||
// set asynchronous capturing of errors
|
||||
import events from 'node:events'
|
||||
events.captureRejections = true;
|
||||
|
||||
import callsites from 'callsites';
|
||||
import * as Files from './core/module-loading';
|
||||
import eventsHandler from './handlers/user-defined-events';
|
||||
import ready from './handlers/ready';
|
||||
import { interactionHandler } from './handlers/interaction';
|
||||
import { messageHandler } from './handlers/message'
|
||||
import { presenceHandler } from './handlers/presence';
|
||||
import type { Payload, UnpackedDependencies, Wrapper } from './types/utility';
|
||||
import type { Presence} from './core/presences';
|
||||
import { registerTasks } from './handlers/tasks';
|
||||
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @param maybeWrapper Options to pass into sern.
|
||||
* Function to start the handler up
|
||||
* @example
|
||||
* ```ts title="src/index.ts"
|
||||
* Sern.init({
|
||||
* commands: 'dist/commands',
|
||||
* events: 'dist/events',
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
|
||||
export function init(maybeWrapper: Wrapper = { commands: "./dist/commands" }) {
|
||||
const startTime = performance.now();
|
||||
const deps = useContainerRaw().deps<UnpackedDependencies>();
|
||||
if (maybeWrapper.events !== undefined) {
|
||||
eventsHandler(deps, maybeWrapper)
|
||||
.then(() => {
|
||||
deps['@sern/logger']?.info({ message: "Events registered" });
|
||||
});
|
||||
} else {
|
||||
deps['@sern/logger']?.info({ message: "No events registered" });
|
||||
}
|
||||
|
||||
// autohandle errors that occur in modules.
|
||||
// convenient for rapid iteration
|
||||
if(maybeWrapper.handleModuleErrors) {
|
||||
if(!deps['@sern/logger']) {
|
||||
throw Error('A logger is required to handleModuleErrors.\n A default logger is already supplied!');
|
||||
}
|
||||
deps['@sern/logger']?.info({ 'message': 'handleModuleErrors enabled' })
|
||||
deps['@sern/emitter'].addListener('error', (payload: Payload) => {
|
||||
if(payload.type === 'failure') {
|
||||
deps['@sern/logger']?.error({ message: payload.reason })
|
||||
} else {
|
||||
deps['@sern/logger']?.warning({ message: "error event should only have payloads of 'failure'" });
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const initCallsite = callsites()[1].getFileName();
|
||||
const presencePath = Files.shouldHandle(initCallsite!, "presence");
|
||||
//Ready event: load all modules and when finished, time should be taken and logged
|
||||
ready(maybeWrapper.commands, deps)
|
||||
.then(() => {
|
||||
const time = ((performance.now() - startTime) / 1000).toFixed(2);
|
||||
deps['@sern/logger']?.info({ message: `sern: registered in ${time} s` });
|
||||
if(presencePath.exists) {
|
||||
const setPresence = async (p: Presence.Result) => {
|
||||
return deps['@sern/client'].user?.setPresence(p);
|
||||
}
|
||||
presenceHandler(presencePath.path, setPresence);
|
||||
}
|
||||
if(maybeWrapper.tasks) {
|
||||
registerTasks(maybeWrapper.tasks, deps);
|
||||
}
|
||||
})
|
||||
.catch(err => { throw err });
|
||||
interactionHandler(deps, maybeWrapper.defaultPrefix);
|
||||
messageHandler(deps, maybeWrapper.defaultPrefix)
|
||||
}
|
||||
461
src/types/core-modules.ts
Normal file
461
src/types/core-modules.ts
Normal file
@@ -0,0 +1,461 @@
|
||||
import type {
|
||||
APIApplicationCommandBasicOption,
|
||||
APIApplicationCommandOptionBase,
|
||||
ApplicationCommandOptionType,
|
||||
BaseApplicationCommandOptionsData,
|
||||
AutocompleteInteraction,
|
||||
ButtonInteraction,
|
||||
ChannelSelectMenuInteraction,
|
||||
ClientEvents,
|
||||
MentionableSelectMenuInteraction,
|
||||
MessageContextMenuCommandInteraction,
|
||||
ModalSubmitInteraction,
|
||||
RoleSelectMenuInteraction,
|
||||
StringSelectMenuInteraction,
|
||||
UserContextMenuCommandInteraction,
|
||||
UserSelectMenuInteraction,
|
||||
ChatInputCommandInteraction,
|
||||
} from 'discord.js';
|
||||
import type { CommandType, EventType } from '../core/structures/enums';
|
||||
import { Context } from '../core/structures/context'
|
||||
import { ControlPlugin, InitPlugin, Plugin } from './core-plugin';
|
||||
import { Awaitable, SernEventsMapping, UnpackedDependencies, Dictionary } from './utility';
|
||||
|
||||
/**
|
||||
* SDT (State, Dependencies, Type) interface represents the core data structure
|
||||
* passed through the plugin pipeline to command modules.
|
||||
*
|
||||
* @interface SDT
|
||||
* @template TState - Type parameter for the state object's structure
|
||||
* @template TDeps - Type parameter for dependencies interface
|
||||
*
|
||||
* @property {Record<string, unknown>} state - Accumulated state data passed between plugins
|
||||
* @property {TDeps} deps - Instance of application dependencies
|
||||
* @property {CommandType} type - Command type identifier
|
||||
* @property {string} [params] - Optional parameters passed to the command
|
||||
*
|
||||
* @example
|
||||
* // Example of a plugin using SDT
|
||||
* const loggingPlugin = CommandControlPlugin((ctx, sdt: SDT) => {
|
||||
* console.log(`User ${ctx.user.id} executed command`);
|
||||
* return controller.next({ 'logging/timestamp': Date.now() });
|
||||
* });
|
||||
*
|
||||
* @example
|
||||
* // Example of state accumulation through multiple plugins
|
||||
* const plugin1 = CommandControlPlugin((ctx, sdt: SDT) => {
|
||||
* return controller.next({ 'plugin1/data': 'value1' });
|
||||
* });
|
||||
*
|
||||
* const plugin2 = CommandControlPlugin((ctx, sdt: SDT) => {
|
||||
* // Access previous state
|
||||
* const prevData = sdt.state['plugin1/data'];
|
||||
* return controller.next({ 'plugin2/data': 'value2' });
|
||||
* });
|
||||
*
|
||||
* @remarks
|
||||
* - State is immutable and accumulated through the plugin chain
|
||||
* - Keys in state should be namespaced to avoid collisions
|
||||
* - Dependencies are injected and available throughout the pipeline
|
||||
* - Type information helps plugins make type-safe decisions
|
||||
*
|
||||
* @see {@link CommandControlPlugin} for plugin implementation
|
||||
* @see {@link CommandType} for available command types
|
||||
* @see {@link Dependencies} for [dependency injection](https://sern.dev/v4/reference/dependencies/) interface
|
||||
*/
|
||||
export type SDT = {
|
||||
/**
|
||||
* Accumulated state passed between plugins in the pipeline.
|
||||
* Each plugin can add to or modify this state using controller.next().
|
||||
*
|
||||
* @type {Record<string, unknown>}
|
||||
* @example
|
||||
* // Good: Namespaced state key
|
||||
* { 'myPlugin/userData': { id: '123', name: 'User' } }
|
||||
*
|
||||
* // Avoid: Non-namespaced keys that might collide
|
||||
* { userData: { id: '123' } }
|
||||
*/
|
||||
state: Record<string, unknown>;
|
||||
|
||||
/**
|
||||
* Application dependencies available to plugins and command modules.
|
||||
* Typically includes services, configurations, and utilities.
|
||||
*
|
||||
* @type {Dependencies}
|
||||
*/
|
||||
deps: Dependencies;
|
||||
|
||||
/**
|
||||
* Identifies the type of command being processed.
|
||||
* Used by plugins to apply type-specific logic.
|
||||
*
|
||||
* @type {CommandType}
|
||||
*/
|
||||
type: CommandType;
|
||||
|
||||
/**
|
||||
* Optional parameters passed to the command.
|
||||
* May contain additional configuration or runtime data.
|
||||
*
|
||||
* @type {string}
|
||||
* @optional
|
||||
*/
|
||||
params?: string;
|
||||
|
||||
/**
|
||||
* A copy of the current module that the plugin is running in.
|
||||
*/
|
||||
module: { name: string;
|
||||
description: string;
|
||||
meta: Dictionary;
|
||||
locals: Dictionary; }
|
||||
};
|
||||
|
||||
export type Processed<T> = T & { name: string; description: string };
|
||||
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface Module {
|
||||
type: CommandType | EventType;
|
||||
name?: string;
|
||||
onEvent: ControlPlugin[];
|
||||
plugins: InitPlugin[];
|
||||
description?: string;
|
||||
meta: {
|
||||
id: string;
|
||||
absPath: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom data storage object for module-specific information.
|
||||
* Plugins and module code can use this to store and retrieve metadata,
|
||||
* configuration, or any other module-specific information.
|
||||
*
|
||||
* @type {Dictionary}
|
||||
* @description A key-value store that allows plugins and module code to persist
|
||||
* data at the module level. This is especially useful for InitPlugins that need
|
||||
* to attach metadata or configuration to modules.
|
||||
*
|
||||
* @example
|
||||
* // In a plugin
|
||||
* module.locals.registrationDate = Date.now();
|
||||
* module.locals.version = "1.0.0";
|
||||
* module.locals.permissions = ["ADMIN", "MODERATE"];
|
||||
*
|
||||
* @example
|
||||
* // In module execution
|
||||
* console.log(`Command registered on: ${new Date(module.locals.registrationDate)}`);
|
||||
*
|
||||
* @example
|
||||
* // Storing localization data
|
||||
* module.locals.translations = {
|
||||
* en: "Hello",
|
||||
* es: "Hola",
|
||||
* fr: "Bonjour"
|
||||
* };
|
||||
*
|
||||
* @example
|
||||
* // Storing command metadata
|
||||
* module.locals.metadata = {
|
||||
* category: "admin",
|
||||
* cooldown: 5000,
|
||||
* requiresPermissions: true
|
||||
* };
|
||||
*
|
||||
* @remarks
|
||||
* - The locals object is initialized as an empty object ({}) by default
|
||||
* - Keys should be namespaced to avoid collisions between plugins
|
||||
* - Values can be of any type
|
||||
* - Data persists for the lifetime of the module
|
||||
* - Commonly used by InitPlugins during module initialization
|
||||
*
|
||||
* @best-practices
|
||||
* 1. Namespace your keys to avoid conflicts:
|
||||
* ```typescript
|
||||
* module.locals['myPlugin:data'] = value;
|
||||
* ```
|
||||
*
|
||||
* 2. Document the data structure you're storing:
|
||||
* ```typescript
|
||||
* interface MyPluginData {
|
||||
* version: string;
|
||||
* timestamp: number;
|
||||
* }
|
||||
* module.locals['myPlugin:data'] = {
|
||||
* version: '1.0.0',
|
||||
* timestamp: Date.now()
|
||||
* } as MyPluginData;
|
||||
* ```
|
||||
*
|
||||
* 3. Use type-safe accessors when possible:
|
||||
* ```typescript
|
||||
* const getPluginData = (module: Module): MyPluginData =>
|
||||
* module.locals['myPlugin:data'];
|
||||
* ```
|
||||
*/
|
||||
locals: Dictionary;
|
||||
execute(...args: any[]): Awaitable<any>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface SernEventCommand<T extends keyof SernEventsMapping = keyof SernEventsMapping>
|
||||
extends Module {
|
||||
name?: T;
|
||||
type: EventType.Sern;
|
||||
execute(...args: SernEventsMapping[T]): Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ExternalEventCommand extends Module {
|
||||
name?: string;
|
||||
emitter: keyof Dependencies;
|
||||
type: EventType.External;
|
||||
execute(...args: unknown[]): Awaitable<unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ContextMenuUser extends Module {
|
||||
type: CommandType.CtxUser;
|
||||
execute: (ctx: UserContextMenuCommandInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ContextMenuMsg extends Module {
|
||||
type: CommandType.CtxMsg;
|
||||
execute: (ctx: MessageContextMenuCommandInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ButtonCommand extends Module {
|
||||
type: CommandType.Button;
|
||||
execute: (ctx: ButtonInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface StringSelectCommand extends Module {
|
||||
type: CommandType.StringSelect;
|
||||
execute: (ctx: StringSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ChannelSelectCommand extends Module {
|
||||
type: CommandType.ChannelSelect;
|
||||
execute: (ctx: ChannelSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface RoleSelectCommand extends Module {
|
||||
type: CommandType.RoleSelect;
|
||||
execute: (ctx: RoleSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface MentionableSelectCommand extends Module {
|
||||
type: CommandType.MentionableSelect;
|
||||
execute: (ctx: MentionableSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface UserSelectCommand extends Module {
|
||||
type: CommandType.UserSelect;
|
||||
execute: (ctx: UserSelectMenuInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface ModalSubmitCommand extends Module {
|
||||
type: CommandType.Modal;
|
||||
execute: (ctx: ModalSubmitInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface AutocompleteCommand {
|
||||
onEvent?: ControlPlugin[];
|
||||
execute: (ctx: AutocompleteInteraction, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export interface DiscordEventCommand<T extends keyof ClientEvents = keyof ClientEvents>
|
||||
extends Module {
|
||||
name?: T;
|
||||
type: EventType.Discord;
|
||||
execute(...args: ClientEvents[T]): Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @see @link {commandModule} to create a text command
|
||||
*/
|
||||
export interface TextCommand extends Module {
|
||||
type: CommandType.Text;
|
||||
execute: (ctx: Context & { get options(): string[] }, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @see @link {commandModule} to create a slash command
|
||||
*/
|
||||
export interface SlashCommand extends Module {
|
||||
type: CommandType.Slash;
|
||||
description: string;
|
||||
options?: SernOptionsData[];
|
||||
execute: (ctx: Context & { get options(): ChatInputCommandInteraction['options']}, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
* @see @link {commandModule} to create a both command
|
||||
*/
|
||||
export interface BothCommand extends Module {
|
||||
type: CommandType.Both;
|
||||
description: string;
|
||||
options?: SernOptionsData[];
|
||||
execute: (ctx: Context, tbd: SDT) => Awaitable<unknown>;
|
||||
}
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export type EventModule = DiscordEventCommand | SernEventCommand | ExternalEventCommand;
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
export type CommandModule =
|
||||
| TextCommand
|
||||
| SlashCommand
|
||||
| BothCommand
|
||||
| ContextMenuUser
|
||||
| ContextMenuMsg
|
||||
| ButtonCommand
|
||||
| StringSelectCommand
|
||||
| MentionableSelectCommand
|
||||
| UserSelectCommand
|
||||
| ChannelSelectCommand
|
||||
| RoleSelectCommand
|
||||
| ModalSubmitCommand;
|
||||
|
||||
//https://stackoverflow.com/questions/64092736/alternative-to-switch-statement-for-typescript-discriminated-union
|
||||
// Explicit Module Definitions for mapping
|
||||
export interface CommandModuleDefs {
|
||||
[CommandType.Text]: TextCommand;
|
||||
[CommandType.Slash]: SlashCommand;
|
||||
[CommandType.Both]: BothCommand;
|
||||
[CommandType.CtxMsg]: ContextMenuMsg;
|
||||
[CommandType.CtxUser]: ContextMenuUser;
|
||||
[CommandType.Button]: ButtonCommand;
|
||||
[CommandType.StringSelect]: StringSelectCommand;
|
||||
[CommandType.RoleSelect]: RoleSelectCommand;
|
||||
[CommandType.ChannelSelect]: ChannelSelectCommand;
|
||||
[CommandType.MentionableSelect]: MentionableSelectCommand;
|
||||
[CommandType.UserSelect]: UserSelectCommand;
|
||||
[CommandType.Modal]: ModalSubmitCommand;
|
||||
}
|
||||
|
||||
export interface EventModuleDefs<T extends keyof ClientEvents = keyof ClientEvents> {
|
||||
[EventType.Sern]: SernEventCommand;
|
||||
[EventType.Discord]: DiscordEventCommand<T>;
|
||||
[EventType.External]: ExternalEventCommand;
|
||||
}
|
||||
|
||||
export interface SernAutocompleteData
|
||||
extends Omit<BaseApplicationCommandOptionsData, 'autocomplete'> {
|
||||
autocomplete: true;
|
||||
type:
|
||||
| ApplicationCommandOptionType.String
|
||||
| ApplicationCommandOptionType.Number
|
||||
| ApplicationCommandOptionType.Integer;
|
||||
command: AutocompleteCommand;
|
||||
}
|
||||
|
||||
type CommandModuleNoPlugins = {
|
||||
[T in CommandType]: Omit<CommandModuleDefs[T], 'plugins' | 'onEvent' | 'meta' | 'locals'>;
|
||||
};
|
||||
type EventModulesNoPlugins<K extends keyof ClientEvents = keyof ClientEvents> = {
|
||||
[T in EventType]: Omit<EventModuleDefs<K>[T], 'plugins' | 'onEvent' | 'meta' | 'locals'> ;
|
||||
};
|
||||
|
||||
export type InputEvent<K extends keyof ClientEvents = keyof ClientEvents> = {
|
||||
[T in EventType]: EventModulesNoPlugins<K>[T] & {
|
||||
once?: boolean;
|
||||
plugins?: InitPlugin[]
|
||||
};
|
||||
}[EventType];
|
||||
|
||||
export type InputCommand = {
|
||||
[T in CommandType]: CommandModuleNoPlugins[T] & {
|
||||
plugins?: Plugin[];
|
||||
};
|
||||
}[CommandType];
|
||||
|
||||
/**
|
||||
* @see @link {https://sern.dev/v4/reference/autocomplete/}
|
||||
* Type that replaces autocomplete with {@link SernAutocompleteData}
|
||||
*/
|
||||
export type SernOptionsData =
|
||||
| SernSubCommandData
|
||||
| SernSubCommandGroupData
|
||||
| APIApplicationCommandBasicOption
|
||||
| SernAutocompleteData;
|
||||
|
||||
export interface SernSubCommandData
|
||||
extends APIApplicationCommandOptionBase<ApplicationCommandOptionType.Subcommand> {
|
||||
type: ApplicationCommandOptionType.Subcommand;
|
||||
options?: SernOptionsData[];
|
||||
}
|
||||
|
||||
export interface SernSubCommandGroupData extends BaseApplicationCommandOptionsData {
|
||||
type: ApplicationCommandOptionType.SubcommandGroup;
|
||||
options?: SernSubCommandData[];
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.0.0
|
||||
*/
|
||||
export interface ScheduledTaskContext {
|
||||
|
||||
/**
|
||||
* the uuid of the current task being run
|
||||
*/
|
||||
id: string;
|
||||
/**
|
||||
* the last time this task was executed. If this is the first time, it is null.
|
||||
*/
|
||||
lastTimeExecution: Date | null;
|
||||
/**
|
||||
* The next time this task will be executed.
|
||||
*/
|
||||
nextTimeExecution: Date | null;
|
||||
}
|
||||
|
||||
//name subject to change
|
||||
interface TaskAttrs {
|
||||
/**
|
||||
* An object of dependencies configured in `makeDependencies`
|
||||
*/
|
||||
deps: UnpackedDependencies
|
||||
}
|
||||
/**
|
||||
* @since 4.0.0
|
||||
*/
|
||||
export interface ScheduledTask {
|
||||
name?: string;
|
||||
trigger: string | Date;
|
||||
timezone?: string;
|
||||
execute(tasks: ScheduledTaskContext, sdt: TaskAttrs): Awaitable<void>
|
||||
}
|
||||
|
||||
|
||||
72
src/types/core-plugin.ts
Normal file
72
src/types/core-plugin.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Plugins can be inserted on all commands and are emitted
|
||||
*
|
||||
* 1. On ready event, where all commands are loaded.
|
||||
* 2. On corresponding observable (when command triggers)
|
||||
*
|
||||
* The goal of plugins is to organize commands and
|
||||
* provide extensions to repetitive patterns
|
||||
* examples include refreshing modules,
|
||||
* categorizing commands, cool-downs, permissions, etc.
|
||||
* Plugins are reminiscent of middleware in express.
|
||||
*/
|
||||
|
||||
import type {
|
||||
Module,
|
||||
Processed,
|
||||
SDT,
|
||||
} from './core-modules';
|
||||
import type { Awaitable } from './utility';
|
||||
import type { CommandType, PluginType } from '../core/structures/enums'
|
||||
import type { Context } from '../core/structures/context'
|
||||
import type {
|
||||
ButtonInteraction,
|
||||
ChannelSelectMenuInteraction,
|
||||
ChatInputCommandInteraction,
|
||||
MentionableSelectMenuInteraction,
|
||||
MessageContextMenuCommandInteraction,
|
||||
ModalSubmitInteraction,
|
||||
RoleSelectMenuInteraction,
|
||||
StringSelectMenuInteraction,
|
||||
UserContextMenuCommandInteraction,
|
||||
UserSelectMenuInteraction,
|
||||
} from 'discord.js';
|
||||
import { Result } from '../core/structures/result';
|
||||
|
||||
export type PluginResult = Awaitable<Result<Record<string,unknown>|undefined, string|undefined>>;
|
||||
export interface InitArgs<T extends Processed<Module> = Processed<Module>> {
|
||||
module: T;
|
||||
absPath: string;
|
||||
deps: Dependencies
|
||||
}
|
||||
export interface Plugin<Args extends any[] = any[]> {
|
||||
type: PluginType;
|
||||
execute: (...args: Args) => PluginResult;
|
||||
}
|
||||
|
||||
export interface InitPlugin<Args extends any[] = any[]> extends Plugin<Args> {
|
||||
type: PluginType.Init;
|
||||
execute: (...args: Args) => PluginResult;
|
||||
}
|
||||
export interface ControlPlugin<Args extends any[] = any[]> extends Plugin<Args> {
|
||||
type: PluginType.Control;
|
||||
}
|
||||
|
||||
export type AnyPlugin = ControlPlugin | InitPlugin<[InitArgs<Processed<Module>>]>;
|
||||
|
||||
export type CommandArgs<I extends CommandType = CommandType> = CommandArgsMatrix[I]
|
||||
|
||||
interface CommandArgsMatrix {
|
||||
[CommandType.Text]: [Context & { get options(): string[]}, SDT];
|
||||
[CommandType.Slash]: [Context & { get options(): ChatInputCommandInteraction['options']}, SDT];
|
||||
[CommandType.Both]: [Context, SDT];
|
||||
[CommandType.CtxMsg]: [MessageContextMenuCommandInteraction, SDT];
|
||||
[CommandType.CtxUser]: [UserContextMenuCommandInteraction, SDT];
|
||||
[CommandType.Button]: [ButtonInteraction, SDT];
|
||||
[CommandType.StringSelect]: [StringSelectMenuInteraction, SDT];
|
||||
[CommandType.RoleSelect]: [RoleSelectMenuInteraction, SDT];
|
||||
[CommandType.ChannelSelect]: [ChannelSelectMenuInteraction, SDT];
|
||||
[CommandType.MentionableSelect]: [MentionableSelectMenuInteraction, SDT];
|
||||
[CommandType.UserSelect]: [UserSelectMenuInteraction, SDT];
|
||||
[CommandType.Modal]: [ModalSubmitInteraction, SDT];
|
||||
}
|
||||
27
src/types/dependencies.d.ts
vendored
Normal file
27
src/types/dependencies.d.ts
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
// This file serves an the interface for developers to augment the Dependencies interface
|
||||
// Developers will have to create a new file dependencies.d.ts in the root directory, augmenting
|
||||
// this type
|
||||
|
||||
/* eslint-disable @typescript-eslint/consistent-type-imports */
|
||||
|
||||
import { CoreDependencies } from '../core/ioc';
|
||||
|
||||
declare global {
|
||||
/**
|
||||
* discord.js client.
|
||||
* '@sern/client': Client
|
||||
* sern emitter listens to events that happen throughout
|
||||
* the handler. some include module.register, module.activate.
|
||||
* '@sern/emitter': Contracts.Emitter;
|
||||
* An error handler which is the final step before
|
||||
* the sern process actually crashes.
|
||||
'@sern/errors': Contracts.ErrorHandling;
|
||||
* Optional logger. Performs ... logging
|
||||
* '@sern/logger'?: Contracts.Logging;
|
||||
* Readonly module store. sern stores these
|
||||
* by module.meta.id -> Module
|
||||
* '@sern/modules': Map<string, Module>;
|
||||
*/
|
||||
interface Dependencies extends CoreDependencies {}
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
import type { Awaitable, ClientEvents, CommandInteractionOptionResolver } from 'discord.js';
|
||||
import type { EventEmitter } from 'events';
|
||||
export type Nullish<T> = T | undefined | null;
|
||||
|
||||
// Thanks to @kelsny
|
||||
export type ParseType<T> = {
|
||||
[K in keyof T]: T[K] extends unknown ? [k: K, args: T[K]] : never;
|
||||
}[keyof T];
|
||||
|
||||
export type Args = ParseType<{ text: string[]; slash: SlashOptions }>;
|
||||
|
||||
export type DiscordEvent = ParseType<{
|
||||
[K in keyof ClientEvents]: (...args: ClientEvents[K]) => Awaitable<void>;
|
||||
}>;
|
||||
export type EventEmitterRegister = [
|
||||
emitter: EventEmitter,
|
||||
k: string,
|
||||
cb: (...args: unknown[]) => Awaitable<void>,
|
||||
];
|
||||
|
||||
export type SlashOptions = Omit<CommandInteractionOptionResolver, 'getMessage' | 'getFocused'>;
|
||||
|
||||
// Source: https://dev.to/vborodulin/ts-how-to-override-properties-with-type-intersection-554l
|
||||
export type Override<T1, T2> = Omit<T1, keyof T2> & T2;
|
||||
|
||||
export type DefinitelyDefined<T, K> = T & Override<T, K>;
|
||||
|
||||
type Reconstruct<T> = T extends Omit<infer O, infer _> ? O & Reconstruct<O> : T;
|
||||
|
||||
type IsOptional<T> = {
|
||||
[K in keyof T]-?: T[K] extends Required<T>[K] ? false : true;
|
||||
};
|
||||
|
||||
export type UnionToIntersection<T> = (T extends unknown ? (x: T) => unknown : never) extends (
|
||||
x: infer R,
|
||||
) => unknown
|
||||
? R
|
||||
: never;
|
||||
90
src/types/utility.ts
Normal file
90
src/types/utility.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import type { InteractionReplyOptions, MessageReplyOptions } from 'discord.js';
|
||||
import type { Module } from './core-modules';
|
||||
|
||||
export type Awaitable<T> = PromiseLike<T> | T;
|
||||
export type Dictionary = Record<string, unknown>
|
||||
|
||||
export type AnyFunction = (...args: any[]) => unknown;
|
||||
|
||||
export interface SernEventsMapping {
|
||||
'module.register': [Payload];
|
||||
'module.activate': [Payload];
|
||||
error: [{ type: 'failure'; module?: Module; reason: string | Error }];
|
||||
warning: [Payload];
|
||||
modulesLoaded: [never?];
|
||||
}
|
||||
|
||||
export type Payload =
|
||||
| { type: 'success'; module: Module }
|
||||
| { type: 'failure'; module?: Module; reason: string | Error }
|
||||
| { type: 'warning'; module: undefined; reason: string };
|
||||
|
||||
export type UnpackFunction<T> = T extends (...args: any) => infer U ? U : T
|
||||
export type UnpackedDependencies = {
|
||||
[K in keyof Dependencies]: UnpackFunction<Dependencies[K]>
|
||||
}
|
||||
export type ReplyOptions = string | Omit<InteractionReplyOptions, 'fetchReply'> | MessageReplyOptions;
|
||||
|
||||
|
||||
/**
|
||||
* @interface Wrapper
|
||||
* @description Configuration interface for the sern framework. This interface defines
|
||||
* the structure for configuring essential framework features including command handling,
|
||||
* event management, and task scheduling.
|
||||
*/
|
||||
export interface Wrapper {
|
||||
/**
|
||||
* @property {string|string[]} commands
|
||||
* @description Specifies the directory path where command modules are located.
|
||||
* This is a required property that tells sern where to find and load command files.
|
||||
* The path should be relative to the project root. If given an array, each directory is loaded in order
|
||||
* they were declared. Order of modules in each directory is not guaranteed
|
||||
*
|
||||
* @example
|
||||
* commands: ["./dist/commands"]
|
||||
*/
|
||||
commands: string | string[];
|
||||
/**
|
||||
* @property {boolean} [handleModuleErrors]
|
||||
* @description Optional flag to enable automatic error handling for modules.
|
||||
* When enabled, sern will automatically catch and handle errors that occur
|
||||
* during module execution, preventing crashes and providing error logging.
|
||||
*
|
||||
* @default false
|
||||
*/
|
||||
handleModuleErrors?: boolean;
|
||||
/**
|
||||
* @property {string} [defaultPrefix]
|
||||
* @description Optional prefix for text commands. This prefix will be used
|
||||
* to identify text commands in messages. If not specified, text commands {@link CommandType.Text}
|
||||
* will be disabled.
|
||||
*
|
||||
* @example
|
||||
* defaultPrefix: "?"
|
||||
*/
|
||||
defaultPrefix?: string;
|
||||
/**
|
||||
* @property {string|string[]} [events]
|
||||
* @description Optional directory path where event modules are located.
|
||||
* If provided, Sern will automatically register and handle events from
|
||||
* modules in this directory. The path should be relative to the project root.
|
||||
* If given an array, each directory is loaded in order they were declared.
|
||||
* Order of modules in each directory is not guaranteed.
|
||||
*
|
||||
* @example
|
||||
* events: ["./dist/events"]
|
||||
*/
|
||||
events?: string | string[];
|
||||
/**
|
||||
* @property {string|string[]} [tasks]
|
||||
* @description Optional directory path where scheduled task modules are located.
|
||||
* If provided, Sern will automatically register and handle scheduled tasks
|
||||
* from modules in this directory. The path should be relative to the project root.
|
||||
* If given an array, each directory is loaded in order they were declared.
|
||||
* Order of modules in each directory is not guaranteed.
|
||||
*
|
||||
* @example
|
||||
* tasks: ["./dist/tasks"]
|
||||
*/
|
||||
tasks?: string | string[];
|
||||
}
|
||||
84
test/autocomp.bench.ts
Normal file
84
test/autocomp.bench.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { describe } from 'node:test'
|
||||
import { bench } from 'vitest'
|
||||
import { SernAutocompleteData, SernOptionsData } from '../src'
|
||||
import { createRandomChoice } from './setup/util'
|
||||
import { ApplicationCommandOptionType, AutocompleteFocusedOption, AutocompleteInteraction } from 'discord.js'
|
||||
import { createLookupTable } from '../src/core/functions'
|
||||
import assert from 'node:assert'
|
||||
|
||||
/**
|
||||
* Uses an iterative DFS to check if an autocomplete node exists on the option tree
|
||||
* This is the old internal method that sern used to resolve autocomplete
|
||||
* @param iAutocomplete
|
||||
* @param options
|
||||
*/
|
||||
function treeSearch(
|
||||
choice: AutocompleteFocusedOption,
|
||||
parent: string|undefined,
|
||||
options: SernOptionsData[] | undefined,
|
||||
): SernAutocompleteData & { parent?: string } | undefined {
|
||||
if (options === undefined) return undefined;
|
||||
//clone to prevent mutation of original command module
|
||||
const _options = options.map(a => ({ ...a }));
|
||||
const subcommands = new Set();
|
||||
while (_options.length > 0) {
|
||||
const cur = _options.pop()!;
|
||||
switch (cur.type) {
|
||||
case ApplicationCommandOptionType.Subcommand: {
|
||||
subcommands.add(cur.name);
|
||||
for (const option of cur.options ?? []) _options.push(option);
|
||||
} break;
|
||||
case ApplicationCommandOptionType.SubcommandGroup: {
|
||||
for (const command of cur.options ?? []) _options.push(command);
|
||||
} break;
|
||||
default: {
|
||||
if ('autocomplete' in cur && cur.autocomplete) {
|
||||
assert( 'command' in cur, 'No `command` property found for option ' + cur.name);
|
||||
if (subcommands.size > 0) {
|
||||
const parentAndOptionMatches =
|
||||
subcommands.has(parent) && cur.name === choice.name;
|
||||
if (parentAndOptionMatches) {
|
||||
return { ...cur, parent };
|
||||
}
|
||||
} else {
|
||||
if (cur.name === choice.name) {
|
||||
return { ...cur, parent: undefined };
|
||||
}
|
||||
}
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const options: SernOptionsData[] = [
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'autocomplete',
|
||||
description: 'here',
|
||||
autocomplete: true,
|
||||
command: { onEvent: [], execute: () => {} },
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
const table = createLookupTable(options)
|
||||
|
||||
|
||||
describe('autocomplete lookup', () => {
|
||||
|
||||
bench('lookup table', () => {
|
||||
table.get('<parent>/autocomplete')
|
||||
}, { time: 500 })
|
||||
|
||||
|
||||
bench('naive treeSearch', () => {
|
||||
treeSearch({ focused: true,
|
||||
name: 'autocomplete',
|
||||
value: 'autocomplete',
|
||||
type: ApplicationCommandOptionType.String }, undefined, options)
|
||||
}, { time: 500 })
|
||||
})
|
||||
85
test/core/context.test.ts
Normal file
85
test/core/context.test.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
import { describe, vi, it, expect } from'vitest'
|
||||
import { Context } from '../../src';
|
||||
import { faker } from '@faker-js/faker'
|
||||
describe('Context', () => {
|
||||
// Mocked message and interaction objects for testing
|
||||
const mockMessage = {
|
||||
id: 'messageId',
|
||||
channel: 'channelId',
|
||||
channelId: 'channelId',
|
||||
interaction: {
|
||||
id: faker.string.uuid()
|
||||
},
|
||||
author: { id: 'userId' },
|
||||
createdTimestamp: 1234567890,
|
||||
guild: 'guildId',
|
||||
guildId: 'guildId',
|
||||
member: { id: 'memberId' },
|
||||
client: { id: 'clientId' },
|
||||
inGuild: vi.fn().mockReturnValue(true),
|
||||
reply: vi.fn(),
|
||||
};
|
||||
|
||||
const mockInteraction = {
|
||||
id: 'interactionId',
|
||||
user: { id: 'userId' },
|
||||
channel: 'channelId',
|
||||
channelId: 'channelId',
|
||||
createdTimestamp: 1234567890,
|
||||
guild: 'guildId',
|
||||
guildId: 'guildId',
|
||||
fetchReply: vi.fn().mockResolvedValue({}),
|
||||
member: { id: 'memberId' },
|
||||
client: { id: 'clientId' },
|
||||
isChatInputCommand: vi.fn().mockResolvedValue(true),
|
||||
inGuild: vi.fn().mockReturnValue(true),
|
||||
reply: vi.fn().mockResolvedValue({}),
|
||||
};
|
||||
|
||||
it('should create a context from a message', () => {
|
||||
//@ts-ignore
|
||||
const context = Context.wrap(mockMessage);
|
||||
expect(context).toBeDefined();
|
||||
expect(context.id).toBe('messageId');
|
||||
});
|
||||
it('should throw error if accessing interaction as message', () => {
|
||||
//@ts-ignore
|
||||
const context = Context.wrap(mockMessage);
|
||||
expect(context).toBeDefined();
|
||||
expect(() => context.interaction)
|
||||
.toThrowError('You cannot use message when an interaction fired or vice versa');
|
||||
|
||||
})
|
||||
it('should throw error if accessing message as interaction', () => {
|
||||
//@ts-ignore
|
||||
const context = Context.wrap(mockInteraction);
|
||||
expect(context).toBeDefined();
|
||||
expect(() => context.message)
|
||||
.toThrowError('You cannot use message when an interaction fired or vice versa');
|
||||
|
||||
})
|
||||
|
||||
it('should create a context from an interaction', () => {
|
||||
//@ts-ignore
|
||||
const context = Context.wrap(mockInteraction);
|
||||
expect(context).toBeDefined();
|
||||
expect(context.id).toBe('interactionId');
|
||||
});
|
||||
|
||||
it('should reply to a context with a message', async () => {
|
||||
//@ts-ignore
|
||||
const context = Context.wrap(mockMessage);
|
||||
const replyOptions = { content: 'Hello, world!' };
|
||||
await context.reply(replyOptions);
|
||||
expect(mockMessage.reply).toHaveBeenCalledWith(replyOptions);
|
||||
});
|
||||
|
||||
it('should reply to a context with an interaction', async () => {
|
||||
//@ts-ignore
|
||||
const context = Context.wrap(mockInteraction);
|
||||
const replyOptions = { content: 'Hello, world!' };
|
||||
await context.reply(replyOptions);
|
||||
expect(mockInteraction.reply).toHaveBeenCalledWith(replyOptions);
|
||||
});
|
||||
|
||||
});
|
||||
11
test/core/contracts.test.ts
Normal file
11
test/core/contracts.test.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { assertType, describe, it } from 'vitest';
|
||||
|
||||
import * as __Services from '../../src/core/structures/default-services';
|
||||
import * as Contracts from '../../src/core/interfaces';
|
||||
|
||||
describe('default contracts', () => {
|
||||
it('should satisfy contracts', () => {
|
||||
assertType<Contracts.Logging>(new __Services.DefaultLogging());
|
||||
assertType<Contracts.ErrorHandling>(new __Services.DefaultErrorHandling());
|
||||
});
|
||||
});
|
||||
27
test/core/create-plugin.test.ts
Normal file
27
test/core/create-plugin.test.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import {
|
||||
CommandControlPlugin,
|
||||
CommandInitPlugin,
|
||||
EventInitPlugin,
|
||||
} from '../../src';
|
||||
import { PluginType, controller } from '../../src';
|
||||
|
||||
describe('create-plugins', () => {
|
||||
it('should make proper control plugins', () => {
|
||||
const pl2 = CommandControlPlugin(() => controller.next());
|
||||
expect(pl2).to.have.all.keys(['type', 'execute']);
|
||||
expect(pl2.type).toBe(PluginType.Control);
|
||||
expect(pl2.execute).an('function');
|
||||
});
|
||||
it('should make proper init plugins', () => {
|
||||
const pl = EventInitPlugin(() => controller.next());
|
||||
expect(pl).to.have.all.keys(['type', 'execute']);
|
||||
expect(pl.type).toBe(PluginType.Init);
|
||||
expect(pl.execute).an('function');
|
||||
|
||||
const pl2 = CommandInitPlugin(() => controller.next());
|
||||
expect(pl2).to.have.all.keys(['type', 'execute']);
|
||||
expect(pl2.type).toBe(PluginType.Init);
|
||||
expect(pl2.execute).an('function');
|
||||
});
|
||||
});
|
||||
294
test/core/functions.test.ts
Normal file
294
test/core/functions.test.ts
Normal file
@@ -0,0 +1,294 @@
|
||||
//@ts-nocheck
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
import { PluginType, SernOptionsData, controller } from '../../src/index';
|
||||
import { createLookupTable, partitionPlugins, treeSearch } from '../../src/core/functions';
|
||||
import { faker } from '@faker-js/faker';
|
||||
import { ApplicationCommandOptionType, AutocompleteInteraction } from 'discord.js';
|
||||
import { createRandomChoice, createRandomPlugins } from '../setup/util';
|
||||
|
||||
describe('functions', () => {
|
||||
afterEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
|
||||
it('should partition plugins correctly', () => {
|
||||
const plugins = createRandomPlugins(100);
|
||||
const [onEvent, init] = partitionPlugins(plugins);
|
||||
for (const el of onEvent) expect(el.type).to.equal(PluginType.Control);
|
||||
|
||||
for (const el of init) expect(el.type).to.equal(PluginType.Init);
|
||||
});
|
||||
|
||||
describe('autocomplete', ( ) => {
|
||||
|
||||
it('should tree search options tree depth 1', () => {
|
||||
const options: SernOptionsData[] = [
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'autocomplete',
|
||||
description: 'here',
|
||||
autocomplete: true,
|
||||
command: { onEvent: [], execute: vi.fn() },
|
||||
},
|
||||
];
|
||||
const table = createLookupTable(options)
|
||||
const result = table.get('<parent>/autocomplete')
|
||||
expect(result == undefined).to.be.false;
|
||||
expect(result.name).to.be.eq('autocomplete');
|
||||
expect(result.command).to.be.not.undefined;
|
||||
}),
|
||||
it('should tree search depth 2', () => {
|
||||
const subcommandName = faker.string.alpha();
|
||||
const options: SernOptionsData[] = [
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'nested',
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: () => {},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
const table = createLookupTable(options)
|
||||
const result = table.get(`<parent>/${subcommandName}/nested`)
|
||||
expect(result == undefined).to.be.false;
|
||||
expect(result.name).to.be.eq('nested');
|
||||
expect(result.command).to.be.not.undefined;
|
||||
});
|
||||
|
||||
it('should tree search depth n > 2', () => {
|
||||
const subgroupName = faker.string.alpha()
|
||||
const subcommandName = faker.string.alpha();
|
||||
const options: SernOptionsData[] = [
|
||||
{
|
||||
type: ApplicationCommandOptionType.SubcommandGroup,
|
||||
name: subgroupName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'nested',
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: () => {},
|
||||
},
|
||||
},
|
||||
createRandomChoice(),
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
const table = createLookupTable(options)
|
||||
const result = table.get(`<parent>/${subgroupName}/${subcommandName}/nested`)
|
||||
expect(result == undefined).to.be.false;
|
||||
expect(result.name).to.be.eq('nested');
|
||||
expect(result.command).to.be.not.undefined;
|
||||
});
|
||||
|
||||
it('should correctly resolve suboption of the same name given two subcommands ', () => {
|
||||
const subcommandName = faker.string.alpha();
|
||||
const groupname = faker.string.alpha()
|
||||
const options: SernOptionsData[] = [
|
||||
{
|
||||
type: ApplicationCommandOptionType.SubcommandGroup,
|
||||
name: groupname,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'nested',
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: () => {},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName + 'a',
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'nested',
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: () => {},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
const table = createLookupTable(options)
|
||||
const result = table.get(`<parent>/${groupname}/${subcommandName}/nested`);
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.name).to.be.eq('nested');
|
||||
expect(result.command).to.be.not.undefined;
|
||||
});
|
||||
it('two subcommands with an option of the same name', () => {
|
||||
const groupName = faker.string.alpha()
|
||||
const subcommandName = faker.string.alpha();
|
||||
const options: SernOptionsData[] = [
|
||||
{
|
||||
type: ApplicationCommandOptionType.SubcommandGroup,
|
||||
name: groupName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'nested',
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: () => {},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName + 'anothera',
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: 'nested',
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: () => {},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const table = createLookupTable(options)
|
||||
const result = table.get(`<parent>/${groupName}/${subcommandName}/nested`);
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.name).to.be.eq('nested');
|
||||
expect(result.command).to.be.not.undefined;
|
||||
|
||||
|
||||
});
|
||||
|
||||
it('simulates autocomplete typing and resolution', () => {
|
||||
const subcommandGroupName = faker.string.alpha()
|
||||
const subcommandName = faker.string.alpha();
|
||||
const optionName = faker.word.noun();
|
||||
const options: SernOptionsData[] = [
|
||||
{
|
||||
type: ApplicationCommandOptionType.SubcommandGroup,
|
||||
name: subcommandGroupName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName,
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: optionName,
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: vi.fn(),
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: ApplicationCommandOptionType.Subcommand,
|
||||
name: subcommandName + 'a',
|
||||
description: faker.string.alpha(),
|
||||
options: [
|
||||
createRandomChoice(),
|
||||
{
|
||||
type: ApplicationCommandOptionType.String,
|
||||
name: optionName,
|
||||
description: faker.string.alpha(),
|
||||
autocomplete: true,
|
||||
command: {
|
||||
onEvent: [],
|
||||
execute: vi.fn(),
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
let accumulator = '';
|
||||
let result: unknown;
|
||||
const table = createLookupTable(options)
|
||||
for (const char of optionName) {
|
||||
accumulator += char;
|
||||
|
||||
const focusedValue = {
|
||||
name: accumulator,
|
||||
value: faker.string.alpha(),
|
||||
focused: true,
|
||||
};
|
||||
result = table.get(`<parent>/${subcommandGroupName}/${subcommandName}/${focusedValue.name}` );
|
||||
}
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
94
test/core/id.test.ts
Normal file
94
test/core/id.test.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
//@ts-nocheck
|
||||
import { expect, test, vi } from 'vitest'
|
||||
import { CommandType } from '../../src/core/structures/enums';
|
||||
|
||||
import * as Id from '../../src/core/id'
|
||||
import { ButtonInteraction, ModalSubmitInteraction } from 'discord.js';
|
||||
|
||||
test('id -> Text', () => {
|
||||
expect(Id.create("ping", CommandType.Text)).toBe("ping_T")
|
||||
})
|
||||
|
||||
test('id -> Both', () => {
|
||||
expect(Id.create("ping", CommandType.Both)).toBe("ping_B")
|
||||
})
|
||||
|
||||
test('id -> CtxMsg', () => {
|
||||
expect(Id.create("ping", CommandType.CtxMsg)).toBe("ping_A3")
|
||||
})
|
||||
test('id -> CtxUsr', () => {
|
||||
expect(Id.create("ping", CommandType.CtxUser)).toBe("ping_A2")
|
||||
})
|
||||
test('id -> Modal', () => {
|
||||
expect(Id.create("my-modal", CommandType.Modal)).toBe("my-modal_M");
|
||||
})
|
||||
|
||||
test('id -> Button', () => {
|
||||
expect(Id.create("my-button", CommandType.Button)).toBe("my-button_C2");
|
||||
})
|
||||
|
||||
test('id -> Slash', () => {
|
||||
expect(Id.create("myslash", CommandType.Slash)).toBe("myslash_A1");
|
||||
})
|
||||
|
||||
test('id -> StringSelect', () => {
|
||||
expect(Id.create("mystringselect", CommandType.StringSelect)).toBe("mystringselect_C3");
|
||||
})
|
||||
|
||||
test('id -> UserSelect', () => {
|
||||
expect(Id.create("myuserselect", CommandType.UserSelect)).toBe("myuserselect_C5");
|
||||
})
|
||||
|
||||
test('id -> RoleSelect', () => {
|
||||
expect(Id.create("myroleselect", CommandType.RoleSelect)).toBe("myroleselect_C6");
|
||||
})
|
||||
|
||||
test('id -> MentionSelect', () => {
|
||||
expect(Id.create("mymentionselect", CommandType.MentionableSelect)).toBe("mymentionselect_C7");
|
||||
})
|
||||
|
||||
test('id -> ChannelSelect', () => {
|
||||
const modal = Id.create("mychannelselect", CommandType.ChannelSelect)
|
||||
expect(modal).toBe("mychannelselect_C8");
|
||||
})
|
||||
|
||||
test('id reconstruct button', () => {
|
||||
const idload = Id.reconstruct(new ButtonInteraction("btn"))
|
||||
expect(idload[0].id).toBe("btn_C2")
|
||||
})
|
||||
|
||||
test('id reconstruct button with params', () => {
|
||||
const idload = Id.reconstruct(new ButtonInteraction("btn/asdf"))
|
||||
expect(idload[0].id).toBe("btn_C2")
|
||||
expect(idload[0].params).toBe("asdf")
|
||||
})
|
||||
test('id reconstruct modal with params', () => {
|
||||
const idload = Id.reconstruct(new ModalSubmitInteraction("btn/asdf"))
|
||||
expect(idload[0].id).toBe("btn_M")
|
||||
expect(idload[0].params).toBe("asdf")
|
||||
})
|
||||
test('id reconstruct modal', () => {
|
||||
const idload = Id.reconstruct(new ModalSubmitInteraction("btn"))
|
||||
expect(idload[0].id).toBe("btn_M")
|
||||
expect(idload[0].params).toBe(undefined)
|
||||
})
|
||||
test('id reconstruct button with empty params', () => {
|
||||
const idload = Id.reconstruct(new ButtonInteraction("btn/"))
|
||||
expect(idload[0].id).toBe("btn_C2")
|
||||
expect(idload[0].params).toBe("")
|
||||
})
|
||||
test('id reconstruct with multiple slashes', () => {
|
||||
const idload = Id.reconstruct(new ButtonInteraction("btn//"))
|
||||
expect(idload[0].id).toBe("btn_C2")
|
||||
expect(idload[0].params).toBe("/")
|
||||
})
|
||||
|
||||
|
||||
test('id reconstruct button', () => {
|
||||
const idload = Id.reconstruct(new ButtonInteraction("btn"))
|
||||
expect(idload[0].id).toBe("btn_C2")
|
||||
expect(idload[0].params).toBe(undefined)
|
||||
})
|
||||
|
||||
|
||||
|
||||
64
test/core/module-loading.test.ts
Normal file
64
test/core/module-loading.test.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import path from 'node:path'
|
||||
import * as Files from '../../src/core/module-loading'
|
||||
import { Module } from '../../src/types/core-modules'
|
||||
import { AssertionError } from 'node:assert'
|
||||
//TODO: mock fs?
|
||||
describe('module-loading', () => {
|
||||
it('should get the filename of the commandmodule (linux, esm)', () => {
|
||||
const fname = "///home/pooba/Projects/sern/halibu/dist/commands/ping.js"
|
||||
const callsiteinfo = Files.parseCallsite(fname)
|
||||
expect(callsiteinfo.name).toBe("ping")
|
||||
})
|
||||
it('should get filename of commandmodule (linux, cjs)', () => {
|
||||
const fname = "file:///home/pooba/Projects/sern/halibu/dist/commands/ping.js"
|
||||
const callsiteinfo = Files.parseCallsite(fname)
|
||||
expect(callsiteinfo.name).toBe("ping")
|
||||
|
||||
})
|
||||
it('should get the filename of the commandmodule (windows, cjs)', () => {
|
||||
//this test case is impossible on linux.
|
||||
if(process.platform == 'win32') {
|
||||
const fname = "C:\\pooba\\Projects\\sern\\halibu\\dist\\commands\\ping.js"
|
||||
const callsiteinfo = Files.parseCallsite(fname)
|
||||
expect(callsiteinfo.name).toEqual("ping");
|
||||
}
|
||||
})
|
||||
it('should get filename of commandmodule (windows, esm)', () => {
|
||||
//this test case is impossible on linux.
|
||||
if(process.platform == 'win32') {
|
||||
const fname = "file:///C:\\pooba\\Projects\\sern\\halibu\\dist\\commands\\ping.js"
|
||||
const callsiteinfo = Files.parseCallsite(fname)
|
||||
expect(callsiteinfo.name).toEqual("ping");
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
it('should import a commandModule properly', async () => {
|
||||
const { module } = await Files.importModule<Module>(path.resolve("test", 'mockules', "module.ts"));
|
||||
expect(module.name).toBe('module')
|
||||
})
|
||||
it('should throw when failed commandModule import', async () => {
|
||||
try {
|
||||
await Files.importModule(path.resolve('test', 'mockules', 'failed.ts'))
|
||||
} catch(e) {
|
||||
expect(e instanceof AssertionError)
|
||||
}
|
||||
})
|
||||
it('should throw when failed commandModule import', async () => {
|
||||
try {
|
||||
await Files.importModule(path.resolve('test', 'mockules', 'failed.ts'))
|
||||
} catch(e) {
|
||||
expect(e instanceof AssertionError)
|
||||
}
|
||||
})
|
||||
|
||||
it('reads all modules in mockules', async () => {
|
||||
const ps = [] as string[]
|
||||
for await (const fpath of Files.readRecursive(path.resolve('test', 'mockules'))) {
|
||||
ps.push(fpath)
|
||||
}
|
||||
expect(ps.length === 4)
|
||||
})
|
||||
|
||||
})
|
||||
92
test/core/presence.test.ts
Normal file
92
test/core/presence.test.ts
Normal file
@@ -0,0 +1,92 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { Presence } from '../../src';
|
||||
import * as Files from '../../src/core/module-loading'
|
||||
import { presenceHandler } from '../../src/handlers/presence'
|
||||
|
||||
// Example test suite for the module function
|
||||
describe('module function', () => {
|
||||
it('should return a valid configuration', () => {
|
||||
const config = Presence.module({
|
||||
inject: ['dependency1', 'dependency2'],
|
||||
execute: vi.fn(),
|
||||
});
|
||||
|
||||
expect(config).toBeDefined();
|
||||
expect(config.inject).toEqual(['dependency1', 'dependency2']);
|
||||
expect(typeof config.execute).toBe('function');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('of function', () => {
|
||||
it('should return a valid presence configuration without repeat and onRepeat', () => {
|
||||
const presenceConfig = Presence.of({
|
||||
status: 'online',
|
||||
afk: false,
|
||||
activities: [{ name: 'Test Activity' }],
|
||||
shardId: [1, 2, 3],
|
||||
}).once();
|
||||
|
||||
expect(presenceConfig).toBeDefined();
|
||||
//@ts-ignore Maybe fix?
|
||||
expect(presenceConfig.repeat).toBeUndefined();
|
||||
//@ts-ignore Maybe fix?
|
||||
expect(presenceConfig.onRepeat).toBeUndefined();
|
||||
expect(presenceConfig).toMatchObject({
|
||||
status: 'online',
|
||||
afk: false,
|
||||
activities: [{ name: 'Test Activity' }],
|
||||
shardId: [1, 2, 3],
|
||||
});
|
||||
});
|
||||
|
||||
it('should return a valid presence configuration with repeat and onRepeat', () => {
|
||||
const onRepeatCallback = vi.fn();
|
||||
const presenceConfig = Presence.of({
|
||||
status: 'idle',
|
||||
activities: [{ name: 'Another Test Activity' }],
|
||||
}).repeated(onRepeatCallback, 5000);
|
||||
|
||||
expect(presenceConfig).toBeDefined();
|
||||
expect(presenceConfig.repeat).toBe(5000);
|
||||
expect(presenceConfig.onRepeat).toBe(onRepeatCallback);
|
||||
expect(presenceConfig).toMatchObject({
|
||||
status: 'idle',
|
||||
activities: [{ name: 'Another Test Activity' }],
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
describe('Presence module execution', () => {
|
||||
const mockExecuteResult = Presence.of({
|
||||
status: 'online',
|
||||
}).once();
|
||||
|
||||
const mockModule = Presence.module({
|
||||
inject: [ '@sern/client'],
|
||||
execute: vi.fn().mockReturnValue(mockExecuteResult)
|
||||
})
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
// Mock Files.importModule
|
||||
vi.spyOn(Files, 'importModule').mockResolvedValue({
|
||||
module: mockModule
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
it('should set presence once.', async () => {
|
||||
const setPresenceMock = vi.fn();
|
||||
const mockPath = '/path/to/presence/config';
|
||||
|
||||
await presenceHandler(mockPath, setPresenceMock);
|
||||
|
||||
expect(Files.importModule).toHaveBeenCalledWith(mockPath);
|
||||
expect(setPresenceMock).toHaveBeenCalledOnce();
|
||||
})
|
||||
|
||||
})
|
||||
65
test/handlers.test.ts
Normal file
65
test/handlers.test.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
//@ts-nocheck
|
||||
import { beforeEach, describe, expect, it, test } from 'vitest';
|
||||
import { callInitPlugins } from '../src/handlers/event-utils';
|
||||
|
||||
import { Client } from 'discord.js'
|
||||
import { faker } from '@faker-js/faker';
|
||||
import { EventEmitter } from 'events';
|
||||
import { CommandControlPlugin, CommandType, controller } from '../src';
|
||||
import { createRandomModule, createRandomInitPlugin } from './setup/util';
|
||||
|
||||
|
||||
|
||||
function mockDeps() {
|
||||
return {
|
||||
'@sern/client': new Client(),
|
||||
'@sern/emitter': new EventEmitter()
|
||||
}
|
||||
}
|
||||
|
||||
describe('calling init plugins', async () => {
|
||||
let deps;
|
||||
beforeEach(() => {
|
||||
deps = mockDeps()
|
||||
});
|
||||
|
||||
test ('call init plugins', async () => {
|
||||
const plugins = createRandomInitPlugin('go', { name: "abc" })
|
||||
const mod = createRandomModule([plugins])
|
||||
const s = await callInitPlugins(mod, deps, false)
|
||||
expect("abc").equal(s.name)
|
||||
})
|
||||
test('init plugins replace array', async () => {
|
||||
const plugins = createRandomInitPlugin('go', { opts: [] })
|
||||
const plugins2 = createRandomInitPlugin('go', { opts: ['a'] })
|
||||
const mod = createRandomModule([plugins, plugins2])
|
||||
const s = await callInitPlugins(mod, deps, false)
|
||||
expect(['a']).deep.equal(s.opts)
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
test('form sdt', async () => {
|
||||
|
||||
const expectedObject = {
|
||||
"plugin/abc": faker.person.jobArea(),
|
||||
"plugin2/abc": faker.git.branch(),
|
||||
"plugin3/cheese": faker.person.jobArea()
|
||||
}
|
||||
|
||||
const plugin = CommandControlPlugin<CommandType.Slash>((ctx,sdt) => {
|
||||
return controller.next({ "plugin/abc": expectedObject['plugin/abc'] });
|
||||
});
|
||||
const plugin2 = CommandControlPlugin<CommandType.Slash>((ctx,sdt) => {
|
||||
return controller.next({ "plugin2/abc": expectedObject['plugin2/abc'] });
|
||||
});
|
||||
const plugin3 = CommandControlPlugin<CommandType.Slash>((ctx,sdt) => {
|
||||
return controller.next({ "plugin3/cheese": expectedObject['plugin3/cheese'] });
|
||||
});
|
||||
|
||||
})
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user