@viewfly/core 2.0.0-alpha.7 → 2.1.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.
@@ -191,22 +191,6 @@ declare class ReflectiveInjector implements Injector {
191
191
 
192
192
  declare function makeError(name: string): (message: string) => Error;
193
193
 
194
- interface Props {
195
- children?: JSXNode | JSXNode[];
196
- }
197
- declare function Fragment(props: Props): () => JSXNode | JSXNode[];
198
- type Key = number | string;
199
- declare function jsx(type: string | ComponentSetup, props: Props & Record<string, any>, key?: Key): ViewFlyNode;
200
- declare const jsxs: typeof jsx;
201
- interface ViewFlyNode<T = string | ComponentSetup> {
202
- type: T;
203
- props: Props & Record<string, any>;
204
- key?: Key;
205
- }
206
- declare const JSXNodeFactory: {
207
- createNode<T = string | ComponentSetup<any>>(type: T, props: Props & Record<string, any>, key?: Key): ViewFlyNode<T>;
208
- };
209
-
210
194
  declare function comparePropsWithCallbacks(oldProps: Record<string, any>, newProps: Record<string, any>, onDeleted: (key: string, oldValue: any) => void, onAdded: (key: string, value: any) => void, onUpdated: (key: string, newValue: any, oldValue: any) => void): void;
211
195
  declare const TextAtomType: unique symbol;
212
196
  declare const ElementAtomType: unique symbol;
@@ -267,6 +251,63 @@ declare abstract class NativeRenderer<ElementNode = NativeNode, TextNode = Nativ
267
251
  abstract getNameSpace(type: string, namespace: ElementNamespace): string | void;
268
252
  }
269
253
 
254
+ interface Props {
255
+ children?: JSXNode | JSXNode[];
256
+ }
257
+ declare function Fragment(props: Props): () => JSXNode | JSXNode[];
258
+ type Key = number | string;
259
+ declare function jsx(type: string | ComponentSetup, props: Props & Record<string, any>, key?: Key): ViewFlyNode;
260
+ declare const jsxs: typeof jsx;
261
+ interface ViewFlyNode<T = string | ComponentSetup> {
262
+ type: T;
263
+ props: Props & Record<string, any>;
264
+ key?: Key;
265
+ }
266
+ declare const JSXNodeFactory: {
267
+ createNode<T = string | ComponentSetup<any>>(type: T, props: Props & Record<string, any>, key?: Key): ViewFlyNode<T>;
268
+ };
269
+ /**
270
+ * 给组件的视图元素节点添加自定义属性标记
271
+ * @param marks
272
+ * @param setup
273
+ * @example
274
+ * ```tsx
275
+ * const App = withMark('mark', function(props) {
276
+ * return () => {
277
+ * return <div>...</div>
278
+ * }
279
+ * })
280
+ * ```
281
+ */
282
+ declare function withMark<T extends ComponentSetup>(marks: string | string[], setup: T): T;
283
+ declare function applyMark(mark: string | string[], render: () => JSXNode): JSXNode;
284
+ interface PortalProps<T extends NativeNode> extends Props {
285
+ host: T;
286
+ }
287
+ /**
288
+ * 将子节点渲染到指定节点
289
+ * @param props
290
+ * @example
291
+ * ```tsx
292
+ * function App() {
293
+ * const modal = document.getElementById('modal')!
294
+ * return () => {
295
+ * return (
296
+ * <div>
297
+ * <Portal host={modal}>
298
+ * 这里的内容将渲染到 modal 节点
299
+ * </Portal>
300
+ * </div>
301
+ * )
302
+ * }
303
+ * }
304
+ * ```
305
+ */
306
+ declare function Portal<T extends NativeNode>(props: PortalProps<T>): {
307
+ $portalHost: T;
308
+ $render(): JSXNode | JSXNode[];
309
+ };
310
+
270
311
  interface RefListener<T> {
271
312
  (current: T): void | (() => void);
272
313
  }
@@ -305,7 +346,8 @@ declare class DynamicRef<T> {
305
346
  */
306
347
  declare function createDynamicRef<T, U = ExtractInstanceType<T>>(callback: RefListener<U>): DynamicRef<U>;
307
348
  declare class StaticRef<T> extends DynamicRef<T> {
308
- readonly current: T | null;
349
+ get current(): T | null;
350
+ private _current;
309
351
  constructor();
310
352
  }
311
353
  declare function createRef<T, U = ExtractInstanceType<T>>(): StaticRef<U>;
@@ -489,6 +531,11 @@ declare function getDepContext(): Dep | undefined;
489
531
  declare function pushDepContext(dep: Dep): void;
490
532
  declare function popDepContext(): void;
491
533
 
534
+ /**
535
+ * @deprecated 即将弃用,Viewfly 默认就有 memo 的效果
536
+ * @param canUseMemo
537
+ * @param render
538
+ */
492
539
  declare function withMemo<T extends Props = Props>(canUseMemo: ComponentInstance<T>['$useMemo'], render: () => JSXNode): ComponentInstance<T>;
493
540
 
494
541
  declare function createRenderer(component: Component, nativeRenderer: NativeRenderer, namespace: ElementNamespace): (host: NativeNode) => void;
@@ -718,4 +765,4 @@ declare function createEffect<T, T1, T2, T3, T4, T5, T6, T7>(deps: [Signal<T>, S
718
765
  declare function createEffect<T>(deps: () => T, callback: EffectCallback<T>): () => void;
719
766
  declare function createEffect<T = any>(deps: Signal<any>[], callback: EffectCallback<T[]>): () => void;
720
767
 
721
- export { type AbstractInstanceType, type AbstractProvider, type AbstractType, type Application, ArrayReactiveHandler, type Atom, type ClassNames, type ClassProvider, Component, type ComponentAnnotation, type ComponentInstance, type ComponentSetup, type ComponentViewMetadata, type Computed, type Config, type ConstructorProvider, type ContextProvider, type ContextProviderParams, Dep, DynamicRef, type EffectCallback, type ElementNamespace, type ExistingProvider, type ExtractInstanceType, type ExtractValueType, type FactoryProvider, ForwardRef, Fragment, Inject, type InjectDecorator, InjectFlags, Injectable, type InjectableDecorator, type InjectableOptions, InjectionToken, Injector, JSX, type JSXNode, JSXNodeFactory, type Key, type LifeCycleCallback, MapReactiveHandler, type Module, type NativeNode, NativeRenderer, type NormalizedProvider, NullInjector, ObjectReactiveHandler, Optional, type OptionalDecorator, Prop, type PropDecorator, type Props, type ProvideScope, type Provider, type ReactiveConfig, type RefListener, type ReflectiveDependency, ReflectiveInjector, RootComponent, Scope, Self, type SelfDecorator, SetReactiveHandler, type Signal, SkipSelf, type SkipSelfDecorator, type StaticProvider, StaticRef, THROW_IF_NOT_FOUND, TrackOpTypes, TriggerOpTypes, Type, type TypeProvider, type ValueProvider, type ViewFlyNode, comparePropsWithCallbacks, computed, createContext, createContextProvider, createDerived, createDynamicRef, createEffect, createRef, createRenderer, createSignal, defaultArrayReactiveHandler, defaultMapReactiveHandler, defaultObjectReactiveHandler, defaultSetReactiveHandler, defaultShallowArrayReactiveHandler, defaultShallowMapReactiveHandler, defaultShallowObjectReactiveHandler, defaultShallowSetReactiveHandler, forwardRef, getCurrentInstance, getDepContext, getSetupContext, inject, internalWrite, isReactive, jsx, jsxs, makeError, normalizeProvider, onMounted, onUnmounted, onUpdated, popDepContext, proxyToRawCache, pushDepContext, rawToProxyCache, reactive, readonlyProxyHandler, registryComponentDestroyCallback, shallowReactive, toRaw, track, trigger, viewfly, watch, withAnnotation, withMemo };
768
+ export { type AbstractInstanceType, type AbstractProvider, type AbstractType, type Application, ArrayReactiveHandler, type Atom, type ClassNames, type ClassProvider, Component, type ComponentAnnotation, type ComponentInstance, type ComponentSetup, type ComponentViewMetadata, type Computed, type Config, type ConstructorProvider, type ContextProvider, type ContextProviderParams, Dep, DynamicRef, type EffectCallback, type ElementNamespace, type ExistingProvider, type ExtractInstanceType, type ExtractValueType, type FactoryProvider, ForwardRef, Fragment, Inject, type InjectDecorator, InjectFlags, Injectable, type InjectableDecorator, type InjectableOptions, InjectionToken, Injector, JSX, type JSXNode, JSXNodeFactory, type Key, type LifeCycleCallback, MapReactiveHandler, type Module, type NativeNode, NativeRenderer, type NormalizedProvider, NullInjector, ObjectReactiveHandler, Optional, type OptionalDecorator, Portal, type PortalProps, Prop, type PropDecorator, type Props, type ProvideScope, type Provider, type ReactiveConfig, type RefListener, type ReflectiveDependency, ReflectiveInjector, RootComponent, Scope, Self, type SelfDecorator, SetReactiveHandler, type Signal, SkipSelf, type SkipSelfDecorator, type StaticProvider, StaticRef, THROW_IF_NOT_FOUND, TrackOpTypes, TriggerOpTypes, Type, type TypeProvider, type ValueProvider, type ViewFlyNode, applyMark, comparePropsWithCallbacks, computed, createContext, createContextProvider, createDerived, createDynamicRef, createEffect, createRef, createRenderer, createSignal, defaultArrayReactiveHandler, defaultMapReactiveHandler, defaultObjectReactiveHandler, defaultSetReactiveHandler, defaultShallowArrayReactiveHandler, defaultShallowMapReactiveHandler, defaultShallowObjectReactiveHandler, defaultShallowSetReactiveHandler, forwardRef, getCurrentInstance, getDepContext, getSetupContext, inject, internalWrite, isReactive, jsx, jsxs, makeError, normalizeProvider, onMounted, onUnmounted, onUpdated, popDepContext, proxyToRawCache, pushDepContext, rawToProxyCache, reactive, readonlyProxyHandler, registryComponentDestroyCallback, shallowReactive, toRaw, track, trigger, viewfly, watch, withAnnotation, withMark, withMemo };
@@ -727,30 +727,22 @@ class DynamicRef {
727
727
  function createDynamicRef(callback) {
728
728
  return new DynamicRef(callback);
729
729
  }
730
- const initValue = {};
731
730
  class StaticRef extends DynamicRef {
731
+ get current() {
732
+ return this._current;
733
+ }
732
734
  constructor() {
733
- let value = initValue;
734
- let isInit = false;
735
735
  super(v => {
736
- if (v !== initValue && !isInit) {
737
- value = v;
738
- isInit = true;
739
- }
736
+ this._current = v;
737
+ return () => {
738
+ this._current = null;
739
+ };
740
740
  });
741
- Object.defineProperty(this, "current", {
741
+ Object.defineProperty(this, "_current", {
742
742
  enumerable: true,
743
743
  configurable: true,
744
744
  writable: true,
745
- value: void 0
746
- });
747
- Object.defineProperty(this, 'current', {
748
- get() {
749
- if (value === initValue) {
750
- return null;
751
- }
752
- return value;
753
- }
745
+ value: null
754
746
  });
755
747
  }
756
748
  }
@@ -1653,6 +1645,80 @@ const JSXNodeFactory = {
1653
1645
  };
1654
1646
  }
1655
1647
  };
1648
+ /**
1649
+ * 给组件的视图元素节点添加自定义属性标记
1650
+ * @param marks
1651
+ * @param setup
1652
+ * @example
1653
+ * ```tsx
1654
+ * const App = withMark('mark', function(props) {
1655
+ * return () => {
1656
+ * return <div>...</div>
1657
+ * }
1658
+ * })
1659
+ * ```
1660
+ */
1661
+ function withMark(marks, setup) {
1662
+ if (!marks) {
1663
+ return setup;
1664
+ }
1665
+ return function (props) {
1666
+ const componentRenderFn = setup(props);
1667
+ const isFn = typeof componentRenderFn === 'function';
1668
+ if (isFn) {
1669
+ return function () {
1670
+ return applyMark(marks, componentRenderFn);
1671
+ };
1672
+ }
1673
+ const oldRender = componentRenderFn.$render;
1674
+ componentRenderFn.$render = function () {
1675
+ return applyMark(marks, () => {
1676
+ return oldRender.call(componentRenderFn);
1677
+ });
1678
+ };
1679
+ return componentRenderFn;
1680
+ };
1681
+ }
1682
+ function applyMark(mark, render) {
1683
+ const oldCreateNote = JSXNodeFactory.createNode;
1684
+ const spaces = Array.isArray(mark) ? mark : [mark];
1685
+ JSXNodeFactory.createNode = function (name, props, key) {
1686
+ for (const scopedId of spaces) {
1687
+ props[scopedId] = '';
1688
+ }
1689
+ return oldCreateNote.apply(JSXNodeFactory, [name, props, key]);
1690
+ };
1691
+ const vDom = render();
1692
+ JSXNodeFactory.createNode = oldCreateNote;
1693
+ return vDom;
1694
+ }
1695
+ /**
1696
+ * 将子节点渲染到指定节点
1697
+ * @param props
1698
+ * @example
1699
+ * ```tsx
1700
+ * function App() {
1701
+ * const modal = document.getElementById('modal')!
1702
+ * return () => {
1703
+ * return (
1704
+ * <div>
1705
+ * <Portal host={modal}>
1706
+ * 这里的内容将渲染到 modal 节点
1707
+ * </Portal>
1708
+ * </div>
1709
+ * )
1710
+ * }
1711
+ * }
1712
+ * ```
1713
+ */
1714
+ function Portal(props) {
1715
+ return {
1716
+ $portalHost: props.host,
1717
+ $render() {
1718
+ return props.children;
1719
+ }
1720
+ };
1721
+ }
1656
1722
 
1657
1723
  function watch(trigger, callback) {
1658
1724
  let prevFn;
@@ -1761,6 +1827,11 @@ function withAnnotation(annotation, componentSetup) {
1761
1827
  class NativeRenderer {
1762
1828
  }
1763
1829
 
1830
+ /**
1831
+ * @deprecated 即将弃用,Viewfly 默认就有 memo 的效果
1832
+ * @param canUseMemo
1833
+ * @param render
1834
+ */
1764
1835
  function withMemo(canUseMemo, render) {
1765
1836
  return {
1766
1837
  $useMemo: canUseMemo,
@@ -2626,4 +2697,4 @@ function createEffect(deps, callback) {
2626
2697
  return unWatch;
2627
2698
  }
2628
2699
 
2629
- export { ArrayReactiveHandler, Component, Dep, DynamicRef, ForwardRef, Fragment, Inject, InjectFlags, Injectable, InjectionToken, Injector, JSXNodeFactory, MapReactiveHandler, NativeRenderer, NullInjector, ObjectReactiveHandler, Optional, Prop, ReflectiveInjector, RootComponent, Scope, Self, SetReactiveHandler, SkipSelf, StaticRef, THROW_IF_NOT_FOUND, TrackOpTypes, TriggerOpTypes, Type, comparePropsWithCallbacks, computed, createContext, createContextProvider, createDerived, createDynamicRef, createEffect, createRef, createRenderer, createSignal, defaultArrayReactiveHandler, defaultMapReactiveHandler, defaultObjectReactiveHandler, defaultSetReactiveHandler, defaultShallowArrayReactiveHandler, defaultShallowMapReactiveHandler, defaultShallowObjectReactiveHandler, defaultShallowSetReactiveHandler, forwardRef, getCurrentInstance, getDepContext, getSetupContext, inject, internalWrite, isReactive, jsx, jsxs, makeError, normalizeProvider, onMounted, onUnmounted, onUpdated, popDepContext, proxyToRawCache, pushDepContext, rawToProxyCache, reactive, readonlyProxyHandler, registryComponentDestroyCallback, shallowReactive, toRaw, track, trigger, viewfly, watch, withAnnotation, withMemo };
2700
+ export { ArrayReactiveHandler, Component, Dep, DynamicRef, ForwardRef, Fragment, Inject, InjectFlags, Injectable, InjectionToken, Injector, JSXNodeFactory, MapReactiveHandler, NativeRenderer, NullInjector, ObjectReactiveHandler, Optional, Portal, Prop, ReflectiveInjector, RootComponent, Scope, Self, SetReactiveHandler, SkipSelf, StaticRef, THROW_IF_NOT_FOUND, TrackOpTypes, TriggerOpTypes, Type, applyMark, comparePropsWithCallbacks, computed, createContext, createContextProvider, createDerived, createDynamicRef, createEffect, createRef, createRenderer, createSignal, defaultArrayReactiveHandler, defaultMapReactiveHandler, defaultObjectReactiveHandler, defaultSetReactiveHandler, defaultShallowArrayReactiveHandler, defaultShallowMapReactiveHandler, defaultShallowObjectReactiveHandler, defaultShallowSetReactiveHandler, forwardRef, getCurrentInstance, getDepContext, getSetupContext, inject, internalWrite, isReactive, jsx, jsxs, makeError, normalizeProvider, onMounted, onUnmounted, onUpdated, popDepContext, proxyToRawCache, pushDepContext, rawToProxyCache, reactive, readonlyProxyHandler, registryComponentDestroyCallback, shallowReactive, toRaw, track, trigger, viewfly, watch, withAnnotation, withMark, withMemo };
package/bundles/index.js CHANGED
@@ -729,30 +729,22 @@ class DynamicRef {
729
729
  function createDynamicRef(callback) {
730
730
  return new DynamicRef(callback);
731
731
  }
732
- const initValue = {};
733
732
  class StaticRef extends DynamicRef {
733
+ get current() {
734
+ return this._current;
735
+ }
734
736
  constructor() {
735
- let value = initValue;
736
- let isInit = false;
737
737
  super(v => {
738
- if (v !== initValue && !isInit) {
739
- value = v;
740
- isInit = true;
741
- }
738
+ this._current = v;
739
+ return () => {
740
+ this._current = null;
741
+ };
742
742
  });
743
- Object.defineProperty(this, "current", {
743
+ Object.defineProperty(this, "_current", {
744
744
  enumerable: true,
745
745
  configurable: true,
746
746
  writable: true,
747
- value: void 0
748
- });
749
- Object.defineProperty(this, 'current', {
750
- get() {
751
- if (value === initValue) {
752
- return null;
753
- }
754
- return value;
755
- }
747
+ value: null
756
748
  });
757
749
  }
758
750
  }
@@ -1655,6 +1647,80 @@ const JSXNodeFactory = {
1655
1647
  };
1656
1648
  }
1657
1649
  };
1650
+ /**
1651
+ * 给组件的视图元素节点添加自定义属性标记
1652
+ * @param marks
1653
+ * @param setup
1654
+ * @example
1655
+ * ```tsx
1656
+ * const App = withMark('mark', function(props) {
1657
+ * return () => {
1658
+ * return <div>...</div>
1659
+ * }
1660
+ * })
1661
+ * ```
1662
+ */
1663
+ function withMark(marks, setup) {
1664
+ if (!marks) {
1665
+ return setup;
1666
+ }
1667
+ return function (props) {
1668
+ const componentRenderFn = setup(props);
1669
+ const isFn = typeof componentRenderFn === 'function';
1670
+ if (isFn) {
1671
+ return function () {
1672
+ return applyMark(marks, componentRenderFn);
1673
+ };
1674
+ }
1675
+ const oldRender = componentRenderFn.$render;
1676
+ componentRenderFn.$render = function () {
1677
+ return applyMark(marks, () => {
1678
+ return oldRender.call(componentRenderFn);
1679
+ });
1680
+ };
1681
+ return componentRenderFn;
1682
+ };
1683
+ }
1684
+ function applyMark(mark, render) {
1685
+ const oldCreateNote = JSXNodeFactory.createNode;
1686
+ const spaces = Array.isArray(mark) ? mark : [mark];
1687
+ JSXNodeFactory.createNode = function (name, props, key) {
1688
+ for (const scopedId of spaces) {
1689
+ props[scopedId] = '';
1690
+ }
1691
+ return oldCreateNote.apply(JSXNodeFactory, [name, props, key]);
1692
+ };
1693
+ const vDom = render();
1694
+ JSXNodeFactory.createNode = oldCreateNote;
1695
+ return vDom;
1696
+ }
1697
+ /**
1698
+ * 将子节点渲染到指定节点
1699
+ * @param props
1700
+ * @example
1701
+ * ```tsx
1702
+ * function App() {
1703
+ * const modal = document.getElementById('modal')!
1704
+ * return () => {
1705
+ * return (
1706
+ * <div>
1707
+ * <Portal host={modal}>
1708
+ * 这里的内容将渲染到 modal 节点
1709
+ * </Portal>
1710
+ * </div>
1711
+ * )
1712
+ * }
1713
+ * }
1714
+ * ```
1715
+ */
1716
+ function Portal(props) {
1717
+ return {
1718
+ $portalHost: props.host,
1719
+ $render() {
1720
+ return props.children;
1721
+ }
1722
+ };
1723
+ }
1658
1724
 
1659
1725
  function watch(trigger, callback) {
1660
1726
  let prevFn;
@@ -1763,6 +1829,11 @@ function withAnnotation(annotation, componentSetup) {
1763
1829
  class NativeRenderer {
1764
1830
  }
1765
1831
 
1832
+ /**
1833
+ * @deprecated 即将弃用,Viewfly 默认就有 memo 的效果
1834
+ * @param canUseMemo
1835
+ * @param render
1836
+ */
1766
1837
  function withMemo(canUseMemo, render) {
1767
1838
  return {
1768
1839
  $useMemo: canUseMemo,
@@ -2644,6 +2715,7 @@ exports.NativeRenderer = NativeRenderer;
2644
2715
  exports.NullInjector = NullInjector;
2645
2716
  exports.ObjectReactiveHandler = ObjectReactiveHandler;
2646
2717
  exports.Optional = Optional;
2718
+ exports.Portal = Portal;
2647
2719
  exports.Prop = Prop;
2648
2720
  exports.ReflectiveInjector = ReflectiveInjector;
2649
2721
  exports.RootComponent = RootComponent;
@@ -2654,6 +2726,7 @@ exports.SkipSelf = SkipSelf;
2654
2726
  exports.StaticRef = StaticRef;
2655
2727
  exports.THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND;
2656
2728
  exports.Type = Type;
2729
+ exports.applyMark = applyMark;
2657
2730
  exports.comparePropsWithCallbacks = comparePropsWithCallbacks;
2658
2731
  exports.computed = computed;
2659
2732
  exports.createContext = createContext;
@@ -2700,4 +2773,5 @@ exports.trigger = trigger;
2700
2773
  exports.viewfly = viewfly;
2701
2774
  exports.watch = watch;
2702
2775
  exports.withAnnotation = withAnnotation;
2776
+ exports.withMark = withMark;
2703
2777
  exports.withMemo = withMemo;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viewfly/core",
3
- "version": "2.0.0-alpha.7",
3
+ "version": "2.1.0",
4
4
  "description": "Viewfly is a simple and easy-to-use JavaScript framework with an intuitive development experience.",
5
5
  "main": "./bundles/index.js",
6
6
  "module": "./bundles/index.esm.js",