@tmjeee/w-lib
v0.1.4
Published
A minimal, modern TypeScript library skeleton ready for publishing to npmjs.com. Includes helloWorld sample.
Maintainers
Readme
w-lib
Development
See here for more info.
A minimal, Angular and TypeScript library.
Installation
npm install @tmjeee/w-libUsage
This package is ESM-only.
Uint8ArrayBuffer (Generic)
An Uint8Array buffer that allows writing data that will auto resize, so we don't have to worry about resizing
// create buffer
const buffer = new Uint8ArrayBuffer();
// create buffer with initial size of 1024 bytes
const buffer = new Uint8ArrayBuffer(1024);
// write data and don't worry about resizing
// if insufficient space, buffer will automatically grow (doubling capacity as needed)
buffer.write(new Uint8Array([1, 2, 3]));
buffer.writeByte(4);
const result = buffer.toUint8Array(); // Uint8Array [1, 2, 3, 4]
buffer.length; // length of data
buffer.capacity; // how much this buffer can store without resize
buffer.clear(); // clear data pointer, will not clear data
buffer.reset(); // clear data, fresh Uint8Array allocationFinite state machine (Generic)
import {FsmState, Fsm} from '@tmjeee/w-lib';
class State1 extends FsmState {
enter(prevState: FsmState | null, ...params: any) {
console.log(`[State1] enter`);
}
exit(nextState: FsmState | null, ...params: any) {
console.log(`[State1] exit`);
}
update(...params: any) {
console.log(`[State1] update`);
}
}
class State2 extends FsmState {
enter(prevState: FsmState | null, ...params: any) {
console.log(`[State2] enter`);
}
exit(nextState: FsmState | null, ...params: any) {
console.log(`[State2] exit`);
}
update(...params: any) {
console.log(`[State2] update`);
}
}
const fsm = new Fsm();
fsm.register(
new State1(`state1`),
new State2(`state2`),
);
fsm.set('state1', {}); // state1.enter(...)
fsm.update(); // state1.update({})
fsm.set('state2'); // state1.exit(...) then state2.enter(...)
fsm.update(); // state2.update({});
fsm.get(); // return current state -> state2State Management (Generic)
const store = createStateStore<State>({
name: 'jim',
age: 12,
address: {
address1: '1 Kent Street',
address2: 'Sydney',
postcode: '2000',
}
});
const address1 = store.get('address.address1');
store.on('change', (change) => {
const state = change.state;
const previousState = change.previousState;
const value = change.value;
const previousValue = change.previousValue;
console.log(`change`, state, previousState, value, previousValue);
});
// all the following will trigger 'change' event
store.update('address', (address) => ({address1: 'new address1', address2: 'new address2', postcode: 'new postcode'}));
store.update('name', (name) => `name-${new Date()}`);
store.set('name', 'name1');
store.patch({age: 2, name: 'test'});
store.batch((ctx) => {
ctx.set('age', 1);
ctx.update('age', (age)=>age + 1);
ctx.patch({age: 2, name: 'test'});
});Event Emitter (Generic)
const emitter1 = new JsEventEmitter();
const emitter2 = new JsEventEmitter();
emitter1.on('test',()=>{
console.log(`[Emitter1] Receive test event`);
});
emitter2.once('test', ()=>{
console.log(`[Emitter2] Receive test event - once only`);
});
emitter1.emit('test', {test: 'test1'});
emitter1.emit('test', {test: 'test2'});
emitter2.emit('test', {test: 'test1'});
emitter2.emit('test', {test: 'test2'});
emitter1.off('test'); // turn off listening
emitter1.emit('test', {test: 'test3'});Disclaimer
Disclaimer: Contains codes from jyoung4242.
License
MIT © 2026 tmjeee
