@nisli/core 0.51.0 → 0.53.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 +26 -0
- package/dist/component.d.ts +133 -9
- package/dist/component.js +197 -9
- package/dist/component.js.map +1 -1
- package/dist/element-context.d.ts +81 -0
- package/dist/element-context.js +108 -0
- package/dist/element-context.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/projection.d.ts +44 -0
- package/dist/projection.js +155 -0
- package/dist/projection.js.map +1 -0
- package/dist/query.d.ts +5 -1
- package/dist/query.js +11 -4
- package/dist/query.js.map +1 -1
- package/dist/signal.d.ts +20 -0
- package/dist/signal.js +53 -3
- package/dist/signal.js.map +1 -1
- package/dist/template.d.ts +44 -0
- package/dist/template.js +159 -19
- package/dist/template.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* element-context.ts — subtree-scoped context (provide / inject).
|
|
3
|
+
*
|
|
4
|
+
* The DOM-native equivalent of React/Radix context: a provider publishes a
|
|
5
|
+
* typed value on its host element, and descendant components `inject()` it by
|
|
6
|
+
* walking up the element tree. It replaces the userland `host.__uiX = state` +
|
|
7
|
+
* `host.closest('ui-x')` convention (stringly-typed, invisible to TypeScript,
|
|
8
|
+
* re-implemented per family) with an identity-keyed, end-to-end-typed primitive.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* interface TabsState { value: ReadonlySignal<string>; setValue(v: string): void }
|
|
12
|
+
* const TabsContext = createContext<TabsState>('Tabs');
|
|
13
|
+
*
|
|
14
|
+
* // provider setup:
|
|
15
|
+
* TabsContext.provide(host, state);
|
|
16
|
+
*
|
|
17
|
+
* // descendant setup:
|
|
18
|
+
* const tabs = TabsContext.inject(); // throws (error boundary) if absent
|
|
19
|
+
* const maybe = TabsContext.inject.optional(); // TabsState | undefined
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Design (see ADR 0025 §2):
|
|
23
|
+
*
|
|
24
|
+
* - **Typed, no string keys.** Each `createContext` mints a private `Symbol`
|
|
25
|
+
* used as the storage key; consumers reference the context object, never a
|
|
26
|
+
* string. Two contexts never collide even with the same `name` (name is for
|
|
27
|
+
* diagnostics only).
|
|
28
|
+
*
|
|
29
|
+
* - **Capture at setup, not at lookup.** `inject()` resolves during component
|
|
30
|
+
* setup, while the injecting host is still a DOM descendant of its provider.
|
|
31
|
+
* It returns the value *once*; because provider values carry signals,
|
|
32
|
+
* reactivity flows through them with no further tree-walks. This is what makes
|
|
33
|
+
* it **portal-safe**: after a subtree is reparented to `<body>` (dialog, menu,
|
|
34
|
+
* …) the injected value is already held, so the component keeps resolving its
|
|
35
|
+
* ORIGINAL provider — a later walk from the portaled host would find nothing.
|
|
36
|
+
* `inject()` therefore requires an active setup context when no host is passed.
|
|
37
|
+
*
|
|
38
|
+
* - **Zero cost for non-users.** Providing sets one symbol property on the host;
|
|
39
|
+
* injecting is a `parentElement` walk. Components that use neither pay nothing,
|
|
40
|
+
* and there is no global registry to maintain.
|
|
41
|
+
*/
|
|
42
|
+
import { getCurrentComponent, hasContext } from './context.js';
|
|
43
|
+
// ── Public API ──────────────────────────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Create a subtree-scoped context. `name` is used only in diagnostics; the
|
|
46
|
+
* context's identity (a private symbol) is what keys storage and lookup.
|
|
47
|
+
*
|
|
48
|
+
* Pass `{ providerTag }` to name the provider element so a missing-provider
|
|
49
|
+
* `inject()` produces an ACTIONABLE, element-language error —
|
|
50
|
+
* `<injecting-tag> must be used inside <provider-tag>.` — instead of naming the
|
|
51
|
+
* private context object. Set it whenever consumers are DOM elements (the whole
|
|
52
|
+
* registry): it's the difference between a message a plain-HTML user can act on
|
|
53
|
+
* and one they can't.
|
|
54
|
+
*/
|
|
55
|
+
export function createContext(name, options = {}) {
|
|
56
|
+
const { providerTag } = options;
|
|
57
|
+
// Private per-context storage key. Not derived from `name`, so same-named
|
|
58
|
+
// contexts stay distinct, and it never appears in userland.
|
|
59
|
+
const KEY = Symbol(`nisli.context:${name}`);
|
|
60
|
+
const store = (el) => el;
|
|
61
|
+
const provide = (host, value) => {
|
|
62
|
+
store(host)[KEY] = value;
|
|
63
|
+
};
|
|
64
|
+
const peek = (host) => KEY in host ? store(host)[KEY] : undefined;
|
|
65
|
+
// Walk up the element tree (inclusive of `start`) to the nearest provider.
|
|
66
|
+
// `parentElement` transparently crosses `display: contents` hosts.
|
|
67
|
+
const find = (start) => {
|
|
68
|
+
let el = start;
|
|
69
|
+
while (el) {
|
|
70
|
+
if (KEY in el)
|
|
71
|
+
return store(el)[KEY];
|
|
72
|
+
el = el.parentElement;
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
};
|
|
76
|
+
const startHost = (host, caller) => {
|
|
77
|
+
if (host)
|
|
78
|
+
return host;
|
|
79
|
+
if (!hasContext()) {
|
|
80
|
+
throw new Error(`${caller} for context "${name}" was called without a host and outside component ` +
|
|
81
|
+
`setup. Call it during setup (so the provider is resolved before any portal move), ` +
|
|
82
|
+
`or pass an explicit host.`);
|
|
83
|
+
}
|
|
84
|
+
return getCurrentComponent().element;
|
|
85
|
+
};
|
|
86
|
+
const inject = ((host) => {
|
|
87
|
+
const start = startHost(host, 'inject()');
|
|
88
|
+
const found = find(start);
|
|
89
|
+
if (found === undefined) {
|
|
90
|
+
const injectingTag = start.tagName.toLowerCase();
|
|
91
|
+
// With a declared provider tag, speak element-language the consumer can
|
|
92
|
+
// act on; otherwise fall back to the generic (provider named by API).
|
|
93
|
+
throw new Error(providerTag
|
|
94
|
+
? `Context "${name}": <${injectingTag}> must be used inside <${providerTag}>.`
|
|
95
|
+
: `Context "${name}" not found: <${injectingTag}> must be rendered ` +
|
|
96
|
+
`inside a provider that calls ${name}Context.provide(host, …).`);
|
|
97
|
+
}
|
|
98
|
+
return found;
|
|
99
|
+
});
|
|
100
|
+
inject.optional = (host) => {
|
|
101
|
+
// Outside setup with no host: there is nothing to resolve from — undefined.
|
|
102
|
+
if (!host && !hasContext())
|
|
103
|
+
return undefined;
|
|
104
|
+
return find(startHost(host, 'inject.optional()'));
|
|
105
|
+
};
|
|
106
|
+
return { name, provide, inject, peek };
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=element-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-context.js","sourceRoot":"","sources":["../src/element-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgC/D,uEAAuE;AAEvE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,UAAoC,EAAE;IAEtC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAChC,0EAA0E;IAC1E,4DAA4D;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,CAAC,EAAW,EAA2B,EAAE,CACrD,EAAwC,CAAC;IAE3C,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAE,KAAQ,EAAQ,EAAE;QACpD,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAAiB,EAAiB,EAAE,CAChD,GAAG,IAAI,IAAI,CAAC,CAAC,CAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpD,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,IAAI,GAAG,CAAC,KAAkB,EAAiB,EAAE;QACjD,IAAI,EAAE,GAAmB,KAAK,CAAC;QAC/B,OAAO,EAAE,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,EAAE;gBAAE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAM,CAAC;YAC1C,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;QACxB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,IAA6B,EAAE,MAAc,EAAsB,EAAE;QACtF,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,iBAAiB,IAAI,oDAAoD;gBAChF,oFAAoF;gBACpF,2BAA2B,CAC9B,CAAC;QACJ,CAAC;QACD,OAAO,mBAAmB,EAAE,CAAC,OAAO,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,CAAC,IAAkB,EAAK,EAAE;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,wEAAwE;YACxE,sEAAsE;YACtE,MAAM,IAAI,KAAK,CACb,WAAW;gBACT,CAAC,CAAC,YAAY,IAAI,OAAO,YAAY,0BAA0B,WAAW,IAAI;gBAC9E,CAAC,CAAC,YAAY,IAAI,iBAAiB,YAAY,qBAAqB;oBAChE,gCAAgC,IAAI,2BAA2B,CACtE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAc,CAAC;IAEhB,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAkB,EAAiB,EAAE;QACtD,4EAA4E;QAC5E,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,OAAO,SAAS,CAAC;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAE,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
* } from './framework';
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
|
-
export { signal, computed, effect, flush, isSignal, flushEffects, untrack, SIGNAL_BRAND, type Signal, type ReadonlySignal, } from './signal.js';
|
|
16
|
+
export { signal, computed, effect, flush, tick, isSignal, flushEffects, untrack, SIGNAL_BRAND, type Signal, type ReadonlySignal, } from './signal.js';
|
|
17
17
|
export { runWithContext, getCurrentComponent, hasContext, type ComponentHost, } from './context.js';
|
|
18
18
|
export { Emitter } from './emitter.js';
|
|
19
19
|
export { inject, provide, createToken, resetInjector, type Constructor, type InjectionToken, } from './injector.js';
|
|
20
|
-
export {
|
|
21
|
-
export {
|
|
20
|
+
export { createContext, type Context, type Inject, } from './element-context.js';
|
|
21
|
+
export { component, type ReactiveProps, type AttrValueType, type SetupFunction, type ComponentFactory, type ComponentOptions, type AttrDecl, type ComponentAttrs, type PropInput, type HostAttrs, } from './component.js';
|
|
22
|
+
export { html, el, when, each, type TemplateResult, type TypedEventHandler, type ElProps, type ElChild, } from './template.js';
|
|
22
23
|
export { ref, isRef, type Ref, } from './ref.js';
|
|
23
24
|
export { onMount, onCleanup, useHostEvent, } from './lifecycle.js';
|
|
25
|
+
export { children, } from './projection.js';
|
|
24
26
|
export { query, QueryClient, type QueryResult, type QueryOptions, } from './query.js';
|
package/dist/index.js
CHANGED
|
@@ -14,21 +14,25 @@
|
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
16
|
// ── Reactivity ──────────────────────────────────────────────────────
|
|
17
|
-
export { signal, computed, effect, flush, isSignal, flushEffects, untrack, SIGNAL_BRAND, } from './signal.js';
|
|
17
|
+
export { signal, computed, effect, flush, tick, isSignal, flushEffects, untrack, SIGNAL_BRAND, } from './signal.js';
|
|
18
18
|
// ── Setup context ───────────────────────────────────────────────────
|
|
19
19
|
export { runWithContext, getCurrentComponent, hasContext, } from './context.js';
|
|
20
20
|
// ── Typed event emitters ────────────────────────────────────────────
|
|
21
21
|
export { Emitter } from './emitter.js';
|
|
22
|
-
// ── Dependency injection
|
|
22
|
+
// ── Dependency injection (app-global) ───────────────────────────────
|
|
23
23
|
export { inject, provide, createToken, resetInjector, } from './injector.js';
|
|
24
|
+
// ── Subtree-scoped context (DOM provide/inject) ─────────────────────
|
|
25
|
+
export { createContext, } from './element-context.js';
|
|
24
26
|
// ── Component model ─────────────────────────────────────────────────
|
|
25
27
|
export { component, } from './component.js';
|
|
26
28
|
// ── Template engine ─────────────────────────────────────────────────
|
|
27
|
-
export { html, when, each, } from './template.js';
|
|
29
|
+
export { html, el, when, each, } from './template.js';
|
|
28
30
|
// ── Element refs ────────────────────────────────────────────────────
|
|
29
31
|
export { ref, isRef, } from './ref.js';
|
|
30
32
|
// ── Lifecycle hooks ─────────────────────────────────────────────────
|
|
31
33
|
export { onMount, onCleanup, useHostEvent, } from './lifecycle.js';
|
|
34
|
+
// ── Content projection (ADR 0025 item 1) ────────────────
|
|
35
|
+
export { children, } from './projection.js';
|
|
32
36
|
// ── Declarative data loading ────────────────────────────────────────
|
|
33
37
|
export { query, QueryClient, } from './query.js';
|
|
34
38
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,uEAAuE;AACvE,OAAO,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,YAAY,GAGb,MAAM,aAAa,CAAC;AAErB,uEAAuE;AACvE,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,UAAU,GAEX,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,uEAAuE;AACvE,OAAO,EACL,MAAM,EACN,OAAO,EACP,WAAW,EACX,aAAa,GAGd,MAAM,eAAe,CAAC;AAEvB,uEAAuE;AACvE,OAAO,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,uEAAuE;AACvE,OAAO,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,YAAY,GAGb,MAAM,aAAa,CAAC;AAErB,uEAAuE;AACvE,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,UAAU,GAEX,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,uEAAuE;AACvE,OAAO,EACL,MAAM,EACN,OAAO,EACP,WAAW,EACX,aAAa,GAGd,MAAM,eAAe,CAAC;AAEvB,uEAAuE;AACvE,OAAO,EACL,aAAa,GAGd,MAAM,sBAAsB,CAAC;AAE9B,uEAAuE;AACvE,OAAO,EACL,SAAS,GAUV,MAAM,gBAAgB,CAAC;AAExB,uEAAuE;AACvE,OAAO,EACL,IAAI,EACJ,EAAE,EACF,IAAI,EACJ,IAAI,GAKL,MAAM,eAAe,CAAC;AAEvB,uEAAuE;AACvE,OAAO,EACL,GAAG,EACH,KAAK,GAEN,MAAM,UAAU,CAAC;AAElB,uEAAuE;AACvE,OAAO,EACL,OAAO,EACP,SAAS,EACT,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,2DAA2D;AAC3D,OAAO,EACL,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,uEAAuE;AACvE,OAAO,EACL,KAAK,EACL,WAAW,GAGZ,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* projection.ts — First-class content projection (ADR 0025 item 1)
|
|
3
|
+
*
|
|
4
|
+
* `children(fallback?)` is a setup-context primitive that owns the light-DOM
|
|
5
|
+
* projection machinery the registry currently hand-rolls
|
|
6
|
+
* (captureChildren/projectChildren + per-component conditional-default swaps).
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* component('ui-button', (props, host) => {
|
|
10
|
+
* transparentHost(host);
|
|
11
|
+
* return html`<button class="${classes}">${children()}</button>`;
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Semantics:
|
|
16
|
+
* - Returns a reactive slot value (a signal) that a template interpolates. The
|
|
17
|
+
* slot resolves, in priority order: the factory `children` prop → the host's
|
|
18
|
+
* captured light-DOM children → the fallback.
|
|
19
|
+
* - Factory `children` route through the SAME slot: `children()` READS the
|
|
20
|
+
* host's `children` prop signal (sugar over one path). Crucially it renders
|
|
21
|
+
* them AT the slot position (not by relocating them to light DOM), so a
|
|
22
|
+
* factory-composed child element is a DOM descendant of its parent when its
|
|
23
|
+
* connectedCallback runs — `closest()`-based parent lookup keeps working.
|
|
24
|
+
* - Plain-HTML light-DOM children are captured pre-setup by component.ts
|
|
25
|
+
* (SEED → CAPTURE → CONTEXT) and projected here; late parser children are
|
|
26
|
+
* swept in a microtask (the ADR 0023 streaming machinery, now in core).
|
|
27
|
+
* - `children(fallback)` renders `fallback` when no MEANINGFUL children exist
|
|
28
|
+
* (whitespace-only light DOM does not count) and REPLACES it reactively when
|
|
29
|
+
* children arrive — including late parser children. This natively solves the
|
|
30
|
+
* conditional-default class (message-scroller-button's default glyph).
|
|
31
|
+
* - Single default slot only; named/multiple slots are a later design (v1 OUT).
|
|
32
|
+
*
|
|
33
|
+
* Zero-cost when unused: component.ts only snapshots childNodes when the host
|
|
34
|
+
* has any, and only children() consumes them.
|
|
35
|
+
*/
|
|
36
|
+
import { type ReadonlySignal } from './signal.js';
|
|
37
|
+
import type { TemplateResult } from './template.js';
|
|
38
|
+
/**
|
|
39
|
+
* Project the host's children (factory `children` prop or light DOM) into this
|
|
40
|
+
* slot, with an optional `fallback` rendered when empty. Must be called in
|
|
41
|
+
* setup context. Interpolate the result in a template:
|
|
42
|
+
* `html`<button>${children()}</button>``.
|
|
43
|
+
*/
|
|
44
|
+
export declare function children(fallback?: TemplateResult | string): ReadonlySignal<unknown>;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* projection.ts — First-class content projection (ADR 0025 item 1)
|
|
3
|
+
*
|
|
4
|
+
* `children(fallback?)` is a setup-context primitive that owns the light-DOM
|
|
5
|
+
* projection machinery the registry currently hand-rolls
|
|
6
|
+
* (captureChildren/projectChildren + per-component conditional-default swaps).
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* component('ui-button', (props, host) => {
|
|
10
|
+
* transparentHost(host);
|
|
11
|
+
* return html`<button class="${classes}">${children()}</button>`;
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Semantics:
|
|
16
|
+
* - Returns a reactive slot value (a signal) that a template interpolates. The
|
|
17
|
+
* slot resolves, in priority order: the factory `children` prop → the host's
|
|
18
|
+
* captured light-DOM children → the fallback.
|
|
19
|
+
* - Factory `children` route through the SAME slot: `children()` READS the
|
|
20
|
+
* host's `children` prop signal (sugar over one path). Crucially it renders
|
|
21
|
+
* them AT the slot position (not by relocating them to light DOM), so a
|
|
22
|
+
* factory-composed child element is a DOM descendant of its parent when its
|
|
23
|
+
* connectedCallback runs — `closest()`-based parent lookup keeps working.
|
|
24
|
+
* - Plain-HTML light-DOM children are captured pre-setup by component.ts
|
|
25
|
+
* (SEED → CAPTURE → CONTEXT) and projected here; late parser children are
|
|
26
|
+
* swept in a microtask (the ADR 0023 streaming machinery, now in core).
|
|
27
|
+
* - `children(fallback)` renders `fallback` when no MEANINGFUL children exist
|
|
28
|
+
* (whitespace-only light DOM does not count) and REPLACES it reactively when
|
|
29
|
+
* children arrive — including late parser children. This natively solves the
|
|
30
|
+
* conditional-default class (message-scroller-button's default glyph).
|
|
31
|
+
* - Single default slot only; named/multiple slots are a later design (v1 OUT).
|
|
32
|
+
*
|
|
33
|
+
* Zero-cost when unused: component.ts only snapshots childNodes when the host
|
|
34
|
+
* has any, and only children() consumes them.
|
|
35
|
+
*/
|
|
36
|
+
import { getCurrentComponent } from './context.js';
|
|
37
|
+
import { onMount, onCleanup } from './lifecycle.js';
|
|
38
|
+
import { signal, computed, flush } from './signal.js';
|
|
39
|
+
/** True if the nodes carry meaningful content (element or non-blank text). */
|
|
40
|
+
function isMeaningful(nodes) {
|
|
41
|
+
return nodes.some((n) => n.nodeType === 1 || (n.nodeType === 3 && (n.textContent ?? '').trim() !== ''));
|
|
42
|
+
}
|
|
43
|
+
/** A minimal TemplateResult that mounts pre-existing DOM nodes into the slot. */
|
|
44
|
+
function nodesTemplate(nodes) {
|
|
45
|
+
return {
|
|
46
|
+
__templateResult: true,
|
|
47
|
+
mount(w) {
|
|
48
|
+
for (const node of nodes)
|
|
49
|
+
w.appendChild(node);
|
|
50
|
+
},
|
|
51
|
+
dispose() { },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** A re-mountable TemplateResult that renders a primitive as a fresh text node. */
|
|
55
|
+
function textTemplate(text) {
|
|
56
|
+
return {
|
|
57
|
+
__templateResult: true,
|
|
58
|
+
mount(w) {
|
|
59
|
+
w.appendChild(document.createTextNode(text));
|
|
60
|
+
},
|
|
61
|
+
dispose() { },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Normalize a slot value so the template ALWAYS sees a TemplateResult / factory
|
|
66
|
+
* / array / null — never a bare primitive. The engine picks the slot binding
|
|
67
|
+
* kind by probing the FIRST value: a bare string would bind a plain text node,
|
|
68
|
+
* which then can't host a later template child (it stringifies to
|
|
69
|
+
* "[object Object]"). Wrapping primitives keeps the slot a reactive-template
|
|
70
|
+
* slot for its whole life.
|
|
71
|
+
*/
|
|
72
|
+
function asSlot(value) {
|
|
73
|
+
if (value == null || value === '')
|
|
74
|
+
return null;
|
|
75
|
+
if (typeof value === 'object'
|
|
76
|
+
&& ('__templateResult' in value || '__type' in value)) {
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(value))
|
|
80
|
+
return value;
|
|
81
|
+
return textTemplate(String(value));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Project the host's children (factory `children` prop or light DOM) into this
|
|
85
|
+
* slot, with an optional `fallback` rendered when empty. Must be called in
|
|
86
|
+
* setup context. Interpolate the result in a template:
|
|
87
|
+
* `html`<button>${children()}</button>``.
|
|
88
|
+
*/
|
|
89
|
+
export function children(fallback) {
|
|
90
|
+
const host = getCurrentComponent().element;
|
|
91
|
+
// Consume the pre-setup light-DOM capture; remove those nodes from the host
|
|
92
|
+
// so the rendered template doesn't duplicate them.
|
|
93
|
+
const captured = host.__capturedChildren ?? [];
|
|
94
|
+
host.__capturedChildren = undefined;
|
|
95
|
+
for (const node of captured) {
|
|
96
|
+
if (node.parentNode === host)
|
|
97
|
+
host.removeChild(node);
|
|
98
|
+
}
|
|
99
|
+
// The factory `children` prop, folded into the same slot (sugar over one path).
|
|
100
|
+
const childrenProp = host._propSignal ? host._propSignal('children') : undefined;
|
|
101
|
+
// Projected light-DOM nodes; grows when the late-parser sweep finds more.
|
|
102
|
+
const projectedNodes = signal(captured);
|
|
103
|
+
onMount(() => {
|
|
104
|
+
// The host's direct children right after mount are the rendered template
|
|
105
|
+
// roots. Anything that appears later is a late parser/innerHTML child.
|
|
106
|
+
const renderedRoots = new Set(Array.from(host.childNodes));
|
|
107
|
+
queueMicrotask(() => {
|
|
108
|
+
const late = Array.from(host.childNodes).filter((n) => !renderedRoots.has(n));
|
|
109
|
+
if (late.length && isMeaningful(late)) {
|
|
110
|
+
for (const node of late)
|
|
111
|
+
host.removeChild(node);
|
|
112
|
+
projectedNodes.value = [...projectedNodes.value, ...late];
|
|
113
|
+
// Flush the slot effect NOW so the late children land in this same
|
|
114
|
+
// microtask — the projectChildren() this replaces mutated the DOM
|
|
115
|
+
// imperatively, so callers only await one microtask for the sweep.
|
|
116
|
+
flush();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// Stable, RE-MOUNTABLE fallback slot: the same slot object is returned on
|
|
121
|
+
// every empty render, and it can be mounted → unmounted → mounted again
|
|
122
|
+
// (empty → filled → empty) without crashing. A string wraps to a fresh text
|
|
123
|
+
// node each mount. A TemplateResult is mounted ONCE here into a detached
|
|
124
|
+
// holder (its reactive bindings run in this component's context and dispose
|
|
125
|
+
// with it); its rendered nodes are then exposed as a re-mountable node slot,
|
|
126
|
+
// so the engine can detach and re-append them freely.
|
|
127
|
+
let fallbackSlot = null;
|
|
128
|
+
if (fallback != null) {
|
|
129
|
+
if (typeof fallback === 'string') {
|
|
130
|
+
fallbackSlot = textTemplate(fallback);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const holder = document.createDocumentFragment();
|
|
134
|
+
fallback.mount(holder);
|
|
135
|
+
const fallbackNodes = Array.from(holder.childNodes);
|
|
136
|
+
onCleanup(() => { try {
|
|
137
|
+
fallback.dispose();
|
|
138
|
+
}
|
|
139
|
+
catch (_) { /* ignore */ } });
|
|
140
|
+
fallbackSlot = nodesTemplate(fallbackNodes);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Priority: factory children → captured/late light DOM → fallback. Reactive,
|
|
144
|
+
// so late children (or a changing `children` prop) replace the fallback.
|
|
145
|
+
return computed(() => {
|
|
146
|
+
const kids = childrenProp?.value;
|
|
147
|
+
if (kids != null && kids !== '')
|
|
148
|
+
return asSlot(kids);
|
|
149
|
+
const nodes = projectedNodes.value;
|
|
150
|
+
if (isMeaningful(nodes))
|
|
151
|
+
return nodesTemplate(nodes);
|
|
152
|
+
return fallbackSlot;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"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"}
|
package/dist/query.d.ts
CHANGED
|
@@ -25,7 +25,11 @@ export interface QueryResult<T> {
|
|
|
25
25
|
loading: ReadonlySignal<boolean>;
|
|
26
26
|
/** The error if the fetch failed, null otherwise */
|
|
27
27
|
error: Signal<Error | null>;
|
|
28
|
-
/** Manually trigger a refetch
|
|
28
|
+
/** Manually trigger a refetch. Bypasses staleTime's fresh-cache
|
|
29
|
+
* suppression — a manual refetch inside the freshness window is never a
|
|
30
|
+
* silent no-op (react-query semantics). It does not bypass in-flight
|
|
31
|
+
* deduplication: if a request for the same key is already running, this
|
|
32
|
+
* joins it rather than starting a second fetch. */
|
|
29
33
|
refetch(): void;
|
|
30
34
|
}
|
|
31
35
|
export interface QueryOptions<T> {
|
package/dist/query.js
CHANGED
|
@@ -124,7 +124,14 @@ export function query(keyFn, fetcher, options = {}) {
|
|
|
124
124
|
// Track the current fetch generation to handle race conditions
|
|
125
125
|
let fetchGeneration = 0;
|
|
126
126
|
let disposed = false;
|
|
127
|
-
|
|
127
|
+
// `force` is set by the manual refetch() path. An explicit refetch is a
|
|
128
|
+
// force (react-query semantics): it skips the fresh-cache short-circuit, so a
|
|
129
|
+
// manual refetch inside the freshness window is never a silent no-op. It does
|
|
130
|
+
// NOT skip in-flight deduplication — a same-key request already running is
|
|
131
|
+
// joined, not duplicated — and the generation guards are unchanged. The
|
|
132
|
+
// automatic (effect-driven) path leaves `force` false and stays cache-first.
|
|
133
|
+
// (ADR 0025 item 12.)
|
|
134
|
+
const doFetch = async (force = false) => {
|
|
128
135
|
if (disposed)
|
|
129
136
|
return;
|
|
130
137
|
// Check enabled
|
|
@@ -133,8 +140,8 @@ export function query(keyFn, fetcher, options = {}) {
|
|
|
133
140
|
const key = keyFn();
|
|
134
141
|
const serialized = serializeKey(key);
|
|
135
142
|
const generation = ++fetchGeneration;
|
|
136
|
-
// Check cache freshness
|
|
137
|
-
if (staleTime > 0 && client.isFresh(serialized, staleTime)) {
|
|
143
|
+
// Check cache freshness (automatic path only — an explicit refetch forces).
|
|
144
|
+
if (!force && staleTime > 0 && client.isFresh(serialized, staleTime)) {
|
|
138
145
|
const cached = client.getCached(serialized);
|
|
139
146
|
if (cached !== undefined) {
|
|
140
147
|
data.value = cached;
|
|
@@ -219,7 +226,7 @@ export function query(keyFn, fetcher, options = {}) {
|
|
|
219
226
|
}
|
|
220
227
|
const refetch = () => {
|
|
221
228
|
fetchGeneration++; // invalidate any in-flight
|
|
222
|
-
doFetch().catch(() => { });
|
|
229
|
+
doFetch(true).catch(() => { }); // force: bypass staleTime (ADR 0025 item 12)
|
|
223
230
|
};
|
|
224
231
|
return {
|
|
225
232
|
data,
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAoC,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAoB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/signal.d.ts
CHANGED
|
@@ -91,3 +91,23 @@ export declare function untrack(fn: () => void): void;
|
|
|
91
91
|
export declare function flush(): void;
|
|
92
92
|
/** Backward compat alias for tests. */
|
|
93
93
|
export { flush as flushEffects };
|
|
94
|
+
/**
|
|
95
|
+
* Settle the synchronous effect cascade AND all MICROTASK-scheduled work
|
|
96
|
+
* pending at await time (content-projection sweeps, query/command initial
|
|
97
|
+
* passes — at any queueMicrotask depth), plus the effects that work
|
|
98
|
+
* schedules. Replaces the hand-rolled `flush(); await Promise.resolve();
|
|
99
|
+
* flush()` and double-`flushEffects()` idioms.
|
|
100
|
+
*
|
|
101
|
+
* Bounded contract — deliberately NOT awaited: timers and other future
|
|
102
|
+
* TASKS scheduled by that microtask work (e.g. a microtask calling
|
|
103
|
+
* setTimeout) may fire after tick() resolves; awaiting arbitrary future
|
|
104
|
+
* tasks is unbounded. Self-perpetuating schedulers are cut off at the
|
|
105
|
+
* iteration cap.
|
|
106
|
+
*
|
|
107
|
+
* ```ts
|
|
108
|
+
* host.setProp('x', 1);
|
|
109
|
+
* await tick();
|
|
110
|
+
* expect(el.textContent).toBe('1');
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function tick(): Promise<void>;
|
package/dist/signal.js
CHANGED
|
@@ -150,8 +150,12 @@ class ComputedImpl {
|
|
|
150
150
|
if (!Object.is(this._node.value, newValue)) {
|
|
151
151
|
this._node.value = newValue;
|
|
152
152
|
this._node.lastChanged = ++globalEpoch;
|
|
153
|
-
//
|
|
154
|
-
|
|
153
|
+
// NOTE: no notifyObservers() here. This update() is a *lazy* recompute
|
|
154
|
+
// triggered by a read; every downstream observer was already marked
|
|
155
|
+
// dirty / scheduled eagerly when the source signal changed (notify()
|
|
156
|
+
// propagates through the computed chain). Re-notifying here would
|
|
157
|
+
// re-schedule the very effect performing this read — a spurious
|
|
158
|
+
// double-run that only surfaced once flush() began draining cascades.
|
|
155
159
|
}
|
|
156
160
|
}
|
|
157
161
|
finally {
|
|
@@ -396,8 +400,54 @@ export function untrack(fn) {
|
|
|
396
400
|
* flush() is idempotent: calling it with no pending effects is a no-op.
|
|
397
401
|
*/
|
|
398
402
|
export function flush() {
|
|
399
|
-
|
|
403
|
+
// Drain cascades: an effect may write a signal that schedules more effects
|
|
404
|
+
// (e.g. A computes → B renders). Loop until the queue is empty so a single
|
|
405
|
+
// flush() settles the whole synchronous cascade — no double-flush idiom.
|
|
406
|
+
// Bounded to mirror the effect-loop guard; a runaway is a bug, not silence.
|
|
407
|
+
let guard = 0;
|
|
408
|
+
while (pendingEffects.size > 0) {
|
|
409
|
+
flushPendingEffects();
|
|
410
|
+
if (++guard > 100000)
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
400
413
|
}
|
|
401
414
|
/** Backward compat alias for tests. */
|
|
402
415
|
export { flush as flushEffects };
|
|
416
|
+
/**
|
|
417
|
+
* Settle the synchronous effect cascade AND all MICROTASK-scheduled work
|
|
418
|
+
* pending at await time (content-projection sweeps, query/command initial
|
|
419
|
+
* passes — at any queueMicrotask depth), plus the effects that work
|
|
420
|
+
* schedules. Replaces the hand-rolled `flush(); await Promise.resolve();
|
|
421
|
+
* flush()` and double-`flushEffects()` idioms.
|
|
422
|
+
*
|
|
423
|
+
* Bounded contract — deliberately NOT awaited: timers and other future
|
|
424
|
+
* TASKS scheduled by that microtask work (e.g. a microtask calling
|
|
425
|
+
* setTimeout) may fire after tick() resolves; awaiting arbitrary future
|
|
426
|
+
* tasks is unbounded. Self-perpetuating schedulers are cut off at the
|
|
427
|
+
* iteration cap.
|
|
428
|
+
*
|
|
429
|
+
* ```ts
|
|
430
|
+
* host.setProp('x', 1);
|
|
431
|
+
* await tick();
|
|
432
|
+
* expect(el.textContent).toBe('1');
|
|
433
|
+
* ```
|
|
434
|
+
*/
|
|
435
|
+
export async function tick() {
|
|
436
|
+
flush(); // drain the synchronous effect cascade first
|
|
437
|
+
// Each iteration crosses a MACROTASK boundary (setTimeout 0). Doing so runs
|
|
438
|
+
// the ENTIRE microtask queue to completion first — including microtasks a
|
|
439
|
+
// microtask schedules, at any depth — so a 3-deep `queueMicrotask` chain is
|
|
440
|
+
// fully drained before the timer fires. After the drain we flush the effects
|
|
441
|
+
// that work scheduled. When a full iteration schedules no effects, the queue
|
|
442
|
+
// is quiescent and we return. Contract: microtask-scheduled work + effect
|
|
443
|
+
// cascades pending at await time settle; TIMER-scheduled work does not
|
|
444
|
+
// (see the doc above — bounded by design). The iteration cap is a
|
|
445
|
+
// documented backstop for self-perpetuating schedulers, not a silent hang.
|
|
446
|
+
for (let i = 0; i < 50; i++) {
|
|
447
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
448
|
+
if (pendingEffects.size === 0)
|
|
449
|
+
return; // the microtask drain scheduled nothing
|
|
450
|
+
flush();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
403
453
|
//# sourceMappingURL=signal.js.map
|
package/dist/signal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"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"}
|