Skip to content

Commit 8d0ddfd

Browse files
feat(async): add aResolvers promise util
1 parent 16de7fa commit 8d0ddfd

File tree

11 files changed

+5936
-4709
lines changed

11 files changed

+5936
-4709
lines changed

.changeset/silver-experts-hug.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@opentf/std": minor
3+
---
4+
5+
Added aResolvers aync utils.

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ Let’s explore some of the library’s capabilities:
6363
import { isNum } from "@opentf/std";
6464

6565
isNum(NaN); //=> false
66+
isNum("1"); //=> false
67+
isNum("1", true); //=> true
68+
isNum(1); //=> true
6669
```
6770

6871
2. Converting Strings to Pascal Case:
@@ -136,6 +139,18 @@ compose(
136139
); //=> 6
137140
```
138141

142+
8. Pick & Omit Paths in an Object
143+
144+
```js
145+
import { pick omit } from '@opentf/std';
146+
147+
const obj = { a: 1, b: 2, c: 3 };
148+
149+
pick(obj, 'a', 'c'); //=> { a: 1, c: 3 }
150+
151+
omit(obj, 'a', 'c'); //=> { b: 2 }
152+
```
153+
139154
## API
140155

141156
### Array
@@ -175,6 +190,7 @@ compose(
175190
- [aMap](https://js-std.pages.dev/Async/aMap)
176191
- [aPipe](https://js-std.pages.dev/Async/aPipe)
177192
- [aPipeFn](https://js-std.pages.dev/Async/aPipeFn)
193+
- [aResolvers](https://js-std.pages.dev/Async/aResolvers)
178194

179195
### Maths
180196

apps/docs/pages/Async/_meta.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
"aForEach": "aForEach",
66
"aMap": "aMap",
77
"aPipe": "aPipe",
8-
"aPipeFn": "aPipeFn"
8+
"aPipeFn": "aPipeFn",
9+
"aResolvers": "aResolvers"
910
}

apps/docs/pages/Async/aResolvers.mdx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Callout } from "nextra/components";
2+
import REPL from "../../components/REPL";
3+
4+
> Creates a promise with custom resolvers for `resolve` and `reject`.
5+
6+
<Callout type="default">
7+
This is same as the new static method `Promise.withResolvers()`.
8+
</Callout>
9+
10+
## Syntax
11+
12+
```ts
13+
import { aResolvers } from '@opentf/std';
14+
15+
const { promise, resolve, reject } = aResolvers();
16+
```
17+
18+
## Examples
19+
20+
```ts
21+
const { promise, resolve, reject } = aResolvers()
22+
23+
Math.random() > 0.5 ? resolve(console.log("ok")) : reject("not ok");
24+
```
25+
26+
## Try
27+
28+
<REPL code={`const { aResolvers } = require('@opentf/std');
29+
30+
const { promise, resolve, reject } = aResolvers()
31+
32+
Math.random() > 0.5 ? resolve(console.log("ok")) : reject("not ok");
33+
`} />
34+
35+
### Resources
36+
37+
- [tc39/proposal-promise-with-resolvers](https://github.com/tc39/proposal-promise-with-resolvers)
38+
39+
- [Promise.withResolvers()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers)

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
],
2121
"lint-staged": {
2222
"*.{ts,tsx}": [
23-
"pnpm run format",
24-
"pnpm run lint --"
23+
"pnpm run format"
2524
],
2625
"*.json": [
2726
"npm run format"

packages/std/README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ Let’s explore some of the library’s capabilities:
6363
import { isNum } from "@opentf/std";
6464

6565
isNum(NaN); //=> false
66+
isNum('1'); //=> false
67+
isNum('1', true); //=> true
68+
isNum(1); //=> true
6669
```
6770

6871
2. Converting Strings to Pascal Case:
@@ -136,6 +139,18 @@ compose(
136139
); //=> 6
137140
```
138141

142+
8. Pick & Omit Paths in an Object
143+
144+
```js
145+
import { pick omit } from '@opentf/std';
146+
147+
const obj = { a: 1, b: 2, c: 3 };
148+
149+
pick(obj, 'a', 'c'); //=> { a: 1, c: 3 }
150+
151+
omit(obj, 'a', 'c'); //=> { b: 2 }
152+
```
153+
139154
## API
140155

141156
### Array
@@ -175,6 +190,7 @@ compose(
175190
- [aMap](https://js-std.pages.dev/Async/aMap)
176191
- [aPipe](https://js-std.pages.dev/Async/aPipe)
177192
- [aPipeFn](https://js-std.pages.dev/Async/aPipeFn)
193+
- [aResolvers](https://js-std.pages.dev/Async/aResolvers)
178194

179195
### Maths
180196

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { aResolvers } from '../../src';
2+
3+
describe('Async > aResolvers', () => {
4+
test('resolve', async () => {
5+
const { promise, resolve, reject } = aResolvers();
6+
resolve('fulfilled');
7+
await expect(promise).resolves.toBe('fulfilled');
8+
});
9+
10+
test('reject', async () => {
11+
const { promise, resolve, reject } = aResolvers();
12+
13+
reject(new Error('Rejected'));
14+
await expect(promise).rejects.toThrow('Rejected');
15+
});
16+
});

packages/std/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,19 @@
7777
},
7878
"devDependencies": {
7979
"@opentf/eslint-config-base": "^0.2.0",
80-
"@swc/core": "^1.4.0",
80+
"@swc/core": "^1.6.13",
8181
"@swc/jest": "^0.2.24",
8282
"@types/jest": "^29.5.1",
83-
"@types/node": "^20.12.5",
84-
"@typescript-eslint/eslint-plugin": "^7.6.0",
85-
"@typescript-eslint/parser": "^7.6.0",
83+
"@types/node": "^20.14.10",
84+
"@typescript-eslint/eslint-plugin": "^7.16.0",
85+
"@typescript-eslint/parser": "^7.16.0",
8686
"eslint": "^8.57.0",
8787
"eslint-config-prettier": "^9.1.0",
88-
"eslint-plugin-jest": "^28.2.0",
88+
"eslint-plugin-jest": "^28.6.0",
8989
"eslint-plugin-prettier": "^5.1.3",
9090
"jest": "^29.7.0",
91-
"prettier": "^3.2.5",
92-
"tsup": "^8.0.1",
93-
"typescript": "^5.4.3"
91+
"prettier": "^3.3.2",
92+
"tsup": "^8.1.0",
93+
"typescript": "^5.5.3"
9494
}
9595
}

packages/std/src/async/aResolvers.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Creates a promise with custom resolvers for `resolve` and `reject`.
3+
*
4+
* @example
5+
* const { promise, resolve, reject } = Promise.withResolvers();
6+
* Math.random() > 0.5 ? resolve("ok") : reject("not ok");
7+
*/
8+
9+
export default function aResolvers<T>(): {
10+
promise: Promise<T>;
11+
resolve: (value: T) => void;
12+
reject: (reason?: unknown) => void;
13+
} {
14+
let resolve: (value: T) => void;
15+
let reject: (reason?: unknown) => void;
16+
const promise = new Promise<T>((res, rej) => {
17+
resolve = res;
18+
reject = rej;
19+
});
20+
21+
//@ts-expect-error Ignore errors
22+
return { promise, resolve, reject };
23+
}

packages/std/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export { default as aPipe } from './async/aPipe';
4242
export { default as aPipeFn } from './async/aPipeFn';
4343
export { default as aCompose } from './async/aCompose';
4444
export { default as aComposeFn } from './async/aComposeFn';
45+
export { default as aResolvers } from './async/aResolvers';
4546

4647
// Maths
4748
export { default as percentage } from './maths/percentage';

0 commit comments

Comments
 (0)