@testing-library/react-native 14.0.0-alpha.0 → 14.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -12
- package/build/act.d.ts +2 -4
- package/build/act.js +4 -5
- package/build/act.js.map +1 -1
- package/build/cleanup.d.ts +3 -1
- package/build/cleanup.js +8 -0
- package/build/cleanup.js.map +1 -1
- package/build/event-handler.d.ts +7 -0
- package/build/event-handler.js +30 -0
- package/build/event-handler.js.map +1 -0
- package/build/fire-event.d.ts +11 -4
- package/build/fire-event.js +43 -37
- package/build/fire-event.js.map +1 -1
- package/build/helpers/accessibility.d.ts +2 -2
- package/build/helpers/accessibility.js +5 -2
- package/build/helpers/accessibility.js.map +1 -1
- package/build/helpers/component-tree.d.ts +8 -8
- package/build/helpers/component-tree.js +19 -16
- package/build/helpers/component-tree.js.map +1 -1
- package/build/helpers/debug.d.ts +3 -3
- package/build/helpers/debug.js +8 -11
- package/build/helpers/debug.js.map +1 -1
- package/build/helpers/errors.js +4 -4
- package/build/helpers/errors.js.map +1 -1
- package/build/helpers/find-all.d.ts +1 -1
- package/build/helpers/find-all.js +7 -27
- package/build/helpers/find-all.js.map +1 -1
- package/build/helpers/format-element.d.ts +18 -0
- package/build/helpers/format-element.js +80 -0
- package/build/helpers/format-element.js.map +1 -0
- package/build/helpers/host-component-names.d.ts +1 -1
- package/build/helpers/host-component-names.js +6 -7
- package/build/helpers/host-component-names.js.map +1 -1
- package/build/helpers/logger.d.ts +28 -0
- package/build/helpers/logger.js +42 -0
- package/build/helpers/logger.js.map +1 -0
- package/build/helpers/{format-default.d.ts → map-props.d.ts} +1 -0
- package/build/helpers/{format-default.js → map-props.js} +2 -2
- package/build/helpers/map-props.js.map +1 -0
- package/build/helpers/matchers/match-accessibility-state.d.ts +1 -1
- package/build/helpers/matchers/match-accessibility-state.js.map +1 -1
- package/build/helpers/matchers/match-accessibility-value.d.ts +2 -2
- package/build/helpers/matchers/match-accessibility-value.js.map +1 -1
- package/build/helpers/matchers/match-label-text.d.ts +2 -2
- package/build/helpers/matchers/match-label-text.js.map +1 -1
- package/build/helpers/matchers/match-string-prop.d.ts +1 -1
- package/build/helpers/matchers/match-string-prop.js.map +1 -1
- package/build/helpers/matchers/match-text-content.d.ts +2 -2
- package/build/helpers/matchers/match-text-content.js.map +1 -1
- package/build/helpers/object.d.ts +1 -1
- package/build/helpers/object.js.map +1 -1
- package/build/helpers/pointer-events.d.ts +1 -1
- package/build/helpers/pointer-events.js +9 -5
- package/build/helpers/pointer-events.js.map +1 -1
- package/build/helpers/text-content.d.ts +1 -1
- package/build/helpers/text-content.js.map +1 -1
- package/build/helpers/text-input.d.ts +1 -1
- package/build/helpers/text-input.js.map +1 -1
- package/build/helpers/timers.d.ts +1 -1
- package/build/helpers/timers.js.map +1 -1
- package/build/helpers/wrap-async.d.ts +0 -1
- package/build/helpers/wrap-async.js +0 -1
- package/build/helpers/wrap-async.js.map +1 -1
- package/build/index.d.ts +0 -1
- package/build/index.flow.js +33 -36
- package/build/index.js +4 -16
- package/build/index.js.map +1 -1
- package/build/matchers/extend-expect.js +2 -2
- package/build/matchers/extend-expect.js.map +1 -1
- package/build/matchers/index.d.ts +1 -1
- package/build/matchers/index.js.map +1 -1
- package/build/matchers/to-be-busy.d.ts +1 -1
- package/build/matchers/to-be-busy.js +4 -1
- package/build/matchers/to-be-busy.js.map +1 -1
- package/build/matchers/to-be-checked.d.ts +1 -1
- package/build/matchers/to-be-checked.js +4 -1
- package/build/matchers/to-be-checked.js.map +1 -1
- package/build/matchers/to-be-disabled.d.ts +1 -1
- package/build/matchers/to-be-disabled.js +5 -2
- package/build/matchers/to-be-disabled.js.map +1 -1
- package/build/matchers/to-be-empty-element.d.ts +1 -1
- package/build/matchers/to-be-empty-element.js +9 -3
- package/build/matchers/to-be-empty-element.js.map +1 -1
- package/build/matchers/to-be-expanded.d.ts +1 -1
- package/build/matchers/to-be-expanded.js +5 -2
- package/build/matchers/to-be-expanded.js.map +1 -1
- package/build/matchers/to-be-on-the-screen.d.ts +1 -1
- package/build/matchers/to-be-on-the-screen.js +4 -1
- package/build/matchers/to-be-on-the-screen.js.map +1 -1
- package/build/matchers/to-be-partially-checked.d.ts +1 -1
- package/build/matchers/to-be-partially-checked.js +4 -1
- package/build/matchers/to-be-partially-checked.js.map +1 -1
- package/build/matchers/to-be-selected.d.ts +1 -1
- package/build/matchers/to-be-selected.js +4 -1
- package/build/matchers/to-be-selected.js.map +1 -1
- package/build/matchers/to-be-visible.d.ts +1 -1
- package/build/matchers/to-be-visible.js +8 -5
- package/build/matchers/to-be-visible.js.map +1 -1
- package/build/matchers/to-contain-element.d.ts +1 -1
- package/build/matchers/to-contain-element.js +5 -3
- package/build/matchers/to-contain-element.js.map +1 -1
- package/build/matchers/to-have-accessibility-value.d.ts +2 -2
- package/build/matchers/to-have-accessibility-value.js.map +1 -1
- package/build/matchers/to-have-accessible-name.d.ts +2 -2
- package/build/matchers/to-have-accessible-name.js.map +1 -1
- package/build/matchers/to-have-display-value.d.ts +2 -2
- package/build/matchers/to-have-display-value.js +1 -1
- package/build/matchers/to-have-display-value.js.map +1 -1
- package/build/matchers/to-have-prop.d.ts +1 -1
- package/build/matchers/to-have-prop.js.map +1 -1
- package/build/matchers/to-have-style.d.ts +2 -2
- package/build/matchers/to-have-style.js +1 -1
- package/build/matchers/to-have-style.js.map +1 -1
- package/build/matchers/to-have-text-content.d.ts +2 -2
- package/build/matchers/to-have-text-content.js.map +1 -1
- package/build/matchers/types.d.ts +4 -4
- package/build/matchers/types.js.map +1 -1
- package/build/matchers/utils.d.ts +1 -8
- package/build/matchers/utils.js +3 -48
- package/build/matchers/utils.js.map +1 -1
- package/build/native-state.d.ts +3 -3
- package/build/native-state.js +1 -1
- package/build/native-state.js.map +1 -1
- package/build/pure.d.ts +6 -4
- package/build/pure.js +28 -2
- package/build/pure.js.map +1 -1
- package/build/queries/display-value.d.ts +3 -3
- package/build/queries/display-value.js +9 -9
- package/build/queries/display-value.js.map +1 -1
- package/build/queries/hint-text.d.ts +4 -4
- package/build/queries/hint-text.js +9 -9
- package/build/queries/hint-text.js.map +1 -1
- package/build/queries/label-text.d.ts +4 -4
- package/build/queries/label-text.js +9 -9
- package/build/queries/label-text.js.map +1 -1
- package/build/queries/make-queries.d.ts +3 -3
- package/build/queries/make-queries.js +15 -18
- package/build/queries/make-queries.js.map +1 -1
- package/build/queries/options.d.ts +1 -1
- package/build/queries/options.js.map +1 -1
- package/build/queries/placeholder-text.d.ts +3 -3
- package/build/queries/placeholder-text.js +10 -10
- package/build/queries/placeholder-text.js.map +1 -1
- package/build/queries/role.d.ts +7 -7
- package/build/queries/role.js +16 -9
- package/build/queries/role.js.map +1 -1
- package/build/queries/test-id.d.ts +3 -3
- package/build/queries/test-id.js +9 -9
- package/build/queries/test-id.js.map +1 -1
- package/build/queries/text.d.ts +3 -3
- package/build/queries/text.js +9 -9
- package/build/queries/text.js.map +1 -1
- package/build/react-versions.js +1 -2
- package/build/react-versions.js.map +1 -1
- package/build/render-act.d.ts +3 -0
- package/build/render-act.js +29 -0
- package/build/render-act.js.map +1 -0
- package/build/render-async.d.ts +83 -0
- package/build/render-async.js +96 -0
- package/build/render-async.js.map +1 -0
- package/build/render-hook.d.ts +18 -6
- package/build/render-hook.js +56 -26
- package/build/render-hook.js.map +1 -1
- package/build/render.d.ts +54 -48
- package/build/render.js +42 -30
- package/build/render.js.map +1 -1
- package/build/screen.d.ts +1 -1
- package/build/screen.js +7 -7
- package/build/screen.js.map +1 -1
- package/build/test-utils/console.d.ts +1 -0
- package/build/test-utils/console.js +17 -0
- package/build/test-utils/console.js.map +1 -0
- package/build/test-utils/json.d.ts +6 -0
- package/build/test-utils/json.js +33 -0
- package/build/test-utils/json.js.map +1 -0
- package/build/tsconfig.release.tsbuildinfo +1 -1
- package/build/types.d.ts +4 -0
- package/build/types.js.map +1 -1
- package/build/user-event/clear.d.ts +2 -2
- package/build/user-event/clear.js +6 -6
- package/build/user-event/clear.js.map +1 -1
- package/build/user-event/event-builder/base.d.ts +2 -2
- package/build/user-event/event-builder/base.js.map +1 -1
- package/build/user-event/event-builder/scroll-view.d.ts +1 -1
- package/build/user-event/event-builder/scroll-view.js.map +1 -1
- package/build/user-event/event-builder/text-input.d.ts +2 -2
- package/build/user-event/event-builder/text-input.js.map +1 -1
- package/build/user-event/index.d.ts +4 -4
- package/build/user-event/index.js.map +1 -1
- package/build/user-event/paste.d.ts +2 -2
- package/build/user-event/paste.js +8 -8
- package/build/user-event/paste.js.map +1 -1
- package/build/user-event/press/index.d.ts +1 -1
- package/build/user-event/press/index.js.map +1 -1
- package/build/user-event/press/press.d.ts +2 -2
- package/build/user-event/press/press.js +48 -49
- package/build/user-event/press/press.js.map +1 -1
- package/build/user-event/scroll/index.d.ts +1 -1
- package/build/user-event/scroll/index.js.map +1 -1
- package/build/user-event/scroll/scroll-to.d.ts +3 -3
- package/build/user-event/scroll/scroll-to.js +8 -8
- package/build/user-event/scroll/scroll-to.js.map +1 -1
- package/build/user-event/scroll/utils.d.ts +1 -1
- package/build/user-event/scroll/utils.js.map +1 -1
- package/build/user-event/setup/setup.d.ts +4 -4
- package/build/user-event/setup/setup.js.map +1 -1
- package/build/user-event/type/type.d.ts +3 -2
- package/build/user-event/type/type.js +16 -14
- package/build/user-event/type/type.js.map +1 -1
- package/build/user-event/utils/content-size.d.ts +1 -1
- package/build/user-event/utils/content-size.js.map +1 -1
- package/build/user-event/utils/dispatch-event.d.ts +2 -2
- package/build/user-event/utils/dispatch-event.js +5 -15
- package/build/user-event/utils/dispatch-event.js.map +1 -1
- package/build/user-event/utils/wait.d.ts +6 -2
- package/build/user-event/utils/wait.js +1 -1
- package/build/user-event/utils/wait.js.map +1 -1
- package/build/wait-for-element-to-be-removed.js +1 -1
- package/build/wait-for-element-to-be-removed.js.map +1 -1
- package/build/wait-for.js +4 -5
- package/build/wait-for.js.map +1 -1
- package/build/within.d.ts +20 -20
- package/build/within.js +8 -8
- package/build/within.js.map +1 -1
- package/package.json +38 -32
- package/typings/index.flow.js +33 -36
- package/build/helpers/format-default.js.map +0 -1
- package/build/helpers/format.d.ts +0 -7
- package/build/helpers/format.js +0 -31
- package/build/helpers/format.js.map +0 -1
- package/build/test-utils/index.d.ts +0 -1
- package/build/test-utils/index.js +0 -17
- package/build/test-utils/index.js.map +0 -1
|
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.clear = clear;
|
|
7
7
|
var _errors = require("../helpers/errors");
|
|
8
8
|
var _hostComponentNames = require("../helpers/host-component-names");
|
|
9
|
-
var _textInput = require("../helpers/text-input");
|
|
10
9
|
var _pointerEvents = require("../helpers/pointer-events");
|
|
10
|
+
var _textInput = require("../helpers/text-input");
|
|
11
11
|
var _eventBuilder = require("./event-builder");
|
|
12
|
-
var _utils = require("./utils");
|
|
13
12
|
var _type = require("./type/type");
|
|
13
|
+
var _utils = require("./utils");
|
|
14
14
|
async function clear(element) {
|
|
15
15
|
if (!(0, _hostComponentNames.isHostTextInput)(element)) {
|
|
16
16
|
throw new _errors.ErrorWithStack(`clear() only supports host "TextInput" elements. Passed element has type: "${element.type}".`, clear);
|
|
@@ -20,7 +20,7 @@ async function clear(element) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// 1. Enter element
|
|
23
|
-
(0, _utils.dispatchEvent)(element, 'focus', _eventBuilder.EventBuilder.Common.focus());
|
|
23
|
+
await (0, _utils.dispatchEvent)(element, 'focus', _eventBuilder.EventBuilder.Common.focus());
|
|
24
24
|
|
|
25
25
|
// 2. Select all
|
|
26
26
|
const textToClear = (0, _textInput.getTextInputValue)(element);
|
|
@@ -28,7 +28,7 @@ async function clear(element) {
|
|
|
28
28
|
start: 0,
|
|
29
29
|
end: textToClear.length
|
|
30
30
|
};
|
|
31
|
-
(0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(selectionRange));
|
|
31
|
+
await (0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(selectionRange));
|
|
32
32
|
|
|
33
33
|
// 3. Press backspace with selected text
|
|
34
34
|
const emptyText = '';
|
|
@@ -40,7 +40,7 @@ async function clear(element) {
|
|
|
40
40
|
|
|
41
41
|
// 4. Exit element
|
|
42
42
|
await (0, _utils.wait)(this.config);
|
|
43
|
-
(0, _utils.dispatchEvent)(element, 'endEditing', _eventBuilder.EventBuilder.TextInput.endEditing(emptyText));
|
|
44
|
-
(0, _utils.dispatchEvent)(element, 'blur', _eventBuilder.EventBuilder.Common.blur());
|
|
43
|
+
await (0, _utils.dispatchEvent)(element, 'endEditing', _eventBuilder.EventBuilder.TextInput.endEditing(emptyText));
|
|
44
|
+
await (0, _utils.dispatchEvent)(element, 'blur', _eventBuilder.EventBuilder.Common.blur());
|
|
45
45
|
}
|
|
46
46
|
//# sourceMappingURL=clear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.js","names":["_errors","require","_hostComponentNames","
|
|
1
|
+
{"version":3,"file":"clear.js","names":["_errors","require","_hostComponentNames","_pointerEvents","_textInput","_eventBuilder","_type","_utils","clear","element","isHostTextInput","ErrorWithStack","type","isEditableTextInput","isPointerEventEnabled","dispatchEvent","EventBuilder","Common","focus","textToClear","getTextInputValue","selectionRange","start","end","length","TextInput","selectionChange","emptyText","emitTypingEvents","config","key","text","wait","endEditing","blur"],"sources":["../../src/user-event/clear.ts"],"sourcesContent":["import type { HostElement } from 'universal-test-renderer';\n\nimport { ErrorWithStack } from '../helpers/errors';\nimport { isHostTextInput } from '../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../helpers/pointer-events';\nimport { getTextInputValue, isEditableTextInput } from '../helpers/text-input';\nimport { EventBuilder } from './event-builder';\nimport type { UserEventInstance } from './setup';\nimport { emitTypingEvents } from './type/type';\nimport { dispatchEvent, wait } from './utils';\n\nexport async function clear(this: UserEventInstance, element: HostElement): Promise<void> {\n if (!isHostTextInput(element)) {\n throw new ErrorWithStack(\n `clear() only supports host \"TextInput\" elements. Passed element has type: \"${element.type}\".`,\n clear,\n );\n }\n\n if (!isEditableTextInput(element) || !isPointerEventEnabled(element)) {\n return;\n }\n\n // 1. Enter element\n await dispatchEvent(element, 'focus', EventBuilder.Common.focus());\n\n // 2. Select all\n const textToClear = getTextInputValue(element);\n const selectionRange = {\n start: 0,\n end: textToClear.length,\n };\n await dispatchEvent(\n element,\n 'selectionChange',\n EventBuilder.TextInput.selectionChange(selectionRange),\n );\n\n // 3. Press backspace with selected text\n const emptyText = '';\n await emitTypingEvents(element, {\n config: this.config,\n key: 'Backspace',\n text: emptyText,\n });\n\n // 4. Exit element\n await wait(this.config);\n await dispatchEvent(element, 'endEditing', EventBuilder.TextInput.endEditing(emptyText));\n await dispatchEvent(element, 'blur', EventBuilder.Common.blur());\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAEA,IAAAK,KAAA,GAAAL,OAAA;AACA,IAAAM,MAAA,GAAAN,OAAA;AAEO,eAAeO,KAAKA,CAA0BC,OAAoB,EAAiB;EACxF,IAAI,CAAC,IAAAC,mCAAe,EAACD,OAAO,CAAC,EAAE;IAC7B,MAAM,IAAIE,sBAAc,CACtB,8EAA8EF,OAAO,CAACG,IAAI,IAAI,EAC9FJ,KACF,CAAC;EACH;EAEA,IAAI,CAAC,IAAAK,8BAAmB,EAACJ,OAAO,CAAC,IAAI,CAAC,IAAAK,oCAAqB,EAACL,OAAO,CAAC,EAAE;IACpE;EACF;;EAEA;EACA,MAAM,IAAAM,oBAAa,EAACN,OAAO,EAAE,OAAO,EAAEO,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;;EAElE;EACA,MAAMC,WAAW,GAAG,IAAAC,4BAAiB,EAACX,OAAO,CAAC;EAC9C,MAAMY,cAAc,GAAG;IACrBC,KAAK,EAAE,CAAC;IACRC,GAAG,EAAEJ,WAAW,CAACK;EACnB,CAAC;EACD,MAAM,IAAAT,oBAAa,EACjBN,OAAO,EACP,iBAAiB,EACjBO,0BAAY,CAACS,SAAS,CAACC,eAAe,CAACL,cAAc,CACvD,CAAC;;EAED;EACA,MAAMM,SAAS,GAAG,EAAE;EACpB,MAAM,IAAAC,sBAAgB,EAACnB,OAAO,EAAE;IAC9BoB,MAAM,EAAE,IAAI,CAACA,MAAM;IACnBC,GAAG,EAAE,WAAW;IAChBC,IAAI,EAAEJ;EACR,CAAC,CAAC;;EAEF;EACA,MAAM,IAAAK,WAAI,EAAC,IAAI,CAACH,MAAM,CAAC;EACvB,MAAM,IAAAd,oBAAa,EAACN,OAAO,EAAE,YAAY,EAAEO,0BAAY,CAACS,SAAS,CAACQ,UAAU,CAACN,SAAS,CAAC,CAAC;EACxF,MAAM,IAAAZ,oBAAa,EAACN,OAAO,EAAE,MAAM,EAAEO,0BAAY,CAACC,MAAM,CAACiB,IAAI,CAAC,CAAC,CAAC;AAClE","ignoreList":[]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { BaseSyntheticEvent } from 'react';
|
|
1
|
+
import type { BaseSyntheticEvent } from 'react';
|
|
2
2
|
/** Builds base syntentic event stub, with prop values as inspected in RN runtime. */
|
|
3
|
-
export declare function baseSyntheticEvent(): Partial<BaseSyntheticEvent<
|
|
3
|
+
export declare function baseSyntheticEvent(): Partial<BaseSyntheticEvent<object, unknown, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":["baseSyntheticEvent","currentTarget","target","preventDefault","isDefaultPrevented","stopPropagation","isPropagationStopped","persist","isPersistent","timeStamp"],"sources":["../../../src/user-event/event-builder/base.ts"],"sourcesContent":["import { BaseSyntheticEvent } from 'react';\n\n/** Builds base syntentic event stub, with prop values as inspected in RN runtime. */\nexport function baseSyntheticEvent(): Partial<BaseSyntheticEvent<
|
|
1
|
+
{"version":3,"file":"base.js","names":["baseSyntheticEvent","currentTarget","target","preventDefault","isDefaultPrevented","stopPropagation","isPropagationStopped","persist","isPersistent","timeStamp"],"sources":["../../../src/user-event/event-builder/base.ts"],"sourcesContent":["import type { BaseSyntheticEvent } from 'react';\n\n/** Builds base syntentic event stub, with prop values as inspected in RN runtime. */\nexport function baseSyntheticEvent(): Partial<BaseSyntheticEvent<object, unknown, unknown>> {\n return {\n currentTarget: {},\n target: {},\n preventDefault: () => {},\n isDefaultPrevented: () => false,\n stopPropagation: () => {},\n isPropagationStopped: () => false,\n persist: () => {},\n // @ts-expect-error: `isPersistent` is not a standard prop, but it's used in RN runtime. See: https://react.dev/reference/react-dom/components/common#react-event-object-methods\n isPersistent: () => false,\n timeStamp: 0,\n };\n}\n"],"mappings":";;;;;;AAEA;AACO,SAASA,kBAAkBA,CAAA,EAA0D;EAC1F,OAAO;IACLC,aAAa,EAAE,CAAC,CAAC;IACjBC,MAAM,EAAE,CAAC,CAAC;IACVC,cAAc,EAAEA,CAAA,KAAM,CAAC,CAAC;IACxBC,kBAAkB,EAAEA,CAAA,KAAM,KAAK;IAC/BC,eAAe,EAAEA,CAAA,KAAM,CAAC,CAAC;IACzBC,oBAAoB,EAAEA,CAAA,KAAM,KAAK;IACjCC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;IACjB;IACAC,YAAY,EAAEA,CAAA,KAAM,KAAK;IACzBC,SAAS,EAAE;EACb,CAAC;AACH","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-view.js","names":["_base","require","ScrollViewEventBuilder","exports","scroll","offset","y","x","options","baseSyntheticEvent","nativeEvent","contentInset","bottom","left","right","top","contentOffset","contentSize","height","width","layoutMeasurement","responderIgnoreScroll","target","velocity"],"sources":["../../../src/user-event/event-builder/scroll-view.ts"],"sourcesContent":["import { Point, Size } from '../../types';\nimport { baseSyntheticEvent } from './base';\n\n/**\n * Other options for constructing a scroll event.\n */\nexport type ScrollEventOptions = {\n contentSize?: Size;\n layoutMeasurement?: Size;\n};\n\n/**\n * Experimental values:\n * - iOS: `{\"contentInset\": {\"bottom\": 0, \"left\": 0, \"right\": 0, \"top\": 0}, \"contentOffset\": {\"x\": 0, \"y\": 5.333333333333333}, \"contentSize\": {\"height\": 1676.6666259765625, \"width\": 390}, \"layoutMeasurement\": {\"height\": 753, \"width\": 390}, \"zoomScale\": 1}`\n * - Android: `{\"contentInset\": {\"bottom\": 0, \"left\": 0, \"right\": 0, \"top\": 0}, \"contentOffset\": {\"x\": 0, \"y\": 31.619047164916992}, \"contentSize\": {\"height\": 1624.761962890625, \"width\": 411.4285583496094}, \"layoutMeasurement\": {\"height\": 785.5238037109375, \"width\": 411.4285583496094}, \"responderIgnoreScroll\": true, \"target\": 139, \"velocity\": {\"x\": -1.3633992671966553, \"y\": -1.3633992671966553}}`\n */\nexport const ScrollViewEventBuilder = {\n scroll: (offset: Point = { y: 0, x: 0 }, options?: ScrollEventOptions) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: {\n contentInset: { bottom: 0, left: 0, right: 0, top: 0 },\n contentOffset: { y: offset.y, x: offset.x },\n contentSize: {\n height: options?.contentSize?.height ?? 0,\n width: options?.contentSize?.width ?? 0,\n },\n layoutMeasurement: {\n height: options?.layoutMeasurement?.height ?? 0,\n width: options?.layoutMeasurement?.width ?? 0,\n },\n responderIgnoreScroll: true,\n target: 0,\n velocity: { y: 0, x: 0 },\n },\n };\n },\n};\n"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAEA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACO,MAAMC,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA,GAAG;EACpCE,MAAM,EAAEA,CAACC,MAAa,GAAG;IAAEC,CAAC,EAAE,CAAC;IAAEC,CAAC,EAAE;EAAE,CAAC,EAAEC,OAA4B,KAAK;IACxE,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QACXC,YAAY,EAAE;UAAEC,MAAM,EAAE,CAAC;UAAEC,IAAI,EAAE,CAAC;UAAEC,KAAK,EAAE,CAAC;UAAEC,GAAG,EAAE;QAAE,CAAC;QACtDC,aAAa,EAAE;UAAEV,CAAC,EAAED,MAAM,CAACC,CAAC;UAAEC,CAAC,EAAEF,MAAM,CAACE;QAAE,CAAC;QAC3CU,WAAW,EAAE;UACXC,MAAM,EAAEV,OAAO,EAAES,WAAW,EAAEC,MAAM,IAAI,CAAC;UACzCC,KAAK,EAAEX,OAAO,EAAES,WAAW,EAAEE,KAAK,IAAI;QACxC,CAAC;QACDC,iBAAiB,EAAE;UACjBF,MAAM,EAAEV,OAAO,EAAEY,iBAAiB,EAAEF,MAAM,IAAI,CAAC;UAC/CC,KAAK,EAAEX,OAAO,EAAEY,iBAAiB,EAAED,KAAK,IAAI;QAC9C,CAAC;QACDE,qBAAqB,EAAE,IAAI;QAC3BC,MAAM,EAAE,CAAC;QACTC,QAAQ,EAAE;UAAEjB,CAAC,EAAE,CAAC;UAAEC,CAAC,EAAE;QAAE;MACzB;IACF,CAAC;EACH;AACF,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"scroll-view.js","names":["_base","require","ScrollViewEventBuilder","exports","scroll","offset","y","x","options","baseSyntheticEvent","nativeEvent","contentInset","bottom","left","right","top","contentOffset","contentSize","height","width","layoutMeasurement","responderIgnoreScroll","target","velocity"],"sources":["../../../src/user-event/event-builder/scroll-view.ts"],"sourcesContent":["import type { Point, Size } from '../../types';\nimport { baseSyntheticEvent } from './base';\n\n/**\n * Other options for constructing a scroll event.\n */\nexport type ScrollEventOptions = {\n contentSize?: Size;\n layoutMeasurement?: Size;\n};\n\n/**\n * Experimental values:\n * - iOS: `{\"contentInset\": {\"bottom\": 0, \"left\": 0, \"right\": 0, \"top\": 0}, \"contentOffset\": {\"x\": 0, \"y\": 5.333333333333333}, \"contentSize\": {\"height\": 1676.6666259765625, \"width\": 390}, \"layoutMeasurement\": {\"height\": 753, \"width\": 390}, \"zoomScale\": 1}`\n * - Android: `{\"contentInset\": {\"bottom\": 0, \"left\": 0, \"right\": 0, \"top\": 0}, \"contentOffset\": {\"x\": 0, \"y\": 31.619047164916992}, \"contentSize\": {\"height\": 1624.761962890625, \"width\": 411.4285583496094}, \"layoutMeasurement\": {\"height\": 785.5238037109375, \"width\": 411.4285583496094}, \"responderIgnoreScroll\": true, \"target\": 139, \"velocity\": {\"x\": -1.3633992671966553, \"y\": -1.3633992671966553}}`\n */\nexport const ScrollViewEventBuilder = {\n scroll: (offset: Point = { y: 0, x: 0 }, options?: ScrollEventOptions) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: {\n contentInset: { bottom: 0, left: 0, right: 0, top: 0 },\n contentOffset: { y: offset.y, x: offset.x },\n contentSize: {\n height: options?.contentSize?.height ?? 0,\n width: options?.contentSize?.width ?? 0,\n },\n layoutMeasurement: {\n height: options?.layoutMeasurement?.height ?? 0,\n width: options?.layoutMeasurement?.width ?? 0,\n },\n responderIgnoreScroll: true,\n target: 0,\n velocity: { y: 0, x: 0 },\n },\n };\n },\n};\n"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAEA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACO,MAAMC,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA,GAAG;EACpCE,MAAM,EAAEA,CAACC,MAAa,GAAG;IAAEC,CAAC,EAAE,CAAC;IAAEC,CAAC,EAAE;EAAE,CAAC,EAAEC,OAA4B,KAAK;IACxE,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QACXC,YAAY,EAAE;UAAEC,MAAM,EAAE,CAAC;UAAEC,IAAI,EAAE,CAAC;UAAEC,KAAK,EAAE,CAAC;UAAEC,GAAG,EAAE;QAAE,CAAC;QACtDC,aAAa,EAAE;UAAEV,CAAC,EAAED,MAAM,CAACC,CAAC;UAAEC,CAAC,EAAEF,MAAM,CAACE;QAAE,CAAC;QAC3CU,WAAW,EAAE;UACXC,MAAM,EAAEV,OAAO,EAAES,WAAW,EAAEC,MAAM,IAAI,CAAC;UACzCC,KAAK,EAAEX,OAAO,EAAES,WAAW,EAAEE,KAAK,IAAI;QACxC,CAAC;QACDC,iBAAiB,EAAE;UACjBF,MAAM,EAAEV,OAAO,EAAEY,iBAAiB,EAAEF,MAAM,IAAI,CAAC;UAC/CC,KAAK,EAAEX,OAAO,EAAEY,iBAAiB,EAAED,KAAK,IAAI;QAC9C,CAAC;QACDE,qBAAqB,EAAE,IAAI;QAC3BC,MAAM,EAAE,CAAC;QACTC,QAAQ,EAAE;UAAEjB,CAAC,EAAE,CAAC;UAAEC,CAAC,EAAE;QAAE;MACzB;IACF,CAAC;EACH;AACF,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-input.js","names":["_base","require","TextInputEventBuilder","exports","change","text","baseSyntheticEvent","nativeEvent","target","eventCount","keyPress","key","submitEditing","endEditing","selectionChange","start","end","selection","contentSizeChange","width","height","contentSize"],"sources":["../../../src/user-event/event-builder/text-input.ts"],"sourcesContent":["import { Size } from '../../types';\nimport { TextRange } from '../utils/text-range';\nimport { baseSyntheticEvent } from './base';\n\nexport const TextInputEventBuilder = {\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"eventCount\": 6, \"target\": 53, \"text\": \"Tes\"}`\n */\n change: (text: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { text, target: 0, eventCount: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 3, \"key\": \"a\", \"target\": 75}`\n * - Android: `{\"key\": \"a\"}`\n */\n keyPress: (key: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { key },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"target\": 53, \"text\": \"Test\"}`\n */\n submitEditing: (text: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { text, target: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"target\": 53, \"text\": \"Test\"}`\n */\n endEditing: (text: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { text, target: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"selection\": {\"end\": 4, \"start\": 4}, \"target\": 75}`\n * - Android: `{\"selection\": {\"end\": 4, \"start\": 4}}`\n */\n selectionChange: ({ start, end }: TextRange) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { selection: { start, end } },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"contentSize\": {\"height\": 21.666666666666668, \"width\": 11.666666666666666}, \"target\": 75}`\n * - Android: `{\"contentSize\": {\"height\": 61.45454406738281, \"width\": 352.7272644042969}, \"target\": 53}`\n */\n contentSizeChange: ({ width, height }: Size) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { contentSize: { width, height }, target: 0 },\n };\n },\n};\n"],"mappings":";;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AAEO,MAAMC,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG;EACnC;AACF;AACA;AACA;AACA;EACEE,MAAM,EAAGC,IAAY,IAAK;IACxB,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEF,IAAI;QAAEG,MAAM,EAAE,CAAC;QAAEC,UAAU,EAAE;MAAE;IAChD,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,QAAQ,EAAGC,GAAW,IAAK;IACzB,OAAO;MACL,GAAG,IAAAL,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEI;MAAI;IACrB,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,aAAa,EAAGP,IAAY,IAAK;IAC/B,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEF,IAAI;QAAEG,MAAM,EAAE;MAAE;IACjC,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEK,UAAU,EAAGR,IAAY,IAAK;IAC5B,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEF,IAAI;QAAEG,MAAM,EAAE;MAAE;IACjC,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,eAAe,EAAEA,CAAC;IAAEC,KAAK;IAAEC;EAAe,CAAC,KAAK;IAC9C,OAAO;MACL,GAAG,IAAAV,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEU,SAAS,EAAE;UAAEF,KAAK;UAAEC;QAAI;MAAE;IAC3C,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,iBAAiB,EAAEA,CAAC;IAAEC,KAAK;IAAEC;EAAa,CAAC,KAAK;IAC9C,OAAO;MACL,GAAG,IAAAd,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEc,WAAW,EAAE;UAAEF,KAAK;UAAEC;QAAO,CAAC;QAAEZ,MAAM,EAAE;MAAE;IAC3D,CAAC;EACH;AACF,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"text-input.js","names":["_base","require","TextInputEventBuilder","exports","change","text","baseSyntheticEvent","nativeEvent","target","eventCount","keyPress","key","submitEditing","endEditing","selectionChange","start","end","selection","contentSizeChange","width","height","contentSize"],"sources":["../../../src/user-event/event-builder/text-input.ts"],"sourcesContent":["import type { Size } from '../../types';\nimport type { TextRange } from '../utils/text-range';\nimport { baseSyntheticEvent } from './base';\n\nexport const TextInputEventBuilder = {\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"eventCount\": 6, \"target\": 53, \"text\": \"Tes\"}`\n */\n change: (text: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { text, target: 0, eventCount: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 3, \"key\": \"a\", \"target\": 75}`\n * - Android: `{\"key\": \"a\"}`\n */\n keyPress: (key: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { key },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"target\": 53, \"text\": \"Test\"}`\n */\n submitEditing: (text: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { text, target: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"eventCount\": 4, \"target\": 75, \"text\": \"Test\"}`\n * - Android: `{\"target\": 53, \"text\": \"Test\"}`\n */\n endEditing: (text: string) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { text, target: 0 },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"selection\": {\"end\": 4, \"start\": 4}, \"target\": 75}`\n * - Android: `{\"selection\": {\"end\": 4, \"start\": 4}}`\n */\n selectionChange: ({ start, end }: TextRange) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { selection: { start, end } },\n };\n },\n\n /**\n * Experimental values:\n * - iOS: `{\"contentSize\": {\"height\": 21.666666666666668, \"width\": 11.666666666666666}, \"target\": 75}`\n * - Android: `{\"contentSize\": {\"height\": 61.45454406738281, \"width\": 352.7272644042969}, \"target\": 53}`\n */\n contentSizeChange: ({ width, height }: Size) => {\n return {\n ...baseSyntheticEvent(),\n nativeEvent: { contentSize: { width, height }, target: 0 },\n };\n },\n};\n"],"mappings":";;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AAEO,MAAMC,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG;EACnC;AACF;AACA;AACA;AACA;EACEE,MAAM,EAAGC,IAAY,IAAK;IACxB,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEF,IAAI;QAAEG,MAAM,EAAE,CAAC;QAAEC,UAAU,EAAE;MAAE;IAChD,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,QAAQ,EAAGC,GAAW,IAAK;IACzB,OAAO;MACL,GAAG,IAAAL,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEI;MAAI;IACrB,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,aAAa,EAAGP,IAAY,IAAK;IAC/B,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEF,IAAI;QAAEG,MAAM,EAAE;MAAE;IACjC,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEK,UAAU,EAAGR,IAAY,IAAK;IAC5B,OAAO;MACL,GAAG,IAAAC,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEF,IAAI;QAAEG,MAAM,EAAE;MAAE;IACjC,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,eAAe,EAAEA,CAAC;IAAEC,KAAK;IAAEC;EAAe,CAAC,KAAK;IAC9C,OAAO;MACL,GAAG,IAAAV,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEU,SAAS,EAAE;UAAEF,KAAK;UAAEC;QAAI;MAAE;IAC3C,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,iBAAiB,EAAEA,CAAC;IAAEC,KAAK;IAAEC;EAAa,CAAC,KAAK;IAC9C,OAAO;MACL,GAAG,IAAAd,wBAAkB,EAAC,CAAC;MACvBC,WAAW,EAAE;QAAEc,WAAW,EAAE;UAAEF,KAAK;UAAEC;QAAO,CAAC;QAAEZ,MAAM,EAAE;MAAE;IAC3D,CAAC;EACH;AACF,CAAC","ignoreList":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { HostElement } from 'universal-test-renderer';
|
|
1
|
+
import type { HostElement } from 'universal-test-renderer';
|
|
2
|
+
import type { PressOptions } from './press';
|
|
3
|
+
import type { ScrollToOptions } from './scroll';
|
|
2
4
|
import { setup } from './setup';
|
|
3
|
-
import {
|
|
4
|
-
import { TypeOptions } from './type';
|
|
5
|
-
import { ScrollToOptions } from './scroll';
|
|
5
|
+
import type { TypeOptions } from './type';
|
|
6
6
|
export { UserEventConfig } from './setup';
|
|
7
7
|
export declare const userEvent: {
|
|
8
8
|
setup: typeof setup;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_setup","require","userEvent","exports","setup","press","element","longPress","options","type","text","clear","paste","scrollTo"],"sources":["../../src/user-event/index.ts"],"sourcesContent":["import { HostElement } from 'universal-test-renderer';\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":["_setup","require","userEvent","exports","setup","press","element","longPress","options","type","text","clear","paste","scrollTo"],"sources":["../../src/user-event/index.ts"],"sourcesContent":["import type { HostElement } from 'universal-test-renderer';\n\nimport type { PressOptions } from './press';\nimport type { ScrollToOptions } from './scroll';\nimport { setup } from './setup';\nimport type { TypeOptions } from './type';\n\nexport { UserEventConfig } from './setup';\n\nexport const userEvent = {\n setup,\n\n // Direct access for User Event v13 compatibility\n press: (element: HostElement) => setup().press(element),\n longPress: (element: HostElement, options?: PressOptions) => setup().longPress(element, options),\n type: (element: HostElement, text: string, options?: TypeOptions) =>\n setup().type(element, text, options),\n clear: (element: HostElement) => setup().clear(element),\n paste: (element: HostElement, text: string) => setup().paste(element, text),\n scrollTo: (element: HostElement, options: ScrollToOptions) => setup().scrollTo(element, options),\n};\n"],"mappings":";;;;;;;;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AAKO,MAAMC,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG;EACvBE,KAAK,EAALA,YAAK;EAEL;EACAC,KAAK,EAAGC,OAAoB,IAAK,IAAAF,YAAK,EAAC,CAAC,CAACC,KAAK,CAACC,OAAO,CAAC;EACvDC,SAAS,EAAEA,CAACD,OAAoB,EAAEE,OAAsB,KAAK,IAAAJ,YAAK,EAAC,CAAC,CAACG,SAAS,CAACD,OAAO,EAAEE,OAAO,CAAC;EAChGC,IAAI,EAAEA,CAACH,OAAoB,EAAEI,IAAY,EAAEF,OAAqB,KAC9D,IAAAJ,YAAK,EAAC,CAAC,CAACK,IAAI,CAACH,OAAO,EAAEI,IAAI,EAAEF,OAAO,CAAC;EACtCG,KAAK,EAAGL,OAAoB,IAAK,IAAAF,YAAK,EAAC,CAAC,CAACO,KAAK,CAACL,OAAO,CAAC;EACvDM,KAAK,EAAEA,CAACN,OAAoB,EAAEI,IAAY,KAAK,IAAAN,YAAK,EAAC,CAAC,CAACQ,KAAK,CAACN,OAAO,EAAEI,IAAI,CAAC;EAC3EG,QAAQ,EAAEA,CAACP,OAAoB,EAAEE,OAAwB,KAAK,IAAAJ,YAAK,EAAC,CAAC,CAACS,QAAQ,CAACP,OAAO,EAAEE,OAAO;AACjG,CAAC","ignoreList":[]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { HostElement } from 'universal-test-renderer';
|
|
2
|
-
import { UserEventInstance } from './setup';
|
|
1
|
+
import type { HostElement } from 'universal-test-renderer';
|
|
2
|
+
import type { UserEventInstance } from './setup';
|
|
3
3
|
export declare function paste(this: UserEventInstance, element: HostElement, text: string): Promise<void>;
|
|
@@ -20,7 +20,7 @@ async function paste(element, text) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// 1. Enter element
|
|
23
|
-
(0, _utils.dispatchEvent)(element, 'focus', _eventBuilder.EventBuilder.Common.focus());
|
|
23
|
+
await (0, _utils.dispatchEvent)(element, 'focus', _eventBuilder.EventBuilder.Common.focus());
|
|
24
24
|
|
|
25
25
|
// 2. Select all
|
|
26
26
|
const textToClear = (0, _textInput.getTextInputValue)(element);
|
|
@@ -28,29 +28,29 @@ async function paste(element, text) {
|
|
|
28
28
|
start: 0,
|
|
29
29
|
end: textToClear.length
|
|
30
30
|
};
|
|
31
|
-
(0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(rangeToClear));
|
|
31
|
+
await (0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(rangeToClear));
|
|
32
32
|
|
|
33
33
|
// 3. Paste the text
|
|
34
34
|
_nativeState.nativeState.valueForElement.set(element, text);
|
|
35
|
-
(0, _utils.dispatchEvent)(element, 'change', _eventBuilder.EventBuilder.TextInput.change(text));
|
|
36
|
-
(0, _utils.dispatchEvent)(element, 'changeText', text);
|
|
35
|
+
await (0, _utils.dispatchEvent)(element, 'change', _eventBuilder.EventBuilder.TextInput.change(text));
|
|
36
|
+
await (0, _utils.dispatchEvent)(element, 'changeText', text);
|
|
37
37
|
const rangeAfter = {
|
|
38
38
|
start: text.length,
|
|
39
39
|
end: text.length
|
|
40
40
|
};
|
|
41
|
-
(0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(rangeAfter));
|
|
41
|
+
await (0, _utils.dispatchEvent)(element, 'selectionChange', _eventBuilder.EventBuilder.TextInput.selectionChange(rangeAfter));
|
|
42
42
|
|
|
43
43
|
// According to the docs only multiline TextInput emits contentSizeChange event
|
|
44
44
|
// @see: https://reactnative.dev/docs/textinput#oncontentsizechange
|
|
45
45
|
const isMultiline = element.props.multiline === true;
|
|
46
46
|
if (isMultiline) {
|
|
47
47
|
const contentSize = (0, _utils.getTextContentSize)(text);
|
|
48
|
-
(0, _utils.dispatchEvent)(element, 'contentSizeChange', _eventBuilder.EventBuilder.TextInput.contentSizeChange(contentSize));
|
|
48
|
+
await (0, _utils.dispatchEvent)(element, 'contentSizeChange', _eventBuilder.EventBuilder.TextInput.contentSizeChange(contentSize));
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
// 4. Exit element
|
|
52
52
|
await (0, _utils.wait)(this.config);
|
|
53
|
-
(0, _utils.dispatchEvent)(element, 'endEditing', _eventBuilder.EventBuilder.TextInput.endEditing(text));
|
|
54
|
-
(0, _utils.dispatchEvent)(element, 'blur', _eventBuilder.EventBuilder.Common.blur());
|
|
53
|
+
await (0, _utils.dispatchEvent)(element, 'endEditing', _eventBuilder.EventBuilder.TextInput.endEditing(text));
|
|
54
|
+
await (0, _utils.dispatchEvent)(element, 'blur', _eventBuilder.EventBuilder.Common.blur());
|
|
55
55
|
}
|
|
56
56
|
//# sourceMappingURL=paste.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste.js","names":["_errors","require","_hostComponentNames","_pointerEvents","_textInput","_nativeState","_eventBuilder","_utils","paste","element","text","isHostTextInput","ErrorWithStack","type","isEditableTextInput","isPointerEventEnabled","dispatchEvent","EventBuilder","Common","focus","textToClear","getTextInputValue","rangeToClear","start","end","length","TextInput","selectionChange","nativeState","valueForElement","set","change","rangeAfter","isMultiline","props","multiline","contentSize","getTextContentSize","contentSizeChange","wait","config","endEditing","blur"],"sources":["../../src/user-event/paste.ts"],"sourcesContent":["import { HostElement } from 'universal-test-renderer';\nimport { ErrorWithStack } from '../helpers/errors';\nimport { isHostTextInput } from '../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../helpers/pointer-events';\nimport { getTextInputValue, isEditableTextInput } from '../helpers/text-input';\nimport { nativeState } from '../native-state';\nimport { EventBuilder } from './event-builder';\nimport { UserEventInstance } from './setup';\nimport { dispatchEvent, getTextContentSize, wait } from './utils';\n\nexport async function paste(\n this: UserEventInstance,\n element: HostElement,\n text: string,\n): Promise<void> {\n if (!isHostTextInput(element)) {\n throw new ErrorWithStack(\n `paste() only supports host \"TextInput\" elements. Passed element has type: \"${element.type}\".`,\n paste,\n );\n }\n\n if (!isEditableTextInput(element) || !isPointerEventEnabled(element)) {\n return;\n }\n\n // 1. Enter element\n dispatchEvent(element, 'focus', EventBuilder.Common.focus());\n\n // 2. Select all\n const textToClear = getTextInputValue(element);\n const rangeToClear = { start: 0, end: textToClear.length };\n dispatchEvent(element
|
|
1
|
+
{"version":3,"file":"paste.js","names":["_errors","require","_hostComponentNames","_pointerEvents","_textInput","_nativeState","_eventBuilder","_utils","paste","element","text","isHostTextInput","ErrorWithStack","type","isEditableTextInput","isPointerEventEnabled","dispatchEvent","EventBuilder","Common","focus","textToClear","getTextInputValue","rangeToClear","start","end","length","TextInput","selectionChange","nativeState","valueForElement","set","change","rangeAfter","isMultiline","props","multiline","contentSize","getTextContentSize","contentSizeChange","wait","config","endEditing","blur"],"sources":["../../src/user-event/paste.ts"],"sourcesContent":["import type { HostElement } from 'universal-test-renderer';\n\nimport { ErrorWithStack } from '../helpers/errors';\nimport { isHostTextInput } from '../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../helpers/pointer-events';\nimport { getTextInputValue, isEditableTextInput } from '../helpers/text-input';\nimport { nativeState } from '../native-state';\nimport { EventBuilder } from './event-builder';\nimport type { UserEventInstance } from './setup';\nimport { dispatchEvent, getTextContentSize, wait } from './utils';\n\nexport async function paste(\n this: UserEventInstance,\n element: HostElement,\n text: string,\n): Promise<void> {\n if (!isHostTextInput(element)) {\n throw new ErrorWithStack(\n `paste() only supports host \"TextInput\" elements. Passed element has type: \"${element.type}\".`,\n paste,\n );\n }\n\n if (!isEditableTextInput(element) || !isPointerEventEnabled(element)) {\n return;\n }\n\n // 1. Enter element\n await dispatchEvent(element, 'focus', EventBuilder.Common.focus());\n\n // 2. Select all\n const textToClear = getTextInputValue(element);\n const rangeToClear = { start: 0, end: textToClear.length };\n await dispatchEvent(\n element,\n 'selectionChange',\n EventBuilder.TextInput.selectionChange(rangeToClear),\n );\n\n // 3. Paste the text\n nativeState.valueForElement.set(element, text);\n await dispatchEvent(element, 'change', EventBuilder.TextInput.change(text));\n await dispatchEvent(element, 'changeText', text);\n\n const rangeAfter = { start: text.length, end: text.length };\n await dispatchEvent(\n element,\n 'selectionChange',\n EventBuilder.TextInput.selectionChange(rangeAfter),\n );\n\n // According to the docs only multiline TextInput emits contentSizeChange event\n // @see: https://reactnative.dev/docs/textinput#oncontentsizechange\n const isMultiline = element.props.multiline === true;\n if (isMultiline) {\n const contentSize = getTextContentSize(text);\n await dispatchEvent(\n element,\n 'contentSizeChange',\n EventBuilder.TextInput.contentSizeChange(contentSize),\n );\n }\n\n // 4. Exit element\n await wait(this.config);\n await dispatchEvent(element, 'endEditing', EventBuilder.TextInput.endEditing(text));\n await dispatchEvent(element, 'blur', EventBuilder.Common.blur());\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,YAAA,GAAAJ,OAAA;AACA,IAAAK,aAAA,GAAAL,OAAA;AAEA,IAAAM,MAAA,GAAAN,OAAA;AAEO,eAAeO,KAAKA,CAEzBC,OAAoB,EACpBC,IAAY,EACG;EACf,IAAI,CAAC,IAAAC,mCAAe,EAACF,OAAO,CAAC,EAAE;IAC7B,MAAM,IAAIG,sBAAc,CACtB,8EAA8EH,OAAO,CAACI,IAAI,IAAI,EAC9FL,KACF,CAAC;EACH;EAEA,IAAI,CAAC,IAAAM,8BAAmB,EAACL,OAAO,CAAC,IAAI,CAAC,IAAAM,oCAAqB,EAACN,OAAO,CAAC,EAAE;IACpE;EACF;;EAEA;EACA,MAAM,IAAAO,oBAAa,EAACP,OAAO,EAAE,OAAO,EAAEQ,0BAAY,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;;EAElE;EACA,MAAMC,WAAW,GAAG,IAAAC,4BAAiB,EAACZ,OAAO,CAAC;EAC9C,MAAMa,YAAY,GAAG;IAAEC,KAAK,EAAE,CAAC;IAAEC,GAAG,EAAEJ,WAAW,CAACK;EAAO,CAAC;EAC1D,MAAM,IAAAT,oBAAa,EACjBP,OAAO,EACP,iBAAiB,EACjBQ,0BAAY,CAACS,SAAS,CAACC,eAAe,CAACL,YAAY,CACrD,CAAC;;EAED;EACAM,wBAAW,CAACC,eAAe,CAACC,GAAG,CAACrB,OAAO,EAAEC,IAAI,CAAC;EAC9C,MAAM,IAAAM,oBAAa,EAACP,OAAO,EAAE,QAAQ,EAAEQ,0BAAY,CAACS,SAAS,CAACK,MAAM,CAACrB,IAAI,CAAC,CAAC;EAC3E,MAAM,IAAAM,oBAAa,EAACP,OAAO,EAAE,YAAY,EAAEC,IAAI,CAAC;EAEhD,MAAMsB,UAAU,GAAG;IAAET,KAAK,EAAEb,IAAI,CAACe,MAAM;IAAED,GAAG,EAAEd,IAAI,CAACe;EAAO,CAAC;EAC3D,MAAM,IAAAT,oBAAa,EACjBP,OAAO,EACP,iBAAiB,EACjBQ,0BAAY,CAACS,SAAS,CAACC,eAAe,CAACK,UAAU,CACnD,CAAC;;EAED;EACA;EACA,MAAMC,WAAW,GAAGxB,OAAO,CAACyB,KAAK,CAACC,SAAS,KAAK,IAAI;EACpD,IAAIF,WAAW,EAAE;IACf,MAAMG,WAAW,GAAG,IAAAC,yBAAkB,EAAC3B,IAAI,CAAC;IAC5C,MAAM,IAAAM,oBAAa,EACjBP,OAAO,EACP,mBAAmB,EACnBQ,0BAAY,CAACS,SAAS,CAACY,iBAAiB,CAACF,WAAW,CACtD,CAAC;EACH;;EAEA;EACA,MAAM,IAAAG,WAAI,EAAC,IAAI,CAACC,MAAM,CAAC;EACvB,MAAM,IAAAxB,oBAAa,EAACP,OAAO,EAAE,YAAY,EAAEQ,0BAAY,CAACS,SAAS,CAACe,UAAU,CAAC/B,IAAI,CAAC,CAAC;EACnF,MAAM,IAAAM,oBAAa,EAACP,OAAO,EAAE,MAAM,EAAEQ,0BAAY,CAACC,MAAM,CAACwB,IAAI,CAAC,CAAC,CAAC;AAClE","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { longPress, press, PressOptions } from './press';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_press","require"],"sources":["../../../src/user-event/press/index.ts"],"sourcesContent":["export {
|
|
1
|
+
{"version":3,"file":"index.js","names":["_press","require"],"sources":["../../../src/user-event/press/index.ts"],"sourcesContent":["export { longPress, press, PressOptions } from './press';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HostElement } from 'universal-test-renderer';
|
|
2
|
-
import { UserEventInstance } from '../setup';
|
|
1
|
+
import type { HostElement } from 'universal-test-renderer';
|
|
2
|
+
import type { UserEventInstance } from '../setup';
|
|
3
3
|
export declare const DEFAULT_MIN_PRESS_DURATION = 130;
|
|
4
4
|
export declare const DEFAULT_LONG_PRESS_DELAY_MS = 500;
|
|
5
5
|
export interface PressOptions {
|
|
@@ -7,9 +7,11 @@ exports.DEFAULT_MIN_PRESS_DURATION = exports.DEFAULT_LONG_PRESS_DELAY_MS = void
|
|
|
7
7
|
exports.longPress = longPress;
|
|
8
8
|
exports.press = press;
|
|
9
9
|
var _act = _interopRequireDefault(require("../../act"));
|
|
10
|
-
var
|
|
11
|
-
var
|
|
10
|
+
var _eventHandler = require("../../event-handler");
|
|
11
|
+
var _componentTree = require("../../helpers/component-tree");
|
|
12
|
+
var _errors = require("../../helpers/errors");
|
|
12
13
|
var _hostComponentNames = require("../../helpers/host-component-names");
|
|
14
|
+
var _pointerEvents = require("../../helpers/pointer-events");
|
|
13
15
|
var _eventBuilder = require("../event-builder");
|
|
14
16
|
var _utils = require("../utils");
|
|
15
17
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -18,92 +20,89 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
18
20
|
const DEFAULT_MIN_PRESS_DURATION = exports.DEFAULT_MIN_PRESS_DURATION = 130;
|
|
19
21
|
const DEFAULT_LONG_PRESS_DELAY_MS = exports.DEFAULT_LONG_PRESS_DELAY_MS = 500;
|
|
20
22
|
async function press(element) {
|
|
23
|
+
if (!(0, _componentTree.isHostElement)(element)) {
|
|
24
|
+
throw new _errors.ErrorWithStack(`press() works only with host elements.`, press);
|
|
25
|
+
}
|
|
21
26
|
await basePress(this.config, element, {
|
|
22
27
|
type: 'press'
|
|
23
28
|
});
|
|
24
29
|
}
|
|
25
30
|
async function longPress(element, options) {
|
|
31
|
+
if (!(0, _componentTree.isHostElement)(element)) {
|
|
32
|
+
throw new _errors.ErrorWithStack(`longPress() works only with host elements.`, longPress);
|
|
33
|
+
}
|
|
26
34
|
await basePress(this.config, element, {
|
|
27
35
|
type: 'longPress',
|
|
28
36
|
duration: options?.duration ?? DEFAULT_LONG_PRESS_DELAY_MS
|
|
29
37
|
});
|
|
30
38
|
}
|
|
31
39
|
const basePress = async (config, element, options) => {
|
|
32
|
-
if (
|
|
33
|
-
await
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if ((0, _textInput.isEditableTextInput)(element) && (0, _pointerEvents.isPointerEventEnabled)(element)) {
|
|
37
|
-
await emitTextInputPressEvents(config, element, options);
|
|
40
|
+
if (isEnabledHostElement(element) && hasPressEventHandler(element)) {
|
|
41
|
+
await emitDirectPressEvents(config, element, options);
|
|
38
42
|
return;
|
|
39
43
|
}
|
|
40
44
|
if (isEnabledTouchResponder(element)) {
|
|
41
|
-
await
|
|
45
|
+
await emitPressabilityPressEvents(config, element, options);
|
|
42
46
|
return;
|
|
43
47
|
}
|
|
44
|
-
|
|
45
|
-
if (!hostParentElement) {
|
|
48
|
+
if (!element.parent) {
|
|
46
49
|
return;
|
|
47
50
|
}
|
|
48
|
-
await basePress(config,
|
|
51
|
+
await basePress(config, element.parent, options);
|
|
49
52
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const duration = options.duration ?? DEFAULT_MIN_PRESS_DURATION;
|
|
54
|
-
await (0, _utils.wait)(config, duration);
|
|
55
|
-
(0, _utils.dispatchEvent)(element, 'responderRelease', _eventBuilder.EventBuilder.Common.responderRelease());
|
|
56
|
-
|
|
57
|
-
// React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION
|
|
58
|
-
// before emitting the `pressOut` event. We need to wait here, so that
|
|
59
|
-
// `press()` function does not return before that.
|
|
60
|
-
if (DEFAULT_MIN_PRESS_DURATION - duration > 0) {
|
|
61
|
-
await (0, _act.default)(async () => {
|
|
62
|
-
await (0, _utils.wait)(config, DEFAULT_MIN_PRESS_DURATION - duration);
|
|
63
|
-
});
|
|
53
|
+
function isEnabledHostElement(element) {
|
|
54
|
+
if (!(0, _pointerEvents.isPointerEventEnabled)(element)) {
|
|
55
|
+
return false;
|
|
64
56
|
}
|
|
65
|
-
|
|
66
|
-
|
|
57
|
+
if ((0, _hostComponentNames.isHostText)(element)) {
|
|
58
|
+
return element.props.disabled !== true;
|
|
59
|
+
}
|
|
60
|
+
if ((0, _hostComponentNames.isHostTextInput)(element)) {
|
|
61
|
+
return element.props.editable !== false;
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
function isEnabledTouchResponder(element) {
|
|
67
66
|
return (0, _pointerEvents.isPointerEventEnabled)(element) && element.props.onStartShouldSetResponder?.();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
};
|
|
67
|
+
}
|
|
68
|
+
function hasPressEventHandler(element) {
|
|
69
|
+
return (0, _eventHandler.getEventHandlerFromProps)(element.props, 'press') || (0, _eventHandler.getEventHandlerFromProps)(element.props, 'longPress') || (0, _eventHandler.getEventHandlerFromProps)(element.props, 'pressIn') || (0, _eventHandler.getEventHandlerFromProps)(element.props, 'pressOut');
|
|
70
|
+
}
|
|
73
71
|
|
|
74
72
|
/**
|
|
75
|
-
* Dispatches a press event sequence for
|
|
73
|
+
* Dispatches a press event sequence for host elements that have `onPress*` event handlers.
|
|
76
74
|
*/
|
|
77
|
-
async function
|
|
75
|
+
async function emitDirectPressEvents(config, element, options) {
|
|
78
76
|
await (0, _utils.wait)(config);
|
|
79
|
-
(0, _utils.dispatchEvent)(element, 'pressIn', _eventBuilder.EventBuilder.Common.touch());
|
|
77
|
+
await (0, _utils.dispatchEvent)(element, 'pressIn', _eventBuilder.EventBuilder.Common.touch());
|
|
80
78
|
await (0, _utils.wait)(config, options.duration);
|
|
81
79
|
|
|
82
80
|
// Long press events are emitted before `pressOut`.
|
|
83
81
|
if (options.type === 'longPress') {
|
|
84
|
-
(0, _utils.dispatchEvent)(element, 'longPress', _eventBuilder.EventBuilder.Common.touch());
|
|
82
|
+
await (0, _utils.dispatchEvent)(element, 'longPress', _eventBuilder.EventBuilder.Common.touch());
|
|
85
83
|
}
|
|
86
|
-
(0, _utils.dispatchEvent)(element, 'pressOut', _eventBuilder.EventBuilder.Common.touch());
|
|
84
|
+
await (0, _utils.dispatchEvent)(element, 'pressOut', _eventBuilder.EventBuilder.Common.touch());
|
|
87
85
|
|
|
88
86
|
// Regular press events are emitted after `pressOut` according to the React Native docs.
|
|
89
87
|
// See: https://reactnative.dev/docs/pressable#onpress
|
|
90
88
|
// Experimentally for very short presses (< 130ms) `press` events are actually emitted before `onPressOut`, but
|
|
91
89
|
// we will ignore that as in reality most pressed would be above the 130ms threshold.
|
|
92
90
|
if (options.type === 'press') {
|
|
93
|
-
(0, _utils.dispatchEvent)(element, 'press', _eventBuilder.EventBuilder.Common.touch());
|
|
91
|
+
await (0, _utils.dispatchEvent)(element, 'press', _eventBuilder.EventBuilder.Common.touch());
|
|
94
92
|
}
|
|
95
93
|
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Dispatches a press event sequence for TextInput.
|
|
99
|
-
*/
|
|
100
|
-
async function emitTextInputPressEvents(config, element, options) {
|
|
94
|
+
async function emitPressabilityPressEvents(config, element, options) {
|
|
101
95
|
await (0, _utils.wait)(config);
|
|
102
|
-
(0, _utils.dispatchEvent)(element, '
|
|
103
|
-
|
|
104
|
-
|
|
96
|
+
await (0, _utils.dispatchEvent)(element, 'responderGrant', _eventBuilder.EventBuilder.Common.responderGrant());
|
|
97
|
+
const duration = options.duration ?? DEFAULT_MIN_PRESS_DURATION;
|
|
98
|
+
await (0, _utils.wait)(config, duration);
|
|
99
|
+
await (0, _utils.dispatchEvent)(element, 'responderRelease', _eventBuilder.EventBuilder.Common.responderRelease());
|
|
105
100
|
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
// React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION
|
|
102
|
+
// before emitting the `pressOut` event. We need to wait here, so that
|
|
103
|
+
// `press()` function does not return before that.
|
|
104
|
+
if (DEFAULT_MIN_PRESS_DURATION - duration > 0) {
|
|
105
|
+
await (0, _act.default)(() => (0, _utils.wait)(config, DEFAULT_MIN_PRESS_DURATION - duration));
|
|
106
|
+
}
|
|
108
107
|
}
|
|
109
108
|
//# sourceMappingURL=press.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"press.js","names":["_act","_interopRequireDefault","require","
|
|
1
|
+
{"version":3,"file":"press.js","names":["_act","_interopRequireDefault","require","_eventHandler","_componentTree","_errors","_hostComponentNames","_pointerEvents","_eventBuilder","_utils","e","__esModule","default","DEFAULT_MIN_PRESS_DURATION","exports","DEFAULT_LONG_PRESS_DELAY_MS","press","element","isHostElement","ErrorWithStack","basePress","config","type","longPress","options","duration","isEnabledHostElement","hasPressEventHandler","emitDirectPressEvents","isEnabledTouchResponder","emitPressabilityPressEvents","parent","isPointerEventEnabled","isHostText","props","disabled","isHostTextInput","editable","onStartShouldSetResponder","getEventHandlerFromProps","wait","dispatchEvent","EventBuilder","Common","touch","responderGrant","responderRelease","act"],"sources":["../../../src/user-event/press/press.ts"],"sourcesContent":["import type { HostElement } from 'universal-test-renderer';\n\nimport act from '../../act';\nimport { getEventHandlerFromProps } from '../../event-handler';\nimport { isHostElement } from '../../helpers/component-tree';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostText, isHostTextInput } from '../../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../../helpers/pointer-events';\nimport { EventBuilder } from '../event-builder';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\n\n// These are constants defined in the React Native repo\n// See: https://github.com/facebook/react-native/blob/50e38cc9f1e6713228a91ad50f426c4f65e65e1a/packages/react-native/Libraries/Pressability/Pressability.js#L264\nexport const DEFAULT_MIN_PRESS_DURATION = 130;\nexport const DEFAULT_LONG_PRESS_DELAY_MS = 500;\n\nexport interface PressOptions {\n duration?: number;\n}\n\nexport async function press(this: UserEventInstance, element: HostElement): Promise<void> {\n if (!isHostElement(element)) {\n throw new ErrorWithStack(`press() works only with host elements.`, press);\n }\n\n await basePress(this.config, element, {\n type: 'press',\n });\n}\n\nexport async function longPress(\n this: UserEventInstance,\n element: HostElement,\n options?: PressOptions,\n): Promise<void> {\n if (!isHostElement(element)) {\n throw new ErrorWithStack(`longPress() works only with host elements.`, longPress);\n }\n\n await basePress(this.config, element, {\n type: 'longPress',\n duration: options?.duration ?? DEFAULT_LONG_PRESS_DELAY_MS,\n });\n}\n\ninterface BasePressOptions {\n type: 'press' | 'longPress';\n duration?: number;\n}\n\nconst basePress = async (\n config: UserEventConfig,\n element: HostElement,\n options: BasePressOptions,\n): Promise<void> => {\n if (isEnabledHostElement(element) && hasPressEventHandler(element)) {\n await emitDirectPressEvents(config, element, options);\n return;\n }\n\n if (isEnabledTouchResponder(element)) {\n await emitPressabilityPressEvents(config, element, options);\n return;\n }\n\n if (!element.parent) {\n return;\n }\n\n await basePress(config, element.parent, options);\n};\n\nfunction isEnabledHostElement(element: HostElement) {\n if (!isPointerEventEnabled(element)) {\n return false;\n }\n\n if (isHostText(element)) {\n return element.props.disabled !== true;\n }\n\n if (isHostTextInput(element)) {\n return element.props.editable !== false;\n }\n\n return true;\n}\n\nfunction isEnabledTouchResponder(element: HostElement) {\n return isPointerEventEnabled(element) && element.props.onStartShouldSetResponder?.();\n}\n\nfunction hasPressEventHandler(element: HostElement) {\n return (\n getEventHandlerFromProps(element.props, 'press') ||\n getEventHandlerFromProps(element.props, 'longPress') ||\n getEventHandlerFromProps(element.props, 'pressIn') ||\n getEventHandlerFromProps(element.props, 'pressOut')\n );\n}\n\n/**\n * Dispatches a press event sequence for host elements that have `onPress*` event handlers.\n */\nasync function emitDirectPressEvents(\n config: UserEventConfig,\n element: HostElement,\n options: BasePressOptions,\n) {\n await wait(config);\n await dispatchEvent(element, 'pressIn', EventBuilder.Common.touch());\n\n await wait(config, options.duration);\n\n // Long press events are emitted before `pressOut`.\n if (options.type === 'longPress') {\n await dispatchEvent(element, 'longPress', EventBuilder.Common.touch());\n }\n\n await dispatchEvent(element, 'pressOut', EventBuilder.Common.touch());\n\n // Regular press events are emitted after `pressOut` according to the React Native docs.\n // See: https://reactnative.dev/docs/pressable#onpress\n // Experimentally for very short presses (< 130ms) `press` events are actually emitted before `onPressOut`, but\n // we will ignore that as in reality most pressed would be above the 130ms threshold.\n if (options.type === 'press') {\n await dispatchEvent(element, 'press', EventBuilder.Common.touch());\n }\n}\n\nasync function emitPressabilityPressEvents(\n config: UserEventConfig,\n element: HostElement,\n options: BasePressOptions,\n) {\n await wait(config);\n\n await dispatchEvent(element, 'responderGrant', EventBuilder.Common.responderGrant());\n\n const duration = options.duration ?? DEFAULT_MIN_PRESS_DURATION;\n await wait(config, duration);\n\n await dispatchEvent(element, 'responderRelease', EventBuilder.Common.responderRelease());\n\n // React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION\n // before emitting the `pressOut` event. We need to wait here, so that\n // `press()` function does not return before that.\n if (DEFAULT_MIN_PRESS_DURATION - duration > 0) {\n await act(() => wait(config, DEFAULT_MIN_PRESS_DURATION - duration));\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { scrollTo, ScrollToOptions } from './scroll-to';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_scrollTo","require"],"sources":["../../../src/user-event/scroll/index.ts"],"sourcesContent":["export {
|
|
1
|
+
{"version":3,"file":"index.js","names":["_scrollTo","require"],"sources":["../../../src/user-event/scroll/index.ts"],"sourcesContent":["export { scrollTo, ScrollToOptions } from './scroll-to';\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { HostElement } from 'universal-test-renderer';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { HostElement } from 'universal-test-renderer';
|
|
2
|
+
import type { Size } from '../../types';
|
|
3
|
+
import type { UserEventInstance } from '../setup';
|
|
4
4
|
interface CommonScrollToOptions {
|
|
5
5
|
contentSize?: Size;
|
|
6
6
|
layoutMeasurement?: Size;
|
|
@@ -5,11 +5,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.scrollTo = scrollTo;
|
|
7
7
|
var _jestMatcherUtils = require("jest-matcher-utils");
|
|
8
|
-
var _eventBuilder = require("../event-builder");
|
|
9
8
|
var _errors = require("../../helpers/errors");
|
|
10
9
|
var _hostComponentNames = require("../../helpers/host-component-names");
|
|
11
10
|
var _object = require("../../helpers/object");
|
|
12
11
|
var _nativeState = require("../../native-state");
|
|
12
|
+
var _eventBuilder = require("../event-builder");
|
|
13
13
|
var _utils = require("../utils");
|
|
14
14
|
var _utils2 = require("./utils");
|
|
15
15
|
async function scrollTo(element, options) {
|
|
@@ -17,7 +17,7 @@ async function scrollTo(element, options) {
|
|
|
17
17
|
throw new _errors.ErrorWithStack(`scrollTo() works only with host "ScrollView" elements. Passed element has type "${element.type}".`, scrollTo);
|
|
18
18
|
}
|
|
19
19
|
ensureScrollViewDirection(element, options);
|
|
20
|
-
(0, _utils.dispatchEvent)(element, 'contentSizeChange', options.contentSize?.width ?? 0, options.contentSize?.height ?? 0);
|
|
20
|
+
await (0, _utils.dispatchEvent)(element, 'contentSizeChange', options.contentSize?.width ?? 0, options.contentSize?.height ?? 0);
|
|
21
21
|
const initialOffset = _nativeState.nativeState.contentOffsetForElement.get(element) ?? {
|
|
22
22
|
x: 0,
|
|
23
23
|
y: 0
|
|
@@ -41,36 +41,36 @@ async function emitDragScrollEvents(config, element, scrollSteps, scrollOptions)
|
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
await (0, _utils.wait)(config);
|
|
44
|
-
(0, _utils.dispatchEvent)(element, 'scrollBeginDrag', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions));
|
|
44
|
+
await (0, _utils.dispatchEvent)(element, 'scrollBeginDrag', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions));
|
|
45
45
|
|
|
46
46
|
// Note: experimentally, in case of drag scroll the last scroll step
|
|
47
47
|
// will not trigger `scroll` event.
|
|
48
48
|
// See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events
|
|
49
49
|
for (let i = 1; i < scrollSteps.length - 1; i += 1) {
|
|
50
50
|
await (0, _utils.wait)(config);
|
|
51
|
-
(0, _utils.dispatchEvent)(element, 'scroll', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions));
|
|
51
|
+
await (0, _utils.dispatchEvent)(element, 'scroll', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions));
|
|
52
52
|
}
|
|
53
53
|
await (0, _utils.wait)(config);
|
|
54
54
|
const lastStep = scrollSteps.at(-1);
|
|
55
|
-
(0, _utils.dispatchEvent)(element, 'scrollEndDrag', _eventBuilder.EventBuilder.ScrollView.scroll(lastStep, scrollOptions));
|
|
55
|
+
await (0, _utils.dispatchEvent)(element, 'scrollEndDrag', _eventBuilder.EventBuilder.ScrollView.scroll(lastStep, scrollOptions));
|
|
56
56
|
}
|
|
57
57
|
async function emitMomentumScrollEvents(config, element, scrollSteps, scrollOptions) {
|
|
58
58
|
if (scrollSteps.length === 0) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
await (0, _utils.wait)(config);
|
|
62
|
-
(0, _utils.dispatchEvent)(element, 'momentumScrollBegin', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions));
|
|
62
|
+
await (0, _utils.dispatchEvent)(element, 'momentumScrollBegin', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions));
|
|
63
63
|
|
|
64
64
|
// Note: experimentally, in case of momentum scroll the last scroll step
|
|
65
65
|
// will trigger `scroll` event.
|
|
66
66
|
// See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events
|
|
67
67
|
for (let i = 1; i < scrollSteps.length; i += 1) {
|
|
68
68
|
await (0, _utils.wait)(config);
|
|
69
|
-
(0, _utils.dispatchEvent)(element, 'scroll', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions));
|
|
69
|
+
await (0, _utils.dispatchEvent)(element, 'scroll', _eventBuilder.EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions));
|
|
70
70
|
}
|
|
71
71
|
await (0, _utils.wait)(config);
|
|
72
72
|
const lastStep = scrollSteps.at(-1);
|
|
73
|
-
(0, _utils.dispatchEvent)(element, 'momentumScrollEnd', _eventBuilder.EventBuilder.ScrollView.scroll(lastStep, scrollOptions));
|
|
73
|
+
await (0, _utils.dispatchEvent)(element, 'momentumScrollEnd', _eventBuilder.EventBuilder.ScrollView.scroll(lastStep, scrollOptions));
|
|
74
74
|
}
|
|
75
75
|
function ensureScrollViewDirection(element, options) {
|
|
76
76
|
const isVerticalScrollView = element.props.horizontal !== true;
|