web_lib

Common web application libraries
git clone https://radroots.dev/git/web_lib.git
Log | Files | Refs | LICENSE

commit 14f7632c8534be78e7728b72b1ca26d3e831b6e0
parent c30396812a5ab86f08bdd90e4a07e51e608c9625
Author: triesap <137732411+triesap@users.noreply.github.com>
Date:   Wed,  9 Apr 2025 00:50:49 +0000

utils: refactor http utils, add/edit utils. add type imports. migrate types to `@radroots/client`

Diffstat:
Mutils/src/*regex.ts | 5+++++
Mutils/src/*validation.ts | 2+-
Mutils/src/app/util.ts | 2+-
Dutils/src/client/database.ts | 96-------------------------------------------------------------------------------
Mutils/src/client/datastore.ts | 39++++++++++++++++-----------------------
Mutils/src/error.ts | 2+-
Mutils/src/geo.ts | 2+-
Mutils/src/http.ts | 12++++++------
Mutils/src/i18n.ts | 2+-
Mutils/src/index.ts | 1-
Mutils/src/response.ts | 2+-
Mutils/src/types.ts | 8+++++++-
12 files changed, 40 insertions(+), 133 deletions(-)

diff --git a/utils/src/*regex.ts b/utils/src/*regex.ts @@ -49,6 +49,7 @@ export const util_rxp = { }; export type FormFieldsKey = + | `nostr_secret_key` | `product_title` | `product_key` | `product_process` @@ -131,4 +132,8 @@ export const form_fields: Record<FormFieldsKey, FormField> = { charset: util_rxp.alpha_ch, validate: util_rxp.alpha, }, + nostr_secret_key: { + charset: util_rxp.alpha_ch, + validate: util_rxp.alpha, + } }; diff --git a/utils/src/*validation.ts b/utils/src/*validation.ts @@ -1,4 +1,4 @@ -import { GeolocationAddress, GeolocationPoint, parse_int, util_rxp } from "$root"; +import { type GeolocationAddress, type GeolocationPoint, parse_int, util_rxp } from "$root"; import { z } from "zod"; export const vu_area_unit = z.union([ diff --git a/utils/src/app/util.ts b/utils/src/app/util.ts @@ -88,7 +88,7 @@ export const encode_query_params = <T extends string>(params_list: NavigationPar return query ? `?${query}` : ``; }; -export const encode_route = <T extends string>(route: T, params_list?: NavigationParamTuple<T>[]): string => { +export const encode_route = <TRoute extends string, TParam extends string>(route: TRoute, params_list?: NavigationParamTuple<TParam>[]): string => { const query = encode_query_params(params_list); if (!query) return route; return `${route === `/` ? `/` : route.replace(/\/+$/, ``)}${query}`; diff --git a/utils/src/client/database.ts b/utils/src/client/database.ts @@ -1,95 +0,0 @@ - - -export type IClientDatabase< - TILocationGcsCreate extends object, - TLocationGcsCreateResolve extends object, - TILocationGcsRead extends object, - TLocationGcsReadResolve extends object, - TILocationGcsReadList extends object, - TLocationGcsReadListResolve extends object, - TILocationGcsDelete extends object, - TLocationGcsDeleteResolve extends object, - TILocationGcsUpdate extends object, - TLocationGcsUpdateResolve extends object, - TITradeProductCreate extends object, - TTradeProductCreateResolve extends object, - TITradeProductRead extends object, - TTradeProductReadResolve extends object, - TITradeProductReadList extends object, - TTradeProductReadListResolve extends object, - TITradeProductDelete extends object, - TTradeProductDeleteResolve extends object, - TITradeProductUpdate extends object, - TTradeProductUpdateResolve extends object, - TINostrProfileCreate extends object, - TNostrProfileCreateResolve extends object, - TINostrProfileRead extends object, - TNostrProfileReadResolve extends object, - TINostrProfileReadList extends object, - TNostrProfileReadListResolve extends object, - TINostrProfileDelete extends object, - TNostrProfileDeleteResolve extends object, - TINostrProfileUpdate extends object, - TNostrProfileUpdateResolve extends object, - TINostrRelayCreate extends object, - TNostrRelayCreateResolve extends object, - TINostrRelayRead extends object, - TNostrRelayReadResolve extends object, - TINostrRelayReadList extends object, - TNostrRelayReadListResolve extends object, - TINostrRelayDelete extends object, - TNostrRelayDeleteResolve extends object, - TINostrRelayUpdate extends object, - TNostrRelayUpdateResolve extends object, - TIMediaImageCreate extends object, - TMediaImageCreateResolve extends object, - TIMediaImageRead extends object, - TMediaImageReadResolve extends object, - TIMediaImageReadList extends object, - TMediaImageReadListResolve extends object, - TIMediaImageDelete extends object, - TMediaImageDeleteResolve extends object, - TIMediaImageUpdate extends object, - TMediaImageUpdateResolve extends object, - TILogErrorCreate extends object, - TLogErrorCreateResolve extends object, - TILogErrorRead extends object, - TLogErrorReadResolve extends object, - TILogErrorReadList extends object, - TLogErrorReadListResolve extends object, - TILogErrorDelete extends object, - TLogErrorDeleteResolve extends object, - TILogErrorUpdate extends object, - TLogErrorUpdateResolve extends object -> = { - location_gcs_create(opts: TILocationGcsCreate): Promise<TLocationGcsCreateResolve>; - location_gcs_read(opts: TILocationGcsRead): Promise<TLocationGcsReadResolve>; - location_gcs_read_list(opts: TILocationGcsReadList): Promise<TLocationGcsReadListResolve>; - location_gcs_delete(opts: TILocationGcsDelete): Promise<TLocationGcsDeleteResolve>; - location_gcs_update(opts: TILocationGcsUpdate): Promise<TLocationGcsUpdateResolve>; - trade_product_create(opts: TITradeProductCreate): Promise<TTradeProductCreateResolve>; - trade_product_read(opts: TITradeProductRead): Promise<TTradeProductReadResolve>; - trade_product_read_list(opts: TITradeProductReadList): Promise<TTradeProductReadListResolve>; - trade_product_delete(opts: TITradeProductDelete): Promise<TTradeProductDeleteResolve>; - trade_product_update(opts: TITradeProductUpdate): Promise<TTradeProductUpdateResolve>; - nostr_profile_create(opts: TINostrProfileCreate): Promise<TNostrProfileCreateResolve>; - nostr_profile_read(opts: TINostrProfileRead): Promise<TNostrProfileReadResolve>; - nostr_profile_read_list(opts: TINostrProfileReadList): Promise<TNostrProfileReadListResolve>; - nostr_profile_delete(opts: TINostrProfileDelete): Promise<TNostrProfileDeleteResolve>; - nostr_profile_update(opts: TINostrProfileUpdate): Promise<TNostrProfileUpdateResolve>; - nostr_relay_create(opts: TINostrRelayCreate): Promise<TNostrRelayCreateResolve>; - nostr_relay_read(opts: TINostrRelayRead): Promise<TNostrRelayReadResolve>; - nostr_relay_read_list(opts: TINostrRelayReadList): Promise<TNostrRelayReadListResolve>; - nostr_relay_delete(opts: TINostrRelayDelete): Promise<TNostrRelayDeleteResolve>; - nostr_relay_update(opts: TINostrRelayUpdate): Promise<TNostrRelayUpdateResolve>; - media_image_create(opts: TIMediaImageCreate): Promise<TMediaImageCreateResolve>; - media_image_read(opts: TIMediaImageRead): Promise<TMediaImageReadResolve>; - media_image_read_list(opts: TIMediaImageReadList): Promise<TMediaImageReadListResolve>; - media_image_delete(opts: TIMediaImageDelete): Promise<TMediaImageDeleteResolve>; - media_image_update(opts: TIMediaImageUpdate): Promise<TMediaImageUpdateResolve>; - log_error_create(opts: TILogErrorCreate): Promise<TLogErrorCreateResolve>; - log_error_read(opts: TILogErrorRead): Promise<TLogErrorReadResolve>; - log_error_read_list(opts: TILogErrorReadList): Promise<TLogErrorReadListResolve>; - log_error_delete(opts: TILogErrorDelete): Promise<TLogErrorDeleteResolve>; - log_error_update(opts: TILogErrorUpdate): Promise<TLogErrorUpdateResolve>; -}; -\ No newline at end of file diff --git a/utils/src/client/datastore.ts b/utils/src/client/datastore.ts @@ -1,29 +1,22 @@ -import type { ErrorMessage, ResultObj, ResultPass, ResultsList } from ".."; +import type { ResolveError, ResultObj, ResultPass, ResultsList } from "$root"; -export const ds_map = { - key_nostr: `nostr:publickey`, - role: `config:role`, - eula: `eula:date` -}; +export type IClientDatastoreSetResolve = ResolveError<ResultPass>; +export type IClientDatastoreGetResolve = ResolveError<ResultObj<string>>; +export type IClientDatastoreSetPResolve = ResolveError<ResultPass>; +export type IClientDatastoreGetPResolve = ResolveError<ResultObj<string>>; +export type IClientDatastoreKeysResolve = ResolveError<ResultsList<string>>; +export type IClientDatastoreEntriesResolve = ResolveError<ResultsList<[string, unknown]>>; +export type IClientDatastoreRemoveResolve = ResolveError<ResultPass>; -export const ds_map_param = { - radroots_profile: (public_key: string) => `radroots:profile:${public_key}` -}; - -export type IClientDatastoreSetResolve = ResultPass | ErrorMessage<string>; -export type IClientDatastoreGetResolve = ResultObj<string> | ErrorMessage<string>; -export type IClientDatastoreSetPResolve = ResultPass | ErrorMessage<string>; -export type IClientDatastoreGetPResolve = ResultObj<string> | ErrorMessage<string>; -export type IClientDatastoreKeysResolve = ResultsList<string> | ErrorMessage<string>; -export type IClientDatastoreEntriesResolve = ResultsList<[string, unknown]> | ErrorMessage<string>; -export type IClientDatastoreRemoveResolve = ResultPass | ErrorMessage<string>; - -export type IClientDatastore = { +export type IClientDatastore< + TKeyMap extends Record<string, string>, + TParamKeyMap extends Record<string, (...args: any[]) => string> +> = { init(): Promise<void>; - set(key: keyof typeof ds_map, value: string): Promise<IClientDatastoreSetResolve>; - get(key: keyof typeof ds_map): Promise<IClientDatastoreGetResolve>; - setp(key: keyof typeof ds_map_param, key_param: string, value: string): Promise<IClientDatastoreSetPResolve>; - getp(key: keyof typeof ds_map_param, key_param: string): Promise<IClientDatastoreGetPResolve>; + set(key: keyof TKeyMap, value: string): Promise<IClientDatastoreSetResolve>; + get(key: keyof TKeyMap): Promise<IClientDatastoreGetResolve>; + setp<K extends keyof TParamKeyMap>(key: K, key_param: Parameters<TParamKeyMap[K]>[0], value: string): Promise<IClientDatastoreSetPResolve>; + getp<K extends keyof TParamKeyMap>(key: K, key_param: Parameters<TParamKeyMap[K]>[0]): Promise<IClientDatastoreGetPResolve>; keys(): Promise<IClientDatastoreKeysResolve>; entries(): Promise<IClientDatastoreEntriesResolve> remove(key: string): Promise<IClientDatastoreRemoveResolve>; diff --git a/utils/src/error.ts b/utils/src/error.ts @@ -12,7 +12,7 @@ export const err_msg = <T extends string>(err: T): ErrorMessage<T> => { return { err }; }; -export const throw_err = (param: string | ErrorMessage<string>): undefined => { +export const throw_err = (param: string | ErrorMessage<string>): never => { if (typeof param === `string`) throw new Error(param); else throw new Error(param.err); }; diff --git a/utils/src/geo.ts b/utils/src/geo.ts @@ -1,4 +1,4 @@ -import { GeolocationPointTuple, GeometryPoint } from "$root"; +import { type GeolocationPointTuple, type GeometryPoint } from "$root"; import { decodeBase32, encodeBase32 } from "geohashing"; export type GeolocationAddress = { diff --git a/utils/src/http.ts b/utils/src/http.ts @@ -51,17 +51,17 @@ export const lib_http_parse_headers = (headers: Headers): FieldRecord => { export const http_fetch_opts = (opts: IHttpOpts): { url: string; options: RequestInit; } => { const { url } = opts; - const headers: FieldRecord = { - ...opts.headers, - }; - if (opts.authorization) headers['Authorization'] = `Bearer ${encodeURIComponent(opts.authorization)}`; + const method = opts.method ? opts.method.toUpperCase() : `GET`; + const headers = new Headers(); + if (method === `POST`) headers.append(`Content-Type`, `application/json`); + if (opts.authorization) headers.append(`Authorization`, `Bearer ${encodeURIComponent(opts.authorization)}`); + if (opts.headers) Object.entries(opts.headers).forEach(([k, v]) => headers.append(k, v)) const options: RequestInit = { - method: opts.method ? opts.method.toUpperCase() : `GET`, + method, headers, } if (opts.data) options.body = lib_http_to_bodyinit(opts.data); if (opts.data_bin) options.body = opts.data_bin; - return { url, options diff --git a/utils/src/i18n.ts b/utils/src/i18n.ts @@ -1,4 +1,4 @@ -import { Loader } from '@sveltekit-i18n/base'; +import { type Loader } from '@sveltekit-i18n/base'; import type { Config as ConfigIcu, Parser as ParserIcu } from "@sveltekit-i18n/parser-icu"; import parser_icu from "@sveltekit-i18n/parser-icu"; import i18n, { type Config } from 'sveltekit-i18n'; diff --git a/utils/src/index.ts b/utils/src/index.ts @@ -7,7 +7,6 @@ export * from "./app/search" export * from "./app/styles" export * from "./app/util" export * from "./browser" -export * from "./client/database" export * from "./client/datastore" export * from "./client/geo" export * from "./client/gui" diff --git a/utils/src/response.ts b/utils/src/response.ts @@ -17,7 +17,7 @@ export const is_results_response = (response: any): response is { results: strin } export const is_error_response = (response: any): response is { error: string } => { - return "error" in response && typeof response.result === "string"; + return "error" in response && response.error; } export const is_message_response = (response: any): response is NotifyMessage => { diff --git a/utils/src/types.ts b/utils/src/types.ts @@ -1,3 +1,5 @@ +import { ErrorMessage } from "$root"; + export type FieldRecord = Record<string, string>; export type NotifyMessage = { message: string; @@ -24,6 +26,9 @@ export type ResultObj<T> = { result: T; }; export type ResultPublicKey = { public_key: string; }; export type ResultSecretKey = { secret_key: string; }; +export type ResolveError<T> = T | ErrorMessage<string>; +export type ResolveErrorMsg<TRes, TMsg extends string> = TRes | ErrorMessage<TMsg>; + export type FileBytesFormat = `kb` | `mb` | `gb`; export type FileMimeType = string; export type FilePath = { file_path: string; file_name: string; mime_type: FileMimeType; } @@ -33,4 +38,4 @@ export type CallbackPromiseFigureResult<Ti, Tr> = (value: Ti) => Promise<Tr | un export type CallbackPromiseFull<Ti, Tr> = (value: Ti) => Promise<Tr>; export type CallbackPromiseGeneric<T> = (value: T) => Promise<void>; export type CallbackPromiseReturn<T> = () => Promise<T>; -export type CallbackPromiseResult<Tr> = () => Promise<Tr | undefined>; +export type CallbackPromiseResult<Tr> = () => Promise<Tr | undefined>; +\ No newline at end of file