@pikokr/command.ts 5.0.0-dev.a9cbae8 → 5.0.0-dev.daaf714

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -33,6 +33,28 @@ declare const createArgumentDecorator: <Options>(type: {
33
33
  new (options: Partial<Options>): ComponentArgumentDecorator<Options>;
34
34
  }) => (options: Options) => ParameterDecorator;
35
35
 
36
+ declare class Registry {
37
+ extensions: object[];
38
+ getComponentsWithType<T>(type: T): T[];
39
+ registerModule(ext: object): Promise<void>;
40
+ unregisterModule(ext: object): Promise<void>;
41
+ runModuleHook(ext: object, hookName: string, ...args: unknown[]): void;
42
+ }
43
+
44
+ declare type ModuleHookStore = Collection<string | symbol, Function[]>;
45
+ declare const getModuleHookStore: (target: object) => ModuleHookStore;
46
+ declare const moduleHook: (name: string) => MethodDecorator;
47
+
48
+ declare type ApplicationCommandOptions = {
49
+ name: string;
50
+ description: string;
51
+ };
52
+ declare class ApplicationCommandComponent extends BaseComponent<ApplicationCommandOptions> {
53
+ defaultOptions(): {
54
+ name: string;
55
+ description: string;
56
+ };
57
+ }
36
58
  declare const applicationCommand: (options: {
37
59
  name: string;
38
60
  description: string;
@@ -40,4 +62,4 @@ declare const applicationCommand: (options: {
40
62
 
41
63
  declare const option: (options: APIApplicationCommandOption) => ParameterDecorator;
42
64
 
43
- export { BaseComponent, applicationCommand, createArgumentDecorator, createComponentDecorator, getComponent, getComponentArgumentStore, getComponentStore, option };
65
+ export { ApplicationCommandComponent, ApplicationCommandOptions, BaseComponent, Registry, applicationCommand, createArgumentDecorator, createComponentDecorator, getComponent, getComponentArgumentStore, getComponentStore, getModuleHookStore, moduleHook, option };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var E=Object.create;var m=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var b=e=>m(e,"__esModule",{value:!0}),r=(e,t)=>m(e,"name",{value:t,configurable:!0});var G=(e,t)=>{for(var o in t)m(e,o,{get:t[o],enumerable:!0})},w=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of z(t))!F.call(e,n)&&(o||n!=="default")&&m(e,n,{get:()=>t[n],enumerable:!(s=q(t,n))||s.enumerable});return e},R=(e,t)=>w(b(m(e!=null?E(B(e)):{},"default",!t&&e&&e.__esModule?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),H=(e=>(t,o)=>e&&e.get(t)||(o=w(b({}),t,1),e&&e.set(t,o),o))(typeof WeakMap!="undefined"?new WeakMap:0);var J={};G(J,{BaseComponent:()=>a,applicationCommand:()=>O,createArgumentDecorator:()=>h,createComponentDecorator:()=>d,getComponent:()=>I,getComponentArgumentStore:()=>g,getComponentStore:()=>x,option:()=>j});var X=require("reflect-metadata");var M=require("discord.js"),D=R(require("lodash"));var f=class{constructor(t){this.type=t,this.decorators=[]}};r(f,"ComponentArgument");var a=class{argTypes=new M.Collection;constructor(t,o,s){typeof t=="object"?this.options=D.default.merge(this.defaultOptions(),t):this.options=t,this.method=o;for(let n=0;n<s.length;n++){let c=s[n];this.argTypes.set(n,new f(c))}}defaultOptions(){return{}}execute(t,o){return this.method.apply(t,o)}};r(a,"BaseComponent");var u=require("discord.js");var i=Symbol(),Q=Symbol();var x=r(e=>{let t=Reflect.getMetadata(i,e);return t||(t=new u.Collection,Reflect.defineMetadata(i,t,e)),t},"getComponentStore"),I=r((e,t)=>x(e).get(t),"getComponent"),d=r(e=>t=>(o,s)=>{var n=new e(t,Reflect.get(o,s),Reflect.getMetadata("design:paramtypes",o,s));let c=x(o);g(o,s).forEach((T,_)=>{var y;(y=n.argTypes.get(_))==null||y.decorators.push(T)}),c.set(s,n)},"createComponentDecorator"),g=r((e,t)=>{let o=Reflect.getMetadata(i,e,t);return o||(o=new u.Collection,Reflect.defineMetadata(i,o,e,t)),o},"getComponentArgumentStore"),h=r(e=>t=>(o,s,n)=>{var c=new e(t);g(o,s).set(n,c)},"createArgumentDecorator");var C=class extends a{defaultOptions(){return{name:"",description:""}}};r(C,"SlashCommand");var O=d(C);var A=R(require("lodash")),l=class{constructor(t){typeof t=="object"?this.options=A.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};r(l,"ComponentArgumentDecorator");var S=class extends l{};r(S,"ApplicationCommandOption");var j=h(S);module.exports=H(J);0&&(module.exports={BaseComponent,applicationCommand,createArgumentDecorator,createComponentDecorator,getComponent,getComponentArgumentStore,getComponentStore,option});
1
+ var q=Object.create;var m=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var v=t=>m(t,"__esModule",{value:!0}),n=(t,o)=>m(t,"name",{value:o,configurable:!0});var I=(t,o)=>{for(var e in o)m(t,e,{get:o[e],enumerable:!0})},k=(t,o,e,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of B(o))!G.call(t,r)&&(e||r!=="default")&&m(t,r,{get:()=>o[r],enumerable:!(s=z(o,r))||s.enumerable});return t},g=(t,o)=>k(v(m(t!=null?q(F(t)):{},"default",!o&&t&&t.__esModule?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t),J=(t=>(o,e)=>t&&t.get(o)||(e=k(v({}),o,1),t&&t.set(o,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var P={};I(P,{ApplicationCommandComponent:()=>d,BaseComponent:()=>i,Registry:()=>w,applicationCommand:()=>N,createArgumentDecorator:()=>b,createComponentDecorator:()=>y,getComponent:()=>K,getComponentArgumentStore:()=>C,getComponentStore:()=>f,getModuleHookStore:()=>u,moduleHook:()=>L,option:()=>j});var to=require("reflect-metadata");var D=require("discord.js"),O=g(require("lodash"));var a=class{constructor(o){this.type=o,this.decorators=[]}};n(a,"ComponentArgument");var i=class{argTypes=new D.Collection;constructor(o,e,s){typeof o=="object"?this.options=O.default.merge(this.defaultOptions(),o):this.options=o,this.method=e;for(let r=0;r<s.length;r++){let c=s[r];this.argTypes.set(r,new a(c))}}defaultOptions(){return{}}execute(o,e){return this.method.apply(o,e)}};n(i,"BaseComponent");var M=require("discord.js");var l=Symbol(),Y=Symbol(),S=Symbol();var f=n(t=>{let o=Reflect.getMetadata(l,t);return o||(o=new M.Collection,Reflect.defineMetadata(l,o,t)),o},"getComponentStore"),K=n((t,o)=>f(t).get(o),"getComponent"),y=n(t=>o=>(e,s)=>{var r=new t(o,Reflect.get(e,s),Reflect.getMetadata("design:paramtypes",e,s));let c=f(e);C(e,s).forEach((E,W)=>{var R;(R=r.argTypes.get(W))==null||R.decorators.push(E)}),c.set(s,r)},"createComponentDecorator"),C=n((t,o)=>{let e=Reflect.getMetadata(l,t,o);return e||(e=new M.Collection,Reflect.defineMetadata(l,e,t,o)),e},"getComponentArgumentStore"),b=n(t=>o=>(e,s,r)=>{var c=new t(o);C(e,s).set(r,c)},"createArgumentDecorator");var T=g(require("lodash"));var A=require("discord.js");var u=n(t=>{let o=Reflect.getMetadata(S,t);return o||(o=new A.Collection,Reflect.defineMetadata(S,o,t)),o},"getModuleHookStore"),L=n(t=>(o,e)=>{let s=u(o),r=s.get(e);r||(r=[],s.set(e,r)),r.push(Reflect.get(o,e))},"moduleHook");var w=class{extensions=[];getComponentsWithType(o){let e=[];for(let s of this.extensions){let r=f(s);e.push(...Array.from(r.filter(c=>c.constructor===o).values()))}return e}async registerModule(o){await this.runModuleHook(o,"load"),this.extensions.push(o)}async unregisterModule(o){await this.runModuleHook(o,"unload"),T.default.remove(this.extensions,e=>e===o)}runModuleHook(o,e,...s){let c=u(o).get(e);if(c)for(let h of c)h.apply(o,s)}};n(w,"Registry");var d=class extends i{defaultOptions(){return{name:"",description:""}}};n(d,"ApplicationCommandComponent");var N=y(d);var _=g(require("lodash")),x=class{constructor(o){typeof o=="object"?this.options=_.default.merge(this.defaultOptions(),o):this.options=o}defaultOptions(){return{}}};n(x,"ComponentArgumentDecorator");var H=class extends x{};n(H,"ApplicationCommandOption");var j=b(H);module.exports=J(P);0&&(module.exports={ApplicationCommandComponent,BaseComponent,Registry,applicationCommand,createArgumentDecorator,createComponentDecorator,getComponent,getComponentArgumentStore,getComponentStore,getModuleHookStore,moduleHook,option});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/home/runner/work/command.ts/command.ts/src/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/BaseComponent.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgument.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/decoratorCreator.ts","../src/core/home/runner/work/command.ts/command.ts/src/core/symbols.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommand.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgumentDecorator.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommandOption.ts"],"sourcesContent":["/*\r\n * File: index.ts\r\n *\r\n * Copyright (c) 2022-2022 pikokr\r\n *\r\n * Licensed under MIT License. Please see more defails in LICENSE file.\r\n */\r\n\r\nexport * from './core'\r\nexport * from './applicationCommand'\r\n","import 'reflect-metadata'\nexport * from './BaseComponent'\nexport * from './decoratorCreator'\n","import { Collection } from 'discord.js'\nimport _ from 'lodash'\nimport { ComponentArgument } from './ComponentArgument'\n\nexport class BaseComponent<Options = unknown> {\n options: Options\n\n method: Function\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n constructor(options: Partial<Options>, method: Function, argTypes: unknown[]) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n this.method = method\n for (let i = 0; i < argTypes.length; i++) {\n const element = argTypes[i]\n this.argTypes.set(i, new ComponentArgument(element))\n }\n }\n\n defaultOptions(): Options {\n return ({} as unknown) as Options\n }\n\n execute(target: object, args: unknown[]) {\n return this.method.apply(target, args)\n }\n}\n","import { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\nexport class ComponentArgument {\n decorators: ComponentArgumentDecorator[] = []\n\n constructor(public type: unknown) {}\n}\n","import { Collection } from 'discord.js'\nimport { ComponentStoreSymbol } from '../symbols'\nimport { BaseComponent } from './BaseComponent'\nimport { ComponentArgument } from './ComponentArgument'\nimport { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\ntype ComponentStore = Collection<string|symbol, BaseComponent>\ntype ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>\n\nexport const getComponentStore = (target: object): ComponentStore => {\n let result: ComponentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const getComponent = (target: object, key: string|symbol) => {\n const store = getComponentStore(target)\n\n return store.get(key)\n}\n\nexport const createComponentDecorator = <Options>(type: typeof BaseComponent<Options>) => {\n return (options: Options): MethodDecorator => {\n return (target, key) => {\n var component: BaseComponent<Options> = new type(options, Reflect.get(target, key), Reflect.getMetadata('design:paramtypes', target, key))\n\n const store = getComponentStore(target)\n\n const decorators = getComponentArgumentStore(target, key)\n\n decorators.forEach((x, i)=> {\n component.argTypes.get(i)?.decorators.push(x)\n })\n\n store.set(key, component)\n }\n }\n}\n\nexport const getComponentArgumentStore = (target: object, key: string|symbol): ComponentArgumentStore => {\n let result: ComponentArgumentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target, key)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target, key)\n }\n\n return result\n}\n\nexport const createArgumentDecorator = <Options>(type: typeof ComponentArgumentDecorator<Options>) => {\n return (options: Options): ParameterDecorator => {\n return (target, key, idx) => {\n var arg: ComponentArgumentDecorator<Options> = new type(options)\n\n const store = getComponentArgumentStore(target, key)\n\n store.set(idx, arg)\n }\n }\n}\n\n","export const ComponentStoreSymbol = Symbol()\nexport const ComponentArgStoreSymbol = Symbol()\n","import { BaseComponent, createComponentDecorator } from '../core'\nimport { ApplicationCommandDataResolvable } from 'discord.js'\n\nexport type ApplicationCommandOptions = {\n name: string\n description: string\n}\n\nexport class SlashCommand extends BaseComponent<ApplicationCommandOptions> {\n defaultOptions() {\n return {\n name: '',\n description: '',\n }\n }\n}\n\nexport const applicationCommand = createComponentDecorator(SlashCommand)\n","import _ from 'lodash'\n\nexport class ComponentArgumentDecorator<Options = unknown> {\n options: Options\n\n constructor(options: Partial<Options>) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n }\n\n defaultOptions(): Options {\n return ({} as unknown) as Options\n }\n}\n","import { APIApplicationCommandOption } from 'discord.js'\nimport { createArgumentDecorator } from '../core'\nimport { ComponentArgumentDecorator } from '../core/components/ComponentArgumentDecorator'\n\ntype Options = APIApplicationCommandOption\n\nexport class ApplicationCommandOption extends ComponentArgumentDecorator<Options> {}\n\nexport const option = createArgumentDecorator(ApplicationCommandOption)\n"],"mappings":"ouBAAA,kNCAA,MAAO,4BCAP,MAA2B,sBAC3B,EAAc,qBCCP,WAAuB,CAG5B,YAAmB,EAAe,MAAf,KAAA,OAFnB,WAA2C,KADtC,yBDEA,WAAmB,CAKxB,SAAkD,GAAI,cAEtD,YAAY,EAA2B,EAAkB,EAAqB,CAC5E,AAAI,MAAO,IAAY,SACrB,KAAK,QAAU,UAAE,MAAM,KAAK,iBAAkB,GAE9C,KAAK,QAAU,EAEjB,KAAK,OAAS,EACd,OAAS,GAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CACxC,GAAM,GAAU,EAAS,GACzB,KAAK,SAAS,IAAI,EAAG,GAAI,GAAkB,KAI/C,gBAA0B,CACxB,MAAQ,GAGV,QAAQ,EAAgB,EAAiB,CACvC,MAAO,MAAK,OAAO,MAAM,EAAQ,KAzB9B,qBEJP,MAA2B,sBCApB,GAAM,GAAuB,SACvB,EAA0B,SDQhC,GAAM,GAAoB,EAAC,GAAmC,CACnE,GAAI,GAA8B,QAAQ,YAAY,EAAsB,GAE5E,MAAK,IACH,GAAS,GAAI,cAEb,QAAQ,eAAe,EAAsB,EAAQ,IAGhD,GATwB,qBAYpB,EAAe,GAAC,EAAgB,IAGpC,AAFO,EAAkB,GAEnB,IAAI,GAHS,gBAMf,EAA2B,EAAU,GACzC,AAAC,GACC,CAAC,EAAQ,IAAQ,CACtB,GAAI,GAAoC,GAAI,GAAK,EAAS,QAAQ,IAAI,EAAQ,GAAM,QAAQ,YAAY,oBAAqB,EAAQ,IAErI,GAAM,GAAQ,EAAkB,GAIhC,AAFmB,EAA0B,EAAQ,GAE1C,QAAQ,CAAC,EAAG,IAAK,CApClC,MAqCQ,KAAU,SAAS,IAAI,KAAvB,QAA2B,WAAW,KAAK,KAG7C,EAAM,IAAI,EAAK,IAbmB,4BAkB3B,EAA4B,GAAC,EAAgB,IAA+C,CACvG,GAAI,GAAsC,QAAQ,YAAY,EAAsB,EAAQ,GAE5F,MAAK,IACH,GAAS,GAAI,cAEb,QAAQ,eAAe,EAAsB,EAAQ,EAAQ,IAGxD,GATgC,6BAY5B,EAA0B,EAAU,GACxC,AAAC,GACC,CAAC,EAAQ,EAAK,IAAQ,CAC3B,GAAI,GAA2C,GAAI,GAAK,GAIxD,AAFc,EAA0B,EAAQ,GAE1C,IAAI,EAAK,IAPkB,2BEjDhC,mBAA2B,EAAa,CAC7C,gBAAiB,CACf,MAAO,CACL,KAAM,GACN,YAAa,MAJZ,oBASA,GAAM,GAAqB,EAAyB,GCjB3D,MAAc,qBAEP,OAAgC,CAGrC,YAAY,EAA2B,CACrC,AAAI,MAAO,IAAY,SACrB,KAAK,QAAU,UAAE,MAAM,KAAK,iBAAkB,GAE9C,KAAK,QAAU,EAInB,gBAA0B,CACxB,MAAQ,KAZL,kCCIA,mBAAuC,EAA0B,GAAjE,gCAEA,GAAM,GAAS,EAAwB","names":[]}
1
+ {"version":3,"sources":["../src/home/runner/work/command.ts/command.ts/src/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/BaseComponent.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgument.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/decoratorCreator.ts","../src/core/home/runner/work/command.ts/command.ts/src/core/symbols.ts","../src/core/structures/home/runner/work/command.ts/command.ts/src/core/structures/Registry.ts","../src/core/hooks/home/runner/work/command.ts/command.ts/src/core/hooks/moduleHook.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommand.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgumentDecorator.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommandOption.ts"],"sourcesContent":["/*\r\n * File: index.ts\r\n *\r\n * Copyright (c) 2022-2022 pikokr\r\n *\r\n * Licensed under MIT License. Please see more defails in LICENSE file.\r\n */\r\n\r\nexport * from './core'\r\nexport * from './applicationCommand'\r\n","import 'reflect-metadata'\nexport * from './BaseComponent'\nexport * from './decoratorCreator'\n","import { Collection } from 'discord.js'\nimport _ from 'lodash'\nimport { ComponentArgument } from './ComponentArgument'\n\nexport class BaseComponent<Options = unknown> {\n options: Options\n\n method: Function\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n constructor(options: Partial<Options>, method: Function, argTypes: unknown[]) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n this.method = method\n for (let i = 0; i < argTypes.length; i++) {\n const element = argTypes[i]\n this.argTypes.set(i, new ComponentArgument(element))\n }\n }\n\n defaultOptions(): Options {\n return ({} as unknown) as Options\n }\n\n execute(target: object, args: unknown[]) {\n return this.method.apply(target, args)\n }\n}\n","import { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\nexport class ComponentArgument {\n decorators: ComponentArgumentDecorator[] = []\n\n constructor(public type: unknown) {}\n}\n","import { Collection } from 'discord.js'\nimport { ComponentStoreSymbol } from '../symbols'\nimport { BaseComponent } from './BaseComponent'\nimport { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\ntype ComponentStore = Collection<string|symbol, BaseComponent>\ntype ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>\n\nexport const getComponentStore = (target: object): ComponentStore => {\n let result: ComponentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const getComponent = (target: object, key: string|symbol) => {\n const store = getComponentStore(target)\n\n return store.get(key)\n}\n\nexport const createComponentDecorator = <Options>(type: typeof BaseComponent<Options>) => {\n return (options: Options): MethodDecorator => {\n return (target, key) => {\n var component: BaseComponent<Options> = new type(options, Reflect.get(target, key), Reflect.getMetadata('design:paramtypes', target, key))\n\n const store = getComponentStore(target)\n\n const decorators = getComponentArgumentStore(target, key)\n\n decorators.forEach((x, i)=> {\n component.argTypes.get(i)?.decorators.push(x)\n })\n\n store.set(key, component)\n }\n }\n}\n\nexport const getComponentArgumentStore = (target: object, key: string|symbol): ComponentArgumentStore => {\n let result: ComponentArgumentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target, key)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target, key)\n }\n\n return result\n}\n\nexport const createArgumentDecorator = <Options>(type: typeof ComponentArgumentDecorator<Options>) => {\n return (options: Options): ParameterDecorator => {\n return (target, key, idx) => {\n var arg: ComponentArgumentDecorator<Options> = new type(options)\n\n const store = getComponentArgumentStore(target, key)\n\n store.set(idx, arg)\n }\n }\n}\n\n","export const ComponentStoreSymbol = Symbol()\nexport const ComponentArgStoreSymbol = Symbol()\nexport const ModuleHookStoreSymbol = Symbol()\n","import _ from 'lodash'\nimport { getComponentStore } from '../components'\nimport { getModuleHookStore } from '../hooks'\n\nexport class Registry {\n extensions: object[] = []\n\n getComponentsWithType<T>(type: T): T[] {\n const result: T[] = []\n\n for (const ext of this.extensions) {\n const componentStore = getComponentStore(ext)\n\n result.push(...Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<T>))\n }\n\n return result\n }\n\n async registerModule(ext: object) {\n await this.runModuleHook(ext, 'load')\n this.extensions.push(ext)\n }\n\n async unregisterModule(ext: object) {\n await this.runModuleHook(ext, 'unload')\n _.remove(this.extensions, (x) => x === ext)\n }\n\n runModuleHook(ext: object, hookName: string, ...args: unknown[]) {\n const hooks = getModuleHookStore(ext)\n\n const functions = hooks.get(hookName)\n\n if (functions) {\n for (const fn of functions) {\n fn.apply(ext, args)\n }\n }\n }\n}\n","import { Collection } from 'discord.js'\nimport { ModuleHookStoreSymbol } from '../symbols'\n\ntype ModuleHookStore = Collection<string | symbol, Function[]>\n\nexport const getModuleHookStore = (target: object) => {\n let result: ModuleHookStore | null = Reflect.getMetadata(ModuleHookStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ModuleHookStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const moduleHook = (name: string): MethodDecorator => {\n return (target, key) => {\n const store = getModuleHookStore(target)\n\n let v = store.get(key)\n\n if (!v) {\n v = []\n store.set(key, v)\n }\n\n v.push(Reflect.get(target, key))\n }\n}\n","import { BaseComponent, createComponentDecorator } from '../core'\n\nexport type ApplicationCommandOptions = {\n name: string\n description: string\n}\n\nexport class ApplicationCommandComponent extends BaseComponent<ApplicationCommandOptions> {\n defaultOptions() {\n return {\n name: '',\n description: '',\n }\n }\n}\n\nexport const applicationCommand = createComponentDecorator(ApplicationCommandComponent)\n","import _ from 'lodash'\n\nexport class ComponentArgumentDecorator<Options = unknown> {\n options: Options\n\n constructor(options: Partial<Options>) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n }\n\n defaultOptions(): Options {\n return ({} as unknown) as Options\n }\n}\n","import { APIApplicationCommandOption } from 'discord.js'\nimport { createArgumentDecorator } from '../core'\nimport { ComponentArgumentDecorator } from '../core/components/ComponentArgumentDecorator'\n\ntype Options = APIApplicationCommandOption\n\nexport class ApplicationCommandOption extends ComponentArgumentDecorator<Options> {}\n\nexport const option = createArgumentDecorator(ApplicationCommandOption)\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@pikokr/command.ts",
3
3
  "description": "Discord.js command framework for typescript.",
4
- "version": "5.0.0-dev.a9cbae8",
4
+ "version": "5.0.0-dev.daaf714",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
8
8
  "devDependencies": {
9
- "@discordjs/ts-docgen": "^0.3.4",
9
+ "@discordjs/ts-docgen": "^0.4.1",
10
10
  "@swc/core": "^1.2.218",
11
11
  "@types/lodash": "^4.14.172",
12
12
  "all-contributors-cli": "^6.20.0",
@@ -14,7 +14,8 @@
14
14
  "prettier": "^2.2.1",
15
15
  "ts-node": "^10.9.1",
16
16
  "tsup": "^5.11.12",
17
- "typedoc": "^0.22.11"
17
+ "typedoc": "^0.22.11",
18
+ "typescript": "^4.7.4"
18
19
  },
19
20
  "dependencies": {
20
21
  "@types/node": "^14.14.37",
@@ -22,7 +23,6 @@
22
23
  "lodash": "^4.17.21",
23
24
  "reflect-metadata": "^0.1.13",
24
25
  "tslog": "^3.3.1",
25
- "typescript": "^4.7.4",
26
26
  "walk-sync": "^3.0.0"
27
27
  },
28
28
  "repository": {
@@ -34,7 +34,7 @@
34
34
  "build": "tsup-node",
35
35
  "docs:dev": "typedoc",
36
36
  "docs:build": "typedoc",
37
- "docs": "typedoc --json docs/typedoc-out.json src/index.ts && ts-node scripts/docs"
37
+ "docs": "typedoc --json docs/typedoc-out.json --tsconfig tsconfig.prod.json src/index.ts && ts-node scripts/docs"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "discord.js": "^14.0.1"
@@ -1,12 +1,11 @@
1
1
  import { BaseComponent, createComponentDecorator } from '../core'
2
- import { ApplicationCommandDataResolvable } from 'discord.js'
3
2
 
4
3
  export type ApplicationCommandOptions = {
5
4
  name: string
6
5
  description: string
7
6
  }
8
7
 
9
- export class SlashCommand extends BaseComponent<ApplicationCommandOptions> {
8
+ export class ApplicationCommandComponent extends BaseComponent<ApplicationCommandOptions> {
10
9
  defaultOptions() {
11
10
  return {
12
11
  name: '',
@@ -15,4 +14,4 @@ export class SlashCommand extends BaseComponent<ApplicationCommandOptions> {
15
14
  }
16
15
  }
17
16
 
18
- export const applicationCommand = createComponentDecorator(SlashCommand)
17
+ export const applicationCommand = createComponentDecorator(ApplicationCommandComponent)
@@ -1,2 +1,2 @@
1
- export { applicationCommand } from './ApplicationCommand'
1
+ export * from './ApplicationCommand'
2
2
  export { option } from './ApplicationCommandOption'
@@ -1,7 +1,6 @@
1
1
  import { Collection } from 'discord.js'
2
2
  import { ComponentStoreSymbol } from '../symbols'
3
3
  import { BaseComponent } from './BaseComponent'
4
- import { ComponentArgument } from './ComponentArgument'
5
4
  import { ComponentArgumentDecorator } from './ComponentArgumentDecorator'
6
5
 
7
6
  type ComponentStore = Collection<string|symbol, BaseComponent>
@@ -0,0 +1 @@
1
+ export * from './moduleHook'
@@ -0,0 +1,31 @@
1
+ import { Collection } from 'discord.js'
2
+ import { ModuleHookStoreSymbol } from '../symbols'
3
+
4
+ type ModuleHookStore = Collection<string | symbol, Function[]>
5
+
6
+ export const getModuleHookStore = (target: object) => {
7
+ let result: ModuleHookStore | null = Reflect.getMetadata(ModuleHookStoreSymbol, target)
8
+
9
+ if (!result) {
10
+ result = new Collection()
11
+
12
+ Reflect.defineMetadata(ModuleHookStoreSymbol, result, target)
13
+ }
14
+
15
+ return result
16
+ }
17
+
18
+ export const moduleHook = (name: string): MethodDecorator => {
19
+ return (target, key) => {
20
+ const store = getModuleHookStore(target)
21
+
22
+ let v = store.get(key)
23
+
24
+ if (!v) {
25
+ v = []
26
+ store.set(key, v)
27
+ }
28
+
29
+ v.push(Reflect.get(target, key))
30
+ }
31
+ }
package/src/core/index.ts CHANGED
@@ -1 +1,3 @@
1
1
  export * from './components'
2
+ export * from './structures'
3
+ export * from './hooks'
@@ -0,0 +1,41 @@
1
+ import _ from 'lodash'
2
+ import { getComponentStore } from '../components'
3
+ import { getModuleHookStore } from '../hooks'
4
+
5
+ export class Registry {
6
+ extensions: object[] = []
7
+
8
+ getComponentsWithType<T>(type: T): T[] {
9
+ const result: T[] = []
10
+
11
+ for (const ext of this.extensions) {
12
+ const componentStore = getComponentStore(ext)
13
+
14
+ result.push(...Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<T>))
15
+ }
16
+
17
+ return result
18
+ }
19
+
20
+ async registerModule(ext: object) {
21
+ await this.runModuleHook(ext, 'load')
22
+ this.extensions.push(ext)
23
+ }
24
+
25
+ async unregisterModule(ext: object) {
26
+ await this.runModuleHook(ext, 'unload')
27
+ _.remove(this.extensions, (x) => x === ext)
28
+ }
29
+
30
+ runModuleHook(ext: object, hookName: string, ...args: unknown[]) {
31
+ const hooks = getModuleHookStore(ext)
32
+
33
+ const functions = hooks.get(hookName)
34
+
35
+ if (functions) {
36
+ for (const fn of functions) {
37
+ fn.apply(ext, args)
38
+ }
39
+ }
40
+ }
41
+ }
@@ -0,0 +1 @@
1
+ export * from './Registry'
@@ -1,2 +1,3 @@
1
1
  export const ComponentStoreSymbol = Symbol()
2
2
  export const ComponentArgStoreSymbol = Symbol()
3
+ export const ModuleHookStoreSymbol = Symbol()
package/test/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ApplicationCommandOptionType } from 'discord.js'
2
- import { applicationCommand, getComponentStore, option } from '../src'
2
+ import { applicationCommand, ApplicationCommandComponent, moduleHook, option, Registry } from '../src'
3
3
 
4
4
  class Test {
5
5
  @applicationCommand({
@@ -28,10 +28,26 @@ class Test {
28
28
  })
29
29
  wa: string,
30
30
  ) {}
31
+
32
+ @moduleHook('load')
33
+ load() {
34
+ console.log('load')
35
+ }
36
+
37
+ @moduleHook('unload')
38
+ unload() {
39
+ console.log('unload')
40
+ }
31
41
  }
32
42
 
33
43
  const ext = new Test()
34
44
 
35
- const store = getComponentStore(ext)
45
+ const registry = new Registry()
46
+
47
+ const run = async () => {
48
+ await registry.registerModule(ext)
49
+
50
+ await registry.unregisterModule(ext)
51
+ }
36
52
 
37
- console.log(store)
53
+ run()
package/tsconfig.json CHANGED
@@ -31,6 +31,7 @@
31
31
 
32
32
  /* Strict Type-Checking Options */
33
33
  "strict": true,
34
+
34
35
  /* Enable all strict type-checking options. */
35
36
  // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
36
37
  // "strictNullChecks": true, /* Enable strict null checks. */
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "exclude": ["node_modules", "scripts", "test", "tsup.config.ts"]
4
+ }
package/tsup.config.ts CHANGED
@@ -1,11 +1,11 @@
1
- /*
2
- * File: tsup.config.ts
3
- *
4
- * Copyright (c) 2022-2022 pikokr
5
- *
6
- * Licensed under MIT License. Please see more defails in LICENSE file.
7
- */
8
-
1
+ /*
2
+ * File: tsup.config.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
+
9
9
  import { defineConfig } from 'tsup'
10
10
 
11
11
  export default defineConfig({
@@ -15,4 +15,5 @@ export default defineConfig({
15
15
  clean: true,
16
16
  dts: true,
17
17
  minify: true,
18
+ tsconfig: 'tsconfig.prod.json',
18
19
  })