@xmachines/play-xstate 1.0.0-beta.8 → 1.0.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/LICENSE +21 -0
- package/README.md +175 -336
- package/dist/define-player.d.ts +6 -56
- package/dist/define-player.d.ts.map +1 -1
- package/dist/define-player.js +7 -61
- package/dist/define-player.js.map +1 -1
- package/dist/define-player.typecheck.js +6 -0
- package/dist/define-player.typecheck.js.map +1 -1
- package/dist/errors.d.ts +170 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +202 -0
- package/dist/errors.js.map +1 -0
- package/dist/guards/compose.d.ts +14 -3
- package/dist/guards/compose.d.ts.map +1 -1
- package/dist/guards/compose.js +29 -2
- package/dist/guards/compose.js.map +1 -1
- package/dist/guards/helpers.d.ts +16 -1
- package/dist/guards/helpers.d.ts.map +1 -1
- package/dist/guards/helpers.js +16 -35
- package/dist/guards/helpers.js.map +1 -1
- package/dist/guards/index.d.ts +2 -1
- package/dist/guards/index.d.ts.map +1 -1
- package/dist/guards/index.js +1 -1
- package/dist/guards/index.js.map +1 -1
- package/dist/guards/types.d.ts +1 -1
- package/dist/guards/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/player-actor.d.ts +134 -28
- package/dist/player-actor.d.ts.map +1 -1
- package/dist/player-actor.js +424 -159
- package/dist/player-actor.js.map +1 -1
- package/dist/player-actor.typecheck.js +9 -5
- package/dist/player-actor.typecheck.js.map +1 -1
- package/dist/routing/build-url.d.ts +27 -16
- package/dist/routing/build-url.d.ts.map +1 -1
- package/dist/routing/build-url.js +48 -25
- package/dist/routing/build-url.js.map +1 -1
- package/dist/routing/derive-current-route.d.ts +22 -0
- package/dist/routing/derive-current-route.d.ts.map +1 -0
- package/dist/routing/derive-current-route.js +122 -0
- package/dist/routing/derive-current-route.js.map +1 -0
- package/dist/routing/derive-initial-route.d.ts +43 -0
- package/dist/routing/derive-initial-route.d.ts.map +1 -0
- package/dist/routing/derive-initial-route.js +57 -0
- package/dist/routing/derive-initial-route.js.map +1 -0
- package/dist/routing/derive-route.d.ts +15 -1
- package/dist/routing/derive-route.d.ts.map +1 -1
- package/dist/routing/derive-route.js +25 -10
- package/dist/routing/derive-route.js.map +1 -1
- package/dist/routing/format-play-route-transitions.d.ts +29 -2
- package/dist/routing/format-play-route-transitions.d.ts.map +1 -1
- package/dist/routing/format-play-route-transitions.js +32 -8
- package/dist/routing/format-play-route-transitions.js.map +1 -1
- package/dist/routing/index.d.ts +3 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +2 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/types.d.ts +11 -4
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/types.d.ts +12 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +34 -11
- package/dist/catalog/index.d.ts +0 -13
- package/dist/catalog/index.d.ts.map +0 -1
- package/dist/catalog/index.js +0 -11
- package/dist/catalog/index.js.map +0 -1
- package/dist/catalog/types.d.ts +0 -27
- package/dist/catalog/types.d.ts.map +0 -1
- package/dist/catalog/types.js +0 -2
- package/dist/catalog/types.js.map +0 -1
- package/dist/catalog/validate-binding.d.ts +0 -22
- package/dist/catalog/validate-binding.d.ts.map +0 -1
- package/dist/catalog/validate-binding.js +0 -30
- package/dist/catalog/validate-binding.js.map +0 -1
- package/dist/catalog/validate-props.d.ts +0 -51
- package/dist/catalog/validate-props.d.ts.map +0 -1
- package/dist/catalog/validate-props.js +0 -155
- package/dist/catalog/validate-props.js.map +0 -1
- package/dist/catalog/validate-props.typecheck.d.ts +0 -2
- package/dist/catalog/validate-props.typecheck.d.ts.map +0 -1
- package/dist/catalog/validate-props.typecheck.js +0 -6
- package/dist/catalog/validate-props.typecheck.js.map +0 -1
- package/dist/signals/debounce.d.ts +0 -18
- package/dist/signals/debounce.d.ts.map +0 -1
- package/dist/signals/debounce.js +0 -35
- package/dist/signals/debounce.js.map +0 -1
- package/dist/signals/index.d.ts +0 -2
- package/dist/signals/index.d.ts.map +0 -1
- package/dist/signals/index.js +0 -2
- package/dist/signals/index.js.map +0 -1
- package/dist/signals/state-signal.d.ts +0 -33
- package/dist/signals/state-signal.d.ts.map +0 -1
- package/dist/signals/state-signal.js +0 -41
- package/dist/signals/state-signal.js.map +0 -1
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validate view props against Zod schema
|
|
3
|
-
*
|
|
4
|
-
* Per CONTEXT.md:
|
|
5
|
-
* - "Prop validation: At state entry"
|
|
6
|
-
* - "currentView derivation: Merge meta.view with relevant context data"
|
|
7
|
-
*
|
|
8
|
-
* Per RESEARCH.md Pattern 4: Use safeParse() for validation
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const props = { userId: '123', stats: { logins: 5 } };
|
|
13
|
-
* const result = validateViewProps('Dashboard', props, catalog);
|
|
14
|
-
* if (!result.success) {
|
|
15
|
-
* console.error(result.error);
|
|
16
|
-
* }
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param componentName - Component name from catalog
|
|
20
|
-
* @param props - Props to validate
|
|
21
|
-
* @param catalog - Component catalog with schemas
|
|
22
|
-
* @returns Zod parse result
|
|
23
|
-
*/
|
|
24
|
-
export const validateViewProps = (componentName, props, catalog) => {
|
|
25
|
-
const entry = catalog[componentName];
|
|
26
|
-
if (!entry) {
|
|
27
|
-
return {
|
|
28
|
-
success: false,
|
|
29
|
-
error: new Error(`Component "${componentName}" not found in catalog`),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
// Handle both CatalogEntry format and direct Zod schema
|
|
33
|
-
const schema = typeof entry === "object" && "schema" in entry ? entry.schema : entry;
|
|
34
|
-
// Use safeParse to avoid throwing
|
|
35
|
-
const result = schema.safeParse(props);
|
|
36
|
-
if (!result.success) {
|
|
37
|
-
return {
|
|
38
|
-
success: false,
|
|
39
|
-
error: result.error,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
success: true,
|
|
44
|
-
data: result.data,
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* Merge view metadata with context for props
|
|
49
|
-
*
|
|
50
|
-
* Per CONTEXT.md: "Merge meta.view with relevant context data for component props"
|
|
51
|
-
*
|
|
52
|
-
* @param view - View metadata from meta.view
|
|
53
|
-
* @param context - Machine context
|
|
54
|
-
* @returns Merged props object
|
|
55
|
-
*/
|
|
56
|
-
export const mergeViewProps = (view, context) => {
|
|
57
|
-
const viewRecord = view;
|
|
58
|
-
const normalizedContext = context && typeof context === "object" ? context : {};
|
|
59
|
-
// Extract component and props from view metadata
|
|
60
|
-
const { component: _component, props, ...rest } = viewRecord;
|
|
61
|
-
// Determine view props based on structure
|
|
62
|
-
let viewProps;
|
|
63
|
-
if (typeof props === "function") {
|
|
64
|
-
// Case 0: props is a factory function — call it with { context }
|
|
65
|
-
// e.g. props: ({ context }) => ({ welcome: true, username: context.username })
|
|
66
|
-
const nextProps = props({
|
|
67
|
-
context: normalizedContext,
|
|
68
|
-
});
|
|
69
|
-
viewProps =
|
|
70
|
-
nextProps && typeof nextProps === "object" && !Array.isArray(nextProps)
|
|
71
|
-
? nextProps
|
|
72
|
-
: {};
|
|
73
|
-
}
|
|
74
|
-
else if (props && typeof props === "object" && !Array.isArray(props)) {
|
|
75
|
-
// Case 1: view has explicit props object: { component: 'X', props: { a: 1 } }
|
|
76
|
-
viewProps = props;
|
|
77
|
-
}
|
|
78
|
-
else if (Object.keys(rest).length > 0) {
|
|
79
|
-
// Case 2: props are flat on view: { component: 'X', a: 1, b: 2 }
|
|
80
|
-
viewProps = rest;
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
// Case 3: no props at all
|
|
84
|
-
viewProps = {};
|
|
85
|
-
}
|
|
86
|
-
// Extract infrastructure props that should bypass catalog validation
|
|
87
|
-
// These are reserved keys that components receive but aren't in catalog schemas
|
|
88
|
-
const { routeParams, queryParams, ...catalogContext } = normalizedContext;
|
|
89
|
-
// Merge catalog-validated context with viewProps
|
|
90
|
-
const mergedProps = {
|
|
91
|
-
...catalogContext,
|
|
92
|
-
...viewProps,
|
|
93
|
-
};
|
|
94
|
-
// Add infrastructure props back (these bypass Zod validation)
|
|
95
|
-
// Spread routeParams so they become top-level props (e.g., section: "profile")
|
|
96
|
-
// Components receive route params as direct props, not nested
|
|
97
|
-
return {
|
|
98
|
-
...mergedProps,
|
|
99
|
-
...(routeParams && typeof routeParams === "object" ? routeParams : {}),
|
|
100
|
-
...(queryParams && typeof queryParams === "object" ? { queryParams } : {}),
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
const stableSerialize = (value, seen) => {
|
|
104
|
-
if (value === null) {
|
|
105
|
-
return "null";
|
|
106
|
-
}
|
|
107
|
-
if (value === undefined) {
|
|
108
|
-
return "undefined";
|
|
109
|
-
}
|
|
110
|
-
if (typeof value === "string") {
|
|
111
|
-
return JSON.stringify(value);
|
|
112
|
-
}
|
|
113
|
-
if (typeof value === "number") {
|
|
114
|
-
if (Number.isNaN(value)) {
|
|
115
|
-
return '"NaN"';
|
|
116
|
-
}
|
|
117
|
-
if (!Number.isFinite(value)) {
|
|
118
|
-
return value > 0 ? '"Infinity"' : '"-Infinity"';
|
|
119
|
-
}
|
|
120
|
-
return String(value);
|
|
121
|
-
}
|
|
122
|
-
if (typeof value === "boolean" || typeof value === "bigint") {
|
|
123
|
-
return String(value);
|
|
124
|
-
}
|
|
125
|
-
if (typeof value === "symbol") {
|
|
126
|
-
return `"${String(value)}"`;
|
|
127
|
-
}
|
|
128
|
-
if (typeof value === "function") {
|
|
129
|
-
return '"[function]"';
|
|
130
|
-
}
|
|
131
|
-
if (Array.isArray(value)) {
|
|
132
|
-
return `[${value.map((item) => stableSerialize(item, seen)).join(",")}]`;
|
|
133
|
-
}
|
|
134
|
-
if (value instanceof Date) {
|
|
135
|
-
return `"${value.toISOString()}"`;
|
|
136
|
-
}
|
|
137
|
-
if (typeof value === "object") {
|
|
138
|
-
if (seen.has(value)) {
|
|
139
|
-
return '"[circular]"';
|
|
140
|
-
}
|
|
141
|
-
seen.add(value);
|
|
142
|
-
const objectValue = value;
|
|
143
|
-
const keys = Object.keys(objectValue).sort();
|
|
144
|
-
const body = keys
|
|
145
|
-
.map((key) => `${JSON.stringify(key)}:${stableSerialize(objectValue[key], seen)}`)
|
|
146
|
-
.join(",");
|
|
147
|
-
seen.delete(value);
|
|
148
|
-
return `{${body}}`;
|
|
149
|
-
}
|
|
150
|
-
return `"${String(value)}"`;
|
|
151
|
-
};
|
|
152
|
-
export const createMemoSignature = (value) => {
|
|
153
|
-
return stableSerialize(value, new WeakSet());
|
|
154
|
-
};
|
|
155
|
-
//# sourceMappingURL=validate-props.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-props.js","sourceRoot":"","sources":["../../src/catalog/validate-props.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-props.typecheck.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-props.typecheck.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-props.typecheck.js","sourceRoot":"","sources":["../../src/catalog/validate-props.typecheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxE,MAAM,kBAAkB,GAAmC,KAAK,CAAC;AACjE,KAAK,kBAAkB,CAAC;AAKxB,MAAM,kBAAkB,GAAmC,KAAK,CAAC;AACjE,KAAK,kBAAkB,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Microtask debouncing for glitch-free signal updates
|
|
3
|
-
*
|
|
4
|
-
* Per CONTEXT.md: "Microtask batching for glitch-free guarantee"
|
|
5
|
-
* Per RESEARCH.md Pattern 5: Updates batch in microtask queue
|
|
6
|
-
*
|
|
7
|
-
* Leverages TC39 Signal primitives for proper batching.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Schedule callback in microtask queue
|
|
11
|
-
*
|
|
12
|
-
* Multiple calls in same tick coalesce into single execution.
|
|
13
|
-
*
|
|
14
|
-
* @param callback - Function to execute in microtask
|
|
15
|
-
* @returns Function to cancel scheduled execution
|
|
16
|
-
*/
|
|
17
|
-
export declare const scheduleMicrotask: (callback: () => void) => (() => void);
|
|
18
|
-
//# sourceMappingURL=debounce.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/signals/debounce.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAoBnE,CAAC"}
|
package/dist/signals/debounce.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Microtask debouncing for glitch-free signal updates
|
|
3
|
-
*
|
|
4
|
-
* Per CONTEXT.md: "Microtask batching for glitch-free guarantee"
|
|
5
|
-
* Per RESEARCH.md Pattern 5: Updates batch in microtask queue
|
|
6
|
-
*
|
|
7
|
-
* Leverages TC39 Signal primitives for proper batching.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Schedule callback in microtask queue
|
|
11
|
-
*
|
|
12
|
-
* Multiple calls in same tick coalesce into single execution.
|
|
13
|
-
*
|
|
14
|
-
* @param callback - Function to execute in microtask
|
|
15
|
-
* @returns Function to cancel scheduled execution
|
|
16
|
-
*/
|
|
17
|
-
export const scheduleMicrotask = (callback) => {
|
|
18
|
-
let scheduled = false;
|
|
19
|
-
let cancelled = false;
|
|
20
|
-
const execute = () => {
|
|
21
|
-
if (!cancelled) {
|
|
22
|
-
callback();
|
|
23
|
-
}
|
|
24
|
-
scheduled = false;
|
|
25
|
-
};
|
|
26
|
-
if (!scheduled) {
|
|
27
|
-
scheduled = true;
|
|
28
|
-
queueMicrotask(execute);
|
|
29
|
-
}
|
|
30
|
-
// Return cancel function
|
|
31
|
-
return () => {
|
|
32
|
-
cancelled = true;
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
//# sourceMappingURL=debounce.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/signals/debounce.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAoB,EAAgB,EAAE;IACvE,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,OAAO,GAAG,GAAG,EAAE;QACpB,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;QACZ,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,SAAS,GAAG,IAAI,CAAC;QACjB,cAAc,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,yBAAyB;IACzB,OAAO,GAAG,EAAE;QACX,SAAS,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC;AACH,CAAC,CAAC"}
|
package/dist/signals/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/signals/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Signal } from "@xmachines/play-signals";
|
|
2
|
-
/**
|
|
3
|
-
* Manage state signal with synchronous updates
|
|
4
|
-
*
|
|
5
|
-
* Per CONTEXT.md: "Update timing: On stable states only"
|
|
6
|
-
* Per RESEARCH.md: Only update when snapshot.status === 'active'
|
|
7
|
-
*
|
|
8
|
-
* Note: Previously used microtask batching, but this broke guard redirects.
|
|
9
|
-
* XState already provides coalescence - if multiple transitions occur in a single send(),
|
|
10
|
-
* the subscription callback only fires once with the final state.
|
|
11
|
-
*/
|
|
12
|
-
export declare class StateSignalManager<TSnapshot = unknown> {
|
|
13
|
-
private _signal;
|
|
14
|
-
constructor(initialSnapshot: TSnapshot);
|
|
15
|
-
/**
|
|
16
|
-
* Get the signal instance
|
|
17
|
-
*/
|
|
18
|
-
get signal(): Signal.State<TSnapshot>;
|
|
19
|
-
/**
|
|
20
|
-
* Update signal synchronously
|
|
21
|
-
*
|
|
22
|
-
* Synchronous updates ensure that guard-triggered redirects are immediately
|
|
23
|
-
* visible to router bridges, allowing them to sync the browser URL.
|
|
24
|
-
*
|
|
25
|
-
* @param snapshot - New snapshot to set
|
|
26
|
-
*/
|
|
27
|
-
scheduleUpdate(snapshot: TSnapshot): void;
|
|
28
|
-
/**
|
|
29
|
-
* Cleanup (no-op since we're synchronous now)
|
|
30
|
-
*/
|
|
31
|
-
dispose(): void;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=state-signal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-signal.d.ts","sourceRoot":"","sources":["../../src/signals/state-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,kBAAkB,CAAC,SAAS,GAAG,OAAO;IAClD,OAAO,CAAC,OAAO,CAA0B;gBAE7B,eAAe,EAAE,SAAS;IAItC;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAEpC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAIzC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGf"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Signal } from "@xmachines/play-signals";
|
|
2
|
-
/**
|
|
3
|
-
* Manage state signal with synchronous updates
|
|
4
|
-
*
|
|
5
|
-
* Per CONTEXT.md: "Update timing: On stable states only"
|
|
6
|
-
* Per RESEARCH.md: Only update when snapshot.status === 'active'
|
|
7
|
-
*
|
|
8
|
-
* Note: Previously used microtask batching, but this broke guard redirects.
|
|
9
|
-
* XState already provides coalescence - if multiple transitions occur in a single send(),
|
|
10
|
-
* the subscription callback only fires once with the final state.
|
|
11
|
-
*/
|
|
12
|
-
export class StateSignalManager {
|
|
13
|
-
_signal;
|
|
14
|
-
constructor(initialSnapshot) {
|
|
15
|
-
this._signal = new Signal.State(initialSnapshot);
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Get the signal instance
|
|
19
|
-
*/
|
|
20
|
-
get signal() {
|
|
21
|
-
return this._signal;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Update signal synchronously
|
|
25
|
-
*
|
|
26
|
-
* Synchronous updates ensure that guard-triggered redirects are immediately
|
|
27
|
-
* visible to router bridges, allowing them to sync the browser URL.
|
|
28
|
-
*
|
|
29
|
-
* @param snapshot - New snapshot to set
|
|
30
|
-
*/
|
|
31
|
-
scheduleUpdate(snapshot) {
|
|
32
|
-
this._signal.set(snapshot);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Cleanup (no-op since we're synchronous now)
|
|
36
|
-
*/
|
|
37
|
-
dispose() {
|
|
38
|
-
// No cleanup needed for synchronous updates
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=state-signal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-signal.js","sourceRoot":"","sources":["../../src/signals/state-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,OAAO,kBAAkB;IACtB,OAAO,CAA0B;IAEzC,YAAY,eAA0B;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,QAAmB;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO;QACN,4CAA4C;IAC7C,CAAC;CACD"}
|