Compare commits

...

323 Commits

Author SHA1 Message Date
Jacob Nguyen
adb3d4f402 3.0.0-rc1 2023-05-23 14:50:20 -05:00
Jacob Nguyen
4d1e6f2a71 refactor: npx knip 2023-05-23 11:12:54 -05:00
Jacob Nguyen
63e0daac16 fix: typings for options- have access to all properties now 2023-05-22 22:50:05 -05:00
Jacob Nguyen
49fb1453a5 revert removal of crash method and mark deprecated 2023-05-19 20:48:38 -05:00
Jacob Nguyen
a6db21c720 docs: add purpose of d.ts file 2023-05-19 20:33:11 -05:00
Jacob Nguyen
fc6206a205 chore: make changes in codebase after error contract change 2023-05-19 20:30:32 -05:00
Jacob Nguyen
d7195c45b3 feat: change error handling contract 2023-05-19 20:15:25 -05:00
Jacob Nguyen
698d468acb test: add more tests 2023-05-19 19:43:05 -05:00
Jacob Nguyen
5d842fd5e7 test: add tests 2023-05-19 02:08:08 -05:00
Jacob Nguyen
b6ef27df88 refactor: add better typings for sern event modules 2023-05-18 22:52:37 -05:00
Jacob Nguyen
ea78a98f69 refactor: remove cast 2023-05-18 21:36:41 -05:00
Jacob Nguyen
08e358b32d feat: add new sern emitter event 2023-05-18 21:35:15 -05:00
Jacob Nguyen
47f58a9efa revert: internal name 2023-05-18 20:03:53 -05:00
Jacob Nguyen
b8619df838 feat: globalize dependencies type 2023-05-18 18:54:03 -05:00
Jacob Nguyen
e4a9c8d551 fix class based module loading 2023-05-18 13:06:40 -05:00
Jacob Nguyen
59a13765a5 style: pretty 2023-05-18 11:57:28 -05:00
Jacob Nguyen
f2b53dac32 fix: plugins for class modules and module loader 2023-05-18 11:49:14 -05:00
Jacob Nguyen
8f39fc0896 refactor: a lot 2023-05-15 17:35:38 -05:00
Jacob Nguyen
423b0d2aa7 revert: re export command executable and event executable 2023-05-15 17:22:25 -05:00
Jacob Nguyen
b2ab99b7cc refactor: move metadata outside of module declarations 2023-05-15 17:10:55 -05:00
Jacob Nguyen
b06e457caa fix: directories ignoring incorrectly 2023-05-13 01:04:50 -05:00
Jacob Nguyen
6fd9f8f032 feat: dev and prod mode 2023-05-13 00:52:46 -05:00
Jacob Nguyen
3ed6d84727 style: format & lint 2023-05-11 09:50:51 -05:00
Jacob Nguyen
95ec4d0e3c chore: update container and init hook progress 2023-05-11 01:33:49 -05:00
Jacob Nguyen
5e878cc97b chore: progress of globalizing dependencies type 2023-05-10 21:57:55 -05:00
Jacob Nguyen
57dfa09a73 add separate id for id processing 2023-05-10 21:41:18 -05:00
Jacob Nguyen
0256a38187 revert: readd module store and add contract 2023-05-10 21:40:40 -05:00
Jacob Nguyen
e6f3a55d73 build: speed up build 2023-05-10 21:35:54 -05:00
Jacob Nguyen
7ff8917a26 fix: unaliased modules would throw error 2023-05-10 15:09:26 -05:00
Jacob Nguyen
8a537d670b feat: types organization and cleaning up code base 2023-05-09 22:49:29 -05:00
Jacob Nguyen
cd1568ff69 refactor: rename, format, move things 2023-05-08 11:36:25 -05:00
Jacob Nguyen
9718360530 revert: readd discordEvent 2023-05-08 00:29:48 -05:00
Jacob Nguyen
6bd7573b88 revert: multiple entry points 2023-05-08 00:29:10 -05:00
Jacob Nguyen
993c41f37e chore: update name of function to reflect use 2023-05-08 00:27:36 -05:00
Jacob Nguyen
17423b683e refactor: cleaning up code and renaming variables 2023-05-08 00:27:01 -05:00
Jacob Nguyen
8d507d0520 chore: move context into structures directory 2023-05-07 23:41:23 -05:00
Jacob Nguyen
8dacfafbac chore: cleanup dispatchers subdirectory for single file 2023-05-07 23:37:23 -05:00
Jacob Nguyen
98de65965e chore: delete plugins dir 2023-05-07 00:46:50 -05:00
Jacob Nguyen
e411f81ab9 chore: move and clean 2023-05-07 00:46:22 -05:00
Jacob Nguyen
f6e41cc9b6 chore: move typings 2023-05-07 00:44:29 -05:00
Jacob Nguyen
9f5d2faa61 chore: fix InitArgs missing 2023-05-07 00:43:20 -05:00
Jacob Nguyen
815cbf19eb feat: SernEmitter now captures promise rejections 2023-05-06 23:23:24 -05:00
Jacob Nguyen
4ff2f39fcf revert: remove cloudflare typings 2023-05-06 22:13:59 -05:00
Jacob Nguyen
87585dcc69 refactor: change all files to camelcase and refactor 2023-05-06 22:13:09 -05:00
Jacob Nguyen
8c28e00206 chore: change all file names to camel case 2023-05-06 22:12:37 -05:00
Jacob Nguyen
bf6b99ff03 docs: specifics 2023-05-06 03:18:09 -05:00
Jacob Nguyen
9f213e9e8c refactor: fold switch case 2023-05-06 03:17:43 -05:00
Jacob Nguyen
4794c2655d revert: remove AnyDependencies type 2023-05-06 03:13:02 -05:00
Jacob Nguyen
43181bf916 style: pretty 2023-05-06 02:04:00 -05:00
Jacob Nguyen
8e9b3bbe04 chore: remove bad imports 2023-05-06 02:01:27 -05:00
Jacob Nguyen
098a440669 feat: add getPublishableCommands to ModuleManager 2023-05-06 01:49:42 -05:00
Jacob Nguyen
1e1398fade refactor: remove unneeded signatures and fix imports 2023-05-06 01:16:53 -05:00
Jacob Nguyen
1fea6fa136 refactor: add createGenericHandler 2023-05-06 01:01:54 -05:00
Jacob Nguyen
ff478123a8 chore: revert multi and clean up code 2023-05-05 23:31:51 -05:00
Jacob Nguyen
29499457bb chore: revert multi and mov sernEmitter 2023-05-05 23:14:54 -05:00
Jacob Nguyen
084b5adb5c chore: revert multiplatform 2023-05-05 23:10:10 -05:00
Jacob Nguyen
397857208e chore: modularize and split typings 2023-05-05 23:01:59 -05:00
Jacob Nguyen
ed532af7f7 revert: multiplatform 2023-05-05 22:52:24 -05:00
Jacob Nguyen
6628fa7074 revert: multiplatform 2023-05-05 22:51:59 -05:00
Jacob Nguyen
3d0cf62b9a chore: add tweetnacl 2023-05-05 10:12:39 -05:00
Jacob Nguyen
8e6061b4f2 chore: update Proccessed typing to ./core 2023-05-05 10:12:16 -05:00
Jacob Nguyen
e644b184f2 chore: add old context here until i figure out what to do 2023-05-04 18:55:55 -05:00
Jacob Nguyen
dbfd8cfe40 chore: add agnostic predicates 2023-05-04 18:47:28 -05:00
Jacob Nguyen
b0f6093ac6 chore: remove leaky import 2023-05-04 18:47:13 -05:00
Jacob Nguyen
1288a6b5cc chore: refactor and add multiplatform typings 2023-05-04 18:46:52 -05:00
Jacob Nguyen
7f53521ef4 chore: refactor and move things 2023-05-04 18:46:23 -05:00
Jacob Nguyen
faa0b4882e feat!: new module resolution algorithm 2023-05-04 18:45:54 -05:00
Jacob Nguyen
e2fd44516a refactor: internalize operators 2023-05-04 18:42:02 -05:00
Jacob Nguyen
4125508cd3 chore: redundant directory 2023-05-03 21:09:04 -05:00
Jacob Nguyen
2ecf3e5a5c chore: rename, wip refactoring 2023-05-03 21:08:20 -05:00
Jacob Nguyen
d53b315157 chore: remove redundant directories for single files 2023-05-03 21:05:19 -05:00
Jacob Nguyen
b7e99a85a6 chore: serverless work 2023-05-03 21:04:58 -05:00
Jacob Nguyen
aacf47efab chore: move commands into seperate file 2023-05-03 21:04:10 -05:00
Jacob Nguyen
cae1f648f0 refactor: move and update things 2023-05-03 21:02:51 -05:00
Jacob Nguyen
b7a13d6558 chore: remove redundant directories for single files 2023-05-03 15:08:07 -05:00
Jacob Nguyen
de654532e8 chore: remove redundant directories for single files 2023-05-03 13:01:14 -05:00
Jacob Nguyen
a5e8743afd chore: remove utils folder in favor of single file 2023-05-03 13:00:11 -05:00
Jacob Nguyen
3a8098e523 move eslint and prettier configs to json 2023-05-03 11:53:58 -05:00
Jacob Nguyen
21a20523b8 chore(core): add DefaultWrapper as sern classic 2023-05-02 10:28:58 -05:00
Jacob Nguyen
52b186cc44 chore(core): update imports and operators 2023-05-02 10:27:53 -05:00
Jacob Nguyen
a17be67b48 chore: move prettier into package.json 2023-05-01 20:51:54 -05:00
Jacob Nguyen
6a65dac272 chore: remove extra file 2023-04-29 18:05:37 -05:00
Jacob Nguyen
7f59f81b35 feat: make Context platform specific, CoreContext as Core 2023-04-27 13:23:16 -05:00
Jacob Nguyen
e6f9207a47 chore: move command args matrix as binding 2023-04-27 13:22:15 -05:00
Jacob Nguyen
fa4e6c7fbd chore: fix typings 2023-04-27 13:21:25 -05:00
Jacob Nguyen
d41cc9ea2d move strategy to index.ts and add adapters 2023-04-27 13:20:11 -05:00
Jacob Nguyen
97ad338830 lift requiredDependencyKeys out of makeFetcher 2023-04-26 21:25:53 -05:00
Jacob Nguyen
dcdf120ba7 chore: update typings 2023-04-26 11:58:22 -05:00
Jacob Nguyen
1fa7eef336 chore: remove dependence on discord.js Awaitable type 2023-04-16 14:17:56 -05:00
Jacob Nguyen
37ddef170f chore: remove deprecated support for plugins 2023-04-16 14:13:17 -05:00
Jacob Nguyen
195c155769 docs: add documentation to internal function 2023-04-16 13:33:35 -05:00
Jacob Nguyen
458a0b978f chore: remove deprecated symbols 2023-04-16 13:30:20 -05:00
Jacob Nguyen
bc4802f261 chore:remove const function 2023-04-16 13:27:17 -05:00
Jacob Nguyen
8e2ba871c4 chore:update paths 2023-04-15 16:48:04 -05:00
Jacob Nguyen
83f6568d84 add deprecation warning 2023-04-15 12:12:02 -05:00
Jacob Nguyen
f02bbbf54e add wrapper platform field 2023-04-15 12:12:02 -05:00
jacoobes
89bb50794b chore: fix paths 2023-04-14 13:05:27 -05:00
jacoobes
1a4e046f50 chore: move operators into core 2023-04-14 12:59:13 -05:00
jacoobes
09e57c73ac moving and fixing imports 2023-04-14 12:45:41 -05:00
jacoobes
457cb25cb2 refactor: remove dependence on discord.js for module stoore 2023-04-14 12:17:11 -05:00
Jacob Nguyen
b40f8905ea remove id from lifted Context 2023-04-12 17:06:54 -05:00
Jacob Nguyen
8bdb6d8216 work on strategy and lifted Context 2023-04-12 17:03:35 -05:00
Jacob Nguyen
58b3d85da8 refactor: move things to core, imports not fixed yet 2023-04-12 13:08:45 -05:00
xxDeveloper
21febd2c90 chore: Update SECURITY.md (#276)
Semantic security file

Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-04-11 22:46:02 -05:00
xxDeveloper
11daebb30a chore: Update LICENSE (#275)
We're in 2023
We're sern, not Sern

Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-04-11 22:45:45 -05:00
github-actions[bot]
b817f98c10 style: pretty please (#277)
Co-authored-by: EvolutionX-10 <EvolutionX-10@users.noreply.github.com>
2023-04-11 22:45:30 -05:00
Evo
563f583318 chore: switch to yarn (#273)
* chore: switch to yarn

* chore: pointless limitation

permalink: http://whatthecommit.com/468a491808723d12de48b079d9092b44

* chore: i can't believe it took so long to fix this.

permalink: http://whatthecommit.com/b298fe6d3375ab953abfdb0f1f737826
2023-04-11 12:45:16 -05:00
EvolutionX
e4c7bfe686 chore: ok work pls 2023-04-11 22:32:31 +05:30
EvolutionX
69fa4908c3 chore: refresh lockfile 2023-04-11 22:09:32 +05:30
renovate[bot]
4fa28d605f chore(deps): lock file maintenance (#245)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 10:32:46 -05:00
Jacob Nguyen
079b554f8b Update continuous-integration.yml 2023-04-11 10:31:15 -05:00
Jacob Nguyen
dec56335b9 Update codeql-analysis.yml 2023-04-11 10:30:41 -05:00
Jacob Nguyen
50be972d4f Update continuous-integration.yml 2023-04-11 10:29:06 -05:00
Jacob Nguyen
507d183970 Update codeql-analysis.yml 2023-04-11 10:28:29 -05:00
renovate[bot]
90edd4f91e chore(deps): update dependency eslint to v8.38.0 (#180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 10:24:32 -05:00
renovate[bot]
5f11142599 chore(deps): update dependency @typescript-eslint/parser to v5.58.0 (#250)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-04-11 10:22:27 -05:00
renovate[bot]
7a635f9978 chore(deps): update actions/checkout digest to 8f4b7f8 (#261)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-04-11 10:21:59 -05:00
renovate[bot]
a17aeac558 chore(deps): update pnpm to v7.32.0 (#262)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-04-11 10:21:39 -05:00
renovate[bot]
af6ebed348 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.58.0 (#249)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 10:18:46 -05:00
renovate[bot]
2f96b7634d chore(deps): update dependency prettier to v2.8.7 (#263)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 10:18:17 -05:00
EvolutionX
97741faa69 chore: refresh lockfile 2023-04-11 16:02:13 +05:30
Jacob Nguyen
94070d99e8 refactor/decoupling (#265)
* fix npm script for workflows

* filter lazy modules

* lift inline function for readability

* perf: use one instance of operator instead of creating instances

* chore: move fmt closer to call site

* refactor: inline function lifting and readability

* add import payload type

* refactor: remove redundant pipe for single function operators

* refactor: clearer naming for resultResolver

* refactor: no unused variable warning for updateAlive

* style: pretty

* refactor: remove redundant getter

* style: pretty

* fix: typescript needs explicit definition for defineAllFields

* add LazyPaths map

* chore: update tsup and typescript

* chore: revert lazy module work and work on decoupling core

* fix npm script for workflows

* chore: fix typings

* refactor: inline function `defineAllFields`

* docs: add @since annotation

* style: prettier

* docs: add since annotations

* fix: typings

* chore: update dependencies

* chore: remove unused import

* style: pretty

* merge on home pc

* refactor: use dependencies less

---------

Co-authored-by: jacoobes <jacobnguyend@gmail.com>
2023-04-10 22:12:26 -05:00
Jacob Nguyen
473be775f0 Update README.md 2023-03-29 15:12:26 -05:00
Neo
36af102251 docs: removed ALMA (#264)
Not working on it anymore, also not running it.
2023-03-29 12:55:16 -05:00
github-actions[bot]
cee740ea3f style: pretty please (#260)
Co-authored-by: renovate[bot] <renovate[bot]@users.noreply.github.com>
2023-03-17 17:01:20 -05:00
github-actions[bot]
2fd7697300 chore(main): release 2.6.1 (#258)
* chore(main): release 2.6.1

* Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-03-17 16:37:20 -05:00
Jacob Nguyen
f9609ce6cd chore: release 2.6.1
Release-As: 2.6.1
2023-03-17 16:33:46 -05:00
Jacob Nguyen
a3064aa915 chore: audit & remove tspattern (#256)
* chore: move import

* build: remove ts pattern

* fix: forgot to convert to switch

* fix workflow

* refactor: lift function out of readyHandler

* refactor: clean up errTap signature

* fix: sern emitter emitting wrong payload

* wa

* style: space

* chore: remove old errTap

* chore:bump discord.js

* chore: eslint format
2023-03-17 16:30:27 -05:00
github-actions[bot]
0a53a48521 style: pretty please (#255)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2023-03-15 21:16:58 -05:00
Jacob Nguyen
05037b5315 build: prettier ignore 2023-03-15 21:15:33 -05:00
Jacob Nguyen
06a3e69210 feat: prettier ignore 2023-03-15 21:13:42 -05:00
Jacob Nguyen
74c4b77d4b build: refactor/building (#252)
* refactor: conditional compilation of loading esm/cjs modules

* refactor: move file loading file

* refactor: add conditional compilation for building modules

* refactor: add conditional compilation for building modules

* perf: decrease build times

* test

* revert: typo and clean code

* build: smaller build

* chore:cleanscripts

* chore:refactor readme

* build:automerge lockfile

* chore: remove build and upgrade readme

* fix: dropdown

* chore: fix

* chore: more docs

---------

Co-authored-by: jacoobes <jacobnguyend@gmail.com>
2023-03-15 21:08:27 -05:00
github-actions[bot]
d381ff568e chore(main): release 2.6.0 (#248)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-03-09 16:18:06 -06:00
Jacob Nguyen
6db5c71506 chore: update workflow 2023-03-09 16:15:29 -06:00
github-actions[bot]
507c9e7939 style: pretty please (#247)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2023-03-09 16:11:29 -06:00
Jacob Nguyen
09610d0501 refactor: eventhandlers (#246)
* refactor:import

* feat: save progress

* feat:progress

* refactor: event handlers

* fix: merge all subscriptions into event handler

* fix: remove duplicate minify key

* fix: leftover this

* docs: jsdoc

* chore: clean pnpm

---------

Co-authored-by: jacoobes <jacobnguyend@gmail.com>
2023-03-09 16:09:35 -06:00
github-actions[bot]
0862bf92d0 style: pretty please (#244)
Co-authored-by: renovate[bot] <renovate[bot]@users.noreply.github.com>
2023-03-03 09:22:02 -06:00
renovate[bot]
62162f6b8c chore(deps): lock file maintenance (#240)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-03-02 19:03:02 -06:00
renovate[bot]
eb501db09a chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.54.0 (#243)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-02 19:01:18 -06:00
renovate[bot]
964848a4e2 chore(deps): update dependency @typescript-eslint/parser to v5.54.0 (#194)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-03-02 18:48:56 -06:00
renovate[bot]
78dead1b49 chore(deps): update pnpm to v7.28.0 (#239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-02 18:48:32 -06:00
renovate[bot]
39e6d6d2f9 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.52.0 (#238)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-20 00:30:10 -06:00
renovate[bot]
5aff57ed6d chore(deps): update dependency typescript to v4.9.5 (#208)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-20 00:27:36 -06:00
github-actions[bot]
4095471346 style: pretty please (#237)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2023-02-17 15:47:33 -06:00
Jacob Nguyen
f7b9c52df1 Merge remote-tracking branch 'origin/main' 2023-02-17 15:40:54 -06:00
Jacob Nguyen
d20d01524b feat: adding pure annotation for better tree shaking 2023-02-17 15:40:32 -06:00
renovate[bot]
5684c060bc chore(deps): lock file maintenance (#225)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-02-17 13:13:15 -06:00
github-actions[bot]
ca8b31f280 chore(main): release 2.5.3 (#235)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-02-16 11:11:32 -06:00
jacoobes
ce9a0831a6 chore: release 2.5.3
Release-As: 2.5.3
2023-02-16 11:09:46 -06:00
jacoobes
3a32968a17 chore: bump version 2023-02-16 10:57:38 -06:00
github-actions[bot]
e549f8bc3e chore(main): release 2.5.2 (#234)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-02-16 10:52:14 -06:00
jacoobes
3ab73459ad bump version 2023-02-16 10:49:02 -06:00
jacoobes
16af2e996d chore: minifiy build output 2023-02-16 10:44:38 -06:00
Jacob Nguyen
4f9a842b0e update ci 2023-02-15 21:31:18 -06:00
Jacob Nguyen
5dfd1a1fc1 Update README.md 2023-02-15 21:28:48 -06:00
Jacob Nguyen
c45a10c950 Update README.md 2023-02-15 21:28:25 -06:00
Jacob Nguyen
b45ba34f3c Update README.md 2023-02-15 18:22:23 -06:00
Jacob Nguyen
facee79c90 revert: version 2023-02-14 17:54:31 -06:00
Jacob Nguyen
306eee071d chore: bump dependencies 2023-02-14 17:52:23 -06:00
Jacob Nguyen
00d55208a0 Merge remote-tracking branch 'origin/main' 2023-02-14 17:42:26 -06:00
Jacob Nguyen
49fad801a5 chore: bump dependencies 2023-02-14 17:41:54 -06:00
Neo
c9f44ce72b docs: changed name of Benzo-Fury's Bot (#226) 2023-02-13 11:46:28 -06:00
Jacob Nguyen
a9a2528faf Update README.md 2023-02-12 17:07:51 -06:00
github-actions[bot]
529edb7da5 style: pretty please (#224)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2023-02-12 12:59:34 -06:00
github-actions[bot]
f236dc05e2 chore(main): release 2.5.1 (#222)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-02-12 12:58:00 -06:00
Jacob Nguyen
c78936a225 chore: release 2.5.1
Release-As: 2.5.1
2023-02-12 12:54:18 -06:00
Jacob Nguyen
1860b898f3 fix: autocomplete 2023-02-12 12:51:49 -06:00
renovate[bot]
fd10772a9b chore(deps): lock file maintenance (#213)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-12 11:47:37 -06:00
renovate[bot]
cd36bd8a47 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.51.0 (#187)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-12 11:33:00 -06:00
renovate[bot]
dda7f41231 chore(deps): update dependency prettier to v2.8.4 (#215)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-02-12 11:29:38 -06:00
renovate[bot]
371a57194c chore(deps): update pnpm to v7.27.0 (#216)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-12 11:28:54 -06:00
Neo
bfcc160a39 docs: change protectors WIP mark to its name (#214)
Idk I was bored and saw this was different to mine. Change mine instead or just close this pr, idm.
2023-02-07 20:16:23 -06:00
Neo
86fa531eb6 docs: Adding the WIP to my bot (#212)
feat: Adding the WIP to my bot
2023-02-04 10:37:03 -06:00
Gary
58052e94cb docs: add my bot to the ReadMe (#211) 2023-02-04 01:38:07 -06:00
Neo
96f4281121 feat: Adding my bot to readme (#210) 2023-02-03 23:55:26 -06:00
Jacob Nguyen
f9ae7c003b docs: clarify example 2023-02-03 23:46:19 -06:00
Jacob Nguyen
ec211d5a8d docs: do some updating on readme 2023-02-03 23:14:57 -06:00
github-actions[bot]
3faf83bbf7 style: pretty please (#209)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2023-02-03 23:04:13 -06:00
renovate[bot]
8eed099503 chore(deps): lock file maintenance (#183)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-03 23:00:46 -06:00
renovate[bot]
e2874be4e7 chore(deps): update pnpm to v7.26.3 (#203)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-03 22:56:17 -06:00
github-actions[bot]
1d6751a9cd style: pretty please (#207)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2023-01-30 12:35:37 -06:00
github-actions[bot]
f6afafa352 chore(main): release 2.5.0 (#205)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-01-30 12:30:28 -06:00
Jacob Nguyen
b4b195dc95 chore: release 2.5.0
Release-As: 2.5.0
2023-01-30 12:27:18 -06:00
Jacob Nguyen
33f14467ec feat!: simpler plugins (#193)
* feat: experimental plugin changes

* more refactors and name changes

* feat: update name usage and update dispatchers.ts

* fix:naming

* feat: slightly safer typings than any[]

* fix: forgot to destructure arguments

* feat: add special function

* fix: typings

* feat: SUPER SIMPLIFY!!!

* refactor: move promisifiedPlugins closer to call site

* refactor: typings

* refactor: typings

* refactor: consolidate resolving initplugins into one function

* refactor: better types

* revert: remove unneeded function

* revert: remove unneeded function

* feat: dispatch work, simplify

* feat: move some observableHandling function to operators for clarity

* feat: simplify and document

* feat: simplifying sern and docs

* fix: typings

* docs: clarity of function name

* docs: add documentation for executeModule

* feat: contextArgs overloads

* docs: found out why

* fix: typings

* feat: shorten operators signature

* refactor: switch to correct convention

* refactor: take(1) -> first()

* refactor: revert

* refactor: safer typings (less any) and more accurate typings

* style: prettier and short type aliases

* fix: typings

* fix: typings

* docs: add deprecations

* refactor: organization and moving stuff

* pretty: prettey

* docs: describe file

* chore: update dependencies and version

* docs: fix link for docasaurus

* refactor: using a more appropriate operator function for closing an observable on crash

* fix!: changing single and many

* refactor: typings and simplifying composeRoot

* fix: re-add logger into handleError

* docs: comment

* docs: new section

* feat: help mitigate breaking changes

* feat: help mitigate breaking changes

* feat: help mitigate breaking changes and function overloads

* feat: deprecate instead of remove

* feat: partial remove and deprecate old symbols

* revert: trying to accommodate old plugins is too difficult

* docs: add many as deprecated

* docs: update

* feat: partial backwards compatability

* refactor: renaming, docs, and exports more clean

* refactor: context got a lot simpler

* refactor: imports

* docs: explain methods
2023-01-26 12:06:04 -06:00
renovate[bot]
cb95105c1c chore(deps): update dependency prettier to v2.8.3 (#196)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-01-17 12:54:57 -06:00
renovate[bot]
845b82feef chore(deps): update actions/checkout digest to ac59398 (#184)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-01-14 22:38:44 -06:00
renovate[bot]
833a323f3c chore(deps): update actions/setup-node digest to 64ed1c7 (#185)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-14 22:36:47 -06:00
renovate[bot]
42e5f20425 chore(deps): update pnpm to v7.25.0 (#195)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-14 22:36:09 -06:00
renovate[bot]
2b25e6bfbb chore(deps): update pnpm to v7.22.0 (#179)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-01-07 19:43:59 -06:00
renovate[bot]
1a27341092 chore(deps): update dependency prettier to v2.8.2 (#189)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2023-01-07 16:30:48 -06:00
renovate[bot]
4680e451bb chore(deps): update dependency @typescript-eslint/parser to v5.48.0 (#188)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-07 16:09:49 -06:00
renovate[bot]
917d8b0d1b chore(deps): update dependency iti to ^0.6.0 (#178)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-31 14:01:56 -06:00
github-actions[bot]
b8492ee45d chore(main): release 2.1.1 (#181)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-12-31 13:50:44 -06:00
Jacob Nguyen
08aac1d67a chore: bump version 2022-12-31 13:47:50 -06:00
Jacob Nguyen
a13df6fb42 fix: modals remapping 2022-12-31 13:41:20 -06:00
Jacob Nguyen
7089f5c0dc chore: fix prettier wkflw holy shit 2022-12-30 11:30:38 -06:00
Jacob Nguyen
559c1a7a7b chore: fix prettier wkflw holy shit 2022-12-30 11:28:50 -06:00
Jacob Nguyen
ac27d168e2 chore: fix prettier wkflw holy shit 2022-12-30 11:27:00 -06:00
Jacob Nguyen
d1e6ec4589 chore: fix prettier wkflw holy shit 2022-12-30 11:25:42 -06:00
Jacob Nguyen
ff379d03be chore: fix prettier wkflw holy shit 2022-12-30 11:15:40 -06:00
Jacob Nguyen
1e4e933db2 chore: fix prettier wkflw holy shit 2022-12-30 11:13:38 -06:00
Jacob Nguyen
ce960f4c8d chore: fix prettier wkflw holy shit 2022-12-30 11:11:38 -06:00
Jacob Nguyen
1130456045 chore: fix prettier wkflw holy shit 2022-12-30 11:10:48 -06:00
Jacob Nguyen
1617d2dcc3 chore: fix prettier wkflw 2022-12-30 11:09:14 -06:00
Jacob Nguyen
ddacbd6e38 chore: fix prettier wkflw 2022-12-30 11:06:26 -06:00
Jacob Nguyen
d69819e9fc chore: fix prettier wkflw 2022-12-30 11:03:30 -06:00
github-actions[bot]
49e4ba623f chore(main): release 2.1.0 (#176)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-30 10:58:57 -06:00
github-actions[bot]
1b6c413fc2 style: pretty please (#175)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2022-12-30 10:56:23 -06:00
Jacob Nguyen
e986535935 fix: multi parameter events 2022-12-30 10:45:02 -06:00
Jacob Nguyen
c30aac476c feat: grammar 2022-12-28 15:37:35 -06:00
github-actions[bot]
f9622d3788 style: pretty please (#173)
Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
2022-12-28 15:34:22 -06:00
renovate[bot]
f286a24686 chore(deps): update dependency prettier to v2.8.1 (#158)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-28 15:20:45 -06:00
renovate[bot]
166934d749 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.47.1 (#159)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-28 15:18:51 -06:00
renovate[bot]
01d79177e8 chore(deps): lock file maintenance (#153)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-28 15:15:12 -06:00
renovate[bot]
50dac7fb46 chore(deps): update dependency @typescript-eslint/parser to v5.47.1 (#160)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-28 15:10:17 -06:00
renovate[bot]
714d23d401 chore(deps): update actions/checkout digest to 755da8c (#161)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-28 15:05:10 -06:00
renovate[bot]
565c4fc35a chore(deps): update dependency eslint to v8.30.0 (#152)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-28 14:56:44 -06:00
github-actions[bot]
8d18c4b182 style: pretty please (#162)
* style: pretty please

* feat: no package.lock.json anymore

Co-authored-by: jacoobes <jacoobes@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-12-28 14:40:19 -06:00
github-actions[bot]
71cec6f142 chore(main): release 2.0.0 (#163)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-12-28 14:30:59 -06:00
Jacob Nguyen
14556223fd feat!:(2.0 global services) (#156)
* style: prettier line feed changes

* style: prettier line feed changes

* feat: prototyping module manager

* feat: removing unused types

* feat: update location of module typings

* revert: port back to original interaction type checkers

* revert: port back to original interaction type checkers

* revert: remove unneeded type predicates

* feat: moving modules to its own contained class

* feat: getting global plugins some typings and adding contracts

* chore: fixing up and cleaning code

* feat: adding ModuleConfiguration helper fn and default module manager

* feat: solidifying contract

* revert: delete files

* chore: saving for later

* feat: prototyping module manager

* feat: removing unused types

* feat: update location of module typings

* revert: port back to original interaction type checkers

* revert: port back to original interaction type checkers

* revert: remove unneeded type predicates

* feat: moving modules to its own contained class

* feat: getting global plugins some typings and adding contracts

* chore: fixing up and cleaning code

* feat: adding ModuleConfiguration helper fn and default module manager

* feat: solidifying contract

* revert: delete files

* chore: saving for later

* feat: more merge conflicts

* feat: starting from scratch, add new typings

* feat: refactor ScopedPlugin typing

* feat: strengthening contracts

* chore: edit eslint

* feat: add addDependencies

* feat: add iti di

* feat: constfn util

* revert: delete old files

* remove: ModuleConfiguration

* feat: add sanity checker

* feat: add new error and update dependency

* feat: add sanity check for iti

* feat: add function helpers for di

* feat: add POC for sern di IOC

* feat: refactor DependenciesMap

* revert: remove old code

* feat: refactor makeDependencies fn

* chore(deps): update dependency @typescript-eslint/parser to v5.36.1 (#127)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.36.1 (#126)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs: Fix the code example (#128)

* chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.36.2 (#130)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>

* chore(deps): update dependency @typescript-eslint/parser to v5.36.2 (#131)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>

* feat: allow constructable modules (#133)

* Update readFile.ts

* Update userDefinedEventsHandling.ts

* Update readyHandler.ts

* fix: ts error

Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>

* revert: feat of allow constructable modules (#138)

Revert "feat: allow constructable modules (#133)"

This reverts commit 03936eb2ea.

* feat: update CODEOWNERS

* feat: classmodules@arcs (#143)

* feat: add class based commands

* docs: add deprecation warnings

* feat: add deprecation warnings

* feat: add more deprecation warnings

* feat: add prototype ClassModule abstract class

* feat: add EventModuleClass prototype, change names

* feat: more flexible contract

* feat: EventExecutable

* fix: typo

* feat: made abstract classes because of defaults

* fix: typings

* feat: update Context typings, update to djs v15

* chore: update typescript dependency

* chore: bump version

* chore: update ignore

* chore: prettier

* docs: change readme to be docusaurus compliant

* chore(main): release 1.2.0 (#145)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(autocomplete): now support multiple autocomplete options (#147)

* chore(main): release 1.2.1 (#148)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* feat: update location of module typings

* feat: getting global plugins some typings and adding contracts

* feat: adding ModuleConfiguration helper fn and default module manager

* feat: solidifying contract

* feat: removing unused types

* feat: update location of module typings

* feat: moving modules to its own contained class

* feat: getting global plugins some typings and adding contracts

* feat: solidifying contract

* revert: delete files

* chore: saving for later

* feat: more merge conflicts

* feat: starting from scratch, add new typings

* feat: strengthening contracts

* feat: add sanity check for iti

* feat: refactor DependenciesMap

* feat: adding POC back

* docs: add some deprecation warnings

* feat: remove client and sernEmitter

* feat: rebase global_services

* chore: oops rebase pkgjson fix

* fix: typings

* feat: iti update and getting di working

* feat: adding contracts and default provider

* feat: update typings and change logger

* fix: MapDeps typings and useContainer typings

* feat: moving handlers to 2.0

* feat: injecting crash handler

* feat: alpha logging injection?

* feat: injecting modulemanager in interactionhandler

* fix: typos and fixups

* fix: typos and fixups

* feat: moduleManager injection

* fix: crash on no module

* feat: i think optional dependencies work

* feat: add more optional support

* feat: make exclusion optional

* perf: simplify typings and reduce compile time

* fix: some typings adjustment, deprecating a field

* perf: simplifying plugin typings

* feat: remove addExternal

* feat: more simplifying typings

* perf: allow any and interfacify some types

* revert: remove horrendous Override type

* revert: delete interaction type predicates

* fix: unchecked cast to EventEmitter

* perf: remove unneeded creation of instance members

* feat: init test dir

* refactor: rename fn and short circuit name fn

* refactor: insert function

* feat: starting event module onEvent plugins and log payload

* feat: basic eventmodule event plugins?

* refactor: DRY

* feat: unify warning typing

* fix: typings

* feat: more progress on new eventModules

* feat: event modules with plugins!!?!?

* feat: making sernEmitter create default!!, readjust typings

* feat: inject sernEmitter emits and catch possible errors

* feat: add optionality to Logger dep type

* feat: context upgrade, fix circular emissions, crap ton of shit

* feat!: Module -> AnyModule, Added new SelectMenuInteractions, Changed some CommandType names

* feat: rudimentary onClick handler

* feat!: rename select menu command types, no distinguishing between text and alias

* docs: adding docs

* fix: forgot to change

* fix: logging undefined

* revert: remove spreadparams

* feat: export useContainerRaw function and fix smol bug

* feat: add iti DI disposeAll on crash

* fix: deferred execute

* feat!: rename BasePlugin -> Plugin

* feat: commandplugins for event modules, ill test later

* refactor: rename

* refactor: remove import

* feat: add deprecation warnings

* feat: update documentation comments

* perf: static'ify command plugin and event plugin typings

* refactor: remove redundant assignment

* feat: switch to pnpm

* chore: update pnpm lock

* fix: errors crashing and completing subscription

* feat: update example

* fix: overriding dependencies no matter what

* fix: bad rxjs docs

* refactor: destructuring

* feat: update typings for addDisposer

* feat: update packageManager field in package.json

* feat: grammar

Co-authored-by: jacoobes <jacobnguyend@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
Co-authored-by: Arcs <73959934+HighArcs@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Evo <85353424+EvolutionX-10@users.noreply.github.com>
2022-12-28 14:18:36 -06:00
renovate[bot]
59c1c9c6a9 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.44.0 (#154)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-25 16:47:17 -06:00
renovate[bot]
a120136f55 chore(deps): update dependency @typescript-eslint/parser to v5.44.0 (#155)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-25 16:37:43 -06:00
xxDeveloper
9b2d7eea5f chore: Update the old domain (#157) 2022-11-20 18:29:11 +03:00
Jacob Nguyen
4d7aa97b66 docs: update new domain 2022-11-05 09:22:46 -05:00
renovate[bot]
83eadcd2e5 chore(deps): lock file maintenance (#142)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-20 16:30:04 -05:00
renovate[bot]
c0bf346841 chore(deps): update actions/setup-node digest to 8c91899 (#146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-10-20 16:09:07 -05:00
renovate[bot]
73c161fffe chore(deps): update actions/checkout digest to 93ea575 (#151)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
2022-10-20 16:05:03 -05:00
renovate[bot]
ee763301d0 chore(deps): update dependency eslint to v8.25.0 (#141)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-20 15:56:31 -05:00
renovate[bot]
c5f6eb9794 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.40.1 (#139)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-20 15:38:24 -05:00
renovate[bot]
ec8a61a9ee chore(deps): update dependency @typescript-eslint/parser to v5.40.1 (#140)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-20 15:33:10 -05:00
Priyanuj09
87c17dbe10 [Fix] Hyperlinks (#149)
* Fixed discord invite link

* Fixed guidelines hyperlink
2022-10-15 14:56:59 -05:00
github-actions[bot]
790ce1681c chore(main): release 1.2.1 (#148)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-10-03 11:53:45 -05:00
Evo
cbad7380e1 fix(autocomplete): now support multiple autocomplete options (#147) 2022-10-03 11:50:49 -05:00
github-actions[bot]
ad36875be2 chore(main): release 1.2.0 (#145)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-09-28 11:57:10 -05:00
Jacob Nguyen
50288867a5 feat: classmodules@arcs (#143)
* feat: add class based commands

* docs: add deprecation warnings

* feat: add deprecation warnings

* feat: add more deprecation warnings

* feat: add prototype ClassModule abstract class

* feat: add EventModuleClass prototype, change names

* feat: more flexible contract

* feat: EventExecutable

* fix: typo

* feat: made abstract classes because of defaults

* fix: typings

* feat: update Context typings, update to djs v15

* chore: update typescript dependency

* chore: bump version

* chore: update ignore

* chore: prettier

* docs: change readme to be docusaurus compliant
2022-09-28 11:52:25 -05:00
Jacob Nguyen
6b8995d149 feat: update CODEOWNERS 2022-09-13 14:41:57 -05:00
xxDeveloper
82bbddac8d revert: feat of allow constructable modules (#138)
Revert "feat: allow constructable modules (#133)"

This reverts commit 03936eb2ea.
2022-09-13 14:36:15 -05:00
Arcs
03936eb2ea feat: allow constructable modules (#133)
* Update readFile.ts

* Update userDefinedEventsHandling.ts

* Update readyHandler.ts

* fix: ts error

Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
2022-09-13 21:46:06 +03:00
renovate[bot]
c4019f7a08 chore(deps): lock file maintenance (#136)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-12 20:57:34 +03:00
renovate[bot]
992619f8e5 chore(deps): update dependency @typescript-eslint/parser to v5.36.2 (#131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
2022-09-11 14:24:50 +03:00
renovate[bot]
b995560ec6 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.36.2 (#130)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
2022-09-11 14:19:40 +03:00
renovate[bot]
f01ef9b86c chore(deps): lock file maintenance (#129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-11 14:16:19 +03:00
xxDeveloper
702c5750fc docs: Fix the code example (#128) 2022-09-03 14:52:26 +03:00
renovate[bot]
d5d1b4129b chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.36.1 (#126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-03 11:26:55 +03:00
renovate[bot]
7658d3e3ab chore(deps): update dependency @typescript-eslint/parser to v5.36.1 (#127)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-03 11:24:09 +03:00
renovate[bot]
9c1abc6b2e chore(deps): lock file maintenance (#118) 2022-08-29 14:07:45 +03:00
github-actions[bot]
20bc135a7d chore(main): release 1.1.0 (#125)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-08-28 21:58:11 -05:00
EvolutionX
8a373de880 chore: release 1.1.0
Release-As: 1.1.0
2022-08-29 08:24:54 +05:30
Jacob Nguyen
395549c173 feat: add proper error handling (#115) 2022-08-29 08:09:52 +05:30
Evo
dbc180fa78 chore: duck you typo 2022-08-29 07:57:48 +05:30
github-actions[bot]
ff5c161469 stlye: pretty please (#124)
Co-authored-by: EvolutionX-10 <EvolutionX-10@users.noreply.github.com>
2022-08-29 07:12:33 +05:30
Evo
82637245f3 chore: typo and limits (#121) 2022-08-29 07:10:59 +05:30
Evo
bc3ed918da ci: add a formatting workflow (#116) 2022-08-29 07:01:28 +05:30
renovate[bot]
62bfcb1eb7 chore(deps): update dependency @typescript-eslint/parser to v5.35.1 (#111) 2022-08-28 09:40:48 +03:00
renovate[bot]
fbf54c9d36 chore(deps): update dependency typescript to v4.8.2 (#113) 2022-08-28 09:39:48 +03:00
renovate[bot]
b999918b71 chore(deps): update dependency eslint to v8.23.0 (#112) 2022-08-28 09:39:10 +03:00
renovate[bot]
224ce97fe8 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.35.1 (#110) 2022-08-28 09:38:01 +03:00
renovate[bot]
f52dd01ca5 chore(deps): lock file maintenance (#109)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-22 22:11:42 +03:00
renovate[bot]
b8841e926d chore(deps): lock file maintenance (#105)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-21 22:35:28 +03:00
renovate[bot]
f0f54cb7f2 chore(deps): update dependency eslint to v8.22.0 (#103)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-21 22:34:54 +03:00
renovate[bot]
ebe759f5e0 chore(deps): update dependency @typescript-eslint/parser to v5.33.1 (#102) 2022-08-18 22:16:10 +03:00
renovate[bot]
58d97e08a5 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.33.1 (#101) 2022-08-18 22:15:18 +03:00
github-actions[bot]
21a438768b chore(main): release 1.0.0 (#82)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-08-15 10:52:13 -05:00
Jacob Nguyen
b3ed8da68f feat: add discord.js as a peerDependency instead 2022-08-14 18:35:39 -05:00
Jacob Nguyen
c5bd94131d feat: fix duplicate 2022-08-14 12:54:28 -05:00
Jacob Nguyen
3dec347ef0 feat: remove externallyUsed.ts 2022-08-14 12:53:16 -05:00
Jacob Nguyen
4e9530f4d7 docs(readme): @Murtatrxx work readme improvements (#104)
* docs: 🦋 Refreshed README

* docs: Imrpoved hero image

* docs: Changed the title

* fix: Fixed the title display

* docs: Added copyright to README

* docs: Added more badges

* docs: Updated license badge

* docs: Fixed message grammar

* fix: Fixed the line count

* docs: Shortened the description

* revert: Remove copyright

* docs: Updated the name on README

* docs: Added bun to installations

* ci: version.txt

* ci: simple release-type

* chore: Added .vscode/ dir to ignore file

* docs: Improved readme

* docs: Requested changes

* docs: Updated readme with more details

* feat: update banner

* feat: update readme

* docs: Updated features section’s title

* docs: Requested changes

* fix: Grammar

* feat: delete version.txt

* chore: update release-please

* docs: fixed typo

Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
2022-08-14 12:50:07 -05:00
Jacob Nguyen
0da1b5a4dc feat: update example 2022-08-10 23:44:53 -05:00
renovate[bot]
8a7a671300 chore(deps): lock file maintenance (#100) 2022-08-09 15:06:30 +03:00
renovate[bot]
bf8a5d5a11 chore(deps): update dependency eslint to v8.21.0 (#99) 2022-08-06 23:55:06 +03:00
Jacob Nguyen
74378f0f12 feat: shrink package size, improve dev deps, esm and cjs support (#98)
* chore: fix tsc predicate type checking

* build: add tsup as bundler

* chore: revert text

* chore: fix predicates.ts, update dependencies, bump version

* docs: update example

* build: update dependencies

* fix: crash on collectors (#89)

* fix: crash on collectors

* feat: bump version for bug fix

* fix: crash on collectors pt

* docs: adding some documentation for docasaurus

* docs: add errors.ts comments

* docs: refactor comments

* docs: adding examples

* feat: refresh package-lock.json

* refactor: destructure and clean namespaces

* feat: add regen package.json script

* feat: add tsup, remove tsc, add scripts

* feat: update ts-results import style

* feat: readd typescript because idk if i should

* feat: breakup tsconfigs and add tsup config

* feat: add esm json tsconfig to git

* build: update dependencies and move to ts-result-es

* feat: remove unused function

* feat: update ts-results for esm/cjs interop!

* revert: remove version.txt

* build: goodbye tsc, hello tsup

* build: moving discord.js as dev dependency

* style: requested changes

* feat: add tsc back ( i missed you )

* build: bump version -> 1.0.0

* feat: syncing to main

* style: pretty

* feat: fix tsconfig issues with tsup

* revert: remove ExternallyUsed

* feat: update scripts

* build: update tsup and pkg-lock.json

* feat: refresh package-lock.json

* feat: test
2022-08-06 15:51:19 -05:00
Jacob Nguyen
0559fcca96 chore: forgot to remove console log at prod lol 2022-08-02 14:29:42 -05:00
Jacob Nguyen
70d7bdb8c5 fix: autocomplete in nested form (#97)
Co-authored-by: Evo <85353424+EvolutionX-10@users.noreply.github.com>
2022-08-03 00:21:31 +05:30
renovate[bot]
b6ea3da23f chore(deps): lock file maintenance (#96) 2022-08-02 13:21:38 +03:00
Jacob Nguyen
75a6a04db5 feat: add frontmatter (#95) 2022-08-02 13:21:16 +03:00
renovate[bot]
24fae252a7 chore(deps): update dependency @typescript-eslint/parser to v5.32.0 (#94) 2022-08-02 13:20:28 +03:00
renovate[bot]
d70a2a1d5e chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.32.0 (#93) 2022-08-02 13:19:12 +03:00
Jacob Nguyen
0d6e592614 feat: add feature-request.md (#92) 2022-07-29 13:50:46 +03:00
renovate[bot]
44ee2f4440 chore(deps): lock file maintenance (#91) 2022-07-28 12:59:37 +03:00
renovate[bot]
b560d56346 chore(deps): update actions/dependency-review-action action to v2 (#90)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-24 13:17:25 +03:00
renovate[bot]
344229b65f chore(deps): lock file maintenance (#88)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-24 12:56:12 +03:00
renovate[bot]
ca728f755b chore(deps): update dependency eslint to v8.20.0 (#87)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-24 12:53:56 +03:00
renovate[bot]
d8d6330260 chore(deps): update dependency @typescript-eslint/parser to v5.30.7 (#85)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-24 12:51:19 +03:00
renovate[bot]
c17c49bb17 chore(deps): update dependency @typescript-eslint/eslint-plugin to v5.30.7 (#84)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-24 12:47:38 +03:00
Jacob Nguyen
7da7bff700 fix: crash on collectors pt 2022-07-20 14:36:32 -05:00
Jacob Nguyen
a0587f59d4 fix: crash on collectors (#89)
* fix: crash on collectors

* feat: bump version for bug fix
2022-07-20 14:00:49 -05:00
Jacob Nguyen
d62be87c9a build: update dependencies 2022-07-19 19:48:04 -05:00
Jacob Nguyen
35a200f055 docs: update example 2022-07-18 13:55:32 -05:00
Jacob Nguyen
d96681bfb5 chore: fix predicates.ts, update dependencies, bump version 2022-07-18 12:21:23 -05:00
Jacob Nguyen
d1b034b826 chore: revert text 2022-07-18 12:18:12 -05:00
Jacob Nguyen
2387add445 build: update discord.js to v14.0.1 and bump version 2022-07-17 17:17:38 -05:00
Jacob Nguyen
7bf15a2d5d build: bump version 2022-07-16 15:38:12 -05:00
Jacob Nguyen
07e6dabce1 bug(observableHandling.ts): fix https://github.com/sern-handler/handler/issues/86 2022-07-16 15:37:43 -05:00
Jacob Nguyen
8e3feb81ca build: refresh package-lock.json 2022-07-16 13:23:01 -05:00
Jacob Nguyen
9a16c20dad build: bump to patch version and remove unneeded scripts 2022-07-16 13:20:06 -05:00
Jacob Nguyen
17eb816ec9 refactor(events): use of classes for scalability & maintainability (#83)
Co-authored-by: EvolutionX-10 <evolutionx9777@gmail.com>
2022-07-16 23:38:11 +05:30
Jacob Nguyen
79be5096d3 build: remove cz and standard version 2022-07-15 23:13:22 -05:00
Jacob Nguyen
4fea383519 feat: add version.txt 2022-07-14 17:07:47 -05:00
Jacob Nguyen
ca9ac52fae revert: remove version.txt 2022-07-14 16:56:54 -05:00
Jacob Nguyen
9cb25a585a ci: manual version override 2022-07-14 16:55:17 -05:00
Jacob Nguyen
17033254d4 ci: update release-please.yml 2022-07-14 16:44:01 -05:00
Jacob Nguyen
2f5e0fc772 ci: update release-please 2022-07-14 16:31:39 -05:00
Jacob Nguyen
a35ceb9531 ci: add release-please 2022-07-13 16:26:45 -05:00
renovate[bot]
fbbd79babc chore(deps): update actions/checkout action to v3 (#80)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
2022-07-11 13:10:34 +03:00
renovate[bot]
501745b7ea chore(deps): lock file maintenance (#81)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-11 13:08:35 +03:00
renovate[bot]
6ea84ac8cd chore(deps): update actions/setup-node action to v3 (#79)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-11 13:08:09 +03:00
xxDeveloper
76c4333a81 fix: Fixed renovate warning (#77) 2022-07-08 21:34:51 +03:00
xxDeveloper
ac459593a0 chore: Updated code of conduct (#78)
chore: Updated the name on code of conduct
2022-07-06 20:24:31 +03:00
renovate[bot]
c5dac42da0 chore(deps): update github/codeql-action action to v2 (#76)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-05 19:18:22 +03:00
renovate[bot]
ef2200c257 chore(deps): lock file maintenance (#75)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-05 14:42:48 +03:00
renovate[bot]
fcb5f6747c chore(deps): update all non-major dependencies to v5.30.5 (#74)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
2022-07-05 14:39:41 +03:00
renovate[bot]
dd75650a46 chore(deps): pin dependency standard-version to 9.5.0 (#73)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-05 14:36:50 +03:00
xxDeveloper
4872590b28 ci: Added dependency-reviewer (#70) 2022-07-05 12:36:25 +03:00
renovate[bot]
cc127bd040 chore(deps): update all non-major dependencies (#72)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-02 11:27:48 -05:00
Evo
9dd82a3cfb chore: re-add renovate.json (#71) 2022-07-02 01:52:18 -05:00
Evo
9340cf229c refactor(*): use enums for payloadtype & fix type warns (#69)
* refactor(*): use enums and fix type warns

* style: pretty pretty prettier
2022-06-30 00:55:54 -05:00
xxDeveloper
7c97fa9461 chore: Added PR template 🎉 (#67) 2022-06-30 08:45:06 +05:30
xxDeveloper
ef22aca5ff chore: Added issue template for bugs 🎉 (#66)
* chore: 🎉 Added issue template

* chore: Added DiscordJS version

* chore: Added config.yml
2022-06-29 21:06:35 +03:00
Jacob Nguyen
e71b63d261 feat(*)!: improve quality of code, refactorings, QOL intellisense (#64)
* feat: remove unit testing

* feat: make command modules return Awaitable void | unknown

* feat: more clear error for access message or interaction

* feat: make TextCommand and SlashCommand return more specific arg type

* feat: make TextCommand and SlashCommand return more specific arg type

* fix: Remove type reduction to never in onReady.ts

* feat: narrow typings for args Text and SlashCommand x3

* feat: make description optional, default is '...'

* feat: add sern events natively register in sern.init

* feat: remove jest.config.ts

* fix: forget to add SernEvent to Wrapper declaration

* feat: Make name and description defined when making plugins!

* Update README.md

* docs: Highly encourage to use cli

* chore: Improved package.json

* feat: Add .edit method and let .reply accept string

* fix: intellij warnings

* build: update discord.js to latest

* chore(deps): Removed typedoc

Removed typedoc dependency due we won't use it anymore

* fix: Fixed typo at SECURITY.md file

* feat: remove edit context method for future

* feat: remove docs folder

* feat: loading strategy slightly changed, does not throw error on finding no module in file

* feat: change typings of sern emitter

* feat: add generic to readFile.ts buildData, adding different event loading strategies

* feat: add events.ts for more customizable event handling

* refactor: type changes to adjust to event commands

* feat: revamp module types to support event plugins

* feat: rolling out more event loading support

* style: Improved plugin.ts comments

* style: Improved plugin.ts comments

* style: Improved readyEvent.ts comments

* feat: more support for event loading!!

* fix: re add import after rebase

* feat: more event handling progress

* feat: Cleaning up types

* refactor: Cleaning up and adding docs

* feat: Changing types of wrapper for external and sern emitter

* refactor: Adding some type aliases

* feat:  switch to match expression, add docs

* feat: more progress on event handling

* fix: complying to djs v14 build

* feat: Add basic event handling, no plugins checked yet!

* fix: Crash on interactionCreate event

* build(package.json): bump version

* build: bump to 1.0.4-beta

* feat: move new things to top level import

* feat: Separating events from command modules, leads separation of responsibility

* feat: add enum for event modules

* feat: Add more typings for event modules

* feat: Add more plugin definitions

* refactor: add asyncResolveArray.ts to resolve Awaitables easier

* feat: throw error on plugin usage for event listeners

* feat: throw error on plugin usage for event listeners

* feat: change from client -> wrapper

* style: eslint

* style: add comment

* feat: add absPath into commandPlugins!

* build: remove 'tests' exclude

* build: delete test.yml, change .prettierignore

* build: bump version to 1.1.0-beta

* docs(sern.ts): add comments for addExternal

* fix: forgot to add required type property in comment

* fix: load external event emitters correctly

* chore: rebased api update branch (#65)

Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>
Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>

Co-authored-by: xxDeveloper <77380166+Murtatrxx@users.noreply.github.com>
Co-authored-by: Evo <85353424+EvolutionX-10@users.noreply.github.com>
2022-06-28 12:38:01 -05:00
Jacob Nguyen
e677ce0839 fix: Change discord server link (#62) 2022-06-20 21:18:56 +03:00
xxDeveloper
371f9d711a chore: Removed @Murtatrxx from CODEOWNERS (#61) 2022-06-19 19:02:02 -05:00
Jacob Nguyen
a5320dddb9 docs: Highly encourage to use cli 2022-06-02 15:29:44 -05:00
Jacob Nguyen
92b83c8d32 Update README.md 2022-06-02 15:28:40 -05:00
120 changed files with 8204 additions and 26326 deletions

View File

@@ -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
View File

@@ -1,2 +1 @@
src/* @jacoobes
docs/* @Murtatrxx
* @jacoobes

33
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View 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
View 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.

View 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.)

View 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
View File

@@ -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.

View File

@@ -3,8 +3,10 @@ name: "CodeQL"
on:
push:
branches: [ main ]
paths: ["src/**/*"]
pull_request:
branches: [ main ]
paths: ["src/**/*"]
schedule:
- cron: '37 20 * * 4'
@@ -24,14 +26,14 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v1
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v2

View File

@@ -0,0 +1,50 @@
name: Continuous Integration
on:
# Trigger the workflow on push or pull request or custom
push:
branches: [main]
paths:
- '*.ts'
pull_request_target:
branches:
main
paths:
- '*ts'
workflow_dispatch:
jobs:
Prettier:
name: Run Prettier
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3
- name: Set up Node.js
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3
with:
node-version: 17
- name: Install pnpm
run: npm i -g yarn
# Prettier must be in `package.json`
- name: Install Node.js dependencies
run: yarn --immutable
- name: Run Prettier
run: yarn pretty
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v4
with:
commit-message: "style: pretty please"
branch: prettier
delete-branch: true
branch-suffix: short-commit-hash
title: "style: pretty please"
body: "pretty pretty prettier"
reviewers: EvolutionX-10

20
.github/workflows/dependency-review.yml vendored Normal file
View 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@v3
- name: 'Dependency Review'
uses: actions/dependency-review-action@v2

View File

@@ -1,30 +1,18 @@
name: NPM / Publish
on:
release:
types: [created]
workflow_dispatch:
jobs:
build:
test-and-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v3
- uses: actions/setup-node@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: 17
- run: yarn --immutable
- run: yarn build:prod
- uses: JS-DevTools/npm-publish@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
View File

@@ -0,0 +1,14 @@
name: release-please
on:
workflow_dispatch:
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v3
with:
release-type: node
package-name: release-please-action
bump-patch-for-minor-pre-major: true

View File

@@ -1,29 +0,0 @@
name: Test
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
run-tests:
name: Run Tests
runs-on: ubuntu-latest
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

7
.gitignore vendored
View File

@@ -82,5 +82,12 @@ 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

View File

@@ -1,5 +1,4 @@
src/
tsconfig.json
docs/
.gitignore
@@ -9,7 +8,6 @@ logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
@@ -54,6 +52,7 @@ typings/
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
@@ -106,4 +105,12 @@ CODE_OF_CONDUCT.md
babel.config.js
tests/
tsup.config.js
tsconfig-base.json
tsconfig-cjs.json
tsconfig-esm.json
renovate.json

View File

@@ -1 +1,3 @@
README.md
.github/
*.md
dist/

View File

@@ -1,8 +0,0 @@
{
"semi": true,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 4,
"arrowParens": "avoid"
}

873
.yarn/releases/yarn-3.5.0.cjs vendored Normal file

File diff suppressed because one or more lines are too long

5
.yarnrc.yml Normal file
View File

@@ -0,0 +1,5 @@
enableGlobalCache: true
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-3.5.0.cjs

221
CHANGELOG.md Normal file
View File

@@ -0,0 +1,221 @@
# Changelog
## [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))

View File

@@ -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.

View File

@@ -1,6 +1,6 @@
MIT License
**Copyright (c) 2022 Sern**
Copyright (c) 2023 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.

149
README.md
View File

@@ -1,13 +1,35 @@
# 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>
[![License: MIT](https://img.shields.io/badge/License-MIT-blavk.svg)](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" />
<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?
- Most handlers don't support discord.js 14.7+
- Customizable, composable commands
- Plug and play or customize to your liking
- Embraces reactive programming for consistent and reliable backend
- Customizable logger, error handling, and more
- Active development and growing [community](https://sern.dev/discord)
## 👀 Quick Look
## Installation
* Support for discord.js v14 and all interactions
* Hybrid commands
* Lightweight and customizable
* ESM, CommonJS and TypeScript support
* A powerful CLI and awesome community-made plugins
## 📜 Installation
```sh
npm install @sern/handler
@@ -21,63 +43,90 @@ yarn add @sern/handler
pnpm add @sern/handler
```
## Basic Usage
## 👶 Basic Usage
<details open><summary>ping.ts</summary>
#### ` 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>
<details open><summary>modal.ts</summary>
#### ` ping.js (CommonJS)`
```js
const { Sern, CommandType } = require('@sern/handler');
exports.default = {
description: 'A ping pong command',
type: CommandType.Slash,
execute(ctx) {
ctx.reply('pong!');
```ts
export default commandModule({
type: CommandType.Modal,
//Installed a plugin to make sure modal fields pass a validation.
plugins : [
assertFields({
fields: {
name: /^([^0-9]*)$/
},
failure: (errors, modal) => modal.reply('your submission did not pass the validations')
})
],
execute : (modal) => {
modal.reply('thanks for the submission!');
}
};
})
```
</details>
<details open><summary>index.ts</summary>
See our [templates](https://github.com/sern-handler/templates) for TypeScript examples and more
```ts
import { Client, GatewayIntentBits } from 'discord.js';
import { Sern, single, type Dependencies } from '@sern/handler';
## CLI
//client has been declared previously
We are providing a [command line interface](https://github.com/sern-handler/cli) for better & easier bot developement. Don't forget to view it.
interface MyDependencies extends Dependencies {
'@sern/client': Singleton<Client>;
}
export const useContainer = Sern.makeDependencies<MyDependencies>({
build: root => root
.add({ '@sern/client': single(() => client) })
});
## Links
//View docs for all options
Sern.init({
defaultPrefix: '!', // removing defaultPrefix will shut down text commands
commands: 'src/commands',
// events: 'src/events' (optional),
containerConfig : {
get: useContainer
}
});
- [Official Documentation](https://sern-handler.js.org)
- [Support Server](https://discord.com/invite/Yvb7DnqjXX)
client.login("YOUR_BOT_TOKEN_HERE");
```
</details>
## Contribute
## 🤖 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 your favorite artists on Discord.
- [ava](https://github.com/SrIzan10/ava), A discord bot that plays KNGI and Gensokyo Radio.
- [Murayama](https://github.com/murayamabot/murayama), :pepega:
- [Protector (WIP)](https://github.com/needhamgary/Protector), Just a simple bot to help enhance a private minecraft server.
- Read our contribution [guidelines](https://github.com/sern-handler/handler) carefully
## 💻 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.
## 🔗 Links
- [Official Documentation and Guide](https://sern.dev)
- [Support Server](https://sern.dev/discord)
## 👋 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.

View File

@@ -1,3 +0,0 @@
module.exports = {
presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript'],
};

View File

@@ -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.

View File

@@ -1 +0,0 @@
sern-handler.js.org

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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">&lt;</span
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</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">&lt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">boolean</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">CacheType</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol"> | </span
><span class="tsd-signature-type">Message</span><span class="tsd-signature-symbol">&lt;</span
><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">CacheType</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">CacheType</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">unknown</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">unknown</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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>

View File

@@ -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>

View File

@@ -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">&#39;discord.js&#39;</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">&#39;sern-handler&#39;</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">&#39;../src/secrets.json&#39;</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">&#39;dist/commands&#39;</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">&#39;server-id&#39;</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">=&gt;</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">&#39;sern-handler&#39;</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">&#39;ts-results&#39;</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">&#39;A ping pong command&#39;</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">&#39;private&#39;</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">=&gt;</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">&#39;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>

View File

@@ -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&lt;T&gt;</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&lt;T=string&gt;) =&gt; Awaitable&lt;possibleOutput | void&gt;}
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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</span>
</h5>
</li>
</ul>
<h4 class="tsd-returns-title">
Returns <span class="tsd-signature-type">Awaitable</span
><span class="tsd-signature-symbol">&lt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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>

View File

@@ -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) =&gt; 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">&lt;</span><span class="tsd-signature-type">boolean</span
><span class="tsd-signature-symbol">&gt;</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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">&lt;</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">&gt;</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">&lt;</span
><span class="tsd-signature-type">CommandInteraction</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">Message</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">CommandInteraction</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">Message</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span
><span class="tsd-signature-type">CommandInteractionOptionResolver</span
><span class="tsd-signature-symbol">, </span
><span class="tsd-signature-type">&quot;getMessage&quot;</span
><span class="tsd-signature-symbol"> | </span
><span class="tsd-signature-type">&quot;getFocused&quot;</span
><span class="tsd-signature-symbol">&gt;</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">&quot;private&quot;</span><span class="tsd-signature-symbol"> | </span
><span class="tsd-signature-type">&quot;public&quot;</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">&lt;</span><span class="tsd-signature-type">unknown</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">[</span
><a href="../interfaces/Sern.Module.html#execute"
><span class="tsd-signature-type">&quot;execute&quot;</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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</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"> &amp; </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>

View File

@@ -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">&lt;</span
><span class="tsd-signature-type" data-tsd-kind="Type parameter">T</span
><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">:</span>
<span class="tsd-signature-type">Result</span><span class="tsd-signature-symbol">&lt;</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">&gt;</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&lt;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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">boolean</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">boolean</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">number</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">number</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">&gt;</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"> = &#39; &#39;</span>
</h5>
<div class="tsd-comment tsd-typography">
<div class="lead">
<p>default separator = &#39; &#39;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">number</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">number</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">number</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">string</span
><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">number</span
><span class="tsd-signature-symbol">&gt;</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>

View File

@@ -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,
};

18311
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,53 +1,98 @@
{
"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": "3.0.0-rc1",
"description": "A complete, customizable, typesafe, & reactive framework for discord bots.",
"main": "./dist/esm/index.mjs",
"module": "./dist/cjs/index.cjs",
"types": "dist/index.d.ts",
"exports": {
".": {
"import": "./dist/esm/index.mjs",
"require": "./dist/cjs/index.cjs",
"types": "./dist/index.d.ts"
}
},
"scripts": {
"watch": "tsup --watch",
"clean-modules": "rimraf node_modules/ && npm install",
"lint": "eslint src/**/*.ts",
"format": "eslint src/**/*.ts --fix",
"build:dev": "tsup --metafile",
"build:prod": "tsup --minify",
"publish": "npm run build:prod",
"pretty": "prettier --write .",
"tdd": "vitest",
"test": "vitest --run"
},
"keywords": [
"sern-handler",
"sern",
"handler",
"sern handler",
"wrapper",
"discord.js",
"framework"
],
"author": "SernDevs",
"license": "MIT",
"dependencies": {
"iti": "^0.6.0",
"rxjs": "^7.8.0",
"ts-results-es": "^3.6.0"
},
"devDependencies": {
"@faker-js/faker": "^8.0.1",
"@types/node": "^18.15.11",
"@typescript-eslint/eslint-plugin": "5.58.0",
"@typescript-eslint/parser": "5.58.0",
"discord.js": "14.11.0",
"esbuild-ifdef": "^0.2.0",
"eslint": "8.38.0",
"prettier": "2.8.7",
"tsup": "^6.7.0",
"typescript": "5.0.2",
"vitest": "latest"
},
"prettier": {
"semi": true,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 4,
"arrowParens": "avoid"
},
"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"
},
"homepage": "https://sern.dev"
}

14
renovate.json Normal file
View File

@@ -0,0 +1,14 @@
{
"major": {
"dependencyDashboardApproval": true,
"reviewers": ["EvolutionX-10", "jacoobes", "Murtatrxx"]
},
"minor": {
"reviewers": ["jacoobes", "Murtatrxx"]
},
"schedule": ["every weekend"],
"lockFileMaintenance": {
"enabled": true,
"automerge": true
}
}

View File

@@ -0,0 +1,21 @@
/**
* @since 2.0.0
*/
export interface ErrorHandling {
/**
* Number of times the process should throw an error until crashing and exiting
*/
keepAlive: number;
/**
* @deprecated
* Version 4 will remove this method
*/
crash(err :Error) : never
/**
* A function that is called on every crash. Updates keepAlive.
* If keepAlive is 0, the process crashes.
* @param error
*/
updateAlive(error: Error): void;
}

View File

@@ -0,0 +1,5 @@
export * from './error-handling';
export * from './logging';
export * from './module-manager';
export * from './module-store';
export * from './init';

View File

@@ -0,0 +1,9 @@
import { Awaitable } from '../../shared';
/**
* Represents an initialization contract.
* Let dependencies implement this to initiate some logic.
*/
export interface Init {
init(): Awaitable<unknown>;
}

View File

@@ -0,0 +1,11 @@
/**
* @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 };

View File

@@ -0,0 +1,14 @@
import { CommandType } from '../structures';
import { CommandMeta, CommandModule, CommandModuleDefs, Module } from '../types/modules';
/**
* @since 2.0.0
*/
export interface ModuleManager {
get(id: string): string | undefined;
getMetadata(m: Module): CommandMeta|undefined;
setMetadata(m: Module, c: CommandMeta): void;
set(id: string, path: string): void;
getPublishableCommands(): Promise<CommandModule[]>;
getByNameCommandType<T extends CommandType>(name: string, commandType: T): Promise<CommandModuleDefs[T]>|undefined;
}

View File

@@ -0,0 +1,9 @@
import { CommandMeta, Module } from '../types/modules';
/**
* Represents a core module store that stores IDs mapped to file paths.
*/
export interface CoreModuleStore {
commands: Map<string, string>;
metadata: WeakMap<Module, CommandMeta>;
}

View File

@@ -0,0 +1,62 @@
import { CommandType, EventType, PluginType } from './structures';
import type { Plugin, PluginResult, EventArgs, CommandArgs } from './types/plugins';
import type { ClientEvents } from 'discord.js';
export function makePlugin<V extends unknown[]>(
type: PluginType,
execute: (...args: any[]) => any,
): Plugin<V> {
return {
type,
execute,
} as Plugin<V>;
}
/**
* @since 2.5.0
* @__PURE__
*/
export function EventInitPlugin<I extends EventType>(
execute: (...args: EventArgs<I, PluginType.Init>) => PluginResult,
) {
return makePlugin(PluginType.Init, execute);
}
/**
* @since 2.5.0
* @__PURE__
*/
export function CommandInitPlugin<I extends CommandType>(
execute: (...args: CommandArgs<I, PluginType.Init>) => PluginResult,
) {
return makePlugin(PluginType.Init, execute);
}
/**
* @since 2.5.0
* @__PURE__
*/
export function CommandControlPlugin<I extends CommandType>(
execute: (...args: CommandArgs<I, PluginType.Control>) => PluginResult,
) {
return makePlugin(PluginType.Control, execute);
}
/**
* @since 2.5.0
* @__PURE__
*/
export function EventControlPlugin<I extends EventType>(
execute: (...args: EventArgs<I, PluginType.Control>) => PluginResult,
) {
return makePlugin(PluginType.Control, execute);
}
/**
* @since 2.5.0
* @Experimental
* A specialized function for creating control plugins with discord.js ClientEvents.
* Will probably be moved one day!
*/
export function DiscordEventControlPlugin<T extends keyof ClientEvents>(
name: T,
execute: (...args: ClientEvents[T]) => PluginResult,
) {
return makePlugin(PluginType.Control, execute);
}

66
src/core/functions.ts Normal file
View File

@@ -0,0 +1,66 @@
import { Err, Ok } from 'ts-results-es';
import { ApplicationCommandOptionType, AutocompleteInteraction } from 'discord.js';
import type { SernAutocompleteData, SernOptionsData } from './types/modules';
import { AnyCommandPlugin, AnyEventPlugin, Plugin } from './types/plugins';
import { PluginType } from './structures';
//function wrappers for empty ok / err
export const ok = /* @__PURE__*/ () => Ok.EMPTY;
export const err = /* @__PURE__*/ () => Err.EMPTY;
export function partitionPlugins(
arr: (AnyEventPlugin | AnyCommandPlugin)[] = [],
): [Plugin[], Plugin[]] {
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];
}
/**
* Uses an iterative DFS to check if an autocomplete node exists on the option tree
* @param iAutocomplete
* @param options
*/
export function treeSearch(
iAutocomplete: AutocompleteInteraction,
options: SernOptionsData[] | undefined,
): SernAutocompleteData | undefined {
if (options === undefined) return undefined;
const _options = options.slice(); // required to prevent direct mutation of options
let autocompleteData: SernAutocompleteData | undefined;
while (_options.length > 0) {
const cur = _options.pop()!;
switch (cur.type) {
case ApplicationCommandOptionType.Subcommand:
case ApplicationCommandOptionType.SubcommandGroup:
{
for (const option of cur.options ?? []) {
_options.push(option);
}
}
break;
default:
{
if (cur.autocomplete) {
const choice = iAutocomplete.options.getFocused(true);
if (cur.name === choice.name && cur.autocomplete) {
autocompleteData = cur;
}
}
}
break;
}
}
return autocompleteData;
}

28
src/core/index.ts Normal file
View File

@@ -0,0 +1,28 @@
export * from './contracts';
export * from './create-plugins';
export * from './structures';
export * from './ioc';
export type {
CommandModule,
EventModule,
BothCommand,
ContextMenuMsg,
ContextMenuUser,
SlashCommand,
TextCommand,
ButtonCommand,
StringSelectCommand,
MentionableSelectCommand,
UserSelectCommand,
ChannelSelectCommand,
RoleSelectCommand,
ModalSubmitCommand,
DiscordEventCommand,
SernEventCommand,
ExternalEventCommand,
CommandModuleDefs,
EventModuleDefs,
SernAutocompleteData,
SernOptionsData,
} from './types/modules';
export type { Controller, PluginResult, InitPlugin, ControlPlugin, Plugin } from './types/plugins';

34
src/core/ioc/base.ts Normal file
View File

@@ -0,0 +1,34 @@
import * as assert from 'assert';
import { composeRoot, useContainer } from './dependency-injection';
import { DependencyConfiguration } from './types';
import { CoreContainer } from '../structures/container';
//SIDE EFFECT: GLOBAL DI
let containerSubject: CoreContainer<Partial<Dependencies>>;
/**
* Returns the underlying data structure holding all dependencies.
* Exposes methods from iti
*/
export function useContainerRaw() {
assert.ok(
containerSubject && containerSubject.isReady(),
"Could not find container or container wasn't ready. Did you call makeDependencies?",
);
return containerSubject;
}
/**
* @since 2.0.0
* @param conf a configuration for creating your project dependencies
*/
export async function makeDependencies<const T extends Dependencies>(
conf: DependencyConfiguration,
) {
//Until there are more optional dependencies, just check if the logger exists
//SIDE EFFECT
containerSubject = new CoreContainer();
await composeRoot(containerSubject, conf);
return useContainer<T>();
}

16
src/core/ioc/dependencies.d.ts vendored Normal file
View File

@@ -0,0 +1,16 @@
// 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 './types'
declare global {
interface Dependencies extends CoreDependencies {}
}

View File

@@ -0,0 +1,80 @@
import type {
CoreDependencies,
DependencyConfiguration,
IntoDependencies,
} from './types';
import { DefaultLogging } from '../structures';
import { SernError } from '../structures/errors';
import { useContainerRaw } from './base';
import { CoreContainer } from '../structures/container';
/**
* @__PURE__
* @since 2.0.0.
* Creates a singleton object.
* @param cb
*/
export function single<T>(cb: () => T) {
return cb;
}
/**
* @__PURE__
* @since 2.0.0
* Creates a transient object
* @param cb
*/
export function transient<T>(cb: () => () => T) {
return cb;
}
export function Service<const T extends keyof Dependencies>(key: T) {
return useContainerRaw().get(key)!;
}
export function Services<const T extends (keyof Dependencies)[]>(...keys: [...T]) {
const container = useContainerRaw();
return keys.map(k => container.get(k)!) as IntoDependencies<T>;
}
/**
* Given the user's conf, check for any excluded dependency keys.
* Then, call conf.build to get the rest of the users' dependencies.
* Finally, update the containerSubject with the new container state
* @param conf
*/
export async function composeRoot(
container: CoreContainer<Partial<Dependencies>>,
conf: DependencyConfiguration,
) {
//container should have no client or logger yet.
const hasLogger = conf.exclude?.has('@sern/logger');
if (!hasLogger) {
container.upsert({
'@sern/logger': () => new DefaultLogging(),
});
}
//Build the container based on the callback provided by the user
conf.build(container as CoreContainer<Omit<CoreDependencies, '@sern/client'>>);
try {
container.get('@sern/client');
} catch {
throw new Error(SernError.MissingRequired + ' No client was provided');
}
if (!hasLogger) {
container.get('@sern/logger')?.info({ message: 'All dependencies loaded successfully.' });
}
container.ready();
}
export function useContainer<const T extends Dependencies>() {
console.warn(`
Warning: using a container hook (useContainer) is not recommended.
Could lead to many unwanted side effects.
Use the new Service(s) api function instead.
`);
return <V extends (keyof T)[]>(...keys: [...V]) =>
keys.map(key => useContainerRaw().get(key as keyof Dependencies)) as IntoDependencies<V>;
}

3
src/core/ioc/index.ts Normal file
View File

@@ -0,0 +1,3 @@
export { useContainerRaw, makeDependencies } from './base';
export { Service, Services, single, transient } from './dependency-injection';
export type { Singleton, Transient, CoreDependencies } from './types';

26
src/core/ioc/types.ts Normal file
View File

@@ -0,0 +1,26 @@
import { EventEmitter } from 'node:events';
import { Container, UnpackFunction } from 'iti';
export type Singleton<T> = () => T;
export type Transient<T> = () => () => T;
export interface CoreDependencies {
'@sern/client': () => EventEmitter
'@sern/logger'?: () => import('../contracts').Logging;
'@sern/emitter': () => import('../structures/sern-emitter').SernEmitter;
'@sern/store': () => import('../contracts').CoreModuleStore;
'@sern/modules': () => import('../contracts').ModuleManager;
'@sern/errors': () => import('../contracts').ErrorHandling;
}
export type DependencyFromKey<T extends keyof Dependencies> = Dependencies[T];
export type IntoDependencies<Tuple extends [...any[]]> = {
[Index in keyof Tuple]: UnpackFunction<DependencyFromKey<Tuple[Index]> & {}>; //Unpack and make NonNullable
} & { length: Tuple['length'] };
export interface DependencyConfiguration {
//@deprecated. Loggers will always be included in the future
exclude?: Set<'@sern/logger'>;
build: (root: Container<Omit<CoreDependencies, '@sern/client'>, {}>) => Container<Dependencies, {}>;
}

103
src/core/module-loading.ts Normal file
View File

@@ -0,0 +1,103 @@
import { SernError } from './structures/errors';
import { Result, Err, Ok } from 'ts-results-es';
import { Module } from './types/modules';
import { type Observable, from, mergeMap, ObservableInput } from 'rxjs';
import { readdir, stat } from 'fs/promises';
import { basename, extname, join, resolve } from 'path';
import { ImportPayload } from '../handler/types';
export type ModuleResult<T> = Promise<Result<ImportPayload<T>, SernError>>;
export async function importModule<T>(absPath: string) {
// prettier-ignore
let module =
/// #if MODE === 'esm'
import(absPath).then(i => i.default); // eslint-disable-line
/// #elif MODE === 'cjs'
require(absPath).default; // eslint-disable-line
/// #endif
return module.then(m =>
Result
.wrap(() => m.getInstance())
.unwrapOr(m)
) as T;
}
export async function defaultModuleLoader<T extends Module>(absPath: string): ModuleResult<T> {
let module = await importModule<T>(absPath);
if (module === undefined) {
return Err(SernError.UndefinedModule);
}
//todo readd class modules
return Ok({ module, absPath });
}
export const fmtFileName = (n: string) => n.substring(0, n.length - 3);
/**
* a directory string is converted into a stream of modules.
* starts the stream of modules that sern needs to process on init
* @returns {Observable<{ mod: Module; absPath: string; }[]>} data from command files
* @param commandDir
*/
export function buildModuleStream<T extends Module>(
input: ObservableInput<string>,
): Observable<Result<ImportPayload<T>, SernError>> {
return from(input).pipe(mergeMap(defaultModuleLoader<T>));
}
export function getFullPathTree(dir: string, mode: boolean) {
return readPaths(resolve(dir), mode);
}
export function filename(path: string) {
return fmtFileName(basename(path));
}
function createSkipCondition(base: string) {
const validExtensions = ['.js', '.cjs', '.mts', '.mjs', 'cts'];
return ( type: 'file' | 'directory') => {
if(type === 'file') {
return fmtFileName(base)[0] === '!'
|| !validExtensions.includes(extname(base));
}
return base[0] === '!';
}
}
async function deriveFileInfo(dir: string, file: string) {
const fullPath = join(dir, file);
return {
fullPath,
fileStats: await stat(fullPath),
base: basename(file)
}
}
async function* readPaths(dir: string, shouldDebug: boolean): AsyncGenerator<string> {
try {
const files = await readdir(dir);
for (const file of files) {
const { fullPath, fileStats, base } = await deriveFileInfo(dir, file);
const isSkippable = createSkipCondition(base);
if (fileStats.isDirectory()) {
//Todo: refactor so that i dont repeat myself for files (line 71)
if (isSkippable('directory')) {
if (shouldDebug) console.info(`ignored directory: ${fullPath}`);
} else {
yield* readPaths(fullPath, shouldDebug);
}
} else {
if (isSkippable('file')) {
if (shouldDebug) console.info(`ignored: ${fullPath}`);
} else {
/// #if MODE === 'esm'
yield 'file:///' + fullPath;
/// #elif MODE === 'cjs'
yield fullPath;
/// #endif
}
}
}
} catch (err) {
throw err;
}
}

106
src/core/operators.ts Normal file
View File

@@ -0,0 +1,106 @@
/**
* This file holds sern's rxjs operators used for processing data.
* Each function should be modular and testable, not bound to discord / sern
* and independent of each other.
*/
import {
concatMap,
defaultIfEmpty,
EMPTY,
every,
fromEvent,
map,
Observable,
of,
OperatorFunction,
pipe,
share,
switchMap,
} from 'rxjs';
import { Result } from 'ts-results-es';
import { EventEmitter } from 'node:events';
import { ErrorHandling, Logging } from './contracts';
import util from 'node:util';
import { Awaitable } from '../shared';
import { PluginResult, VoidResult } from './types/plugins';
/**
* if {src} is true, mapTo V, else ignore
* @param item
*/
export function filterMapTo<V>(item: () => V): OperatorFunction<boolean, V> {
return concatMap(shouldKeep => (shouldKeep ? of(item()) : EMPTY));
}
export function filterMap<In, Out>(
cb: (i: In) => Awaitable<Result<Out, unknown>>,
): OperatorFunction<In, Out> {
return pipe(
switchMap(async input => cb(input)),
concatMap(s => {
if (s.ok) {
return of(s.val);
}
return EMPTY;
}),
);
}
/**
* Calls any plugin with {args}.
* @param args if an array, its spread and plugin called.
*/
export function callPlugin(args: unknown): OperatorFunction<
{
execute: (...args: unknown[]) => PluginResult;
},
VoidResult
> {
return concatMap(async plugin => {
if (Array.isArray(args)) {
return plugin.execute(...args);
}
return plugin.execute(args);
});
}
export const arrayifySource = map(src => (Array.isArray(src) ? (src as unknown[]) : [src]));
/**
* If the current value in Result stream is an error, calls callback.
* This also extracts the Ok value from Result
* @param cb
* @returns Observable<{ module: T; absPath: string }>
*/
export function errTap<Ok, Err>(cb: (err: Err) => void): OperatorFunction<Result<Ok, Err>, Ok> {
return concatMap(result => {
if (result.ok) {
return of(result.val);
} else {
cb(result.val as Err);
return EMPTY;
}
});
}
/**
* Checks if the stream of results is all ok.
*/
export const everyPluginOk: OperatorFunction<VoidResult, boolean> = pipe(
every(result => result.ok),
defaultIfEmpty(true),
);
export const sharedObservable = <T>(e: EventEmitter, eventName: string) => {
return (fromEvent(e, eventName) as Observable<T>).pipe(share());
};
export function handleError<C>(crashHandler: ErrorHandling, logging?: Logging) {
return (pload: unknown, caught: Observable<C>) => {
// This is done to fit the ErrorHandling contract
const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true }));
//formatted payload
logging?.error({ message: util.inspect(pload) });
crashHandler.updateAlive(err);
return caught;
};
}

34
src/core/predicates.ts Normal file
View File

@@ -0,0 +1,34 @@
import {
AnySelectMenuInteraction,
AutocompleteInteraction,
ButtonInteraction,
ChatInputCommandInteraction,
MessageContextMenuCommandInteraction,
ModalSubmitInteraction,
UserContextMenuCommandInteraction,
} from 'discord.js';
import { InteractionType } from 'discord.js';
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 isAutocomplete(i: InteractionTypable): i is AutocompleteInteraction {
return i.type === InteractionType.ApplicationCommandAutocomplete;
}
export function isModal(i: InteractionTypable): i is ModalSubmitInteraction {
return i.type === InteractionType.ModalSubmit;
}

View File

@@ -0,0 +1,62 @@
import { Container } from 'iti';
import { DefaultErrorHandling, DefaultModuleManager, SernEmitter } from '../';
import { isAsyncFunction } from 'node:util/types';
import * as assert from 'node:assert';
import { Subject } from 'rxjs';
import { ModuleStore } from './module-store';
/**
* Provides all the defaults for sern to function properly.
* The only user provided dependency needs to be @sern/client
*/
export class CoreContainer<T extends Partial<Dependencies>> extends Container<T, {}> {
private ready$ = new Subject<never>();
constructor() {
super();
this.listenForInsertions();
(this as Container<{}, {}>)
.add({
'@sern/errors': () => new DefaultErrorHandling(),
'@sern/emitter': () => new SernEmitter(),
'@sern/store': () => new ModuleStore(),
})
.add(ctx => {
return { '@sern/modules': () => new DefaultModuleManager(ctx['@sern/store']) };
});
}
private listenForInsertions() {
assert.ok(
!this.isReady(),
'listening for init functions should only occur prior to sern being ready.',
);
const unsubscriber = this.on('containerUpserted', this.callInitHooks);
this.ready$.subscribe({
complete: unsubscriber,
});
}
private async callInitHooks(e: { key: keyof T; newContainer: T[keyof T] | null }) {
const dep = e.newContainer;
assert.ok(dep);
//Ignore any dependencies that are not objects or array
if (typeof dep !== 'object' || Array.isArray(dep)) {
return;
}
if ('init' in dep && typeof dep.init === 'function') {
isAsyncFunction(dep.init) ? await dep.init() : dep.init();
}
}
isReady() {
return this.ready$.closed;
}
ready() {
this.ready$.unsubscribe();
}
}

View File

@@ -0,0 +1,94 @@
import {
BaseInteraction,
ChatInputCommandInteraction,
Client,
InteractionReplyOptions,
Message,
MessageReplyOptions,
Snowflake,
User,
} from 'discord.js';
import { CoreContext } from './core-context';
import { Result, Ok, Err } from 'ts-results-es';
import * as assert from 'assert';
import { ReplyOptions } from '../../shared';
/**
* @since 1.0.0
* Provides values shared between
* Message and ChatInputCommandInteraction
*/
export class Context extends CoreContext<Message, ChatInputCommandInteraction> {
/*
* @Experimental
*/
get options() {
return this.interaction.options;
}
protected constructor(protected ctx: Result<Message, ChatInputCommandInteraction>) {
super(ctx);
}
public get id(): Snowflake {
return this.ctx.val.id;
}
public get channel() {
return this.ctx.val.channel;
}
/**
* If context is holding a message, message.author
* else, interaction.user
*/
public get user(): User {
return safeUnwrap(this.ctx.map(m => m.author).mapErr(i => i.user));
}
public get createdTimestamp(): number {
return this.ctx.val.createdTimestamp;
}
public get guild() {
return this.ctx.val.guild;
}
public get guildId() {
return this.ctx.val.guildId;
}
/*
* interactions can return APIGuildMember if the guild it is emitted from is not cached
*/
public get member() {
return this.ctx.val.member;
}
public get client(): Client {
return this.ctx.val.client;
}
public get inGuild(): boolean {
return this.ctx.val.inGuild();
}
public async reply(content: ReplyOptions) {
return safeUnwrap(
this.ctx
.map(m => m.reply(content as string | MessageReplyOptions))
.mapErr(i =>
i.reply(content as string | InteractionReplyOptions).then(() => i.fetchReply()),
),
);
}
static override wrap(wrappable: BaseInteraction | Message): Context {
if ('interaction' in wrappable) {
return new Context(Ok(wrappable));
}
assert.ok(wrappable.isChatInputCommand());
return new Context(Err(wrappable));
}
}
function safeUnwrap<T>(res: Result<T, T>) {
return res.val;
}

View File

@@ -0,0 +1,34 @@
import { Result as Either } from 'ts-results-es';
import { SernError } from './errors';
import * as assert from 'node:assert';
/**
* @since 3.0.0
*/
export abstract class CoreContext<M, I> {
protected constructor(protected ctx: Either<M, I>) {
assert.ok(typeof ctx.val === 'object' && ctx.val != null);
}
get message(): M {
return this.ctx.expect(SernError.MismatchEvent);
}
get interaction(): I {
return this.ctx.expectErr(SernError.MismatchEvent);
}
public isMessage(): this is CoreContext<M, never> {
return this.ctx.ok;
}
public isSlash(): this is CoreContext<never, I> {
return !this.isMessage();
}
//todo: add agnostic options resolver for Context
abstract get options(): unknown;
abstract get id(): string;
static wrap(_: unknown): unknown {
throw Error('You need to override this method; cannot wrap an abstract class');
}
}

View File

@@ -0,0 +1,103 @@
/**
* @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,
ChannelSelect = 1 << 7,
MentionableSelect = 1 << 8,
RoleSelect = 1 << 9,
UserSelect = 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 = 1,
/**
* The EventType for handling sern events
*/
Sern = 2,
/**
* The EventType for handling external events.
* Could be for example, `process` events, database events
*/
External = 3,
}
/**
* 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,
}
/**
* @enum { string }
*/
export enum PayloadType {
/**
* The PayloadType for a SernEmitter success event
*/
Success = 'success',
/**
* The PayloadType for a SernEmitter failure event
*/
Failure = 'failure',
/**
* The PayloadType for a SernEmitter warning event
*/
Warning = 'warning',
}

View File

@@ -0,0 +1,38 @@
/**
* @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`,
}

View File

@@ -0,0 +1,5 @@
export * from './enums';
export * from './context';
export * from './sern-emitter';
export * from './services';
export * from './module-store';

View File

@@ -0,0 +1,12 @@
import { CoreModuleStore } from '../contracts';
import { Module, CommandMeta } from '../types/modules';
/*
* @internal
* Version 4.0.0 will internalize this api. Please refrain from using ModuleStore!
* For interacting with modules, use the ModuleManager instead.
*/
export class ModuleStore implements CoreModuleStore {
metadata = new WeakMap<Module, CommandMeta>();
commands = new Map<string, string>();
}

View File

@@ -0,0 +1,89 @@
import { EventEmitter } from 'node:events';
import { PayloadType } from '../../core/structures';
import { Payload, SernEventsMapping } from '../../shared';
import { Module } from '../types/modules';
/**
* @since 1.0.0
*/
export class SernEmitter extends EventEmitter {
constructor() {
super({ captureRejections: true });
}
/**
* 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);
}
private static payload<T extends Payload>(
type: PayloadType,
module?: Module,
reason?: unknown,
) {
return { type, module, reason } as T;
}
/**
* Creates a compliant SernEmitter failure payload
* @param module
* @param reason
*/
static failure(module?: Module, reason?: unknown) {
//The generic cast Payload & { type : PayloadType.* } coerces the type to be a failure payload
// same goes to the other methods below
return SernEmitter.payload<Payload & { type: PayloadType.Failure }>(
PayloadType.Failure,
module,
reason,
);
}
/**
* Creates a compliant SernEmitter module success payload
* @param module
*/
static success(module: Module) {
return SernEmitter.payload<Payload & { type: PayloadType.Success }>(
PayloadType.Success,
module,
);
}
/**
* Creates a compliant SernEmitter module warning payload
* @param reason
*/
static warning(reason: unknown) {
return SernEmitter.payload<Payload & { type: PayloadType.Warning }>(
PayloadType.Warning,
undefined,
reason,
);
}
}

View File

@@ -0,0 +1,22 @@
import { ErrorHandling } from '../../contracts';
/**
* @internal
* @since 2.0.0
* Version 4.0.0 will internalize this api. Please refrain from using ModuleStore!
*/
export class DefaultErrorHandling implements ErrorHandling {
crash(err: Error): never {
throw err;
}
keepAlive = 5;
updateAlive(err: Error) {
this.keepAlive--;
if(this.keepAlive === 0) {
throw err;
}
}
}

View File

@@ -0,0 +1,3 @@
export * from './error-handling';
export * from './logger';
export * from './module-manager';

View File

@@ -0,0 +1,25 @@
import { LogPayload, Logging } from '../../contracts';
/**
* @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 = () => 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}`);
}
}

View File

@@ -0,0 +1,51 @@
import { createId } from '../../../handler/id';
import { CoreModuleStore, ModuleManager } from '../../contracts';
import { importModule } from '../../module-loading';
import { CommandMeta, CommandModule, CommandModuleDefs, Module } from '../../types/modules';
import { CommandType } from '../enums';
/**
* @internal
* @since 2.0.0
* Version 4.0.0 will internalize this api. Please refrain from using DefaultModuleManager!
*/
export class DefaultModuleManager implements ModuleManager {
constructor(private moduleStore: CoreModuleStore) {}
getByNameCommandType<T extends CommandType>(name: string, commandType: T) {
const id = this.get(createId(name, commandType));
if(!id) {
return undefined;
}
return importModule<CommandModuleDefs[T]>(id);
}
setMetadata(m: Module, c: CommandMeta): void {
this.moduleStore.metadata.set(m, c);
}
getMetadata(m: Module): CommandMeta {
const maybeModule = this.moduleStore.metadata.get(m);
if (!maybeModule) {
throw Error('Could not find metadata in store for ' + maybeModule);
}
return maybeModule;
}
get(id: string) {
return this.moduleStore.commands.get(id);
}
set(id: string, path: string): void {
this.moduleStore.commands.set(id, path);
}
//not tested
getPublishableCommands(): Promise<CommandModule[]> {
const entries = this.moduleStore.commands.entries();
const publishable = 0b000000110;
return Promise.all(
Array.from(entries)
.filter(([id]) => !(Number.parseInt(id.at(-1)!) & publishable))
.map(([, path]) => importModule<CommandModule>(path)),
);
}
}

217
src/core/types/modules.ts Normal file
View File

@@ -0,0 +1,217 @@
import type {
APIApplicationCommandBasicOption,
APIApplicationCommandOptionBase,
ApplicationCommandOptionType,
BaseApplicationCommandOptionsData,
} from 'discord.js';
import {
AutocompleteInteraction,
ButtonInteraction,
ChannelSelectMenuInteraction,
ClientEvents,
MentionableSelectMenuInteraction,
MessageContextMenuCommandInteraction,
ModalSubmitInteraction,
RoleSelectMenuInteraction,
StringSelectMenuInteraction,
UserContextMenuCommandInteraction,
UserSelectMenuInteraction,
} from 'discord.js';
import { CommandType, Context, EventType } from '../structures';
import { AnyCommandPlugin, AnyEventPlugin, ControlPlugin, InitPlugin } from './plugins';
import { Awaitable, SernEventsMapping } from '../../shared';
import { Processed } from '../../handler/types';
import { Args, SlashOptions } from '../../shared';
export interface CommandMeta {
fullPath: string;
id: string;
isClass: boolean
}
export type AnyDefinedModule = Processed<CommandModule | EventModule>;
export interface Module {
type: CommandType | EventType;
name?: string;
onEvent: ControlPlugin[];
plugins: InitPlugin[];
description?: string;
execute: (...args: any[]) => Awaitable<any>;
}
export interface SernEventCommand<T extends keyof SernEventsMapping = keyof SernEventsMapping>
extends Module {
name?: T;
type: EventType.Sern;
execute(...args: SernEventsMapping[T]): Awaitable<unknown>;
}
export interface ExternalEventCommand extends Module {
name?: string;
emitter: keyof Dependencies;
type: EventType.External;
execute(...args: unknown[]): Awaitable<unknown>;
}
export interface ContextMenuUser extends Module {
type: CommandType.CtxUser;
execute: (ctx: UserContextMenuCommandInteraction) => Awaitable<unknown>;
}
export interface ContextMenuMsg extends Module {
type: CommandType.CtxMsg;
execute: (ctx: MessageContextMenuCommandInteraction) => Awaitable<unknown>;
}
export interface ButtonCommand extends Module {
type: CommandType.Button;
execute: (ctx: ButtonInteraction) => Awaitable<unknown>;
}
export interface StringSelectCommand extends Module {
type: CommandType.StringSelect;
execute: (ctx: StringSelectMenuInteraction) => Awaitable<unknown>;
}
export interface ChannelSelectCommand extends Module {
type: CommandType.ChannelSelect;
execute: (ctx: ChannelSelectMenuInteraction) => Awaitable<unknown>;
}
export interface RoleSelectCommand extends Module {
type: CommandType.RoleSelect;
execute: (ctx: RoleSelectMenuInteraction) => Awaitable<unknown>;
}
export interface MentionableSelectCommand extends Module {
type: CommandType.MentionableSelect;
execute: (ctx: MentionableSelectMenuInteraction) => Awaitable<unknown>;
}
export interface UserSelectCommand extends Module {
type: CommandType.UserSelect;
execute: (ctx: UserSelectMenuInteraction) => Awaitable<unknown>;
}
export interface ModalSubmitCommand extends Module {
type: CommandType.Modal;
execute: (ctx: ModalSubmitInteraction) => Awaitable<unknown>;
}
export interface AutocompleteCommand
extends Omit<Module, 'name' | 'type' | 'plugins' | 'description'> {
onEvent: ControlPlugin[];
execute: (ctx: AutocompleteInteraction) => Awaitable<unknown>;
}
export interface DiscordEventCommand<T extends keyof ClientEvents = keyof ClientEvents>
extends Module {
name?: T;
type: EventType.Discord;
execute(...args: ClientEvents[T]): Awaitable<unknown>;
}
export interface TextCommand extends Module {
type: CommandType.Text;
alias?: string[];
execute: (ctx: Context, args: ['text', string[]]) => Awaitable<unknown>;
}
export interface SlashCommand extends Module {
type: CommandType.Slash;
description: string;
options?: SernOptionsData[];
execute: (ctx: Context, args: ['slash', SlashOptions]) => Awaitable<unknown>;
}
export interface BothCommand extends Module {
type: CommandType.Both;
alias?: string[];
description: string;
options?: SernOptionsData[];
execute: (ctx: Context, args: Args) => Awaitable<unknown>;
}
export type EventModule = DiscordEventCommand | SernEventCommand | ExternalEventCommand;
export type CommandModule =
| TextCommand
| SlashCommand
| BothCommand
| ContextMenuUser
| ContextMenuMsg
| ButtonCommand
| StringSelectCommand
| MentionableSelectCommand
| UserSelectCommand
| ChannelSelectCommand
| RoleSelectCommand
| ModalSubmitCommand;
export type AnyModule = CommandModule | EventModule;
//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 {
[EventType.Sern]: SernEventCommand;
[EventType.Discord]: DiscordEventCommand;
[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'>;
};
type EventModulesNoPlugins = {
[T in EventType]: Omit<EventModuleDefs[T], 'plugins' | 'onEvent'>;
};
export type InputEvent = {
[T in EventType]: EventModulesNoPlugins[T] & { plugins?: AnyEventPlugin[] };
}[EventType];
export type InputCommand = {
[T in CommandType]: CommandModuleNoPlugins[T] & { plugins?: AnyCommandPlugin[] };
}[CommandType];
/**
* 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[];
}

148
src/core/types/plugins.ts Normal file
View File

@@ -0,0 +1,148 @@
/*
* 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 { Err, Ok, Result } from 'ts-results-es';
import type {
BothCommand,
ButtonCommand,
ChannelSelectCommand,
CommandModule,
ContextMenuMsg,
ContextMenuUser,
DiscordEventCommand,
EventModule,
ExternalEventCommand,
MentionableSelectCommand,
ModalSubmitCommand,
RoleSelectCommand,
SernEventCommand,
SlashCommand,
StringSelectCommand,
TextCommand,
UserSelectCommand,
} from './modules';
import { Args, Awaitable, Payload, SlashOptions } from '../../shared';
import { CommandType, Context, EventType, PluginType } from '../structures';
import { InitArgs, Processed } from '../../handler/types';
import {
ButtonInteraction,
ChannelSelectMenuInteraction,
ClientEvents,
MentionableSelectMenuInteraction,
MessageContextMenuCommandInteraction,
ModalSubmitInteraction,
RoleSelectMenuInteraction,
StringSelectMenuInteraction,
UserContextMenuCommandInteraction,
UserSelectMenuInteraction,
} from 'discord.js';
export type PluginResult = Awaitable<VoidResult>;
export type VoidResult = Result<void, void>;
export interface Controller {
next: () => Ok<void>;
stop: () => Err<void>;
}
export interface Plugin<Args extends any[] = any[]> {
type: PluginType;
execute: (...args: Args) => PluginResult;
}
export interface InitPlugin<Args extends any[] = any[]> {
type: PluginType.Init;
execute: (...args: Args) => PluginResult;
}
export interface ControlPlugin<Args extends any[] = any[]> {
type: PluginType.Control;
execute: (...args: Args) => PluginResult;
}
export type AnyCommandPlugin = ControlPlugin | InitPlugin<[InitArgs<Processed<CommandModule>>]>;
export type AnyEventPlugin = ControlPlugin | InitPlugin<[InitArgs<Processed<EventModule>>]>;
export type CommandArgs<
I extends CommandType = CommandType,
J extends PluginType = PluginType,
> = CommandArgsMatrix[I][J];
export type EventArgs<
I extends EventType = EventType,
J extends PluginType = PluginType,
> = EventArgsMatrix[I][J];
interface CommandArgsMatrix {
[CommandType.Text]: {
[PluginType.Control]: [Context, ['text', string[]]];
[PluginType.Init]: [InitArgs<Processed<TextCommand>>];
};
[CommandType.Slash]: {
[PluginType.Control]: [Context, ['slash', /* library coupled */ SlashOptions]];
[PluginType.Init]: [InitArgs<Processed<SlashCommand>>];
};
[CommandType.Both]: {
[PluginType.Control]: [Context, Args];
[PluginType.Init]: [InitArgs<Processed<BothCommand>>];
};
[CommandType.CtxMsg]: {
[PluginType.Control]: [/* library coupled */ MessageContextMenuCommandInteraction];
[PluginType.Init]: [InitArgs<Processed<ContextMenuMsg>>];
};
[CommandType.CtxUser]: {
[PluginType.Control]: [/* library coupled */ UserContextMenuCommandInteraction];
[PluginType.Init]: [InitArgs<Processed<ContextMenuUser>>];
};
[CommandType.Button]: {
[PluginType.Control]: [/* library coupled */ ButtonInteraction];
[PluginType.Init]: [InitArgs<Processed<ButtonCommand>>];
};
[CommandType.StringSelect]: {
[PluginType.Control]: [/* library coupled */ StringSelectMenuInteraction];
[PluginType.Init]: [InitArgs<Processed<StringSelectCommand>>];
};
[CommandType.RoleSelect]: {
[PluginType.Control]: [/* library coupled */ RoleSelectMenuInteraction];
[PluginType.Init]: [InitArgs<Processed<RoleSelectCommand>>];
};
[CommandType.ChannelSelect]: {
[PluginType.Control]: [/* library coupled */ ChannelSelectMenuInteraction];
[PluginType.Init]: [InitArgs<Processed<ChannelSelectCommand>>];
};
[CommandType.MentionableSelect]: {
[PluginType.Control]: [/* library coupled */ MentionableSelectMenuInteraction];
[PluginType.Init]: [InitArgs<Processed<MentionableSelectCommand>>];
};
[CommandType.UserSelect]: {
[PluginType.Control]: [/* library coupled */ UserSelectMenuInteraction];
[PluginType.Init]: [InitArgs<Processed<UserSelectCommand>>];
};
[CommandType.Modal]: {
[PluginType.Control]: [/* library coupled */ ModalSubmitInteraction];
[PluginType.Init]: [InitArgs<Processed<ModalSubmitCommand>>];
};
}
interface EventArgsMatrix {
[EventType.Discord]: {
[PluginType.Control]: /* library coupled */ ClientEvents[keyof ClientEvents];
[PluginType.Init]: [InitArgs<Processed<DiscordEventCommand>>];
};
[EventType.Sern]: {
[PluginType.Control]: [Payload];
[PluginType.Init]: [InitArgs<Processed<SernEventCommand>>];
};
[EventType.External]: {
[PluginType.Control]: unknown[];
[PluginType.Init]: [InitArgs<Processed<ExternalEventCommand>>];
};
}

112
src/handler/commands.ts Normal file
View File

@@ -0,0 +1,112 @@
import { ClientEvents } from 'discord.js';
import { CommandType, EventType, PluginType } from '../core/structures';
import {
AnyCommandPlugin,
AnyEventPlugin,
CommandArgs,
ControlPlugin,
EventArgs,
InitPlugin,
} from '../core/types/plugins';
import {
CommandModule,
EventModule,
InputCommand,
InputEvent,
Module,
} from '../core/types/modules';
import { partitionPlugins } from '../core/functions';
import { Awaitable } from '../shared';
/**
* @since 1.0.0 The wrapper function to define command modules for sern
* @param mod
*/
export function commandModule(mod: InputCommand): CommandModule {
const [onEvent, plugins] = partitionPlugins(mod.plugins);
return {
...mod,
onEvent,
plugins,
} as CommandModule;
}
/**
* @since 1.0.0
* The wrapper function to define event modules for sern
* @param mod
*/
export function eventModule(mod: InputEvent): EventModule {
const [onEvent, plugins] = partitionPlugins(mod.plugins);
return {
...mod,
plugins,
onEvent,
} as EventModule;
}
/** Create event modules from discord.js client events,
* This is an {@link eventModule} for discord events,
* where typings can be very bad.
* @Experimental
* @param mod
*/
export function discordEvent<T extends keyof ClientEvents>(mod: {
name: T;
plugins?: AnyEventPlugin[];
execute: (...args: ClientEvents[T]) => Awaitable<unknown>;
}) {
return eventModule({
type: EventType.Discord,
...mod,
});
}
function prepareClassPlugins(c: Module) {
const [onEvent, initPlugins] = partitionPlugins(c.plugins);
c.plugins = initPlugins as InitPlugin[];
c.onEvent = onEvent as ControlPlugin[];
}
//
// Class modules:
// Can be refactored.
// Both implement singleton, could I make them inherit a singleton parent class?
/**
* @Experimental
* Will be refactored / changed in future
*/
export abstract class CommandExecutable<const Type extends CommandType = CommandType> {
abstract type: Type;
plugins: AnyCommandPlugin[] = [];
private static _instance: CommandModule;
static getInstance() {
if (!CommandExecutable._instance) {
//@ts-ignore
CommandExecutable._instance = new this();
prepareClassPlugins(CommandExecutable._instance);
}
return CommandExecutable._instance;
}
abstract execute(...args: CommandArgs<Type, PluginType.Control>): Awaitable<unknown>;
}
/**
* @Experimental
* Will be refactored in future
*/
export abstract class EventExecutable<Type extends EventType> {
abstract type: Type;
plugins: AnyEventPlugin[] = [];
private static _instance: EventModule;
static getInstance() {
if (!EventExecutable._instance) {
//@ts-ignore
EventExecutable._instance = new this();
prepareClassPlugins(EventExecutable._instance);
}
return EventExecutable._instance;
}
abstract execute(...args: EventArgs<Type, PluginType.Control>): Awaitable<unknown>;
}

View File

@@ -0,0 +1,119 @@
import { EventEmitter } from 'node:events';
import * as assert from 'node:assert';
import { concatMap, from, fromEvent, map, OperatorFunction, pipe } from 'rxjs';
import { arrayifySource, callPlugin } from '../../core/operators';
import { createResultResolver } from './generic';
import { AutocompleteInteraction, BaseInteraction, Message } from 'discord.js';
import { treeSearch } from '../../core/functions';
import { SernError } from '../../core/structures/errors';
import { CommandType, Context } from '../../core';
import { isAutocomplete } from '../../core/predicates';
import { Processed } from '../types';
import { BothCommand, CommandModule, Module } from '../../core/types/modules';
import { Args } from '../../shared';
function dispatchInteraction<T extends CommandModule, V extends BaseInteraction | Message>(
payload: { module: Processed<T>; event: V },
createArgs: (m: typeof payload.event) => unknown[],
) {
return {
module: payload.module,
args: createArgs(payload.event),
};
}
//TODO: refactor dispatchers so that it implements a strategy for each different type of payload?
export function dispatchMessage(module: Processed<CommandModule>, args: [Context, Args]) {
return {
module,
args,
};
}
function dispatchAutocomplete(payload: {
module: Processed<BothCommand>;
event: AutocompleteInteraction;
}) {
const option = treeSearch(payload.event, payload.module.options);
if (option !== undefined) {
return {
module: option.command as Processed<Module>, //autocomplete is not a true "module" warning cast!
args: [payload.event],
};
}
throw Error(
SernError.NotSupportedInteraction + ` There is no autocomplete tag for this option`,
);
}
export function contextArgs(wrappable: Message | BaseInteraction, messageArgs?: string[]) {
const ctx = Context.wrap(wrappable);
const args = ctx.isMessage() ? ['text', messageArgs!] : ['slash', ctx.options];
return [ctx, args] as [Context, Args];
}
function interactionArg<T extends BaseInteraction>(interaction: T) {
return [interaction] as [T];
}
function intoPayload(module: Processed<Module>) {
return pipe(
arrayifySource,
map(args => ({ module, args })),
);
}
const createResult = createResultResolver<
Processed<Module>,
{ module: Processed<Module>; args: unknown[] },
unknown[]
>({
createStream: ({ module, args }) => from(module.onEvent).pipe(callPlugin(args)),
onNext: ({ args }) => args,
});
/**
* Creates an observable from { source }
* @param module
* @param source
*/
export function eventDispatcher(module: Processed<Module>, source: unknown) {
assert.ok(source instanceof EventEmitter, `${source} is not an EventEmitter`);
const execute: OperatorFunction<unknown[], unknown> = concatMap(async args =>
module.execute(...args),
);
return fromEvent(source, module.name).pipe(
intoPayload(module),
concatMap(createResult),
execute,
);
}
export function createDispatcher(payload: {
module: Processed<CommandModule>;
event: BaseInteraction;
}) {
switch (payload.module.type) {
case CommandType.Text:
throw Error(
SernError.MismatchEvent +
' Found a text module in interaction stream. ' +
payload.module,
);
case CommandType.Slash:
case CommandType.Both: {
if (isAutocomplete(payload.event)) {
/**
* Autocomplete is a special case that
* must be handled separately, since it's
* too different from regular command modules
* CAST SAFETY: payload is already guaranteed to be a slash command or both command
*/
return dispatchAutocomplete(payload as never);
}
return dispatchInteraction(payload, contextArgs);
}
default:
return dispatchInteraction(payload, interactionArg);
}
}

View File

@@ -0,0 +1,232 @@
import { Interaction, Message } from 'discord.js';
import {
EMPTY,
Observable,
concatMap,
filter,
from,
of,
throwError,
tap,
MonoTypeOperatorFunction,
catchError,
finalize,
} from 'rxjs';
import { ErrorHandling, Logging, ModuleManager, useContainerRaw } from '../../core';
import { SernError } from '../../core/structures/errors';
import { callPlugin, everyPluginOk, filterMap, filterMapTo, handleError } from '../../core/operators';
import { defaultModuleLoader } from '../../core/module-loading';
import { CommandModule, Module, AnyModule } from '../../core/types/modules';
import { contextArgs, createDispatcher, dispatchMessage } from './dispatchers';
import { ObservableInput, pipe, switchMap } from 'rxjs';
import { SernEmitter } from '../../core';
import { errTap } from '../../core/operators';
import * as Files from '../../core/module-loading';
import { Err, Result } from 'ts-results-es';
import { fmt } from './messages';
import { ControlPlugin, VoidResult } from '../../core/types/plugins';
import { ImportPayload, Processed } from '../types';
import { Awaitable } from '../../shared';
import { createId, reconstructId } from '../id';
function createGenericHandler<Source, Narrowed extends Source, Output>(
source: Observable<Source>,
makeModule: (event: Narrowed) => Awaitable<Result<Output, unknown>>,
) {
return (pred: (i: Source) => i is Narrowed) => source.pipe(filter(pred), filterMap(makeModule));
}
/**
*
* Creates an RxJS observable that filters and maps incoming interactions to their respective modules.
* @param i An RxJS observable of interactions.
* @param mg The module manager instance used to retrieve the module path for each interaction.
* @returns A handler to create a RxJS observable of dispatchers that take incoming interactions and execute their corresponding modules.
*/
export function createInteractionHandler<T extends Interaction>(
source: Observable<Interaction>,
mg: ModuleManager,
) {
return createGenericHandler<Interaction, T, ReturnType<typeof createDispatcher>>(
source,
event => {
const fullPath = mg.get(reconstructId(event as unknown as Interaction));
if (!fullPath)
return Err(SernError.UndefinedModule + ' No full path found in module store');
return defaultModuleLoader<Processed<CommandModule>>(fullPath).then(res =>
res.map(payload => createDispatcher({ module: payload.module, event })),
);
},
);
}
export function createMessageHandler(
source: Observable<Message>,
defaultPrefix: string,
mg: ModuleManager,
) {
return createGenericHandler(source, event => {
const [prefix, ...rest] = fmt(event.content, defaultPrefix);
const fullPath = mg.get(`${prefix}_A0`);
if (fullPath === undefined) {
return Err(SernError.UndefinedModule + ' No full path found in module store');
}
return defaultModuleLoader<Processed<CommandModule>>(fullPath).then(result => {
const args = contextArgs(event, rest);
return result.map(payload => dispatchMessage(payload.module, args));
});
});
}
/**
* IMPURE SIDE EFFECT
* This function assigns remaining, incomplete data to each imported module.
*/
function assignDefaults<T extends Module>(
moduleManager: ModuleManager,
): MonoTypeOperatorFunction<ImportPayload<T>> {
return tap(({ module, absPath }) => {
module.name ??= Files.filename(absPath);
module.description ??= '...';
moduleManager.setMetadata(module, {
isClass: module.constructor.name === 'Function',
fullPath: absPath,
id: createId(module.name, module.type),
});
});
}
export function buildModules<T extends AnyModule>(
input: ObservableInput<string>,
sernEmitter: SernEmitter,
moduleManager: ModuleManager,
) {
return pipe(
switchMap(() => Files.buildModuleStream<T>(input)),
errTap(error => {
sernEmitter.emit('module.register', SernEmitter.failure(undefined, error));
}),
assignDefaults<T>(moduleManager),
);
}
function hasPrefix(prefix: string, content: string) {
const prefixInContent = content.slice(0, prefix.length);
return prefixInContent.localeCompare(prefix, undefined, { sensitivity: 'accent' }) === 0;
}
/**
* Ignores messages from any person / bot except itself
* @param prefix
*/
export function isNonBot(prefix: string) {
return ({ author, content }: Message) => !author.bot && hasPrefix(prefix, content);
}
/**
* Wraps the task in a Result as a try / catch.
* if the task is ok, an event is emitted and the stream becomes empty
* if the task is an error, throw an error down the stream which will be handled by catchError
* @param emitter reference to SernEmitter that will emit a successful execution of module
* @param module the module that will be executed with task
* @param task the deferred execution which will be called
*/
export function executeModule(
emitter: SernEmitter,
{
module,
task,
}: {
module: Processed<Module>;
task: () => Awaitable<unknown>;
},
) {
return of(module).pipe(
//converting the task into a promise so rxjs can resolve the Awaitable properly
concatMap(() => Result.wrapAsync(async () => task())),
concatMap(result => {
if (result.ok) {
emitter.emit('module.activate', SernEmitter.success(module));
return EMPTY;
} else {
return throwError(() => SernEmitter.failure(module, result.val));
}
}),
);
}
/**
* A higher order function that
* - creates a stream of {@link VoidResult} { config.createStream }
* - any failures results to { config.onFailure } being called
* - if all results are ok, the stream is converted to { config.onNext }
* emit config.onSuccess Observable
* @param config
* @returns receiver function for flattening a stream of data
*/
export function createResultResolver<
T extends { execute: (...args: any[]) => any; onEvent: ControlPlugin[] },
Args extends { module: T; [key: string]: unknown },
Output,
>(config: {
onStop?: (module: T) => unknown;
onNext: (args: Args) => Output;
createStream: (args: Args) => Observable<VoidResult>;
}) {
return (args: Args) => {
const task$ = config.createStream(args);
return task$.pipe(
tap(result => {
result.err && config.onStop?.(args.module);
}),
everyPluginOk,
filterMapTo(() => config.onNext(args)),
);
};
}
/**
* Calls a module's init plugins and checks for Err. If so, call { onStop } and
* ignore the module
*/
export function callInitPlugins<
T extends Processed<AnyModule>,
Args extends ImportPayload<T>,
>(config: { onStop?: (module: T) => unknown; onNext: (module: Args) => T }) {
return concatMap(
createResultResolver({
createStream: args => from(args.module.plugins).pipe(callPlugin(args)),
...config,
}),
);
}
/**
* Creates an executable task ( execute the command ) if all control plugins are successful
* @param onStop emits a failure response to the SernEmitter
*/
export function makeModuleExecutor<
M extends Processed<Module>,
Args extends { module: M; args: unknown[] },
>(onStop: (m: M) => unknown) {
const onNext = ({ args, module }: Args) => ({ task: () => module.execute(...args), module });
return concatMap(
createResultResolver({
onStop,
createStream: ({ args, module }) => from(module.onEvent).pipe(callPlugin(args)),
onNext,
}),
);
}
export function handleCrash(
errorHandler: ErrorHandling,
logger?: Logging,
) {
return pipe(
catchError(handleError(errorHandler, logger)),
finalize(() => {
logger?.info({ message: 'A stream closed or reached end of lifetime' });
useContainerRaw()?.disposeAll()
.then(() => logger?.info({ message: 'Cleaning container and crashing' }));
})
);
}

View File

@@ -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);
},
});
}

View File

@@ -0,0 +1,26 @@
import { Interaction } from 'discord.js';
import { concatMap, merge } from 'rxjs';
import { SernError } from '../../core/structures/errors';
import { SernEmitter } from '../../core';
import { sharedObservable } from '../../core/operators';
import { isAutocomplete, isCommand, isMessageComponent, isModal } from '../../core/predicates';
import { createInteractionHandler, executeModule, makeModuleExecutor } from './generic';
import { DependencyList } from '../types';
export function makeInteractionHandler([emitter, , , modules, client]: DependencyList) {
const interactionStream$ = sharedObservable<Interaction>(client, 'interactionCreate');
const handle = createInteractionHandler(interactionStream$, modules);
const interactionHandler$ = merge(
handle(isMessageComponent),
handle(isAutocomplete),
handle(isCommand),
handle(isModal),
);
return interactionHandler$.pipe(
makeModuleExecutor(module => {
emitter.emit('module.activate', SernEmitter.failure(module, SernError.PluginFailure));
}),
concatMap(payload => executeModule(emitter, payload)),
);
}

View File

@@ -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);
},
});
};

View File

@@ -0,0 +1,42 @@
import { concatMap, EMPTY } from 'rxjs';
import { SernError } from '../../core/structures/errors';
import type { Message } from 'discord.js';
import { SernEmitter } from '../../core';
import { sharedObservable } from '../../core/operators';
import { createMessageHandler, executeModule, isNonBot, makeModuleExecutor } from './generic';
import { DependencyList } from '../types';
/**
* 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: string, prefix: string): string[] {
return msg.slice(prefix.length).trim().split(/\s+/g);
}
export function makeMessageHandler(
[emitter, , log, modules, client]: DependencyList,
defaultPrefix: string | undefined,
) {
if (!defaultPrefix) {
log?.debug({ message: 'No prefix found. message handler shutting down' });
return EMPTY;
}
const messageStream$ = sharedObservable<Message>(client, 'messageCreate');
const handler = createMessageHandler(messageStream$, defaultPrefix, modules);
const prefixedMessages$ = handler(isNonBot(defaultPrefix) as (m: Message) => m is Message);
return prefixedMessages$.pipe(
makeModuleExecutor(module => {
emitter.emit('module.activate', SernEmitter.failure(module, SernError.PluginFailure));
}),
concatMap(payload => executeModule(emitter, payload)),
);
}

View File

@@ -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(),
});
});
}

View File

@@ -0,0 +1,55 @@
import { ObservableInput, fromEvent, take } from 'rxjs';
import { CommandType } from '../../core/structures';
import { SernError } from '../../core/structures/errors';
import { Result } from 'ts-results-es';
import { ModuleManager } from '../../core/contracts';
import { SernEmitter } from '../../core';
import { Processed, DependencyList } from '../types';
import { buildModules, callInitPlugins } from './generic';
import { AnyModule } from '../../core/types/modules';
import * as assert from 'node:assert';
export function startReadyEvent(
[sEmitter, , , moduleManager, client]: DependencyList,
allPaths: ObservableInput<string>,
) {
const ready$ = fromEvent(client!, 'ready').pipe(take(1));
return ready$
.pipe(
buildModules<Processed<AnyModule>>(allPaths, sEmitter, moduleManager),
callInitPlugins({
onStop: module => {
sEmitter.emit(
'module.register',
SernEmitter.failure(module, SernError.PluginFailure),
);
},
onNext: ({ module }) => {
sEmitter.emit('module.register', SernEmitter.success(module));
return module;
},
}),
)
.subscribe(module => {
const result = registerModule(moduleManager, module);
if (result.err) {
throw Error(SernError.InvalidModuleType + ' ' + result.val);
}
});
}
function registerModule<T extends Processed<AnyModule>>(
manager: ModuleManager,
module: T,
): Result<void, void> {
const { id, fullPath } = manager.getMetadata(module);
assert.ok(
module.type > 0 && module.type < 1 << 10,
`Found ${module.name} at ${fullPath}, which does not have a valid type`,
);
if (module.type === CommandType.Both || module.type === CommandType.Text) {
module.alias?.forEach(a => manager.set(`${a}_A0`, fullPath));
}
return Result.wrap(() => manager.set(id, fullPath));
}

View File

@@ -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);
}

View File

@@ -0,0 +1,59 @@
import { ObservableInput, catchError, finalize, map, mergeAll, of } from 'rxjs';
import type { CommandModule, EventModule } from '../../core/types/modules';
import { SernEmitter } from '../../core';
import { EventType } from '../../core/structures';
import { SernError } from '../../core/structures/errors';
import { eventDispatcher } from './dispatchers';
import { buildModules, callInitPlugins } from './generic';
import { handleError } from '../../core/operators';
import { Service, useContainerRaw } from '../../core/ioc';
import { DependencyList, Processed } from '../types';
export function makeEventsHandler(
[emitter, err, log, moduleManager, client]: DependencyList,
allPaths: ObservableInput<string>,
) {
//code smell
const intoDispatcher = (e: Processed<EventModule | CommandModule>) => {
switch (e.type) {
case EventType.Sern:
return eventDispatcher(e, emitter);
case EventType.Discord:
return eventDispatcher(e, client);
case EventType.External:
return eventDispatcher(e, Service(e.emitter));
default:
throw Error(SernError.InvalidModuleType + ' while creating event handler');
}
};
of(null)
.pipe(
buildModules<Processed<EventModule>>(allPaths, emitter, moduleManager),
callInitPlugins({
onStop: module =>
emitter.emit(
'module.register',
SernEmitter.failure(module, SernError.PluginFailure),
),
onNext: ({ module }) => {
emitter.emit('module.register', SernEmitter.success(module));
return module;
},
}),
map(intoDispatcher),
/**
* Where all events are turned on
*/
mergeAll(),
catchError(handleError(err, log)),
finalize(() => {
log?.info({ message: 'an event module reached end of lifetime' });
useContainerRaw()
?.disposeAll()
.then(() => {
log?.info({ message: 'Cleaning container and crashing' });
});
}),
)
.subscribe();
}

50
src/handler/id.ts Normal file
View File

@@ -0,0 +1,50 @@
import { Interaction, InteractionType } from 'discord.js';
import { CommandType, EventType } from '../core';
/**
* Construct unique ID for a given interaction object.
* @param event The interaction object for which to create an ID.
* @returns A unique string ID based on the type and properties of the interaction object.
*/
export function reconstructId<T extends Interaction>(event: T) {
switch (event.type) {
case InteractionType.MessageComponent: {
return `${event.customId}_C${event.componentType}`;
}
case InteractionType.ApplicationCommand:
case InteractionType.ApplicationCommandAutocomplete: {
return `${event.commandName}_A${event.commandType}`;
}
//Modal interactions are classified as components for sern
case InteractionType.ModalSubmit: {
return `${event.customId}_C1`;
}
}
}
const appBitField = 0b000000011111;
/*
* Generates a number based on CommandType.
* This corresponds to an ApplicationCommandType or ComponentType
* TextCommands are 0 as they aren't either or.
*/
function apiType(t: CommandType | EventType) {
if (t === CommandType.Both || t === CommandType.Modal) return 1;
const log = Math.log2(t);
return (appBitField & t) !== 0 ? log : log - 2;
}
/*
* Generates an id based on CommandType.
* A is for any ApplicationCommand. C is for any ComponentCommand
* Then, another number generated by apiType function is appended
*/
function uniqueSuffix(t: CommandType | EventType) {
const am = (appBitField & t) !== 0 ? 'A' : 'C';
return am + apiType(t);
}
export function createId(name: string, type: CommandType | EventType) {
return name+"_"+uniqueSuffix(type)
}

View File

@@ -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,
};
}

View File

@@ -1,35 +1,89 @@
import type { DiscordEvent, EventEmitterRegister } from '../types/handler';
import { makeEventsHandler } from './events/user-defined';
import { makeInteractionHandler } from './events/interactions';
import { startReadyEvent } from './events/ready';
import { makeMessageHandler } from './events/messages';
import { err, ok } from '../core/functions';
import { getFullPathTree } from '../core/module-loading';
import { merge } from 'rxjs';
import { Services } from '../core/ioc';
import { Wrapper } from '../shared';
import { handleCrash } from './events/generic';
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';
/**
* @since 1.0.0
* @param wrapper 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(wrapper: Wrapper) {
const { events, client } = wrapper;
if (events !== undefined) {
eventObserver(client, events);
const startTime = performance.now();
const dependencies = useDependencies();
const logger = dependencies[2];
const errorHandler = dependencies[1];
const mode = debugModuleLoading(wrapper.mode ?? process.env.MODE);
if (wrapper.events !== undefined) {
makeEventsHandler(dependencies, getFullPathTree(wrapper.events, mode));
}
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();
}
startReadyEvent(dependencies, getFullPathTree(wrapper.commands, mode))
.add(() => {
const time = ((performance.now() - startTime) / 1000).toFixed(2);
dependencies[0].emit('modulesLoaded' );
logger?.info({
message: `sern: registered all modules in ${time} s`,
});
});
const messages$ = makeMessageHandler(dependencies, wrapper.defaultPrefix);
const interactions$ = makeInteractionHandler(dependencies);
merge(messages$, interactions$)
.pipe(handleCrash(errorHandler, logger))
.subscribe();
}
function debugModuleLoading(mode: string | undefined) {
console.info(`Detected mode: "${mode}"`);
if (mode === undefined) {
console.info('No mode found in process.env, assuming DEV');
}
switch (mode) {
case 'PROD':
return false;
case 'DEV':
case undefined:
return true;
default: {
console.warn(mode + ' is not a valid. Should be PROD or DEV');
return false;
}
}
}
function useDependencies() {
return Services(
'@sern/emitter',
'@sern/errors',
'@sern/logger',
'@sern/modules',
'@sern/client',
);
}
/**
* @since 1.0.0
* The object passed into every plugin to control a command's behavior
*/
export const controller = {
next: () => Ok.EMPTY,
stop: () => Err.EMPTY,
next: ok,
stop: err,
};

View File

@@ -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);
}
}

View File

@@ -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);
}),
)!;
}
}

View File

@@ -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 };

View File

@@ -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()`,
}

View File

@@ -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;

View File

@@ -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,
};

View File

@@ -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;

Some files were not shown because too many files have changed in this diff Show More