@shopify/react-native-skia 0.1.176 → 0.1.180

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. package/android/CMakeLists.txt +2 -0
  2. package/cpp/jsi/JsiHostObject.cpp +13 -7
  3. package/cpp/jsi/JsiHostObject.h +3 -1
  4. package/cpp/jsi/RuntimeAwareCache.cpp +9 -0
  5. package/cpp/jsi/RuntimeAwareCache.h +101 -0
  6. package/cpp/jsi/RuntimeLifecycleMonitor.cpp +57 -0
  7. package/cpp/jsi/RuntimeLifecycleMonitor.h +32 -0
  8. package/cpp/rnskia/RNSkManager.cpp +4 -0
  9. package/cpp/rnskia/RNSkView.h +5 -3
  10. package/cpp/rnskia/dom/base/JsiDomNode.h +22 -2
  11. package/cpp/rnskia/dom/nodes/JsiImageFilterNodes.h +10 -9
  12. package/lib/commonjs/dom/nodes/paint/ImageFilters.js +10 -2
  13. package/lib/commonjs/dom/nodes/paint/ImageFilters.js.map +1 -1
  14. package/lib/commonjs/external/reanimated/index.d.ts +1 -0
  15. package/lib/commonjs/external/reanimated/index.js +13 -0
  16. package/lib/commonjs/external/reanimated/index.js.map +1 -1
  17. package/lib/commonjs/external/reanimated/moduleWrapper.d.ts +8 -0
  18. package/lib/commonjs/external/reanimated/moduleWrapper.js +68 -0
  19. package/lib/commonjs/external/reanimated/moduleWrapper.js.map +1 -0
  20. package/lib/commonjs/external/reanimated/renderHelpers.d.ts +5 -0
  21. package/lib/commonjs/external/reanimated/renderHelpers.js +81 -0
  22. package/lib/commonjs/external/reanimated/renderHelpers.js.map +1 -0
  23. package/lib/commonjs/external/reanimated/useSharedValueEffect.d.ts +2 -5
  24. package/lib/commonjs/external/reanimated/useSharedValueEffect.js +10 -25
  25. package/lib/commonjs/external/reanimated/useSharedValueEffect.js.map +1 -1
  26. package/lib/commonjs/headless/index.d.ts +3 -0
  27. package/lib/commonjs/headless/index.js +57 -0
  28. package/lib/commonjs/headless/index.js.map +1 -0
  29. package/lib/commonjs/mock/index.d.ts +1 -2
  30. package/lib/commonjs/mock/index.js +0 -4
  31. package/lib/commonjs/mock/index.js.map +1 -1
  32. package/lib/commonjs/renderer/Canvas.js +7 -1
  33. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  34. package/lib/commonjs/renderer/Container.d.ts +2 -1
  35. package/lib/commonjs/renderer/Container.js +2 -0
  36. package/lib/commonjs/renderer/Container.js.map +1 -1
  37. package/lib/commonjs/renderer/HostConfig.js +6 -4
  38. package/lib/commonjs/renderer/HostConfig.js.map +1 -1
  39. package/lib/commonjs/renderer/Reconciler.d.ts +1 -1
  40. package/lib/commonjs/renderer/Reconciler.js +2 -1
  41. package/lib/commonjs/renderer/Reconciler.js.map +1 -1
  42. package/lib/commonjs/renderer/processors/Animations/Animations.d.ts +4 -1
  43. package/lib/commonjs/renderer/processors/Animations/Animations.js.map +1 -1
  44. package/lib/module/dom/nodes/paint/ImageFilters.js +10 -2
  45. package/lib/module/dom/nodes/paint/ImageFilters.js.map +1 -1
  46. package/lib/module/external/reanimated/index.d.ts +1 -0
  47. package/lib/module/external/reanimated/index.js +1 -0
  48. package/lib/module/external/reanimated/index.js.map +1 -1
  49. package/lib/module/external/reanimated/moduleWrapper.d.ts +8 -0
  50. package/lib/module/external/reanimated/moduleWrapper.js +50 -0
  51. package/lib/module/external/reanimated/moduleWrapper.js.map +1 -0
  52. package/lib/module/external/reanimated/renderHelpers.d.ts +5 -0
  53. package/lib/module/external/reanimated/renderHelpers.js +72 -0
  54. package/lib/module/external/reanimated/renderHelpers.js.map +1 -0
  55. package/lib/module/external/reanimated/useSharedValueEffect.d.ts +2 -5
  56. package/lib/module/external/reanimated/useSharedValueEffect.js +7 -22
  57. package/lib/module/external/reanimated/useSharedValueEffect.js.map +1 -1
  58. package/lib/module/headless/index.d.ts +3 -0
  59. package/lib/module/headless/index.js +29 -0
  60. package/lib/module/headless/index.js.map +1 -0
  61. package/lib/module/mock/index.d.ts +1 -2
  62. package/lib/module/mock/index.js +0 -3
  63. package/lib/module/mock/index.js.map +1 -1
  64. package/lib/module/renderer/Canvas.js +7 -1
  65. package/lib/module/renderer/Canvas.js.map +1 -1
  66. package/lib/module/renderer/Container.d.ts +2 -1
  67. package/lib/module/renderer/Container.js +2 -0
  68. package/lib/module/renderer/Container.js.map +1 -1
  69. package/lib/module/renderer/HostConfig.js +5 -4
  70. package/lib/module/renderer/HostConfig.js.map +1 -1
  71. package/lib/module/renderer/Reconciler.d.ts +1 -1
  72. package/lib/module/renderer/Reconciler.js +2 -1
  73. package/lib/module/renderer/Reconciler.js.map +1 -1
  74. package/lib/module/renderer/processors/Animations/Animations.d.ts +4 -1
  75. package/lib/module/renderer/processors/Animations/Animations.js.map +1 -1
  76. package/lib/typescript/src/external/reanimated/index.d.ts +1 -0
  77. package/lib/typescript/src/external/reanimated/moduleWrapper.d.ts +8 -0
  78. package/lib/typescript/src/external/reanimated/renderHelpers.d.ts +5 -0
  79. package/lib/typescript/src/external/reanimated/useSharedValueEffect.d.ts +2 -5
  80. package/lib/typescript/src/headless/index.d.ts +3 -0
  81. package/lib/typescript/src/mock/index.d.ts +1 -2
  82. package/lib/typescript/src/renderer/Container.d.ts +2 -1
  83. package/lib/typescript/src/renderer/Reconciler.d.ts +1 -1
  84. package/lib/typescript/src/renderer/processors/Animations/Animations.d.ts +4 -1
  85. package/package.json +1 -1
  86. package/src/dom/nodes/paint/ImageFilters.ts +8 -2
  87. package/src/external/reanimated/index.ts +1 -0
  88. package/src/external/reanimated/moduleWrapper.ts +60 -0
  89. package/src/external/reanimated/renderHelpers.ts +70 -0
  90. package/src/external/reanimated/useSharedValueEffect.ts +17 -23
  91. package/src/headless/index.ts +31 -0
  92. package/src/mock/index.ts +0 -5
  93. package/src/renderer/Canvas.tsx +6 -2
  94. package/src/renderer/Container.tsx +2 -1
  95. package/src/renderer/HostConfig.ts +8 -2
  96. package/src/renderer/Reconciler.tsx +3 -2
  97. package/src/renderer/processors/Animations/Animations.ts +9 -1
@@ -1 +1 @@
1
- {"version":3,"names":["DefaultEventPriority","createNode","isSelector","isValue","mapKeys","shallowEq","DEBUG","debug","console","log","appendNode","parent","child","addChild","removeNode","removeChild","insertBefore","before","insertChildBefore","skHostConfig","now","Date","supportsMutation","isPrimaryRenderer","supportsPersistence","supportsHydration","scheduleTimeout","setTimeout","cancelTimeout","clearTimeout","noTimeout","appendChildToContainer","container","root","appendChild","getRootHostContext","_rootContainerInstance","getChildHostContext","_parentHostContext","_type","shouldSetTextContent","_props","createTextInstance","_text","_hostContext","_internalInstanceHandle","Error","createInstance","type","pristineProps","props","node","materialize","depMgr","subscribeNode","appendInitialChild","parentInstance","finalizeInitialChildren","commitMount","prepareForCommit","_containerInfo","resetAfterCommit","update","redraw","getPublicInstance","prepareUpdate","_instance","oldProps","newProps","rootContainerInstance","propsAreEqual","commitUpdate","instance","updatePayload","prevProps","nextProps","_internalHandle","unsubscribeNode","setProps","commitTextUpdate","_textInstance","_oldText","_newText","clearContainer","children","forEach","preparePortalMount","removeChildFromContainer","insertInContainerBefore","getCurrentEventPriority","beforeActiveInstanceBlur","afterActiveInstanceBlur","detachDeletedInstance","result","key","prop","current","selector","value"],"sources":["HostConfig.ts"],"sourcesContent":["/*global NodeJS*/\nimport type { HostConfig } from \"react-reconciler\";\nimport { DefaultEventPriority } from \"react-reconciler/constants\";\n\nimport type { NodeType, Node } from \"../dom/types\";\nimport type { SkiaValue } from \"../values\";\n\nimport type { Container } from \"./Container\";\nimport { createNode } from \"./HostComponents\";\nimport type { AnimatedProps } from \"./processors\";\nimport { isSelector, isValue } from \"./processors\";\nimport { mapKeys, shallowEq } from \"./typeddash\";\n\nconst DEBUG = false;\nexport const debug = (...args: Parameters<typeof console.log>) => {\n if (DEBUG) {\n console.log(...args);\n }\n};\n\ntype Instance = Node<unknown>;\n\ntype Props = object;\ntype TextInstance = Node<unknown>;\ntype SuspenseInstance = Instance;\ntype HydratableInstance = Instance;\ntype PublicInstance = Instance;\ntype HostContext = null;\ntype UpdatePayload = Container;\ntype ChildSet = unknown;\ntype TimeoutHandle = NodeJS.Timeout;\ntype NoTimeout = -1;\n\ntype SkiaHostConfig = HostConfig<\n NodeType,\n Props,\n Container,\n Instance,\n TextInstance,\n SuspenseInstance,\n HydratableInstance,\n PublicInstance,\n HostContext,\n UpdatePayload,\n ChildSet,\n TimeoutHandle,\n NoTimeout\n>;\n\nconst appendNode = (parent: Node<unknown>, child: Node<unknown>) => {\n parent.addChild(child);\n};\n\nconst removeNode = (parent: Node<unknown>, child: Node<unknown>) => {\n return parent.removeChild(child);\n};\n\nconst insertBefore = (\n parent: Node<unknown>,\n child: Node<unknown>,\n before: Node<unknown>\n) => {\n parent.insertChildBefore(child, before);\n};\n\nexport const skHostConfig: SkiaHostConfig = {\n /**\n * This function is used by the reconciler in order to calculate current time for prioritising work.\n */\n now: Date.now,\n supportsMutation: true,\n isPrimaryRenderer: false,\n supportsPersistence: false,\n supportsHydration: false,\n //supportsMicrotask: true,\n\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n\n appendChildToContainer(container, child) {\n debug(\"appendChildToContainer\", container, child);\n appendNode(container.root, child);\n },\n\n appendChild(parent, child) {\n debug(\"appendChild\", parent, child);\n appendNode(parent, child);\n },\n\n getRootHostContext: (_rootContainerInstance: Container) => {\n debug(\"getRootHostContext\");\n return null;\n },\n\n getChildHostContext(_parentHostContext, _type, _rootContainerInstance) {\n debug(\"getChildHostContext\");\n return null;\n },\n\n shouldSetTextContent(_type, _props) {\n return false;\n },\n\n createTextInstance(\n _text,\n _rootContainerInstance,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createTextInstance\");\n // return SpanNode({}, text) as SkNode;\n throw new Error(\"Text nodes are not supported yet\");\n },\n\n createInstance(\n type,\n pristineProps,\n container,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createInstance\", type);\n const props = { ...pristineProps };\n const node = createNode(container, type, materialize(props));\n container.depMgr.subscribeNode(node, props);\n return node;\n },\n\n appendInitialChild(parentInstance, child) {\n debug(\"appendInitialChild\");\n appendNode(parentInstance, child);\n },\n\n finalizeInitialChildren(\n parentInstance,\n _type,\n _props,\n _rootContainerInstance,\n _hostContext\n ) {\n debug(\"finalizeInitialChildren\", parentInstance);\n return false;\n },\n\n commitMount() {\n // if finalizeInitialChildren = true\n debug(\"commitMount\");\n },\n\n prepareForCommit(_containerInfo) {\n debug(\"prepareForCommit\");\n return null;\n },\n\n resetAfterCommit(container) {\n debug(\"resetAfterCommit\");\n container.depMgr.update();\n container.redraw();\n },\n\n getPublicInstance(node: Instance) {\n debug(\"getPublicInstance\");\n return node;\n },\n\n prepareUpdate: (\n _instance,\n type,\n oldProps,\n newProps,\n rootContainerInstance,\n _hostContext\n ) => {\n debug(\"prepareUpdate\");\n const propsAreEqual = shallowEq(oldProps, newProps);\n if (propsAreEqual) {\n return null;\n }\n debug(\"update \", type);\n return rootContainerInstance;\n },\n\n commitUpdate(\n instance,\n updatePayload,\n type,\n prevProps,\n nextProps,\n _internalHandle\n ) {\n debug(\"commitUpdate: \", type);\n if (shallowEq(prevProps, nextProps)) {\n return;\n }\n const props = { ...nextProps };\n updatePayload.depMgr.unsubscribeNode(instance);\n instance.setProps(materialize(props));\n updatePayload.depMgr.subscribeNode(instance, props);\n },\n\n commitTextUpdate: (\n _textInstance: TextInstance,\n _oldText: string,\n _newText: string\n ) => {\n // textInstance.instance = newText;\n },\n\n clearContainer: (container) => {\n debug(\"clearContainer\");\n container.root.children().forEach((child) => {\n container.root.removeChild(child);\n });\n },\n\n preparePortalMount: () => {\n debug(\"preparePortalMount\");\n },\n\n removeChild: (parent, child) => {\n removeNode(parent, child);\n },\n\n removeChildFromContainer: (container, child) => {\n removeNode(container.root, child);\n },\n\n insertInContainerBefore: (container, child, before) => {\n insertBefore(container.root, child, before);\n },\n\n insertBefore: (parent, child, before) => {\n insertBefore(parent, child, before);\n },\n // see https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n getCurrentEventPriority: () => DefaultEventPriority,\n beforeActiveInstanceBlur: () => {},\n afterActiveInstanceBlur: () => {},\n detachDeletedInstance: () => {},\n};\n\nconst materialize = <P>(props: AnimatedProps<P>) => {\n const result = { ...props } as P;\n mapKeys(props).forEach((key) => {\n const prop = props[key];\n if (isValue(prop)) {\n result[key] = (prop as SkiaValue<P[typeof key]>).current;\n } else if (isSelector(prop)) {\n result[key] = prop.selector(prop.value.current) as P[typeof key];\n }\n });\n\n return result;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["DefaultEventPriority","bindReanimatedProps","extractReanimatedProps","createNode","isSelector","isValue","mapKeys","shallowEq","DEBUG","debug","console","log","appendNode","parent","child","addChild","removeNode","removeChild","insertBefore","before","insertChildBefore","skHostConfig","now","Date","supportsMutation","isPrimaryRenderer","supportsPersistence","supportsHydration","scheduleTimeout","setTimeout","cancelTimeout","clearTimeout","noTimeout","appendChildToContainer","container","root","appendChild","getRootHostContext","_rootContainerInstance","getChildHostContext","_parentHostContext","_type","shouldSetTextContent","_props","createTextInstance","_text","_hostContext","_internalInstanceHandle","Error","createInstance","type","pristineProps","props","reanimatedProps","node","materialize","depMgr","subscribeNode","appendInitialChild","parentInstance","finalizeInitialChildren","commitMount","prepareForCommit","_containerInfo","resetAfterCommit","update","redraw","getPublicInstance","prepareUpdate","_instance","oldProps","newProps","rootContainerInstance","propsAreEqual","commitUpdate","instance","updatePayload","prevProps","nextProps","_internalHandle","unsubscribeNode","setProps","commitTextUpdate","_textInstance","_oldText","_newText","clearContainer","children","forEach","preparePortalMount","removeChildFromContainer","insertInContainerBefore","getCurrentEventPriority","beforeActiveInstanceBlur","afterActiveInstanceBlur","detachDeletedInstance","result","key","prop","current","selector","value"],"sources":["HostConfig.ts"],"sourcesContent":["/*global NodeJS*/\nimport type { HostConfig } from \"react-reconciler\";\nimport { DefaultEventPriority } from \"react-reconciler/constants\";\n\nimport type { NodeType, Node } from \"../dom/types\";\nimport type { SkiaValue } from \"../values\";\nimport {\n bindReanimatedProps,\n extractReanimatedProps,\n} from \"../external/reanimated\";\n\nimport type { Container } from \"./Container\";\nimport { createNode } from \"./HostComponents\";\nimport type { AnimatedProps } from \"./processors\";\nimport { isSelector, isValue } from \"./processors\";\nimport { mapKeys, shallowEq } from \"./typeddash\";\n\nconst DEBUG = false;\nexport const debug = (...args: Parameters<typeof console.log>) => {\n if (DEBUG) {\n console.log(...args);\n }\n};\n\ntype Instance = Node<unknown>;\n\ntype Props = object;\ntype TextInstance = Node<unknown>;\ntype SuspenseInstance = Instance;\ntype HydratableInstance = Instance;\ntype PublicInstance = Instance;\ntype HostContext = null;\ntype UpdatePayload = Container;\ntype ChildSet = unknown;\ntype TimeoutHandle = NodeJS.Timeout;\ntype NoTimeout = -1;\n\ntype SkiaHostConfig = HostConfig<\n NodeType,\n Props,\n Container,\n Instance,\n TextInstance,\n SuspenseInstance,\n HydratableInstance,\n PublicInstance,\n HostContext,\n UpdatePayload,\n ChildSet,\n TimeoutHandle,\n NoTimeout\n>;\n\nconst appendNode = (parent: Node<unknown>, child: Node<unknown>) => {\n parent.addChild(child);\n};\n\nconst removeNode = (parent: Node<unknown>, child: Node<unknown>) => {\n return parent.removeChild(child);\n};\n\nconst insertBefore = (\n parent: Node<unknown>,\n child: Node<unknown>,\n before: Node<unknown>\n) => {\n parent.insertChildBefore(child, before);\n};\n\nexport const skHostConfig: SkiaHostConfig = {\n /**\n * This function is used by the reconciler in order to calculate current time for prioritising work.\n */\n now: Date.now,\n supportsMutation: true,\n isPrimaryRenderer: false,\n supportsPersistence: false,\n supportsHydration: false,\n //supportsMicrotask: true,\n\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n\n appendChildToContainer(container, child) {\n debug(\"appendChildToContainer\", container, child);\n appendNode(container.root, child);\n },\n\n appendChild(parent, child) {\n debug(\"appendChild\", parent, child);\n appendNode(parent, child);\n },\n\n getRootHostContext: (_rootContainerInstance: Container) => {\n debug(\"getRootHostContext\");\n return null;\n },\n\n getChildHostContext(_parentHostContext, _type, _rootContainerInstance) {\n debug(\"getChildHostContext\");\n return null;\n },\n\n shouldSetTextContent(_type, _props) {\n return false;\n },\n\n createTextInstance(\n _text,\n _rootContainerInstance,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createTextInstance\");\n // return SpanNode({}, text) as SkNode;\n throw new Error(\"Text nodes are not supported yet\");\n },\n\n createInstance(\n type,\n pristineProps,\n container,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createInstance\", type);\n const [props, reanimatedProps] = extractReanimatedProps(pristineProps);\n const node = createNode(container, type, materialize(props));\n bindReanimatedProps(container, node, reanimatedProps);\n container.depMgr.subscribeNode(node, props);\n return node;\n },\n\n appendInitialChild(parentInstance, child) {\n debug(\"appendInitialChild\");\n appendNode(parentInstance, child);\n },\n\n finalizeInitialChildren(\n parentInstance,\n _type,\n _props,\n _rootContainerInstance,\n _hostContext\n ) {\n debug(\"finalizeInitialChildren\", parentInstance);\n return false;\n },\n\n commitMount() {\n // if finalizeInitialChildren = true\n debug(\"commitMount\");\n },\n\n prepareForCommit(_containerInfo) {\n debug(\"prepareForCommit\");\n return null;\n },\n\n resetAfterCommit(container) {\n debug(\"resetAfterCommit\");\n container.depMgr.update();\n container.redraw();\n },\n\n getPublicInstance(node: Instance) {\n debug(\"getPublicInstance\");\n return node;\n },\n\n prepareUpdate: (\n _instance,\n type,\n oldProps,\n newProps,\n rootContainerInstance,\n _hostContext\n ) => {\n debug(\"prepareUpdate\");\n const propsAreEqual = shallowEq(oldProps, newProps);\n if (propsAreEqual) {\n return null;\n }\n debug(\"update \", type);\n return rootContainerInstance;\n },\n\n commitUpdate(\n instance,\n updatePayload,\n type,\n prevProps,\n nextProps,\n _internalHandle\n ) {\n debug(\"commitUpdate: \", type);\n if (shallowEq(prevProps, nextProps)) {\n return;\n }\n const [props, reanimatedProps] = extractReanimatedProps(nextProps);\n updatePayload.depMgr.unsubscribeNode(instance);\n instance.setProps(materialize(props));\n bindReanimatedProps(updatePayload, instance, reanimatedProps);\n updatePayload.depMgr.subscribeNode(instance, props);\n },\n\n commitTextUpdate: (\n _textInstance: TextInstance,\n _oldText: string,\n _newText: string\n ) => {\n // textInstance.instance = newText;\n },\n\n clearContainer: (container) => {\n debug(\"clearContainer\");\n container.root.children().forEach((child) => {\n container.root.removeChild(child);\n });\n },\n\n preparePortalMount: () => {\n debug(\"preparePortalMount\");\n },\n\n removeChild: (parent, child) => {\n removeNode(parent, child);\n },\n\n removeChildFromContainer: (container, child) => {\n removeNode(container.root, child);\n },\n\n insertInContainerBefore: (container, child, before) => {\n insertBefore(container.root, child, before);\n },\n\n insertBefore: (parent, child, before) => {\n insertBefore(parent, child, before);\n },\n // see https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n getCurrentEventPriority: () => DefaultEventPriority,\n beforeActiveInstanceBlur: () => {},\n afterActiveInstanceBlur: () => {},\n detachDeletedInstance: () => {},\n};\n\nconst materialize = <P>(props: AnimatedProps<P>) => {\n const result = { ...props } as P;\n mapKeys(props).forEach((key) => {\n const prop = props[key];\n if (isValue(prop)) {\n result[key] = (prop as SkiaValue<P[typeof key]>).current;\n } else if (isSelector(prop)) {\n result[key] = prop.selector(prop.value.current) as P[typeof key];\n }\n });\n\n return result;\n};\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ declare type RegisterValues = (values: Array<SkiaValue<unknown>>) => () => void;
5
5
  export declare class SkiaRoot {
6
6
  private root;
7
7
  private container;
8
- constructor(Skia: Skia, registerValues?: RegisterValues, redraw?: () => void);
8
+ constructor(Skia: Skia, registerValues?: RegisterValues, redraw?: () => void, getNativeId?: () => number);
9
9
  render(element: ReactNode): void;
10
10
  unmount(): void;
11
11
  get dom(): import("..").RenderNode<import("..").GroupProps>;
@@ -17,13 +17,14 @@ export class SkiaRoot {
17
17
  constructor(Skia) {
18
18
  let registerValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : () => () => {};
19
19
  let redraw = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : () => {};
20
+ let getNativeId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : () => 0;
20
21
 
21
22
  _defineProperty(this, "root", void 0);
22
23
 
23
24
  _defineProperty(this, "container", void 0);
24
25
 
25
26
  const depMgr = createDependencyManager(registerValues);
26
- this.container = new Container(Skia, depMgr, redraw);
27
+ this.container = new Container(Skia, depMgr, redraw, getNativeId);
27
28
  this.root = skiaReconciler.createContainer(this.container, 0, null, true, null, "", console.error, null);
28
29
  }
29
30
 
@@ -1 +1 @@
1
- {"version":3,"names":["ReactReconciler","DependencyManager","skHostConfig","debug","hostDebug","Container","skiaReconciler","createDependencyManager","registerValues","global","SkiaDomApi","injectIntoDevTools","bundleType","version","rendererPackageName","SkiaRoot","constructor","Skia","redraw","depMgr","container","root","createContainer","console","error","render","element","updateContainer","unmount","remove","dom"],"sources":["Reconciler.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { OpaqueRoot } from \"react-reconciler\";\nimport ReactReconciler from \"react-reconciler\";\n\nimport type { Skia } from \"../skia/types\";\nimport type { SkiaValue } from \"../values/types\";\n\nimport { DependencyManager } from \"./DependencyManager\";\nimport { skHostConfig, debug as hostDebug } from \"./HostConfig\";\nimport { Container } from \"./Container\";\n\nconst skiaReconciler = ReactReconciler(skHostConfig);\n\ntype RegisterValues = (values: Array<SkiaValue<unknown>>) => () => void;\n\nconst createDependencyManager = (registerValues: RegisterValues) =>\n global.SkiaDomApi && global.SkiaDomApi.DependencyManager\n ? global.SkiaDomApi.DependencyManager(registerValues)\n : new DependencyManager(registerValues);\n\nskiaReconciler.injectIntoDevTools({\n bundleType: 1,\n version: \"0.0.1\",\n rendererPackageName: \"react-native-skia\",\n});\n\nexport class SkiaRoot {\n private root: OpaqueRoot;\n private container: Container;\n\n constructor(\n Skia: Skia,\n registerValues: RegisterValues = () => () => {},\n redraw: () => void = () => {}\n ) {\n const depMgr = createDependencyManager(registerValues);\n this.container = new Container(Skia, depMgr, redraw);\n this.root = skiaReconciler.createContainer(\n this.container,\n 0,\n null,\n true,\n null,\n \"\",\n console.error,\n null\n );\n }\n\n render(element: ReactNode) {\n skiaReconciler.updateContainer(element, this.root, null, () => {\n hostDebug(\"updateContainer\");\n });\n }\n\n unmount() {\n skiaReconciler.updateContainer(null, this.root, null, () => {\n this.container.depMgr.remove();\n });\n }\n\n get dom() {\n return this.container.root;\n }\n}\n"],"mappings":";;AAEA,OAAOA,eAAP,MAA4B,kBAA5B;AAKA,SAASC,iBAAT,QAAkC,qBAAlC;AACA,SAASC,YAAT,EAAuBC,KAAK,IAAIC,SAAhC,QAAiD,cAAjD;AACA,SAASC,SAAT,QAA0B,aAA1B;AAEA,MAAMC,cAAc,GAAGN,eAAe,CAACE,YAAD,CAAtC;;AAIA,MAAMK,uBAAuB,GAAIC,cAAD,IAC9BC,MAAM,CAACC,UAAP,IAAqBD,MAAM,CAACC,UAAP,CAAkBT,iBAAvC,GACIQ,MAAM,CAACC,UAAP,CAAkBT,iBAAlB,CAAoCO,cAApC,CADJ,GAEI,IAAIP,iBAAJ,CAAsBO,cAAtB,CAHN;;AAKAF,cAAc,CAACK,kBAAf,CAAkC;EAChCC,UAAU,EAAE,CADoB;EAEhCC,OAAO,EAAE,OAFuB;EAGhCC,mBAAmB,EAAE;AAHW,CAAlC;AAMA,OAAO,MAAMC,QAAN,CAAe;EAIpBC,WAAW,CACTC,IADS,EAIT;IAAA,IAFAT,cAEA,uEAFiC,MAAM,MAAM,CAAE,CAE/C;IAAA,IADAU,MACA,uEADqB,MAAM,CAAE,CAC7B;;IAAA;;IAAA;;IACA,MAAMC,MAAM,GAAGZ,uBAAuB,CAACC,cAAD,CAAtC;IACA,KAAKY,SAAL,GAAiB,IAAIf,SAAJ,CAAcY,IAAd,EAAoBE,MAApB,EAA4BD,MAA5B,CAAjB;IACA,KAAKG,IAAL,GAAYf,cAAc,CAACgB,eAAf,CACV,KAAKF,SADK,EAEV,CAFU,EAGV,IAHU,EAIV,IAJU,EAKV,IALU,EAMV,EANU,EAOVG,OAAO,CAACC,KAPE,EAQV,IARU,CAAZ;EAUD;;EAEDC,MAAM,CAACC,OAAD,EAAqB;IACzBpB,cAAc,CAACqB,eAAf,CAA+BD,OAA/B,EAAwC,KAAKL,IAA7C,EAAmD,IAAnD,EAAyD,MAAM;MAC7DjB,SAAS,CAAC,iBAAD,CAAT;IACD,CAFD;EAGD;;EAEDwB,OAAO,GAAG;IACRtB,cAAc,CAACqB,eAAf,CAA+B,IAA/B,EAAqC,KAAKN,IAA1C,EAAgD,IAAhD,EAAsD,MAAM;MAC1D,KAAKD,SAAL,CAAeD,MAAf,CAAsBU,MAAtB;IACD,CAFD;EAGD;;EAEM,IAAHC,GAAG,GAAG;IACR,OAAO,KAAKV,SAAL,CAAeC,IAAtB;EACD;;AArCmB"}
1
+ {"version":3,"names":["ReactReconciler","DependencyManager","skHostConfig","debug","hostDebug","Container","skiaReconciler","createDependencyManager","registerValues","global","SkiaDomApi","injectIntoDevTools","bundleType","version","rendererPackageName","SkiaRoot","constructor","Skia","redraw","getNativeId","depMgr","container","root","createContainer","console","error","render","element","updateContainer","unmount","remove","dom"],"sources":["Reconciler.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { OpaqueRoot } from \"react-reconciler\";\nimport ReactReconciler from \"react-reconciler\";\n\nimport type { Skia } from \"../skia/types\";\nimport type { SkiaValue } from \"../values/types\";\n\nimport { DependencyManager } from \"./DependencyManager\";\nimport { skHostConfig, debug as hostDebug } from \"./HostConfig\";\nimport { Container } from \"./Container\";\n\nconst skiaReconciler = ReactReconciler(skHostConfig);\n\ntype RegisterValues = (values: Array<SkiaValue<unknown>>) => () => void;\n\nconst createDependencyManager = (registerValues: RegisterValues) =>\n global.SkiaDomApi && global.SkiaDomApi.DependencyManager\n ? global.SkiaDomApi.DependencyManager(registerValues)\n : new DependencyManager(registerValues);\n\nskiaReconciler.injectIntoDevTools({\n bundleType: 1,\n version: \"0.0.1\",\n rendererPackageName: \"react-native-skia\",\n});\n\nexport class SkiaRoot {\n private root: OpaqueRoot;\n private container: Container;\n\n constructor(\n Skia: Skia,\n registerValues: RegisterValues = () => () => {},\n redraw: () => void = () => {},\n getNativeId: () => number = () => 0\n ) {\n const depMgr = createDependencyManager(registerValues);\n this.container = new Container(Skia, depMgr, redraw, getNativeId);\n this.root = skiaReconciler.createContainer(\n this.container,\n 0,\n null,\n true,\n null,\n \"\",\n console.error,\n null\n );\n }\n\n render(element: ReactNode) {\n skiaReconciler.updateContainer(element, this.root, null, () => {\n hostDebug(\"updateContainer\");\n });\n }\n\n unmount() {\n skiaReconciler.updateContainer(null, this.root, null, () => {\n this.container.depMgr.remove();\n });\n }\n\n get dom() {\n return this.container.root;\n }\n}\n"],"mappings":";;AAEA,OAAOA,eAAP,MAA4B,kBAA5B;AAKA,SAASC,iBAAT,QAAkC,qBAAlC;AACA,SAASC,YAAT,EAAuBC,KAAK,IAAIC,SAAhC,QAAiD,cAAjD;AACA,SAASC,SAAT,QAA0B,aAA1B;AAEA,MAAMC,cAAc,GAAGN,eAAe,CAACE,YAAD,CAAtC;;AAIA,MAAMK,uBAAuB,GAAIC,cAAD,IAC9BC,MAAM,CAACC,UAAP,IAAqBD,MAAM,CAACC,UAAP,CAAkBT,iBAAvC,GACIQ,MAAM,CAACC,UAAP,CAAkBT,iBAAlB,CAAoCO,cAApC,CADJ,GAEI,IAAIP,iBAAJ,CAAsBO,cAAtB,CAHN;;AAKAF,cAAc,CAACK,kBAAf,CAAkC;EAChCC,UAAU,EAAE,CADoB;EAEhCC,OAAO,EAAE,OAFuB;EAGhCC,mBAAmB,EAAE;AAHW,CAAlC;AAMA,OAAO,MAAMC,QAAN,CAAe;EAIpBC,WAAW,CACTC,IADS,EAKT;IAAA,IAHAT,cAGA,uEAHiC,MAAM,MAAM,CAAE,CAG/C;IAAA,IAFAU,MAEA,uEAFqB,MAAM,CAAE,CAE7B;IAAA,IADAC,WACA,uEAD4B,MAAM,CAClC;;IAAA;;IAAA;;IACA,MAAMC,MAAM,GAAGb,uBAAuB,CAACC,cAAD,CAAtC;IACA,KAAKa,SAAL,GAAiB,IAAIhB,SAAJ,CAAcY,IAAd,EAAoBG,MAApB,EAA4BF,MAA5B,EAAoCC,WAApC,CAAjB;IACA,KAAKG,IAAL,GAAYhB,cAAc,CAACiB,eAAf,CACV,KAAKF,SADK,EAEV,CAFU,EAGV,IAHU,EAIV,IAJU,EAKV,IALU,EAMV,EANU,EAOVG,OAAO,CAACC,KAPE,EAQV,IARU,CAAZ;EAUD;;EAEDC,MAAM,CAACC,OAAD,EAAqB;IACzBrB,cAAc,CAACsB,eAAf,CAA+BD,OAA/B,EAAwC,KAAKL,IAA7C,EAAmD,IAAnD,EAAyD,MAAM;MAC7DlB,SAAS,CAAC,iBAAD,CAAT;IACD,CAFD;EAGD;;EAEDyB,OAAO,GAAG;IACRvB,cAAc,CAACsB,eAAf,CAA+B,IAA/B,EAAqC,KAAKN,IAA1C,EAAgD,IAAhD,EAAsD,MAAM;MAC1D,KAAKD,SAAL,CAAeD,MAAf,CAAsBU,MAAtB;IACD,CAFD;EAGD;;EAEM,IAAHC,GAAG,GAAG;IACR,OAAO,KAAKV,SAAL,CAAeC,IAAtB;EACD;;AAtCmB"}
@@ -1,11 +1,14 @@
1
1
  import type { SkiaSelector, SkiaValue } from "../../../values";
2
+ export declare type SharedValueType<T = number> = {
3
+ value: T;
4
+ };
2
5
  export declare const isValue: (value: unknown) => value is SkiaValue<unknown>;
3
6
  export declare const isSelector: <T, R>(value: unknown) => value is {
4
7
  selector: (v: T) => R;
5
8
  value: SkiaValue<T>;
6
9
  };
7
10
  export declare const isAnimated: <T>(props: AnimatedProps<T, never>) => boolean;
8
- export declare type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P>;
11
+ export declare type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P> | SharedValueType<T>;
9
12
  export declare type AnimatedProps<T, O extends keyof T | never = never> = {
10
13
  [K in keyof T]: K extends "children" ? T[K] : K extends O ? T[K] : AnimatedProp<T[K]>;
11
14
  };
@@ -1 +1 @@
1
- {"version":3,"names":["isValue","value","undefined","__typename__","isSelector","selector","isAnimated","props","Object","values"],"sources":["Animations.ts"],"sourcesContent":["import type { SkiaSelector, SkiaValue } from \"../../../values\";\n\nexport const isValue = (value: unknown): value is SkiaValue<unknown> => {\n if (value === undefined || value === null) {\n return false;\n }\n try {\n if (\n typeof value === \"object\" &&\n \"__typename__\" in value &&\n (value as unknown as SkiaValue<unknown>).__typename__ === \"RNSkValue\"\n ) {\n return true;\n }\n } catch {}\n return false;\n};\n\nexport const isSelector = <T, R>(\n value: unknown\n): value is {\n selector: (v: T) => R;\n value: SkiaValue<T>;\n} => {\n if (value) {\n return (\n typeof value === \"object\" &&\n \"selector\" in value &&\n \"value\" in value &&\n (value as Record<string, unknown>).selector !== undefined &&\n (value as Record<string, unknown>).value !== undefined\n );\n }\n return false;\n};\n\nexport const isAnimated = <T>(props: AnimatedProps<T>) => {\n for (const value of Object.values(props)) {\n if (isValue(value) || isSelector(value)) {\n return true;\n }\n }\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P>;\n\nexport type AnimatedProps<T, O extends keyof T | never = never> = {\n [K in keyof T]: K extends \"children\"\n ? T[K]\n : K extends O\n ? T[K]\n : AnimatedProp<T[K]>;\n};\n\nexport type SkiaProps<\n P = object,\n O extends keyof P | never = never\n> = AnimatedProps<P, O>;\n\ntype WithOptional<T extends object, N extends keyof T> = Omit<T, N> & {\n [K in N]?: T[K];\n};\n\nexport type SkiaDefaultProps<\n T extends object,\n N extends keyof T\n> = WithOptional<SkiaProps<T>, N>;\n"],"mappings":"AAEA,OAAO,MAAMA,OAAO,GAAIC,KAAD,IAAiD;EACtE,IAAIA,KAAK,KAAKC,SAAV,IAAuBD,KAAK,KAAK,IAArC,EAA2C;IACzC,OAAO,KAAP;EACD;;EACD,IAAI;IACF,IACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,kBAAkBA,KADlB,IAECA,KAAD,CAAyCE,YAAzC,KAA0D,WAH5D,EAIE;MACA,OAAO,IAAP;IACD;EACF,CARD,CAQE,MAAM,CAAE;;EACV,OAAO,KAAP;AACD,CAdM;AAgBP,OAAO,MAAMC,UAAU,GACrBH,KADwB,IAKrB;EACH,IAAIA,KAAJ,EAAW;IACT,OACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,cAAcA,KADd,IAEA,WAAWA,KAFX,IAGCA,KAAD,CAAmCI,QAAnC,KAAgDH,SAHhD,IAICD,KAAD,CAAmCA,KAAnC,KAA6CC,SAL/C;EAOD;;EACD,OAAO,KAAP;AACD,CAhBM;AAkBP,OAAO,MAAMI,UAAU,GAAOC,KAAJ,IAAgC;EACxD,KAAK,MAAMN,KAAX,IAAoBO,MAAM,CAACC,MAAP,CAAcF,KAAd,CAApB,EAA0C;IACxC,IAAIP,OAAO,CAACC,KAAD,CAAP,IAAkBG,UAAU,CAACH,KAAD,CAAhC,EAAyC;MACvC,OAAO,IAAP;IACD;EACF;;EACD,OAAO,KAAP;AACD,CAPM,C,CASP"}
1
+ {"version":3,"names":["isValue","value","undefined","__typename__","isSelector","selector","isAnimated","props","Object","values"],"sources":["Animations.ts"],"sourcesContent":["import type { SkiaSelector, SkiaValue } from \"../../../values\";\n\nexport type SharedValueType<T = number> = {\n value: T;\n};\n\nexport const isValue = (value: unknown): value is SkiaValue<unknown> => {\n if (value === undefined || value === null) {\n return false;\n }\n try {\n if (\n typeof value === \"object\" &&\n \"__typename__\" in value &&\n (value as unknown as SkiaValue<unknown>).__typename__ === \"RNSkValue\"\n ) {\n return true;\n }\n } catch {}\n return false;\n};\n\nexport const isSelector = <T, R>(\n value: unknown\n): value is {\n selector: (v: T) => R;\n value: SkiaValue<T>;\n} => {\n if (value) {\n return (\n typeof value === \"object\" &&\n \"selector\" in value &&\n \"value\" in value &&\n (value as Record<string, unknown>).selector !== undefined &&\n (value as Record<string, unknown>).value !== undefined\n );\n }\n return false;\n};\n\nexport const isAnimated = <T>(props: AnimatedProps<T>) => {\n for (const value of Object.values(props)) {\n if (isValue(value) || isSelector(value)) {\n return true;\n }\n }\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnimatedProp<T, P = any> =\n | T\n | SkiaValue<T>\n | SkiaSelector<T, P>\n | SharedValueType<T>;\n\nexport type AnimatedProps<T, O extends keyof T | never = never> = {\n [K in keyof T]: K extends \"children\"\n ? T[K]\n : K extends O\n ? T[K]\n : AnimatedProp<T[K]>;\n};\n\nexport type SkiaProps<\n P = object,\n O extends keyof P | never = never\n> = AnimatedProps<P, O>;\n\ntype WithOptional<T extends object, N extends keyof T> = Omit<T, N> & {\n [K in N]?: T[K];\n};\n\nexport type SkiaDefaultProps<\n T extends object,\n N extends keyof T\n> = WithOptional<SkiaProps<T>, N>;\n"],"mappings":"AAMA,OAAO,MAAMA,OAAO,GAAIC,KAAD,IAAiD;EACtE,IAAIA,KAAK,KAAKC,SAAV,IAAuBD,KAAK,KAAK,IAArC,EAA2C;IACzC,OAAO,KAAP;EACD;;EACD,IAAI;IACF,IACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,kBAAkBA,KADlB,IAECA,KAAD,CAAyCE,YAAzC,KAA0D,WAH5D,EAIE;MACA,OAAO,IAAP;IACD;EACF,CARD,CAQE,MAAM,CAAE;;EACV,OAAO,KAAP;AACD,CAdM;AAgBP,OAAO,MAAMC,UAAU,GACrBH,KADwB,IAKrB;EACH,IAAIA,KAAJ,EAAW;IACT,OACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,cAAcA,KADd,IAEA,WAAWA,KAFX,IAGCA,KAAD,CAAmCI,QAAnC,KAAgDH,SAHhD,IAICD,KAAD,CAAmCA,KAAnC,KAA6CC,SAL/C;EAOD;;EACD,OAAO,KAAP;AACD,CAhBM;AAkBP,OAAO,MAAMI,UAAU,GAAOC,KAAJ,IAAgC;EACxD,KAAK,MAAMN,KAAX,IAAoBO,MAAM,CAACC,MAAP,CAAcF,KAAd,CAApB,EAA0C;IACxC,IAAIP,OAAO,CAACC,KAAD,CAAP,IAAkBG,UAAU,CAACH,KAAD,CAAhC,EAAyC;MACvC,OAAO,IAAP;IACD;EACF;;EACD,OAAO,KAAP;AACD,CAPM,C,CASP"}
@@ -1 +1,2 @@
1
1
  export * from "./useSharedValueEffect";
2
+ export * from "./renderHelpers";
@@ -0,0 +1,8 @@
1
+ import type { SharedValueType } from "../../renderer/processors/Animations";
2
+ export declare const HAS_REANIMATED2: boolean;
3
+ export declare const HAS_REANIMATED3: boolean;
4
+ export declare const useSharedValue: any;
5
+ export declare const startMapper: any;
6
+ export declare const stopMapper: any;
7
+ export declare const runOnJS: any;
8
+ export declare const isSharedValue: <T>(value: unknown) => value is SharedValueType<T>;
@@ -0,0 +1,5 @@
1
+ import type { Container } from "../../renderer/Container";
2
+ import type { AnimatedProps } from "../../renderer/processors";
3
+ import type { Node } from "../../dom/types";
4
+ export declare function extractReanimatedProps(props: AnimatedProps<any>): AnimatedProps<any, never>[];
5
+ export declare function bindReanimatedProps(container: Container, node: Node<any>, reanimatedProps: AnimatedProps<any>): void;
@@ -1,11 +1,8 @@
1
- declare type SharedValueTypeWrapper<T = number> = {
2
- value: T;
3
- };
1
+ import type { SharedValueType } from "../../renderer/processors/Animations";
4
2
  /**
5
3
  * Connects a shared value from reanimated to a SkiaView or Canvas
6
4
  * so whenever the shared value changes the SkiaView will redraw.
7
5
  * @param cb Callback that will be called whenever the shared value changes.
8
6
  * @param values One or more shared values to listen for.
9
7
  */
10
- export declare const useSharedValueEffect: <T = number>(cb: () => void, value: SharedValueTypeWrapper<T>, ...values: SharedValueTypeWrapper<T>[]) => void;
11
- export {};
8
+ export declare const useSharedValueEffect: <T = number>(cb: () => void, value: SharedValueType<T>, ...values: SharedValueType<T>[]) => void;
@@ -0,0 +1,3 @@
1
+ import type { ReactNode } from "react";
2
+ export * from "../renderer/components";
3
+ export declare const draw: (element: ReactNode, width: number, height: number) => any;
@@ -1,6 +1,5 @@
1
1
  import type { Skia as SkiaApi } from "../skia/types";
2
2
  import type * as SkiaExports from "../skia";
3
- import type * as ExternalExports from "../external";
4
3
  import type * as ValueExports from "../values";
5
4
  import type * as AnimationExports from "../animation";
6
5
  import { ShaderLib } from "../renderer/components/shaders/ShaderLib";
@@ -9,7 +8,7 @@ export declare const vec: (x?: number, y?: number) => {
9
8
  x: number;
10
9
  y: number;
11
10
  };
12
- export declare const Mock: typeof SkiaExports & typeof ExternalExports & typeof ValueExports & typeof AnimationExports & {
11
+ export declare const Mock: typeof SkiaExports & typeof ValueExports & typeof AnimationExports & {
13
12
  createDrawing: () => any;
14
13
  createDeclaration: () => any;
15
14
  ShaderLib: typeof ShaderLib;
@@ -4,9 +4,10 @@ import type { DependencyManager } from "./DependencyManager";
4
4
  export declare class Container {
5
5
  depMgr: DependencyManager;
6
6
  redraw: () => void;
7
+ getNativeId: () => number;
7
8
  private _root;
8
9
  Sk: SkDOM;
9
- constructor(Skia: Skia, depMgr: DependencyManager, redraw?: () => void);
10
+ constructor(Skia: Skia, depMgr: DependencyManager, redraw?: () => void, getNativeId?: () => number);
10
11
  draw(ctx: DrawingContext): void;
11
12
  get root(): RenderNode<GroupProps>;
12
13
  }
@@ -5,7 +5,7 @@ declare type RegisterValues = (values: Array<SkiaValue<unknown>>) => () => void;
5
5
  export declare class SkiaRoot {
6
6
  private root;
7
7
  private container;
8
- constructor(Skia: Skia, registerValues?: RegisterValues, redraw?: () => void);
8
+ constructor(Skia: Skia, registerValues?: RegisterValues, redraw?: () => void, getNativeId?: () => number);
9
9
  render(element: ReactNode): void;
10
10
  unmount(): void;
11
11
  get dom(): import("..").RenderNode<import("..").GroupProps>;
@@ -1,11 +1,14 @@
1
1
  import type { SkiaSelector, SkiaValue } from "../../../values";
2
+ export declare type SharedValueType<T = number> = {
3
+ value: T;
4
+ };
2
5
  export declare const isValue: (value: unknown) => value is SkiaValue<unknown>;
3
6
  export declare const isSelector: <T, R>(value: unknown) => value is {
4
7
  selector: (v: T) => R;
5
8
  value: SkiaValue<T>;
6
9
  };
7
10
  export declare const isAnimated: <T>(props: AnimatedProps<T, never>) => boolean;
8
- export declare type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P>;
11
+ export declare type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P> | SharedValueType<T>;
9
12
  export declare type AnimatedProps<T, O extends keyof T | never = never> = {
10
13
  [K in keyof T]: K extends "children" ? T[K] : K extends O ? T[K] : AnimatedProp<T[K]>;
11
14
  };
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "setup-skia-web": "./scripts/setup-canvaskit.js"
8
8
  },
9
9
  "title": "React Native Skia",
10
- "version": "0.1.176",
10
+ "version": "0.1.180",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "files": [
@@ -103,15 +103,21 @@ export class DisplacementMapImageFilterNode extends ImageFilterDeclaration<Displ
103
103
  }
104
104
 
105
105
  decorate(ctx: DeclarationContext) {
106
+ this.decorateChildren(ctx);
106
107
  const { channelX, channelY, scale } = this.props;
108
+ const shader = ctx.shaders.pop();
109
+ if (!shader) {
110
+ throw new Error("DisplacementMap expects a shader as child");
111
+ }
112
+ const map = this.Skia.ImageFilter.MakeShader(shader, null);
107
113
  const imgf = this.Skia.ImageFilter.MakeDisplacementMap(
108
114
  ColorChannel[enumKey(channelX)],
109
115
  ColorChannel[enumKey(channelY)],
110
116
  scale,
111
- ctx.imageFilters.pop()!,
117
+ map,
112
118
  this.input(ctx)
113
119
  );
114
- this.composeAndPush(ctx, imgf);
120
+ ctx.imageFilters.push(imgf);
115
121
  }
116
122
  }
117
123
 
@@ -1 +1,2 @@
1
1
  export * from "./useSharedValueEffect";
2
+ export * from "./renderHelpers";
@@ -0,0 +1,60 @@
1
+ import { useMemo } from "react";
2
+
3
+ import type { SharedValueType } from "../../renderer/processors/Animations";
4
+
5
+ // This one is needed for the deprecated useSharedValue function
6
+ // We can remove it once we remove the deprecation
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ let Reanimated2: any;
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ let Reanimated3: any;
11
+ let reanimatedVersion: string;
12
+
13
+ try {
14
+ Reanimated2 = require("react-native-reanimated");
15
+ reanimatedVersion =
16
+ // eslint-disable-next-line import/extensions
17
+ require("react-native-reanimated/package.json").version;
18
+ if (
19
+ reanimatedVersion &&
20
+ (reanimatedVersion >= "3.0.0" || reanimatedVersion.includes("3.0.0-"))
21
+ ) {
22
+ Reanimated3 = Reanimated2;
23
+ }
24
+ } catch (e) {}
25
+
26
+ export const HAS_REANIMATED2 = !!Reanimated2;
27
+ export const HAS_REANIMATED3 = !!Reanimated3;
28
+
29
+ function throwOnMissingReanimated2() {
30
+ if (!HAS_REANIMATED2) {
31
+ throw new Error(
32
+ "Reanimated was not found, make sure react-native-reanimated package is installed if you want to use \
33
+ react-naitve-skia's integration layer API."
34
+ );
35
+ }
36
+ }
37
+
38
+ function throwOnMissingReanimated3() {
39
+ if (!HAS_REANIMATED3) {
40
+ throw new Error(
41
+ `Reanimated version ${reanimatedVersion} is not supported, please upgrade to 3.0.0 or newer.`
42
+ );
43
+ }
44
+ throwOnMissingReanimated2();
45
+ }
46
+
47
+ export const useSharedValue =
48
+ Reanimated2?.useSharedValue ||
49
+ ((value: number) => useMemo(() => ({ value }), [value]));
50
+
51
+ export const startMapper =
52
+ Reanimated2?.startMapper || throwOnMissingReanimated2;
53
+ export const stopMapper = Reanimated2?.stopMapper || throwOnMissingReanimated2;
54
+ export const runOnJS = Reanimated2?.runOnJS || throwOnMissingReanimated2;
55
+ export const isSharedValue = <T>(
56
+ value: unknown
57
+ ): value is SharedValueType<T> => {
58
+ throwOnMissingReanimated3();
59
+ return !!value && Reanimated3.isSharedValue(value);
60
+ };
@@ -0,0 +1,70 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable reanimated/js-function-in-worklet */
3
+ import type { Container } from "../../renderer/Container";
4
+ import type { AnimatedProps } from "../../renderer/processors";
5
+ import type { Node } from "../../dom/types";
6
+
7
+ import {
8
+ startMapper,
9
+ stopMapper,
10
+ isSharedValue,
11
+ HAS_REANIMATED3,
12
+ } from "./moduleWrapper";
13
+
14
+ const _bindings = new WeakMap<Node<unknown>, unknown>();
15
+
16
+ export function extractReanimatedProps(props: AnimatedProps<any>) {
17
+ if (!HAS_REANIMATED3) {
18
+ return [props, {}];
19
+ }
20
+ const reanimatedProps = {} as AnimatedProps<any>;
21
+ const otherProps = {} as AnimatedProps<any>;
22
+ for (const propName in props) {
23
+ if (propName === "children") {
24
+ continue;
25
+ }
26
+ const propValue = props[propName];
27
+ if (isSharedValue(propValue)) {
28
+ reanimatedProps[propName] = propValue;
29
+ otherProps[propName] = propValue.value;
30
+ } else {
31
+ otherProps[propName] = propValue;
32
+ }
33
+ }
34
+ return [otherProps, reanimatedProps];
35
+ }
36
+
37
+ export function bindReanimatedProps(
38
+ container: Container,
39
+ node: Node<any>,
40
+ reanimatedProps: AnimatedProps<any>
41
+ ) {
42
+ if (!HAS_REANIMATED3) {
43
+ return;
44
+ }
45
+ const sharedValues = Object.values(reanimatedProps);
46
+ const previousMapperId = _bindings.get(node);
47
+ if (previousMapperId !== undefined) {
48
+ stopMapper(previousMapperId);
49
+ }
50
+ if (sharedValues.length > 0) {
51
+ const viewId = container.getNativeId();
52
+ const { SkiaViewApi } = global;
53
+ const mapperId = startMapper(() => {
54
+ "worklet";
55
+ for (const propName in reanimatedProps) {
56
+ node && node.setProp(propName, reanimatedProps[propName].value);
57
+ }
58
+ // On React Native we use the SkiaViewApi to redraw because it can
59
+ // run on the worklet thread (container.redraw can't)
60
+ // if SkiaViewApi is undefined, we are on web and container.redraw()
61
+ // can safely be invoked
62
+ if (SkiaViewApi) {
63
+ SkiaViewApi.requestRedraw(viewId);
64
+ } else {
65
+ container.redraw();
66
+ }
67
+ }, sharedValues);
68
+ _bindings.set(node, mapperId);
69
+ }
70
+ }
@@ -1,22 +1,14 @@
1
- import { useEffect, useMemo } from "react";
1
+ import { useEffect } from "react";
2
2
 
3
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
- let Reanimated: any;
3
+ import type { SharedValueType } from "../../renderer/processors/Animations";
5
4
 
6
- try {
7
- Reanimated = require("react-native-reanimated");
8
- } catch (e) {
9
- // Ignore
10
- }
11
-
12
- type SharedValueTypeWrapper<T = number> = {
13
- value: T;
14
- };
15
-
16
- const useSharedValueWrapper =
17
- Reanimated?.useSharedValue === undefined
18
- ? (value: number) => useMemo(() => ({ value }), [value])
19
- : Reanimated.useSharedValue;
5
+ import {
6
+ HAS_REANIMATED2,
7
+ useSharedValue,
8
+ runOnJS,
9
+ startMapper,
10
+ stopMapper,
11
+ } from "./moduleWrapper";
20
12
 
21
13
  /**
22
14
  * Connects a shared value from reanimated to a SkiaView or Canvas
@@ -26,19 +18,21 @@ const useSharedValueWrapper =
26
18
  */
27
19
  export const useSharedValueEffect = <T = number>(
28
20
  cb: () => void,
29
- value: SharedValueTypeWrapper<T>,
30
- ...values: SharedValueTypeWrapper<T>[]
21
+ value: SharedValueType<T>,
22
+ ...values: SharedValueType<T>[]
31
23
  ) => {
32
- const input = useSharedValueWrapper(0);
24
+ console.warn(
25
+ `useSharedValueEffect() is now deprecated, you can use Reanimated values directly.
26
+ Learn more at https://shopify.github.io/react-native-skia/.`
27
+ );
28
+ const input = useSharedValue(0);
33
29
 
34
30
  useEffect(() => {
35
- if (!Reanimated) {
31
+ if (!HAS_REANIMATED2) {
36
32
  console.warn(
37
33
  "Reanimated was not found and the useSharedValueEffect hook will have no effect."
38
34
  );
39
35
  } else {
40
- const { runOnJS, startMapper, stopMapper } = Reanimated;
41
-
42
36
  // Start a mapper in Reanimated
43
37
  const mapperId = startMapper(
44
38
  () => {
@@ -0,0 +1,31 @@
1
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
+ // @ts-ignore
3
+ import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit";
4
+ import type { ReactNode } from "react";
5
+
6
+ import { JsiSkApi } from "../skia/web";
7
+ import { SkiaRoot } from "../renderer/Reconciler";
8
+ import { JsiDrawingContext } from "../dom/types";
9
+
10
+ export * from "../renderer/components";
11
+
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ let Skia: any;
14
+
15
+ export const draw = (element: ReactNode, width: number, height: number) => {
16
+ if (!Skia) {
17
+ Skia = JsiSkApi(CanvasKit);
18
+ }
19
+ const surface = Skia.Surface.MakeOffscreen(width, height);
20
+ if (surface === null) {
21
+ throw new Error("Couldn't create surface!");
22
+ }
23
+ const root = new SkiaRoot(Skia);
24
+ root.render(element);
25
+ const canvas = surface.getCanvas();
26
+ const ctx = new JsiDrawingContext(Skia, canvas);
27
+ root.dom.render(ctx);
28
+ surface.flush();
29
+ const image = surface.makeImageSnapshot();
30
+ return image;
31
+ };
package/src/mock/index.ts CHANGED
@@ -6,10 +6,8 @@ import * as ValuesHooks from "../values/hooks";
6
6
  import { Selector } from "../values/selector";
7
7
  import * as BaseSkia from "../skia/types";
8
8
  import type * as SkiaExports from "../skia";
9
- import type * as ExternalExports from "../external";
10
9
  import type * as ValueExports from "../values";
11
10
  import type * as AnimationExports from "../animation";
12
- import { useSharedValueEffect } from "../external/reanimated/useSharedValueEffect";
13
11
  import * as timingFunctions from "../animation/timing";
14
12
  import * as springFunctions from "../animation/spring";
15
13
  import * as decayFunctions from "../animation/decay";
@@ -35,7 +33,6 @@ export const Skia: SkiaApi = new Stub() as any;
35
33
  export const vec = (x?: number, y?: number) => ({ x: x ?? 0, y: y ?? x ?? 0 });
36
34
 
37
35
  export const Mock: typeof SkiaExports &
38
- typeof ExternalExports &
39
36
  typeof ValueExports &
40
37
  typeof AnimationExports & {
41
38
  createDrawing: () => any;
@@ -82,8 +79,6 @@ export const Mock: typeof SkiaExports &
82
79
  bottomRight: Noop,
83
80
  center: Noop,
84
81
  processTransform2d: Noop,
85
- // ExternalExports
86
- useSharedValueEffect,
87
82
  // ValueExports
88
83
  ...Values,
89
84
  ...ValuesHooks,
@@ -37,6 +37,10 @@ export const Canvas = forwardRef<SkiaDomView, CanvasProps>(
37
37
  const redraw = useCallback(() => {
38
38
  innerRef.current?.redraw();
39
39
  }, [innerRef]);
40
+ const getNativeId = useCallback(() => {
41
+ const id = innerRef.current?.nativeId ?? -1;
42
+ return id;
43
+ }, [innerRef]);
40
44
 
41
45
  const registerValues = useCallback(
42
46
  (values: Array<SkiaValue<unknown>>) => {
@@ -48,8 +52,8 @@ export const Canvas = forwardRef<SkiaDomView, CanvasProps>(
48
52
  [ref]
49
53
  );
50
54
  const root = useMemo(
51
- () => new SkiaRoot(Skia, registerValues, redraw),
52
- [redraw, registerValues]
55
+ () => new SkiaRoot(Skia, registerValues, redraw, getNativeId),
56
+ [redraw, registerValues, getNativeId]
53
57
  );
54
58
 
55
59
  // Render effect
@@ -15,7 +15,8 @@ export class Container {
15
15
  constructor(
16
16
  Skia: Skia,
17
17
  public depMgr: DependencyManager,
18
- public redraw: () => void = () => {}
18
+ public redraw: () => void = () => {},
19
+ public getNativeId: () => number = () => 0
19
20
  ) {
20
21
  this.Sk = new JsiSkDOM({ Skia, depMgr });
21
22
  this._root = this.Sk.Group();
@@ -4,6 +4,10 @@ import { DefaultEventPriority } from "react-reconciler/constants";
4
4
 
5
5
  import type { NodeType, Node } from "../dom/types";
6
6
  import type { SkiaValue } from "../values";
7
+ import {
8
+ bindReanimatedProps,
9
+ extractReanimatedProps,
10
+ } from "../external/reanimated";
7
11
 
8
12
  import type { Container } from "./Container";
9
13
  import { createNode } from "./HostComponents";
@@ -121,8 +125,9 @@ export const skHostConfig: SkiaHostConfig = {
121
125
  _internalInstanceHandle
122
126
  ) {
123
127
  debug("createInstance", type);
124
- const props = { ...pristineProps };
128
+ const [props, reanimatedProps] = extractReanimatedProps(pristineProps);
125
129
  const node = createNode(container, type, materialize(props));
130
+ bindReanimatedProps(container, node, reanimatedProps);
126
131
  container.depMgr.subscribeNode(node, props);
127
132
  return node;
128
133
  },
@@ -193,9 +198,10 @@ export const skHostConfig: SkiaHostConfig = {
193
198
  if (shallowEq(prevProps, nextProps)) {
194
199
  return;
195
200
  }
196
- const props = { ...nextProps };
201
+ const [props, reanimatedProps] = extractReanimatedProps(nextProps);
197
202
  updatePayload.depMgr.unsubscribeNode(instance);
198
203
  instance.setProps(materialize(props));
204
+ bindReanimatedProps(updatePayload, instance, reanimatedProps);
199
205
  updatePayload.depMgr.subscribeNode(instance, props);
200
206
  },
201
207
 
@@ -31,10 +31,11 @@ export class SkiaRoot {
31
31
  constructor(
32
32
  Skia: Skia,
33
33
  registerValues: RegisterValues = () => () => {},
34
- redraw: () => void = () => {}
34
+ redraw: () => void = () => {},
35
+ getNativeId: () => number = () => 0
35
36
  ) {
36
37
  const depMgr = createDependencyManager(registerValues);
37
- this.container = new Container(Skia, depMgr, redraw);
38
+ this.container = new Container(Skia, depMgr, redraw, getNativeId);
38
39
  this.root = skiaReconciler.createContainer(
39
40
  this.container,
40
41
  0,