diff --git a/lib/index.d.ts b/lib/index.d.ts index 13c91fe..a26a919 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -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. @@ -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(key: string, value: T): T; + set(key: T, value: YarValues[T]): T; /** * assigns values to multiple keys using each 'keysObject' top-level property. Returns the keysObject. */ - set(keysObject: T): T; + set(keysObject: Partial): T; /** * retrieve value using a key. If 'clear' is 'true', key is cleared on return. */ - get(key: string, clear?: boolean): any; + get (key: T, clear?: boolean): YarValues[T] | null; /** * clears key. */ - clear(key: string): void; + clear (key: T): void; /** * Manually notify the session of changes (when using get() * and changing the content of the returned reference directly without calling set()). @@ -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 (type?: T, message?: YarFlashes[T], isOverride?: boolean): any[]; /** * if set to 'true', enables lazy mode. @@ -160,7 +168,9 @@ declare namespace yar { revoke(id: Id): Promise; } } + declare const yar: Plugin; + export = yar; declare module '@hapi/hapi' { diff --git a/test/types/index.ts b/test/types/index.ts index 6ef0bfe..7ad0a52 100644 --- a/test/types/index.ts +++ b/test/types/index.ts @@ -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({ @@ -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, }; }, });