octane 0.2.12 → 0.2.13
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 +5 -0
- package/dist/behavior-root.d.ts +13 -3
- package/dist/behavior-root.js +28 -5
- package/dist/cjs/behavior-root.cjs +32 -6
- package/dist/cjs/class-names.cjs +49 -0
- package/dist/cjs/constants.cjs +9 -0
- package/dist/cjs/css.cjs +6 -27
- package/dist/cjs/data-encoding.cjs +160 -0
- package/dist/cjs/dom-binding-handoff.cjs +93 -0
- package/dist/cjs/dom-binding-protocol.cjs +115 -0
- package/dist/cjs/dom-binding-styles.cjs +292 -0
- package/dist/cjs/dom-bindings.cjs +700 -0
- package/dist/cjs/dom-focused-move.cjs +66 -0
- package/dist/cjs/dom-tables.cjs +4 -94
- package/dist/cjs/error-codes.client.generated.cjs +33 -0
- package/dist/cjs/error-codes.server.generated.cjs +19 -0
- package/dist/cjs/hydration/control-capture.cjs +244 -0
- package/dist/cjs/hydration/event-capture.cjs +125 -43
- package/dist/cjs/hydration/interaction-config.cjs +50 -2
- package/dist/cjs/hydration-markers.cjs +37 -0
- package/dist/cjs/independent-hydration-protocol.cjs +106 -0
- package/dist/cjs/index.cjs +6 -0
- package/dist/cjs/runtime.cjs +2791 -215
- package/dist/cjs/runtime.server.cjs +716 -76
- package/dist/cjs/server/early-signals.cjs +45 -0
- package/dist/cjs/server/index.cjs +44 -0
- package/dist/cjs/server/rpc-batch.cjs +149 -0
- package/dist/cjs/server/rpc-stream.cjs +146 -0
- package/dist/cjs/server/rpc.cjs +34 -15
- package/dist/cjs/server/signal-query-observation.cjs +158 -0
- package/dist/cjs/server/streamed-region.cjs +52 -0
- package/dist/cjs/server/streamed-signals.cjs +512 -0
- package/dist/cjs/server-call.cjs +103 -0
- package/dist/cjs/server-rpc-batch-client.cjs +141 -0
- package/dist/cjs/server-rpc-client.cjs +94 -27
- package/dist/cjs/server-rpc-protocol.cjs +141 -0
- package/dist/cjs/server-rpc-stream-client.cjs +118 -0
- package/dist/cjs/signals/actions.cjs +474 -0
- package/dist/cjs/signals/client.cjs +4 -1
- package/dist/cjs/signals/computations.cjs +460 -0
- package/dist/cjs/signals/control-binding.cjs +368 -0
- package/dist/cjs/signals/derived-facade.cjs +50 -0
- package/dist/cjs/signals/document-owner.cjs +71 -0
- package/dist/cjs/signals/early-values.cjs +155 -0
- package/dist/cjs/signals/encoding.cjs +6 -95
- package/dist/cjs/signals/engine.cjs +276 -12
- package/dist/cjs/signals/errors.cjs +18 -0
- package/dist/cjs/signals/facade.cjs +477 -0
- package/dist/cjs/signals/graph.cjs +163 -20
- package/dist/cjs/signals/handle-protocol.cjs +36 -0
- package/dist/cjs/signals/index.cjs +81 -2
- package/dist/cjs/signals/native-read-client.cjs +10 -0
- package/dist/cjs/signals/owner-context.cjs +112 -0
- package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
- package/dist/cjs/signals/query-facade.cjs +72 -0
- package/dist/cjs/signals/read-protocol.cjs +32 -0
- package/dist/cjs/signals/requests.cjs +287 -14
- package/dist/cjs/signals/scalar-computations.cjs +76 -0
- package/dist/cjs/signals/server.cjs +4 -1
- package/dist/cjs/signals/transition-candidate.cjs +567 -0
- package/dist/cjs/signals/transition-state.cjs +106 -0
- package/dist/cjs/signals/types.cjs +50 -0
- package/dist/cjs/stream-protocol.cjs +3 -0
- package/dist/cjs/streamed-signals-protocol.cjs +159 -0
- package/dist/cjs/style-values.cjs +122 -0
- package/dist/cjs/version.cjs +1 -1
- package/dist/class-names.d.ts +5 -0
- package/dist/class-names.js +25 -0
- package/dist/compiler/bundler.js +34 -6
- package/dist/compiler/compile.js +2234 -559
- package/dist/compiler/dom-binding-program.js +935 -0
- package/dist/compiler/dom-binding-request.js +57 -0
- package/dist/compiler/dom-bindings.js +2245 -0
- package/dist/compiler/hook-deps.js +26 -0
- package/dist/compiler/hydrate-boundaries.js +358 -15
- package/dist/compiler/index.d.ts +38 -1
- package/dist/compiler/index.js +1 -0
- package/dist/compiler/native-attribute-reads.js +127 -0
- package/dist/compiler/native-read-diagnostics.js +48 -9
- package/dist/compiler/native-read-types.js +55 -32
- package/dist/compiler/server-context.js +118 -0
- package/dist/compiler/signal-attempt-reads.js +479 -0
- package/dist/compiler/signal-declarations.js +557 -0
- package/dist/compiler/signal-start-reads.js +413 -0
- package/dist/compiler/slot-hooks.js +57 -10
- package/dist/compiler/template-ir.js +200 -0
- package/dist/compiler/typescript.d.ts +2 -0
- package/dist/compiler/typescript.js +2 -0
- package/dist/compiler/vite.d.ts +3 -1
- package/dist/compiler/vite.js +122 -4
- package/dist/compiler/volar.d.ts +6 -1
- package/dist/compiler/volar.js +674 -143
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +10 -0
- package/dist/css.d.ts +2 -5
- package/dist/css.js +2 -23
- package/dist/data-encoding.d.ts +9 -0
- package/dist/data-encoding.js +134 -0
- package/dist/dom-binding-classes.d.ts +15 -0
- package/dist/dom-binding-classes.js +129 -0
- package/dist/dom-binding-controls.d.ts +2 -0
- package/dist/dom-binding-controls.js +6 -0
- package/dist/dom-binding-handoff.d.ts +55 -0
- package/dist/dom-binding-handoff.js +62 -0
- package/dist/dom-binding-program.d.ts +300 -0
- package/dist/dom-binding-program.js +1625 -0
- package/dist/dom-binding-projections.d.ts +15 -0
- package/dist/dom-binding-projections.js +187 -0
- package/dist/dom-binding-protocol.d.ts +13 -0
- package/dist/dom-binding-protocol.js +88 -0
- package/dist/dom-binding-signals.d.ts +21 -0
- package/dist/dom-binding-signals.js +109 -0
- package/dist/dom-binding-styles.d.ts +17 -0
- package/dist/dom-binding-styles.js +272 -0
- package/dist/dom-bindings.d.ts +89 -0
- package/dist/dom-bindings.js +670 -0
- package/dist/dom-focused-move.d.ts +6 -0
- package/dist/dom-focused-move.js +42 -0
- package/dist/dom-tables.d.ts +1 -3
- package/dist/dom-tables.js +1 -91
- package/dist/error-codes.client.generated.d.ts +9 -0
- package/dist/error-codes.client.generated.js +33 -0
- package/dist/error-codes.server.generated.d.ts +5 -0
- package/dist/error-codes.server.generated.js +19 -0
- package/dist/hydration/control-capture.d.ts +62 -0
- package/dist/hydration/control-capture.js +223 -0
- package/dist/hydration/document-lifecycle.d.ts +23 -0
- package/dist/hydration/document-lifecycle.js +80 -0
- package/dist/hydration/event-capture.d.ts +20 -1
- package/dist/hydration/event-capture.js +128 -42
- package/dist/hydration/independent-island.d.ts +45 -0
- package/dist/hydration/independent-island.js +233 -0
- package/dist/hydration/index.d.ts +8 -1
- package/dist/hydration/index.js +55 -1
- package/dist/hydration/interaction-config.d.ts +5 -0
- package/dist/hydration/interaction-config.js +44 -1
- package/dist/hydration/stream-delivery.d.ts +32 -0
- package/dist/hydration/stream-delivery.js +333 -0
- package/dist/hydration/stream-receiver.d.ts +26 -0
- package/dist/hydration/stream-receiver.js +204 -0
- package/dist/hydration/stream-result-receiver.d.ts +70 -0
- package/dist/hydration/stream-result-receiver.js +246 -0
- package/dist/hydration/streamed-signals.d.ts +44 -0
- package/dist/hydration/streamed-signals.js +186 -0
- package/dist/hydration/types.d.ts +6 -0
- package/dist/hydration-markers.d.ts +7 -0
- package/dist/hydration-markers.js +10 -0
- package/dist/independent-hydration-protocol.d.ts +31 -0
- package/dist/independent-hydration-protocol.js +80 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/internal/signal-read.d.ts +1 -0
- package/dist/internal/signal-read.js +4 -0
- package/dist/jsx-runtime.d.ts +45 -6
- package/dist/public-types.d.ts +15 -1
- package/dist/runtime.d.ts +259 -21
- package/dist/runtime.js +2812 -220
- package/dist/runtime.server.d.ts +86 -6
- package/dist/runtime.server.js +712 -76
- package/dist/server/early-signals.d.ts +14 -0
- package/dist/server/early-signals.js +34 -0
- package/dist/server/index.d.ts +10 -2
- package/dist/server/index.js +48 -1
- package/dist/server/rpc-batch.d.ts +17 -0
- package/dist/server/rpc-batch.js +129 -0
- package/dist/server/rpc-stream.d.ts +9 -0
- package/dist/server/rpc-stream.js +125 -0
- package/dist/server/rpc.d.ts +5 -1
- package/dist/server/rpc.js +37 -13
- package/dist/server/signal-query-observation.d.ts +3 -0
- package/dist/server/signal-query-observation.js +134 -0
- package/dist/server/streamed-region.d.ts +15 -0
- package/dist/server/streamed-region.js +30 -0
- package/dist/server/streamed-signals.d.ts +45 -0
- package/dist/server/streamed-signals.js +488 -0
- package/dist/server-call.d.ts +41 -0
- package/dist/server-call.js +75 -0
- package/dist/server-rpc-batch-client.d.ts +7 -0
- package/dist/server-rpc-batch-client.js +119 -0
- package/dist/server-rpc-client.d.ts +3 -1
- package/dist/server-rpc-client.js +99 -27
- package/dist/server-rpc-protocol.d.ts +47 -0
- package/dist/server-rpc-protocol.js +109 -0
- package/dist/server-rpc-stream-client.d.ts +5 -0
- package/dist/server-rpc-stream-client.js +98 -0
- package/dist/signals/actions.d.ts +12 -0
- package/dist/signals/actions.js +466 -0
- package/dist/signals/client.d.ts +2 -0
- package/dist/signals/client.js +1 -0
- package/dist/signals/computations.d.ts +37 -0
- package/dist/signals/computations.js +455 -0
- package/dist/signals/control-binding.d.ts +31 -0
- package/dist/signals/control-binding.js +353 -0
- package/dist/signals/derived-facade.d.ts +3 -0
- package/dist/signals/derived-facade.js +25 -0
- package/dist/signals/document-owner.d.ts +10 -0
- package/dist/signals/document-owner.js +43 -0
- package/dist/signals/early-values.d.ts +24 -0
- package/dist/signals/early-values.js +124 -0
- package/dist/signals/encoding.d.ts +1 -3
- package/dist/signals/encoding.js +3 -93
- package/dist/signals/engine.d.ts +53 -4
- package/dist/signals/engine.js +275 -16
- package/dist/signals/errors.d.ts +7 -0
- package/dist/signals/errors.js +16 -0
- package/dist/signals/facade.d.ts +74 -0
- package/dist/signals/facade.js +452 -0
- package/dist/signals/graph.d.ts +50 -5
- package/dist/signals/graph.js +170 -19
- package/dist/signals/handle-protocol.d.ts +4 -0
- package/dist/signals/handle-protocol.js +11 -0
- package/dist/signals/index.d.ts +12 -3
- package/dist/signals/index.js +71 -2
- package/dist/signals/native-read-client.d.ts +3 -0
- package/dist/signals/native-read-client.js +10 -0
- package/dist/signals/owner-context.d.ts +22 -0
- package/dist/signals/owner-context.js +77 -0
- package/dist/signals/query-attempt-observer.d.ts +49 -0
- package/dist/signals/query-attempt-observer.js +41 -0
- package/dist/signals/query-facade.d.ts +3 -0
- package/dist/signals/query-facade.js +49 -0
- package/dist/signals/read-protocol.d.ts +32 -3
- package/dist/signals/read-protocol.js +26 -0
- package/dist/signals/requests.d.ts +38 -5
- package/dist/signals/requests.js +298 -15
- package/dist/signals/scalar-computations.d.ts +2 -0
- package/dist/signals/scalar-computations.js +60 -0
- package/dist/signals/server.d.ts +2 -0
- package/dist/signals/server.js +1 -0
- package/dist/signals/transition-candidate.d.ts +71 -0
- package/dist/signals/transition-candidate.js +557 -0
- package/dist/signals/transition-state.d.ts +51 -0
- package/dist/signals/transition-state.js +70 -0
- package/dist/signals/types.d.ts +95 -5
- package/dist/signals/types.js +20 -0
- package/dist/stream-protocol.d.ts +0 -5
- package/dist/stream-protocol.js +3 -0
- package/dist/streamed-signals-protocol.d.ts +60 -0
- package/dist/streamed-signals-protocol.js +130 -0
- package/dist/style-values.d.ts +3 -0
- package/dist/style-values.js +96 -0
- package/dist/version.js +1 -1
- package/package.json +37 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type BindingOperation, type BindingValue } from './dom-bindings.js';
|
|
2
|
+
import type { BindingPreparedValue } from './dom-binding-signals.js';
|
|
3
|
+
export type BindingProjectionGroup = readonly (readonly [index: number, field: string])[];
|
|
4
|
+
export interface BindingProjectionConnection {
|
|
5
|
+
readonly group: BindingProjectionGroup;
|
|
6
|
+
read(compute: unknown): BindingValue[];
|
|
7
|
+
get(): BindingValue[];
|
|
8
|
+
preview(compute: unknown): BindingPreparedValue<BindingValue[]>;
|
|
9
|
+
writeStyle(index: number, value: BindingValue): void;
|
|
10
|
+
dispose(preservePresentation?: boolean): void;
|
|
11
|
+
}
|
|
12
|
+
/** Optional, view-owned projections share a read and prepare every field before any write. */
|
|
13
|
+
export declare function __createBindingProjections(): {
|
|
14
|
+
connect(group: BindingProjectionGroup, bindings: readonly BindingOperation[], nodes: readonly Node[], notify: () => void, restoreStyles?: boolean): BindingProjectionConnection;
|
|
15
|
+
};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { __normalizeBinding } from "./dom-bindings.js";
|
|
2
|
+
import { __createBindingStyles, __prepareBindingSources } from "./dom-binding-styles.js";
|
|
3
|
+
import { captureSignalOwner, currentSignalOwner } from "./signals/owner-context.js";
|
|
4
|
+
import {
|
|
5
|
+
beginNativeWriteGuard,
|
|
6
|
+
endNativeWriteGuard,
|
|
7
|
+
forwardNativeTransitionConsumer,
|
|
8
|
+
setNativeReadObserver
|
|
9
|
+
} from "./signals/read-protocol.js";
|
|
10
|
+
function __createBindingProjections() {
|
|
11
|
+
const owner = currentSignalOwner();
|
|
12
|
+
const run = owner === null ? (callback) => callback() : captureSignalOwner(owner);
|
|
13
|
+
const styles = __createBindingStyles();
|
|
14
|
+
return {
|
|
15
|
+
connect(group, bindings, nodes, notify, restoreStyles = false) {
|
|
16
|
+
let compute;
|
|
17
|
+
let disposed = false;
|
|
18
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
19
|
+
const styleConnections = /* @__PURE__ */ new Map();
|
|
20
|
+
const get = () => {
|
|
21
|
+
if (disposed) return [];
|
|
22
|
+
const reads = /* @__PURE__ */ new Map();
|
|
23
|
+
const previousObserver = setNativeReadObserver((source, version) => {
|
|
24
|
+
if (!reads.has(source)) reads.set(source, version);
|
|
25
|
+
previousObserver?.(source, version);
|
|
26
|
+
});
|
|
27
|
+
const guard = beginNativeWriteGuard();
|
|
28
|
+
const values = [];
|
|
29
|
+
try {
|
|
30
|
+
run(() => {
|
|
31
|
+
const result = compute();
|
|
32
|
+
for (const [index, field] of group) {
|
|
33
|
+
if (disposed) break;
|
|
34
|
+
const binding = bindings[index];
|
|
35
|
+
const value = result?.[field];
|
|
36
|
+
if (binding[1] === "styleObject") {
|
|
37
|
+
let style = styleConnections.get(index);
|
|
38
|
+
if (!style) {
|
|
39
|
+
style = styles.connect(nodes[binding[0]], notify, restoreStyles);
|
|
40
|
+
styleConnections.set(index, style);
|
|
41
|
+
}
|
|
42
|
+
values[index] = style.read(value);
|
|
43
|
+
} else values[index] = __normalizeBinding(binding, value);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
} finally {
|
|
47
|
+
endNativeWriteGuard(guard);
|
|
48
|
+
setNativeReadObserver(previousObserver);
|
|
49
|
+
}
|
|
50
|
+
for (const [source, stop] of subscriptions) {
|
|
51
|
+
if (reads.has(source)) continue;
|
|
52
|
+
subscriptions.delete(source);
|
|
53
|
+
stop();
|
|
54
|
+
}
|
|
55
|
+
for (const [source, version] of reads) {
|
|
56
|
+
if (disposed) break;
|
|
57
|
+
if (!subscriptions.has(source)) {
|
|
58
|
+
let active = true;
|
|
59
|
+
const stop = run(
|
|
60
|
+
() => source.subscribe(
|
|
61
|
+
forwardNativeTransitionConsumer(notify, () => {
|
|
62
|
+
if (active && !disposed) notify();
|
|
63
|
+
})
|
|
64
|
+
)
|
|
65
|
+
);
|
|
66
|
+
if (typeof stop !== "function")
|
|
67
|
+
throw new TypeError("A DOM projection subscription must return cleanup.");
|
|
68
|
+
const cleanup = () => {
|
|
69
|
+
active = false;
|
|
70
|
+
stop();
|
|
71
|
+
};
|
|
72
|
+
if (disposed) cleanup();
|
|
73
|
+
else subscriptions.set(source, cleanup);
|
|
74
|
+
}
|
|
75
|
+
if (!disposed && source.getVersion() !== version) notify();
|
|
76
|
+
}
|
|
77
|
+
return values;
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
group,
|
|
81
|
+
get,
|
|
82
|
+
preview(next) {
|
|
83
|
+
if (typeof next !== "function")
|
|
84
|
+
throw new TypeError("A DOM binding projection group requires a computation.");
|
|
85
|
+
const reads = /* @__PURE__ */ new Map();
|
|
86
|
+
const preparedStyles = [];
|
|
87
|
+
const createdStyles = /* @__PURE__ */ new Map();
|
|
88
|
+
const values = [];
|
|
89
|
+
const previousObserver = setNativeReadObserver((source, version) => {
|
|
90
|
+
if (!reads.has(source)) reads.set(source, version);
|
|
91
|
+
previousObserver?.(source, version);
|
|
92
|
+
});
|
|
93
|
+
const guard = beginNativeWriteGuard();
|
|
94
|
+
try {
|
|
95
|
+
run(() => {
|
|
96
|
+
const result = next();
|
|
97
|
+
for (const [index, field] of group) {
|
|
98
|
+
const binding = bindings[index];
|
|
99
|
+
const value = result?.[field];
|
|
100
|
+
if (binding[1] === "styleObject") {
|
|
101
|
+
let style = styleConnections.get(index);
|
|
102
|
+
if (!style) {
|
|
103
|
+
style = styles.connect(nodes[binding[0]], notify, restoreStyles);
|
|
104
|
+
createdStyles.set(index, style);
|
|
105
|
+
}
|
|
106
|
+
const prepared2 = style.preview(value);
|
|
107
|
+
preparedStyles.push(prepared2);
|
|
108
|
+
values[index] = prepared2.value;
|
|
109
|
+
} else values[index] = __normalizeBinding(binding, value);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
} catch (error) {
|
|
113
|
+
for (const prepared2 of preparedStyles) prepared2.discard();
|
|
114
|
+
for (const style of createdStyles.values()) style.dispose(true);
|
|
115
|
+
throw error;
|
|
116
|
+
} finally {
|
|
117
|
+
endNativeWriteGuard(guard);
|
|
118
|
+
setNativeReadObserver(previousObserver);
|
|
119
|
+
}
|
|
120
|
+
let prepared;
|
|
121
|
+
try {
|
|
122
|
+
prepared = __prepareBindingSources(reads, subscriptions, notify, () => !disposed, run);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
for (const style of preparedStyles) style.discard();
|
|
125
|
+
for (const style of createdStyles.values()) style.dispose(true);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
let accepted = false;
|
|
129
|
+
return {
|
|
130
|
+
value: values,
|
|
131
|
+
validate: () => prepared.validate() && preparedStyles.every((style) => style.validate()),
|
|
132
|
+
commit() {
|
|
133
|
+
accepted = true;
|
|
134
|
+
compute = next;
|
|
135
|
+
for (const [index, style] of createdStyles) styleConnections.set(index, style);
|
|
136
|
+
for (const style of preparedStyles) style.commit();
|
|
137
|
+
prepared.commit();
|
|
138
|
+
},
|
|
139
|
+
discard() {
|
|
140
|
+
if (accepted) return;
|
|
141
|
+
prepared.discard();
|
|
142
|
+
for (const style of preparedStyles) style.discard();
|
|
143
|
+
for (const style of createdStyles.values()) style.dispose(true);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
read(next) {
|
|
148
|
+
if (typeof next !== "function")
|
|
149
|
+
throw new TypeError("A DOM binding projection group requires a computation.");
|
|
150
|
+
compute = next;
|
|
151
|
+
return get();
|
|
152
|
+
},
|
|
153
|
+
writeStyle(index, value) {
|
|
154
|
+
if (!disposed) styleConnections.get(index).write(value);
|
|
155
|
+
},
|
|
156
|
+
dispose(preservePresentation) {
|
|
157
|
+
if (disposed) return;
|
|
158
|
+
disposed = true;
|
|
159
|
+
compute = void 0;
|
|
160
|
+
let failed = false;
|
|
161
|
+
let failure;
|
|
162
|
+
for (const cleanup of [
|
|
163
|
+
...subscriptions.values(),
|
|
164
|
+
...[...styleConnections.values()].map(
|
|
165
|
+
(style) => () => style.dispose(preservePresentation)
|
|
166
|
+
)
|
|
167
|
+
]) {
|
|
168
|
+
try {
|
|
169
|
+
cleanup();
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (!failed) {
|
|
172
|
+
failed = true;
|
|
173
|
+
failure = error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
subscriptions.clear();
|
|
178
|
+
styleConnections.clear();
|
|
179
|
+
if (failed) throw failure;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
export {
|
|
186
|
+
__createBindingProjections
|
|
187
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Compiler-owned DOM presentation markers. This leaf is shared by client and SSR. */
|
|
2
|
+
export type BindingKey = string | number;
|
|
3
|
+
export declare function encodeBindingKey(key: BindingKey): string;
|
|
4
|
+
export declare function decodeBindingKey(encoded: string): BindingKey;
|
|
5
|
+
export interface BindingMarker {
|
|
6
|
+
id: string;
|
|
7
|
+
site: string;
|
|
8
|
+
kind: 'root' | 'if' | 'for' | 'item' | 'text' | 'view' | 'slot' | 'opaque';
|
|
9
|
+
arm?: number;
|
|
10
|
+
key?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseBindingMarker(data: string): BindingMarker | null;
|
|
13
|
+
export declare function isBindingOpenComment(data: string): boolean;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
function encodeBindingKey(key) {
|
|
2
|
+
if (typeof key === "string")
|
|
3
|
+
return "s:" + JSON.stringify(key).replace(/-/g, "\\u002d").replace(/</g, "\\u003c");
|
|
4
|
+
if (typeof key === "number" && Number.isFinite(key)) return "n:" + String(key);
|
|
5
|
+
throw new TypeError("A DOM presentation key must be a string or finite number.");
|
|
6
|
+
}
|
|
7
|
+
function decodeBindingKey(encoded) {
|
|
8
|
+
let key;
|
|
9
|
+
try {
|
|
10
|
+
key = JSON.parse(encoded.slice(2));
|
|
11
|
+
} catch {
|
|
12
|
+
throw new TypeError("A DOM presentation key has invalid serialized identity.");
|
|
13
|
+
}
|
|
14
|
+
if (encoded.startsWith("s:") && typeof key === "string" || encoded.startsWith("n:") && typeof key === "number" && Number.isFinite(key)) {
|
|
15
|
+
if (encodeBindingKey(key) === encoded) return key;
|
|
16
|
+
}
|
|
17
|
+
throw new TypeError("A DOM presentation key has invalid serialized identity.");
|
|
18
|
+
}
|
|
19
|
+
function parseBindingMarker(data) {
|
|
20
|
+
if (data.startsWith("[f0;b;") || data.startsWith("[f1;b;")) {
|
|
21
|
+
const separator = data.indexOf(";", 6);
|
|
22
|
+
if (separator <= 6 || separator === data.length - 1) return null;
|
|
23
|
+
return {
|
|
24
|
+
id: data.slice(6, separator),
|
|
25
|
+
site: data.slice(separator + 1),
|
|
26
|
+
kind: "for",
|
|
27
|
+
arm: data.charCodeAt(2) - 48
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!data.startsWith("[b;")) return null;
|
|
31
|
+
const idEnd = data.indexOf(";", 3);
|
|
32
|
+
if (idEnd <= 3 || idEnd === data.length - 1) return null;
|
|
33
|
+
const id = data.slice(3, idEnd);
|
|
34
|
+
if (data.slice(idEnd + 1) === "root") return { id, site: "root", kind: "root" };
|
|
35
|
+
const siteEnd = data.indexOf(";", idEnd + 1);
|
|
36
|
+
if (siteEnd <= idEnd + 1 || siteEnd === data.length - 1) return null;
|
|
37
|
+
const site = data.slice(idEnd + 1, siteEnd);
|
|
38
|
+
const kind = data.slice(siteEnd + 1);
|
|
39
|
+
if (kind === "t") return { id, site, kind: "text" };
|
|
40
|
+
if (kind === "v") return { id, site, kind: "view" };
|
|
41
|
+
if (kind === "s") return { id, site, kind: "slot" };
|
|
42
|
+
if (kind === "o") return { id, site, kind: "opaque" };
|
|
43
|
+
if (kind.startsWith("k;")) {
|
|
44
|
+
const key = kind.slice(2);
|
|
45
|
+
try {
|
|
46
|
+
decodeBindingKey(key);
|
|
47
|
+
} catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return { id, site, kind: "item", key };
|
|
51
|
+
}
|
|
52
|
+
if (/^(?:-1|0|[1-9]\d*)$/.test(kind)) {
|
|
53
|
+
const arm = Number(kind);
|
|
54
|
+
if (Number.isSafeInteger(arm)) return { id, site, kind: "if", arm };
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function isBindingOpenComment(data) {
|
|
59
|
+
const list = data.startsWith("[f0;b;") || data.startsWith("[f1;b;");
|
|
60
|
+
if (!list && !data.startsWith("[b;")) return false;
|
|
61
|
+
const idStart = list ? 6 : 3;
|
|
62
|
+
const idEnd = data.indexOf(";", idStart);
|
|
63
|
+
if (idEnd <= idStart || idEnd === data.length - 1) return false;
|
|
64
|
+
if (list) return data.indexOf(";", idEnd + 1) === -1;
|
|
65
|
+
if (data.length - idEnd === 5 && data.endsWith(";root")) return true;
|
|
66
|
+
const siteEnd = data.indexOf(";", idEnd + 1);
|
|
67
|
+
if (siteEnd <= idEnd + 1 || siteEnd === data.length - 1) return false;
|
|
68
|
+
const tail = siteEnd + 1;
|
|
69
|
+
if (data.length === tail + 1) {
|
|
70
|
+
const code = data.charCodeAt(tail);
|
|
71
|
+
return code === 116 || code === 118 || code === 115 || code === 111 || code >= 48 && code <= 57;
|
|
72
|
+
}
|
|
73
|
+
if (data.charCodeAt(tail) === 107 && data.charCodeAt(tail + 1) === 59)
|
|
74
|
+
return (data.charCodeAt(tail + 2) === 115 || data.charCodeAt(tail + 2) === 110) && data.charCodeAt(tail + 3) === 58 && data.length > tail + 4;
|
|
75
|
+
if (data.length === tail + 2 && data.endsWith("-1")) return true;
|
|
76
|
+
if (data.charCodeAt(tail) < 49 || data.charCodeAt(tail) > 57) return false;
|
|
77
|
+
for (let index = tail + 1; index < data.length; index++) {
|
|
78
|
+
const code = data.charCodeAt(index);
|
|
79
|
+
if (code < 48 || code > 57) return false;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
decodeBindingKey,
|
|
85
|
+
encodeBindingKey,
|
|
86
|
+
isBindingOpenComment,
|
|
87
|
+
parseBindingMarker
|
|
88
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type NativeTransitionPresentation } from './signals/read-protocol.js';
|
|
2
|
+
import { type SignalHandle } from './signals/types.js';
|
|
3
|
+
export interface BindingSignalConnection {
|
|
4
|
+
/** Resolve and observe a projected handle, or disconnect for an ordinary value. */
|
|
5
|
+
read(value: unknown): unknown;
|
|
6
|
+
/** Read only the already connected channel; never reevaluate the authored projection. */
|
|
7
|
+
get(): unknown;
|
|
8
|
+
/** Prepare a different projection without replacing the currently published lease. */
|
|
9
|
+
preview(value: unknown): BindingPreparedValue;
|
|
10
|
+
/** Optional whole-style writer, present only on the selected style capability. */
|
|
11
|
+
write?(value: unknown): void;
|
|
12
|
+
dispose(preservePresentation?: boolean): void;
|
|
13
|
+
}
|
|
14
|
+
export interface BindingPreparedValue<T = unknown> extends NativeTransitionPresentation {
|
|
15
|
+
readonly value: T;
|
|
16
|
+
}
|
|
17
|
+
/** @internal Query-selected capability; captures the existing owner, never creates a graph. */
|
|
18
|
+
export declare function __createBindingSignals(): {
|
|
19
|
+
isSignal: (value: unknown) => value is SignalHandle<unknown>;
|
|
20
|
+
connect(notify: () => void): BindingSignalConnection;
|
|
21
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { captureSignalOwner, currentSignalOwner } from "./signals/owner-context.js";
|
|
2
|
+
import {
|
|
3
|
+
forwardNativeTransitionConsumer
|
|
4
|
+
} from "./signals/read-protocol.js";
|
|
5
|
+
import {
|
|
6
|
+
SIGNAL_HANDLE,
|
|
7
|
+
SIGNAL_BINDING_READ,
|
|
8
|
+
SIGNAL_BINDING_SUBSCRIBE
|
|
9
|
+
} from "./signals/types.js";
|
|
10
|
+
function __createBindingSignals() {
|
|
11
|
+
const owner = currentSignalOwner();
|
|
12
|
+
const run = owner === null ? (callback) => callback() : captureSignalOwner(owner);
|
|
13
|
+
const isSignal = (value) => value !== null && (typeof value === "object" || typeof value === "function") && value[SIGNAL_HANDLE] === true;
|
|
14
|
+
return {
|
|
15
|
+
isSignal,
|
|
16
|
+
connect(notify) {
|
|
17
|
+
let value;
|
|
18
|
+
let handle;
|
|
19
|
+
let unsubscribe;
|
|
20
|
+
let generation = 0;
|
|
21
|
+
let disposed = false;
|
|
22
|
+
const get = () => disposed ? void 0 : handle ? run(() => handle[SIGNAL_BINDING_READ]()) : value;
|
|
23
|
+
const dispose = () => {
|
|
24
|
+
if (disposed) return;
|
|
25
|
+
disposed = true;
|
|
26
|
+
generation++;
|
|
27
|
+
handle = void 0;
|
|
28
|
+
const stop = unsubscribe;
|
|
29
|
+
unsubscribe = void 0;
|
|
30
|
+
stop?.();
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
get,
|
|
34
|
+
dispose,
|
|
35
|
+
preview(next) {
|
|
36
|
+
const nextHandle = isSignal(next) ? next : void 0;
|
|
37
|
+
const ticket = generation;
|
|
38
|
+
const projected = nextHandle ? run(() => nextHandle[SIGNAL_BINDING_READ]()) : next;
|
|
39
|
+
let accepted = false;
|
|
40
|
+
let retired = false;
|
|
41
|
+
let invalid = false;
|
|
42
|
+
let acceptedGeneration = ticket;
|
|
43
|
+
const stopNext = nextHandle && nextHandle !== handle ? run(
|
|
44
|
+
() => nextHandle[SIGNAL_BINDING_SUBSCRIBE](
|
|
45
|
+
forwardNativeTransitionConsumer(notify, () => {
|
|
46
|
+
if (retired || disposed) return;
|
|
47
|
+
if (!accepted) invalid = true;
|
|
48
|
+
else if (generation === acceptedGeneration) notify();
|
|
49
|
+
})
|
|
50
|
+
)
|
|
51
|
+
) : void 0;
|
|
52
|
+
return {
|
|
53
|
+
value: projected,
|
|
54
|
+
validate: () => !retired && !invalid && !disposed && generation === ticket,
|
|
55
|
+
commit() {
|
|
56
|
+
if (retired || accepted || disposed) return;
|
|
57
|
+
accepted = true;
|
|
58
|
+
value = next;
|
|
59
|
+
if (nextHandle === handle) return;
|
|
60
|
+
const stop = unsubscribe;
|
|
61
|
+
acceptedGeneration = ++generation;
|
|
62
|
+
handle = nextHandle;
|
|
63
|
+
unsubscribe = stopNext;
|
|
64
|
+
stop?.();
|
|
65
|
+
},
|
|
66
|
+
discard() {
|
|
67
|
+
if (accepted || retired) return;
|
|
68
|
+
retired = true;
|
|
69
|
+
stopNext?.();
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
read(next) {
|
|
74
|
+
if (disposed) return void 0;
|
|
75
|
+
const nextHandle = isSignal(next) ? next : void 0;
|
|
76
|
+
if (nextHandle !== handle) {
|
|
77
|
+
const ticket = ++generation;
|
|
78
|
+
const stop = unsubscribe;
|
|
79
|
+
unsubscribe = void 0;
|
|
80
|
+
handle = void 0;
|
|
81
|
+
stop?.();
|
|
82
|
+
if (disposed) return void 0;
|
|
83
|
+
handle = nextHandle;
|
|
84
|
+
if (handle) {
|
|
85
|
+
if (typeof handle[SIGNAL_BINDING_READ] !== "function" || typeof handle[SIGNAL_BINDING_SUBSCRIBE] !== "function")
|
|
86
|
+
throw new TypeError("A DOM binding signal requires the native binding protocol.");
|
|
87
|
+
const stopNext = run(
|
|
88
|
+
() => handle[SIGNAL_BINDING_SUBSCRIBE](
|
|
89
|
+
forwardNativeTransitionConsumer(notify, () => {
|
|
90
|
+
if (!disposed && ticket === generation) notify();
|
|
91
|
+
})
|
|
92
|
+
)
|
|
93
|
+
);
|
|
94
|
+
if (typeof stopNext !== "function")
|
|
95
|
+
throw new TypeError("A DOM binding signal subscription must return cleanup.");
|
|
96
|
+
if (disposed || ticket !== generation) stopNext();
|
|
97
|
+
else unsubscribe = stopNext;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
value = next;
|
|
101
|
+
return get();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
__createBindingSignals
|
|
109
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type BindingValue } from './dom-bindings.js';
|
|
2
|
+
import type { BindingSignalConnection } from './dom-binding-signals.js';
|
|
3
|
+
import { type NativeReadSource, type NativeTransitionPresentation } from './signals/read-protocol.js';
|
|
4
|
+
/** Acquire prospective graph leases before releasing any published subscription. */
|
|
5
|
+
export declare function __prepareBindingSources(reads: Map<NativeReadSource, number>, subscriptions: Map<NativeReadSource, () => void>, notify: () => void, active: () => boolean, run: <T>(callback: () => T) => T): NativeTransitionPresentation;
|
|
6
|
+
/** Canonical style values after native handles and CSS units have been resolved. */
|
|
7
|
+
export type BindingStyleSnapshot = Readonly<Record<string, string | null>>;
|
|
8
|
+
/** Shared preparation keeps native style projections on the canonical CSS rules. */
|
|
9
|
+
export declare function __normalizeBindingStyle(value: unknown): BindingValue;
|
|
10
|
+
/**
|
|
11
|
+
* Query-selected whole-style capability. Native source subscriptions belong to
|
|
12
|
+
* this binding lifetime; the existing graph and canonical style reader own all
|
|
13
|
+
* signal semantics. Fixed-property artifacts never import this module.
|
|
14
|
+
*/
|
|
15
|
+
export declare function __createBindingStyles(): {
|
|
16
|
+
connect(node: Element, notify: () => void, restoreStyles?: boolean): BindingSignalConnection;
|
|
17
|
+
};
|