diff --git a/index.d.ts b/index.d.ts index e69de29..edbe260 100644 --- a/index.d.ts +++ b/index.d.ts @@ -0,0 +1,324 @@ +export interface CollectionDocument { + id?: string + insertTime?: Date + updateTime?: Date + [key: string]: any +} + +export interface ReadCollectionOptions { + filter?: { + [key: string]: any + } + selector?: { + [key: string]: any + } + projection?: string + offset?: number + limit?: number + sort?: string[] +} + +interface GetHookData { + /** + * true if only one document was requested via /COLLECTION/ID + */ + one?: boolean + /** + * get list of documents (only valid after stage "read" in "get" hook) + */ + results(): CollectionDocument[] + /** + * filter map only valid for "get" hooks + */ + filter?: { + [key: string]: any + } + /** + * selector map only valid for "get" hooks + */ + selector?: { + [key: string]: any + } + /** + * offset only valid for "get" hooks + */ + offset?: number + /** + * limit only valid for "get" hooks + */ + limit?: number + /** + * sort only valid for "get" hooks + */ + sort?: string[] | string +} + +interface PostHookData { + /** + * post data only valid in "post" and "put" hooks + */ + data?: CollectionDocument +} + +export interface HookContext extends GetHookData, PostHookData { + request(): { + method: string + remoteAddr: string + host: string + url: string + path: string + param(p: string): string + query(q: string): string + header(h: string): string + body(): string + /** + * bodyBytes return []byte go slice of post body for later use pe. in iso8859ToUtf8 + */ + bodyBytes(): string + } + + /** + * read results from a collection + * + * @param colName collection name + * @param options options map + */ + readCollection( + colName: string, + options?: ReadCollectionOptions + ): CollectionDocument[] + + /** + * read count of documents for filter from a collection + * + * @param colName collection name + * @param options options map (only filter is valid) + */ + readCollectionCount( + colName: string, + options?: ReadCollectionOptions + ): number + + /** + * create a document in a collection + * + * @param colName collection name + * @param data data map + */ + createDocument( + colName: string, + data: CollectionDocument + ): CollectionDocument + + /** + * update a document in a collection + * + * @param colName collection name + * @param id id of entry + * @param data new/changed data + */ + updateDocument( + colName: string, + id: string, + data: CollectionDocument + ): CollectionDocument + + /** + * deletes one document by id from collection + * + * @param colName collection name + * @param id id of entry + */ + deleteDocument(colName: string, id: string): { message: "ok" } + + /** + * deletes documents by filter from collection + * + * @param colName collection name + * @param options options map, only filter valid + */ + deleteDocuments( + colName: string, + options?: ReadCollectionOptions + ): { message: "ok"; removed: number } + + /** + * send an email + * + * @param options email options map + */ + mail(options: { + to: string | string[] + cc?: string | string[] + bcc?: string | string[] + subject?: string + from: string + fromName?: string + replyTo?: string + plain?: string + html?: string + attach?: string | string[] + }): void + + /** + * execute a template code and return result + * + * @param code template code + * @param contextData template context map + */ + template( + code: string, + contextData?: { + [key: string]: any + } + ): string + + /** + * read a file relative to config dir and return its content + * + * @param path relative file path + */ + file(path: string): string + + /** + * http request + * + * @param url url for request + * @param options request options + */ + fetch( + url: string, + options?: { + method?: string + headers?: { [key: string]: string } + body?: string + } + ): { + status: number + statusText: string + headers: { [key: string]: string } + trailer: { [key: string]: string } + url: string + body: { + text(): string + json(): any + } + } + + /** + * dumps data to header and server log + * + * @param toDump data to dump + */ + dump(...toDump: any): void + + /** + * set response header + * + * @param name header name + * @param value value + */ + header(name: string, value: any): void + + /** + * get JWT authentication + */ + auth(): { + id: string + username: string + role: number + permissions: string[] + } + + /** + * get Sentry trace id + */ + sentryTraceId(): string + + /** + * hash password via bcrypt algo + * + * @param password clear text password + * @param options hashing options + */ + bcryptHash( + password: string, + options?: { + cost?: number + } + ): string + + /** + * check password against hashed password via bcrypt algo + * + * @param password clear text password + * @param hash hashed password + */ + bcryptCheck(password: string, hash: string): boolean + + /** + * create a jwt signed token string + * + * @param claims data object + * @param options options (secret, validityDuration = expiry in X seconds) + */ + jwtCreate( + claims: { + [key: string]: any + }, + options?: { + secret?: string + validityDuration?: number + } + ): string + + /** + * parse jwt token string + * + * @param token token string + * @param options options (secret) + */ + jwtParse( + token: string, + options?: { + secret?: string + } + ): { + error?: string + valid: boolean + method: { + Name: string + Hash: number + } + header: { + alg: string + typ: string + } + claims: { + exp?: number + [key: string]: any + } + } + + /** + * convert iso8859 to utf8 + * + * @param iso8859 iso string + */ + iso8859ToUtf8(iso8859: string): string +} + +export interface HookException { + status?: number + html?: string + [key: string]: any +} + +export interface HookResponse extends GetHookData, PostHookData { + data?: CollectionDocument + results: any +} + +declare global { + var context: HookContext +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..64ae38d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts" + ] +} \ No newline at end of file