/** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ import * as TestRendererScheduling from './ReactTestRendererScheduling'; export type Type = string; export type Props = Object; export type Container = {| children: Array, createNodeMock: Function, tag: 'CONTAINER', |}; export type Instance = {| type: string, props: Object, children: Array, rootContainerInstance: Container, tag: 'INSTANCE', |}; export type TextInstance = {| text: string, tag: 'TEXT', |}; export type HydratableInstance = Instance | TextInstance; export type PublicInstance = Instance | TextInstance; export type HostContext = Object; export type UpdatePayload = Object; export type ChildSet = void; // Unused export type TimeoutHandle = TimeoutID; export type NoTimeout = -1; export * from 'shared/HostConfigWithNoPersistence'; export * from 'shared/HostConfigWithNoHydration'; const NO_CONTEXT = {}; const UPDATE_SIGNAL = {}; if (__DEV__) { Object.freeze(NO_CONTEXT); Object.freeze(UPDATE_SIGNAL); } export function getPublicInstance(inst: Instance | TextInstance): * { switch (inst.tag) { case 'INSTANCE': const createNodeMock = inst.rootContainerInstance.createNodeMock; return createNodeMock({ type: inst.type, props: inst.props, }); default: return inst; } } export function appendChild( parentInstance: Instance | Container, child: Instance | TextInstance, ): void { const index = parentInstance.children.indexOf(child); if (index !== -1) { parentInstance.children.splice(index, 1); } parentInstance.children.push(child); } export function insertBefore( parentInstance: Instance | Container, child: Instance | TextInstance, beforeChild: Instance | TextInstance, ): void { const index = parentInstance.children.indexOf(child); if (index !== -1) { parentInstance.children.splice(index, 1); } const beforeIndex = parentInstance.children.indexOf(beforeChild); parentInstance.children.splice(beforeIndex, 0, child); } export function removeChild( parentInstance: Instance | Container, child: Instance | TextInstance, ): void { const index = parentInstance.children.indexOf(child); parentInstance.children.splice(index, 1); } export function getRootHostContext( rootContainerInstance: Container, ): HostContext { return NO_CONTEXT; } export function getChildHostContext( parentHostContext: HostContext, type: string, rootContainerInstance: Container, ): HostContext { return NO_CONTEXT; } export function prepareForCommit(containerInfo: Container): void { // noop } export function resetAfterCommit(containerInfo: Container): void { // noop } export function createInstance( type: string, props: Props, rootContainerInstance: Container, hostContext: Object, internalInstanceHandle: Object, ): Instance { return { type, props, children: [], rootContainerInstance, tag: 'INSTANCE', }; } export function appendInitialChild( parentInstance: Instance, child: Instance | TextInstance, ): void { const index = parentInstance.children.indexOf(child); if (index !== -1) { parentInstance.children.splice(index, 1); } parentInstance.children.push(child); } export function finalizeInitialChildren( testElement: Instance, type: string, props: Props, rootContainerInstance: Container, hostContext: Object, ): boolean { return false; } export function prepareUpdate( testElement: Instance, type: string, oldProps: Props, newProps: Props, rootContainerInstance: Container, hostContext: Object, ): null | {} { return UPDATE_SIGNAL; } export function shouldSetTextContent(type: string, props: Props): boolean { return false; } export function shouldDeprioritizeSubtree(type: string, props: Props): boolean { return false; } export function createTextInstance( text: string, rootContainerInstance: Container, hostContext: Object, internalInstanceHandle: Object, ): TextInstance { return { text, tag: 'TEXT', }; } export const isPrimaryRenderer = false; // This approach enables `now` to be mocked by tests, // Even after the reconciler has initialized and read host config values. export const now = () => TestRendererScheduling.nowImplementation(); export const scheduleDeferredCallback = TestRendererScheduling.scheduleDeferredCallback; export const cancelDeferredCallback = TestRendererScheduling.cancelDeferredCallback; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; // ------------------- // Mutation // ------------------- export const supportsMutation = true; export function commitUpdate( instance: Instance, updatePayload: {}, type: string, oldProps: Props, newProps: Props, internalInstanceHandle: Object, ): void { instance.type = type; instance.props = newProps; } export function commitMount( instance: Instance, type: string, newProps: Props, internalInstanceHandle: Object, ): void { // noop } export function commitTextUpdate( textInstance: TextInstance, oldText: string, newText: string, ): void { textInstance.text = newText; } export function resetTextContent(testElement: Instance): void { // noop } export const appendChildToContainer = appendChild; export const insertInContainerBefore = insertBefore; export const removeChildFromContainer = removeChild;