bareui-core 0.1.1
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 +56 -0
- package/dist/core/reactivity.d.ts +20 -0
- package/dist/core/reactivity.d.ts.map +1 -0
- package/dist/core/reactivity.js +162 -0
- package/dist/core/reactivity.js.map +1 -0
- package/dist/core/template.d.ts +62 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +479 -0
- package/dist/core/template.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/types/reactivity.types.d.ts +22 -0
- package/dist/types/reactivity.types.d.ts.map +1 -0
- package/dist/types/reactivity.types.js +2 -0
- package/dist/types/reactivity.types.js.map +1 -0
- package/dist/types/template.types.d.ts +17 -0
- package/dist/types/template.types.d.ts.map +1 -0
- package/dist/types/template.types.js +2 -0
- package/dist/types/template.types.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +21 -0
- package/dist/utils.js.map +1 -0
- package/package.json +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# @mintool/bareui-core
|
|
2
|
+
|
|
3
|
+
A minimal reactive UI library for lightweight apps, widgets, and experiments.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
### `reactive(object)`
|
|
8
|
+
Creates a reactive proxy. When a property changes, any effects or templates that depend on it are updated automatically.
|
|
9
|
+
|
|
10
|
+
### `effect(fn)`
|
|
11
|
+
Runs a function and tracks the reactive values it reads. When those values change, the function runs again.
|
|
12
|
+
|
|
13
|
+
### `html\`...\``
|
|
14
|
+
Creates a template result using tagged template literals. Use `${...}` placeholders for dynamic content, attributes, and event handlers.
|
|
15
|
+
|
|
16
|
+
### `component(fn)`
|
|
17
|
+
Wraps a render function in a component scope. Useful for lifecycle callbacks and grouped cleanup.
|
|
18
|
+
|
|
19
|
+
### `onMounted(fn)`
|
|
20
|
+
Registers a callback that runs after the component is mounted.
|
|
21
|
+
|
|
22
|
+
### `onUnmounted(fn)`
|
|
23
|
+
Registers a callback that runs when the component is disposed.
|
|
24
|
+
|
|
25
|
+
### `repeat(items, keyFn, renderItem)`
|
|
26
|
+
Renders a keyed list of items and keeps DOM updates efficient.
|
|
27
|
+
|
|
28
|
+
### `mount(view, container)`
|
|
29
|
+
Mounts a template result or render function into a DOM element.
|
|
30
|
+
|
|
31
|
+
## Basic usage
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
import { component, html, mount, reactive } from '@mintool/bareui-core';
|
|
35
|
+
|
|
36
|
+
const state = reactive({
|
|
37
|
+
count: 0,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const App = component(() => html`
|
|
41
|
+
<div>
|
|
42
|
+
<h1>Count: ${() => state.count}</h1>
|
|
43
|
+
<button @click=${() => state.count++}>Increment</button>
|
|
44
|
+
</div>
|
|
45
|
+
`);
|
|
46
|
+
|
|
47
|
+
mount(App(), '#app');
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Notes
|
|
52
|
+
* bareui-core is designed to stay small and readable.
|
|
53
|
+
* It works best for lightweight apps, widgets, demos, and UI experiments.
|
|
54
|
+
|
|
55
|
+
### License
|
|
56
|
+
MIT
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EffectOwner, EffectRunner } from '../types/reactivity.types';
|
|
2
|
+
/**
|
|
3
|
+
* Pushes an effect owner onto the active ownership stack.
|
|
4
|
+
*/
|
|
5
|
+
export declare function pushEffectOwner(owner: EffectOwner): void;
|
|
6
|
+
/**
|
|
7
|
+
* Pops the current effect owner from the active ownership stack.
|
|
8
|
+
*/
|
|
9
|
+
export declare function popEffectOwner(): void;
|
|
10
|
+
/**
|
|
11
|
+
* Creates a reactive proxy for an object.
|
|
12
|
+
* Nested objects are wrapped lazily on access.
|
|
13
|
+
*/
|
|
14
|
+
export declare function reactive<T extends object>(target: T): T;
|
|
15
|
+
/**
|
|
16
|
+
* Creates a reactive effect and runs it immediately.
|
|
17
|
+
* The returned runner can be called again or stopped manually.
|
|
18
|
+
*/
|
|
19
|
+
export declare function effect(fn: () => unknown): EffectRunner;
|
|
20
|
+
//# sourceMappingURL=reactivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.d.ts","sourceRoot":"","sources":["../../lib/core/reactivity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAiC3E;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAyCD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAiDvD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,YAAY,CAgDtD"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { isObject } from '../utils';
|
|
2
|
+
const subs = new WeakMap();
|
|
3
|
+
/**
|
|
4
|
+
* Cache raw object -> proxy.
|
|
5
|
+
* Also keep proxy -> raw so reactive(proxy) can return the same proxy instead of double-wrapping.
|
|
6
|
+
*/
|
|
7
|
+
const rawToProxy = new WeakMap();
|
|
8
|
+
const proxyToRaw = new WeakMap();
|
|
9
|
+
let activeEffect = null;
|
|
10
|
+
const effectStack = [];
|
|
11
|
+
const effectOwnerStack = [];
|
|
12
|
+
/**
|
|
13
|
+
* Removes the runner from all dependency sets it has subscribed to.
|
|
14
|
+
*/
|
|
15
|
+
function cleanupEffect(runner) {
|
|
16
|
+
for (const dep of runner.deps) {
|
|
17
|
+
dep.delete(runner);
|
|
18
|
+
}
|
|
19
|
+
runner.deps.clear();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns the current effect owner, if any.
|
|
23
|
+
*/
|
|
24
|
+
function getCurrentEffectOwner() {
|
|
25
|
+
return effectOwnerStack[effectOwnerStack.length - 1] ?? null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Pushes an effect owner onto the active ownership stack.
|
|
29
|
+
*/
|
|
30
|
+
export function pushEffectOwner(owner) {
|
|
31
|
+
effectOwnerStack.push(owner);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Pops the current effect owner from the active ownership stack.
|
|
35
|
+
*/
|
|
36
|
+
export function popEffectOwner() {
|
|
37
|
+
effectOwnerStack.pop();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Records that the active effect depends on target[key].
|
|
41
|
+
*/
|
|
42
|
+
function track(target, key) {
|
|
43
|
+
if (!activeEffect)
|
|
44
|
+
return;
|
|
45
|
+
let depsMap = subs.get(target);
|
|
46
|
+
if (!depsMap) {
|
|
47
|
+
depsMap = new Map();
|
|
48
|
+
subs.set(target, depsMap);
|
|
49
|
+
}
|
|
50
|
+
let dep = depsMap.get(key);
|
|
51
|
+
if (!dep) {
|
|
52
|
+
dep = new Set();
|
|
53
|
+
depsMap.set(key, dep);
|
|
54
|
+
}
|
|
55
|
+
if (!dep.has(activeEffect)) {
|
|
56
|
+
dep.add(activeEffect);
|
|
57
|
+
activeEffect.deps.add(dep);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Triggers every effect subscribed to target[key].
|
|
62
|
+
*/
|
|
63
|
+
function trigger(target, key) {
|
|
64
|
+
const depsMap = subs.get(target);
|
|
65
|
+
if (!depsMap)
|
|
66
|
+
return;
|
|
67
|
+
const dep = depsMap.get(key);
|
|
68
|
+
if (!dep)
|
|
69
|
+
return;
|
|
70
|
+
// Snapshot first so effects can mutate their own dependencies safely.
|
|
71
|
+
const effects = new Set(dep);
|
|
72
|
+
effects.forEach(runner => runner());
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a reactive proxy for an object.
|
|
76
|
+
* Nested objects are wrapped lazily on access.
|
|
77
|
+
*/
|
|
78
|
+
export function reactive(target) {
|
|
79
|
+
if (!isObject(target))
|
|
80
|
+
return target;
|
|
81
|
+
const existingProxy = rawToProxy.get(target);
|
|
82
|
+
if (existingProxy)
|
|
83
|
+
return existingProxy;
|
|
84
|
+
// If someone passes an already-reactive proxy back into reactive(),
|
|
85
|
+
// return it as-is instead of proxying it again.
|
|
86
|
+
if (proxyToRaw.has(target)) {
|
|
87
|
+
return target;
|
|
88
|
+
}
|
|
89
|
+
const proxy = new Proxy(target, {
|
|
90
|
+
get(t, key, receiver) {
|
|
91
|
+
if (key === '__isReactive')
|
|
92
|
+
return true;
|
|
93
|
+
const value = Reflect.get(t, key, receiver);
|
|
94
|
+
track(t, key);
|
|
95
|
+
return isObject(value) ? reactive(value) : value;
|
|
96
|
+
},
|
|
97
|
+
set(t, key, value, receiver) {
|
|
98
|
+
const oldValue = Reflect.get(t, key, receiver);
|
|
99
|
+
const result = Reflect.set(t, key, value, receiver);
|
|
100
|
+
if (!Object.is(oldValue, value)) {
|
|
101
|
+
trigger(t, key);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
},
|
|
105
|
+
deleteProperty(t, key) {
|
|
106
|
+
const hadKey = Object.prototype.hasOwnProperty.call(t, key);
|
|
107
|
+
const result = Reflect.deleteProperty(t, key);
|
|
108
|
+
if (hadKey && result) {
|
|
109
|
+
trigger(t, key);
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
rawToProxy.set(target, proxy);
|
|
115
|
+
proxyToRaw.set(proxy, target);
|
|
116
|
+
return proxy;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Creates a reactive effect and runs it immediately.
|
|
120
|
+
* The returned runner can be called again or stopped manually.
|
|
121
|
+
*/
|
|
122
|
+
export function effect(fn) {
|
|
123
|
+
const owner = getCurrentEffectOwner();
|
|
124
|
+
const runner = function () {
|
|
125
|
+
if (runner.stopped)
|
|
126
|
+
return;
|
|
127
|
+
cleanupEffect(runner);
|
|
128
|
+
try {
|
|
129
|
+
effectStack.push(runner);
|
|
130
|
+
activeEffect = runner;
|
|
131
|
+
if (runner.owner) {
|
|
132
|
+
effectOwnerStack.push(runner.owner);
|
|
133
|
+
}
|
|
134
|
+
return fn();
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
if (runner.owner) {
|
|
138
|
+
effectOwnerStack.pop();
|
|
139
|
+
}
|
|
140
|
+
effectStack.pop();
|
|
141
|
+
activeEffect = effectStack[effectStack.length - 1] ?? null;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
runner.deps = new Set();
|
|
145
|
+
runner.stopped = false;
|
|
146
|
+
runner.owner = owner ?? null;
|
|
147
|
+
runner.stop = () => {
|
|
148
|
+
if (runner.stopped)
|
|
149
|
+
return;
|
|
150
|
+
runner.stopped = true;
|
|
151
|
+
cleanupEffect(runner);
|
|
152
|
+
if (runner.owner) {
|
|
153
|
+
runner.owner.effects.delete(runner);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
if (runner.owner) {
|
|
157
|
+
runner.owner.effects.add(runner);
|
|
158
|
+
}
|
|
159
|
+
runner();
|
|
160
|
+
return runner;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=reactivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.js","sourceRoot":"","sources":["../../lib/core/reactivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Renderable, Source, TemplateResultLike } from '../types/template.types';
|
|
2
|
+
/**
|
|
3
|
+
* Represents a rendered template fragment and its lifecycle callbacks.
|
|
4
|
+
*/
|
|
5
|
+
export declare class TemplateResult implements TemplateResultLike {
|
|
6
|
+
fragment: DocumentFragment;
|
|
7
|
+
cleanups: Array<() => void>;
|
|
8
|
+
mounts: Array<() => void>;
|
|
9
|
+
disposed: boolean;
|
|
10
|
+
mounted: boolean;
|
|
11
|
+
mountScheduled: boolean;
|
|
12
|
+
keyFn: (() => unknown) | null;
|
|
13
|
+
constructor(fragment: DocumentFragment);
|
|
14
|
+
/**
|
|
15
|
+
* Registers a cleanup callback.
|
|
16
|
+
*/
|
|
17
|
+
addCleanup(fn: () => void): void;
|
|
18
|
+
/**
|
|
19
|
+
* Registers a mount callback.
|
|
20
|
+
*/
|
|
21
|
+
addMount(fn: () => void): void;
|
|
22
|
+
/**
|
|
23
|
+
* Runs mount callbacks once.
|
|
24
|
+
*/
|
|
25
|
+
runMounts(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Disposes the fragment and all registered cleanup callbacks.
|
|
28
|
+
*/
|
|
29
|
+
dispose(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the current key for keyed rendering, if one was declared.
|
|
32
|
+
*/
|
|
33
|
+
getKey(): unknown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Runs when the component's rendered fragment has been mounted.
|
|
37
|
+
*/
|
|
38
|
+
export declare function onMounted(fn: () => void): void;
|
|
39
|
+
/**
|
|
40
|
+
* Runs when the component is being disposed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function onUnmounted(fn: () => void): void;
|
|
43
|
+
/**
|
|
44
|
+
* Wraps a render function in a component scope.
|
|
45
|
+
* Component mounts, cleanups, and nested effects are tied to the returned result.
|
|
46
|
+
*/
|
|
47
|
+
export declare function component<P extends any[] = any[]>(renderFn: (...args: P) => Renderable): (...args: P) => TemplateResult;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a template result from a tagged template literal.
|
|
50
|
+
* Placeholders are rendered into content, attributes, and event bindings.
|
|
51
|
+
*/
|
|
52
|
+
export declare function html(strings: TemplateStringsArray, ...values: Array<unknown>): TemplateResult;
|
|
53
|
+
/**
|
|
54
|
+
* Renders and keeps a keyed list of child template results in sync.
|
|
55
|
+
*/
|
|
56
|
+
export declare function repeat<T>(items: Source<T[]>, keyFn: (item: T) => unknown, renderItem: (item: T) => TemplateResult): TemplateResult;
|
|
57
|
+
/**
|
|
58
|
+
* Mounts a template result or render function into a container element.
|
|
59
|
+
* Returns an unmount function.
|
|
60
|
+
*/
|
|
61
|
+
export declare function mount(view: TemplateResult | Source<Renderable>, container: Element | string): () => void;
|
|
62
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../lib/core/template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAgLtF;;GAEG;AACH,qBAAa,cAAe,YAAW,kBAAkB;IACrD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC;gBAElB,QAAQ,EAAE,gBAAgB;IAUtC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAMhC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAM9B;;OAEG;IACH,SAAS,IAAI,IAAI;IAQjB;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,MAAM,IAAI,OAAO;CAGpB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAC7C,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,UAAU,GACrC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,cAAc,CAyChC;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAChB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAC1B,cAAc,CAqKhB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAClB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAC3B,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,cAAc,GACxC,cAAc,CA2EhB;AAED;;;GAGG;AACH,wBAAgB,KAAK,CACjB,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,EACzC,SAAS,EAAE,OAAO,GAAG,MAAM,GAC5B,MAAM,IAAI,CAgCZ"}
|
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { effect, popEffectOwner, pushEffectOwner } from './reactivity';
|
|
2
|
+
import { runCallbacks } from '../utils';
|
|
3
|
+
const INIT = Symbol('init');
|
|
4
|
+
let currentComponent = null;
|
|
5
|
+
/**
|
|
6
|
+
* Type guard for TemplateResult instances.
|
|
7
|
+
*/
|
|
8
|
+
function isTemplateResult(value) {
|
|
9
|
+
return value instanceof TemplateResult;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Clears all DOM nodes between two comment markers.
|
|
13
|
+
*/
|
|
14
|
+
function clearBetween(start, end) {
|
|
15
|
+
let node = start.nextSibling;
|
|
16
|
+
while (node && node !== end) {
|
|
17
|
+
const next = node.nextSibling;
|
|
18
|
+
node.parentNode?.removeChild(node);
|
|
19
|
+
node = next;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Appends a renderable value into a parent node.
|
|
24
|
+
*/
|
|
25
|
+
function appendRenderable(parent, value, cleanups) {
|
|
26
|
+
if (value === null || value === undefined || value === false)
|
|
27
|
+
return;
|
|
28
|
+
if (Array.isArray(value)) {
|
|
29
|
+
for (const item of value) {
|
|
30
|
+
appendRenderable(parent, item, cleanups);
|
|
31
|
+
}
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (isTemplateResult(value)) {
|
|
35
|
+
parent.appendChild(value.fragment);
|
|
36
|
+
cleanups.push(() => value.dispose());
|
|
37
|
+
scheduleMount(value);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (value instanceof Node) {
|
|
41
|
+
parent.appendChild(value);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
parent.appendChild(document.createTextNode(String(value)));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Applies an attribute binding to an element.
|
|
48
|
+
*/
|
|
49
|
+
function setAttrBinding(element, attrName, value) {
|
|
50
|
+
if (attrName === 'value') {
|
|
51
|
+
if (element instanceof HTMLInputElement ||
|
|
52
|
+
element instanceof HTMLTextAreaElement ||
|
|
53
|
+
element instanceof HTMLSelectElement) {
|
|
54
|
+
element.value = value == null ? '' : String(value);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (value === false || value === null || value === undefined) {
|
|
58
|
+
element.removeAttribute(attrName);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
element.setAttribute(attrName, String(value));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (attrName === 'checked') {
|
|
67
|
+
if (element instanceof HTMLInputElement) {
|
|
68
|
+
element.checked = Boolean(value);
|
|
69
|
+
}
|
|
70
|
+
if (value) {
|
|
71
|
+
element.setAttribute(attrName, '');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
element.removeAttribute(attrName);
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (attrName === 'disabled') {
|
|
79
|
+
if (element instanceof HTMLButtonElement || element instanceof HTMLInputElement || element instanceof HTMLSelectElement || element instanceof HTMLTextAreaElement || element instanceof HTMLOptGroupElement || element instanceof HTMLOptionElement) {
|
|
80
|
+
element.disabled = Boolean(value);
|
|
81
|
+
}
|
|
82
|
+
if (value) {
|
|
83
|
+
element.setAttribute(attrName, '');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
element.removeAttribute(attrName);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (attrName === 'selected') {
|
|
91
|
+
if (element instanceof HTMLOptionElement) {
|
|
92
|
+
element.selected = Boolean(value);
|
|
93
|
+
}
|
|
94
|
+
if (value) {
|
|
95
|
+
element.setAttribute(attrName, '');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
element.removeAttribute(attrName);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (value === false || value === null || value === undefined) {
|
|
103
|
+
element.removeAttribute(attrName);
|
|
104
|
+
}
|
|
105
|
+
else if (value === true) {
|
|
106
|
+
element.setAttribute(attrName, '');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
element.setAttribute(attrName, String(value));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Normalizes any renderable root value into a TemplateResult.
|
|
114
|
+
*/
|
|
115
|
+
function normalizeRootValue(value) {
|
|
116
|
+
if (isTemplateResult(value))
|
|
117
|
+
return value;
|
|
118
|
+
const fragment = document.createDocumentFragment();
|
|
119
|
+
const result = new TemplateResult(fragment);
|
|
120
|
+
appendRenderable(fragment, value, result.cleanups);
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Schedules mounted callbacks to run in a microtask.
|
|
125
|
+
*/
|
|
126
|
+
function scheduleMount(result) {
|
|
127
|
+
if (!result || result.disposed || result.mounted || result.mountScheduled)
|
|
128
|
+
return;
|
|
129
|
+
result.mountScheduled = true;
|
|
130
|
+
queueMicrotask(() => {
|
|
131
|
+
result.mountScheduled = false;
|
|
132
|
+
result.runMounts();
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Represents a rendered template fragment and its lifecycle callbacks.
|
|
137
|
+
*/
|
|
138
|
+
export class TemplateResult {
|
|
139
|
+
constructor(fragment) {
|
|
140
|
+
this.fragment = fragment;
|
|
141
|
+
this.cleanups = [];
|
|
142
|
+
this.mounts = [];
|
|
143
|
+
this.disposed = false;
|
|
144
|
+
this.mounted = false;
|
|
145
|
+
this.mountScheduled = false;
|
|
146
|
+
this.keyFn = null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Registers a cleanup callback.
|
|
150
|
+
*/
|
|
151
|
+
addCleanup(fn) {
|
|
152
|
+
if (typeof fn === 'function') {
|
|
153
|
+
this.cleanups.push(fn);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Registers a mount callback.
|
|
158
|
+
*/
|
|
159
|
+
addMount(fn) {
|
|
160
|
+
if (typeof fn === 'function') {
|
|
161
|
+
this.mounts.push(fn);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Runs mount callbacks once.
|
|
166
|
+
*/
|
|
167
|
+
runMounts() {
|
|
168
|
+
if (this.disposed || this.mounted)
|
|
169
|
+
return;
|
|
170
|
+
this.mounted = true;
|
|
171
|
+
runCallbacks(this.mounts);
|
|
172
|
+
this.mounts.length = 0;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Disposes the fragment and all registered cleanup callbacks.
|
|
176
|
+
*/
|
|
177
|
+
dispose() {
|
|
178
|
+
if (this.disposed)
|
|
179
|
+
return;
|
|
180
|
+
this.disposed = true;
|
|
181
|
+
runCallbacks(this.cleanups);
|
|
182
|
+
this.cleanups.length = 0;
|
|
183
|
+
this.mounts.length = 0;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Returns the current key for keyed rendering, if one was declared.
|
|
187
|
+
*/
|
|
188
|
+
getKey() {
|
|
189
|
+
return this.keyFn ? this.keyFn() : undefined;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Runs when the component's rendered fragment has been mounted.
|
|
194
|
+
*/
|
|
195
|
+
export function onMounted(fn) {
|
|
196
|
+
if (currentComponent)
|
|
197
|
+
currentComponent.mounts.push(fn);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Runs when the component is being disposed.
|
|
201
|
+
*/
|
|
202
|
+
export function onUnmounted(fn) {
|
|
203
|
+
if (currentComponent)
|
|
204
|
+
currentComponent.cleanups.push(fn);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Wraps a render function in a component scope.
|
|
208
|
+
* Component mounts, cleanups, and nested effects are tied to the returned result.
|
|
209
|
+
*/
|
|
210
|
+
export function component(renderFn) {
|
|
211
|
+
return (...args) => {
|
|
212
|
+
const prev = currentComponent;
|
|
213
|
+
const scope = {
|
|
214
|
+
mounts: [],
|
|
215
|
+
cleanups: [],
|
|
216
|
+
effects: new Set(),
|
|
217
|
+
disposed: false,
|
|
218
|
+
};
|
|
219
|
+
currentComponent = scope;
|
|
220
|
+
pushEffectOwner(scope);
|
|
221
|
+
try {
|
|
222
|
+
const rendered = renderFn(...args);
|
|
223
|
+
const result = normalizeRootValue(rendered);
|
|
224
|
+
for (const fn of scope.mounts) {
|
|
225
|
+
result.addMount(fn);
|
|
226
|
+
}
|
|
227
|
+
result.addCleanup(() => {
|
|
228
|
+
if (scope.disposed)
|
|
229
|
+
return;
|
|
230
|
+
scope.disposed = true;
|
|
231
|
+
runCallbacks(scope.cleanups);
|
|
232
|
+
for (const runner of Array.from(scope.effects)) {
|
|
233
|
+
runner.stop();
|
|
234
|
+
}
|
|
235
|
+
scope.effects.clear();
|
|
236
|
+
});
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
popEffectOwner();
|
|
241
|
+
currentComponent = prev;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Creates a template result from a tagged template literal.
|
|
247
|
+
* Placeholders are rendered into content, attributes, and event bindings.
|
|
248
|
+
*/
|
|
249
|
+
export function html(strings, ...values) {
|
|
250
|
+
let markup = '';
|
|
251
|
+
for (let i = 0; i < strings.length; i++) {
|
|
252
|
+
markup += strings[i];
|
|
253
|
+
if (i < values.length)
|
|
254
|
+
markup += `<!--rf-${i}-->`;
|
|
255
|
+
}
|
|
256
|
+
const template = document.createElement('template');
|
|
257
|
+
template.innerHTML = markup;
|
|
258
|
+
const fragment = template.content.cloneNode(true);
|
|
259
|
+
const result = new TemplateResult(fragment);
|
|
260
|
+
const parts = [];
|
|
261
|
+
const comments = [];
|
|
262
|
+
const commentWalker = document.createTreeWalker(fragment, NodeFilter.SHOW_COMMENT);
|
|
263
|
+
while (commentWalker.nextNode()) {
|
|
264
|
+
comments.push(commentWalker.currentNode);
|
|
265
|
+
}
|
|
266
|
+
for (const node of comments) {
|
|
267
|
+
const match = /^rf-(\d+)$/.exec(node.nodeValue || '');
|
|
268
|
+
if (!match)
|
|
269
|
+
continue;
|
|
270
|
+
const index = Number(match[1]);
|
|
271
|
+
const parent = node.parentNode;
|
|
272
|
+
const start = document.createComment(`rf-${index}-start`);
|
|
273
|
+
const end = document.createComment(`rf-${index}-end`);
|
|
274
|
+
parent.replaceChild(end, node);
|
|
275
|
+
parent.insertBefore(start, end);
|
|
276
|
+
parts.push({
|
|
277
|
+
kind: 'content',
|
|
278
|
+
index,
|
|
279
|
+
start,
|
|
280
|
+
end,
|
|
281
|
+
cleanups: [],
|
|
282
|
+
last: INIT,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
const elementWalker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT);
|
|
286
|
+
let node;
|
|
287
|
+
while ((node = elementWalker.nextNode())) {
|
|
288
|
+
const element = node;
|
|
289
|
+
for (const attr of Array.from(element.attributes)) {
|
|
290
|
+
const name = attr.name;
|
|
291
|
+
const rawValue = attr.value;
|
|
292
|
+
const match = /^<!--rf-(\d+)-->$/.exec(rawValue);
|
|
293
|
+
if (!match)
|
|
294
|
+
continue;
|
|
295
|
+
const index = Number(match[1]);
|
|
296
|
+
if (name.startsWith(':')) {
|
|
297
|
+
const attrName = name.slice(1);
|
|
298
|
+
element.removeAttribute(name);
|
|
299
|
+
parts.push({
|
|
300
|
+
kind: 'attr',
|
|
301
|
+
index,
|
|
302
|
+
element,
|
|
303
|
+
attrName,
|
|
304
|
+
last: INIT,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
else if (name.startsWith('@')) {
|
|
308
|
+
const eventName = name.slice(1);
|
|
309
|
+
element.removeAttribute(name);
|
|
310
|
+
parts.push({
|
|
311
|
+
kind: 'event',
|
|
312
|
+
index,
|
|
313
|
+
element,
|
|
314
|
+
eventName,
|
|
315
|
+
listener: null,
|
|
316
|
+
last: INIT,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const keyPart = parts.find(p => p.kind === 'attr' && p.attrName === 'key');
|
|
322
|
+
if (keyPart) {
|
|
323
|
+
result.keyFn = () => keyPart.last;
|
|
324
|
+
}
|
|
325
|
+
const runner = effect(() => {
|
|
326
|
+
for (const part of parts) {
|
|
327
|
+
const source = values[part.index];
|
|
328
|
+
if (part.kind === 'content') {
|
|
329
|
+
const resolved = typeof source === 'function' ? source() : source;
|
|
330
|
+
if (Object.is(resolved, part.last))
|
|
331
|
+
continue;
|
|
332
|
+
part.last = resolved;
|
|
333
|
+
for (let i = part.cleanups.length - 1; i >= 0; i--) {
|
|
334
|
+
try {
|
|
335
|
+
part.cleanups[i]();
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
console.error(err);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
part.cleanups.length = 0;
|
|
342
|
+
clearBetween(part.start, part.end);
|
|
343
|
+
const temp = document.createDocumentFragment();
|
|
344
|
+
appendRenderable(temp, resolved, part.cleanups);
|
|
345
|
+
part.end.parentNode.insertBefore(temp, part.end);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (part.kind === 'attr') {
|
|
349
|
+
const resolved = typeof source === 'function' ? source() : source;
|
|
350
|
+
if (Object.is(resolved, part.last))
|
|
351
|
+
continue;
|
|
352
|
+
part.last = resolved;
|
|
353
|
+
// :key is used for identity only, not as a real DOM attribute.
|
|
354
|
+
if (part.attrName !== 'key') {
|
|
355
|
+
setAttrBinding(part.element, part.attrName, resolved);
|
|
356
|
+
}
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
if (part.kind === 'event') {
|
|
360
|
+
const handler = source;
|
|
361
|
+
if (handler === part.last)
|
|
362
|
+
continue;
|
|
363
|
+
part.last = handler;
|
|
364
|
+
if (part.listener) {
|
|
365
|
+
part.element.removeEventListener(part.eventName, part.listener);
|
|
366
|
+
part.listener = null;
|
|
367
|
+
}
|
|
368
|
+
if (typeof handler === 'function') {
|
|
369
|
+
const owner = currentComponent;
|
|
370
|
+
const wrapped = function (...args) {
|
|
371
|
+
if (owner)
|
|
372
|
+
pushEffectOwner(owner);
|
|
373
|
+
try {
|
|
374
|
+
return handler.apply(this, args);
|
|
375
|
+
}
|
|
376
|
+
finally {
|
|
377
|
+
if (owner)
|
|
378
|
+
popEffectOwner();
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
part.listener = wrapped;
|
|
382
|
+
part.element.addEventListener(part.eventName, wrapped);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
result.addCleanup(() => runner.stop());
|
|
388
|
+
return result;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Renders and keeps a keyed list of child template results in sync.
|
|
392
|
+
*/
|
|
393
|
+
export function repeat(items, keyFn, renderItem) {
|
|
394
|
+
const start = document.createComment('repeat-start');
|
|
395
|
+
const end = document.createComment('repeat-end');
|
|
396
|
+
const frag = document.createDocumentFragment();
|
|
397
|
+
frag.append(start, end);
|
|
398
|
+
const result = new TemplateResult(frag);
|
|
399
|
+
const entries = new Map();
|
|
400
|
+
function collectKeys(list) {
|
|
401
|
+
const keys = new Set();
|
|
402
|
+
for (const item of list) {
|
|
403
|
+
keys.add(keyFn(item));
|
|
404
|
+
}
|
|
405
|
+
return keys;
|
|
406
|
+
}
|
|
407
|
+
const runner = effect(() => {
|
|
408
|
+
const list = typeof items === 'function' ? items() : items;
|
|
409
|
+
const nextKeys = collectKeys(list);
|
|
410
|
+
const orderedNodes = [];
|
|
411
|
+
for (const item of list) {
|
|
412
|
+
const key = keyFn(item);
|
|
413
|
+
let entry = entries.get(key);
|
|
414
|
+
if (!entry) {
|
|
415
|
+
const child = renderItem(item);
|
|
416
|
+
if (!isTemplateResult(child)) {
|
|
417
|
+
throw new Error('repeat(): renderItem must return html`...`');
|
|
418
|
+
}
|
|
419
|
+
entry = {
|
|
420
|
+
child,
|
|
421
|
+
nodes: Array.from(child.fragment.childNodes),
|
|
422
|
+
};
|
|
423
|
+
entries.set(key, entry);
|
|
424
|
+
}
|
|
425
|
+
orderedNodes.push(...entry.nodes);
|
|
426
|
+
}
|
|
427
|
+
for (const [key, entry] of entries.entries()) {
|
|
428
|
+
if (!nextKeys.has(key)) {
|
|
429
|
+
entry.child.dispose();
|
|
430
|
+
entries.delete(key);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
clearBetween(start, end);
|
|
434
|
+
const temp = document.createDocumentFragment();
|
|
435
|
+
for (const node of orderedNodes) {
|
|
436
|
+
temp.appendChild(node);
|
|
437
|
+
}
|
|
438
|
+
end.parentNode.insertBefore(temp, end);
|
|
439
|
+
});
|
|
440
|
+
result.addCleanup(() => {
|
|
441
|
+
runner.stop();
|
|
442
|
+
for (const entry of entries.values()) {
|
|
443
|
+
entry.child.dispose();
|
|
444
|
+
}
|
|
445
|
+
entries.clear();
|
|
446
|
+
});
|
|
447
|
+
return result;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Mounts a template result or render function into a container element.
|
|
451
|
+
* Returns an unmount function.
|
|
452
|
+
*/
|
|
453
|
+
export function mount(view, container) {
|
|
454
|
+
const host = typeof container === 'string'
|
|
455
|
+
? document.querySelector(container)
|
|
456
|
+
: container;
|
|
457
|
+
if (!host)
|
|
458
|
+
throw new Error('mount: container not found');
|
|
459
|
+
let current = null;
|
|
460
|
+
const runner = effect(() => {
|
|
461
|
+
if (current) {
|
|
462
|
+
current.dispose();
|
|
463
|
+
current = null;
|
|
464
|
+
}
|
|
465
|
+
const rendered = typeof view === 'function' ? view() : view;
|
|
466
|
+
current = isTemplateResult(rendered) ? rendered : normalizeRootValue(rendered);
|
|
467
|
+
host.replaceChildren(current.fragment);
|
|
468
|
+
scheduleMount(current);
|
|
469
|
+
});
|
|
470
|
+
return () => {
|
|
471
|
+
if (current) {
|
|
472
|
+
current.dispose();
|
|
473
|
+
current = null;
|
|
474
|
+
}
|
|
475
|
+
runner.stop();
|
|
476
|
+
host.replaceChildren();
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../lib/core/template.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { EffectOwner, EffectRunner } from './types/reactivity.types';
|
|
2
|
+
export type { Renderable, Source, TemplateResultLike } from './types/template.types';
|
|
3
|
+
export { effect, popEffectOwner, pushEffectOwner, reactive } from './core/reactivity';
|
|
4
|
+
export { component, html, mount, onMounted, onUnmounted, repeat, TemplateResult } from './core/template';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC1E,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A reactive effect runner function.
|
|
3
|
+
* It tracks its dependency sets so it can clean itself up when stopped.
|
|
4
|
+
*/
|
|
5
|
+
export interface EffectRunner {
|
|
6
|
+
(): unknown;
|
|
7
|
+
deps: Set<Set<EffectRunner>>;
|
|
8
|
+
stopped: boolean;
|
|
9
|
+
owner: EffectOwner | null;
|
|
10
|
+
stop: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A logical ownership scope for effects and lifecycle callbacks.
|
|
14
|
+
* Components create one of these so nested reactive effects can be disposed together.
|
|
15
|
+
*/
|
|
16
|
+
export interface EffectOwner {
|
|
17
|
+
effects: Set<EffectRunner>;
|
|
18
|
+
cleanups: Array<() => void>;
|
|
19
|
+
mounts: Array<() => void>;
|
|
20
|
+
disposed: boolean;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=reactivity.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.types.d.ts","sourceRoot":"","sources":["../../lib/types/reactivity.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,IAAI,OAAO,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.types.js","sourceRoot":"","sources":["../../lib/types/reactivity.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A function or plain value source used by template bindings.
|
|
3
|
+
*/
|
|
4
|
+
export type Source<T> = T | (() => T);
|
|
5
|
+
/**
|
|
6
|
+
* A value that can be rendered into the DOM.
|
|
7
|
+
*/
|
|
8
|
+
export type Renderable = TemplateResultLike | Node | string | number | bigint | boolean | null | undefined | Renderable[];
|
|
9
|
+
/**
|
|
10
|
+
* Minimal shape used by template helpers.
|
|
11
|
+
* This keeps the type layer independent from the concrete class implementation.
|
|
12
|
+
*/
|
|
13
|
+
export interface TemplateResultLike {
|
|
14
|
+
readonly fragment: DocumentFragment;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=template.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.types.d.ts","sourceRoot":"","sources":["../../lib/types/template.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,UAAU,GAChB,kBAAkB,GAClB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,UAAU,EAAE,CAAC;AAEnB;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,OAAO,IAAI,IAAI,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.types.js","sourceRoot":"","sources":["../../lib/types/template.types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true when the value is a non-null object.
|
|
3
|
+
*/
|
|
4
|
+
export declare function isObject(value: unknown): value is object;
|
|
5
|
+
/**
|
|
6
|
+
* Runs callbacks from last to first, catching and logging individual errors
|
|
7
|
+
* so one failing cleanup does not prevent the others from running.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runCallbacks(callbacks: Array<() => void>): void;
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAQ/D"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true when the value is a non-null object.
|
|
3
|
+
*/
|
|
4
|
+
export function isObject(value) {
|
|
5
|
+
return value !== null && typeof value === 'object';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Runs callbacks from last to first, catching and logging individual errors
|
|
9
|
+
* so one failing cleanup does not prevent the others from running.
|
|
10
|
+
*/
|
|
11
|
+
export function runCallbacks(callbacks) {
|
|
12
|
+
for (let i = callbacks.length - 1; i >= 0; i--) {
|
|
13
|
+
try {
|
|
14
|
+
callbacks[i]();
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
console.error(err);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAA4B;IACrD,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACD,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bareui-core",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "A tiny reactive UI library",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"typescript": "^5.9.3"
|
|
20
|
+
}
|
|
21
|
+
}
|