Skip to content

Commit

Permalink
feat: 🎸 improve yar vals and flash typings
Browse files Browse the repository at this point in the history
  • Loading branch information
Danilo Alonso authored and Danilo Alonso committed Mar 22, 2024
1 parent 1e71593 commit 418495f
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 6 deletions.
20 changes: 15 additions & 5 deletions lib/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import { Id, PolicyOptions } from '@hapi/catbox';
import { CachePolicyOptions, Plugin, Request, ResponseToolkit, Server, ServerOptionsCache } from '@hapi/hapi';


declare namespace yar {

export interface YarValues {}
export interface YarFlashes {}

type YarValKeys = keyof YarValues;
type YarFlashKeys = keyof YarFlashes;

interface YarOptions {
/**
* Determines the name of the cookie used to store session information.
Expand Down Expand Up @@ -109,20 +117,20 @@ declare namespace yar {
/**
* - assigns a value (string, object, etc) to a given key which will persist across requests. Returns the value.
*/
set<T>(key: string, value: T): T;
set<T extends YarValKeys>(key: T, value: YarValues[T]): T;
/**
* assigns values to multiple keys using each 'keysObject' top-level property. Returns the keysObject.
*/
set<T extends { [key: string]: any }>(keysObject: T): T;
set<T extends YarValues>(keysObject: Partial<T>): T;

/**
* retrieve value using a key. If 'clear' is 'true', key is cleared on return.
*/
get(key: string, clear?: boolean): any;
get <T extends YarValKeys>(key: T, clear?: boolean): YarValues[T] | null;
/**
* clears key.
*/
clear(key: string): void;
clear <T extends YarValKeys>(key: T): void;
/**
* Manually notify the session of changes (when using get()
* and changing the content of the returned reference directly without calling set()).
Expand All @@ -136,7 +144,7 @@ declare namespace yar {
* 'isOverride' used to indicate that the message provided should replace
* any existing value instead of being appended to it (defaults to false).
*/
flash(type?: string, message?: any, isOverride?: boolean): any[];
flash <T extends YarFlashKeys>(type?: T, message?: YarFlashes[T], isOverride?: boolean): any[];

/**
* if set to 'true', enables lazy mode.
Expand All @@ -160,7 +168,9 @@ declare namespace yar {
revoke(id: Id): Promise<void>;
}
}

declare const yar: Plugin<yar.YarOptions>;

export = yar;

declare module '@hapi/hapi' {
Expand Down
114 changes: 113 additions & 1 deletion test/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,31 @@
import * as lab from '@hapi/lab';
import { Request, Server } from '@hapi/hapi';
import * as yar from '../..';

const { expect } = lab.types;

declare module '../..' {

interface YarValues {

test1: string;
test2: {
a: true;
b: string;
},

example: {
key: string;
};
}

interface YarFlashes {

success: { title: string; message: string; };
error: { title: string; message: string; };
}
}

async function boot() {
const server = new Server();
await server.register({
Expand All @@ -21,10 +46,97 @@ async function boot() {
path: '/test',
method: 'get',
handler(request: Request) {

const example = request.yar.get('example');

expect.error(request.yar.get('testX'));

expect.error(
request.yar.get('test1') === 123
);


const test1 = request.yar.get('test1');
const test2 = request.yar.get('test2');

test1 === '1233';
test2?.a === true;

return {
id: request.yar.id,
key: example?.key,
};
},
});

server.route({

path: '/test',
method: 'post',
handler(request: Request) {


request.yar.set('test1', '123');
request.yar.set('test2', {
a: true,
b: '123',
});

request.yar.set({
test1: '123',
});

request.yar.flash('error', {
title: 'Error',
message: 'This is an error'
});

request.yar.flash('success', {
title: 'Success',
message: 'This is a success'
});


return {
id: request.yar.id,
};
},
});

server.route({

path: '/test',
method: 'post',
handler(request: Request) {


expect.error(request.yar.set('abc123', true));

request.yar.set('test1', '123');
request.yar.set('test2', {
a: true,
b: '123',
});

expect.error(request.yar.set('test1', 123))
expect.error(request.yar.set('test2', 123))

request.yar.set({
test1: '123',
});

request.yar.flash('error', { title: 'Error', message: 'This is an error' });
request.yar.flash('success', { title: 'Success', message: 'This is a success' });

expect.error(
request.yar.flash('test', { title: 'Success', message: 'This is a success' })
)

expect.error(request.yar.flash('success', 'message'));


return {
id: request.yar.id,
key: example.key,
};
},
});
Expand Down

0 comments on commit 418495f

Please sign in to comment.