@interactors/core 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +9 -0
  3. package/dist/cjs/constructor.js +260 -0
  4. package/dist/cjs/constructor.js.map +1 -0
  5. package/dist/cjs/converge.js +27 -0
  6. package/dist/cjs/converge.js.map +1 -0
  7. package/dist/cjs/create-interactor.js +24 -0
  8. package/dist/cjs/create-interactor.js.map +1 -0
  9. package/dist/cjs/dispatch.js +34 -0
  10. package/dist/cjs/dispatch.js.map +1 -0
  11. package/dist/cjs/element/click.js +12 -0
  12. package/dist/cjs/element/click.js.map +1 -0
  13. package/dist/cjs/element/fill-in.js +71 -0
  14. package/dist/cjs/element/fill-in.js.map +1 -0
  15. package/dist/cjs/errors.js +32 -0
  16. package/dist/cjs/errors.js.map +1 -0
  17. package/dist/cjs/escape-html.js +13 -0
  18. package/dist/cjs/escape-html.js.map +1 -0
  19. package/dist/cjs/filter-set.js +50 -0
  20. package/dist/cjs/filter-set.js.map +1 -0
  21. package/dist/cjs/focused.js +47 -0
  22. package/dist/cjs/focused.js.map +1 -0
  23. package/dist/cjs/format-table.js +30 -0
  24. package/dist/cjs/format-table.js.map +1 -0
  25. package/dist/cjs/index.js +47 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/inspector.js +22 -0
  28. package/dist/cjs/inspector.js.map +1 -0
  29. package/dist/cjs/interaction.js +53 -0
  30. package/dist/cjs/interaction.js.map +1 -0
  31. package/dist/cjs/locator.js +19 -0
  32. package/dist/cjs/locator.js.map +1 -0
  33. package/dist/cjs/match.js +135 -0
  34. package/dist/cjs/match.js.map +1 -0
  35. package/dist/cjs/matcher.js +30 -0
  36. package/dist/cjs/matcher.js.map +1 -0
  37. package/dist/cjs/matchers/and.js +16 -0
  38. package/dist/cjs/matchers/and.js.map +1 -0
  39. package/dist/cjs/matchers/every.js +16 -0
  40. package/dist/cjs/matchers/every.js.map +1 -0
  41. package/dist/cjs/matchers/including.js +15 -0
  42. package/dist/cjs/matchers/including.js.map +1 -0
  43. package/dist/cjs/matchers/matching.js +15 -0
  44. package/dist/cjs/matchers/matching.js.map +1 -0
  45. package/dist/cjs/matchers/not.js +16 -0
  46. package/dist/cjs/matchers/not.js.map +1 -0
  47. package/dist/cjs/matchers/or.js +16 -0
  48. package/dist/cjs/matchers/or.js.map +1 -0
  49. package/dist/cjs/matchers/some.js +16 -0
  50. package/dist/cjs/matchers/some.js.map +1 -0
  51. package/dist/cjs/merge-objects.js +3 -0
  52. package/dist/cjs/merge-objects.js.map +1 -0
  53. package/dist/cjs/perform.js +13 -0
  54. package/dist/cjs/perform.js.map +1 -0
  55. package/dist/cjs/specification.js +4 -0
  56. package/dist/cjs/specification.js.map +1 -0
  57. package/dist/constructor.d.ts +11 -0
  58. package/dist/constructor.d.ts.map +1 -0
  59. package/dist/converge.d.ts +2 -0
  60. package/dist/converge.d.ts.map +1 -0
  61. package/dist/create-interactor.d.ts +18 -0
  62. package/dist/create-interactor.d.ts.map +1 -0
  63. package/dist/dispatch.d.ts +6 -0
  64. package/dist/dispatch.d.ts.map +1 -0
  65. package/dist/element/click.d.ts +2 -0
  66. package/dist/element/click.d.ts.map +1 -0
  67. package/dist/element/fill-in.d.ts +12 -0
  68. package/dist/element/fill-in.d.ts.map +1 -0
  69. package/dist/errors.d.ts +13 -0
  70. package/dist/errors.d.ts.map +1 -0
  71. package/dist/escape-html.d.ts +2 -0
  72. package/dist/escape-html.d.ts.map +1 -0
  73. package/dist/esm/constructor.js +248 -0
  74. package/dist/esm/constructor.js.map +1 -0
  75. package/dist/esm/converge.js +23 -0
  76. package/dist/esm/converge.js.map +1 -0
  77. package/dist/esm/create-interactor.js +20 -0
  78. package/dist/esm/create-interactor.js.map +1 -0
  79. package/dist/esm/dispatch.js +26 -0
  80. package/dist/esm/dispatch.js.map +1 -0
  81. package/dist/esm/element/click.js +5 -0
  82. package/dist/esm/element/click.js.map +1 -0
  83. package/dist/esm/element/fill-in.js +67 -0
  84. package/dist/esm/element/fill-in.js.map +1 -0
  85. package/dist/esm/errors.js +25 -0
  86. package/dist/esm/errors.js.map +1 -0
  87. package/dist/esm/escape-html.js +9 -0
  88. package/dist/esm/escape-html.js.map +1 -0
  89. package/dist/esm/filter-set.js +46 -0
  90. package/dist/esm/filter-set.js.map +1 -0
  91. package/dist/esm/focused.js +41 -0
  92. package/dist/esm/focused.js.map +1 -0
  93. package/dist/esm/format-table.js +26 -0
  94. package/dist/esm/format-table.js.map +1 -0
  95. package/dist/esm/index.js +17 -0
  96. package/dist/esm/index.js.map +1 -0
  97. package/dist/esm/inspector.js +18 -0
  98. package/dist/esm/inspector.js.map +1 -0
  99. package/dist/esm/interaction.js +45 -0
  100. package/dist/esm/interaction.js.map +1 -0
  101. package/dist/esm/locator.js +15 -0
  102. package/dist/esm/locator.js.map +1 -0
  103. package/dist/esm/match.js +127 -0
  104. package/dist/esm/match.js.map +1 -0
  105. package/dist/esm/matcher.js +21 -0
  106. package/dist/esm/matcher.js.map +1 -0
  107. package/dist/esm/matchers/and.js +12 -0
  108. package/dist/esm/matchers/and.js.map +1 -0
  109. package/dist/esm/matchers/every.js +12 -0
  110. package/dist/esm/matchers/every.js.map +1 -0
  111. package/dist/esm/matchers/including.js +11 -0
  112. package/dist/esm/matchers/including.js.map +1 -0
  113. package/dist/esm/matchers/matching.js +11 -0
  114. package/dist/esm/matchers/matching.js.map +1 -0
  115. package/dist/esm/matchers/not.js +12 -0
  116. package/dist/esm/matchers/not.js.map +1 -0
  117. package/dist/esm/matchers/or.js +12 -0
  118. package/dist/esm/matchers/or.js.map +1 -0
  119. package/dist/esm/matchers/some.js +12 -0
  120. package/dist/esm/matchers/some.js.map +1 -0
  121. package/dist/esm/merge-objects.js +2 -0
  122. package/dist/esm/merge-objects.js.map +1 -0
  123. package/dist/esm/perform.js +9 -0
  124. package/dist/esm/perform.js.map +1 -0
  125. package/dist/esm/specification.js +3 -0
  126. package/dist/esm/specification.js.map +1 -0
  127. package/dist/filter-set.d.ts +10 -0
  128. package/dist/filter-set.d.ts.map +1 -0
  129. package/dist/focused.d.ts +30 -0
  130. package/dist/focused.d.ts.map +1 -0
  131. package/dist/format-table.d.ts +6 -0
  132. package/dist/format-table.d.ts.map +1 -0
  133. package/dist/index.d.ts +19 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/inspector.d.ts +17 -0
  136. package/dist/inspector.d.ts.map +1 -0
  137. package/dist/interaction.d.ts +42 -0
  138. package/dist/interaction.d.ts.map +1 -0
  139. package/dist/locator.d.ts +10 -0
  140. package/dist/locator.d.ts.map +1 -0
  141. package/dist/match.d.ts +54 -0
  142. package/dist/match.d.ts.map +1 -0
  143. package/dist/matcher.d.ts +9 -0
  144. package/dist/matcher.d.ts.map +1 -0
  145. package/dist/matchers/and.d.ts +3 -0
  146. package/dist/matchers/and.d.ts.map +1 -0
  147. package/dist/matchers/every.d.ts +3 -0
  148. package/dist/matchers/every.d.ts.map +1 -0
  149. package/dist/matchers/including.d.ts +3 -0
  150. package/dist/matchers/including.d.ts.map +1 -0
  151. package/dist/matchers/matching.d.ts +3 -0
  152. package/dist/matchers/matching.d.ts.map +1 -0
  153. package/dist/matchers/not.d.ts +3 -0
  154. package/dist/matchers/not.d.ts.map +1 -0
  155. package/dist/matchers/or.d.ts +3 -0
  156. package/dist/matchers/or.d.ts.map +1 -0
  157. package/dist/matchers/some.d.ts +3 -0
  158. package/dist/matchers/some.d.ts.map +1 -0
  159. package/dist/merge-objects.d.ts +2 -0
  160. package/dist/merge-objects.d.ts.map +1 -0
  161. package/dist/perform.d.ts +3 -0
  162. package/dist/perform.d.ts.map +1 -0
  163. package/dist/specification.d.ts +217 -0
  164. package/dist/specification.d.ts.map +1 -0
  165. package/dist/tsconfig.build.tsbuildinfo +1 -0
  166. package/package.json +65 -0
  167. package/src/constructor.ts +298 -0
  168. package/src/converge.ts +22 -0
  169. package/src/create-interactor.ts +21 -0
  170. package/src/dispatch.ts +24 -0
  171. package/src/element/click.ts +5 -0
  172. package/src/element/fill-in.ts +76 -0
  173. package/src/errors.ts +15 -0
  174. package/src/escape-html.ts +8 -0
  175. package/src/filter-set.ts +45 -0
  176. package/src/focused.ts +43 -0
  177. package/src/format-table.ts +34 -0
  178. package/src/index.ts +20 -0
  179. package/src/inspector.ts +42 -0
  180. package/src/interaction.ts +82 -0
  181. package/src/locator.ts +15 -0
  182. package/src/match.ts +162 -0
  183. package/src/matcher.ts +28 -0
  184. package/src/matchers/and.ts +12 -0
  185. package/src/matchers/every.ts +12 -0
  186. package/src/matchers/including.ts +12 -0
  187. package/src/matchers/matching.ts +12 -0
  188. package/src/matchers/not.ts +12 -0
  189. package/src/matchers/or.ts +12 -0
  190. package/src/matchers/some.ts +12 -0
  191. package/src/merge-objects.ts +2 -0
  192. package/src/perform.ts +11 -0
  193. package/src/specification.ts +253 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # @interactors/core
2
+
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 53dea63: Enable delegation to locator of an interactor if no filter given
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 0c96dab: Add locator delegation. Locators can be delegated to another delegator.
14
+ - f4949ac: Selector can be a function to return arbitrary elements
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @interactors/core
2
+
3
+ [![npm](https://img.shields.io/npm/v/@interactors/core.svg)](https://www.npmjs.com/package/@interactors/core)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Created by Frontside](https://img.shields.io/badge/created%20by-frontside-26abe8.svg)](https://frontside.com)
6
+ [![Chat on Discord](https://img.shields.io/discord/700803887132704931?Label=Discord)](https://discord.gg/mv4uxxcAKd)
7
+
8
+ Page Objects for component libraries and design systems. Learn more at
9
+ [https://frontside.com/interactors](https://frontside.com/interactors)
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createConstructor = exports.instantiateInteractor = exports.instantiateBaseInteractor = exports.unsafeSyncResolveUnique = exports.unsafeSyncResolveParent = exports.resolveEmpty = exports.resolveNonEmpty = exports.resolveUnique = exports.findElements = void 0;
5
+ const globals_1 = require("@interactors/globals");
6
+ const converge_1 = require("./converge");
7
+ const filter_set_1 = require("./filter-set");
8
+ const locator_1 = require("./locator");
9
+ const match_1 = require("./match");
10
+ const format_table_1 = require("./format-table");
11
+ const errors_1 = require("./errors");
12
+ const interaction_1 = require("./interaction");
13
+ const match_2 = require("./match");
14
+ const errors_2 = require("./errors");
15
+ const matcher_1 = require("./matcher");
16
+ const matching_1 = require("./matchers/matching");
17
+ const defaultLocator = (element) => element.textContent || "";
18
+ const defaultSelector = 'div';
19
+ function findElements(parentElement, interactor) {
20
+ if (typeof (interactor.specification.selector) === 'function') {
21
+ return interactor.specification.selector(parentElement);
22
+ }
23
+ else if (interactor.specification.selector === ':root') {
24
+ // this is a bit of a hack, because otherwise there isn't a good way of selecting the root element
25
+ return [parentElement.ownerDocument.querySelector(':root')];
26
+ }
27
+ else {
28
+ return Array.from(parentElement.querySelectorAll(interactor.specification.selector || defaultSelector));
29
+ }
30
+ }
31
+ exports.findElements = findElements;
32
+ function findMatches(parentElement, interactor) {
33
+ if (!interactor.name) {
34
+ throw new Error('One of your interactors was created without a name. Please provide a label for your interactor:\n\tHTML.extend(\'my interactor\') || createInteractor(\'my interactor\')');
35
+ }
36
+ return findElements(parentElement, interactor).map((e) => new match_2.Match(e, interactor.filter, interactor.locator));
37
+ }
38
+ function findMatchesMatching(parentElement, interactor) {
39
+ return findMatches(parentElement, interactor).filter((m) => m.matches);
40
+ }
41
+ function findMatchesNonEmpty(parentElement, interactor) {
42
+ let matches = findMatches(parentElement, interactor);
43
+ let matching = matches.filter((m) => m.matches);
44
+ if (matching.length > 0) {
45
+ return matching;
46
+ }
47
+ else if (matches.length === 0) {
48
+ throw new errors_2.NoSuchElementError(`did not find ${description(interactor)}`);
49
+ }
50
+ else {
51
+ let table = format_table_1.formatTable({
52
+ headers: interactor.locator ? [interactor.name, ...interactor.filter.asTableHeader()] : interactor.filter.asTableHeader(),
53
+ rows: matches.slice().sort((a, b) => b.sortWeight - a.sortWeight).map((m) => m.asTableRow()),
54
+ });
55
+ throw new errors_2.NoSuchElementError(`did not find ${description(interactor)}, did you mean one of:\n\n${table}`);
56
+ }
57
+ }
58
+ // Given a parent element, and an interactor, find exactly one matching element
59
+ // and return it. If no elements match, raise an error. If more than one
60
+ // element matches, raise an error.
61
+ function resolveUnique(parentElement, interactor) {
62
+ let matching = findMatchesNonEmpty(parentElement, interactor);
63
+ if (matching.length === 1) {
64
+ return matching[0].element;
65
+ }
66
+ else {
67
+ let alternatives = matching.map((m) => '- ' + m.elementDescription());
68
+ throw new errors_2.AmbiguousElementError(`${description(interactor)} matches multiple elements:\n\n${alternatives.join('\n')}`);
69
+ }
70
+ }
71
+ exports.resolveUnique = resolveUnique;
72
+ // Given a parent element, and an interactor, find all matching elements and
73
+ // return them. If no elements match, raise an error.
74
+ function resolveNonEmpty(parentElement, interactor) {
75
+ return findMatchesNonEmpty(parentElement, interactor).map(m => m.element);
76
+ }
77
+ exports.resolveNonEmpty = resolveNonEmpty;
78
+ // Given a parent element, and an interactor, check if there are any matching
79
+ // elements, and throw an error if there are. Otherwise return undefined.
80
+ function resolveEmpty(parentElement, interactor) {
81
+ let matching = findMatchesMatching(parentElement, interactor);
82
+ if (matching.length !== 0) {
83
+ let alternatives = matching.map((m) => '- ' + m.elementDescription());
84
+ throw new errors_2.NotAbsentError(`${description(interactor)} exists but should not:\n\n${alternatives.join('\n')}`);
85
+ }
86
+ }
87
+ exports.resolveEmpty = resolveEmpty;
88
+ function ownDescription(options) {
89
+ if (options.locator) {
90
+ return `${options.name} ${options.locator.description} ${options.filter.description}`.trim();
91
+ }
92
+ else {
93
+ return `${options.name} ${options.filter.description}`.trim();
94
+ }
95
+ }
96
+ function description(options) {
97
+ let ancestorsAndSelf = options.ancestors.concat(options);
98
+ return ancestorsAndSelf.reverse().map(ownDescription).join(' within ');
99
+ }
100
+ /**
101
+ * Removes any default values for a filter from the lookup if that filter is present in the
102
+ * assertion. Otherwise, it is not possible to make an assertion on a filter that might conflict
103
+ * see https://github.com/thefrontside/bigtest/issues/966
104
+ */
105
+ function getLookupFilterForAssertion(filter, filters) {
106
+ let lookupFilter = new filter_set_1.FilterSet(filter.specification, Object.assign({}, filter.filters));
107
+ let specFilters = lookupFilter.specification.filters;
108
+ for (let key in specFilters) {
109
+ if (typeof specFilters[key] !== 'function'
110
+ && 'default' in specFilters[key]
111
+ && key in filters
112
+ && !(key in lookupFilter.filters)) {
113
+ lookupFilter.filters[key] = filters[key];
114
+ }
115
+ }
116
+ return lookupFilter;
117
+ }
118
+ function unsafeSyncResolveParent(options) {
119
+ return options.ancestors.reduce(resolveUnique, globals_1.globals.document.documentElement);
120
+ }
121
+ exports.unsafeSyncResolveParent = unsafeSyncResolveParent;
122
+ function unsafeSyncResolveUnique(options) {
123
+ return resolveUnique(unsafeSyncResolveParent(options), options);
124
+ }
125
+ exports.unsafeSyncResolveUnique = unsafeSyncResolveUnique;
126
+ function instantiateBaseInteractor(options, resolver) {
127
+ let interactor = {
128
+ options,
129
+ get description() {
130
+ return description(options);
131
+ },
132
+ perform(fn) {
133
+ return interaction_1.interaction(`run perform on ${description(options)}`, () => converge_1.converge(() => fn(resolver(options))));
134
+ },
135
+ assert(fn) {
136
+ return interaction_1.check(`${description(options)} asserts`, () => {
137
+ return converge_1.converge(() => {
138
+ fn(resolver(options));
139
+ });
140
+ });
141
+ },
142
+ has(filters) {
143
+ return interactor.is(filters);
144
+ },
145
+ is(filters) {
146
+ let filter = new filter_set_1.FilterSet(options.specification, filters);
147
+ return interaction_1.check(`${description(options)} matches filters: ${filter.description}`, () => {
148
+ return converge_1.converge(() => {
149
+ let element = resolver({ ...options, filter: getLookupFilterForAssertion(options.filter, filters) });
150
+ let match = new match_1.MatchFilter(element, filter);
151
+ if (!match.matches) {
152
+ throw new errors_1.FilterNotMatchingError(`${description(options)} does not match filters:\n\n${match.formatAsExpectations()}`);
153
+ }
154
+ });
155
+ });
156
+ },
157
+ apply(parentElement) {
158
+ let element = [...options.ancestors, options].reduce(resolveUnique, parentElement);
159
+ return match_1.applyFilter(options.specification.locator || defaultLocator, element);
160
+ }
161
+ };
162
+ for (let [actionName, action] of Object.entries(options.specification.actions || {})) {
163
+ if (!interactor.hasOwnProperty(actionName)) {
164
+ Object.defineProperty(interactor, actionName, {
165
+ value: function (...args) {
166
+ let actionDescription = actionName;
167
+ if (args.length) {
168
+ actionDescription += ` with ` + args.map((a) => JSON.stringify(a)).join(', ');
169
+ }
170
+ return interaction_1.interaction(`${actionDescription} on ${description(options)}`, () => action(interactor, ...args));
171
+ },
172
+ configurable: true,
173
+ writable: true,
174
+ enumerable: false,
175
+ });
176
+ }
177
+ }
178
+ for (let [filterName, filter] of Object.entries(options.specification.filters || {})) {
179
+ if (!interactor.hasOwnProperty(filterName)) {
180
+ Object.defineProperty(interactor, filterName, {
181
+ value: function () {
182
+ return interaction_1.interactionFilter(`${filterName} of ${description(options)}`, async () => {
183
+ return match_1.applyFilter(filter, resolver(options));
184
+ }, (parentElement) => {
185
+ let element = [...options.ancestors, options].reduce(resolveUnique, parentElement);
186
+ return match_1.applyFilter(filter, element);
187
+ });
188
+ },
189
+ configurable: true,
190
+ writable: true,
191
+ enumerable: false,
192
+ });
193
+ }
194
+ }
195
+ return interactor;
196
+ }
197
+ exports.instantiateBaseInteractor = instantiateBaseInteractor;
198
+ function instantiateInteractor(options) {
199
+ let interactor = instantiateBaseInteractor(options, unsafeSyncResolveUnique);
200
+ return Object.assign(interactor, {
201
+ find(child) {
202
+ return instantiateInteractor({
203
+ ...child.options,
204
+ ancestors: [...options.ancestors, options, ...child.options.ancestors]
205
+ });
206
+ },
207
+ exists() {
208
+ return interaction_1.checkFilter(`${description(options)} exists`, () => {
209
+ return converge_1.converge(() => {
210
+ resolveNonEmpty(unsafeSyncResolveParent(options), options);
211
+ });
212
+ }, (element) => {
213
+ return findMatchesMatching(element, options).length > 0;
214
+ });
215
+ },
216
+ absent() {
217
+ return interaction_1.checkFilter(`${description(options)} does not exist`, () => {
218
+ return converge_1.converge(() => {
219
+ resolveEmpty(unsafeSyncResolveParent(options), options);
220
+ });
221
+ }, (element) => {
222
+ return findMatchesMatching(element, options).length === 0;
223
+ });
224
+ }
225
+ });
226
+ }
227
+ exports.instantiateInteractor = instantiateInteractor;
228
+ function createConstructor(name, specification) {
229
+ function initInteractor(...args) {
230
+ let locator, filter;
231
+ let locatorValue = args[0] instanceof RegExp ? matching_1.matching(args[0]) : args[0];
232
+ if (typeof (locatorValue) === 'string' || matcher_1.isMatcher(locatorValue)) {
233
+ locator = new locator_1.Locator(specification.locator || defaultLocator, locatorValue);
234
+ filter = new filter_set_1.FilterSet(specification, args[1] || {});
235
+ }
236
+ else {
237
+ filter = new filter_set_1.FilterSet(specification, args[0] || {});
238
+ }
239
+ return instantiateInteractor({ name, specification, filter, locator, ancestors: [] });
240
+ }
241
+ return Object.assign(initInteractor, {
242
+ selector: (value) => {
243
+ return createConstructor(name, { ...specification, selector: value });
244
+ },
245
+ locator: (value) => {
246
+ return createConstructor(name, { ...specification, locator: value });
247
+ },
248
+ filters: (filters) => {
249
+ return createConstructor(name, { ...specification, filters: { ...specification.filters, ...filters } });
250
+ },
251
+ actions: (actions) => {
252
+ return createConstructor(name, { ...specification, actions: Object.assign({}, specification.actions, actions) });
253
+ },
254
+ extend: (newName) => {
255
+ return createConstructor(newName, specification);
256
+ },
257
+ });
258
+ }
259
+ exports.createConstructor = createConstructor;
260
+ //# sourceMappingURL=constructor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructor.js","sourceRoot":"","sources":["../../src/constructor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.converge = void 0;
4
+ const performance_api_1 = require("performance-api");
5
+ const globals_1 = require("@interactors/globals");
6
+ function wait(ms) {
7
+ return new Promise((resolve) => setTimeout(resolve, ms));
8
+ }
9
+ async function converge(fn) {
10
+ let startTime = performance_api_1.performance.now();
11
+ while (true) {
12
+ try {
13
+ return fn();
14
+ }
15
+ catch (e) {
16
+ let diff = performance_api_1.performance.now() - startTime;
17
+ if (diff > globals_1.globals.interactorTimeout) {
18
+ throw e;
19
+ }
20
+ else {
21
+ await wait(1);
22
+ }
23
+ }
24
+ }
25
+ }
26
+ exports.converge = converge;
27
+ //# sourceMappingURL=converge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converge.js","sourceRoot":"","sources":["../../src/converge.ts"],"names":[],"mappings":";;;AAAA,qDAA8C;AAC9C,kDAA8C;AAE9C,SAAS,IAAI,CAAC,EAAU;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAI,EAAW;IAC3C,IAAI,SAAS,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAC;IAClC,OAAM,IAAI,EAAE;QACV,IAAI;YACF,OAAO,EAAE,EAAE,CAAC;SACb;QAAC,OAAM,CAAC,EAAE;YACT,IAAI,IAAI,GAAG,6BAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,IAAG,IAAI,GAAG,iBAAO,CAAC,iBAAiB,EAAE;gBACnC,MAAM,CAAC,CAAC;aACT;iBAAM;gBACL,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;SACF;KACF;AACH,CAAC;AAdD,4BAcC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInteractor = void 0;
4
+ const constructor_1 = require("./constructor");
5
+ /**
6
+ * Create a custom interactor with the given name.
7
+ *
8
+ * ### Creating a simple interactor
9
+ *
10
+ * ``` typescript
11
+ * let Paragraph = createInteractor('paragraph').selector('p');
12
+ * ```
13
+ *
14
+ * Note the double function call!
15
+ *
16
+ * @param interactorName The human readable name of the interactor, used mainly for debugging purposes and error messages
17
+ * @typeParam E The type of DOM Element that this interactor operates on. By specifying the element type, actions and filters defined for the interactor can be type checked against the actual element type.
18
+ * @returns You will need to call the returned builder to create an interactor.
19
+ */
20
+ function createInteractor(name) {
21
+ return constructor_1.createConstructor(name, {});
22
+ }
23
+ exports.createInteractor = createInteractor;
24
+ //# sourceMappingURL=create-interactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-interactor.js","sourceRoot":"","sources":["../../src/create-interactor.ts"],"names":[],"mappings":";;;AACA,+CAAkD;AAElD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,gBAAgB,CAAoB,IAAY;IAC9D,OAAO,+BAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAFD,4CAEC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dispatchClick = exports.dispatchKeyUp = exports.dispatchKeyDown = exports.dispatchInput = exports.dispatchChange = void 0;
4
+ function dispatchChange(element) {
5
+ var _a;
6
+ let Event = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.Event) || window.Event;
7
+ return element.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));
8
+ }
9
+ exports.dispatchChange = dispatchChange;
10
+ function dispatchInput(element, options = {}) {
11
+ var _a;
12
+ let InputEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.InputEvent) || window.InputEvent;
13
+ return element.dispatchEvent(new InputEvent('input', Object.assign({ bubbles: true, cancelable: false }, options)));
14
+ }
15
+ exports.dispatchInput = dispatchInput;
16
+ function dispatchKeyDown(element, options = {}) {
17
+ var _a;
18
+ let KeyboardEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.KeyboardEvent) || window.KeyboardEvent;
19
+ return element.dispatchEvent(new KeyboardEvent('keydown', Object.assign({ bubbles: true, cancelable: true }, options)));
20
+ }
21
+ exports.dispatchKeyDown = dispatchKeyDown;
22
+ function dispatchKeyUp(element, options = {}) {
23
+ var _a;
24
+ let KeyboardEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.KeyboardEvent) || window.KeyboardEvent;
25
+ return element.dispatchEvent(new KeyboardEvent('keyup', Object.assign({ bubbles: true, cancelable: true }, options)));
26
+ }
27
+ exports.dispatchKeyUp = dispatchKeyUp;
28
+ function dispatchClick(element, options = {}) {
29
+ var _a;
30
+ let MouseEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.MouseEvent) || window.MouseEvent;
31
+ return element.dispatchEvent(new MouseEvent('click', Object.assign({ bubbles: true, cancelable: true }, options)));
32
+ }
33
+ exports.dispatchClick = dispatchClick;
34
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/dispatch.ts"],"names":[],"mappings":";;;AAAA,SAAgB,cAAc,CAAC,OAAoB;;IACjD,IAAI,KAAK,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,KAAK,KAAI,MAAM,CAAC,KAAK,CAAC;IACrE,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1F,CAAC;AAHD,wCAGC;AAED,SAAgB,aAAa,CAAC,OAAoB,EAAE,UAA0B,EAAE;;IAC9E,IAAI,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,UAAU,KAAI,MAAM,CAAC,UAAU,CAAC;IACpF,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtH,CAAC;AAHD,sCAGC;AAED,SAAgB,eAAe,CAAC,OAAoB,EAAE,UAA6B,EAAE;;IACnF,IAAI,aAAa,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,aAAa,KAAI,MAAM,CAAC,aAAa,CAAC;IAC7F,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1H,CAAC;AAHD,0CAGC;AAED,SAAgB,aAAa,CAAC,OAAoB,EAAE,UAA6B,EAAE;;IACjF,IAAI,aAAa,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,aAAa,KAAI,MAAM,CAAC,aAAa,CAAC;IAC7F,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACxH,CAAC;AAHD,sCAGC;AAED,SAAgB,aAAa,CAAC,OAAoB,EAAE,UAA0B,EAAE;;IAC9E,IAAI,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,UAAU,KAAI,MAAM,CAAC,UAAU,CAAC;IACpF,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACrH,CAAC;AAHD,sCAGC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.click = void 0;
7
+ const user_event_1 = __importDefault(require("@testing-library/user-event"));
8
+ function click(element, init) {
9
+ return user_event_1.default.click(element, init);
10
+ }
11
+ exports.click = click;
12
+ //# sourceMappingURL=click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/element/click.ts"],"names":[],"mappings":";;;;;;AAAA,6EAAmD;AAEnD,SAAgB,KAAK,CAAC,OAAgB,EAAE,IAAqB;IAC3D,OAAO,oBAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAFD,sBAEC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fillIn = void 0;
4
+ const dispatch_1 = require("../dispatch");
5
+ // do a best effort at determining the key code
6
+ function guessCode(letter) {
7
+ if (letter.match(/^[a-zA-Z]$/)) {
8
+ return `Key${letter.toUpperCase()}`;
9
+ }
10
+ else if (letter.match(/^[0-9]$/)) {
11
+ return `Digit${letter}`;
12
+ }
13
+ }
14
+ function clearText(element) {
15
+ if (element.value.length) {
16
+ setValue(element, "");
17
+ dispatch_1.dispatchInput(element, { inputType: 'deleteContentBackward', data: null });
18
+ }
19
+ }
20
+ function enterText(element, value) {
21
+ for (let letter of value) {
22
+ if (dispatch_1.dispatchKeyDown(element, { key: letter, code: guessCode(letter) })) {
23
+ // don't change the value if the keydown event was stopped
24
+ setValue(element, element.value + letter);
25
+ // input is not dispatched if the keydown event was stopped
26
+ dispatch_1.dispatchInput(element, { inputType: 'insertText', data: letter });
27
+ }
28
+ // keyup is always dispatched
29
+ dispatch_1.dispatchKeyUp(element, { key: letter, code: guessCode(letter) });
30
+ }
31
+ }
32
+ /**
33
+ * Use the prototype setter of the element in order to set the value, that way any behavior that monkey patches
34
+ * the element itself is circumvented. This has the effect of the value just "magically" appearing on the input
35
+ * element just like it does when the browser sets the value because of the default action of an event.
36
+ * We have to do this because React actually does do this monkey-patching as an optimization. Basically, they
37
+ * short-circuit syncing the react state whenever someone sets input.value and then ignore the next `change` event.
38
+ *
39
+ * See https://github.com/cypress-io/cypress/issues/536
40
+ */
41
+ function setValue(element, value) {
42
+ let property = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), 'value');
43
+ if (property && property.set) {
44
+ property.set.call(element, value);
45
+ }
46
+ else {
47
+ // if the value property on the element protoype is not present
48
+ // then there are worse problems. But this is very typesafe!
49
+ element.value = value;
50
+ }
51
+ }
52
+ /**
53
+ * Fill in text into an element by emulating how a user would do it, first
54
+ * focusing the element, then filling in the text letter by letter, generating
55
+ * the appropriate keyboard events.
56
+ *
57
+ * @param element The element to fill in text in
58
+ * @param value The text value to fill in
59
+ */
60
+ function fillIn(element, value) {
61
+ let originalValue = element.value;
62
+ element.focus();
63
+ clearText(element);
64
+ enterText(element, value);
65
+ if (originalValue !== value) {
66
+ dispatch_1.dispatchChange(element);
67
+ }
68
+ element.blur();
69
+ }
70
+ exports.fillIn = fillIn;
71
+ //# sourceMappingURL=fill-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill-in.js","sourceRoot":"","sources":["../../../src/element/fill-in.ts"],"names":[],"mappings":";;;AAAA,0CAA4F;AAI5F,+CAA+C;AAC/C,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;QAC7B,OAAO,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;KACrC;SAAM,IAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QACjC,OAAO,QAAQ,MAAM,EAAE,CAAC;KACzB;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAyB;IAC1C,IAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;QACvB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtB,wBAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;KAC5E;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAyB,EAAE,KAAa;IACzD,KAAI,IAAI,MAAM,IAAI,KAAK,EAAE;QACvB,IAAG,0BAAe,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;YACrE,0DAA0D;YAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;YAC1C,2DAA2D;YAC3D,wBAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SACnE;QACD,6BAA6B;QAC7B,wBAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAClE;AACH,CAAC;AAGD;;;;;;;;GAQG;AACH,SAAS,QAAQ,CAAC,OAAyB,EAAE,KAAa;IACxD,IAAI,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxF,IAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACnC;SAAM;QACL,+DAA+D;QAC/D,4DAA4D;QAC5D,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;KACvB;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,MAAM,CAAC,OAAyB,EAAE,KAAa;IAC7D,IAAI,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAElC,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1B,IAAG,aAAa,KAAK,KAAK,EAAE;QAC1B,yBAAc,CAAC,OAAO,CAAC,CAAC;KACzB;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC;AAbD,wBAaC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FilterNotMatchingError = exports.NotAbsentError = exports.AmbiguousElementError = exports.NoSuchElementError = void 0;
4
+ class NoSuchElementError extends Error {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.name = "NoSuchElementError";
8
+ }
9
+ }
10
+ exports.NoSuchElementError = NoSuchElementError;
11
+ class AmbiguousElementError extends Error {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.name = "AmbiguousElementError";
15
+ }
16
+ }
17
+ exports.AmbiguousElementError = AmbiguousElementError;
18
+ class NotAbsentError extends Error {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = "NotAbsentError";
22
+ }
23
+ }
24
+ exports.NotAbsentError = NotAbsentError;
25
+ class FilterNotMatchingError extends Error {
26
+ constructor() {
27
+ super(...arguments);
28
+ this.name = "FilterNotMatchingError";
29
+ }
30
+ }
31
+ exports.FilterNotMatchingError = FilterNotMatchingError;
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,kBAAmB,SAAQ,KAAK;IAA7C;;QACE,SAAI,GAAG,oBAAoB,CAAC;IAC9B,CAAC;CAAA;AAFD,gDAEC;AAED,MAAa,qBAAsB,SAAQ,KAAK;IAAhD;;QACE,SAAI,GAAG,uBAAuB,CAAC;IACjC,CAAC;CAAA;AAFD,sDAEC;AAED,MAAa,cAAe,SAAQ,KAAK;IAAzC;;QACE,SAAI,GAAG,gBAAgB,CAAC;IAC1B,CAAC;CAAA;AAFD,wCAEC;AAED,MAAa,sBAAuB,SAAQ,KAAK;IAAjD;;QACE,SAAI,GAAG,wBAAwB,CAAC;IAClC,CAAC;CAAA;AAFD,wDAEC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeHtml = void 0;
4
+ function escapeHtml(text) {
5
+ return text
6
+ .replace(/&/g, "&")
7
+ .replace(/</g, "&lt;")
8
+ .replace(/>/g, "&gt;")
9
+ .replace(/"/g, "&quot;")
10
+ .replace(/'/g, "&#039;");
11
+ }
12
+ exports.escapeHtml = escapeHtml;
13
+ //# sourceMappingURL=escape-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape-html.js","sourceRoot":"","sources":["../../src/escape-html.ts"],"names":[],"mappings":";;;AAAA,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAPD,gCAOC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FilterSet = void 0;
4
+ const change_case_1 = require("change-case");
5
+ const matcher_1 = require("./matcher");
6
+ class FilterSet {
7
+ constructor(
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ specification, filters) {
10
+ this.specification = specification;
11
+ this.filters = filters;
12
+ }
13
+ ;
14
+ get description() {
15
+ let entries = Object.entries(this.filters);
16
+ if (entries.length === 0) {
17
+ return '';
18
+ }
19
+ else {
20
+ return entries.map(([key, value]) => {
21
+ if (typeof (value) === 'boolean') {
22
+ if (value) {
23
+ return `which is ${change_case_1.noCase(key)}`;
24
+ }
25
+ else {
26
+ return `which is not ${change_case_1.noCase(key)}`;
27
+ }
28
+ }
29
+ else {
30
+ return `with ${change_case_1.noCase(key)} ${matcher_1.matcherDescription(value)}`;
31
+ }
32
+ }).join(' and ');
33
+ }
34
+ }
35
+ get all() {
36
+ let filter = Object.assign({}, this.filters);
37
+ for (let key in this.specification.filters) {
38
+ let definition = this.specification.filters[key];
39
+ if (!(key in this.filters) && typeof (definition) !== 'function' && 'default' in definition) {
40
+ filter[key] = definition.default;
41
+ }
42
+ }
43
+ return filter;
44
+ }
45
+ asTableHeader() {
46
+ return Object.entries(this.all).map(([key, value]) => `${key}: ${matcher_1.matcherDescription(value)}`);
47
+ }
48
+ }
49
+ exports.FilterSet = FilterSet;
50
+ //# sourceMappingURL=filter-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-set.js","sourceRoot":"","sources":["../../src/filter-set.ts"],"names":[],"mappings":";;;AACA,6CAAqC;AACrC,uCAA+C;AAE/C,MAAa,SAAS;IACpB;IACE,8DAA8D;IACvD,aAAiD,EACjD,OAA2B;QAD3B,kBAAa,GAAb,aAAa,CAAoC;QACjD,YAAO,GAAP,OAAO,CAAoB;IACjC,CAAC;IAAA,CAAC;IAEL,IAAI,WAAW;QACb,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAG,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,CAAC;SACX;aAAM;YACL,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAClC,IAAG,OAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;oBAC9B,IAAG,KAAK,EAAE;wBACR,OAAO,YAAY,oBAAM,CAAC,GAAG,CAAC,EAAE,CAAC;qBAClC;yBAAM;wBACL,OAAO,gBAAgB,oBAAM,CAAC,GAAG,CAAC,EAAE,CAAC;qBACtC;iBACF;qBAAM;oBACL,OAAO,QAAQ,oBAAM,CAAC,GAAG,CAAC,IAAI,4BAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;iBAC1D;YACH,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAClB;IACH,CAAC;IAED,IAAI,GAAG;QACL,IAAI,MAAM,GAA4B,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,KAAI,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YACzC,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAoD,CAAC;YACpG,IAAG,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,OAAM,CAAC,UAAU,CAAC,KAAK,UAAU,IAAI,SAAS,IAAI,UAAU,EAAE;gBACzF,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC;aAClC;SACF;QACD,OAAO,MAA4B,CAAC;IACtC,CAAC;IAED,aAAa;QACX,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,4BAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;CACF;AAxCD,8BAwCC"}