neverpanic 0.0.5 → 1.0.0-beta.2

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/README.md CHANGED
@@ -19,20 +19,23 @@ Create a safe function from an unsafe one:
19
19
 
20
20
  ```ts
21
21
  const getUser = n.safeFn(
22
- async (id: string) => {
23
- const res = await fetch(`https://example.com/users/${id}`);
24
- if (!res.ok) return { success: false, error: "FAILED_TO_FETCH" };
25
-
26
- return { success: true, data: await res.json() };
27
- },
28
- (err) => "FAILED_TO_GET_USER",
22
+ async (id: string) => {
23
+ const res = await fetch(
24
+ `https://example.com/users/${id}`,
25
+ );
26
+ if (!res.ok)
27
+ return { success: false, error: "FAILED_TO_FETCH" };
28
+
29
+ return { success: true, data: await res.json() };
30
+ },
31
+ (err) => "FAILED_TO_GET_USER",
29
32
  );
30
33
 
31
34
  const getUserResult = await getUser("some-user-id");
32
35
  if (!getUserResult.success) {
33
- console.error(getUserResult.error);
36
+ console.error(getUserResult.error);
34
37
  } else {
35
- console.log(getUserResult.data);
38
+ console.log(getUserResult.data);
36
39
  }
37
40
  ```
38
41
 
@@ -43,12 +46,12 @@ Runs the provided callback function, catching any thrown errors and returning a
43
46
 
44
47
  ```ts
45
48
  const user = await n.fromUnsafe(
46
- () => db.findUser("some-user-id"),
47
- (err) => "FAILED_T0_FIND_USER",
49
+ () => db.findUser("some-user-id"),
50
+ (err) => "FAILED_T0_FIND_USER",
48
51
  );
49
52
  if (!user.success) {
50
- console.error(user.error);
53
+ console.error(user.error);
51
54
  } else {
52
- console.log(user.data);
55
+ console.log(user.data);
53
56
  }
54
57
  ```
package/dist/index.d.ts CHANGED
@@ -5,60 +5,37 @@ export type Result<T = unknown, E = unknown> = {
5
5
  success: false;
6
6
  error: E;
7
7
  };
8
- type DataOf<R extends Result> = R extends {
9
- success: true;
10
- data: infer D;
11
- } ? D : never;
12
- type ErrorOf<R extends Result> = R extends {
13
- success: false;
14
- error: infer E;
15
- } ? E : never;
16
- /**
17
- * Create a safe function from an unsafe one.
18
- *
19
- * @param cb - The async function to wrap.
20
- * @param [eh] - Optional fallback error handler.
21
- * @returns A new function that returns a typesafe Result.
22
- *
23
- * @example
24
- * const getUser = n.safeFn(
25
- * async (id: string) => {
26
- * const res = await fetch(`https://example.com/users/${id}`);
27
- * if (!res.ok) return { success: false, error: "FAILED_TO_FETCH" };
28
- *
29
- * return { success: true, data: await res.json() };
30
- * },
31
- * () => "FAILED_TO_GET_USER"
32
- * );
33
- *
34
- * const getUserResult = await getUser("some-user-id");
35
- * if (!getUserResult.success) {
36
- * console.error(getUserResult.error);
37
- * } else {
38
- * console.log(getUserResult.data);
39
- * }
40
- */
41
- declare function safeFn<T extends Result | Promise<Result>, A extends unknown[], E = null>(cb: (...args: A) => T, eh?: (e: unknown) => E): (...args: A) => T | Result<never, E>;
42
- /**
43
- * Run an unsafe function, handle any errors and return a Result.
44
- *
45
- * @param cb - The async function to call.
46
- * @param [eh] - Optional fallback error handler.
47
- * @returns The awaited return value of cb.
48
- *
49
- * @example
50
- * const user = await n.fromUnsafe(() => db.findUser('some-user-id'), () => 'FAILED_T0_FIND_USER')
51
- * if (!user.success) {
52
- * console.error(user.error)
53
- * } else {
54
- * console.log(user.data)
55
- * }
56
- */
57
- declare function fromUnsafe<T, E = null, R = T extends Promise<unknown> ? Promise<Result<Awaited<T>, E>> : Result<T, E>>(cb: () => T, eh?: (err: unknown) => E): R;
58
- declare function resultsToResult<R extends Result[]>(results: R): Result<DataOf<R[number]>[], ErrorOf<R[number]>[]>;
8
+ export declare const createNeverpanic: <D = unknown, E = unknown>() => {
9
+ ok: <const T extends D>(data: T) => Result<T, never>;
10
+ err: <const T extends E>(error: T) => Result<never, T>;
11
+ safeFn: <T extends Result<D, E> | Promise<Result<D, E>>, A extends unknown[], EH extends Result<D, E>>(cb: (...args: A) => T, eh: (e: unknown) => EH) => ((...args: A) => T | EH);
12
+ fromUnsafe: <T extends D | Promise<D>, EH_1 extends Result<D, E>, R = T extends Promise<infer U> ? Promise<{
13
+ success: true;
14
+ data: U;
15
+ }> : {
16
+ success: true;
17
+ data: T;
18
+ }>(cb: () => T, eh: (err: unknown) => EH_1) => R | EH_1;
19
+ resultsToResult: <T extends Result<D, E>[], TD extends Extract<T[number], {
20
+ success: true;
21
+ }>, TE extends Extract<T[number], {
22
+ success: false;
23
+ }>>(results: T) => Result<TD[], TE[]>;
24
+ };
59
25
  export declare const n: {
60
- safeFn: typeof safeFn;
61
- fromUnsafe: typeof fromUnsafe;
62
- resultsToResult: typeof resultsToResult;
26
+ ok: <const T extends unknown>(data: T) => Result<T, never>;
27
+ err: <const T extends unknown>(error: T) => Result<never, T>;
28
+ safeFn: <T extends Result<unknown, unknown> | Promise<Result<unknown, unknown>>, A extends unknown[], EH extends Result<unknown, unknown>>(cb: (...args: A) => T, eh: (e: unknown) => EH) => (...args: A) => T | EH;
29
+ fromUnsafe: <T extends unknown, EH extends Result<unknown, unknown>, R = T extends Promise<infer U> ? Promise<{
30
+ success: true;
31
+ data: U;
32
+ }> : {
33
+ success: true;
34
+ data: T;
35
+ }>(cb: () => T, eh: (err: unknown) => EH) => EH | R;
36
+ resultsToResult: <T extends Result<unknown, unknown>[], TD extends Extract<T[number], {
37
+ success: true;
38
+ }>, TE extends Extract<T[number], {
39
+ success: false;
40
+ }>>(results: T) => Result<TD[], TE[]>;
63
41
  };
64
- export {};
package/dist/index.js CHANGED
@@ -1,92 +1,53 @@
1
- /**
2
- * Create a safe function from an unsafe one.
3
- *
4
- * @param cb - The async function to wrap.
5
- * @param [eh] - Optional fallback error handler.
6
- * @returns A new function that returns a typesafe Result.
7
- *
8
- * @example
9
- * const getUser = n.safeFn(
10
- * async (id: string) => {
11
- * const res = await fetch(`https://example.com/users/${id}`);
12
- * if (!res.ok) return { success: false, error: "FAILED_TO_FETCH" };
13
- *
14
- * return { success: true, data: await res.json() };
15
- * },
16
- * () => "FAILED_TO_GET_USER"
17
- * );
18
- *
19
- * const getUserResult = await getUser("some-user-id");
20
- * if (!getUserResult.success) {
21
- * console.error(getUserResult.error);
22
- * } else {
23
- * console.log(getUserResult.data);
24
- * }
25
- */
26
- function safeFn(cb, eh) {
27
- const createErrorResult = (e) => ({
1
+ export const createNeverpanic = () => {
2
+ const ok = (data) => ({
3
+ success: true,
4
+ data,
5
+ });
6
+ const err = (error) => ({
28
7
  success: false,
29
- error: eh?.(e) ?? null,
8
+ error,
30
9
  });
31
- return (...args) => {
10
+ const safeFn = (cb, eh) => (...args) => {
32
11
  try {
33
12
  const result = cb(...args);
34
13
  if (result instanceof Promise)
35
- return result.catch(createErrorResult);
14
+ return result.catch(eh);
36
15
  return result;
37
16
  }
38
17
  catch (e) {
39
- return createErrorResult(e);
18
+ return eh(e);
40
19
  }
41
20
  };
42
- }
43
- /**
44
- * Run an unsafe function, handle any errors and return a Result.
45
- *
46
- * @param cb - The async function to call.
47
- * @param [eh] - Optional fallback error handler.
48
- * @returns The awaited return value of cb.
49
- *
50
- * @example
51
- * const user = await n.fromUnsafe(() => db.findUser('some-user-id'), () => 'FAILED_T0_FIND_USER')
52
- * if (!user.success) {
53
- * console.error(user.error)
54
- * } else {
55
- * console.log(user.data)
56
- * }
57
- */
58
- function fromUnsafe(cb, eh) {
59
- const createErrorResult = (e) => ({
60
- success: false,
61
- error: eh?.(e) ?? null,
62
- });
63
- const createSuccessResult = (data) => ({
64
- success: true,
65
- data,
66
- });
67
- try {
68
- const result = cb();
69
- if (result instanceof Promise)
70
- return result.then(createSuccessResult).catch(createErrorResult);
71
- return createSuccessResult(result);
72
- }
73
- catch (e) {
74
- return createErrorResult(e);
75
- }
76
- }
77
- function resultsToResult(results) {
78
- let success = true;
79
- const error = [];
80
- const data = [];
81
- for (const result of results) {
82
- if (!result.success) {
83
- success = false;
84
- error.push(result.error);
21
+ const fromUnsafe = (cb, eh) => {
22
+ try {
23
+ const result = cb();
24
+ if (result instanceof Promise)
25
+ return result.then(ok).catch(eh);
26
+ return ok(result);
85
27
  }
86
- else {
87
- data.push(result.data);
28
+ catch (e) {
29
+ return eh(e);
88
30
  }
89
- }
90
- return success ? { success: true, data } : { success: false, error };
91
- }
92
- export const n = { safeFn, fromUnsafe, resultsToResult };
31
+ };
32
+ const resultsToResult = (results) => {
33
+ const errors = results.filter((result) => !result.success);
34
+ if (errors.length)
35
+ return {
36
+ success: false,
37
+ error: errors,
38
+ };
39
+ const successes = results.filter((result) => result.success);
40
+ return {
41
+ success: true,
42
+ data: successes,
43
+ };
44
+ };
45
+ return {
46
+ ok,
47
+ err,
48
+ safeFn,
49
+ fromUnsafe,
50
+ resultsToResult,
51
+ };
52
+ };
53
+ export const n = createNeverpanic();
package/package.json CHANGED
@@ -1,21 +1,26 @@
1
1
  {
2
2
  "name": "neverpanic",
3
- "module": "index.ts",
4
- "version": "0.0.5",
5
- "type": "module",
3
+ "version": "1.0.0-beta.2",
6
4
  "repository": {
7
5
  "url": "https://github.com/bgrcs/neverpanic"
8
6
  },
9
- "scripts": {
10
- "build": "tsc",
11
- "test": "bun test"
12
- },
13
- "files": ["dist"],
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "type": "module",
11
+ "module": "index.ts",
14
12
  "exports": {
15
13
  ".": "./dist/index.js"
16
14
  },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "test": "bun test",
18
+ "fmt": "oxfmt --check",
19
+ "fmt:fix": "oxfmt --write"
20
+ },
17
21
  "devDependencies": {
18
- "@types/bun": "latest"
22
+ "@types/bun": "latest",
23
+ "oxfmt": "0.32.0"
19
24
  },
20
25
  "peerDependencies": {
21
26
  "typescript": "5"