need-result 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,24 +1,78 @@
1
- //#region src/utility.types.d.ts
2
- type LiteralString = "" | (string & Record<never, never>);
3
- //#endregion
4
1
  //#region src/types.d.ts
5
2
  type Ok<T> = [T, null];
6
3
  type Err<E extends ErrorT> = [null, E];
7
4
  type Result<T, E extends ErrorT = ErrorT> = Ok<T> | Err<E>;
8
- type ErrorT<Code extends LiteralString = LiteralString> = {
9
- code: Code;
10
- message: string;
11
- data?: Record<string, unknown>;
12
- cause?: Error | ErrorT | unknown;
13
- };
5
+ //#endregion
6
+ //#region src/utility.types.d.ts
7
+ type LiteralString = "" | (string & Record<never, never>);
14
8
  //#endregion
15
9
  //#region src/index.d.ts
16
10
  declare const ok: <T>(data: T) => Ok<T>;
17
- declare const err: <E extends ErrorT>(error: E) => Err<E>;
18
- declare function trycatch<T, E extends ErrorT = ErrorT>(operation: Promise<T>): Promise<Result<T, E>>;
19
- declare function trycatch<T, E extends ErrorT = ErrorT>(operation: () => never): Result<never, E>;
20
- declare function trycatch<T, E extends ErrorT = ErrorT>(operation: () => Promise<T>): Promise<Result<T, E>>;
21
- declare function trycatch<T, E extends ErrorT = ErrorT>(operation: () => T): Result<T, E>;
11
+ declare function err<E extends ErrorT>(error: E): Err<E>;
12
+ declare function err(error: Error & {
13
+ code?: never;
14
+ }): Err<ErrorT<"UNKNOWN_ERROR", string, string, Record<string, unknown>, Error>>;
15
+ declare function err<Code extends LiteralString = LiteralString, Message extends LiteralString = LiteralString, Hint extends string = string, Data extends Record<string, unknown> = Record<string, unknown>, Cause extends Error | ErrorT | unknown = unknown>(error: {
16
+ code: Code;
17
+ message: Message;
18
+ hint?: Hint;
19
+ data?: Data;
20
+ cause?: Cause;
21
+ }): Err<ErrorT<Uppercase<Code>, Message, Hint, Data, Cause>>;
22
+ declare function err(error: unknown): Err<ErrorT<"UNKNOWN_ERROR", string, string, Record<string, unknown>, unknown>>;
23
+ declare function trycatch<T>(operation: Promise<T>): Promise<Result<T, ErrorT>>;
24
+ declare function trycatch<T>(operation: () => never): Result<never, ErrorT>;
25
+ declare function trycatch<T>(operation: () => Promise<T>): Promise<Result<T, ErrorT>>;
26
+ declare function trycatch<T>(operation: () => T): Result<T, ErrorT>;
27
+ declare const TTY_COLORS: {
28
+ readonly reset: "\u001B[0m";
29
+ readonly bright: "\u001B[1m";
30
+ readonly dim: "\u001B[2m";
31
+ readonly undim: "\u001B[22m";
32
+ readonly underscore: "\u001B[4m";
33
+ readonly blink: "\u001B[5m";
34
+ readonly reverse: "\u001B[7m";
35
+ readonly hidden: "\u001B[8m";
36
+ readonly fg: {
37
+ readonly black: "\u001B[30m";
38
+ readonly red: "\u001B[31m";
39
+ readonly green: "\u001B[32m";
40
+ readonly yellow: "\u001B[33m";
41
+ readonly blue: "\u001B[34m";
42
+ readonly magenta: "\u001B[35m";
43
+ readonly cyan: "\u001B[36m";
44
+ readonly white: "\u001B[37m";
45
+ };
46
+ readonly bg: {
47
+ readonly black: "\u001B[40m";
48
+ readonly red: "\u001B[41m";
49
+ readonly green: "\u001B[42m";
50
+ readonly yellow: "\u001B[43m";
51
+ readonly blue: "\u001B[44m";
52
+ readonly magenta: "\u001B[45m";
53
+ readonly cyan: "\u001B[46m";
54
+ readonly white: "\u001B[47m";
55
+ };
56
+ };
57
+ declare const logError: <ShouldReturn extends boolean = false>(error: ErrorT | Err<ErrorT>, shouldReturn?: ShouldReturn) => ShouldReturn extends true ? string : undefined;
58
+ declare class ErrorT<Code extends LiteralString = LiteralString, Message extends LiteralString = LiteralString, Hint extends string = string, Data extends Record<string, unknown> = Record<string, unknown>, Cause extends Error | ErrorT | unknown = unknown> {
59
+ code: Uppercase<Code>;
60
+ data?: Data;
61
+ cause?: Cause;
62
+ hint?: Hint;
63
+ message: Message;
64
+ name: string;
65
+ stack: string;
66
+ constructor(error: {
67
+ code: Code;
68
+ data?: Data;
69
+ cause?: Cause;
70
+ message: Message;
71
+ hint?: Hint;
72
+ stackSkip?: Function;
73
+ });
74
+ toString(): string;
75
+ }
22
76
  //#endregion
23
- export { Err, ErrorT, Ok, Result, err, ok, trycatch };
77
+ export { Err, ErrorT, Ok, Result, TTY_COLORS, err, logError, ok, trycatch };
24
78
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/utility.types.ts","../src/types.ts","../src/index.ts"],"sourcesContent":[],"mappings":";KAAY,aAAA,kBAA+B;;;AAA/B,KCEA,EDFA,CAAA,CAAA,CAAA,GAAa,CCEJ,CDFI,EAAA,IAAA,CAAA;KCIb,cAAc,iBAAiB;KAE/B,oBAAoB,SAAS,UAAU,GAAG,KAAK,IAAI;KAEnD,oBAAoB,gBAAgB;EANpC,IAAA,EAOL,IAPO;EAEF,OAAG,EAAA,MAAA;EAEH,IAAA,CAAA,EAKJ,MALU,CAAA,MAAA,EAAA,OAAA,CAAA;EAAc,KAAA,CAAA,EAMvB,KANuB,GAMf,MANe,GAAA,OAAA;CAAS;;;cCF5B,cAAe,MAAI,GAAG;cAEtB,gBAAiB,eAAe,MAAI,IAAI;iBAqBrC,sBAAsB,SAAS,mBACnC,QAAQ,KACjB,QAAQ,OAAO,GAAG;AD3BT,iBC6BI,QD7BM,CAAA,CAAA,EAAA,UC6BgB,MD7BhB,GC6ByB,MD7BzB,CAAA,CAAA,SAAA,EAAA,GAAA,GAAA,KAAA,CAAA,EC+BnB,MD/BmB,CAAA,KAAA,EC+BL,CD/BK,CAAA;AAEV,iBC+BI,QD/B4B,CAAA,CAAA,EAAA,UC+BN,MD/BM,GC+BG,MD/BH,CAAA,CAAA,SAAA,EAAA,GAAA,GCgC1B,ODhC0B,CCgClB,CDhCkB,CAAA,CAAA,ECiCzC,ODjCyC,CCiCjC,MDjCiC,CCiC1B,CDjC0B,ECiCvB,CDjCuB,CAAA,CAAA;AAEhC,iBCiCI,QDjCE,CAAA,CAAA,EAAA,UCiCoB,MDjCpB,GCiC6B,MDjC7B,CAAA,CAAA,SAAA,EAAA,GAAA,GCkCA,CDlCA,CAAA,ECmCf,MDnCe,CCmCR,CDnCQ,ECmCL,CDnCK,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/utility.types.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,10 @@
1
- const e=e=>[e,null],t=e=>e instanceof Error&&`code`in e&&`message`in e?[null,e]:[null,{code:`UNKNOWN_ERROR`,message:e instanceof Error?e.message:String(e),cause:e instanceof Error?e:void 0}];function n(n){try{let i=typeof n==`function`?n():n;return r(i)?Promise.resolve(i).then(t=>e(t)).catch(e=>t(e)):e(i)}catch(e){return e instanceof Error?t({code:`UNKNOWN_ERROR`,message:e instanceof Error?e.message:String(e)}):t(e)}}const r=e=>!!e&&(typeof e==`object`||typeof e==`function`)&&typeof e.then==`function`;export{t as err,e as ok,n as trycatch};
1
+ const e=e=>!!e&&(typeof e==`object`||typeof e==`function`)&&typeof e.then==`function`;function t(e){let n={};return`captureStackTrace`in Error?Error.captureStackTrace(n,e??t):n.stack=Error().stack,n.stack}function n(e,t){let n=` `.repeat(t);return e.split(`
2
+ `).map(e=>n+e).join(`
3
+ `)}const r=e=>[e,null];function i(e){if(e instanceof c)return[null,e];if(e instanceof Error)return[null,new c({code:`UNKNOWN_ERROR`,message:`message`in e?e.message:String(e),cause:e??void 0,stackSkip:i})];if(typeof e==`object`&&e&&`code`in e&&`message`in e){let t=e;return[null,new c({code:t.code,message:t.message,hint:t.hint,data:t.data,cause:t.cause,stackSkip:i})]}let t=e;return[null,new c({code:`UNKNOWN_ERROR`,message:typeof t==`object`&&t&&`message`in t&&typeof t.message==`string`?t.message:String(e)||`Unknown error`,cause:e??void 0})]}function a(t){try{let n=typeof t==`function`?t():t;return e(n)?Promise.resolve(n).then(e=>r(e)).catch(e=>i(e)):r(n)}catch(e){return i(e)}}const o={reset:`\x1B[0m`,bright:`\x1B[1m`,dim:`\x1B[2m`,undim:`\x1B[22m`,underscore:`\x1B[4m`,blink:`\x1B[5m`,reverse:`\x1B[7m`,hidden:`\x1B[8m`,fg:{black:`\x1B[30m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,cyan:`\x1B[36m`,white:`\x1B[37m`},bg:{black:`\x1B[40m`,red:`\x1B[41m`,green:`\x1B[42m`,yellow:`\x1B[43m`,blue:`\x1B[44m`,magenta:`\x1B[45m`,cyan:`\x1B[46m`,white:`\x1B[47m`}},s=(e,t=!1)=>{let{code:r,message:i,stack:a,name:s,cause:c,hint:l,data:u,...d}=Array.isArray(e)?e[1]:e;for(let[e,t]of Object.entries(d))t===void 0&&delete d[e];let f=`${o.dim}│${o.reset} `,p=`${o.dim}└${o.reset} `,m=[`\n${f} ${o.dim}Code:${o.reset} ${o.bright}${o.fg.red}${r}${o.reset}`,`${f} ${o.dim}Message:${o.reset} ${o.fg.red}${i}${o.reset}`,l?`${f} ${o.dim}Hint:${o.reset} ${l}${o.reset}`:``,c?`${f} ${o.dim}Cause:${o.reset} ${c}`:``,u?`${f} ${o.dim}Data:${o.reset}\n${n(JSON.stringify(u,null,2),4).split(`
4
+ `).map(e=>`${f} ${e}`).join(`
5
+ `)}${o.reset}`:``,`${p} ${o.fg.black}${n(a,5).slice(3)}${o.reset}`].filter(e=>e!==``).map(e=>typeof e==`string`?n(e,2):e).join(`
6
+ `),h=[`${o.bright}${o.fg.red}Error:${o.reset}`,m,Object.keys(d).length>0?JSON.stringify(d,null,2):``,o.reset];if(t)return h.join(`
7
+ `);console.error(...h)};var c=class e{code;data;cause;hint;message;name;stack;constructor(n){this.name=`ErrorT`,this.code=n.code?.toUpperCase()||`UNKNOWN_ERROR`,this.data=n.data,this.cause=n.cause,this.message=n.message||`Unknown error`,this.hint=n.hint;let r=t(n.stackSkip??e);r=r.replace(`Error`,``).split(`
8
+ `).map(e=>e.trimStart()).join(`
9
+ `).trim(),this.stack=r||`Unknown stack`}toString(){return s(this,!0)}};export{c as ErrorT,o as TTY_COLORS,i as err,s as logError,r as ok,a as trycatch};
2
10
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type { Err, ErrorT, Ok, Result } from \"./types\";\n\nexport * from \"./types\";\n\nexport const ok = <T>(data: T): Ok<T> => [data, null];\n\nexport const err = <E extends ErrorT>(error: E): Err<E> => {\n\tif (error instanceof Error && \"code\" in error && \"message\" in error) {\n\t\treturn [null, error as E];\n\t}\n\n\t// Convert to ErrorT format\n\tconst errorParsed: ErrorT = {\n\t\tcode: \"UNKNOWN_ERROR\" as const,\n\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\tcause: error instanceof Error ? error : undefined,\n\t};\n\treturn [null, errorParsed as E];\n};\n\ntype Operation<T> = Promise<T> | (() => T) | (() => Promise<T>);\n\n//----------------------------------------------------\n// Some of the try-catch code was a copy from\n// https://gist.github.com/t3dotgg/a486c4ae66d32bf17c09c73609dacc5b\n//----------------------------------------------------\n\nexport function trycatch<T, E extends ErrorT = ErrorT>(\n\toperation: Promise<T>,\n): Promise<Result<T, E>>;\n\nexport function trycatch<T, E extends ErrorT = ErrorT>(\n\toperation: () => never,\n): Result<never, E>;\n\nexport function trycatch<T, E extends ErrorT = ErrorT>(\n\toperation: () => Promise<T>,\n): Promise<Result<T, E>>;\n\nexport function trycatch<T, E extends ErrorT = ErrorT>(\n\toperation: () => T,\n): Result<T, E>;\n\nexport function trycatch<T, E extends ErrorT = ErrorT>(\n\toperation: Operation<T>,\n): Result<T, E> | Promise<Result<T, E>> {\n\ttry {\n\t\tconst result = typeof operation === \"function\" ? operation() : operation;\n\n\t\tif (isPromise(result)) {\n\t\t\treturn Promise.resolve(result)\n\t\t\t\t.then((data) => ok(data))\n\t\t\t\t.catch((error) => err(error));\n\t\t}\n\n\t\treturn ok(result);\n\t} catch (error) {\n\t\tif (!(error instanceof Error)) {\n\t\t\treturn err(error as E);\n\t\t}\n\t\treturn err({\n\t\t\tcode: \"UNKNOWN_ERROR\",\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t} as E);\n\t}\n}\n\nconst isPromise = <T = any>(value: unknown): value is Promise<T> => {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === \"object\" || typeof value === \"function\") &&\n\t\ttypeof (value as any).then === \"function\"\n\t);\n};\n"],"mappings":"AAIA,MAAa,EAAS,GAAmB,CAAC,EAAM,KAAK,CAExC,EAAyB,GACjC,aAAiB,OAAS,SAAU,GAAS,YAAa,EACtD,CAAC,KAAM,EAAW,CASnB,CAAC,KALoB,CAC3B,KAAM,gBACN,QAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAC/D,MAAO,aAAiB,MAAQ,EAAQ,IAAA,GACxC,CAC8B,CA0BhC,SAAgB,EACf,EACuC,CACvC,GAAI,CACH,IAAM,EAAS,OAAO,GAAc,WAAa,GAAW,CAAG,EAQ/D,OANI,EAAU,EAAO,CACb,QAAQ,QAAQ,EAAO,CAC5B,KAAM,GAAS,EAAG,EAAK,CAAC,CACxB,MAAO,GAAU,EAAI,EAAM,CAAC,CAGxB,EAAG,EAAO,OACT,EAAO,CAIf,OAHM,aAAiB,MAGhB,EAAI,CACV,KAAM,gBACN,QAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAC/D,CAAM,CALC,EAAI,EAAW,EASzB,MAAM,EAAsB,GAE1B,CAAC,CAAC,IACD,OAAO,GAAU,UAAY,OAAO,GAAU,aAC/C,OAAQ,EAAc,MAAS"}
1
+ {"version":3,"file":"index.mjs","names":["target: { stack?: string }","padding"],"sources":["../src/utility.ts","../src/index.ts"],"sourcesContent":["export const isPromise = <T = any>(value: unknown): value is Promise<T> => {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === \"object\" || typeof value === \"function\") &&\n\t\ttypeof (value as any).then === \"function\"\n\t);\n};\n\nexport function capture(stackSkip?: Function) {\n\tconst target: { stack?: string } = {};\n\tif (\"captureStackTrace\" in Error) {\n\t\t(Error as any).captureStackTrace(target, stackSkip ?? capture);\n\t} else {\n\t\ttarget.stack = new Error().stack;\n\t}\n\treturn target.stack!;\n}\n\nexport function padding(text: string, spaces: number): string {\n\tconst padding = \" \".repeat(spaces);\n\treturn text\n\t\t.split(\"\\n\")\n\t\t.map((line) => padding + line)\n\t\t.join(\"\\n\");\n}\n","import type { Err, Ok, Result } from \"./types\";\nimport { capture, isPromise, padding } from \"./utility\";\nimport type { LiteralString } from \"./utility.types\";\n\nexport * from \"./types\";\n\nexport const ok = <T>(data: T): Ok<T> => [data, null];\n\nexport function err<E extends ErrorT>(error: E): Err<E>;\nexport function err(\n\terror: Error & { code?: never },\n): Err<ErrorT<\"UNKNOWN_ERROR\", string, string, Record<string, unknown>, Error>>;\nexport function err<\n\tCode extends LiteralString = LiteralString,\n\tMessage extends LiteralString = LiteralString,\n\tHint extends string = string,\n\tData extends Record<string, unknown> = Record<string, unknown>,\n\tCause extends Error | ErrorT | unknown = unknown,\n>(error: {\n\tcode: Code;\n\tmessage: Message;\n\thint?: Hint;\n\tdata?: Data;\n\tcause?: Cause;\n}): Err<ErrorT<Uppercase<Code>, Message, Hint, Data, Cause>>;\nexport function err(\n\terror: unknown,\n): Err<\n\tErrorT<\"UNKNOWN_ERROR\", string, string, Record<string, unknown>, unknown>\n>;\nexport function err(\n\terror:\n\t\t| Error\n\t\t| unknown\n\t\t| {\n\t\t\t\tcode: LiteralString;\n\t\t\t\tmessage: LiteralString;\n\t\t\t\thint?: string;\n\t\t\t\tdata?: Record<string, unknown>;\n\t\t\t\tcause?: Error | ErrorT | unknown;\n\t\t }\n\t\t| ErrorT,\n): Err<ErrorT> {\n\tif (error instanceof ErrorT) {\n\t\treturn [null, error] as Err<ErrorT>;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn [\n\t\t\tnull,\n\t\t\tnew ErrorT({\n\t\t\t\tcode: \"UNKNOWN_ERROR\",\n\t\t\t\tmessage: \"message\" in error ? error.message : String(error),\n\t\t\t\tcause: error ?? undefined,\n\t\t\t\tstackSkip: err,\n\t\t\t}),\n\t\t];\n\t}\n\n\tif (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t\"message\" in error\n\t) {\n\t\tconst errorObj = error as {\n\t\t\tcode: LiteralString;\n\t\t\tmessage: LiteralString;\n\t\t\thint?: string;\n\t\t\tdata?: Record<string, unknown>;\n\t\t\tcause?: Error | ErrorT | unknown;\n\t\t};\n\t\treturn [\n\t\t\tnull,\n\t\t\tnew ErrorT({\n\t\t\t\tcode: errorObj.code,\n\t\t\t\tmessage: errorObj.message,\n\t\t\t\thint: errorObj.hint,\n\t\t\t\tdata: errorObj.data,\n\t\t\t\tcause: errorObj.cause,\n\t\t\t\tstackSkip: err,\n\t\t\t}),\n\t\t];\n\t}\n\n\tconst unknownError = error as unknown;\n\n\tconst e = new ErrorT({\n\t\tcode: \"UNKNOWN_ERROR\",\n\t\tmessage:\n\t\t\ttypeof unknownError === \"object\" &&\n\t\t\tunknownError !== null &&\n\t\t\t\"message\" in unknownError &&\n\t\t\ttypeof unknownError.message === \"string\"\n\t\t\t\t? unknownError.message\n\t\t\t\t: String(error) || \"Unknown error\",\n\t\tcause: error ?? undefined,\n\t});\n\treturn [null, e];\n}\n\n//----------------------------------------------------\n// Some of the try-catch code was a copy from\n// https://gist.github.com/t3dotgg/a486c4ae66d32bf17c09c73609dacc5b\n//----------------------------------------------------\ntype Operation<T> = Promise<T> | (() => T) | (() => Promise<T>);\n\nexport function trycatch<T>(operation: Promise<T>): Promise<Result<T, ErrorT>>;\n\nexport function trycatch<T>(operation: () => never): Result<never, ErrorT>;\n\nexport function trycatch<T>(\n\toperation: () => Promise<T>,\n): Promise<Result<T, ErrorT>>;\n\nexport function trycatch<T>(operation: () => T): Result<T, ErrorT>;\n\nexport function trycatch<T>(\n\toperation: Operation<T>,\n): Result<T, ErrorT> | Promise<Result<T, ErrorT>> {\n\ttry {\n\t\tconst result = typeof operation === \"function\" ? operation() : operation;\n\n\t\tif (isPromise(result)) {\n\t\t\treturn Promise.resolve(result)\n\t\t\t\t.then((data) => ok(data))\n\t\t\t\t.catch((error) => err(error));\n\t\t}\n\n\t\treturn ok(result);\n\t} catch (error) {\n\t\treturn err(error);\n\t}\n}\n\n// ----------------------------------------------------\n\nexport const TTY_COLORS = {\n\treset: \"\\x1b[0m\",\n\tbright: \"\\x1b[1m\",\n\tdim: \"\\x1b[2m\",\n\tundim: \"\\x1b[22m\",\n\tunderscore: \"\\x1b[4m\",\n\tblink: \"\\x1b[5m\",\n\treverse: \"\\x1b[7m\",\n\thidden: \"\\x1b[8m\",\n\tfg: {\n\t\tblack: \"\\x1b[30m\",\n\t\tred: \"\\x1b[31m\",\n\t\tgreen: \"\\x1b[32m\",\n\t\tyellow: \"\\x1b[33m\",\n\t\tblue: \"\\x1b[34m\",\n\t\tmagenta: \"\\x1b[35m\",\n\t\tcyan: \"\\x1b[36m\",\n\t\twhite: \"\\x1b[37m\",\n\t},\n\tbg: {\n\t\tblack: \"\\x1b[40m\",\n\t\tred: \"\\x1b[41m\",\n\t\tgreen: \"\\x1b[42m\",\n\t\tyellow: \"\\x1b[43m\",\n\t\tblue: \"\\x1b[44m\",\n\t\tmagenta: \"\\x1b[45m\",\n\t\tcyan: \"\\x1b[46m\",\n\t\twhite: \"\\x1b[47m\",\n\t},\n} as const;\n\nexport const logError = <ShouldReturn extends boolean = false>(\n\terror: ErrorT | Err<ErrorT>,\n\tshouldReturn: ShouldReturn = false as ShouldReturn,\n): ShouldReturn extends true ? string : undefined => {\n\tconst { code, message, stack, name, cause, hint, data, ...rest } =\n\t\tArray.isArray(error) ? error[1] : error;\n\tfor (const [key, value] of Object.entries(rest)) {\n\t\t//@ts-expect-error - intentional\n\t\tif (typeof value === \"undefined\") delete rest[key];\n\t}\n\n\tconst l = `${TTY_COLORS.dim}│${TTY_COLORS.reset} `;\n\tconst cl = `${TTY_COLORS.dim}└${TTY_COLORS.reset} `;\n\n\tconst lines = [\n\t\t`\\n${l} ${TTY_COLORS.dim}Code:${TTY_COLORS.reset} ${TTY_COLORS.bright}${TTY_COLORS.fg.red}${code}${TTY_COLORS.reset}`,\n\t\t`${l} ${TTY_COLORS.dim}Message:${TTY_COLORS.reset} ${TTY_COLORS.fg.red}${message}${TTY_COLORS.reset}`,\n\t\thint\n\t\t\t? `${l} ${TTY_COLORS.dim}Hint:${TTY_COLORS.reset} ${hint}${TTY_COLORS.reset}`\n\t\t\t: \"\",\n\t\tcause ? `${l} ${TTY_COLORS.dim}Cause:${TTY_COLORS.reset} ${cause}` : \"\",\n\t\tdata\n\t\t\t? `${l} ${TTY_COLORS.dim}Data:${TTY_COLORS.reset}\\n${padding(\n\t\t\t\t\tJSON.stringify(data, null, 2),\n\t\t\t\t\t4,\n\t\t\t\t)\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.map((x) => `${l} ${x}`)\n\t\t\t\t\t.join(\"\\n\")}${TTY_COLORS.reset}`\n\t\t\t: \"\",\n\t\t`${cl} ${TTY_COLORS.fg.black}${padding(stack, 5).slice(3)}${TTY_COLORS.reset}`,\n\t]\n\t\t.filter((x) => x !== \"\")\n\t\t.map((x) => {\n\t\t\tif (typeof x === \"string\") {\n\t\t\t\treturn padding(x, 2);\n\t\t\t}\n\t\t\treturn x;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tconst result = [\n\t\t`${TTY_COLORS.bright}${TTY_COLORS.fg.red}Error:${TTY_COLORS.reset}`,\n\t\tlines,\n\t\tObject.keys(rest).length > 0 ? JSON.stringify(rest, null, 2) : \"\",\n\t\tTTY_COLORS.reset,\n\t];\n\n\tif (shouldReturn) {\n\t\treturn result.join(\"\\n\") as any;\n\t}\n\tconsole.error(...result);\n\treturn undefined as any;\n};\n\nexport class ErrorT<\n\tCode extends LiteralString = LiteralString,\n\tMessage extends LiteralString = LiteralString,\n\tHint extends string = string,\n\tData extends Record<string, unknown> = Record<string, unknown>,\n\tCause extends Error | ErrorT | unknown = unknown,\n> {\n\tcode: Uppercase<Code>;\n\tdata?: Data;\n\tcause?: Cause;\n\thint?: Hint;\n\tmessage: Message;\n\tname: string;\n\tstack: string;\n\tconstructor(error: {\n\t\tcode: Code;\n\t\tdata?: Data;\n\t\tcause?: Cause;\n\t\tmessage: Message;\n\t\thint?: Hint;\n\t\tstackSkip?: Function;\n\t}) {\n\t\tthis.name = \"ErrorT\";\n\t\t//@ts-expect-error - last resort\n\t\tthis.code =\n\t\t\t((error.code as string)?.toUpperCase() as Uppercase<Code>) ||\n\t\t\t\"UNKNOWN_ERROR\";\n\t\tthis.data = error.data;\n\t\tthis.cause = error.cause;\n\t\t//@ts-expect-error - last resort\n\t\tthis.message = error.message || \"Unknown error\";\n\t\tthis.hint = error.hint;\n\t\tlet stack = capture(error.stackSkip ?? ErrorT);\n\t\tstack = stack\n\t\t\t.replace(\"Error\", \"\")\n\t\t\t.split(\"\\n\")\n\t\t\t.map((x) => x.trimStart())\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\t\tthis.stack = stack || \"Unknown stack\";\n\t}\n\n\ttoString() {\n\t\treturn logError(this, true);\n\t}\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "need-result",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "packageManager": "bun@1.3.5",
6
6
  "license": "MIT",
7
7
  "scripts": {
8
8
  "build": "tsdown",
9
9
  "dev": "tsdown --watch",
10
+ "playground": "bun run src/playground.ts",
10
11
  "publish": "bun publish --access public",
11
12
  "lint": "biome check",
12
13
  "lint:fix": "biome check . --fix --unsafe",
@@ -17,7 +18,7 @@
17
18
  },
18
19
  "repository": {
19
20
  "type": "git",
20
- "url": "https://github.com/need-result/need-result.git"
21
+ "url": "https://github.com/ping-maxwell/need-result.git"
21
22
  },
22
23
  "devDependencies": {
23
24
  "tsdown": "^0.18.3",