@dikolab/tales
v0.0.3
Published
Helper for organizing structure of the project based on simple Use-case ideology
Readme
Tales
Organize scripts based on a high-level Use-case methodology as a startup intent of the package. Additional features will be introduced in upcoming releases.
Usage
The following sections provide examples of how to declare components of a Use Case and run them.
Declarations
Defining Boundary and goals
export const UserDomain = defineScope('Entity:User');
export const UserIsCreated = UserDomain.defineGoal('User is Created');
export const UserHasLoggedIn = UserDomain.defineGoal('User has Logged-in');Defining Use-case
import { UserDomain } from '../user.domain.ts';
import { UserIsCreated } from '../user.goals.ts';
export const CreateUser = UserDomain.
as('administrator', 'manager').
iCan('Create User').
soThat(UserIsCreated).
implementedAs(
(name: string, birthday: Date) => {
// other processes here...
return {
name,
birthday
}
}
);
Defining Actor and roles
export const Admin = iAm('admin').as(
// can define 2 or more roles
'administrator',
'manager'
);Execution
Running a Usecase by assuming an Actor
import { Admin } from './actors/admin.actor.ts';
import { CreateUser } from './user/user-cases/create-user.usecase.ts';
export class SomeUserController {
async createUser(name: string, birthday: Date): Promise<User> {
const newUser = await assume(Admin)
.perform(
CreateUser,
name,
birthday
);
// do some side effects here...
return newUser;
}
}Listening to events
You can listen to events by using listen().
import { listen } from '@dikolab/tales';
import { MakePaymentUsecase } from './payments/usecases/make-payment.usecase.ts';
listen(MakePaymentUsecase, 'perform',
(result, usecase) => {
console.log(`Use-case performed successfully: ${usecase}`);
console.log(`Result is: ${result}`);
}
);
TODO
- Implement plugins for flexibility
- State Management and Store
