@peerigon/typescript-toolkit 2.1.0 → 2.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/README.md +11 -9
- package/dist/emitter/emitter.d.ts +60 -0
- package/dist/emitter/emitter.d.ts.map +1 -0
- package/dist/emitter/emitter.js +92 -0
- package/dist/emitter/emitter.js.map +1 -0
- package/dist/signals/signals.d.ts +19 -0
- package/dist/signals/signals.d.ts.map +1 -0
- package/dist/signals/signals.js +51 -0
- package/dist/signals/signals.js.map +1 -0
- package/dist/unwrap/unwrap.d.ts +7 -2
- package/dist/unwrap/unwrap.d.ts.map +1 -1
- package/dist/unwrap/unwrap.js +13 -0
- package/dist/unwrap/unwrap.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -37,15 +37,17 @@ import { assert } from "@peerigon/typescript-toolkit/assert";
|
|
|
37
37
|
|
|
38
38
|
## Utilities
|
|
39
39
|
|
|
40
|
-
| Module
|
|
41
|
-
|
|
|
42
|
-
| [`assert`](./src/assert/README.md)
|
|
43
|
-
| [`need`](./src/need/README.md)
|
|
44
|
-
| [`dedupe`](./src/dedupe/README.md)
|
|
45
|
-
| [`
|
|
46
|
-
| [`
|
|
47
|
-
| [`
|
|
48
|
-
| [`
|
|
40
|
+
| Module | Description | Docs |
|
|
41
|
+
| ------------------------------------ | -------------------------------------------------------------------------------- | ---------------------------- |
|
|
42
|
+
| [`assert`](./src/assert/README.md) | Assert a value is not `null` or `undefined`, with TypeScript narrowing | [→](./src/assert/README.md) |
|
|
43
|
+
| [`need`](./src/need/README.md) | Assert a value is not `null` or `undefined` and return it with a narrowed type | [→](./src/need/README.md) |
|
|
44
|
+
| [`dedupe`](./src/dedupe/README.md) | Remove duplicate values from an array while preserving first-occurrence order | [→](./src/dedupe/README.md) |
|
|
45
|
+
| [`emitter`](./src/emitter/README.md) | Minimal typed event emitter with payload objects per event | [→](./src/emitter/README.md) |
|
|
46
|
+
| [`enums`](./src/enums/README.md) | Lightweight string-enum alternative for `erasableSyntaxOnly` TypeScript projects | [→](./src/enums/README.md) |
|
|
47
|
+
| [`match`](./src/match/README.md) | Exhaustive pattern matching with compile-time case checks, similar to `switch` | [→](./src/match/README.md) |
|
|
48
|
+
| [`result`](./src/result/README.md) | Type-safe error handling with pending, success, and error states | [→](./src/result/README.md) |
|
|
49
|
+
| [`signals`](./src/signals/README.md) | Push-based reactive state with explicit subscribers and `signal.from` adapters | [→](./src/signals/README.md) |
|
|
50
|
+
| [`unwrap`](./src/unwrap/README.md) | Extract values from `Result` or nullable types, with optional fallback support | [→](./src/unwrap/README.md) |
|
|
49
51
|
|
|
50
52
|
## License
|
|
51
53
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal typed event emitter with payload objects.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* const emitter = new Emitter<{
|
|
7
|
+
* click: { x: number; y: number };
|
|
8
|
+
* error: { error: Error };
|
|
9
|
+
* }>();
|
|
10
|
+
*
|
|
11
|
+
* emitter.on("error", ({ error, target }) => {
|
|
12
|
+
* console.error(error, target);
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* emitter.emit("error", { error: new Error("Something went wrong") });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare class Emitter<Payloads extends Emitter.Payloads> implements Emitter.Events<Payloads> {
|
|
19
|
+
#private;
|
|
20
|
+
/**
|
|
21
|
+
* Register a listener for an event.
|
|
22
|
+
*
|
|
23
|
+
* @returns A function that removes the listener
|
|
24
|
+
*/
|
|
25
|
+
on<EventName extends keyof Payloads>(event: EventName, listener: (payload: Emitter.EventPayload<Payloads, EventName>) => void): Emitter.Unsubscribe;
|
|
26
|
+
/**
|
|
27
|
+
* Register a listener that runs at most once for an event.
|
|
28
|
+
*
|
|
29
|
+
* @returns A function that removes the listener before it runs
|
|
30
|
+
*/
|
|
31
|
+
once<EventName extends keyof Payloads>(event: EventName, listener: (payload: Emitter.EventPayload<Payloads, EventName>) => void): Emitter.Unsubscribe;
|
|
32
|
+
readonly events: Emitter.Events<Payloads>["events"];
|
|
33
|
+
/**
|
|
34
|
+
* Emit a payload to all listeners registered for an event.
|
|
35
|
+
*
|
|
36
|
+
* The `target` property is set to this emitter. For `error` events with no
|
|
37
|
+
* listeners, throws the emitted `error` property.
|
|
38
|
+
*/
|
|
39
|
+
emit<EventName extends keyof Payloads>(event: EventName, payload: Payloads[EventName]): void;
|
|
40
|
+
}
|
|
41
|
+
type ErrorEventPayload = Record<string, unknown> & {
|
|
42
|
+
error: Error;
|
|
43
|
+
};
|
|
44
|
+
export declare namespace Emitter {
|
|
45
|
+
type EventPayload<GivenEvents extends Payloads = Payloads, EventName extends keyof GivenEvents = keyof GivenEvents> = {
|
|
46
|
+
target: Emitter<GivenEvents>;
|
|
47
|
+
} & GivenEvents[EventName];
|
|
48
|
+
type Payloads = Record<string, Record<string, unknown>> & {
|
|
49
|
+
error?: ErrorEventPayload;
|
|
50
|
+
};
|
|
51
|
+
type Unsubscribe = (() => void) & Disposable;
|
|
52
|
+
interface Events<GivenPayloads extends Payloads = Payloads> {
|
|
53
|
+
readonly events: {
|
|
54
|
+
readonly on: Emitter<GivenPayloads>["on"];
|
|
55
|
+
readonly once: Emitter<GivenPayloads>["once"];
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/emitter/emitter.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,OAAO,CAClB,QAAQ,SAAS,OAAO,CAAC,QAAQ,CACjC,YAAW,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;;IAMnC;;;;OAIG;IACH,EAAE,CAAC,SAAS,SAAS,MAAM,QAAQ,EACjC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,IAAI,GACrE,OAAO,CAAC,WAAW;IAUtB;;;;OAIG;IACH,IAAI,CAAC,SAAS,SAAS,MAAM,QAAQ,EACnC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,IAAI,GACrE,OAAO,CAAC,WAAW;IAStB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAGjD;IAEF;;;;;OAKG;IACH,IAAI,CAAC,SAAS,SAAS,MAAM,QAAQ,EACnC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC3B,IAAI;CAoDR;AAED,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpE,yBAAiB,OAAO,CAAC;IACvB,KAAY,YAAY,CACtB,WAAW,SAAS,QAAQ,GAAG,QAAQ,EACvC,SAAS,SAAS,MAAM,WAAW,GAAG,MAAM,WAAW,IACrD;QAAE,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAE9D,KAAY,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;QAC/D,KAAK,CAAC,EAAE,iBAAiB,CAAC;KAC3B,CAAC;IAEF,KAAY,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,CAAC;IAGpD,UAAiB,MAAM,CAAC,aAAa,SAAS,QAAQ,GAAG,QAAQ;QAC/D,QAAQ,CAAC,MAAM,EAAE;YACf,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;SAC/C,CAAC;KACH;CACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Namespaces are only used to group related types together.
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-namespace -- group related types under Emitter */
|
|
3
|
+
/**
|
|
4
|
+
* Minimal typed event emitter with payload objects.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const emitter = new Emitter<{
|
|
9
|
+
* click: { x: number; y: number };
|
|
10
|
+
* error: { error: Error };
|
|
11
|
+
* }>();
|
|
12
|
+
*
|
|
13
|
+
* emitter.on("error", ({ error, target }) => {
|
|
14
|
+
* console.error(error, target);
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* emitter.emit("error", { error: new Error("Something went wrong") });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class Emitter {
|
|
21
|
+
#listeners = new Map();
|
|
22
|
+
/**
|
|
23
|
+
* Register a listener for an event.
|
|
24
|
+
*
|
|
25
|
+
* @returns A function that removes the listener
|
|
26
|
+
*/
|
|
27
|
+
on(event, listener) {
|
|
28
|
+
const listeners = this.#getOrCreateListeners(event);
|
|
29
|
+
listeners.add(listener);
|
|
30
|
+
return this.#createUnsubscribe(() => {
|
|
31
|
+
listeners.delete(listener);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Register a listener that runs at most once for an event.
|
|
36
|
+
*
|
|
37
|
+
* @returns A function that removes the listener before it runs
|
|
38
|
+
*/
|
|
39
|
+
once(event, listener) {
|
|
40
|
+
const remove = this.on(event, (payload) => {
|
|
41
|
+
remove();
|
|
42
|
+
listener(payload);
|
|
43
|
+
});
|
|
44
|
+
return remove;
|
|
45
|
+
}
|
|
46
|
+
events = {
|
|
47
|
+
on: this.on.bind(this),
|
|
48
|
+
once: this.once.bind(this),
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Emit a payload to all listeners registered for an event.
|
|
52
|
+
*
|
|
53
|
+
* The `target` property is set to this emitter. For `error` events with no
|
|
54
|
+
* listeners, throws the emitted `error` property.
|
|
55
|
+
*/
|
|
56
|
+
emit(event, payload) {
|
|
57
|
+
const listeners = this.#getListeners(event);
|
|
58
|
+
if (!listeners || listeners.size === 0) {
|
|
59
|
+
if (event === "error" && "error" in payload) {
|
|
60
|
+
throw payload["error"];
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const eventPayload = {
|
|
65
|
+
...payload,
|
|
66
|
+
target: this,
|
|
67
|
+
};
|
|
68
|
+
for (const listener of listeners) {
|
|
69
|
+
listener(eventPayload);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
#createUnsubscribe(remove) {
|
|
73
|
+
const unsubscribe = () => {
|
|
74
|
+
remove();
|
|
75
|
+
};
|
|
76
|
+
unsubscribe[Symbol.dispose] = unsubscribe;
|
|
77
|
+
return unsubscribe;
|
|
78
|
+
}
|
|
79
|
+
#getListeners(event) {
|
|
80
|
+
return this.#listeners.get(event);
|
|
81
|
+
}
|
|
82
|
+
#getOrCreateListeners(event) {
|
|
83
|
+
const listeners = this.#listeners.get(event);
|
|
84
|
+
if (listeners === undefined) {
|
|
85
|
+
const listeners = new Set();
|
|
86
|
+
this.#listeners.set(event, listeners);
|
|
87
|
+
return listeners;
|
|
88
|
+
}
|
|
89
|
+
return listeners;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/emitter/emitter.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yFAAyF;AAEzF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,OAAO;IAGT,UAAU,GAAG,IAAI,GAAG,EAG1B,CAAC;IAEJ;;;;OAIG;IACH,EAAE,CACA,KAAgB,EAChB,QAAsE;QAEtE,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAEpD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAClC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,IAAI,CACF,KAAgB,EAChB,QAAsE;QAEtE,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,EAAE,CAAC;YACT,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,MAAM,GAAuC;QACpD,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;KAC3B,CAAC;IAEF;;;;;OAKG;IACH,IAAI,CACF,KAAgB,EAChB,OAA4B;QAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvC,IAAI,KAAK,KAAK,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC5C,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAED,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAA8C;YAC9D,GAAG,OAAO;YACV,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,MAAkB;QACnC,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QACF,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;QAC1C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,aAAa,CACX,KAAgB;QAIhB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,qBAAqB,CACnB,KAAgB;QAEhB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE7C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAEtB,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","sourcesContent":["// Namespaces are only used to group related types together.\n/* eslint-disable @typescript-eslint/no-namespace -- group related types under Emitter */\n\n/**\n * Minimal typed event emitter with payload objects.\n *\n * @example\n * ```ts\n * const emitter = new Emitter<{\n * click: { x: number; y: number };\n * error: { error: Error };\n * }>();\n *\n * emitter.on(\"error\", ({ error, target }) => {\n * console.error(error, target);\n * });\n *\n * emitter.emit(\"error\", { error: new Error(\"Something went wrong\") });\n * ```\n */\nexport class Emitter<\n Payloads extends Emitter.Payloads,\n> implements Emitter.Events<Payloads> {\n readonly #listeners = new Map<\n keyof Payloads,\n Set<(payload: Emitter.EventPayload<Payloads, keyof Payloads>) => void>\n >();\n\n /**\n * Register a listener for an event.\n *\n * @returns A function that removes the listener\n */\n on<EventName extends keyof Payloads>(\n event: EventName,\n listener: (payload: Emitter.EventPayload<Payloads, EventName>) => void,\n ): Emitter.Unsubscribe {\n const listeners = this.#getOrCreateListeners(event);\n\n listeners.add(listener);\n\n return this.#createUnsubscribe(() => {\n listeners.delete(listener);\n });\n }\n\n /**\n * Register a listener that runs at most once for an event.\n *\n * @returns A function that removes the listener before it runs\n */\n once<EventName extends keyof Payloads>(\n event: EventName,\n listener: (payload: Emitter.EventPayload<Payloads, EventName>) => void,\n ): Emitter.Unsubscribe {\n const remove = this.on(event, (payload) => {\n remove();\n listener(payload);\n });\n\n return remove;\n }\n\n readonly events: Emitter.Events<Payloads>[\"events\"] = {\n on: this.on.bind(this),\n once: this.once.bind(this),\n };\n\n /**\n * Emit a payload to all listeners registered for an event.\n *\n * The `target` property is set to this emitter. For `error` events with no\n * listeners, throws the emitted `error` property.\n */\n emit<EventName extends keyof Payloads>(\n event: EventName,\n payload: Payloads[EventName],\n ): void {\n const listeners = this.#getListeners(event);\n\n if (!listeners || listeners.size === 0) {\n if (event === \"error\" && \"error\" in payload) {\n throw payload[\"error\"];\n }\n\n return;\n }\n\n const eventPayload: Emitter.EventPayload<Payloads, EventName> = {\n ...payload,\n target: this,\n };\n\n for (const listener of listeners) {\n listener(eventPayload);\n }\n }\n\n #createUnsubscribe(remove: () => void): Emitter.Unsubscribe {\n const unsubscribe = () => {\n remove();\n };\n unsubscribe[Symbol.dispose] = unsubscribe;\n return unsubscribe;\n }\n\n #getListeners<EventName extends keyof Payloads>(\n event: EventName,\n ):\n | Set<(payload: Emitter.EventPayload<Payloads, EventName>) => void>\n | undefined {\n return this.#listeners.get(event);\n }\n\n #getOrCreateListeners<EventName extends keyof Payloads>(\n event: EventName,\n ): Set<(payload: Emitter.EventPayload<Payloads, EventName>) => void> {\n const listeners = this.#listeners.get(event);\n\n if (listeners === undefined) {\n const listeners = new Set<\n (payload: Emitter.EventPayload<Payloads, keyof Payloads>) => void\n >();\n this.#listeners.set(event, listeners);\n return listeners;\n }\n\n return listeners;\n }\n}\n\ntype ErrorEventPayload = Record<string, unknown> & { error: Error };\n\nexport namespace Emitter {\n export type EventPayload<\n GivenEvents extends Payloads = Payloads,\n EventName extends keyof GivenEvents = keyof GivenEvents,\n > = { target: Emitter<GivenEvents> } & GivenEvents[EventName];\n\n export type Payloads = Record<string, Record<string, unknown>> & {\n error?: ErrorEventPayload;\n };\n\n export type Unsubscribe = (() => void) & Disposable;\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n export interface Events<GivenPayloads extends Payloads = Payloads> {\n readonly events: {\n readonly on: Emitter<GivenPayloads>[\"on\"];\n readonly once: Emitter<GivenPayloads>[\"once\"];\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ReadSignal<Value> = {
|
|
2
|
+
(): Value;
|
|
3
|
+
subscribe: (reader: SignalReader<Value>) => () => void;
|
|
4
|
+
};
|
|
5
|
+
export type WriteSignal<Value> = (value: Value) => void;
|
|
6
|
+
export type Signal<Value> = Disposable & {
|
|
7
|
+
read: ReadSignal<Value>;
|
|
8
|
+
write: WriteSignal<Value>;
|
|
9
|
+
subscribe: ReadSignal<Value>["subscribe"];
|
|
10
|
+
};
|
|
11
|
+
export declare const signal: {
|
|
12
|
+
<Value>(initialValue: Value): Signal<Value>;
|
|
13
|
+
from<Value>(readFromSource: () => Value, subscribeToSource: (notify: () => void) => () => void): Omit<Signal<Value>, "write">;
|
|
14
|
+
};
|
|
15
|
+
export type SignalReader<Value> = ({ value, previousValue, }: {
|
|
16
|
+
value: Value;
|
|
17
|
+
previousValue: Value;
|
|
18
|
+
}) => void;
|
|
19
|
+
//# sourceMappingURL=signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/signals/signals.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,KAAK,IAAI;IAC9B,IAAI,KAAK,CAAC;IACV,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAExD,MAAM,MAAM,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG;IACvC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;CAC3C,CAAC;AAEF,eAAO,MAAM,MAAM;KAAI,KAAK,gBAAgB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;SA6BlD,KAAK,kBACF,MAAM,KAAK,qBACR,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,GACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAL9B,CAAC;AAoCF,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,CAAC,EACjC,KAAK,EACL,aAAa,GACd,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,KAAK,CAAC;CACtB,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export const signal = (initialValue) => {
|
|
2
|
+
const readers = new Set();
|
|
3
|
+
let value = initialValue;
|
|
4
|
+
const subscribe = (reader) => {
|
|
5
|
+
readers.add(reader);
|
|
6
|
+
return () => {
|
|
7
|
+
readers.delete(reader);
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
const read = () => value;
|
|
11
|
+
read.subscribe = subscribe;
|
|
12
|
+
const write = (newValue) => {
|
|
13
|
+
const previousValue = value;
|
|
14
|
+
value = newValue;
|
|
15
|
+
for (const reader of readers) {
|
|
16
|
+
reader({ value, previousValue });
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const dispose = () => {
|
|
20
|
+
readers.clear();
|
|
21
|
+
};
|
|
22
|
+
return { read, write, subscribe, [Symbol.dispose]: dispose };
|
|
23
|
+
};
|
|
24
|
+
signal.from = (readFromSource, subscribeToSource) => {
|
|
25
|
+
const derivedSignal = signal(readFromSource());
|
|
26
|
+
let readerCount = 0;
|
|
27
|
+
let unsubscribeFromSource;
|
|
28
|
+
const subscribe = (reader) => {
|
|
29
|
+
const unsubscribe = derivedSignal.subscribe(reader);
|
|
30
|
+
if (readerCount === 0) {
|
|
31
|
+
unsubscribeFromSource = subscribeToSource(() => {
|
|
32
|
+
derivedSignal.write(readFromSource());
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
readerCount++;
|
|
36
|
+
return () => {
|
|
37
|
+
unsubscribe();
|
|
38
|
+
readerCount--;
|
|
39
|
+
if (readerCount === 0) {
|
|
40
|
+
unsubscribeFromSource?.();
|
|
41
|
+
unsubscribeFromSource = undefined;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const dispose = () => {
|
|
46
|
+
unsubscribeFromSource?.();
|
|
47
|
+
derivedSignal[Symbol.dispose]();
|
|
48
|
+
};
|
|
49
|
+
return { read: derivedSignal.read, subscribe, [Symbol.dispose]: dispose };
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/signals/signals.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAQ,YAAmB,EAAiB,EAAE;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,IAAI,KAAK,GAAG,YAAY,CAAC;IAEzB,MAAM,SAAS,GAAmC,CAAC,MAAM,EAAE,EAAE;QAC3D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,GAAsB,GAAG,EAAE,CAAC,KAAK,CAAC;IAC5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAE3B,MAAM,KAAK,GAAuB,CAAC,QAAQ,EAAE,EAAE;QAC7C,MAAM,aAAa,GAAG,KAAK,CAAC;QAC5B,KAAK,GAAG,QAAQ,CAAC;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,IAAI,GAAG,CACZ,cAA2B,EAC3B,iBAAqD,EACvB,EAAE;IAChC,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IAE/C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,qBAA+C,CAAC;IACpD,MAAM,SAAS,GAAG,CAAC,MAA2B,EAAE,EAAE;QAChD,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,qBAAqB,GAAG,iBAAiB,CAAC,GAAG,EAAE;gBAC7C,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,WAAW,EAAE,CAAC;QACd,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,qBAAqB,EAAE,EAAE,CAAC;gBAC1B,qBAAqB,GAAG,SAAS,CAAC;YACpC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,qBAAqB,EAAE,EAAE,CAAC;QAC1B,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;AAC5E,CAAC,CAAC","sourcesContent":["export type ReadSignal<Value> = {\n (): Value;\n subscribe: (reader: SignalReader<Value>) => () => void;\n};\n\nexport type WriteSignal<Value> = (value: Value) => void;\n\nexport type Signal<Value> = Disposable & {\n read: ReadSignal<Value>;\n write: WriteSignal<Value>;\n subscribe: ReadSignal<Value>[\"subscribe\"];\n};\n\nexport const signal = <Value>(initialValue: Value): Signal<Value> => {\n const readers = new Set<SignalReader<Value>>();\n let value = initialValue;\n\n const subscribe: ReadSignal<Value>[\"subscribe\"] = (reader) => {\n readers.add(reader);\n return () => {\n readers.delete(reader);\n };\n };\n\n const read: ReadSignal<Value> = () => value;\n read.subscribe = subscribe;\n\n const write: WriteSignal<Value> = (newValue) => {\n const previousValue = value;\n value = newValue;\n for (const reader of readers) {\n reader({ value, previousValue });\n }\n };\n\n const dispose = () => {\n readers.clear();\n };\n\n return { read, write, subscribe, [Symbol.dispose]: dispose };\n};\n\nsignal.from = <Value>(\n readFromSource: () => Value,\n subscribeToSource: (notify: () => void) => () => void,\n): Omit<Signal<Value>, \"write\"> => {\n const derivedSignal = signal(readFromSource());\n\n let readerCount = 0;\n let unsubscribeFromSource: (() => void) | undefined;\n const subscribe = (reader: SignalReader<Value>) => {\n const unsubscribe = derivedSignal.subscribe(reader);\n if (readerCount === 0) {\n unsubscribeFromSource = subscribeToSource(() => {\n derivedSignal.write(readFromSource());\n });\n }\n readerCount++;\n return () => {\n unsubscribe();\n readerCount--;\n if (readerCount === 0) {\n unsubscribeFromSource?.();\n unsubscribeFromSource = undefined;\n }\n };\n };\n\n const dispose = () => {\n unsubscribeFromSource?.();\n derivedSignal[Symbol.dispose]();\n };\n\n return { read: derivedSignal.read, subscribe, [Symbol.dispose]: dispose };\n};\n\nexport type SignalReader<Value> = ({\n value,\n previousValue,\n}: {\n value: Value;\n previousValue: Value;\n}) => void;\n"]}
|
package/dist/unwrap/unwrap.d.ts
CHANGED
|
@@ -22,10 +22,15 @@ import { type Result } from "../result/result.ts";
|
|
|
22
22
|
*
|
|
23
23
|
* const error = result.error({ error: new Error("failed") });
|
|
24
24
|
* const fallback = unwrap(error, "default"); // "default"
|
|
25
|
+
*
|
|
26
|
+
* // With Promise.allSettled results
|
|
27
|
+
* const settled = { status: "fulfilled", value: "done" } as const;
|
|
28
|
+
* unwrap(settled); // "done"
|
|
25
29
|
* ```
|
|
26
30
|
*/
|
|
27
|
-
export declare function unwrap<Value, GivenError extends Error>(maybeValue: Value | Result<Value, GivenError>): Value;
|
|
31
|
+
export declare function unwrap<Value, GivenError extends Error>(maybeValue: Value | Result<Value, GivenError> | PromiseFulfilledResult<Value>): Value;
|
|
28
32
|
export declare function unwrap<Value>(maybeValue: Result.Success<Value> | Result.Pending<Value>, fallback: unknown): Value;
|
|
29
33
|
export declare function unwrap<Value, GivenError extends Error, const Fallback>(maybeValue: Result.Error<GivenError, Value>, fallback: Fallback): Fallback;
|
|
30
|
-
export declare function unwrap<
|
|
34
|
+
export declare function unwrap<const Fallback>(maybeValue: PromiseRejectedResult, fallback: Fallback): Fallback;
|
|
35
|
+
export declare function unwrap<Value, GivenError extends Error, const Fallback>(maybeValue: Value | Result<Value, GivenError> | PromiseSettledResult<Value>, fallback: Fallback): NonNullable<Value> | Fallback;
|
|
31
36
|
//# sourceMappingURL=unwrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../../src/unwrap/unwrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../../src/unwrap/unwrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,SAAS,KAAK,EACpD,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAC5E,KAAK,CAAC;AACT,wBAAgB,MAAM,CAAC,KAAK,EAC1B,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EACzD,QAAQ,EAAE,OAAO,GAChB,KAAK,CAAC;AACT,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,SAAS,KAAK,EAAE,KAAK,CAAC,QAAQ,EACpE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAC3C,QAAQ,EAAE,QAAQ,GACjB,QAAQ,CAAC;AACZ,wBAAgB,MAAM,CAAC,KAAK,CAAC,QAAQ,EACnC,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,QAAQ,GACjB,QAAQ,CAAC;AACZ,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,SAAS,KAAK,EAAE,KAAK,CAAC,QAAQ,EACpE,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,EAC3E,QAAQ,EAAE,QAAQ,GACjB,WAAW,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC"}
|
package/dist/unwrap/unwrap.js
CHANGED
|
@@ -32,8 +32,21 @@ export function unwrap(maybeValue, fallback) {
|
|
|
32
32
|
// Handle success state
|
|
33
33
|
return maybeValue.data;
|
|
34
34
|
}
|
|
35
|
+
if (isPromiseSettledResult(maybeValue)) {
|
|
36
|
+
if (maybeValue.status === "fulfilled") {
|
|
37
|
+
return maybeValue.value;
|
|
38
|
+
}
|
|
39
|
+
if (hasFallback)
|
|
40
|
+
return fallback;
|
|
41
|
+
throw maybeValue.reason;
|
|
42
|
+
}
|
|
35
43
|
return maybeValue;
|
|
36
44
|
}
|
|
45
|
+
const isPromiseSettledResult = (value) => typeof value === "object" &&
|
|
46
|
+
value !== null &&
|
|
47
|
+
"status" in value &&
|
|
48
|
+
((value.status === "fulfilled" && "value" in value) ||
|
|
49
|
+
(value.status === "rejected" && "reason" in value));
|
|
37
50
|
const errorPrefix = "Cannot unwrap: ";
|
|
38
51
|
const typeErrorMessageForResult = (maybeValue) => `${errorPrefix}${String(maybeValue)} is not a success and there is no fallback`;
|
|
39
52
|
//# sourceMappingURL=unwrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../src/unwrap/unwrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../src/unwrap/unwrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAe,MAAM,qBAAqB,CAAC;AAkDlD,+DAA+D;AAC/D,MAAM,UAAU,MAAM,CACpB,UAA2E,EAC3E,QAAgB;IAEhB,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACpD,IAAI,WAAW;YAAE,OAAO,QAAS,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,GAAG,WAAW,YAAY,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,uBAAuB;QACvB,IAAI,WAAW,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACtD,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,WAAW;oBAAE,OAAO,QAAS,CAAC;gBAClC,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,EAAE;oBACzD,KAAK,EAAE,UAAU;iBAClB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,UAAU,CAAC,IAAI,CAAC;QACzB,CAAC;QAED,qBAAqB;QACrB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,WAAW;gBAAE,OAAO,QAAS,CAAC;YAClC,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,EAAE;gBACzD,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;QACL,CAAC;QAED,uBAAuB;QACvB,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACtC,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;QAED,IAAI,WAAW;YAAE,OAAO,QAAS,CAAC;QAClC,MAAM,UAAU,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,sBAAsB,GAAG,CAC7B,KAAc,EAC0B,EAAE,CAC1C,OAAO,KAAK,KAAK,QAAQ;IACzB,KAAK,KAAK,IAAI;IACd,QAAQ,IAAI,KAAK;IACjB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,IAAI,KAAK,CAAC;QACjD,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC;AAExD,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACtC,MAAM,yBAAyB,GAAG,CAAC,UAAmB,EAAE,EAAE,CACxD,GAAG,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,4CAA4C,CAAC","sourcesContent":["import { stringify } from \"../lib/string.ts\";\nimport { isResult } from \"../result/result.lib.ts\";\nimport { type Result } from \"../result/result.ts\";\n\n/**\n * Unwrap a value from Result or nullable types, returning the underlying value or throwing an error.\n *\n * This function safely extracts values from wrapped types like Result,\n * handling null/undefined values and providing fallback mechanisms.\n *\n * @param maybeValue - The value to unwrap (can be a plain value or Result)\n * @param fallback - Optional fallback value to return instead of throwing\n * @returns The unwrapped value or fallback\n * @throws {TypeError} When the value cannot be unwrapped and no fallback is provided\n *\n * @example\n * ```ts\n * // Basic unwrapping\n * const value = unwrap(\"hello\"); // \"hello\"\n * const nullValue = unwrap(null, \"default\"); // \"default\"\n *\n * // With Result types\n * const success = result.success({ data: \"success\" });\n * const data = unwrap(success); // \"success\"\n *\n * const error = result.error({ error: new Error(\"failed\") });\n * const fallback = unwrap(error, \"default\"); // \"default\"\n *\n * // With Promise.allSettled results\n * const settled = { status: \"fulfilled\", value: \"done\" } as const;\n * unwrap(settled); // \"done\"\n * ```\n */\nexport function unwrap<Value, GivenError extends Error>(\n maybeValue: Value | Result<Value, GivenError> | PromiseFulfilledResult<Value>,\n): Value;\nexport function unwrap<Value>(\n maybeValue: Result.Success<Value> | Result.Pending<Value>,\n fallback: unknown,\n): Value;\nexport function unwrap<Value, GivenError extends Error, const Fallback>(\n maybeValue: Result.Error<GivenError, Value>,\n fallback: Fallback,\n): Fallback;\nexport function unwrap<const Fallback>(\n maybeValue: PromiseRejectedResult,\n fallback: Fallback,\n): Fallback;\nexport function unwrap<Value, GivenError extends Error, const Fallback>(\n maybeValue: Value | Result<Value, GivenError> | PromiseSettledResult<Value>,\n fallback: Fallback,\n): NonNullable<Value> | Fallback;\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\nexport function unwrap<Value, GivenError extends Error, Fallback>(\n maybeValue: Value | Result<Value, GivenError> | PromiseSettledResult<Value>,\n fallback?: Value,\n): Value | Fallback {\n const hasFallback = arguments.length > 1;\n\n if (maybeValue === null || maybeValue === undefined) {\n if (hasFallback) return fallback!;\n throw new TypeError(`${errorPrefix}Value is ${stringify(maybeValue)}`);\n }\n\n if (isResult(maybeValue)) {\n // Handle pending state\n if (\"isPending\" in maybeValue && maybeValue.isPending) {\n if (maybeValue.data === undefined) {\n if (hasFallback) return fallback!;\n throw new TypeError(typeErrorMessageForResult(maybeValue), {\n cause: maybeValue,\n });\n }\n return maybeValue.data;\n }\n\n // Handle error state\n if (maybeValue.isError) {\n if (hasFallback) return fallback!;\n throw new TypeError(typeErrorMessageForResult(maybeValue), {\n cause: maybeValue,\n });\n }\n\n // Handle success state\n return maybeValue.data;\n }\n\n if (isPromiseSettledResult(maybeValue)) {\n if (maybeValue.status === \"fulfilled\") {\n return maybeValue.value;\n }\n\n if (hasFallback) return fallback!;\n throw maybeValue.reason;\n }\n\n return maybeValue;\n}\n\nconst isPromiseSettledResult = (\n value: unknown,\n): value is PromiseSettledResult<unknown> =>\n typeof value === \"object\" &&\n value !== null &&\n \"status\" in value &&\n ((value.status === \"fulfilled\" && \"value\" in value) ||\n (value.status === \"rejected\" && \"reason\" in value));\n\nconst errorPrefix = \"Cannot unwrap: \";\nconst typeErrorMessageForResult = (maybeValue: unknown) =>\n `${errorPrefix}${String(maybeValue)} is not a success and there is no fallback`;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peerigon/typescript-toolkit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "🔧✨ Tiny helpers for TypeScript applications",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"homepage": "https://github.com/peerigon/typescript-toolkit#readme",
|
|
@@ -19,10 +19,12 @@
|
|
|
19
19
|
".": "./dist/main.js",
|
|
20
20
|
"./assert": "./dist/assert/assert.js",
|
|
21
21
|
"./dedupe": "./dist/dedupe/dedupe.js",
|
|
22
|
+
"./emitter": "./dist/emitter/emitter.js",
|
|
22
23
|
"./enums": "./dist/enums/enums.js",
|
|
23
24
|
"./match": "./dist/match/match.js",
|
|
24
25
|
"./need": "./dist/need/need.js",
|
|
25
26
|
"./result": "./dist/result/result.js",
|
|
27
|
+
"./signals": "./dist/signals/signals.js",
|
|
26
28
|
"./unwrap": "./dist/unwrap/unwrap.js"
|
|
27
29
|
},
|
|
28
30
|
"main": "./dist/main.js",
|