@echojs-ecosystem/core 0.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 ADDED
@@ -0,0 +1,71 @@
1
+ <div align="center">
2
+
3
+ # @echojs-ecosystem/core
4
+
5
+ **Minimal UI runtime — components, mount, directives, and DOM utilities.**
6
+
7
+ [![npm](https://img.shields.io/npm/v/@echojs-ecosystem/core)](https://www.npmjs.com/package/@echojs-ecosystem/core)
8
+ [![docs](https://img.shields.io/badge/docs-echojs.dev-blue)](https://echojs.dev/docs/architecture/overview)
9
+
10
+ </div>
11
+
12
+ ---
13
+
14
+ Low-level building blocks for EchoJS UI: **`createComponent`**, **`createModel`**, **`createView`**, **`mount`**, and reactive DOM helpers. Re-exports `@echojs-ecosystem/reactivity` for convenience.
15
+
16
+ Most applications should prefer [`@echojs-ecosystem/hyperdom`](https://www.npmjs.com/package/@echojs-ecosystem/hyperdom) or [`@echojs-ecosystem/framework`](https://www.npmjs.com/package/@echojs-ecosystem/framework). Use `@echojs-ecosystem/core` when you need the component runtime directly.
17
+
18
+ ## Features
19
+
20
+ - **Model / View split** — `createModel` + `createView` + `createComponent`
21
+ - **Direct DOM** — `mount`, `render`, `createElement`, reactive text & props
22
+ - **Directives** — `_$if`, `_$switch`, `showDirective`
23
+ - **Reactivity re-export** — `signal`, `effect`, `computed`, `batch`
24
+
25
+ ## Install
26
+
27
+ ```bash
28
+ npm install @echojs-ecosystem/core @echojs-ecosystem/reactivity
29
+ ```
30
+
31
+ ## Quick start
32
+
33
+ ```ts
34
+ import { createComponent, mount, signal } from "@echojs-ecosystem/core";
35
+
36
+ const Counter = createComponent(
37
+ () => {
38
+ const $count = signal(0);
39
+ return { $count };
40
+ },
41
+ (vm) => {
42
+ const btn = document.createElement("button");
43
+ btn.onclick = () => vm.$count.update((v) => v + 1);
44
+ btn.textContent = `count: ${vm.$count.value()}`;
45
+ return btn;
46
+ },
47
+ );
48
+
49
+ mount(document.getElementById("app")!, Counter());
50
+ ```
51
+
52
+ ## API
53
+
54
+ | Export | Description |
55
+ |--------|-------------|
56
+ | `createModel` / `createView` / `createComponent` | Component composition |
57
+ | `mount` / `unmount` / `render` / `createRoot` | DOM mounting |
58
+ | `createElement`, `setProp`, `setProps` | Element helpers |
59
+ | `insert`, `createReactiveText` | Reactive DOM updates |
60
+ | `signal`, `computed`, `effect`, `batch` | From `@echojs-ecosystem/reactivity` |
61
+
62
+ ## Related packages
63
+
64
+ | Package | Role |
65
+ |---------|------|
66
+ | [`@echojs-ecosystem/reactivity`](https://www.npmjs.com/package/@echojs-ecosystem/reactivity) | Required peer-style dependency |
67
+ | [`@echojs-ecosystem/hyperdom`](https://www.npmjs.com/package/@echojs-ecosystem/hyperdom) | Higher-level `h()` DSL and views |
68
+
69
+ ## Documentation
70
+
71
+ [echojs.dev/docs/architecture/overview](https://echojs.dev/docs/architecture/overview)
@@ -0,0 +1,116 @@
1
+ import { Signal, ReadonlySignal, signal, computed, effect, cleanup } from '@echojs-ecosystem/reactivity';
2
+ export { DeepReadonly, ReadValue, ReadonlySignal, Signal, batch, cleanup, computed, effect, isReadonlySignal as isReadonlySignalBase, isSignal as isSignalBase, scope, signal } from '@echojs-ecosystem/reactivity';
3
+
4
+ type Signalish<T> = T | Signal<T> | ReadonlySignal<T>;
5
+ type JSXElement = Node | Node[] | string | number | boolean | null | undefined | Signalish<unknown> | (() => unknown) | JSXElement[];
6
+ type JSXProps = {
7
+ [key: string]: unknown;
8
+ children?: JSXElement;
9
+ };
10
+ type JSXComponent<P = object> = (props: P) => JSXElement;
11
+ type ComponentVM = Record<string, unknown>;
12
+ type ViewModelFn<VM> = () => VM;
13
+ type ViewFn<VM> = (vm: VM) => JSXElement;
14
+ type ModelContext = ModelContextType;
15
+ type ModelResult<T> = T;
16
+ type EventHandler = (event: Event) => void;
17
+ type EventModifiers = {
18
+ prevent?: boolean;
19
+ stop?: boolean;
20
+ capture?: boolean;
21
+ once?: boolean;
22
+ self?: boolean;
23
+ };
24
+ interface DirectiveProps {
25
+ if?: Signalish<boolean>;
26
+ else?: boolean;
27
+ "else-if"?: Signalish<boolean>;
28
+ show?: Signalish<boolean>;
29
+ }
30
+ type HTMLAttributeValue = string | number | boolean | null | undefined;
31
+ interface ReactiveAttributeConfig {
32
+ name: string;
33
+ value: Signalish<HTMLAttributeValue>;
34
+ isReactive: boolean;
35
+ }
36
+ interface MountResult$1 {
37
+ node: Node;
38
+ dispose: () => void;
39
+ }
40
+
41
+ interface Component<VM> {
42
+ (props?: Record<string, unknown>): JSXElement;
43
+ __type: "echo-component";
44
+ __vm: VM | null;
45
+ __view: ViewFn<VM>;
46
+ [COMPONENT_BRAND]: boolean;
47
+ }
48
+ declare const COMPONENT_BRAND: unique symbol;
49
+ interface ModelContextType {
50
+ signal: typeof signal;
51
+ computed: typeof computed;
52
+ effect: typeof effect;
53
+ cleanup: typeof cleanup;
54
+ batch: <T>(fn: () => T) => T;
55
+ props: Record<string, unknown>;
56
+ }
57
+ type ModelFn<VM> = (ctx: ModelContextType) => VM;
58
+ /**
59
+ * Создает модель (ViewModel) с signals, effects и т.д.
60
+ * Возвращает объект с данными и методами для компонента
61
+ */
62
+ declare const createModel: <VM>(modelFn: ModelFn<VM>) => (() => VM);
63
+ /**
64
+ * Создает view функцию для рендеринга JSX
65
+ * Принимает ViewModel и возвращает JSX элемент
66
+ */
67
+ declare const createView: <VM>(viewFn: ViewFn<VM>) => ViewFn<VM>;
68
+ /**
69
+ * Комбинирует model и view в полноценный компонент
70
+ * Использует createModel и createView внутри
71
+ */
72
+ declare const createComponent: <VM>(modelOrFn: ModelFn<VM> | (() => VM), view: ViewFn<VM>) => JSXComponent<Record<string, unknown>>;
73
+ declare const isComponent: (value: unknown) => boolean;
74
+ declare const getComponentDispose: (node: Node) => (() => void) | null;
75
+
76
+ interface MountResult {
77
+ node: Node;
78
+ dispose: () => void;
79
+ }
80
+ declare const mount: (container: Node, content: JSXElement) => MountResult;
81
+ declare const unmount: (node: Node) => void;
82
+ declare const render: (content: JSXElement) => DocumentFragment;
83
+ declare const renderToString: (content: JSXElement) => string;
84
+ declare const createRoot: (container: Node) => {
85
+ mount: (content: JSXElement) => MountResult;
86
+ unmount: () => void;
87
+ };
88
+
89
+ type RenderFn = () => JSXElement;
90
+ type ConditionFn = () => boolean | Signal<boolean> | ReadonlySignal<boolean>;
91
+ type Branch = {
92
+ condition: ConditionFn;
93
+ render: RenderFn;
94
+ };
95
+ declare const _$if: (parent: Node, condition: Signalish<boolean>, thenRender: RenderFn, elseRender?: RenderFn) => (() => void);
96
+ declare const _$switch: (parent: Node, branches: Branch[], fallback?: RenderFn) => (() => void);
97
+
98
+ declare const applyShowDirective: (element: HTMLElement, condition: Signalish<boolean>) => void;
99
+ declare const showDirective: (element: HTMLElement, value: Signalish<boolean>) => void;
100
+
101
+ declare const insert: (parent: Node, value: JSXElement, marker?: Node | null) => (() => void) | void;
102
+
103
+ declare const createTextNode: (value: unknown) => Text;
104
+ declare const createReactiveText: (value: Signal<unknown> | ReadonlySignal<unknown> | (() => unknown)) => Text;
105
+
106
+ declare const createElement: (tag: string) => Element;
107
+ declare const setProp: (element: Element, name: string, value: Signalish<unknown>) => void;
108
+ declare const setProps: (element: Element, props: Record<string, unknown>) => void;
109
+
110
+ declare const setEvent: (element: Element, name: string, handler: EventHandler | null | undefined) => void;
111
+ declare const setEvents: (element: Element, props: Record<string, unknown>) => void;
112
+
113
+ declare const isFunction: (value: unknown) => value is (...args: unknown[]) => unknown;
114
+ declare const isSignalish: <T>(value: unknown) => value is Signal<T> | ReadonlySignal<T>;
115
+
116
+ export { type Component, type ComponentVM, type DirectiveProps, type EventHandler, type EventModifiers, type HTMLAttributeValue, type JSXComponent, type JSXElement, type JSXProps, type ModelContext, type ModelContextType, type ModelFn, type ModelResult, type MountResult$1 as MountResult, type ReactiveAttributeConfig, type Signalish, type ViewFn, type ViewModelFn, _$if, _$switch, applyShowDirective, createComponent, createElement, createModel, createReactiveText, createRoot, createTextNode, createView, getComponentDispose, insert, isComponent, isFunction, isSignalish, mount, render, renderToString, setEvent, setEvents, setProp, setProps, showDirective, unmount };
package/dist/index.js ADDED
@@ -0,0 +1,862 @@
1
+ import { isSignal, isReadonlySignal, scope, cleanup, effect, computed, signal } from '@echojs-ecosystem/reactivity';
2
+ export { batch, cleanup, computed, effect, isReadonlySignal as isReadonlySignalBase, isSignal as isSignalBase, scope, signal } from '@echojs-ecosystem/reactivity';
3
+
4
+ // src/index.ts
5
+ var isFunction = (value) => typeof value === "function";
6
+ var isSignalish = (value) => {
7
+ return isSignal(value) || isReadonlySignal(value);
8
+ };
9
+ var isObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
10
+ var isArray = Array.isArray;
11
+ var isString = (value) => typeof value === "string";
12
+ var isNumber = (value) => typeof value === "number";
13
+ var isNullOrUndefined = (value) => value === null || value === void 0;
14
+ var normalizeValue = (value) => {
15
+ if (value === null || value === void 0) return "";
16
+ if (isString(value)) return value;
17
+ if (isNumber(value)) return String(value);
18
+ return String(value);
19
+ };
20
+
21
+ // src/component.ts
22
+ var COMPONENT_BRAND = /* @__PURE__ */ Symbol.for("echo.component");
23
+ var createModel = (modelFn) => {
24
+ return () => {
25
+ const context = {
26
+ signal,
27
+ computed,
28
+ effect,
29
+ cleanup,
30
+ batch: (fn) => fn(),
31
+ props: {}
32
+ };
33
+ let vm = null;
34
+ const disposer = scope(() => {
35
+ vm = modelFn(context);
36
+ });
37
+ if (vm && isObject(vm)) {
38
+ vm.__dispose = disposer;
39
+ }
40
+ if (!vm) {
41
+ throw new Error("Model function must return an object");
42
+ }
43
+ return vm;
44
+ };
45
+ };
46
+ var createView = (viewFn) => {
47
+ return (vm) => {
48
+ let result;
49
+ const disposer = scope(() => {
50
+ result = viewFn(vm);
51
+ });
52
+ if (result instanceof Node) {
53
+ result.__echoDispose = disposer;
54
+ }
55
+ return result;
56
+ };
57
+ };
58
+ var createComponent = (modelOrFn, view) => {
59
+ const ComponentFn = (props = {}) => {
60
+ let disposeComponent = null;
61
+ const renderComponent = () => {
62
+ let vm = null;
63
+ const disposer = scope(() => {
64
+ if (isFunction(modelOrFn) && modelOrFn.length === 1) {
65
+ const context = {
66
+ signal,
67
+ computed,
68
+ effect,
69
+ cleanup,
70
+ batch: (fn) => fn(),
71
+ props
72
+ };
73
+ vm = modelOrFn(context);
74
+ } else {
75
+ vm = modelOrFn();
76
+ }
77
+ if (isObject(vm) && isObject(props)) {
78
+ for (const [key, value] of Object.entries(props)) {
79
+ if (!(key in vm)) {
80
+ vm[key] = value;
81
+ }
82
+ }
83
+ }
84
+ });
85
+ disposeComponent = disposer;
86
+ if (!vm) {
87
+ throw new Error("ViewModel must return an object");
88
+ }
89
+ const result2 = view(vm);
90
+ return result2;
91
+ };
92
+ const result = renderComponent();
93
+ if (result instanceof DocumentFragment) {
94
+ const marker = document.createTextNode("");
95
+ result.appendChild(marker);
96
+ const originalDispose = disposeComponent;
97
+ disposeComponent = () => {
98
+ if (originalDispose !== null && typeof originalDispose === "function") {
99
+ originalDispose();
100
+ }
101
+ if (marker.parentNode) {
102
+ marker.parentNode.removeChild(marker);
103
+ }
104
+ };
105
+ }
106
+ if (result instanceof Node) {
107
+ result.__echoDispose = disposeComponent;
108
+ }
109
+ return result;
110
+ };
111
+ const typedComponent = ComponentFn;
112
+ typedComponent.__type = "echo-component";
113
+ typedComponent.__vm = null;
114
+ typedComponent.__view = view;
115
+ typedComponent[COMPONENT_BRAND] = true;
116
+ return ComponentFn;
117
+ };
118
+ var isComponent = (value) => {
119
+ if (!isFunction(value)) return false;
120
+ const brandedValue = value;
121
+ return brandedValue[COMPONENT_BRAND] === true;
122
+ };
123
+ var getComponentDispose = (node) => {
124
+ const dispose = node.__echoDispose;
125
+ return isFunction(dispose) ? dispose : null;
126
+ };
127
+ var mount = (container, content) => {
128
+ const disposers = [];
129
+ const dispose = () => {
130
+ for (let i = disposers.length - 1; i >= 0; i--) {
131
+ try {
132
+ disposers[i]?.();
133
+ } catch {
134
+ }
135
+ }
136
+ };
137
+ let node;
138
+ const cleanupScope = scope(() => {
139
+ if (content instanceof DocumentFragment) {
140
+ const firstChild = content.firstChild;
141
+ if (content.childNodes.length === 1 && firstChild) {
142
+ node = firstChild;
143
+ } else {
144
+ node = content;
145
+ }
146
+ } else if (content instanceof Node) {
147
+ node = content;
148
+ } else if (isSignalish(content)) {
149
+ const initialValue = content.value();
150
+ node = document.createTextNode(String(initialValue ?? ""));
151
+ const disposeEffect = effect(() => {
152
+ const value = content.value();
153
+ node.nodeValue = String(value ?? "");
154
+ });
155
+ disposers.push(disposeEffect);
156
+ } else if (isFunction(content)) {
157
+ const initialValue = content();
158
+ node = document.createTextNode(String(initialValue ?? ""));
159
+ const disposeEffect = effect(() => {
160
+ const value = content();
161
+ node.nodeValue = String(value ?? "");
162
+ });
163
+ disposers.push(disposeEffect);
164
+ } else if (isArray(content)) {
165
+ const fragment = document.createDocumentFragment();
166
+ for (const item of content) {
167
+ if (item === null || item === void 0) continue;
168
+ if (item instanceof Node) {
169
+ fragment.appendChild(item);
170
+ } else if (isSignalish(item)) {
171
+ const textNode = document.createTextNode("");
172
+ fragment.appendChild(textNode);
173
+ const disposeEffect = effect(() => {
174
+ const value = item.value();
175
+ textNode.nodeValue = String(value ?? "");
176
+ });
177
+ disposers.push(disposeEffect);
178
+ } else if (isFunction(item)) {
179
+ const textNode = document.createTextNode("");
180
+ fragment.appendChild(textNode);
181
+ const disposeEffect = effect(() => {
182
+ const value = item();
183
+ textNode.nodeValue = String(value ?? "");
184
+ });
185
+ disposers.push(disposeEffect);
186
+ } else {
187
+ fragment.appendChild(document.createTextNode(String(item)));
188
+ }
189
+ }
190
+ const firstChild = fragment.firstChild;
191
+ if (fragment.childNodes.length === 1 && firstChild) {
192
+ node = firstChild;
193
+ } else {
194
+ node = fragment;
195
+ }
196
+ } else {
197
+ node = document.createTextNode(String(content ?? ""));
198
+ }
199
+ });
200
+ disposers.push(cleanupScope);
201
+ if (node instanceof DocumentFragment) {
202
+ container.appendChild(node);
203
+ } else {
204
+ container.appendChild(node);
205
+ }
206
+ return { node, dispose };
207
+ };
208
+ var unmount = (node) => {
209
+ if (node.parentNode) {
210
+ node.parentNode.removeChild(node);
211
+ }
212
+ const dispose = node.__echoDispose;
213
+ if (isFunction(dispose)) {
214
+ dispose();
215
+ }
216
+ const ifProcessor = node.__echoIfProcessor;
217
+ if (isFunction(ifProcessor)) {
218
+ const result = ifProcessor(node.parentNode || document.createDocumentFragment());
219
+ if (isFunction(result)) {
220
+ result();
221
+ }
222
+ }
223
+ };
224
+ var render = (content) => {
225
+ const fragment = document.createDocumentFragment();
226
+ mount(fragment, content);
227
+ return fragment;
228
+ };
229
+ var renderToString = (content) => {
230
+ const fragment = render(content);
231
+ const wrapper = document.createElement("div");
232
+ wrapper.appendChild(fragment.cloneNode(true));
233
+ return wrapper.innerHTML;
234
+ };
235
+ var createRoot = (container) => {
236
+ let currentResult = null;
237
+ return {
238
+ mount: (content) => {
239
+ if (currentResult) {
240
+ unmount(currentResult.node);
241
+ currentResult.dispose();
242
+ }
243
+ currentResult = mount(container, content);
244
+ return currentResult;
245
+ },
246
+ unmount: () => {
247
+ if (currentResult) {
248
+ unmount(currentResult.node);
249
+ currentResult.dispose();
250
+ currentResult = null;
251
+ }
252
+ }
253
+ };
254
+ };
255
+ var createTextNode = (value) => {
256
+ return document.createTextNode(normalizeValue(value));
257
+ };
258
+ var createReactiveText = (value) => {
259
+ const textNode = document.createTextNode("");
260
+ const disposeFn = effect(() => {
261
+ const resolvedValue = isSignalish(value) ? value.value() : value();
262
+ textNode.nodeValue = normalizeValue(resolvedValue);
263
+ });
264
+ cleanup(disposeFn);
265
+ return textNode;
266
+ };
267
+
268
+ // src/insert.ts
269
+ var isNode = (value) => value instanceof Node;
270
+ var toNode = (value) => {
271
+ if (isNode(value)) return value;
272
+ if (isArray(value)) {
273
+ return createFragment(value);
274
+ }
275
+ if (isString(value) || isNumber(value)) {
276
+ return createTextNode(value);
277
+ }
278
+ return createTextNode("");
279
+ };
280
+ var createFragment = (children) => {
281
+ const fragment = document.createDocumentFragment();
282
+ for (const child of children) {
283
+ if (!isNullOrUndefined(child)) {
284
+ fragment.appendChild(toNode(child));
285
+ }
286
+ }
287
+ return fragment;
288
+ };
289
+ var insertDynamic = (parent, getValue, marker) => {
290
+ const start = document.createTextNode("");
291
+ const end = document.createTextNode("");
292
+ if (marker && marker.parentNode === parent) {
293
+ parent.insertBefore(start, marker);
294
+ parent.insertBefore(end, marker);
295
+ } else {
296
+ parent.appendChild(start);
297
+ parent.appendChild(end);
298
+ }
299
+ const clearRange = () => {
300
+ let node = start.nextSibling;
301
+ while (node && node !== end) {
302
+ const next = node.nextSibling;
303
+ parent.removeChild(node);
304
+ node = next;
305
+ }
306
+ };
307
+ let disposeSubtree = null;
308
+ const disposeEffect = effect(() => {
309
+ if (disposeSubtree) {
310
+ try {
311
+ disposeSubtree();
312
+ } catch {
313
+ }
314
+ disposeSubtree = null;
315
+ }
316
+ const disposeScope = scope(() => {
317
+ clearRange();
318
+ const nextValue = getValue();
319
+ insert(parent, nextValue, end);
320
+ });
321
+ disposeSubtree = disposeScope;
322
+ });
323
+ return () => {
324
+ if (disposeSubtree) {
325
+ disposeSubtree();
326
+ disposeSubtree = null;
327
+ }
328
+ clearRange();
329
+ if (start.parentNode === parent) parent.removeChild(start);
330
+ if (end.parentNode === parent) parent.removeChild(end);
331
+ disposeEffect();
332
+ };
333
+ };
334
+ var insertArray = (parent, children, marker) => {
335
+ const disposers = [];
336
+ for (let i = 0; i < children.length; i++) {
337
+ const child = children[i];
338
+ if (isSignalish(child)) {
339
+ const dispose = insertDynamic(parent, () => child.value(), marker);
340
+ disposers.push(dispose);
341
+ } else if (isFunction(child)) {
342
+ const dispose = insertDynamic(parent, child, marker);
343
+ disposers.push(dispose);
344
+ } else if (isArray(child)) {
345
+ const innerMarker = document.createTextNode("");
346
+ if (marker && marker.parentNode === parent) {
347
+ parent.insertBefore(innerMarker, marker);
348
+ } else {
349
+ parent.appendChild(innerMarker);
350
+ }
351
+ const dispose = insertArray(parent, child, innerMarker);
352
+ disposers.push(dispose);
353
+ } else if (!isNullOrUndefined(child)) {
354
+ const node = toNode(child);
355
+ if (marker && marker.parentNode === parent) {
356
+ parent.insertBefore(node, marker);
357
+ } else {
358
+ parent.appendChild(node);
359
+ }
360
+ }
361
+ }
362
+ return () => {
363
+ for (const dispose of disposers) {
364
+ dispose();
365
+ }
366
+ };
367
+ };
368
+ var insert = (parent, value, marker = null) => {
369
+ if (isNullOrUndefined(value)) {
370
+ return;
371
+ }
372
+ if (isSignalish(value)) {
373
+ return insertDynamic(parent, () => value.value(), marker);
374
+ }
375
+ if (isFunction(value)) {
376
+ return insertDynamic(parent, value, marker);
377
+ }
378
+ if (isArray(value)) {
379
+ return insertArray(parent, value, marker);
380
+ }
381
+ if (isNode(value)) {
382
+ if (marker && marker.parentNode === parent) {
383
+ parent.insertBefore(value, marker);
384
+ } else {
385
+ parent.appendChild(value);
386
+ }
387
+ return;
388
+ }
389
+ const textNode = createTextNode(value);
390
+ if (marker && marker.parentNode === parent) {
391
+ parent.insertBefore(textNode, marker);
392
+ } else {
393
+ parent.appendChild(textNode);
394
+ }
395
+ };
396
+
397
+ // src/directives/if.ts
398
+ var renderBranch = (parent, render2, marker, previousDispose) => {
399
+ let activeNode = null;
400
+ const dispose = scope(() => {
401
+ const result = render2();
402
+ if (result instanceof DocumentFragment) {
403
+ const firstChild = result.firstChild;
404
+ parent.insertBefore(result, marker);
405
+ activeNode = firstChild;
406
+ } else if (result instanceof Node) {
407
+ parent.insertBefore(result, marker);
408
+ activeNode = result;
409
+ } else if (result !== null && result !== void 0) {
410
+ const textNode = document.createTextNode(String(result));
411
+ parent.insertBefore(textNode, marker);
412
+ activeNode = textNode;
413
+ }
414
+ });
415
+ return { dispose, node: activeNode };
416
+ };
417
+ var _$if = (parent, condition, thenRender, elseRender) => {
418
+ const marker = document.createTextNode("");
419
+ parent.appendChild(marker);
420
+ let currentDispose = null;
421
+ let lastBranch = null;
422
+ const update = () => {
423
+ const condValue = isSignalish(condition) ? condition.value() : condition;
424
+ const targetBranch = condValue ? "then" : "else";
425
+ if (targetBranch === lastBranch) return;
426
+ if (currentDispose) {
427
+ currentDispose();
428
+ currentDispose = null;
429
+ }
430
+ if (condValue) {
431
+ const { dispose } = renderBranch(parent, thenRender, marker);
432
+ currentDispose = dispose;
433
+ lastBranch = "then";
434
+ } else if (elseRender) {
435
+ const { dispose } = renderBranch(parent, elseRender, marker);
436
+ currentDispose = dispose;
437
+ lastBranch = "else";
438
+ } else {
439
+ lastBranch = "else";
440
+ }
441
+ };
442
+ if (isSignalish(condition)) {
443
+ const disposeEffect = effect(update);
444
+ cleanup(disposeEffect);
445
+ return () => {
446
+ disposeEffect();
447
+ if (currentDispose) currentDispose();
448
+ if (marker.parentNode) {
449
+ marker.parentNode.removeChild(marker);
450
+ }
451
+ };
452
+ } else {
453
+ update();
454
+ return () => {
455
+ if (currentDispose) currentDispose();
456
+ if (marker.parentNode) {
457
+ marker.parentNode.removeChild(marker);
458
+ }
459
+ };
460
+ }
461
+ };
462
+ var _$switch = (parent, branches, fallback) => {
463
+ const marker = document.createTextNode("");
464
+ parent.appendChild(marker);
465
+ let currentDispose = null;
466
+ let lastIndex = -1;
467
+ const getActiveIndex = () => {
468
+ for (let i = 0; i < branches.length; i++) {
469
+ const branch = branches[i];
470
+ const cond = branch.condition();
471
+ const condValue = isSignalish(cond) ? cond.value() : cond;
472
+ if (condValue) return i;
473
+ }
474
+ return -1;
475
+ };
476
+ const update = () => {
477
+ const activeIndex = getActiveIndex();
478
+ if (activeIndex === lastIndex) return;
479
+ if (currentDispose) {
480
+ currentDispose();
481
+ currentDispose = null;
482
+ }
483
+ if (activeIndex >= 0) {
484
+ const { dispose } = renderBranch(parent, branches[activeIndex].render, marker);
485
+ currentDispose = dispose;
486
+ } else if (fallback) {
487
+ const { dispose } = renderBranch(parent, fallback, marker);
488
+ currentDispose = dispose;
489
+ }
490
+ lastIndex = activeIndex;
491
+ };
492
+ const hasReactiveConditions = branches.some((b) => {
493
+ const cond = b.condition();
494
+ return isSignalish(cond);
495
+ });
496
+ if (hasReactiveConditions) {
497
+ const disposeEffect = effect(update);
498
+ cleanup(disposeEffect);
499
+ return () => {
500
+ disposeEffect();
501
+ if (currentDispose) currentDispose();
502
+ if (marker.parentNode) {
503
+ marker.parentNode.removeChild(marker);
504
+ }
505
+ };
506
+ } else {
507
+ update();
508
+ return () => {
509
+ if (currentDispose) currentDispose();
510
+ if (marker.parentNode) {
511
+ marker.parentNode.removeChild(marker);
512
+ }
513
+ };
514
+ }
515
+ };
516
+ var applyShowDirective = (element, condition) => {
517
+ if (isSignalish(condition)) {
518
+ const dispose = effect(() => {
519
+ const show = condition.value();
520
+ element.style.display = show ? "" : "none";
521
+ });
522
+ cleanup(dispose);
523
+ } else {
524
+ element.style.display = condition ? "" : "none";
525
+ }
526
+ };
527
+ var showDirective = (element, value) => {
528
+ applyShowDirective(element, value);
529
+ };
530
+ var SVG_NS = "http://www.w3.org/2000/svg";
531
+ var MATHML_NS = "http://www.w3.org/1998/Math/MathML";
532
+ var isSvgElement = (tag) => {
533
+ const svgTags = /* @__PURE__ */ new Set([
534
+ "svg",
535
+ "animate",
536
+ "animateMotion",
537
+ "animateTransform",
538
+ "circle",
539
+ "clipPath",
540
+ "defs",
541
+ "desc",
542
+ "ellipse",
543
+ "feBlend",
544
+ "feColorMatrix",
545
+ "feComponentTransfer",
546
+ "feComposite",
547
+ "feConvolveMatrix",
548
+ "feDiffuseLighting",
549
+ "feDisplacementMap",
550
+ "feDistantLight",
551
+ "feDropShadow",
552
+ "feFlood",
553
+ "feFuncA",
554
+ "feFuncB",
555
+ "feFuncG",
556
+ "feFuncR",
557
+ "feGaussianBlur",
558
+ "feImage",
559
+ "feMerge",
560
+ "feMergeNode",
561
+ "feMorphology",
562
+ "feOffset",
563
+ "fePointLight",
564
+ "feSpecularLighting",
565
+ "feSpotLight",
566
+ "feTile",
567
+ "feTurbulence",
568
+ "filter",
569
+ "foreignObject",
570
+ "g",
571
+ "image",
572
+ "line",
573
+ "linearGradient",
574
+ "marker",
575
+ "mask",
576
+ "metadata",
577
+ "mpath",
578
+ "path",
579
+ "pattern",
580
+ "polygon",
581
+ "polyline",
582
+ "radialGradient",
583
+ "rect",
584
+ "set",
585
+ "stop",
586
+ "switch",
587
+ "symbol",
588
+ "text",
589
+ "textPath",
590
+ "title",
591
+ "tspan",
592
+ "use",
593
+ "view"
594
+ ]);
595
+ return svgTags.has(tag);
596
+ };
597
+ var isMathMLElement = (tag) => {
598
+ const mathTags = /* @__PURE__ */ new Set([
599
+ "math",
600
+ "maction",
601
+ "annotation",
602
+ "annotation-xml",
603
+ "menclose",
604
+ "merror",
605
+ "mfenced",
606
+ "mfrac",
607
+ "mi",
608
+ "mmultiscripts",
609
+ "mn",
610
+ "mo",
611
+ "mover",
612
+ "mpadded",
613
+ "mphantom",
614
+ "mprescripts",
615
+ "mroot",
616
+ "mrow",
617
+ "ms",
618
+ "mspace",
619
+ "msqrt",
620
+ "mstyle",
621
+ "msub",
622
+ "msubsup",
623
+ "msup",
624
+ "mtable",
625
+ "mtd",
626
+ "mtext",
627
+ "mtr",
628
+ "munder",
629
+ "munderover",
630
+ "none",
631
+ "semantics"
632
+ ]);
633
+ return mathTags.has(tag);
634
+ };
635
+ var createElement = (tag) => {
636
+ if (isSvgElement(tag)) {
637
+ return document.createElementNS(SVG_NS, tag);
638
+ }
639
+ if (isMathMLElement(tag)) {
640
+ return document.createElementNS(MATHML_NS, tag);
641
+ }
642
+ return document.createElement(tag);
643
+ };
644
+ var setStyle = (element, style) => {
645
+ if (isSignalish(style)) {
646
+ const dispose = effect(() => {
647
+ const value = style.value();
648
+ applyStyle(element, value);
649
+ });
650
+ cleanup(dispose);
651
+ } else {
652
+ applyStyle(element, style);
653
+ }
654
+ };
655
+ var applyStyle = (element, style) => {
656
+ if (isString(style)) {
657
+ element.style.cssText = style;
658
+ } else if (isObject(style)) {
659
+ for (const [key, value] of Object.entries(style)) {
660
+ if (value != null) {
661
+ element.style.setProperty(
662
+ key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),
663
+ String(value)
664
+ );
665
+ }
666
+ }
667
+ }
668
+ };
669
+ var setClass = (element, value) => {
670
+ if (isSignalish(value)) {
671
+ const dispose = effect(() => {
672
+ const classValue = value.value();
673
+ element.className = isString(classValue) ? classValue : String(classValue ?? "");
674
+ });
675
+ cleanup(dispose);
676
+ } else {
677
+ element.className = isString(value) ? value : String(value ?? "");
678
+ }
679
+ };
680
+ var setAttribute = (element, name, value) => {
681
+ if (isSignalish(value)) {
682
+ const dispose = effect(() => {
683
+ const resolvedValue = value.value();
684
+ applyAttribute(element, name, resolvedValue);
685
+ });
686
+ cleanup(dispose);
687
+ } else {
688
+ applyAttribute(element, name, value);
689
+ }
690
+ };
691
+ var applyAttribute = (element, name, value) => {
692
+ if (value === null || value === void 0 || value === false) {
693
+ element.removeAttribute(name);
694
+ } else if (value === true) {
695
+ element.setAttribute(name, "");
696
+ } else {
697
+ element.setAttribute(name, String(value));
698
+ }
699
+ };
700
+ var setElementProperty = (element, name, value) => {
701
+ element[name] = value;
702
+ };
703
+ var setProperty = (element, name, value) => {
704
+ if (isSignalish(value)) {
705
+ const dispose = effect(() => {
706
+ const resolvedValue = value.value();
707
+ setElementProperty(element, name, resolvedValue);
708
+ });
709
+ cleanup(dispose);
710
+ } else {
711
+ setElementProperty(element, name, value);
712
+ }
713
+ };
714
+ var BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
715
+ "allowfullscreen",
716
+ "async",
717
+ "autofocus",
718
+ "autoplay",
719
+ "checked",
720
+ "controls",
721
+ "default",
722
+ "defer",
723
+ "disabled",
724
+ "formnovalidate",
725
+ "hidden",
726
+ "inert",
727
+ "ismap",
728
+ "itemscope",
729
+ "loop",
730
+ "multiple",
731
+ "muted",
732
+ "nomodule",
733
+ "novalidate",
734
+ "open",
735
+ "playsinline",
736
+ "readonly",
737
+ "required",
738
+ "reversed",
739
+ "selected",
740
+ "draggable",
741
+ "contenteditable"
742
+ ]);
743
+ var isBooleanAttr = (name) => {
744
+ return BOOLEAN_ATTRS.has(name.toLowerCase());
745
+ };
746
+ var setProp = (element, name, value) => {
747
+ if (name === "class" || name === "className") {
748
+ setClass(element, value);
749
+ return;
750
+ }
751
+ if (name === "style") {
752
+ setStyle(element, value);
753
+ return;
754
+ }
755
+ if (name.startsWith("prop:")) {
756
+ const propName = name.slice(5);
757
+ setProperty(element, propName, value);
758
+ return;
759
+ }
760
+ if (name.startsWith("attr:")) {
761
+ const attrName = name.slice(5);
762
+ setAttribute(
763
+ element,
764
+ attrName,
765
+ value
766
+ );
767
+ return;
768
+ }
769
+ if (name in element && !isBooleanAttr(name)) {
770
+ setProperty(element, name, value);
771
+ } else {
772
+ setAttribute(element, name, value);
773
+ }
774
+ };
775
+ var setProps = (element, props) => {
776
+ for (const [name, value] of Object.entries(props)) {
777
+ if (value === void 0) continue;
778
+ setProp(element, name, value);
779
+ }
780
+ };
781
+ var parseEventName = (fullName) => {
782
+ const parts = fullName.split(":");
783
+ const event = parts[0];
784
+ const modifiers = {};
785
+ for (let i = 1; i < parts.length; i++) {
786
+ const modifier = parts[i];
787
+ switch (modifier) {
788
+ case "prevent":
789
+ modifiers.prevent = true;
790
+ break;
791
+ case "stop":
792
+ modifiers.stop = true;
793
+ break;
794
+ case "capture":
795
+ modifiers.capture = true;
796
+ break;
797
+ case "once":
798
+ modifiers.once = true;
799
+ break;
800
+ case "self":
801
+ modifiers.self = true;
802
+ break;
803
+ }
804
+ }
805
+ return { event, modifiers };
806
+ };
807
+ var createWrappedHandler = (handler, modifiers) => {
808
+ return (event) => {
809
+ if (modifiers.self && event.target !== event.currentTarget) {
810
+ return;
811
+ }
812
+ if (modifiers.prevent) {
813
+ event.preventDefault();
814
+ }
815
+ if (modifiers.stop) {
816
+ event.stopPropagation();
817
+ }
818
+ handler(event);
819
+ };
820
+ };
821
+ var addEventListener = (element, event, handler, modifiers) => {
822
+ const wrappedHandler = createWrappedHandler(handler, modifiers);
823
+ const options = {
824
+ capture: modifiers.capture,
825
+ once: modifiers.once
826
+ };
827
+ element.addEventListener(event, wrappedHandler, options);
828
+ return () => {
829
+ element.removeEventListener(event, wrappedHandler, options);
830
+ };
831
+ };
832
+ var isEventProp = (name) => {
833
+ return name.startsWith("on-") || /^on[A-Z]/.test(name);
834
+ };
835
+ var normalizeEventName = (name) => {
836
+ if (name.startsWith("on-")) {
837
+ return name.slice(3);
838
+ }
839
+ if (name.startsWith("on") && name.length > 2) {
840
+ const eventName = name.slice(2);
841
+ return eventName[0].toLowerCase() + eventName.slice(1);
842
+ }
843
+ return name;
844
+ };
845
+ var setEvent = (element, name, handler) => {
846
+ if (!isFunction(handler)) return;
847
+ const normalizedName = normalizeEventName(name);
848
+ const { event, modifiers } = parseEventName(normalizedName);
849
+ const disposer = addEventListener(element, event, handler, modifiers);
850
+ cleanup(disposer);
851
+ };
852
+ var setEvents = (element, props) => {
853
+ for (const [name, value] of Object.entries(props)) {
854
+ if (isEventProp(name) && isFunction(value)) {
855
+ setEvent(element, name, value);
856
+ }
857
+ }
858
+ };
859
+
860
+ export { _$if, _$switch, applyShowDirective, createComponent, createElement, createModel, createReactiveText, createRoot, createTextNode, createView, getComponentDispose, insert, isComponent, isFunction, isSignalish, mount, render, renderToString, setEvent, setEvents, setProp, setProps, showDirective, unmount };
861
+ //# sourceMappingURL=index.js.map
862
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internals/utils.ts","../src/component.ts","../src/mount.ts","../src/text.ts","../src/insert.ts","../src/directives/if.ts","../src/directives/show.ts","../src/element.ts","../src/events.ts"],"names":["isReactiveSignal","result","scope","effect","cleanup","render"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReadonlySignal, Signal } from \"@echojs-ecosystem/reactivity\";\nimport { isSignal as isReactiveSignal, isReadonlySignal } from \"@echojs-ecosystem/reactivity\";\n\nexport { isReactiveSignal as isSignal, isReadonlySignal };\n\nexport const isFunction = (value: unknown): value is (...args: unknown[]) => unknown =>\n typeof value === \"function\";\n\nexport const isSignalish = <T>(value: unknown): value is Signal<T> | ReadonlySignal<T> => {\n return isReactiveSignal(value) || isReadonlySignal(value);\n};\n\nexport const isObject = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nexport const isArray = Array.isArray;\n\nexport const isString = (value: unknown): value is string => typeof value === \"string\";\n\nexport const isNumber = (value: unknown): value is number => typeof value === \"number\";\n\nexport const isNullOrUndefined = (value: unknown): value is null | undefined =>\n value === null || value === undefined;\n\nexport const normalizeValue = (value: unknown): string => {\n if (value === null || value === undefined) return \"\";\n if (isString(value)) return value;\n if (isNumber(value)) return String(value);\n return String(value);\n};\n","import { scope, cleanup, effect, signal, computed } from \"@echojs-ecosystem/reactivity\";\nimport { isFunction, isObject } from \"./internals/utils\";\nimport type {\n JSXElement,\n JSXComponent,\n ViewFn,\n} from \"./types\";\n\nexport interface Component<VM> {\n (props?: Record<string, unknown>): JSXElement;\n __type: \"echo-component\";\n __vm: VM | null;\n __view: ViewFn<VM>;\n [COMPONENT_BRAND]: boolean;\n}\n\nconst COMPONENT_BRAND = Symbol.for(\"echo.component\");\n\n// Контекст для создания модели\nexport interface ModelContextType {\n signal: typeof signal;\n computed: typeof computed;\n effect: typeof effect;\n cleanup: typeof cleanup;\n batch: <T>(fn: () => T) => T;\n props: Record<string, unknown>;\n}\n\n// Тип для функции модели\nexport type ModelFn<VM> = (ctx: ModelContextType) => VM;\n\n// Опции для createModel\nexport interface CreateModelOptions {\n props?: Record<string, unknown>;\n}\n\n/**\n * Создает модель (ViewModel) с signals, effects и т.д.\n * Возвращает объект с данными и методами для компонента\n */\nexport const createModel = <VM>(modelFn: ModelFn<VM>): (() => VM) => {\n return (): VM => {\n const context: ModelContextType = {\n signal,\n computed,\n effect,\n cleanup,\n batch: <T>(fn: () => T): T => fn(),\n props: {},\n };\n\n let vm: VM | null = null;\n\n const disposer = scope(() => {\n vm = modelFn(context);\n });\n\n // Сохраняем disposer для очистки\n if (vm && isObject(vm)) {\n (vm as Record<string, unknown>).__dispose = disposer;\n }\n\n if (!vm) {\n throw new Error(\"Model function must return an object\");\n }\n\n return vm;\n };\n};\n\n/**\n * Создает view функцию для рендеринга JSX\n * Принимает ViewModel и возвращает JSX элемент\n */\nexport const createView = <VM>(viewFn: ViewFn<VM>): ViewFn<VM> => {\n return (vm: VM): JSXElement => {\n // View рендеринг должен происходить внутри scope для работы cleanup\n let result: JSXElement;\n const disposer = scope(() => {\n result = viewFn(vm);\n });\n\n // Сохраняем disposer на результате для очистки\n if (result! instanceof Node) {\n (result as unknown as Record<string, (() => void) | null>).__echoDispose = disposer;\n }\n\n return result!;\n };\n};\n\n/**\n * Комбинирует model и view в полноценный компонент\n * Использует createModel и createView внутри\n */\nexport const createComponent = <VM>(\n modelOrFn: ModelFn<VM> | (() => VM),\n view: ViewFn<VM>,\n): JSXComponent<Record<string, unknown>> => {\n const ComponentFn = (props: Record<string, unknown> = {}): JSXElement => {\n let disposeComponent: (() => void) | null = null;\n let mounted = false;\n\n const renderComponent = (): JSXElement => {\n let vm: VM | null = null;\n\n const disposer = scope(() => {\n if (isFunction(modelOrFn) && modelOrFn.length === 1) {\n // Если функция принимает 1 аргумент (context), используем createModel\n const context: ModelContextType = {\n signal,\n computed,\n effect,\n cleanup,\n batch: <T>(fn: () => T): T => fn(),\n props,\n };\n vm = (modelOrFn as ModelFn<VM>)(context);\n } else {\n // Иначе просто вызываем как функцию\n vm = (modelOrFn as () => VM)();\n }\n\n if (isObject(vm) && isObject(props)) {\n for (const [key, value] of Object.entries(props)) {\n if (!(key in (vm as Record<string, unknown>))) {\n (vm as Record<string, unknown>)[key] = value;\n }\n }\n }\n });\n\n disposeComponent = disposer;\n\n if (!vm) {\n throw new Error(\"ViewModel must return an object\");\n }\n\n const result = view(vm);\n\n mounted = true;\n\n return result;\n };\n\n const result = renderComponent();\n\n if (result instanceof DocumentFragment) {\n const marker = document.createTextNode(\"\");\n result.appendChild(marker);\n\n const originalDispose = disposeComponent as (() => void) | null;\n disposeComponent = () => {\n if (originalDispose !== null && typeof originalDispose === \"function\") {\n originalDispose();\n }\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n };\n }\n\n if (result instanceof Node) {\n (result as unknown as Record<string, (() => void) | null>).__echoDispose = disposeComponent;\n }\n\n return result;\n };\n\n const typedComponent = ComponentFn as unknown as Component<VM>;\n typedComponent.__type = \"echo-component\";\n typedComponent.__vm = null;\n typedComponent.__view = view;\n typedComponent[COMPONENT_BRAND] = true;\n\n return ComponentFn as unknown as JSXComponent<Record<string, unknown>>;\n};\n\nexport const isComponent = (value: unknown): boolean => {\n if (!isFunction(value)) return false;\n const brandedValue = value as unknown as Record<symbol, boolean>;\n return brandedValue[COMPONENT_BRAND] === true;\n};\n\nexport const getComponentDispose = (node: Node): (() => void) | null => {\n const dispose = (node as unknown as Record<string, (() => void) | null>).__echoDispose;\n return isFunction(dispose) ? dispose : null;\n};\n","import { scope, effect } from \"@echojs-ecosystem/reactivity\";\nimport type { Signal } from \"@echojs-ecosystem/reactivity\";\nimport { isSignalish, isFunction, isArray } from \"./internals/utils\";\nimport type { JSXElement } from \"./types\";\n\nexport interface MountResult {\n node: Node;\n dispose: () => void;\n}\n\nexport const mount = (container: Node, content: JSXElement): MountResult => {\n const disposers: Array<() => void> = [];\n\n const dispose = (): void => {\n for (let i = disposers.length - 1; i >= 0; i--) {\n try {\n disposers[i]?.();\n } catch {\n // Ignore cleanup errors\n }\n }\n };\n\n let node: Node;\n\n const cleanupScope = scope(() => {\n if (content instanceof DocumentFragment) {\n const firstChild = content.firstChild;\n if (content.childNodes.length === 1 && firstChild) {\n node = firstChild;\n } else {\n node = content;\n }\n } else if (content instanceof Node) {\n node = content;\n } else if (isSignalish(content)) {\n const initialValue = (content as Signal<unknown>).value();\n node = document.createTextNode(String(initialValue ?? \"\"));\n\n const disposeEffect = effect(() => {\n const value = (content as Signal<unknown>).value();\n node.nodeValue = String(value ?? \"\");\n });\n\n disposers.push(disposeEffect);\n } else if (isFunction(content)) {\n const initialValue = (content as () => unknown)();\n node = document.createTextNode(String(initialValue ?? \"\"));\n\n const disposeEffect = effect(() => {\n const value = (content as () => unknown)();\n node.nodeValue = String(value ?? \"\");\n });\n\n disposers.push(disposeEffect);\n } else if (isArray(content)) {\n const fragment = document.createDocumentFragment();\n for (const item of content) {\n if (item === null || item === undefined) continue;\n\n if (item instanceof Node) {\n fragment.appendChild(item);\n } else if (isSignalish(item)) {\n const textNode = document.createTextNode(\"\");\n fragment.appendChild(textNode);\n\n const disposeEffect = effect(() => {\n const value = (item as Signal<unknown>).value();\n textNode.nodeValue = String(value ?? \"\");\n });\n\n disposers.push(disposeEffect);\n } else if (isFunction(item)) {\n const textNode = document.createTextNode(\"\");\n fragment.appendChild(textNode);\n\n const disposeEffect = effect(() => {\n const value = (item as () => unknown)();\n textNode.nodeValue = String(value ?? \"\");\n });\n\n disposers.push(disposeEffect);\n } else {\n fragment.appendChild(document.createTextNode(String(item)));\n }\n }\n\n const firstChild = fragment.firstChild;\n if (fragment.childNodes.length === 1 && firstChild) {\n node = firstChild;\n } else {\n node = fragment;\n }\n } else {\n node = document.createTextNode(String(content ?? \"\"));\n }\n });\n\n disposers.push(cleanupScope);\n\n if (node! instanceof DocumentFragment) {\n container.appendChild(node);\n } else {\n container.appendChild(node!);\n }\n\n return { node: node!, dispose };\n};\n\nexport const unmount = (node: Node): void => {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n\n const dispose = (node as unknown as Record<string, (() => void) | undefined>).__echoDispose;\n if (isFunction(dispose)) {\n dispose();\n }\n\n const ifProcessor = (\n node as unknown as Record<string, ((container: Node) => () => void) | undefined>\n ).__echoIfProcessor;\n if (isFunction(ifProcessor)) {\n const result = ifProcessor(node.parentNode || document.createDocumentFragment());\n if (isFunction(result)) {\n result();\n }\n }\n};\n\nexport const render = (content: JSXElement): DocumentFragment => {\n const fragment = document.createDocumentFragment();\n mount(fragment, content);\n return fragment;\n};\n\nexport const renderToString = (content: JSXElement): string => {\n const fragment = render(content);\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(fragment.cloneNode(true));\n return wrapper.innerHTML;\n};\n\nexport const createRoot = (\n container: Node,\n): {\n mount: (content: JSXElement) => MountResult;\n unmount: () => void;\n} => {\n let currentResult: MountResult | null = null;\n\n return {\n mount: (content: JSXElement): MountResult => {\n if (currentResult) {\n unmount(currentResult.node);\n currentResult.dispose();\n }\n\n currentResult = mount(container, content);\n return currentResult;\n },\n\n unmount: (): void => {\n if (currentResult) {\n unmount(currentResult.node);\n currentResult.dispose();\n currentResult = null;\n }\n },\n };\n};\n","import { effect, cleanup } from \"@echojs-ecosystem/reactivity\";\nimport type { ReadonlySignal, Signal } from \"@echojs-ecosystem/reactivity\";\nimport { isSignalish, normalizeValue } from \"./internals/utils\";\n\nexport const createTextNode = (value: unknown): Text => {\n return document.createTextNode(normalizeValue(value));\n};\n\nexport const createReactiveText = (\n value: Signal<unknown> | ReadonlySignal<unknown> | (() => unknown),\n): Text => {\n const textNode = document.createTextNode(\"\");\n\n const disposeFn = effect(() => {\n const resolvedValue: unknown = isSignalish(value)\n ? (value as Signal<unknown>).value()\n : (value as () => unknown)();\n textNode.nodeValue = normalizeValue(resolvedValue);\n });\n\n cleanup(disposeFn);\n\n return textNode;\n};\n\nexport const setTextContent = (node: Text, value: unknown): void => {\n node.nodeValue = normalizeValue(value);\n};\n","import { effect, scope } from \"@echojs-ecosystem/reactivity\";\nimport type { Signal } from \"@echojs-ecosystem/reactivity\";\nimport {\n isSignalish,\n isArray,\n isFunction,\n isNullOrUndefined,\n isString,\n isNumber,\n} from \"./internals/utils\";\nimport { createTextNode } from \"./text\";\nimport type { JSXElement } from \"./types\";\n\ntype DOMNode = Node;\ntype CleanupFn = () => void;\n\nconst isNode = (value: unknown): value is Node => value instanceof Node;\n\nconst toNode = (value: unknown): Node => {\n if (isNode(value)) return value;\n if (isArray(value)) {\n return createFragment(value);\n }\n if (isString(value) || isNumber(value)) {\n return createTextNode(value);\n }\n return createTextNode(\"\");\n};\n\nconst clearNode = (node: Node): void => {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n};\n\nconst insertSingleNode = (\n parent: Node,\n value: unknown,\n marker: Node | null,\n replace: boolean,\n): Node | null => {\n const node = toNode(value);\n\n if (replace && marker && marker.parentNode === parent) {\n parent.replaceChild(node, marker);\n } else if (marker && marker.parentNode === parent) {\n parent.insertBefore(node, marker);\n } else {\n parent.appendChild(node);\n }\n\n return node;\n};\n\nconst createFragment = (children: unknown[]): DocumentFragment => {\n const fragment = document.createDocumentFragment();\n for (const child of children) {\n if (!isNullOrUndefined(child)) {\n fragment.appendChild(toNode(child));\n }\n }\n return fragment;\n};\n\nconst insertDynamic = (parent: Node, getValue: () => unknown, marker: Node | null): CleanupFn => {\n // IMPORTANT:\n // We can't rely on replaceChild(toNode(nextValue), currentNode) when nextValue can be an array.\n // Arrays are converted to DocumentFragment, and fragments are \"consumed\" on insertion (no parentNode),\n // which breaks subsequent updates. Instead, manage a stable range with start/end markers.\n const start = document.createTextNode(\"\");\n const end = document.createTextNode(\"\");\n\n if (marker && marker.parentNode === parent) {\n parent.insertBefore(start, marker);\n parent.insertBefore(end, marker);\n } else {\n parent.appendChild(start);\n parent.appendChild(end);\n }\n\n const clearRange = () => {\n let node = start.nextSibling;\n while (node && node !== end) {\n const next = node.nextSibling;\n parent.removeChild(node);\n node = next;\n }\n };\n\n let disposeSubtree: CleanupFn | null = null;\n\n const disposeEffect = effect(() => {\n // Dispose предыдущего поддерева (и его cleanup'ов)\n if (disposeSubtree) {\n try {\n disposeSubtree();\n } catch {\n // ignore\n }\n disposeSubtree = null;\n }\n\n // ВАЖНО: ВСЁ делаем внутри scope() - и чтение сигналов, и создание DOM.\n // effectScope из alien-signals не отключает трекинг, он только создаёт scope для cleanup.\n // Так что чтение сигналов внутри scope() всё равно будет tracked.\n const disposeScope = scope(() => {\n clearRange();\n const nextValue = getValue();\n insert(parent, nextValue as JSXElement, end);\n });\n\n // DisposeScope освобождает cleanup'и, зарегистрированные в этом пересчёте\n disposeSubtree = disposeScope;\n });\n\n return () => {\n if (disposeSubtree) {\n disposeSubtree();\n disposeSubtree = null;\n }\n clearRange();\n if (start.parentNode === parent) parent.removeChild(start);\n if (end.parentNode === parent) parent.removeChild(end);\n disposeEffect();\n };\n};\n\nconst insertArray = (parent: Node, children: unknown[], marker: Node | null): CleanupFn => {\n const disposers: CleanupFn[] = [];\n const nodes: Node[] = [];\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n\n if (isSignalish(child)) {\n const dispose = insertDynamic(parent, () => (child as Signal<unknown>).value(), marker);\n disposers.push(dispose);\n } else if (isFunction(child)) {\n const dispose = insertDynamic(parent, child as () => unknown, marker);\n disposers.push(dispose);\n } else if (isArray(child)) {\n const innerMarker = document.createTextNode(\"\");\n if (marker && marker.parentNode === parent) {\n parent.insertBefore(innerMarker, marker);\n } else {\n parent.appendChild(innerMarker);\n }\n nodes.push(innerMarker);\n\n const dispose = insertArray(parent, child, innerMarker);\n disposers.push(dispose);\n } else if (!isNullOrUndefined(child)) {\n const node = toNode(child);\n if (marker && marker.parentNode === parent) {\n parent.insertBefore(node, marker);\n } else {\n parent.appendChild(node);\n }\n nodes.push(node);\n }\n }\n\n return () => {\n for (const dispose of disposers) {\n dispose();\n }\n };\n};\n\nexport const insert = (\n parent: Node,\n value: JSXElement,\n marker: Node | null = null,\n): (() => void) | void => {\n if (isNullOrUndefined(value)) {\n return;\n }\n\n if (isSignalish(value)) {\n return insertDynamic(parent, () => (value as Signal<unknown>).value(), marker);\n }\n\n if (isFunction(value)) {\n return insertDynamic(parent, value as () => unknown, marker);\n }\n\n if (isArray(value)) {\n return insertArray(parent, value, marker);\n }\n\n if (isNode(value)) {\n if (marker && marker.parentNode === parent) {\n parent.insertBefore(value, marker);\n } else {\n parent.appendChild(value);\n }\n return;\n }\n\n const textNode = createTextNode(value);\n if (marker && marker.parentNode === parent) {\n parent.insertBefore(textNode, marker);\n } else {\n parent.appendChild(textNode);\n }\n};\n\nexport const insertBefore = (\n parent: Node,\n value: JSXElement,\n marker: Node,\n): (() => void) | void => {\n return insert(parent, value, marker);\n};\n\nexport const appendChildren = (parent: Node, children: JSXElement): (() => void) | void => {\n return insert(parent, children, null);\n};\n","import { effect, scope, cleanup } from \"@echojs-ecosystem/reactivity\";\nimport type { ReadonlySignal, Signal } from \"@echojs-ecosystem/reactivity\";\nimport { isSignalish, isFunction } from \"../internals/utils\";\nimport { insert, appendChildren } from \"../insert\";\nimport type { JSXElement, Signalish } from \"../types\";\n\ntype RenderFn = () => JSXElement;\ntype ConditionFn = () => boolean | Signal<boolean> | ReadonlySignal<boolean>;\n\ntype Branch = {\n condition: ConditionFn;\n render: RenderFn;\n};\n\nconst renderBranch = (\n parent: Node,\n render: RenderFn,\n marker: Node,\n previousDispose: (() => void) | null,\n): { dispose: () => void; node: Node | null } => {\n if (previousDispose) {\n previousDispose();\n }\n\n let activeNode: Node | null = null;\n\n const dispose = scope(() => {\n const result = render();\n\n if (result instanceof DocumentFragment) {\n const firstChild = result.firstChild;\n parent.insertBefore(result, marker);\n activeNode = firstChild;\n } else if (result instanceof Node) {\n parent.insertBefore(result, marker);\n activeNode = result;\n } else if (result !== null && result !== undefined) {\n const textNode = document.createTextNode(String(result));\n parent.insertBefore(textNode, marker);\n activeNode = textNode;\n }\n });\n\n return { dispose, node: activeNode };\n};\n\nexport const _$if = (\n parent: Node,\n condition: Signalish<boolean>,\n thenRender: RenderFn,\n elseRender?: RenderFn,\n): (() => void) => {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n\n let currentDispose: (() => void) | null = null;\n let lastBranch: \"then\" | \"else\" | null = null;\n\n const update = (): void => {\n const condValue = isSignalish(condition) ? (condition as Signal<boolean>).value() : condition;\n\n const targetBranch: \"then\" | \"else\" = condValue ? \"then\" : \"else\";\n\n if (targetBranch === lastBranch) return;\n\n if (currentDispose) {\n currentDispose();\n currentDispose = null;\n }\n\n if (condValue) {\n const { dispose } = renderBranch(parent, thenRender, marker, null);\n currentDispose = dispose;\n lastBranch = \"then\";\n } else if (elseRender) {\n const { dispose } = renderBranch(parent, elseRender, marker, null);\n currentDispose = dispose;\n lastBranch = \"else\";\n } else {\n lastBranch = \"else\";\n }\n };\n\n if (isSignalish(condition)) {\n const disposeEffect = effect(update);\n cleanup(disposeEffect);\n return () => {\n disposeEffect();\n if (currentDispose) currentDispose();\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n };\n } else {\n update();\n return () => {\n if (currentDispose) currentDispose();\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n };\n }\n};\n\nexport const _$switch = (parent: Node, branches: Branch[], fallback?: RenderFn): (() => void) => {\n const marker = document.createTextNode(\"\");\n parent.appendChild(marker);\n\n let currentDispose: (() => void) | null = null;\n let lastIndex = -1;\n\n const getActiveIndex = (): number => {\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i]!;\n const cond = branch.condition();\n const condValue = isSignalish(cond) ? (cond as Signal<boolean>).value() : cond;\n if (condValue) return i;\n }\n return -1;\n };\n\n const update = (): void => {\n const activeIndex = getActiveIndex();\n\n if (activeIndex === lastIndex) return;\n\n if (currentDispose) {\n currentDispose();\n currentDispose = null;\n }\n\n if (activeIndex >= 0) {\n const { dispose } = renderBranch(parent, branches[activeIndex]!.render, marker, null);\n currentDispose = dispose;\n } else if (fallback) {\n const { dispose } = renderBranch(parent, fallback, marker, null);\n currentDispose = dispose;\n }\n\n lastIndex = activeIndex;\n };\n\n const hasReactiveConditions = branches.some((b) => {\n const cond = b.condition();\n return isSignalish(cond);\n });\n\n if (hasReactiveConditions) {\n const disposeEffect = effect(update);\n cleanup(disposeEffect);\n return () => {\n disposeEffect();\n if (currentDispose) currentDispose();\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n };\n } else {\n update();\n return () => {\n if (currentDispose) currentDispose();\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n };\n }\n};\n","import { effect, cleanup } from \"@echojs-ecosystem/reactivity\";\nimport type { ReadonlySignal, Signal } from \"@echojs-ecosystem/reactivity\";\nimport { isSignalish } from \"../internals/utils\";\nimport type { Signalish } from \"../types\";\n\nexport const applyShowDirective = (element: HTMLElement, condition: Signalish<boolean>): void => {\n if (isSignalish(condition)) {\n const dispose = effect(() => {\n const show = (condition as Signal<boolean>).value();\n element.style.display = show ? \"\" : \"none\";\n });\n cleanup(dispose);\n } else {\n element.style.display = condition ? \"\" : \"none\";\n }\n};\n\nexport const showDirective = (element: HTMLElement, value: Signalish<boolean>): void => {\n applyShowDirective(element, value);\n};\n","import { effect, cleanup } from \"@echojs-ecosystem/reactivity\";\nimport type { ReadonlySignal, Signal } from \"@echojs-ecosystem/reactivity\";\nimport { isSignalish, isObject, isString, isArray, isFunction } from \"./internals/utils\";\nimport type { Signalish } from \"./types\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst MATHML_NS = \"http://www.w3.org/1998/Math/MathML\";\n\nconst isSvgElement = (tag: string): boolean => {\n const svgTags = new Set([\n \"svg\",\n \"animate\",\n \"animateMotion\",\n \"animateTransform\",\n \"circle\",\n \"clipPath\",\n \"defs\",\n \"desc\",\n \"ellipse\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"filter\",\n \"foreignObject\",\n \"g\",\n \"image\",\n \"line\",\n \"linearGradient\",\n \"marker\",\n \"mask\",\n \"metadata\",\n \"mpath\",\n \"path\",\n \"pattern\",\n \"polygon\",\n \"polyline\",\n \"radialGradient\",\n \"rect\",\n \"set\",\n \"stop\",\n \"switch\",\n \"symbol\",\n \"text\",\n \"textPath\",\n \"title\",\n \"tspan\",\n \"use\",\n \"view\",\n ]);\n return svgTags.has(tag);\n};\n\nconst isMathMLElement = (tag: string): boolean => {\n const mathTags = new Set([\n \"math\",\n \"maction\",\n \"annotation\",\n \"annotation-xml\",\n \"menclose\",\n \"merror\",\n \"mfenced\",\n \"mfrac\",\n \"mi\",\n \"mmultiscripts\",\n \"mn\",\n \"mo\",\n \"mover\",\n \"mpadded\",\n \"mphantom\",\n \"mprescripts\",\n \"mroot\",\n \"mrow\",\n \"ms\",\n \"mspace\",\n \"msqrt\",\n \"mstyle\",\n \"msub\",\n \"msubsup\",\n \"msup\",\n \"mtable\",\n \"mtd\",\n \"mtext\",\n \"mtr\",\n \"munder\",\n \"munderover\",\n \"none\",\n \"semantics\",\n ]);\n return mathTags.has(tag);\n};\n\nexport const createElement = (tag: string): Element => {\n if (isSvgElement(tag)) {\n return document.createElementNS(SVG_NS, tag);\n }\n if (isMathMLElement(tag)) {\n return document.createElementNS(MATHML_NS, tag);\n }\n return document.createElement(tag);\n};\n\nconst setStyle = (\n element: HTMLElement,\n style: Signalish<string | Record<string, string | number>>,\n): void => {\n if (isSignalish(style)) {\n const dispose = effect(() => {\n const value = (style as Signal<string | Record<string, string | number>>).value();\n applyStyle(element, value);\n });\n cleanup(dispose);\n } else {\n applyStyle(element, style);\n }\n};\n\nconst applyStyle = (\n element: HTMLElement,\n style: string | Record<string, string | number>,\n): void => {\n if (isString(style)) {\n element.style.cssText = style;\n } else if (isObject(style)) {\n for (const [key, value] of Object.entries(style)) {\n if (value != null) {\n element.style.setProperty(\n key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n String(value),\n );\n }\n }\n }\n};\n\nconst setClass = (element: Element, value: Signalish<string>): void => {\n if (isSignalish(value)) {\n const dispose = effect(() => {\n const classValue = (value as Signal<string>).value();\n element.className = isString(classValue) ? classValue : String(classValue ?? \"\");\n });\n cleanup(dispose);\n } else {\n element.className = isString(value) ? value : String(value ?? \"\");\n }\n};\n\nconst setAttribute = (\n element: Element,\n name: string,\n value: Signalish<string | number | boolean | null | undefined>,\n): void => {\n if (isSignalish(value)) {\n const dispose = effect(() => {\n const resolvedValue = (value as Signal<string | number | boolean | null | undefined>).value();\n applyAttribute(element, name, resolvedValue);\n });\n cleanup(dispose);\n } else {\n applyAttribute(element, name, value);\n }\n};\n\nconst applyAttribute = (\n element: Element,\n name: string,\n value: string | number | boolean | null | undefined,\n): void => {\n if (value === null || value === undefined || value === false) {\n element.removeAttribute(name);\n } else if (value === true) {\n element.setAttribute(name, \"\");\n } else {\n element.setAttribute(name, String(value));\n }\n};\n\n// Helper to safely set properties on an element\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst setElementProperty = (element: unknown, name: string, value: unknown): void => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (element as Record<string, unknown>)[name] = value;\n};\n\nconst setProperty = (element: Element, name: string, value: Signalish<unknown>): void => {\n if (isSignalish(value)) {\n const dispose = effect(() => {\n const resolvedValue = (value as Signal<unknown>).value();\n setElementProperty(element, name, resolvedValue);\n });\n cleanup(dispose);\n } else {\n setElementProperty(element, name, value);\n }\n};\n\nconst BOOLEAN_ATTRS = new Set([\n \"allowfullscreen\",\n \"async\",\n \"autofocus\",\n \"autoplay\",\n \"checked\",\n \"controls\",\n \"default\",\n \"defer\",\n \"disabled\",\n \"formnovalidate\",\n \"hidden\",\n \"inert\",\n \"ismap\",\n \"itemscope\",\n \"loop\",\n \"multiple\",\n \"muted\",\n \"nomodule\",\n \"novalidate\",\n \"open\",\n \"playsinline\",\n \"readonly\",\n \"required\",\n \"reversed\",\n \"selected\",\n \"draggable\",\n \"contenteditable\",\n]);\n\nconst isBooleanAttr = (name: string): boolean => {\n return BOOLEAN_ATTRS.has(name.toLowerCase());\n};\n\nexport const setProp = (element: Element, name: string, value: Signalish<unknown>): void => {\n if (name === \"class\" || name === \"className\") {\n setClass(element, value as Signalish<string>);\n return;\n }\n\n if (name === \"style\") {\n setStyle(element as HTMLElement, value as Signalish<string | Record<string, string | number>>);\n return;\n }\n\n if (name.startsWith(\"prop:\")) {\n const propName = name.slice(5);\n setProperty(element, propName, value);\n return;\n }\n\n if (name.startsWith(\"attr:\")) {\n const attrName = name.slice(5);\n setAttribute(\n element,\n attrName,\n value as Signalish<string | number | boolean | null | undefined>,\n );\n return;\n }\n\n if (name in element && !isBooleanAttr(name)) {\n setProperty(element, name, value);\n } else {\n setAttribute(element, name, value as Signalish<string | number | boolean | null | undefined>);\n }\n};\n\nexport const setProps = (element: Element, props: Record<string, unknown>): void => {\n for (const [name, value] of Object.entries(props)) {\n if (value === undefined) continue;\n setProp(element, name, value as Signalish<unknown>);\n }\n};\n","import { cleanup } from \"@echojs-ecosystem/reactivity\";\nimport type { EventHandler, EventModifiers } from \"./types\";\nimport { isFunction } from \"./internals/utils\";\n\nconst parseEventName = (fullName: string): { event: string; modifiers: EventModifiers } => {\n const parts = fullName.split(\":\");\n const event = parts[0]!;\n const modifiers: EventModifiers = {};\n\n for (let i = 1; i < parts.length; i++) {\n const modifier = parts[i]!;\n switch (modifier) {\n case \"prevent\":\n modifiers.prevent = true;\n break;\n case \"stop\":\n modifiers.stop = true;\n break;\n case \"capture\":\n modifiers.capture = true;\n break;\n case \"once\":\n modifiers.once = true;\n break;\n case \"self\":\n modifiers.self = true;\n break;\n }\n }\n\n return { event, modifiers };\n};\n\nconst createWrappedHandler = (handler: EventHandler, modifiers: EventModifiers): EventHandler => {\n return (event: Event) => {\n if (modifiers.self && event.target !== event.currentTarget) {\n return;\n }\n\n if (modifiers.prevent) {\n event.preventDefault();\n }\n\n if (modifiers.stop) {\n event.stopPropagation();\n }\n\n handler(event);\n };\n};\n\nconst addEventListener = (\n element: Element,\n event: string,\n handler: EventHandler,\n modifiers: EventModifiers,\n): (() => void) => {\n const wrappedHandler = createWrappedHandler(handler, modifiers);\n\n const options: AddEventListenerOptions = {\n capture: modifiers.capture,\n once: modifiers.once,\n };\n\n element.addEventListener(event, wrappedHandler, options);\n\n return () => {\n element.removeEventListener(event, wrappedHandler, options);\n };\n};\n\nconst isEventProp = (name: string): boolean => {\n return name.startsWith(\"on-\") || /^on[A-Z]/.test(name);\n};\n\nconst normalizeEventName = (name: string): string => {\n if (name.startsWith(\"on-\")) {\n return name.slice(3);\n }\n if (name.startsWith(\"on\") && name.length > 2) {\n const eventName = name.slice(2);\n return eventName[0]!.toLowerCase() + eventName.slice(1);\n }\n return name;\n};\n\nexport const setEvent = (\n element: Element,\n name: string,\n handler: EventHandler | null | undefined,\n): void => {\n if (!isFunction(handler)) return;\n\n const normalizedName = normalizeEventName(name);\n const { event, modifiers } = parseEventName(normalizedName);\n\n const disposer = addEventListener(element, event, handler, modifiers);\n cleanup(disposer);\n};\n\nexport const setEvents = (element: Element, props: Record<string, unknown>): void => {\n for (const [name, value] of Object.entries(props)) {\n if (isEventProp(name) && isFunction(value)) {\n setEvent(element, name, value as EventHandler);\n }\n }\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@echojs-ecosystem/core",
3
+ "version": "0.1.0",
4
+ "files": [
5
+ "dist"
6
+ ],
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "check-types": "tsc -p tsconfig.json --noEmit",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit",
20
+ "lint": "oxlint .",
21
+ "lint:fix": "oxlint . --fix",
22
+ "format": "oxfmt --check .",
23
+ "format:fix": "oxfmt .",
24
+ "test": "vitest",
25
+ "test:run": "vitest run",
26
+ "test:coverage": "vitest run --coverage"
27
+ },
28
+ "dependencies": {
29
+ "@echojs-ecosystem/reactivity": "workspace:*"
30
+ },
31
+ "devDependencies": {
32
+ "@echojs-ecosystem/oxc-config": "workspace:*",
33
+ "happy-dom": "^18.0.1",
34
+ "oxlint": "^1.60.0",
35
+ "typescript": "5.9.2",
36
+ "vitest": "^4.1.4"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/echojs-ecosystem/echojs-core.git",
44
+ "directory": "packages/core"
45
+ }
46
+ }