Fluoro
⚡ A modern and universal Meta-Framework to construct other frameworks. ⚡
It refers to thoughts which are Aspect-Oriented Programming,
Inversion of Control and Dependency Injection.
🛠️ Class & Interface
- Context
- Events
- Modules
- Services
- Tokens
🧊 Usage
Provide, get & mixin, inject
declare class Server {}
declare interface Context {
config: typeof config;
display: (typeof demo)['display'];
}
const demo = {
name: 'hello, kotori!',
display() {
return this.name;
}
};
const ctx = new Context();
ctx.provide('config', {
port: 3000,
host: 'localhost'
});
ctx.provide('server', new Server());
const config = ctx.get('config');
const server = ctx.get('server');
ctx.config.port;
ctx.inject('config');
ctx.config.port;
ctx.display();
ctx.mixin('demo', ['display']);
ctx.display();
Extends
const ctx = new Context();
const ctxChild1 = ctx.extends();
const ctxChild2 = ctx.extends();
ctx.provide('data1', { value: 1 });
ctx.inject('data1');
ctx.data1.value;
ctxChild1.data1.value;
ctxChild1.provide('data2', { value: 2 });
ctxChild1.inject('data2');
ctx.data2;
ctxChild1.data2.value;
ctxChild2.provide('data3', { value: 3 });
ctxChild2.inject('data3');
ctx.data3;
ctxChild1.data3;
ctxChild2.data3.value;
const ctx = new Context();
const ctxChild1 = ctx.extends();
const ctxChild2 = ctx.extends({meta: 'some meta data', 'child2'});
ctx.meta;
ctxChild1.meta;
ctxChild2.meta;
ctx.identity;
ctxChild1.identity;
ctxChild2.identity;
Modules
type ModuleInstanceClass = new (ctx: Context, config: ModuleConfig) => void;
type ModuleInstanceFunction = (ctx: Context, config: ModuleConfig) => void;
interface ModuleExport {
name?: string;
main?: ModuleInstanceFunction;
Main?: ModuleInstanceClass;
default?: ModuleInstanceFunction | ModuleInstanceClass;
inject?: string[];
config?: ModuleConfig;
}
interface EventDataModule {
instance: ModuleExport | string | ModuleInstanceFunction | ModuleInstanceClass;
}
function plugin1(ctx: Context) {
ctx.logger.debug('plugin1 loaded');
}
export function main(ctx: Context) {
ctx.on('read_module', (data: EventDataModule) => {
if (data.instance === main) ctx.logger.debug('module(main plugin) loaded');
else if (data.instance === plugin1) ctx.logger.debug('plugin1(sub plugin) loaded');
});
ctx.load(plugin1);
}
export const config = Tsu.Object({
value: Tsu.String()
});
export function main(ctx: Context, cfg: Tsu.infer<typeof config>) {
ctx.logger.debug(ctx.identity, cfg.value);
const subCfg = {
value: 233
}
ctx.load({
name: 'plugin1',
main: (subCtx: Context, cfg: typeof 233) => {
subCtx.logger.debug(subCtx.identity, cfg.value);
}
});
}
📜 Reference
Kotori Bot is a chatbot framework,its core depends on Fluoro,
and is a fine reference to help you build your own framework.