@purityjs/signals 0.0.0-stage → 0.5.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.
@@ -0,0 +1,393 @@
1
+ //#region src/scope.ts
2
+ var e = [], t = class {
3
+ _handleError(e) {
4
+ let t = this.errorHandlers;
5
+ if (t?.length) {
6
+ let n = !this._isDestroyed;
7
+ n && o(this);
8
+ try {
9
+ for (let n = 0; n < t.length && this.errorHandlers === t; n++) try {
10
+ t[n](e);
11
+ } catch (e) {
12
+ console.error("[Purity] Error in onError handler:", e);
13
+ }
14
+ } finally {
15
+ n && s();
16
+ }
17
+ } else if (this.parent) this.parent._handleError(e);
18
+ else throw e;
19
+ }
20
+ };
21
+ function n(t) {
22
+ let n = e;
23
+ e = [];
24
+ try {
25
+ return t();
26
+ } finally {
27
+ e = n;
28
+ }
29
+ }
30
+ function r() {
31
+ return e[e.length - 1] || null;
32
+ }
33
+ function i() {
34
+ for (let n = e.length - 1; n >= 0; n--) {
35
+ let r = e[n], i = r instanceof t ? r : r.component;
36
+ if (i) return i;
37
+ }
38
+ return null;
39
+ }
40
+ function a(e, n) {
41
+ let a = r();
42
+ a instanceof t ? (e.parent = a, (a.children ??= []).push(e)) : a && (e.parent = i(), (a.disposers ??= []).push(() => n(e)));
43
+ }
44
+ function o(t) {
45
+ e.push(t);
46
+ }
47
+ function s() {
48
+ return e.pop();
49
+ }
50
+ //#endregion
51
+ //#region src/signals.ts
52
+ var c = 0, l = 1, u = 2, d = null, f = 0, p = 0, m = !1, h = [], g = 1e3, _ = 0, v = 100, y = 0;
53
+ function b(e) {
54
+ return d !== null && !d.disposed && C(e), e.value;
55
+ }
56
+ function x(e, t = !0) {
57
+ if (e.status !== c && N(e), t && d !== null && !d.disposed && !e.disposed && C(e), e.error !== null) throw e.error.value;
58
+ return e.value;
59
+ }
60
+ function S(e, t) {
61
+ Object.is(e.value, t) || (e.value = t, e.version++, e.observers !== null && (j(e.observers), p === 0 && B()));
62
+ }
63
+ function C(e) {
64
+ let t = d, n = f, r = t.sources;
65
+ if (r !== null && n < r.length) {
66
+ let i = r[n];
67
+ if (i === e) {
68
+ t.sourceMeta[n * 2] = e.version, f = n + 1;
69
+ return;
70
+ }
71
+ T(i, t, n), r[n] = e, t.sourceMeta[n * 2] = e.version, w(e, t, n);
72
+ } else r === null ? (t.sources = [e], t.sourceMeta = [e.version, 0]) : (r.push(e), t.sourceMeta.push(e.version, 0)), w(e, t, n);
73
+ f = n + 1;
74
+ }
75
+ function w(e, t, n) {
76
+ let r = e.observers, i;
77
+ r === null ? (e.observers = [t], i = 0) : (i = r.length, r.push(t)), t.sourceMeta[n * 2 + 1] = i;
78
+ }
79
+ function T(e, t, n) {
80
+ let r = e.observers;
81
+ if (r === null) return;
82
+ let i = t.sourceMeta[n * 2 + 1];
83
+ t.sourceMeta[n * 2 + 1] = -1;
84
+ let a = r.length - 1;
85
+ if (i !== a) {
86
+ let t = r[a];
87
+ r[i] = t;
88
+ let n = t.sources, o = t.sourceMeta;
89
+ for (let t = 0; t < n.length; t++) if (n[t] === e && o[t * 2 + 1] === a) {
90
+ o[t * 2 + 1] = i;
91
+ break;
92
+ }
93
+ }
94
+ r.pop(), r.length === 0 && (e.observers = null);
95
+ }
96
+ function E(e) {
97
+ let t = e.sources;
98
+ if (t !== null) {
99
+ for (let n = 0; n < t.length; n++) T(t[n], e, n);
100
+ e.sources = null, e.sourceMeta = null;
101
+ }
102
+ }
103
+ var D, O, k, A;
104
+ function j(e) {
105
+ for (let t = 0; t < e.length; t++) {
106
+ let n = e[t];
107
+ n.status !== u && (n.status = u, n.isEffect && h.push(n), n.observers !== null && O(n.observers));
108
+ }
109
+ }
110
+ function M(e) {
111
+ let t = [];
112
+ for (let n = e.length - 1; n >= 0; n--) t.push(e[n]);
113
+ for (; t.length > 0;) {
114
+ let e = t.pop();
115
+ if (e.status !== c) continue;
116
+ e.status = l, e.isEffect && h.push(e);
117
+ let n = e.observers;
118
+ if (n !== null) for (let e = n.length - 1; e >= 0; e--) t.push(n[e]);
119
+ }
120
+ }
121
+ function N(e) {
122
+ e.disposed ? e.status = c : e.status === l ? k(e) : R(e);
123
+ }
124
+ function P(e) {
125
+ let t = [{
126
+ node: e,
127
+ sources: e.sources ?? [],
128
+ versions: e.sourceMeta ?? [],
129
+ idx: 0
130
+ }], n = null;
131
+ for (; t.length > 0;) {
132
+ let e = t[t.length - 1], { node: r, sources: i, versions: a } = e, o = !1;
133
+ for (; e.idx < i.length;) {
134
+ let s = i[e.idx];
135
+ if (s.fn !== null) {
136
+ let e = s;
137
+ if (e.disposed) e.status = c;
138
+ else if (e.status === l) {
139
+ if (!(n === null ? e === r : n.has(e))) {
140
+ (n ??= new Set(t.map((e) => e.node))).add(e), t.push({
141
+ node: e,
142
+ sources: e.sources ?? [],
143
+ versions: e.sourceMeta ?? [],
144
+ idx: 0
145
+ }), o = !0;
146
+ break;
147
+ }
148
+ } else e.status !== c && R(e);
149
+ }
150
+ if (s.version !== a[e.idx * 2]) {
151
+ r.status = u;
152
+ break;
153
+ }
154
+ e.idx++;
155
+ }
156
+ o || (r.status === l ? r.status = c : R(r), n?.delete(r), t.pop());
157
+ }
158
+ }
159
+ function F(e) {
160
+ let t = d;
161
+ d = null;
162
+ try {
163
+ return e();
164
+ } finally {
165
+ d = t;
166
+ }
167
+ }
168
+ function I(e) {
169
+ let t = e.disposers;
170
+ if (!t) return;
171
+ e.disposers = null;
172
+ let n = d;
173
+ d = null;
174
+ try {
175
+ for (let e = 0; e < t.length; e++) try {
176
+ t[e]();
177
+ } catch (e) {
178
+ console.error("[Purity] Error during disposal:", e);
179
+ }
180
+ } finally {
181
+ d = n;
182
+ }
183
+ }
184
+ function L(e) {
185
+ if (e.disposers !== null && I(e), e.disposed) {
186
+ e.status = c;
187
+ return;
188
+ }
189
+ let t = d, n = f, r, i = 0, a = !1, o, s = e.error;
190
+ for (e.error = null;;) {
191
+ d = e, f = 0, e.status = c;
192
+ try {
193
+ r = e.fn(), a = !1;
194
+ } catch (e) {
195
+ a = !0, o = e;
196
+ } finally {
197
+ let r = f, i = e.sources;
198
+ if (i !== null && i.length > r) {
199
+ for (let t = r; t < i.length; t++) T(i[t], e, t);
200
+ i.length = r, e.sourceMeta.length = r * 2;
201
+ }
202
+ d = t, f = n;
203
+ }
204
+ if (e.status === c) break;
205
+ if (++i > v) {
206
+ e.status = c, console.error("[Purity] compute() did not stabilise.");
207
+ break;
208
+ }
209
+ }
210
+ let p;
211
+ if (a ? (p = s === null || !Object.is(s.value, o), e.error = p ? { value: o } : s) : (p = s !== null || !Object.is(e.value, r), e.value = r), p && (e.version++, e.observers !== null)) {
212
+ let t = e.observers;
213
+ for (let e = 0; e < t.length; e++) t[e].status === l && (t[e].status = u);
214
+ }
215
+ }
216
+ function R(e) {
217
+ e.isEffect ? z(e) : D(e);
218
+ }
219
+ function z(e) {
220
+ if (e.disposers !== null && I(e), e.disposed) {
221
+ e.status = c;
222
+ return;
223
+ }
224
+ if (++y > v) throw y--, Error("[Purity] Maximum effect depth exceeded.");
225
+ let t = d, n = f;
226
+ d = e, f = 0, e.status = c, o(e);
227
+ let r;
228
+ try {
229
+ r = e.fn();
230
+ } finally {
231
+ s();
232
+ let r = f, i = e.sources;
233
+ if (i !== null && i.length > r) {
234
+ for (let t = r; t < i.length; t++) T(i[t], e, t);
235
+ i.length = r, e.sourceMeta.length = r * 2;
236
+ }
237
+ d = t, f = n, y--;
238
+ }
239
+ typeof r == "function" && (e.disposers ??= []).push(r), e.disposed && I(e), e.status = c;
240
+ }
241
+ function B() {
242
+ m || (m = !0, queueMicrotask(V));
243
+ }
244
+ function V() {
245
+ m = !1;
246
+ let e = ++_;
247
+ try {
248
+ let t = 0;
249
+ for (; t < h.length;) {
250
+ let n = h[t++];
251
+ if (n.disposed || n.status === c) continue;
252
+ if (n.flushId !== e && (n.flushId = e, n.flushRuns = 0), ++n.flushRuns > g) {
253
+ console.error("[Purity] effect feedback loop detected."), H(t - 1);
254
+ break;
255
+ }
256
+ let r = n.component;
257
+ try {
258
+ N(n);
259
+ } catch (e) {
260
+ n.status = c, I(n);
261
+ try {
262
+ if (!r || r._isDestroyed) throw e;
263
+ let t = d;
264
+ d = null;
265
+ try {
266
+ r._handleError(e);
267
+ } finally {
268
+ d = t;
269
+ }
270
+ } catch (e) {
271
+ console.error("[Purity] watch/effect threw:", e);
272
+ }
273
+ }
274
+ }
275
+ } finally {
276
+ h.length = 0;
277
+ }
278
+ }
279
+ function H(e) {
280
+ if (A) A(e);
281
+ else for (let t = e; t < h.length; t++) h[t].status = c;
282
+ }
283
+ function U(e) {
284
+ let t = [];
285
+ for (let n = e; n < h.length; n++) {
286
+ let e = h[n];
287
+ if (e.status = c, e.sources !== null) for (let n of e.sources) n.fn !== null && t.push(n);
288
+ }
289
+ let n = /* @__PURE__ */ new Set();
290
+ for (; t.length > 0;) {
291
+ let e = t.pop();
292
+ if (!(e.status === c || n.has(e)) && (n.add(e), e.status = l, e.sources !== null)) for (let n of e.sources) n.fn !== null && t.push(n);
293
+ }
294
+ }
295
+ function W(e) {
296
+ let t = {
297
+ fn: null,
298
+ value: e,
299
+ version: 0,
300
+ observers: null
301
+ }, n = function(e) {
302
+ if (arguments.length === 0) return b(t);
303
+ let n = typeof e == "function" ? e(t.value) : e;
304
+ return S(t, n), n;
305
+ };
306
+ return n.get = () => b(t), n.set = (e) => {
307
+ S(t, e);
308
+ }, n.peek = () => t.value, n;
309
+ }
310
+ function G(e, t) {
311
+ return {
312
+ fn: e,
313
+ value: void 0,
314
+ version: 0,
315
+ status: u,
316
+ sources: null,
317
+ sourceMeta: null,
318
+ observers: null,
319
+ disposers: null,
320
+ component: t ? i() : null,
321
+ isEffect: t,
322
+ disposed: !1,
323
+ error: null,
324
+ flushId: 0,
325
+ flushRuns: 0
326
+ };
327
+ }
328
+ function K(e) {
329
+ D = L, O = M, k = P, A = U;
330
+ let t = G(e, !1), n = () => {
331
+ t.disposed || (t.disposed = !0, E(t));
332
+ }, i = r();
333
+ i && (i.disposers ??= []).push(n);
334
+ let a = (() => x(t));
335
+ return a.get = a, a.peek = () => x(t, !1), a;
336
+ }
337
+ function q(e) {
338
+ let t = G(e, !0);
339
+ try {
340
+ N(t);
341
+ } catch (e) {
342
+ throw t.disposed = !0, I(t), E(t), e;
343
+ }
344
+ let n = () => {
345
+ t.disposed || (t.disposed = !0, I(t), E(t), t.component = null);
346
+ }, i = r();
347
+ return i && (i.disposers ??= []).push(n), n;
348
+ }
349
+ function J(e, t) {
350
+ if (!t) return q(e);
351
+ let n = Array.isArray(e), r = n ? e : [e], i = r.length, a = Array(i), o = Array(i), s = !0;
352
+ return q(() => {
353
+ n && (o = []);
354
+ for (let e = 0; e < i; e++) o[e] = r[e]();
355
+ let e = s ? void 0 : F(() => n ? t(o, a) : t(o[0], a[0]));
356
+ s = !1;
357
+ let c = a;
358
+ return a = o, o = c, e;
359
+ });
360
+ }
361
+ function Y(e) {
362
+ p++;
363
+ try {
364
+ e();
365
+ } finally {
366
+ p--, p === 0 && h.length > 0 && B();
367
+ }
368
+ }
369
+ //#endregion
370
+ //#region src/debounced.ts
371
+ function X(e, t) {
372
+ if (typeof t != "number" || !Number.isFinite(t) || t < 0) throw RangeError(`[Purity] debounced(): ms must be a finite, non-negative number (got ${String(t)})`);
373
+ let n = W(e()), r = null, i = !0, a = !1, o = () => {
374
+ r !== null && (clearTimeout(r), r = null);
375
+ }, s = J(() => {
376
+ let s;
377
+ try {
378
+ s = e();
379
+ } catch (e) {
380
+ return console.error("[Purity] debounced() source threw:", e), o;
381
+ }
382
+ return i ? (i = !1, o) : (o(), r = setTimeout(() => {
383
+ r = null, !a && n(s);
384
+ }, t), o);
385
+ }), c = n.get;
386
+ return c.get = n.get, c.peek = n.peek, c.dispose = () => {
387
+ a || (a = !0, o(), s());
388
+ }, c;
389
+ }
390
+ //#endregion
391
+ export { t as ComponentContext, a as attachToOwner, Y as batch, K as compute, X as debounced, I as disposeScope, i as getCurrentComponent, r as getCurrentContext, s as popContext, o as pushContext, W as state, F as untracked, J as watch, q as watchEffectInternal, n as withoutScope };
392
+
393
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["contextStack","ComponentContext","handlers","scoped","pushContext","i","err","popContext","withoutScope","previous","fn","getCurrentContext","getCurrentComponent","ctx","component","attachToOwner","owner","unmount","STATUS_CLEAN","STATUS_CHECK","STATUS_DIRTY","activeListener","activeSourceIdx","batchDepth","microtaskScheduled","pendingEffects","MAX_EFFECT_REPEATS","flushSeq","MAX_EFFECT_DEPTH","effectDepth","readState","track","node","readNode","updateValue","trackReads","writeState","value","markDirty","scheduleFlush","consumer","idx","sources","cur","producer","removeObserver","addObserver","obs","pos","sourceSlot","slot","last","moved","ms","mslots","k","disconnectFromSources","runDerived","propagateComputedCheck","resolveComputedCheck","settleComputedLoop","observers","o","markCheck","stack","kids","startNode","runComputed","resolveCheck","onStack","frame","descended","src","sc","f","versions","untracked","prevListener","disposeScope","disposers","scope","runComputedValue","prevIdx","nextValue","runGuard","thrown","thrownValue","prevError","consumed","changed","runEffect","flush","id","e","settleAfterLoop","unhandled","from","j","settleLoopWithComputeds","seen","c","state","initial","accessor","next","v","createComputedNode","isEffect","compute","dispose","watchEffectInternal","watch","cb","sourceOrFn","isArray","len","oldValues","newValues","first","result","tmp","batch","debounced","out","source","timer","firstRun","disposed","cleanup","stop"],"sources":["../../src/scope.ts","../../src/signals.ts","../../src/debounced.ts"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface Scope {
2
+ disposers?: (() => void)[] | null;
3
+ /** Lean scopes that run after their component rendered (an effect re-running
4
+ * in a later flush) record the component they belong to. */
5
+ component?: ComponentContext | null;
6
+ }
7
+ export declare class ComponentContext implements Scope {
8
+ mounted?: (() => void)[] | null;
9
+ destroyed?: (() => void)[] | null;
10
+ errorHandlers?: ((err: unknown) => void)[] | null;
11
+ disposers?: (() => void)[] | null;
12
+ nodes?: any[] | null;
13
+ /** Root container owned by mount/hydrate, without a DOM dependency here. */
14
+ _rootContainer?: unknown;
15
+ parent?: ComponentContext | null;
16
+ children?: ComponentContext[] | null;
17
+ _isMounted?: boolean;
18
+ _isDestroyed?: boolean;
19
+ _rollback?: boolean;
20
+ _slotContent?: unknown;
21
+ _internals?: any;
22
+ _stateRefs?: Map<string, number> | null;
23
+ _shadowRoot?: unknown;
24
+ _ssrSlots?: unknown;
25
+ _ssrStyles?: string[];
26
+ _formAssociated?: ((form: any) => void)[] | null;
27
+ _formDisabled?: ((disabled: boolean) => void)[] | null;
28
+ _formReset?: (() => void)[] | null;
29
+ _formStateRestore?: ((state: any, mode: 'restore' | 'autocomplete') => void)[] | null;
30
+ _handleError(err: unknown): void;
31
+ }
32
+ /** Run shared work without capturing a caller's disposal or component owner. @internal */
33
+ export declare function withoutScope<T>(fn: () => T): T;
34
+ export declare function getCurrentContext(): Scope | null;
35
+ /**
36
+ * Nearest enclosing component render context. Lean scopes pushed above it
37
+ * (each() rows, match() branches, running effects) own disposal but must not
38
+ * hide the component from component-only APIs (lifecycle hooks, css(),
39
+ * internals, custom states). @internal
40
+ */
41
+ export declare function getCurrentComponent(): ComponentContext | null;
42
+ /**
43
+ * Attach a new child context to the current owner. A component owner tracks it
44
+ * as a child (and is its error parent). A lean scope (row, branch, effect)
45
+ * disposes it, and the nearest component becomes its error parent.
46
+ * @internal
47
+ */
48
+ export declare function attachToOwner(ctx: ComponentContext, unmount: (ctx: ComponentContext) => void): void;
49
+ export declare function pushContext(ctx: Scope): void;
50
+ export declare function popContext(): Scope | undefined;
@@ -0,0 +1,129 @@
1
+ import { type Scope } from './scope.ts';
2
+ /** Run fn without subscribing the active listener to what it reads. @internal */
3
+ export declare function untracked<T>(fn: () => T): T;
4
+ /** Run and clear a scope's disposers; one throwing disposer doesn't stop the rest. @internal */
5
+ export declare function disposeScope(scope: Scope): void;
6
+ /**
7
+ * Reactive state accessor. Call to read, call with value to write.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const count = state(0);
12
+ * count() // read → 0
13
+ * count(5) // write → 5
14
+ * count(v => v+1) // update → 6
15
+ * count.peek() // read without tracking
16
+ * ```
17
+ */
18
+ export interface StateAccessor<T> {
19
+ /** Read the current value (tracked by watch/compute). */
20
+ (): T;
21
+ /** Set a new value. */
22
+ (value: T): T;
23
+ /** Update via callback — receives current value, returns new value. */
24
+ (updater: (current: T) => T): T;
25
+ /** Read the current value (tracked). */
26
+ get(): T;
27
+ /** Set a new value. */
28
+ set(value: T): void;
29
+ /** Read without tracking — won't trigger watch/compute. */
30
+ peek(): T;
31
+ }
32
+ /**
33
+ * Reactive computed accessor. Read-only derived value.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * const doubled = compute(() => count() * 2);
38
+ * doubled() // read derived value
39
+ * doubled.peek() // read without tracking
40
+ * ```
41
+ */
42
+ export interface ComputedAccessor<T> {
43
+ /** Read the derived value (tracked). */
44
+ (): T;
45
+ /** Read the derived value (tracked). */
46
+ get(): T;
47
+ /** Read without tracking. */
48
+ peek(): T;
49
+ }
50
+ /** Cleanup function returned by watch(). Call to stop watching. */
51
+ export type Dispose = () => void;
52
+ /**
53
+ * Create reactive state. Returns an accessor function.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * const count = state(0);
58
+ * count() // read → 0
59
+ * count(5) // write → 5
60
+ * count(v => v + 1) // update with callback → 6
61
+ *
62
+ * // In templates — wrap in arrow for reactivity:
63
+ * html`<p>${() => count()}</p>`
64
+ *
65
+ * // Two-way binding on inputs:
66
+ * html`<input ::value=${count} />`
67
+ * ```
68
+ */
69
+ export declare function state<T>(initial: T): StateAccessor<T>;
70
+ export declare function compute<T>(fn: () => T): ComputedAccessor<T>;
71
+ /** @internal Run a single auto-tracked effect for compiled templates. */
72
+ export declare function watchEffectInternal(fn: () => undefined | Dispose): Dispose;
73
+ export type WatchSource<T> = StateAccessor<T> | ComputedAccessor<T> | (() => T);
74
+ type InferSource<S> = S extends WatchSource<infer T> ? T : never;
75
+ type InferSources<S extends readonly WatchSource<any>[]> = {
76
+ [K in keyof S]: InferSource<S[K]>;
77
+ };
78
+ /**
79
+ * Watch reactive values and run side effects.
80
+ *
81
+ * **Auto-track** — runs immediately, re-runs when any accessed signal changes:
82
+ * ```ts
83
+ * watch(() => console.log(count()));
84
+ * ```
85
+ *
86
+ * **Explicit source** — runs callback when source changes (skips initial):
87
+ * ```ts
88
+ * watch(count, (newVal, oldVal) => {
89
+ * console.log(`changed from ${oldVal} to ${newVal}`);
90
+ * });
91
+ * ```
92
+ *
93
+ * **Multiple sources** — watches a tuple of signals:
94
+ * ```ts
95
+ * watch([count, name], ([c, n], [oldC, oldN]) => {
96
+ * console.log(c, n);
97
+ * });
98
+ * ```
99
+ *
100
+ * **Cleanup** — return a function from the callback to clean up before re-run:
101
+ * ```ts
102
+ * const stop = watch(() => {
103
+ * const id = setInterval(() => tick(), 1000);
104
+ * return () => clearInterval(id); // cleanup
105
+ * });
106
+ * stop(); // dispose the watcher
107
+ * ```
108
+ *
109
+ * @returns Dispose function — call to stop watching.
110
+ */
111
+ export declare function watch(fn: () => undefined | Dispose): Dispose;
112
+ export declare function watch<T>(source: WatchSource<T>, cb: (value: T, oldValue: T) => undefined | Dispose): Dispose;
113
+ export declare function watch<const S extends readonly WatchSource<any>[]>(sources: [...S], cb: (values: InferSources<S>, oldValues: InferSources<S>) => undefined | Dispose): Dispose;
114
+ /**
115
+ * Batch multiple signal writes into a single flush. Effects only run once
116
+ * after the batch.
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * batch(() => {
121
+ * firstName('Jane');
122
+ * lastName('Doe');
123
+ * age(30);
124
+ * });
125
+ * // Effects that depend on these signals fire once, not three times.
126
+ * ```
127
+ */
128
+ export declare function batch(fn: () => void): void;
129
+ export {};
package/package.json CHANGED
@@ -1,6 +1,76 @@
1
1
  {
2
2
  "name": "@purityjs/signals",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.5.0",
4
+ "description": "Platform-agnostic push-pull reactive signals, computed memos, effects, and ownership scopes for Purity",
5
+ "keywords": [
6
+ "computed",
7
+ "effects",
8
+ "purity",
9
+ "reactive",
10
+ "reactivity",
11
+ "signals"
12
+ ],
13
+ "license": "Apache-2.0",
14
+ "author": "KoalaFacts",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/KoalaFacts/Purity.git",
18
+ "directory": "packages/signals"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src",
23
+ "LICENSE",
24
+ "NOTICE",
25
+ "LICENSES"
26
+ ],
27
+ "type": "module",
28
+ "sideEffects": false,
29
+ "main": "./dist/prod/index.cjs",
30
+ "module": "./dist/prod/index.js",
31
+ "types": "./dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "purity-server": {
35
+ "development": {
36
+ "node": {
37
+ "types": "./dist/index.d.ts",
38
+ "import": "./dist/index.js",
39
+ "require": "./dist/index.cjs"
40
+ },
41
+ "default": "./src/index.ts"
42
+ },
43
+ "types": "./dist/index.d.ts",
44
+ "production": {
45
+ "import": "./dist/prod/index.js",
46
+ "require": "./dist/prod/index.cjs"
47
+ },
48
+ "import": "./dist/prod/index.js",
49
+ "require": "./dist/prod/index.cjs"
50
+ },
51
+ "development": {
52
+ "node": {
53
+ "types": "./dist/index.d.ts",
54
+ "import": "./dist/index.js",
55
+ "require": "./dist/index.cjs"
56
+ },
57
+ "default": "./src/index.ts"
58
+ },
59
+ "types": "./dist/index.d.ts",
60
+ "production": {
61
+ "import": "./dist/prod/index.js",
62
+ "require": "./dist/prod/index.cjs"
63
+ },
64
+ "browser": "./dist/prod/index.js",
65
+ "import": "./dist/prod/index.js",
66
+ "require": "./dist/prod/index.cjs"
67
+ }
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
71
+ },
72
+ "scripts": {
73
+ "build": "vp build && vp build -c vite.prod.config.ts && tsc --emitDeclarationOnly",
74
+ "test": "npm run build && vp test run"
75
+ }
76
+ }