@sigx/runtime-core 0.1.3 → 0.1.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/dist/component.d.ts +62 -4
- package/dist/component.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +284 -40
- package/dist/index.js.map +1 -1
- package/dist/lazy.d.ts +99 -0
- package/dist/lazy.d.ts.map +1 -0
- package/dist/renderer.d.ts +31 -1
- package/dist/renderer.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/component.d.ts
CHANGED
|
@@ -93,16 +93,73 @@ export interface MountContext<TElement = PlatformElement> {
|
|
|
93
93
|
*/
|
|
94
94
|
export interface SetupContext {
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Type for defaults object - REQUIRES all optional keys to be provided.
|
|
98
|
+
* Required props (where undefined is not assignable) get type 'never' to prevent setting them.
|
|
99
|
+
* This ensures you don't forget to add a default when adding a new optional prop.
|
|
100
|
+
*/
|
|
101
|
+
type DefaultsFor<TProps> = {
|
|
102
|
+
[K in keyof TProps as undefined extends TProps[K] ? K : never]-?: NonNullable<TProps[K]>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Props type after defaults are applied - all props become required (non-undefined)
|
|
106
|
+
*/
|
|
107
|
+
export type PropsWithDefaults<TProps, D> = {
|
|
108
|
+
readonly [K in keyof TProps]-?: K extends keyof D ? NonNullable<TProps[K]> : TProps[K];
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Props accessor - can be called with defaults to set them,
|
|
112
|
+
* then accessed directly with defaults applied.
|
|
113
|
+
*
|
|
114
|
+
* When calling props(), you MUST provide defaults for ALL optional props.
|
|
115
|
+
* This ensures you don't forget to add a default when adding a new optional prop.
|
|
116
|
+
* Required props cannot be in the defaults object.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```tsx
|
|
120
|
+
* // Must provide defaults for ALL optional props
|
|
121
|
+
* const p = props({ variant: "primary", size: "md" });
|
|
122
|
+
* return () => <button class={p.variant}>...</button>
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export type PropsAccessor<TProps> = {
|
|
126
|
+
readonly [K in keyof TProps]: TProps[K];
|
|
127
|
+
} & {
|
|
128
|
+
(defaults: DefaultsFor<TProps>): PropsWithDefaults<TProps, DefaultsFor<TProps>> & PropsAccessor<TProps>;
|
|
129
|
+
};
|
|
96
130
|
export interface ComponentSetupContext<TElement = PlatformElement, TProps extends Record<string, any> = {}, TEvents extends Record<string, any> = {}, TRef = any, TSlots = {}> extends SetupContext {
|
|
97
131
|
el: TElement;
|
|
98
132
|
signal: typeof signal;
|
|
99
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Component props - can be called with defaults or accessed directly.
|
|
135
|
+
* After calling with defaults, direct property access uses those defaults.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```tsx
|
|
139
|
+
* // Set defaults once
|
|
140
|
+
* props({ variant: "primary", size: "md" });
|
|
141
|
+
*
|
|
142
|
+
* // Then use props directly with defaults applied
|
|
143
|
+
* return () => <button class={props.variant}>...</button>
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
props: PropsAccessor<TProps>;
|
|
100
147
|
slots: SlotsObject<TSlots>;
|
|
101
148
|
emit: EmitFn<TEvents>;
|
|
102
149
|
parent: any | null;
|
|
103
150
|
onMount(fn: (ctx: MountContext<TElement>) => void): void;
|
|
104
151
|
onCleanup(fn: (ctx: MountContext<TElement>) => void): void;
|
|
105
152
|
expose(exposed: TRef): void;
|
|
153
|
+
/**
|
|
154
|
+
* The current render function. Can be replaced directly for HMR.
|
|
155
|
+
* @internal Used by HMR - set this, then call update()
|
|
156
|
+
*/
|
|
157
|
+
renderFn: ViewFn | null;
|
|
158
|
+
/**
|
|
159
|
+
* Force the component to re-render using the current renderFn.
|
|
160
|
+
* For HMR: first set ctx.renderFn to the new render function, then call update().
|
|
161
|
+
*/
|
|
162
|
+
update(): void;
|
|
106
163
|
}
|
|
107
164
|
export declare function getCurrentInstance(): ComponentSetupContext<any, any, any, any, {}> | null;
|
|
108
165
|
export declare function setCurrentInstance(ctx: ComponentSetupContext<any, any, any> | null): ComponentSetupContext<any, any, any, any, {}> | null;
|
|
@@ -111,14 +168,15 @@ export declare function onCleanup(fn: (ctx: MountContext) => void): void;
|
|
|
111
168
|
export type ViewFn = () => JSXElement | JSXElement[] | undefined;
|
|
112
169
|
/**
|
|
113
170
|
* Type for component setup functions.
|
|
171
|
+
* Includes Props, Events, Ref and Slots generics to preserve type information.
|
|
114
172
|
*/
|
|
115
|
-
export type SetupFn<TSlots = {}> = (ctx: ComponentSetupContext<
|
|
173
|
+
export type SetupFn<TProps extends Record<string, any> = {}, TEvents extends Record<string, any> = {}, TRef = any, TSlots = {}> = (ctx: ComponentSetupContext<PlatformElement, TProps, TEvents, TRef, TSlots>) => ViewFn;
|
|
116
174
|
/**
|
|
117
175
|
* Get component metadata (for DevTools)
|
|
118
176
|
*/
|
|
119
177
|
export declare function getComponentMeta(factory: Function): {
|
|
120
178
|
name?: string;
|
|
121
|
-
setup: SetupFn<any>;
|
|
179
|
+
setup: SetupFn<any, any, any, any>;
|
|
122
180
|
} | undefined;
|
|
123
181
|
/**
|
|
124
182
|
* Helper to create a proxy that tracks property access
|
|
@@ -182,7 +240,7 @@ export type ComponentFactory<TCombined extends Record<string, any>, TRef, TSlots
|
|
|
182
240
|
children?: any;
|
|
183
241
|
}) => JSXElement) & {
|
|
184
242
|
/** @internal Setup function for the renderer */
|
|
185
|
-
__setup: SetupFn<TSlots>;
|
|
243
|
+
__setup: SetupFn<StripInternalMarkers<TCombined>, TCombined, TRef, TSlots>;
|
|
186
244
|
/** @internal Component name for debugging */
|
|
187
245
|
__name?: string;
|
|
188
246
|
/** @internal Type brand for props */
|
package/dist/component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from './plugins.js';
|
|
|
3
3
|
export * from './app.js';
|
|
4
4
|
export * from './component.js';
|
|
5
5
|
export * from './jsx-runtime.js';
|
|
6
|
+
export * from './lazy.js';
|
|
6
7
|
export { Utils } from './utils/index.js';
|
|
7
8
|
export * from './models/index.js';
|
|
8
9
|
export * from './messaging/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -405,6 +405,190 @@ function jsxs(type, props, key) {
|
|
|
405
405
|
}
|
|
406
406
|
const jsxDEV = jsx;
|
|
407
407
|
|
|
408
|
+
//#endregion
|
|
409
|
+
//#region src/lazy.tsx
|
|
410
|
+
/**
|
|
411
|
+
* Lazy loading utilities for sigx components.
|
|
412
|
+
*
|
|
413
|
+
* Provides runtime-only lazy loading with no build dependencies.
|
|
414
|
+
* Works with any bundler that supports dynamic import().
|
|
415
|
+
*/
|
|
416
|
+
let currentSuspenseBoundary = null;
|
|
417
|
+
/**
|
|
418
|
+
* Register a promise with the current Suspense boundary
|
|
419
|
+
* @internal
|
|
420
|
+
*/
|
|
421
|
+
function registerPendingPromise(promise) {
|
|
422
|
+
const boundary = currentSuspenseBoundary;
|
|
423
|
+
if (boundary) {
|
|
424
|
+
boundary.pending.add(promise);
|
|
425
|
+
promise.finally(() => {
|
|
426
|
+
boundary.pending.delete(promise);
|
|
427
|
+
if (boundary.pending.size === 0) boundary.onResolve();
|
|
428
|
+
});
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Create a lazy-loaded component wrapper.
|
|
435
|
+
*
|
|
436
|
+
* The component will be loaded on first render. Use with `<Suspense>` to show
|
|
437
|
+
* a fallback while loading.
|
|
438
|
+
*
|
|
439
|
+
* @param loader - Function that returns a Promise resolving to the component
|
|
440
|
+
* @returns A component factory that loads the real component on demand
|
|
441
|
+
*
|
|
442
|
+
* @example
|
|
443
|
+
* ```tsx
|
|
444
|
+
* import { lazy, Suspense } from 'sigx';
|
|
445
|
+
*
|
|
446
|
+
* // Component will be in a separate chunk
|
|
447
|
+
* const HeavyChart = lazy(() => import('./components/HeavyChart'));
|
|
448
|
+
*
|
|
449
|
+
* // Usage
|
|
450
|
+
* <Suspense fallback={<Spinner />}>
|
|
451
|
+
* <HeavyChart data={chartData} />
|
|
452
|
+
* </Suspense>
|
|
453
|
+
*
|
|
454
|
+
* // Preload on hover
|
|
455
|
+
* <button onMouseEnter={() => HeavyChart.preload()}>
|
|
456
|
+
* Show Chart
|
|
457
|
+
* </button>
|
|
458
|
+
* ```
|
|
459
|
+
*/
|
|
460
|
+
function lazy(loader) {
|
|
461
|
+
let Component = null;
|
|
462
|
+
let promise = null;
|
|
463
|
+
let error = null;
|
|
464
|
+
let state = "pending";
|
|
465
|
+
const LazyWrapper = defineComponent((ctx) => {
|
|
466
|
+
const loadState = ctx.signal({
|
|
467
|
+
state,
|
|
468
|
+
tick: 0
|
|
469
|
+
});
|
|
470
|
+
if (!promise) promise = loader().then((mod) => {
|
|
471
|
+
Component = "default" in mod ? mod.default : mod;
|
|
472
|
+
state = "resolved";
|
|
473
|
+
loadState.state = "resolved";
|
|
474
|
+
loadState.tick++;
|
|
475
|
+
return Component;
|
|
476
|
+
}).catch((err) => {
|
|
477
|
+
error = err instanceof Error ? err : new Error(String(err));
|
|
478
|
+
state = "rejected";
|
|
479
|
+
loadState.state = "rejected";
|
|
480
|
+
loadState.tick++;
|
|
481
|
+
throw error;
|
|
482
|
+
});
|
|
483
|
+
if (state === "resolved" && Component) return () => {
|
|
484
|
+
return jsx(Component, {});
|
|
485
|
+
};
|
|
486
|
+
if (state === "rejected" && error) throw error;
|
|
487
|
+
if (!registerPendingPromise(promise)) promise.catch(() => {});
|
|
488
|
+
return () => {
|
|
489
|
+
const currentState = loadState.state;
|
|
490
|
+
loadState.tick;
|
|
491
|
+
if (currentState === "resolved" && Component) return jsx(Component, {});
|
|
492
|
+
if (currentState === "rejected" && error) throw error;
|
|
493
|
+
return null;
|
|
494
|
+
};
|
|
495
|
+
}, { name: "LazyComponent" });
|
|
496
|
+
LazyWrapper.__lazy = true;
|
|
497
|
+
LazyWrapper.preload = () => {
|
|
498
|
+
if (!promise) promise = loader().then((mod) => {
|
|
499
|
+
Component = "default" in mod ? mod.default : mod;
|
|
500
|
+
state = "resolved";
|
|
501
|
+
return Component;
|
|
502
|
+
}).catch((err) => {
|
|
503
|
+
error = err instanceof Error ? err : new Error(String(err));
|
|
504
|
+
state = "rejected";
|
|
505
|
+
throw error;
|
|
506
|
+
});
|
|
507
|
+
return promise;
|
|
508
|
+
};
|
|
509
|
+
LazyWrapper.isLoaded = () => {
|
|
510
|
+
return state === "resolved";
|
|
511
|
+
};
|
|
512
|
+
return LazyWrapper;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Suspense boundary component for handling async loading states.
|
|
516
|
+
*
|
|
517
|
+
* Wraps lazy-loaded components and shows a fallback while they load.
|
|
518
|
+
*
|
|
519
|
+
* @example
|
|
520
|
+
* ```tsx
|
|
521
|
+
* import { lazy, Suspense } from 'sigx';
|
|
522
|
+
*
|
|
523
|
+
* const LazyDashboard = lazy(() => import('./Dashboard'));
|
|
524
|
+
*
|
|
525
|
+
* // Basic usage
|
|
526
|
+
* <Suspense fallback={<div>Loading...</div>}>
|
|
527
|
+
* <LazyDashboard />
|
|
528
|
+
* </Suspense>
|
|
529
|
+
*
|
|
530
|
+
* // With spinner component
|
|
531
|
+
* <Suspense fallback={<Spinner size="large" />}>
|
|
532
|
+
* <LazyDashboard />
|
|
533
|
+
* <LazyCharts />
|
|
534
|
+
* </Suspense>
|
|
535
|
+
* ```
|
|
536
|
+
*/
|
|
537
|
+
const Suspense = defineComponent((ctx) => {
|
|
538
|
+
const { props, slots } = ctx;
|
|
539
|
+
const state = ctx.signal({
|
|
540
|
+
isReady: false,
|
|
541
|
+
pendingCount: 0
|
|
542
|
+
});
|
|
543
|
+
const boundary = {
|
|
544
|
+
pending: /* @__PURE__ */ new Set(),
|
|
545
|
+
onResolve: () => {
|
|
546
|
+
state.pendingCount = boundary.pending.size;
|
|
547
|
+
if (boundary.pending.size === 0) state.isReady = true;
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
ctx.onMount(() => {
|
|
551
|
+
if (boundary.pending.size === 0) state.isReady = true;
|
|
552
|
+
});
|
|
553
|
+
return () => {
|
|
554
|
+
state.isReady;
|
|
555
|
+
state.pendingCount;
|
|
556
|
+
const prevBoundary = currentSuspenseBoundary;
|
|
557
|
+
currentSuspenseBoundary = boundary;
|
|
558
|
+
try {
|
|
559
|
+
const children = slots.default();
|
|
560
|
+
if (boundary.pending.size > 0) {
|
|
561
|
+
const fallback = props.fallback;
|
|
562
|
+
if (typeof fallback === "function") return fallback();
|
|
563
|
+
return fallback ?? null;
|
|
564
|
+
}
|
|
565
|
+
if (Array.isArray(children)) {
|
|
566
|
+
const filtered = children.filter((c) => c != null && c !== false && c !== true);
|
|
567
|
+
if (filtered.length === 0) return null;
|
|
568
|
+
if (filtered.length === 1) return filtered[0];
|
|
569
|
+
return filtered;
|
|
570
|
+
}
|
|
571
|
+
return children;
|
|
572
|
+
} catch (err) {
|
|
573
|
+
if (err instanceof Promise) {
|
|
574
|
+
registerPendingPromise(err);
|
|
575
|
+
const fallback = props.fallback;
|
|
576
|
+
if (typeof fallback === "function") return fallback();
|
|
577
|
+
return fallback ?? null;
|
|
578
|
+
}
|
|
579
|
+
throw err;
|
|
580
|
+
} finally {
|
|
581
|
+
currentSuspenseBoundary = prevBoundary;
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
}, { name: "Suspense" });
|
|
585
|
+
/**
|
|
586
|
+
* Check if a component is a lazy-loaded component
|
|
587
|
+
*/
|
|
588
|
+
function isLazyComponent(component) {
|
|
589
|
+
return component && component.__lazy === true;
|
|
590
|
+
}
|
|
591
|
+
|
|
408
592
|
//#endregion
|
|
409
593
|
//#region src/utils/index.ts
|
|
410
594
|
var Utils = class {
|
|
@@ -715,7 +899,6 @@ function isComponent(type) {
|
|
|
715
899
|
}
|
|
716
900
|
function createRenderer(options) {
|
|
717
901
|
const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, cloneNode: hostCloneNode, insertStaticContent: hostInsertStaticContent } = options;
|
|
718
|
-
let isPatching = false;
|
|
719
902
|
let currentAppContext = null;
|
|
720
903
|
function render(element, container, appContext) {
|
|
721
904
|
if (appContext) currentAppContext = appContext;
|
|
@@ -729,6 +912,13 @@ function createRenderer(options) {
|
|
|
729
912
|
dom: null,
|
|
730
913
|
text: element
|
|
731
914
|
};
|
|
915
|
+
else if (isComponent(element)) vnode = {
|
|
916
|
+
type: element,
|
|
917
|
+
props: {},
|
|
918
|
+
key: null,
|
|
919
|
+
children: [],
|
|
920
|
+
dom: null
|
|
921
|
+
};
|
|
732
922
|
else vnode = element;
|
|
733
923
|
if (vnode) {
|
|
734
924
|
if (oldVNode) patch(oldVNode, vnode, container);
|
|
@@ -740,6 +930,7 @@ function createRenderer(options) {
|
|
|
740
930
|
}
|
|
741
931
|
}
|
|
742
932
|
function mount(vnode, container, before = null) {
|
|
933
|
+
if (vnode == null || vnode === false || vnode === true) return;
|
|
743
934
|
if (vnode.type === Text) {
|
|
744
935
|
const node = hostCreateText(String(vnode.text));
|
|
745
936
|
vnode.dom = node;
|
|
@@ -751,7 +942,7 @@ function createRenderer(options) {
|
|
|
751
942
|
const anchor = hostCreateComment("");
|
|
752
943
|
vnode.dom = anchor;
|
|
753
944
|
hostInsert(anchor, container, before);
|
|
754
|
-
vnode.children.forEach((child) => mount(child, container, anchor));
|
|
945
|
+
if (vnode.children) vnode.children.forEach((child) => mount(child, container, anchor));
|
|
755
946
|
return;
|
|
756
947
|
}
|
|
757
948
|
if (isComponent(vnode.type)) {
|
|
@@ -768,17 +959,18 @@ function createRenderer(options) {
|
|
|
768
959
|
else if (typeof vnode.props.ref === "object") vnode.props.ref.current = element;
|
|
769
960
|
}
|
|
770
961
|
}
|
|
771
|
-
vnode.children.forEach((child) => {
|
|
962
|
+
if (vnode.children) vnode.children.forEach((child) => {
|
|
772
963
|
child.parent = vnode;
|
|
773
964
|
mount(child, element);
|
|
774
965
|
});
|
|
775
966
|
hostInsert(element, container, before);
|
|
776
967
|
}
|
|
777
968
|
function unmount(vnode, container) {
|
|
778
|
-
|
|
969
|
+
const internalVNode = vnode;
|
|
970
|
+
if (internalVNode._effect) internalVNode._effect.stop();
|
|
779
971
|
if (vnode.cleanup) vnode.cleanup();
|
|
780
972
|
if (isComponent(vnode.type)) {
|
|
781
|
-
const subTree =
|
|
973
|
+
const subTree = internalVNode._subTree;
|
|
782
974
|
if (subTree) unmount(subTree, container);
|
|
783
975
|
if (vnode.dom) hostRemove(vnode.dom);
|
|
784
976
|
if (vnode.props?.ref) {
|
|
@@ -788,7 +980,7 @@ function createRenderer(options) {
|
|
|
788
980
|
return;
|
|
789
981
|
}
|
|
790
982
|
if (vnode.type === Fragment) {
|
|
791
|
-
vnode.children.forEach((child) => unmount(child, container));
|
|
983
|
+
if (vnode.children) vnode.children.forEach((child) => unmount(child, container));
|
|
792
984
|
if (vnode.dom) hostRemove(vnode.dom);
|
|
793
985
|
return;
|
|
794
986
|
}
|
|
@@ -808,13 +1000,15 @@ function createRenderer(options) {
|
|
|
808
1000
|
mount(newVNode, parent, nextSibling);
|
|
809
1001
|
return;
|
|
810
1002
|
}
|
|
811
|
-
|
|
1003
|
+
const oldInternal = oldVNode;
|
|
1004
|
+
const newInternal = newVNode;
|
|
1005
|
+
if (oldInternal._effect) {
|
|
812
1006
|
newVNode.dom = oldVNode.dom;
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
const props =
|
|
817
|
-
|
|
1007
|
+
newInternal._effect = oldInternal._effect;
|
|
1008
|
+
newInternal._subTree = oldInternal._subTree;
|
|
1009
|
+
newInternal._slots = oldInternal._slots;
|
|
1010
|
+
const props = oldInternal._componentProps;
|
|
1011
|
+
newInternal._componentProps = props;
|
|
818
1012
|
if (props) {
|
|
819
1013
|
const newProps$1 = newVNode.props || {};
|
|
820
1014
|
untrack(() => {
|
|
@@ -824,20 +1018,20 @@ function createRenderer(options) {
|
|
|
824
1018
|
for (const key in props) if (!(key in newProps$1) && key !== "children" && key !== "key" && key !== "ref") delete props[key];
|
|
825
1019
|
});
|
|
826
1020
|
}
|
|
827
|
-
const slotsRef =
|
|
1021
|
+
const slotsRef = oldInternal._slots;
|
|
828
1022
|
const newChildren = newVNode.props?.children;
|
|
829
1023
|
const newSlotsFromProps = newVNode.props?.slots;
|
|
830
1024
|
if (slotsRef) {
|
|
831
1025
|
if (newChildren !== void 0) slotsRef._children = newChildren;
|
|
832
1026
|
if (newSlotsFromProps !== void 0) slotsRef._slotsFromProps = newSlotsFromProps;
|
|
833
|
-
if (!
|
|
834
|
-
|
|
1027
|
+
if (!slotsRef._isPatching) {
|
|
1028
|
+
slotsRef._isPatching = true;
|
|
835
1029
|
try {
|
|
836
1030
|
untrack(() => {
|
|
837
1031
|
slotsRef._version.v++;
|
|
838
1032
|
});
|
|
839
1033
|
} finally {
|
|
840
|
-
|
|
1034
|
+
slotsRef._isPatching = false;
|
|
841
1035
|
}
|
|
842
1036
|
}
|
|
843
1037
|
}
|
|
@@ -942,6 +1136,43 @@ function createRenderer(options) {
|
|
|
942
1136
|
for (let i = beginIdx; i <= endIdx; i++) if (children[i] && isSameVNode(children[i], newChild)) return i;
|
|
943
1137
|
return null;
|
|
944
1138
|
}
|
|
1139
|
+
/**
|
|
1140
|
+
* Creates a props accessor that can be called with defaults or accessed directly.
|
|
1141
|
+
* After calling with defaults, direct property access uses those defaults.
|
|
1142
|
+
*/
|
|
1143
|
+
function createPropsAccessor(reactiveProps) {
|
|
1144
|
+
let defaults = {};
|
|
1145
|
+
const proxy = new Proxy(function propsAccessor() {}, {
|
|
1146
|
+
get(_, key) {
|
|
1147
|
+
if (typeof key === "symbol") return void 0;
|
|
1148
|
+
const value = reactiveProps[key];
|
|
1149
|
+
return value != null ? value : defaults[key];
|
|
1150
|
+
},
|
|
1151
|
+
apply(_, __, args) {
|
|
1152
|
+
if (args[0] && typeof args[0] === "object") defaults = {
|
|
1153
|
+
...defaults,
|
|
1154
|
+
...args[0]
|
|
1155
|
+
};
|
|
1156
|
+
return proxy;
|
|
1157
|
+
},
|
|
1158
|
+
has(_, key) {
|
|
1159
|
+
if (typeof key === "symbol") return false;
|
|
1160
|
+
return key in reactiveProps || key in defaults;
|
|
1161
|
+
},
|
|
1162
|
+
ownKeys() {
|
|
1163
|
+
return [...new Set([...Object.keys(reactiveProps), ...Object.keys(defaults)])];
|
|
1164
|
+
},
|
|
1165
|
+
getOwnPropertyDescriptor(_, key) {
|
|
1166
|
+
if (typeof key === "symbol") return void 0;
|
|
1167
|
+
if (key in reactiveProps || key in defaults) return {
|
|
1168
|
+
enumerable: true,
|
|
1169
|
+
configurable: true,
|
|
1170
|
+
writable: false
|
|
1171
|
+
};
|
|
1172
|
+
}
|
|
1173
|
+
});
|
|
1174
|
+
return proxy;
|
|
1175
|
+
}
|
|
945
1176
|
function mountComponent(vnode, container, before, setup) {
|
|
946
1177
|
const anchor = hostCreateComment("");
|
|
947
1178
|
vnode.dom = anchor;
|
|
@@ -951,9 +1182,10 @@ function createRenderer(options) {
|
|
|
951
1182
|
let exposeCalled = false;
|
|
952
1183
|
const { children, slots: slotsFromProps, ...propsData } = vnode.props || {};
|
|
953
1184
|
const reactiveProps = signal$1(propsData);
|
|
954
|
-
|
|
1185
|
+
const internalVNode = vnode;
|
|
1186
|
+
internalVNode._componentProps = reactiveProps;
|
|
955
1187
|
const slots = createSlots(children, slotsFromProps);
|
|
956
|
-
|
|
1188
|
+
internalVNode._slots = slots;
|
|
957
1189
|
const mountHooks = [];
|
|
958
1190
|
const cleanupHooks = [];
|
|
959
1191
|
const parentInstance = getCurrentInstance();
|
|
@@ -961,7 +1193,7 @@ function createRenderer(options) {
|
|
|
961
1193
|
const ctx = {
|
|
962
1194
|
el: container,
|
|
963
1195
|
signal: signal$1,
|
|
964
|
-
props: reactiveProps,
|
|
1196
|
+
props: createPropsAccessor(reactiveProps),
|
|
965
1197
|
slots,
|
|
966
1198
|
emit: (event, ...args) => {
|
|
967
1199
|
const handler = reactiveProps[`on${event[0].toUpperCase() + event.slice(1)}`];
|
|
@@ -977,7 +1209,9 @@ function createRenderer(options) {
|
|
|
977
1209
|
expose: (exposedValue) => {
|
|
978
1210
|
exposed = exposedValue;
|
|
979
1211
|
exposeCalled = true;
|
|
980
|
-
}
|
|
1212
|
+
},
|
|
1213
|
+
renderFn: null,
|
|
1214
|
+
update: () => {}
|
|
981
1215
|
};
|
|
982
1216
|
ctx.__name = componentName;
|
|
983
1217
|
if (currentAppContext) ctx._appContext = currentAppContext;
|
|
@@ -1001,24 +1235,31 @@ function createRenderer(options) {
|
|
|
1001
1235
|
if (typeof vnode.props.ref === "function") vnode.props.ref(refValue);
|
|
1002
1236
|
else if (vnode.props.ref && typeof vnode.props.ref === "object") vnode.props.ref.current = refValue;
|
|
1003
1237
|
}
|
|
1004
|
-
if (renderFn)
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
const
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1238
|
+
if (renderFn) {
|
|
1239
|
+
ctx.renderFn = renderFn;
|
|
1240
|
+
const componentEffect = effect(() => {
|
|
1241
|
+
const prevInstance = setCurrentInstance(ctx);
|
|
1242
|
+
try {
|
|
1243
|
+
const subTreeResult = ctx.renderFn();
|
|
1244
|
+
if (subTreeResult == null) return;
|
|
1245
|
+
const subTree = normalizeSubTree(subTreeResult);
|
|
1246
|
+
const prevSubTree = internalVNode._subTree;
|
|
1247
|
+
if (prevSubTree) {
|
|
1248
|
+
patch(prevSubTree, subTree, container);
|
|
1249
|
+
notifyComponentUpdated(currentAppContext, componentInstance);
|
|
1250
|
+
} else mount(subTree, container, anchor);
|
|
1251
|
+
internalVNode._subTree = subTree;
|
|
1252
|
+
} catch (err) {
|
|
1253
|
+
if (!handleComponentError(currentAppContext, err, componentInstance, "render")) throw err;
|
|
1254
|
+
} finally {
|
|
1255
|
+
setCurrentInstance(prevInstance);
|
|
1256
|
+
}
|
|
1257
|
+
});
|
|
1258
|
+
internalVNode._effect = componentEffect;
|
|
1259
|
+
ctx.update = () => {
|
|
1260
|
+
componentEffect();
|
|
1261
|
+
};
|
|
1262
|
+
}
|
|
1022
1263
|
const mountCtx = { el: container };
|
|
1023
1264
|
mountHooks.forEach((hook) => hook(mountCtx));
|
|
1024
1265
|
notifyComponentMounted(currentAppContext, componentInstance);
|
|
@@ -1058,11 +1299,12 @@ function createRenderer(options) {
|
|
|
1058
1299
|
_children: children,
|
|
1059
1300
|
_slotsFromProps: slotsFromProps || {},
|
|
1060
1301
|
_version: versionSignal,
|
|
1302
|
+
_isPatching: false,
|
|
1061
1303
|
default: function() {
|
|
1062
1304
|
this._version.v;
|
|
1063
1305
|
const c = this._children;
|
|
1064
1306
|
const { defaultChildren } = extractNamedSlotsFromChildren(c);
|
|
1065
|
-
return defaultChildren;
|
|
1307
|
+
return defaultChildren.filter((child) => child != null && child !== false && child !== true);
|
|
1066
1308
|
}
|
|
1067
1309
|
};
|
|
1068
1310
|
return new Proxy(slotsObj, { get(target, prop) {
|
|
@@ -1081,6 +1323,8 @@ function createRenderer(options) {
|
|
|
1081
1323
|
}
|
|
1082
1324
|
/**
|
|
1083
1325
|
* Normalize render result to a VNode (wrapping arrays in Fragment)
|
|
1326
|
+
* Note: Falsy values (null, undefined, false, true) from conditional rendering
|
|
1327
|
+
* are handled by mount() which guards against them, so no filtering needed here.
|
|
1084
1328
|
*/
|
|
1085
1329
|
function normalizeSubTree(result) {
|
|
1086
1330
|
if (Array.isArray(result)) return {
|
|
@@ -1119,5 +1363,5 @@ function createRenderer(options) {
|
|
|
1119
1363
|
}
|
|
1120
1364
|
|
|
1121
1365
|
//#endregion
|
|
1122
|
-
export { AppContextKey, Fragment, InstanceLifetimes, SubscriptionHandler, Text, Utils, createPropsProxy, createRenderer, createTopic, defineApp, defineComponent, defineFactory, defineInjectable, defineProvide, defineStore, getComponentMeta, getComponentPlugins, getCurrentInstance, getDefaultMount, getPlatformSyncProcessor, guid, handleComponentError, inject, injectApp, jsx, jsxDEV, jsxs, notifyComponentCreated, notifyComponentMounted, notifyComponentUnmounted, notifyComponentUpdated, onCleanup, onMount, provide, registerComponentPlugin, setCurrentInstance, setDefaultMount, setPlatformSyncProcessor, signal, toSubscriber, valueOf };
|
|
1366
|
+
export { AppContextKey, Fragment, InstanceLifetimes, SubscriptionHandler, Suspense, Text, Utils, createPropsProxy, createRenderer, createTopic, defineApp, defineComponent, defineFactory, defineInjectable, defineProvide, defineStore, getComponentMeta, getComponentPlugins, getCurrentInstance, getDefaultMount, getPlatformSyncProcessor, guid, handleComponentError, inject, injectApp, isLazyComponent, jsx, jsxDEV, jsxs, lazy, notifyComponentCreated, notifyComponentMounted, notifyComponentUnmounted, notifyComponentUpdated, onCleanup, onMount, provide, registerComponentPlugin, registerPendingPromise, setCurrentInstance, setDefaultMount, setPlatformSyncProcessor, signal, toSubscriber, valueOf };
|
|
1123
1367
|
//# sourceMappingURL=index.js.map
|