promi-safe
Version:
Type-safe promise wrapper with runtime validation support
1 lines • 2.27 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\ninterface Options {\n onFail?: (issues: readonly StandardSchemaV1.Issue[]) => void;\n throwOnError?: boolean;\n}\n\nexport type SafePromise<T> = Promise<T> & {\n safe: (schema: StandardSchemaV1, options?: Options) => Promise<T>;\n};\n\nexport class ValidationError extends Error {\n constructor(\n public readonly issues: readonly StandardSchemaV1.Issue[],\n message = \"Validation failed\"\n ) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\nexport const validateResponse =\n <T>(promise: Promise<T>) =>\n async (schema: StandardSchemaV1, options?: Options) => {\n const response = await promise;\n const result = schema[\"~standard\"][\"validate\"](response);\n const awaitedResult = await Promise.resolve(result);\n\n const _options: Options = {\n throwOnError: options?.throwOnError ?? true,\n onFail: options?.onFail,\n };\n\n if (awaitedResult.issues) {\n _options.onFail?.(awaitedResult.issues);\n if (_options.throwOnError) {\n throw new ValidationError(awaitedResult.issues);\n }\n }\n\n return response;\n };\n\nexport const makeSafePromise = <T>(promise: Promise<T>): SafePromise<T> =>\n Object.assign(promise, {\n safe: (schema: StandardSchemaV1, options?: Options) =>\n validateResponse(promise)(schema, options),\n });\n"],"mappings":"6MAWO,IAAMA,EAAN,cAA8B,KAAM,CACzC,YACkBC,EAChBC,EAAU,oBACV,CACA,MAAMA,CAAO,EAHG,YAAAD,EAIhB,KAAK,KAAO,iBACd,CACF,EAEaE,EACPC,GACJ,CAAOC,EAA0BC,IAAsBC,EAAA,wBAvBzD,IAAAC,EAAAC,EAwBI,IAAMC,EAAW,MAAMN,EACjBO,EAASN,EAAO,WAAW,EAAE,SAAYK,CAAQ,EACjDE,EAAgB,MAAM,QAAQ,QAAQD,CAAM,EAE5CE,EAAoB,CACxB,cAAcL,EAAAF,GAAA,YAAAA,EAAS,eAAT,KAAAE,EAAyB,GACvC,OAAQF,GAAA,YAAAA,EAAS,MACnB,EAEA,GAAIM,EAAc,UAChBH,EAAAI,EAAS,SAAT,MAAAJ,EAAA,KAAAI,EAAkBD,EAAc,QAC5BC,EAAS,cACX,MAAM,IAAIb,EAAgBY,EAAc,MAAM,EAIlD,OAAOF,CACT,GAEWI,EAAsBV,GACjC,OAAO,OAAOA,EAAS,CACrB,KAAM,CAACC,EAA0BC,IAC/BH,EAAiBC,CAAO,EAAEC,EAAQC,CAAO,CAC7C,CAAC","names":["ValidationError","issues","message","validateResponse","promise","schema","options","__async","_a","_b","response","result","awaitedResult","_options","makeSafePromise"]}