@llui/dom 0.0.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/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/addressed.d.ts +16 -0
- package/dist/addressed.d.ts.map +1 -0
- package/dist/addressed.js +40 -0
- package/dist/addressed.js.map +1 -0
- package/dist/binding.d.ts +18 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +62 -0
- package/dist/binding.js.map +1 -0
- package/dist/chain-update.d.ts +7 -0
- package/dist/chain-update.d.ts.map +1 -0
- package/dist/chain-update.js +16 -0
- package/dist/chain-update.js.map +1 -0
- package/dist/component.d.ts +3 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +4 -0
- package/dist/component.js.map +1 -0
- package/dist/devtools.d.ts +113 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +390 -0
- package/dist/devtools.js.map +1 -0
- package/dist/el-split.d.ts +3 -0
- package/dist/el-split.d.ts.map +1 -0
- package/dist/el-split.js +54 -0
- package/dist/el-split.js.map +1 -0
- package/dist/el-template.d.ts +17 -0
- package/dist/el-template.d.ts.map +1 -0
- package/dist/el-template.js +64 -0
- package/dist/el-template.js.map +1 -0
- package/dist/elements.d.ts +80 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +234 -0
- package/dist/elements.js.map +1 -0
- package/dist/form.d.ts +30 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +12 -0
- package/dist/form.js.map +1 -0
- package/dist/hmr.d.ts +20 -0
- package/dist/hmr.d.ts.map +1 -0
- package/dist/hmr.js +98 -0
- package/dist/hmr.js.map +1 -0
- package/dist/hydrate.d.ts +29 -0
- package/dist/hydrate.d.ts.map +1 -0
- package/dist/hydrate.js +96 -0
- package/dist/hydrate.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/merge-handlers.d.ts +7 -0
- package/dist/merge-handlers.d.ts.map +1 -0
- package/dist/merge-handlers.js +16 -0
- package/dist/merge-handlers.js.map +1 -0
- package/dist/mount.d.ts +14 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +182 -0
- package/dist/mount.js.map +1 -0
- package/dist/primitives/branch.d.ts +3 -0
- package/dist/primitives/branch.d.ts.map +1 -0
- package/dist/primitives/branch.js +94 -0
- package/dist/primitives/branch.js.map +1 -0
- package/dist/primitives/child.d.ts +3 -0
- package/dist/primitives/child.d.ts.map +1 -0
- package/dist/primitives/child.js +77 -0
- package/dist/primitives/child.js.map +1 -0
- package/dist/primitives/context.d.ts +45 -0
- package/dist/primitives/context.d.ts.map +1 -0
- package/dist/primitives/context.js +87 -0
- package/dist/primitives/context.js.map +1 -0
- package/dist/primitives/each.d.ts +3 -0
- package/dist/primitives/each.d.ts.map +1 -0
- package/dist/primitives/each.js +515 -0
- package/dist/primitives/each.js.map +1 -0
- package/dist/primitives/error-boundary.d.ts +6 -0
- package/dist/primitives/error-boundary.d.ts.map +1 -0
- package/dist/primitives/error-boundary.js +32 -0
- package/dist/primitives/error-boundary.js.map +1 -0
- package/dist/primitives/foreign.d.ts +3 -0
- package/dist/primitives/foreign.d.ts.map +1 -0
- package/dist/primitives/foreign.js +80 -0
- package/dist/primitives/foreign.js.map +1 -0
- package/dist/primitives/memo.d.ts +3 -0
- package/dist/primitives/memo.d.ts.map +1 -0
- package/dist/primitives/memo.js +30 -0
- package/dist/primitives/memo.js.map +1 -0
- package/dist/primitives/on-mount.d.ts +2 -0
- package/dist/primitives/on-mount.d.ts.map +1 -0
- package/dist/primitives/on-mount.js +23 -0
- package/dist/primitives/on-mount.js.map +1 -0
- package/dist/primitives/portal.d.ts +3 -0
- package/dist/primitives/portal.d.ts.map +1 -0
- package/dist/primitives/portal.js +31 -0
- package/dist/primitives/portal.js.map +1 -0
- package/dist/primitives/selector.d.ts +22 -0
- package/dist/primitives/selector.d.ts.map +1 -0
- package/dist/primitives/selector.js +104 -0
- package/dist/primitives/selector.js.map +1 -0
- package/dist/primitives/show.d.ts +3 -0
- package/dist/primitives/show.d.ts.map +1 -0
- package/dist/primitives/show.js +12 -0
- package/dist/primitives/show.js.map +1 -0
- package/dist/primitives/slice.d.ts +23 -0
- package/dist/primitives/slice.d.ts.map +1 -0
- package/dist/primitives/slice.js +57 -0
- package/dist/primitives/slice.js.map +1 -0
- package/dist/primitives/text.d.ts +2 -0
- package/dist/primitives/text.d.ts.map +1 -0
- package/dist/primitives/text.js +35 -0
- package/dist/primitives/text.js.map +1 -0
- package/dist/render-context.d.ts +14 -0
- package/dist/render-context.d.ts.map +1 -0
- package/dist/render-context.js +14 -0
- package/dist/render-context.js.map +1 -0
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +14 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scope.d.ts +24 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +102 -0
- package/dist/scope.js.map +1 -0
- package/dist/slice-handler.d.ts +31 -0
- package/dist/slice-handler.d.ts.map +1 -0
- package/dist/slice-handler.js +34 -0
- package/dist/slice-handler.js.map +1 -0
- package/dist/ssr-dom.d.ts +12 -0
- package/dist/ssr-dom.d.ts.map +1 -0
- package/dist/ssr-dom.js +36 -0
- package/dist/ssr-dom.js.map +1 -0
- package/dist/ssr.d.ts +11 -0
- package/dist/ssr.d.ts.map +1 -0
- package/dist/ssr.js +127 -0
- package/dist/ssr.js.map +1 -0
- package/dist/structural.d.ts +4 -0
- package/dist/structural.d.ts.map +1 -0
- package/dist/structural.js +2 -0
- package/dist/structural.js.map +1 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/update-loop.d.ts +31 -0
- package/dist/update-loop.d.ts.map +1 -0
- package/dist/update-loop.js +236 -0
- package/dist/update-loop.js.map +1 -0
- package/dist/view-helpers.d.ts +44 -0
- package/dist/view-helpers.d.ts.map +1 -0
- package/dist/view-helpers.js +24 -0
- package/dist/view-helpers.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAoBrE,qEAAqE;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAA;AAEtD,qEAAqE;AAErE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAqB,MAAM,SAAS,CAAA;AAKjE,qEAAqE;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAgB,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,qEAAqE;AAErE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,qEAAqE;AAErE,OAAO,EACL,CAAC,EACD,IAAI,EACJ,OAAO,EACP,KAAK,EACL,CAAC,EACD,UAAU,EACV,EAAE,EACF,MAAM,EACN,MAAM,EACN,IAAI,EACJ,EAAE,EACF,OAAO,EACP,MAAM,EACN,GAAG,EACH,EAAE,EACF,EAAE,EACF,EAAE,EACF,QAAQ,EACR,UAAU,EACV,MAAM,EACN,MAAM,EACN,IAAI,EACJ,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,MAAM,EACN,EAAE,EACF,CAAC,EACD,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,MAAM,EACN,EAAE,EACF,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,EAAE,EACF,QAAQ,EACR,MAAM,EACN,MAAM,EACN,CAAC,EACD,GAAG,EACH,QAAQ,EACR,OAAO,EACP,MAAM,EACN,KAAK,EACL,IAAI,EACJ,MAAM,EACN,GAAG,EACH,OAAO,EACP,GAAG,EACH,KAAK,EACL,KAAK,EACL,EAAE,EACF,QAAQ,EACR,KAAK,EACL,EAAE,EACF,KAAK,EACL,IAAI,EACJ,EAAE,EACF,EAAE,EACF,KAAK,GACN,MAAM,YAAY,CAAA;AAEnB,qEAAqE;AAErE,OAAO,EAAE,UAAU,EAAiB,MAAM,QAAQ,CAAA;AAElD,qEAAqE;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compose multiple update handlers into one.
|
|
3
|
+
* Each handler returns [newState, effects] if it handled the message, or null to pass through.
|
|
4
|
+
* The first handler that returns non-null wins.
|
|
5
|
+
*/
|
|
6
|
+
export declare function mergeHandlers<S, M, E>(...handlers: Array<(state: S, msg: M) => [S, E[]] | null>): (state: S, msg: M) => [S, E[]];
|
|
7
|
+
//# sourceMappingURL=merge-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-handlers.d.ts","sourceRoot":"","sources":["../src/merge-handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GACxD,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAQhC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compose multiple update handlers into one.
|
|
3
|
+
* Each handler returns [newState, effects] if it handled the message, or null to pass through.
|
|
4
|
+
* The first handler that returns non-null wins.
|
|
5
|
+
*/
|
|
6
|
+
export function mergeHandlers(...handlers) {
|
|
7
|
+
return (state, msg) => {
|
|
8
|
+
for (const handler of handlers) {
|
|
9
|
+
const result = handler(state, msg);
|
|
10
|
+
if (result)
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
return [state, []];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=merge-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-handlers.js","sourceRoot":"","sources":["../src/merge-handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAG,QAAsD;IAEzD,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAClC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;QAC3B,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpB,CAAC,CAAA;AACH,CAAC"}
|
package/dist/mount.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ComponentDef, AppHandle } from './types';
|
|
2
|
+
declare global {
|
|
3
|
+
interface ImportMeta {
|
|
4
|
+
env?: {
|
|
5
|
+
DEV?: boolean;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export interface MountOptions {
|
|
10
|
+
devTools?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function mountApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, data?: unknown, _options?: MountOptions): AppHandle;
|
|
13
|
+
export declare function hydrateApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, serverState: S): AppHandle;
|
|
14
|
+
//# sourceMappingURL=mount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAStD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,UAAU;QAClB,GAAG,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KACxB;CACF;AAsBD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9B,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,YAAY,GACtB,SAAS,CAuEX;AA6DD,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,WAAW,EAAE,CAAC,GACb,SAAS,CAoCX"}
|
package/dist/mount.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { createComponentInstance, flushInstance } from './update-loop';
|
|
2
|
+
import { disposeScope } from './scope';
|
|
3
|
+
import { setRenderContext, clearRenderContext } from './render-context';
|
|
4
|
+
import { setFlatBindings } from './binding';
|
|
5
|
+
import { registerInstance, unregisterInstance } from './runtime';
|
|
6
|
+
// ── HMR (dev only) ──────────────────────────────────────────────
|
|
7
|
+
// Set by enableHmr() from '@llui/dom/hmr' — never imported in production.
|
|
8
|
+
let hmrModule = null;
|
|
9
|
+
/** @internal Called by enableHmr in the hmr module */
|
|
10
|
+
export function _setHmrModule(m) {
|
|
11
|
+
hmrModule = m;
|
|
12
|
+
}
|
|
13
|
+
// ── DevTools auto-install (dev only) ────────────────────────────
|
|
14
|
+
// Set by enableDevTools() from '@llui/dom/devtools' — never imported in production.
|
|
15
|
+
let devToolsInstall = null;
|
|
16
|
+
/** @internal Called by enableDevTools in the devtools module */
|
|
17
|
+
export function _setDevToolsInstall(fn) {
|
|
18
|
+
devToolsInstall = fn;
|
|
19
|
+
}
|
|
20
|
+
export function mountApp(container, def, data, _options) {
|
|
21
|
+
// HMR: if this component is already mounted (module re-execution
|
|
22
|
+
// during hot update), swap the definition instead of creating a new instance.
|
|
23
|
+
if (hmrModule && def.name) {
|
|
24
|
+
const swapped = hmrModule.replaceComponent(def.name, def);
|
|
25
|
+
if (swapped)
|
|
26
|
+
return swapped;
|
|
27
|
+
}
|
|
28
|
+
const inst = createComponentInstance(def, data);
|
|
29
|
+
// Dev-only: auto-install devtools if enabled via '@llui/dom/devtools' import
|
|
30
|
+
if (devToolsInstall)
|
|
31
|
+
devToolsInstall(inst);
|
|
32
|
+
// Dev-only: warn if initial state contains non-serializable values.
|
|
33
|
+
// Silent bug-bomb: Date/Map/Set/class instances break SSR, hydration, replay tools.
|
|
34
|
+
if (import.meta.env?.DEV) {
|
|
35
|
+
const offender = findNonSerializable(inst.state);
|
|
36
|
+
if (offender) {
|
|
37
|
+
console.warn(`[LLui] Non-serializable value in ${def.name} initial state at ${offender.path}:`, offender.value, '\nState must be plain JSON (no Date/Map/Set/class instances/functions).');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Run view() within a render context so primitives can register bindings
|
|
41
|
+
setFlatBindings(inst.allBindings);
|
|
42
|
+
setRenderContext({ ...inst, container, send: inst.send });
|
|
43
|
+
// Pass a minimal View bundle with just `send`. State-bound helpers
|
|
44
|
+
// (show/text/each/...) are resolved by the compiler: it rewrites
|
|
45
|
+
// destructured aliases to direct imports from @llui/dom, so the view
|
|
46
|
+
// callback never needs them on h at runtime. createView() remains a
|
|
47
|
+
// public export for users who need the full bundle in dynamic / test
|
|
48
|
+
// scenarios — they call it explicitly.
|
|
49
|
+
const nodes = def.view({ send: inst.send });
|
|
50
|
+
clearRenderContext();
|
|
51
|
+
setFlatBindings(null);
|
|
52
|
+
// Batch-insert via DocumentFragment — one layout-invalidating operation
|
|
53
|
+
// instead of N individual appendChild calls on a live container element.
|
|
54
|
+
if (nodes.length > 1) {
|
|
55
|
+
const frag = document.createDocumentFragment();
|
|
56
|
+
for (const node of nodes)
|
|
57
|
+
frag.appendChild(node);
|
|
58
|
+
container.appendChild(frag);
|
|
59
|
+
}
|
|
60
|
+
else if (nodes.length === 1) {
|
|
61
|
+
container.appendChild(nodes[0]);
|
|
62
|
+
}
|
|
63
|
+
registerInstance(inst);
|
|
64
|
+
if (hmrModule && def.name) {
|
|
65
|
+
hmrModule.registerForHmr(def.name, inst, container);
|
|
66
|
+
}
|
|
67
|
+
dispatchInitialEffects(inst);
|
|
68
|
+
let disposed = false;
|
|
69
|
+
return {
|
|
70
|
+
dispose() {
|
|
71
|
+
if (disposed)
|
|
72
|
+
return;
|
|
73
|
+
disposed = true;
|
|
74
|
+
if (hmrModule && def.name)
|
|
75
|
+
hmrModule.unregisterForHmr(def.name, inst);
|
|
76
|
+
inst.abortController.abort();
|
|
77
|
+
unregisterInstance(inst);
|
|
78
|
+
disposeScope(inst.rootScope);
|
|
79
|
+
container.textContent = '';
|
|
80
|
+
},
|
|
81
|
+
flush() {
|
|
82
|
+
if (disposed)
|
|
83
|
+
return;
|
|
84
|
+
flushInstance(inst);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Walks an object graph looking for non-JSON-serializable values. Returns the
|
|
89
|
+
// first offender found (depth-first), or null if everything is fine. Stops at
|
|
90
|
+
// depth 6 to bound runtime cost for large states.
|
|
91
|
+
function findNonSerializable(v, path = 'state', depth = 0, seen = new WeakSet()) {
|
|
92
|
+
if (depth > 6)
|
|
93
|
+
return null;
|
|
94
|
+
if (v === null || v === undefined)
|
|
95
|
+
return null;
|
|
96
|
+
const t = typeof v;
|
|
97
|
+
if (t === 'string' || t === 'number' || t === 'boolean')
|
|
98
|
+
return null;
|
|
99
|
+
if (t === 'function')
|
|
100
|
+
return { path, value: v };
|
|
101
|
+
if (t === 'symbol' || t === 'bigint')
|
|
102
|
+
return { path, value: v };
|
|
103
|
+
if (t !== 'object')
|
|
104
|
+
return null;
|
|
105
|
+
const obj = v;
|
|
106
|
+
if (seen.has(obj))
|
|
107
|
+
return null;
|
|
108
|
+
seen.add(obj);
|
|
109
|
+
if (obj instanceof Date)
|
|
110
|
+
return { path: `${path} (Date)`, value: v };
|
|
111
|
+
if (obj instanceof Map)
|
|
112
|
+
return { path: `${path} (Map)`, value: v };
|
|
113
|
+
if (obj instanceof Set)
|
|
114
|
+
return { path: `${path} (Set)`, value: v };
|
|
115
|
+
if (obj instanceof RegExp)
|
|
116
|
+
return { path: `${path} (RegExp)`, value: v };
|
|
117
|
+
if (obj instanceof Promise)
|
|
118
|
+
return { path: `${path} (Promise)`, value: v };
|
|
119
|
+
// Plain objects/arrays have Object.prototype / Array.prototype. Class instances
|
|
120
|
+
// have a different prototype.
|
|
121
|
+
const proto = Object.getPrototypeOf(obj);
|
|
122
|
+
if (proto !== null && proto !== Object.prototype && proto !== Array.prototype) {
|
|
123
|
+
return { path: `${path} (${proto?.constructor?.name ?? 'class instance'})`, value: v };
|
|
124
|
+
}
|
|
125
|
+
if (Array.isArray(v)) {
|
|
126
|
+
for (let i = 0; i < v.length; i++) {
|
|
127
|
+
const r = findNonSerializable(v[i], `${path}[${i}]`, depth + 1, seen);
|
|
128
|
+
if (r)
|
|
129
|
+
return r;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
for (const k of Object.keys(obj)) {
|
|
134
|
+
const r = findNonSerializable(obj[k], `${path}.${k}`, depth + 1, seen);
|
|
135
|
+
if (r)
|
|
136
|
+
return r;
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
function dispatchInitialEffects(inst) {
|
|
141
|
+
if (inst.initialEffects.length === 0 || !inst.def.onEffect)
|
|
142
|
+
return;
|
|
143
|
+
for (const effect of inst.initialEffects) {
|
|
144
|
+
inst.def.onEffect({ effect, send: inst.send, signal: inst.signal });
|
|
145
|
+
}
|
|
146
|
+
inst.initialEffects = [];
|
|
147
|
+
}
|
|
148
|
+
export function hydrateApp(container, def, serverState) {
|
|
149
|
+
const hydrateDef = {
|
|
150
|
+
...def,
|
|
151
|
+
init: () => [serverState, []],
|
|
152
|
+
};
|
|
153
|
+
const inst = createComponentInstance(hydrateDef);
|
|
154
|
+
// Build the component DOM and swap atomically with server HTML.
|
|
155
|
+
// Server HTML remains visible until JS finishes — no flash.
|
|
156
|
+
setFlatBindings(inst.allBindings);
|
|
157
|
+
setRenderContext({ ...inst, container, send: inst.send });
|
|
158
|
+
const nodes = hydrateDef.view({ send: inst.send });
|
|
159
|
+
clearRenderContext();
|
|
160
|
+
setFlatBindings(null);
|
|
161
|
+
// Atomic swap — replaces server HTML with client DOM in one operation
|
|
162
|
+
container.replaceChildren(...nodes);
|
|
163
|
+
registerInstance(inst);
|
|
164
|
+
let disposed = false;
|
|
165
|
+
return {
|
|
166
|
+
dispose() {
|
|
167
|
+
if (disposed)
|
|
168
|
+
return;
|
|
169
|
+
disposed = true;
|
|
170
|
+
inst.abortController.abort();
|
|
171
|
+
unregisterInstance(inst);
|
|
172
|
+
disposeScope(inst.rootScope);
|
|
173
|
+
container.textContent = '';
|
|
174
|
+
},
|
|
175
|
+
flush() {
|
|
176
|
+
if (disposed)
|
|
177
|
+
return;
|
|
178
|
+
flushInstance(inst);
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/primitives/branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAS,MAAM,UAAU,CAAA;AAMpD,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAiGxE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { getRenderContext, setRenderContext, clearRenderContext } from '../render-context';
|
|
2
|
+
import { createScope, disposeScope, addDisposer } from '../scope';
|
|
3
|
+
import { setFlatBindings } from '../binding';
|
|
4
|
+
export function branch(opts) {
|
|
5
|
+
const ctx = getRenderContext();
|
|
6
|
+
const parentScope = ctx.rootScope;
|
|
7
|
+
const blocks = ctx.structuralBlocks;
|
|
8
|
+
const send = ctx.send;
|
|
9
|
+
const anchor = document.createComment('branch');
|
|
10
|
+
let currentKey = opts.on(ctx.state);
|
|
11
|
+
let currentScope = null;
|
|
12
|
+
let currentNodes = [];
|
|
13
|
+
const caseKey = String(currentKey);
|
|
14
|
+
const builder = opts.cases[caseKey];
|
|
15
|
+
if (builder) {
|
|
16
|
+
currentScope = createScope(parentScope);
|
|
17
|
+
setRenderContext({ ...ctx, rootScope: currentScope });
|
|
18
|
+
currentNodes = builder(send);
|
|
19
|
+
clearRenderContext();
|
|
20
|
+
setRenderContext(ctx);
|
|
21
|
+
// Fire enter on initial mount
|
|
22
|
+
if (opts.enter && currentNodes.length > 0) {
|
|
23
|
+
opts.enter(currentNodes);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const block = {
|
|
27
|
+
reconcile(state) {
|
|
28
|
+
const newKey = opts.on(state);
|
|
29
|
+
if (Object.is(newKey, currentKey))
|
|
30
|
+
return;
|
|
31
|
+
const parent = anchor.parentNode;
|
|
32
|
+
if (!parent)
|
|
33
|
+
return;
|
|
34
|
+
const leavingNodes = currentNodes;
|
|
35
|
+
const leavingScope = currentScope;
|
|
36
|
+
// Build new arm first (before removing old — for FLIP animations)
|
|
37
|
+
currentNodes = [];
|
|
38
|
+
currentScope = null;
|
|
39
|
+
currentKey = newKey;
|
|
40
|
+
const newCaseKey = String(newKey);
|
|
41
|
+
const newBuilder = opts.cases[newCaseKey];
|
|
42
|
+
if (newBuilder) {
|
|
43
|
+
currentScope = createScope(parentScope);
|
|
44
|
+
setFlatBindings(ctx.allBindings);
|
|
45
|
+
setRenderContext({ ...ctx, rootScope: currentScope, state });
|
|
46
|
+
currentNodes = newBuilder(send);
|
|
47
|
+
clearRenderContext();
|
|
48
|
+
setFlatBindings(null);
|
|
49
|
+
const ref = anchor.nextSibling;
|
|
50
|
+
for (const node of currentNodes) {
|
|
51
|
+
parent.insertBefore(node, ref);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Fire enter for new nodes
|
|
55
|
+
if (opts.enter && currentNodes.length > 0) {
|
|
56
|
+
opts.enter(currentNodes);
|
|
57
|
+
}
|
|
58
|
+
// Handle leave — may be deferred via Promise
|
|
59
|
+
const removeOld = () => {
|
|
60
|
+
for (const node of leavingNodes) {
|
|
61
|
+
if (node.parentNode)
|
|
62
|
+
node.parentNode.removeChild(node);
|
|
63
|
+
}
|
|
64
|
+
if (leavingScope)
|
|
65
|
+
disposeScope(leavingScope);
|
|
66
|
+
};
|
|
67
|
+
if (leavingNodes.length > 0 && opts.leave) {
|
|
68
|
+
const result = opts.leave(leavingNodes);
|
|
69
|
+
if (result && typeof result.then === 'function') {
|
|
70
|
+
;
|
|
71
|
+
result.then(removeOld);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
removeOld();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
removeOld();
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
blocks.push(block);
|
|
83
|
+
addDisposer(parentScope, () => {
|
|
84
|
+
const idx = blocks.indexOf(block);
|
|
85
|
+
if (idx !== -1)
|
|
86
|
+
blocks.splice(idx, 1);
|
|
87
|
+
if (currentScope) {
|
|
88
|
+
disposeScope(currentScope);
|
|
89
|
+
currentScope = null;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return [anchor, ...currentNodes];
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/primitives/branch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child.d.ts","sourceRoot":"","sources":["../../src/primitives/child.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAA;AAU1D,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAmFtE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { getRenderContext, setRenderContext, clearRenderContext } from '../render-context';
|
|
2
|
+
import { createScope, disposeScope, addDisposer } from '../scope';
|
|
3
|
+
import { createComponentInstance, flushInstance } from '../update-loop';
|
|
4
|
+
import { createBinding, setFlatBindings } from '../binding';
|
|
5
|
+
import { registerChild, unregisterChild } from '../addressed';
|
|
6
|
+
const FULL_MASK = 0xffffffff;
|
|
7
|
+
export function child(opts) {
|
|
8
|
+
// Dev-mode guard: props must be a function, not a static object
|
|
9
|
+
if (typeof opts.props !== 'function') {
|
|
10
|
+
throw new Error(`child("${String(opts.key)}"): props must be a reactive accessor function ` +
|
|
11
|
+
`(s => ({ ... })), not a static object. Static props are captured once at mount ` +
|
|
12
|
+
`and never update.`);
|
|
13
|
+
}
|
|
14
|
+
const parentCtx = getRenderContext();
|
|
15
|
+
const parentScope = parentCtx.rootScope;
|
|
16
|
+
const childScope = createScope(parentScope);
|
|
17
|
+
const parentSend = parentCtx.send;
|
|
18
|
+
const childDef = opts.def;
|
|
19
|
+
const initialProps = opts.props(parentCtx.state);
|
|
20
|
+
const childInst = createComponentInstance(childDef, initialProps);
|
|
21
|
+
// Wrap child's send to intercept messages for onMsg → parent
|
|
22
|
+
const originalSend = childInst.send;
|
|
23
|
+
childInst.send = (msg) => {
|
|
24
|
+
originalSend(msg);
|
|
25
|
+
if (opts.onMsg && parentSend) {
|
|
26
|
+
// Defer to after the child processes — use microtask
|
|
27
|
+
queueMicrotask(() => {
|
|
28
|
+
const parentMsg = opts.onMsg(msg);
|
|
29
|
+
if (parentMsg != null) {
|
|
30
|
+
parentSend(parentMsg);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
// Track props for shallow-diff
|
|
36
|
+
let prevProps = { ...initialProps };
|
|
37
|
+
// Register a binding on the child scope that watches parent props changes
|
|
38
|
+
createBinding(childScope, {
|
|
39
|
+
mask: FULL_MASK,
|
|
40
|
+
accessor: ((parentState) => {
|
|
41
|
+
const newProps = opts.props(parentState);
|
|
42
|
+
let changed = false;
|
|
43
|
+
for (const key of Object.keys(newProps)) {
|
|
44
|
+
if (!Object.is(newProps[key], prevProps[key])) {
|
|
45
|
+
changed = true;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (changed && childDef.propsMsg) {
|
|
50
|
+
const msg = childDef.propsMsg(newProps);
|
|
51
|
+
childInst.send(msg);
|
|
52
|
+
flushInstance(childInst);
|
|
53
|
+
}
|
|
54
|
+
prevProps = { ...newProps };
|
|
55
|
+
return newProps;
|
|
56
|
+
}),
|
|
57
|
+
kind: 'text',
|
|
58
|
+
node: document.createComment('child:' + opts.key),
|
|
59
|
+
perItem: false,
|
|
60
|
+
});
|
|
61
|
+
// Run the child's view within the child's render context
|
|
62
|
+
setFlatBindings(childInst.allBindings);
|
|
63
|
+
setRenderContext({ ...childInst, send: childInst.send });
|
|
64
|
+
const nodes = childDef.view({ send: childInst.send });
|
|
65
|
+
clearRenderContext();
|
|
66
|
+
setFlatBindings(parentCtx.allBindings);
|
|
67
|
+
setRenderContext(parentCtx);
|
|
68
|
+
// Register in component registry for addressed effects
|
|
69
|
+
registerChild(opts.key, { send: childInst.send });
|
|
70
|
+
// Cleanup: dispose child instance when parent scope disposes
|
|
71
|
+
addDisposer(childScope, () => {
|
|
72
|
+
unregisterChild(opts.key);
|
|
73
|
+
disposeScope(childInst.rootScope);
|
|
74
|
+
});
|
|
75
|
+
return nodes;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child.js","sourceRoot":"","sources":["../../src/primitives/child.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface Context<T> {
|
|
2
|
+
readonly _id: symbol;
|
|
3
|
+
readonly _default: T | undefined;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Create a typed context key. Pass a default value to make consumers without a
|
|
7
|
+
* provider resolve to it; omit to make unprovided consumption throw.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const ThemeContext = createContext<'light' | 'dark'>('light')
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare function createContext<T>(defaultValue?: T): Context<T>;
|
|
14
|
+
/**
|
|
15
|
+
* Provide a reactive value for `ctx` to every descendant rendered inside `children`.
|
|
16
|
+
* The accessor `(s: S) => T` is evaluated lazily at binding read time, so providers
|
|
17
|
+
* can thread state slices down without prop drilling.
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* view: ({ send }) => [
|
|
21
|
+
* provide(ThemeContext, (s: State) => s.theme, () => [
|
|
22
|
+
* header(send),
|
|
23
|
+
* main(send),
|
|
24
|
+
* ]),
|
|
25
|
+
* ]
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Nested providers shadow outer ones within their subtree. The outer value is
|
|
29
|
+
* restored after `children()` returns, so sibling subtrees aren't affected.
|
|
30
|
+
*/
|
|
31
|
+
export declare function provide<S, T>(ctx: Context<T>, accessor: (s: S) => T, children: () => Node[]): Node[];
|
|
32
|
+
/**
|
|
33
|
+
* Read a context accessor within a view or view-function. Walks the scope chain
|
|
34
|
+
* from the current render point to find the nearest provider. Returns an
|
|
35
|
+
* `(s: S) => T` accessor that can be passed to bindings (text/class/etc.).
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* export function themedCard(): Node[] {
|
|
39
|
+
* const theme = useContext(ThemeContext)
|
|
40
|
+
* return div({ class: (s) => `card theme-${theme(s)}` }, [...])
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useContext<S, T>(ctx: Context<T>): (s: S) => T;
|
|
45
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/primitives/context.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE7D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,QAAQ,EAAE,MAAM,IAAI,EAAE,GACrB,IAAI,EAAE,CAoBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAgB7D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { getRenderContext, setRenderContext, clearRenderContext } from '../render-context';
|
|
2
|
+
import { createScope } from '../scope';
|
|
3
|
+
/**
|
|
4
|
+
* Per-scope storage: scope → (context-id → accessor).
|
|
5
|
+
* WeakMap so disposed scopes are GC'd.
|
|
6
|
+
*/
|
|
7
|
+
const contextMap = new WeakMap();
|
|
8
|
+
/**
|
|
9
|
+
* Create a typed context key. Pass a default value to make consumers without a
|
|
10
|
+
* provider resolve to it; omit to make unprovided consumption throw.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const ThemeContext = createContext<'light' | 'dark'>('light')
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export function createContext(defaultValue) {
|
|
17
|
+
return { _id: Symbol('llui-ctx'), _default: defaultValue };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Provide a reactive value for `ctx` to every descendant rendered inside `children`.
|
|
21
|
+
* The accessor `(s: S) => T` is evaluated lazily at binding read time, so providers
|
|
22
|
+
* can thread state slices down without prop drilling.
|
|
23
|
+
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* view: ({ send }) => [
|
|
26
|
+
* provide(ThemeContext, (s: State) => s.theme, () => [
|
|
27
|
+
* header(send),
|
|
28
|
+
* main(send),
|
|
29
|
+
* ]),
|
|
30
|
+
* ]
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* Nested providers shadow outer ones within their subtree. The outer value is
|
|
34
|
+
* restored after `children()` returns, so sibling subtrees aren't affected.
|
|
35
|
+
*/
|
|
36
|
+
export function provide(ctx, accessor, children) {
|
|
37
|
+
const renderCtx = getRenderContext();
|
|
38
|
+
const parentScope = renderCtx.rootScope;
|
|
39
|
+
// Create a sub-scope so the context is attached to THIS provider alone.
|
|
40
|
+
// Descendants (including those mounted later via show/branch/each) walk
|
|
41
|
+
// up to this scope via their own parent chain and find the accessor.
|
|
42
|
+
// Nested providers create their own sub-scope, shadowing outer values.
|
|
43
|
+
const providerScope = createScope(parentScope);
|
|
44
|
+
const map = new Map();
|
|
45
|
+
map.set(ctx._id, accessor);
|
|
46
|
+
contextMap.set(providerScope, map);
|
|
47
|
+
// Render children with the provider scope as the new rootScope so any
|
|
48
|
+
// primitives (bindings, structural blocks, nested providers) attach here.
|
|
49
|
+
setRenderContext({ ...renderCtx, rootScope: providerScope });
|
|
50
|
+
try {
|
|
51
|
+
return children();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
clearRenderContext();
|
|
55
|
+
setRenderContext(renderCtx);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Read a context accessor within a view or view-function. Walks the scope chain
|
|
60
|
+
* from the current render point to find the nearest provider. Returns an
|
|
61
|
+
* `(s: S) => T` accessor that can be passed to bindings (text/class/etc.).
|
|
62
|
+
*
|
|
63
|
+
* ```ts
|
|
64
|
+
* export function themedCard(): Node[] {
|
|
65
|
+
* const theme = useContext(ThemeContext)
|
|
66
|
+
* return div({ class: (s) => `card theme-${theme(s)}` }, [...])
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export function useContext(ctx) {
|
|
71
|
+
const renderCtx = getRenderContext();
|
|
72
|
+
let scope = renderCtx.rootScope;
|
|
73
|
+
while (scope) {
|
|
74
|
+
const map = contextMap.get(scope);
|
|
75
|
+
if (map?.has(ctx._id)) {
|
|
76
|
+
const accessor = map.get(ctx._id);
|
|
77
|
+
return accessor;
|
|
78
|
+
}
|
|
79
|
+
scope = scope.parent;
|
|
80
|
+
}
|
|
81
|
+
if (ctx._default !== undefined) {
|
|
82
|
+
const d = ctx._default;
|
|
83
|
+
return () => d;
|
|
84
|
+
}
|
|
85
|
+
throw new Error('[LLui] useContext: no provider found for context');
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/primitives/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC;;;GAGG;AACH,MAAM,UAAU,GAAG,IAAI,OAAO,EAA+C,CAAA;AAO7E;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAI,YAAgB;IAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CACrB,GAAe,EACf,QAAqB,EACrB,QAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAA;IACpC,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAA;IACvC,wEAAwE;IACxE,wEAAwE;IACxE,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmC,CAAA;IACtD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAmC,CAAC,CAAA;IACrD,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAClC,sEAAsE;IACtE,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;IAC5D,IAAI,CAAC;QACH,OAAO,QAAQ,EAAE,CAAA;IACnB,CAAC;YAAS,CAAC;QACT,kBAAkB,EAAE,CAAA;QACpB,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAO,GAAe;IAC9C,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAA;IACpC,IAAI,KAAK,GAAiB,SAAS,CAAC,SAAS,CAAA;IAC7C,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;YAClC,OAAO,QAAuB,CAAA;QAChC,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAA;QACtB,OAAO,GAAG,EAAE,CAAC,CAAC,CAAA;IAChB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each.d.ts","sourceRoot":"","sources":["../../src/primitives/each.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,UAAU,CAAA;AA4BhE,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAuF1E"}
|