watchable-promise 2.0.0 → 2.1.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/README.md CHANGED
@@ -67,6 +67,27 @@ npm install watchable-promise
67
67
  console.log(promise.value); // "foo"
68
68
  ```
69
69
 
70
+ - You can call `.resolve()` or `.reject()` on a `WatchablePromise` instance to resolve or reject it externally:
71
+
72
+ ```javascript
73
+ import WatchablePromise from "watchable-promise";
74
+
75
+ // Resolving
76
+ const p1 = new WatchablePromise(resolve => {});
77
+ p1.resolve("foo");
78
+ const val = await p1;
79
+ console.log(val) // "foo"
80
+
81
+ // Rejecting
82
+ const p2 = new WatchablePromise((resolve, reject) => {});
83
+ p2.reject("bar");
84
+ try {
85
+ await p2;
86
+ } catch (err) {
87
+ console.log(err) // "bar"
88
+ }
89
+ ```
90
+
70
91
  ## License
71
92
 
72
93
  `watchable-promise` is released under the Apache 2.0 License. See the enclosed [`LICENSE`](./LICENSE) for details.
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  declare class WatchablePromise<T> extends Promise<T> {
2
2
  #private;
3
3
  constructor(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void);
4
+ resolve(value: T): void;
5
+ reject(reason?: any): void;
4
6
  get settled(): boolean;
5
- get status(): "pending" | "fulfilled" | "rejected";
7
+ get state(): "pending" | "fulfilled" | "rejected";
8
+ get value(): any;
6
9
  static from<T>(existingPromise: Promise<T>): WatchablePromise<T>;
7
10
  static withResolvers<T>(): {
8
11
  promise: WatchablePromise<T>;
package/dist/index.js CHANGED
@@ -1,7 +1,10 @@
1
1
  // src/index.ts
2
2
  var WatchablePromise = class _WatchablePromise extends Promise {
3
3
  #settled = false;
4
- #status = "pending";
4
+ #state = "pending";
5
+ #value;
6
+ #resolve;
7
+ #reject;
5
8
  constructor(executor) {
6
9
  let resolve;
7
10
  let reject;
@@ -9,23 +12,36 @@ var WatchablePromise = class _WatchablePromise extends Promise {
9
12
  resolve = res;
10
13
  reject = rej;
11
14
  });
15
+ this.#resolve = resolve;
16
+ this.#reject = reject;
12
17
  this.then(
13
- () => {
14
- this.#status = "fulfilled";
18
+ (value) => {
19
+ this.#state = "fulfilled";
20
+ this.#value = value;
15
21
  this.#settled = true;
16
22
  },
17
- () => {
18
- this.#status = "rejected";
23
+ (reason) => {
24
+ this.#state = "rejected";
25
+ this.#value = reason;
19
26
  this.#settled = true;
20
27
  }
21
28
  );
22
- executor(resolve, reject);
29
+ executor(this.#resolve, this.#reject);
30
+ }
31
+ resolve(value) {
32
+ this.#resolve(value);
33
+ }
34
+ reject(reason) {
35
+ this.#reject(reason);
23
36
  }
24
37
  get settled() {
25
38
  return this.#settled;
26
39
  }
27
- get status() {
28
- return this.#status;
40
+ get state() {
41
+ return this.#state;
42
+ }
43
+ get value() {
44
+ return this.#value;
29
45
  }
30
46
  static from(existingPromise) {
31
47
  return new _WatchablePromise((resolve, reject) => {
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["class WatchablePromise<T> extends Promise<T> {\n #settled = false;\n #status: \"pending\" | \"fulfilled\" | \"rejected\" = \"pending\";\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n ) => void,\n ) {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n this.then(\n () => {\n this.#status = \"fulfilled\";\n this.#settled = true;\n },\n () => {\n this.#status = \"rejected\";\n this.#settled = true;\n },\n );\n\n // @ts-ignore\n executor(resolve, reject);\n }\n\n get settled() {\n return this.#settled;\n }\n\n get status() {\n return this.#status;\n }\n\n static from<T>(existingPromise: Promise<T>): WatchablePromise<T> {\n return new WatchablePromise<T>((resolve, reject) => {\n existingPromise.then(resolve, reject);\n });\n }\n\n static withResolvers<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n const promise = new WatchablePromise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // @ts-ignore\n return { promise, resolve, reject };\n }\n\n static get [Symbol.species]() {\n return Promise;\n }\n\n get [Symbol.toStringTag]() {\n return \"WatchablePromise\";\n }\n}\n\nexport default WatchablePromise;\n"],
5
- "mappings": ";AAAA,IAAM,mBAAN,MAAM,0BAA4B,QAAW;AAAA,EAC3C,WAAW;AAAA,EACX,UAAgD;AAAA,EAEhD,YACE,UAIA;AACA,QAAI;AACJ,QAAI;AAEJ,UAAM,CAAC,KAAK,QAAQ;AAClB,gBAAU;AACV,eAAS;AAAA,IACX,CAAC;AAED,SAAK;AAAA,MACH,MAAM;AACJ,aAAK,UAAU;AACf,aAAK,WAAW;AAAA,MAClB;AAAA,MACA,MAAM;AACJ,aAAK,UAAU;AACf,aAAK,WAAW;AAAA,MAClB;AAAA,IACF;AAGA,aAAS,SAAS,MAAM;AAAA,EAC1B;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,KAAQ,iBAAkD;AAC/D,WAAO,IAAI,kBAAoB,CAAC,SAAS,WAAW;AAClD,sBAAgB,KAAK,SAAS,MAAM;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,gBAAmB;AACxB,QAAI;AACJ,QAAI;AACJ,UAAM,UAAU,IAAI,kBAAoB,CAAC,KAAK,QAAQ;AACpD,gBAAU;AACV,eAAS;AAAA,IACX,CAAC;AAED,WAAO,EAAE,SAAS,SAAS,OAAO;AAAA,EACpC;AAAA,EAEA,YAAY,OAAO,OAAO,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAO,WAAW,IAAI;AACzB,WAAO;AAAA,EACT;AACF;AAEA,IAAO,gBAAQ;",
4
+ "sourcesContent": ["class WatchablePromise<T> extends Promise<T> {\n #settled = false;\n #state: \"pending\" | \"fulfilled\" | \"rejected\" = \"pending\";\n #value: T | any;\n #resolve: (value: T | PromiseLike<T>) => void;\n #reject: (reason?: any) => void;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n ) => void,\n ) {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // @ts-ignore\n this.#resolve = resolve;\n // @ts-ignore\n this.#reject = reject;\n\n this.then(\n (value) => {\n this.#state = \"fulfilled\";\n this.#value = value;\n this.#settled = true;\n },\n (reason) => {\n this.#state = \"rejected\";\n this.#value = reason;\n this.#settled = true;\n },\n );\n\n executor(this.#resolve, this.#reject);\n }\n\n resolve(value: T) {\n this.#resolve(value);\n }\n\n reject(reason?: any) {\n this.#reject(reason);\n }\n\n get settled() {\n return this.#settled;\n }\n\n get state() {\n return this.#state;\n }\n\n get value() {\n return this.#value;\n }\n\n static from<T>(existingPromise: Promise<T>): WatchablePromise<T> {\n return new WatchablePromise<T>((resolve, reject) => {\n existingPromise.then(resolve, reject);\n });\n }\n\n static withResolvers<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n const promise = new WatchablePromise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // @ts-ignore\n return { promise, resolve, reject };\n }\n\n static get [Symbol.species]() {\n return Promise;\n }\n\n get [Symbol.toStringTag]() {\n return \"WatchablePromise\";\n }\n}\n\nexport default WatchablePromise;\n"],
5
+ "mappings": ";AAAA,IAAM,mBAAN,MAAM,0BAA4B,QAAW;AAAA,EAC3C,WAAW;AAAA,EACX,SAA+C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,UAIA;AACA,QAAI;AACJ,QAAI;AAEJ,UAAM,CAAC,KAAK,QAAQ;AAClB,gBAAU;AACV,eAAS;AAAA,IACX,CAAC;AAGD,SAAK,WAAW;AAEhB,SAAK,UAAU;AAEf,SAAK;AAAA,MACH,CAAC,UAAU;AACT,aAAK,SAAS;AACd,aAAK,SAAS;AACd,aAAK,WAAW;AAAA,MAClB;AAAA,MACA,CAAC,WAAW;AACV,aAAK,SAAS;AACd,aAAK,SAAS;AACd,aAAK,WAAW;AAAA,MAClB;AAAA,IACF;AAEA,aAAS,KAAK,UAAU,KAAK,OAAO;AAAA,EACtC;AAAA,EAEA,QAAQ,OAAU;AAChB,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEA,OAAO,QAAc;AACnB,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,KAAQ,iBAAkD;AAC/D,WAAO,IAAI,kBAAoB,CAAC,SAAS,WAAW;AAClD,sBAAgB,KAAK,SAAS,MAAM;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,gBAAmB;AACxB,QAAI;AACJ,QAAI;AACJ,UAAM,UAAU,IAAI,kBAAoB,CAAC,KAAK,QAAQ;AACpD,gBAAU;AACV,eAAS;AAAA,IACX,CAAC;AAED,WAAO,EAAE,SAAS,SAAS,OAAO;AAAA,EACpC;AAAA,EAEA,YAAY,OAAO,OAAO,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAO,WAAW,IAAI;AACzB,WAAO;AAAA,EACT;AACF;AAEA,IAAO,gBAAQ;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "watchable-promise",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "A Promise whose state and value you can read",
5
5
  "type": "module",
6
6
  "module": "dist/index.js",
@@ -18,8 +18,7 @@
18
18
  "start": "echo 'There is nothing to start. I think you may just want to run the tests instead' && exit 1",
19
19
  "test": "vitest",
20
20
  "test-once": "vitest run",
21
- "prepack": "npm run require-pristine-tree && npm run test-once",
22
- "prepublish": "npm run build",
21
+ "prepack": "npm run require-pristine-tree && npm run test-once && npm run build",
23
22
  "preversion": "npm run require-pristine-tree && npm run test-once",
24
23
  "prepare": "husky install",
25
24
  "require-pristine-tree": "exit $(git status --porcelain | wc -l)"