@tschk/moonshine-vue 0.0.0-stage → 0.4.4
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 +298 -2
- package/package.json +57 -4
- package/src/app.ts +97 -0
- package/src/compiler-sfc.ts +1 -0
- package/src/context.ts +59 -0
- package/src/error-context.ts +57 -0
- package/src/errors.ts +24 -0
- package/src/events.ts +86 -0
- package/src/framework.ts +1 -0
- package/src/index.ts +42 -0
- package/src/lifecycle.ts +59 -0
- package/src/normalize.ts +111 -0
- package/src/props.ts +471 -0
- package/src/reactive.ts +390 -0
- package/src/render.ts +365 -0
- package/src/shims.d.ts +17 -0
- package/src/slots.ts +82 -0
- package/src/text.ts +56 -0
- package/src/vue.ts +11 -0
package/src/props.ts
ADDED
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import { currentGroup, prepareProps } from "./render";
|
|
2
|
+
import {
|
|
3
|
+
peekComponentContext,
|
|
4
|
+
withComponentConsumer,
|
|
5
|
+
} from "@tschk/moonshine-dom/component";
|
|
6
|
+
import {
|
|
7
|
+
batch,
|
|
8
|
+
createComputed,
|
|
9
|
+
createSignal,
|
|
10
|
+
getOwner,
|
|
11
|
+
runWithOwner,
|
|
12
|
+
untrack,
|
|
13
|
+
} from "@tschk/moonshine-dom/reactive";
|
|
14
|
+
|
|
15
|
+
/** Compiler metadata for Boolean-bearing props; true also casts empty/name strings. */
|
|
16
|
+
export type BooleanProps = readonly (readonly [
|
|
17
|
+
key: string,
|
|
18
|
+
castTrue: boolean,
|
|
19
|
+
])[];
|
|
20
|
+
|
|
21
|
+
/** Finite compiler metadata lists every Boolean-bearing declared prop. */
|
|
22
|
+
type BooleanKeys<T> = {
|
|
23
|
+
[K in keyof T]-?: [T[K]] extends [boolean | undefined] ? K : never;
|
|
24
|
+
}[keyof T];
|
|
25
|
+
export type BooleanSetupProps<T> = [BooleanKeys<T>] extends [never]
|
|
26
|
+
? T
|
|
27
|
+
: T & {
|
|
28
|
+
[K in BooleanKeys<T>]-?: boolean;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const camelizeProp = (key: string) =>
|
|
32
|
+
key.replace(/-(\w)/g, (_, letter: string) => letter.toUpperCase());
|
|
33
|
+
const hyphenateProp = (key: string) =>
|
|
34
|
+
key.replace(/\B([A-Z])/g, "-$1").toLowerCase();
|
|
35
|
+
|
|
36
|
+
function booleanResolver(keys: readonly string[], metadata: BooleanProps) {
|
|
37
|
+
const declared = new Set(keys);
|
|
38
|
+
const casts = new Map(metadata);
|
|
39
|
+
return (raw: Map<string, unknown>): Map<string, unknown> => {
|
|
40
|
+
const values = new Map<string, unknown>();
|
|
41
|
+
const castValues = new Map<string, unknown>();
|
|
42
|
+
for (const [key, value] of raw) {
|
|
43
|
+
const normalized = camelizeProp(key);
|
|
44
|
+
if (declared.has(normalized))
|
|
45
|
+
(casts.has(normalized) ? castValues : values).set(normalized, value);
|
|
46
|
+
}
|
|
47
|
+
for (const [key, castTrue] of casts) {
|
|
48
|
+
const value = castValues.get(key);
|
|
49
|
+
values.set(
|
|
50
|
+
key,
|
|
51
|
+
!castValues.has(key)
|
|
52
|
+
? false
|
|
53
|
+
: castTrue && (value === "" || value === hyphenateProp(key))
|
|
54
|
+
? true
|
|
55
|
+
: value,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
for (const key of keys) if (!values.has(key)) values.set(key, undefined);
|
|
59
|
+
return values;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type PropsJob = { order: number; run: () => void };
|
|
64
|
+
const pending: PropsJob[] = [];
|
|
65
|
+
const queued = /* @__PURE__ */ new Set<PropsJob>();
|
|
66
|
+
let nextOrder = 0;
|
|
67
|
+
let scheduled = false;
|
|
68
|
+
function scheduleProps(job: PropsJob): void {
|
|
69
|
+
if (queued.has(job)) return;
|
|
70
|
+
queued.add(job);
|
|
71
|
+
let index = pending.length;
|
|
72
|
+
while (index > 0 && pending[index - 1]!.order > job.order) index--;
|
|
73
|
+
pending.splice(index, 0, job);
|
|
74
|
+
if (scheduled) return;
|
|
75
|
+
scheduled = true;
|
|
76
|
+
queueMicrotask(() => {
|
|
77
|
+
let failed = false;
|
|
78
|
+
let failure: unknown;
|
|
79
|
+
const runs = new Map<PropsJob, number>();
|
|
80
|
+
while (pending.length) {
|
|
81
|
+
const current = pending.shift()!;
|
|
82
|
+
queued.delete(current);
|
|
83
|
+
const count = (runs.get(current) ?? 0) + 1;
|
|
84
|
+
runs.set(current, count);
|
|
85
|
+
try {
|
|
86
|
+
if (count > 1000) throw new Error("Vue props update limit exceeded");
|
|
87
|
+
current.run();
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (!failed) failure = error;
|
|
90
|
+
failed = true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
scheduled = false;
|
|
94
|
+
if (failed) throw failure;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Shallow declared props with owned, coalesced parent refresh. */
|
|
99
|
+
export function createProps<T extends object>(
|
|
100
|
+
source: T,
|
|
101
|
+
keys: readonly (keyof T & string)[],
|
|
102
|
+
): T {
|
|
103
|
+
return createPropsCore(source, keys);
|
|
104
|
+
}
|
|
105
|
+
/** Compiler-only Boolean view; metadata covers every Boolean-bearing declared prop. */
|
|
106
|
+
export function createBooleanProps<T extends object>(
|
|
107
|
+
source: T,
|
|
108
|
+
keys: readonly (keyof T & string)[],
|
|
109
|
+
metadata: BooleanProps,
|
|
110
|
+
): BooleanSetupProps<T> {
|
|
111
|
+
return createPropsCore(
|
|
112
|
+
source,
|
|
113
|
+
keys,
|
|
114
|
+
booleanResolver(keys, metadata),
|
|
115
|
+
) as BooleanSetupProps<T>;
|
|
116
|
+
}
|
|
117
|
+
function createPropsCore<T extends object>(
|
|
118
|
+
source: T,
|
|
119
|
+
keys: readonly (keyof T & string)[],
|
|
120
|
+
resolve?: (
|
|
121
|
+
raw: Map<string, unknown>,
|
|
122
|
+
storage: Record<PropertyKey, unknown>,
|
|
123
|
+
) => Iterable<readonly [string, unknown]>,
|
|
124
|
+
commit: <R>(fn: () => R) => R = batch,
|
|
125
|
+
preparation: <R>(fn: () => R) => R = untrack,
|
|
126
|
+
): T {
|
|
127
|
+
const owner = getOwner();
|
|
128
|
+
if (!owner || owner.disposed)
|
|
129
|
+
throw new TypeError("Props require a live native owner");
|
|
130
|
+
const storage: Record<PropertyKey, unknown> = {};
|
|
131
|
+
const reads = new Map<PropertyKey, ReturnType<typeof createSignal<number>>>();
|
|
132
|
+
const presence = new Map<
|
|
133
|
+
PropertyKey,
|
|
134
|
+
ReturnType<typeof createSignal<number>>
|
|
135
|
+
>();
|
|
136
|
+
const [shape, setShape] = createSignal(0, { equals: false });
|
|
137
|
+
const cell = (key: PropertyKey) => {
|
|
138
|
+
let found = reads.get(key);
|
|
139
|
+
if (!found) {
|
|
140
|
+
found = createSignal(0, { equals: false });
|
|
141
|
+
reads.set(key, found);
|
|
142
|
+
}
|
|
143
|
+
return found;
|
|
144
|
+
};
|
|
145
|
+
const declared = new Set<string>(keys);
|
|
146
|
+
const define = (key: PropertyKey, value: unknown) =>
|
|
147
|
+
Reflect.defineProperty(storage, key, {
|
|
148
|
+
value,
|
|
149
|
+
writable: true,
|
|
150
|
+
enumerable: true,
|
|
151
|
+
configurable: true,
|
|
152
|
+
});
|
|
153
|
+
const view: Record<PropertyKey, unknown> = new Proxy(storage, {
|
|
154
|
+
get(target, key, receiver) {
|
|
155
|
+
cell(key)[0]();
|
|
156
|
+
return Reflect.get(target, key, receiver);
|
|
157
|
+
},
|
|
158
|
+
has(target, key) {
|
|
159
|
+
let found = presence.get(key);
|
|
160
|
+
if (!found) {
|
|
161
|
+
found = createSignal(0, { equals: false });
|
|
162
|
+
presence.set(key, found);
|
|
163
|
+
}
|
|
164
|
+
found[0]();
|
|
165
|
+
return Reflect.has(target, key);
|
|
166
|
+
},
|
|
167
|
+
ownKeys(target) {
|
|
168
|
+
shape();
|
|
169
|
+
return Reflect.ownKeys(target);
|
|
170
|
+
},
|
|
171
|
+
set(target, key, value) {
|
|
172
|
+
return untrack(() => {
|
|
173
|
+
const had = Object.hasOwn(target, key),
|
|
174
|
+
previous = Reflect.get(target, key, view);
|
|
175
|
+
const success = had
|
|
176
|
+
? Reflect.set(target, key, value, view)
|
|
177
|
+
: define(key, value);
|
|
178
|
+
if (success) {
|
|
179
|
+
batch(() => {
|
|
180
|
+
if (!had) {
|
|
181
|
+
setShape(0);
|
|
182
|
+
presence.get(key)?.[1](0);
|
|
183
|
+
}
|
|
184
|
+
if (!had || !Object.is(previous, value)) reads.get(key)?.[1](0);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return success;
|
|
188
|
+
});
|
|
189
|
+
},
|
|
190
|
+
deleteProperty(target, key) {
|
|
191
|
+
return untrack(() => {
|
|
192
|
+
const had = Object.hasOwn(target, key),
|
|
193
|
+
success = Reflect.deleteProperty(target, key);
|
|
194
|
+
if (success && had)
|
|
195
|
+
batch(() => {
|
|
196
|
+
setShape(0);
|
|
197
|
+
presence.get(key)?.[1](0);
|
|
198
|
+
reads.get(key)?.[1](0);
|
|
199
|
+
});
|
|
200
|
+
return success;
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
let previous: Map<string, unknown> | undefined;
|
|
205
|
+
let invalidated = false;
|
|
206
|
+
const readSource = () => {
|
|
207
|
+
const input = new Map<string, unknown>();
|
|
208
|
+
for (const key in source) input.set(key, Reflect.get(source, key, source));
|
|
209
|
+
const own = new Map(
|
|
210
|
+
Object.keys(source).map((key) => [key, input.get(key)] as const),
|
|
211
|
+
);
|
|
212
|
+
return { input, own };
|
|
213
|
+
};
|
|
214
|
+
const apply = ({ input, own }: ReturnType<typeof readSource>) => {
|
|
215
|
+
if (
|
|
216
|
+
previous &&
|
|
217
|
+
!invalidated &&
|
|
218
|
+
own.size === previous.size &&
|
|
219
|
+
Array.from(own).every(
|
|
220
|
+
([key, value]) => previous!.has(key) && value === previous!.get(key),
|
|
221
|
+
)
|
|
222
|
+
)
|
|
223
|
+
return;
|
|
224
|
+
// Vue includes inherited enumerable values initially, but later refreshes clear missing own props.
|
|
225
|
+
const captured = previous ? own : input;
|
|
226
|
+
const incoming = captured;
|
|
227
|
+
const ordered = resolve
|
|
228
|
+
? undefined
|
|
229
|
+
: [
|
|
230
|
+
...Array.from(incoming.keys()).filter((key) => declared.has(key)),
|
|
231
|
+
...keys.filter((key) => !incoming.has(key)),
|
|
232
|
+
];
|
|
233
|
+
const writes = () =>
|
|
234
|
+
untrack(() => {
|
|
235
|
+
if (resolve) {
|
|
236
|
+
for (const [key, value] of resolve(captured, storage)) {
|
|
237
|
+
if (owner.disposed) return;
|
|
238
|
+
Reflect.set(view, key, value);
|
|
239
|
+
}
|
|
240
|
+
} else
|
|
241
|
+
for (const key of ordered!) Reflect.set(view, key, incoming.get(key));
|
|
242
|
+
for (const key of Object.keys(storage))
|
|
243
|
+
if (!declared.has(key)) Reflect.deleteProperty(view, key);
|
|
244
|
+
});
|
|
245
|
+
try {
|
|
246
|
+
commit(writes);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
// Defaults may have changed raw storage before throwing; the old snapshot is stale.
|
|
249
|
+
if (commit === untrack) invalidated = true;
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
previous = own;
|
|
253
|
+
invalidated = false;
|
|
254
|
+
};
|
|
255
|
+
// shortcut: this queue orders props refreshes, not arbitrary Vue render jobs or lifecycle hooks.
|
|
256
|
+
let latest: ReturnType<typeof readSource> | undefined;
|
|
257
|
+
const job: PropsJob = {
|
|
258
|
+
order: nextOrder++,
|
|
259
|
+
run() {
|
|
260
|
+
const snapshot = latest;
|
|
261
|
+
latest = undefined;
|
|
262
|
+
if (!owner.disposed && snapshot)
|
|
263
|
+
runWithOwner(owner, () => preparation(() => apply(snapshot)));
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
createComputed(() => {
|
|
267
|
+
const snapshot = readSource();
|
|
268
|
+
if (!previous) {
|
|
269
|
+
untrack(() => apply(snapshot));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
latest = snapshot;
|
|
273
|
+
scheduleProps(job);
|
|
274
|
+
});
|
|
275
|
+
return view as T;
|
|
276
|
+
}
|
|
277
|
+
export function createServerProps<T extends object>(
|
|
278
|
+
source: T,
|
|
279
|
+
keys: readonly (keyof T & string)[],
|
|
280
|
+
): T {
|
|
281
|
+
return createServerPropsCore(source, keys);
|
|
282
|
+
}
|
|
283
|
+
export function createServerBooleanProps<T extends object>(
|
|
284
|
+
source: T,
|
|
285
|
+
keys: readonly (keyof T & string)[],
|
|
286
|
+
metadata: BooleanProps,
|
|
287
|
+
): BooleanSetupProps<T> {
|
|
288
|
+
return createServerPropsCore(
|
|
289
|
+
source,
|
|
290
|
+
keys,
|
|
291
|
+
booleanResolver(keys, metadata),
|
|
292
|
+
camelizeProp,
|
|
293
|
+
) as BooleanSetupProps<T>;
|
|
294
|
+
}
|
|
295
|
+
function createServerPropsCore<T extends object>(
|
|
296
|
+
source: T,
|
|
297
|
+
keys: readonly (keyof T & string)[],
|
|
298
|
+
resolve?: (
|
|
299
|
+
raw: Map<string, unknown>,
|
|
300
|
+
storage: Record<PropertyKey, unknown>,
|
|
301
|
+
) => Iterable<readonly [string, unknown]>,
|
|
302
|
+
normalizeKey?: (key: string) => string,
|
|
303
|
+
): T {
|
|
304
|
+
const view = {} as T;
|
|
305
|
+
const values = new Map<string, unknown>();
|
|
306
|
+
for (const key in source)
|
|
307
|
+
if (
|
|
308
|
+
keys.includes(
|
|
309
|
+
(normalizeKey ? normalizeKey(key) : key) as keyof T & string,
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
values.set(key, Reflect.get(source, key, source));
|
|
313
|
+
if (resolve) {
|
|
314
|
+
for (const [key, value] of resolve(
|
|
315
|
+
values,
|
|
316
|
+
view as Record<PropertyKey, unknown>,
|
|
317
|
+
))
|
|
318
|
+
Object.defineProperty(view, key, {
|
|
319
|
+
value,
|
|
320
|
+
writable: true,
|
|
321
|
+
enumerable: true,
|
|
322
|
+
configurable: true,
|
|
323
|
+
});
|
|
324
|
+
} else {
|
|
325
|
+
const names = Array.from(values.keys());
|
|
326
|
+
for (const key of [
|
|
327
|
+
...names,
|
|
328
|
+
...keys.filter((missing) => !names.includes(missing)),
|
|
329
|
+
])
|
|
330
|
+
Object.defineProperty(view, key, {
|
|
331
|
+
value: values.get(key),
|
|
332
|
+
writable: true,
|
|
333
|
+
enumerable: true,
|
|
334
|
+
configurable: true,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return view;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/** Compiler metadata distinguishes literal defaults from factories. */
|
|
341
|
+
export type DefaultEntry = readonly [
|
|
342
|
+
key: string,
|
|
343
|
+
value: unknown,
|
|
344
|
+
factory: boolean,
|
|
345
|
+
];
|
|
346
|
+
function defaultEntries(
|
|
347
|
+
keys: readonly string[],
|
|
348
|
+
casts: BooleanProps,
|
|
349
|
+
definitions: readonly DefaultEntry[],
|
|
350
|
+
) {
|
|
351
|
+
const declared = new Set(keys),
|
|
352
|
+
boolean = new Map(casts),
|
|
353
|
+
defaults = new Map(
|
|
354
|
+
definitions.map(([key, value, factory]) => [key, { value, factory }]),
|
|
355
|
+
),
|
|
356
|
+
cache = new Map<string, unknown>();
|
|
357
|
+
const frame = peekComponentContext();
|
|
358
|
+
return function* (
|
|
359
|
+
raw: Map<string, unknown>,
|
|
360
|
+
storage: Record<PropertyKey, unknown>,
|
|
361
|
+
): Generator<readonly [string, unknown]> {
|
|
362
|
+
const captured = new Map<string, unknown>();
|
|
363
|
+
for (const [key, value] of raw) {
|
|
364
|
+
const name = camelizeProp(key);
|
|
365
|
+
if (declared.has(name)) captured.set(name, value);
|
|
366
|
+
}
|
|
367
|
+
for (const [key, value] of captured)
|
|
368
|
+
if (!boolean.has(key) && !defaults.has(key)) yield [key, value];
|
|
369
|
+
for (const key of keys) {
|
|
370
|
+
if (!boolean.has(key) && !defaults.has(key)) continue;
|
|
371
|
+
let value = captured.get(key);
|
|
372
|
+
const definition = defaults.get(key);
|
|
373
|
+
if (value === undefined && definition) {
|
|
374
|
+
if (definition.factory) {
|
|
375
|
+
if (cache.has(key)) value = cache.get(key);
|
|
376
|
+
else {
|
|
377
|
+
const invoke = () =>
|
|
378
|
+
Reflect.apply(definition.value as Function, null, [storage]);
|
|
379
|
+
value = frame ? withComponentConsumer(frame, invoke) : invoke();
|
|
380
|
+
cache.set(key, value);
|
|
381
|
+
}
|
|
382
|
+
} else value = definition.value;
|
|
383
|
+
}
|
|
384
|
+
if (boolean.has(key)) {
|
|
385
|
+
if (!captured.has(key) && !definition) value = false;
|
|
386
|
+
else if (
|
|
387
|
+
boolean.get(key) &&
|
|
388
|
+
(value === "" || value === hyphenateProp(key))
|
|
389
|
+
)
|
|
390
|
+
value = true;
|
|
391
|
+
}
|
|
392
|
+
yield [key, value];
|
|
393
|
+
}
|
|
394
|
+
for (const key of keys)
|
|
395
|
+
if (!captured.has(key) && !boolean.has(key) && !defaults.has(key))
|
|
396
|
+
yield [key, undefined];
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
export function createDefaultProps<
|
|
400
|
+
T extends object,
|
|
401
|
+
D extends DefaultValues<T> = {},
|
|
402
|
+
>(
|
|
403
|
+
source: T,
|
|
404
|
+
keys: readonly (keyof T & string)[],
|
|
405
|
+
casts: BooleanProps,
|
|
406
|
+
definitions: readonly DefaultEntry[],
|
|
407
|
+
) {
|
|
408
|
+
const owner = getOwner();
|
|
409
|
+
if (!owner || owner.disposed)
|
|
410
|
+
throw Error("Default props require a live owner");
|
|
411
|
+
const group = currentGroup();
|
|
412
|
+
const props = createPropsCore(
|
|
413
|
+
source,
|
|
414
|
+
keys,
|
|
415
|
+
defaultEntries(keys, casts, definitions),
|
|
416
|
+
untrack,
|
|
417
|
+
(fn) => untrack(() => prepareProps(group, fn)),
|
|
418
|
+
);
|
|
419
|
+
return { props: props as SetupDefaults<T, D> };
|
|
420
|
+
}
|
|
421
|
+
export function createServerDefaultProps<
|
|
422
|
+
T extends object,
|
|
423
|
+
D extends DefaultValues<T> = {},
|
|
424
|
+
>(
|
|
425
|
+
source: T,
|
|
426
|
+
keys: readonly (keyof T & string)[],
|
|
427
|
+
casts: BooleanProps,
|
|
428
|
+
definitions: readonly DefaultEntry[],
|
|
429
|
+
): SetupDefaults<T, D> {
|
|
430
|
+
return createServerPropsCore(
|
|
431
|
+
source,
|
|
432
|
+
keys,
|
|
433
|
+
defaultEntries(keys, casts, definitions),
|
|
434
|
+
camelizeProp,
|
|
435
|
+
) as SetupDefaults<T, D>;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/** Setup defaults are shallow readonly; caller props retain their original type. */
|
|
439
|
+
type PrimitiveDefault = null | number | string | boolean | symbol | Function;
|
|
440
|
+
type FactoryProps<T> = { [K in keyof (T & Required<T>)]: T[K] };
|
|
441
|
+
type DefaultValue<T, V> =
|
|
442
|
+
| ((props: FactoryProps<T>) => V & {})
|
|
443
|
+
| (V extends PrimitiveDefault ? V : never);
|
|
444
|
+
export type DefaultValues<T> = { [K in keyof T]?: DefaultValue<T, T[K]> };
|
|
445
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
446
|
+
type Defaulted<T, D, K extends keyof T> = K extends keyof D
|
|
447
|
+
? IsAny<D[K]> extends true
|
|
448
|
+
? Exclude<T[K], undefined>
|
|
449
|
+
: [D[K]] extends [undefined]
|
|
450
|
+
? T[K]
|
|
451
|
+
: Exclude<T[K], undefined>
|
|
452
|
+
: T[K];
|
|
453
|
+
type BoolKeys<T> = {
|
|
454
|
+
[K in keyof T]-?: [T[K]] extends [boolean | undefined] ? K : never;
|
|
455
|
+
}[keyof T];
|
|
456
|
+
export type SetupDefaults<T, D> = Readonly<Omit<T, keyof D>> & {
|
|
457
|
+
readonly [K in keyof D as K extends keyof T ? K : never]-?: Defaulted<
|
|
458
|
+
T,
|
|
459
|
+
D,
|
|
460
|
+
K & keyof T
|
|
461
|
+
>;
|
|
462
|
+
} & {
|
|
463
|
+
readonly [K in BoolKeys<T>]-?: K extends keyof D
|
|
464
|
+
? [D[K]] extends [undefined]
|
|
465
|
+
? boolean | undefined
|
|
466
|
+
: boolean
|
|
467
|
+
: boolean;
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
// Compiler-private carrier for authored defaults components.
|
|
471
|
+
export { withVueScheduler } from "./render";
|