@oslokommune/punkt-testing-utils 16.7.3 → 16.7.6

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.
@@ -1,324 +1,256 @@
1
1
  (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@testing-library/dom")) : typeof define === "function" && define.amd ? define(["exports", "@testing-library/dom"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.punktTestingUtils = {}, global["dom-testing-library"]));
3
- })(this, (function(exports2, dom) {
4
- "use strict";
5
- const PKT_CUSTOM_FORMFIELDS = [
6
- "pkt-backlink",
7
- "pkt-checkbox",
8
- "pkt-combobox",
9
- "pkt-progressbar",
10
- "pkt-radiobutton",
11
- "pkt-select",
12
- "pkt-textarea",
13
- "pkt-textinput"
14
- ];
15
- const PKT_CUSTOM_ELEMENTS = [
16
- "pkt-input-wrapper",
17
- "pkt-icon",
18
- "pkt-helptext",
19
- "pkt-loader",
20
- "pkt-backlink",
21
- ...PKT_CUSTOM_FORMFIELDS
22
- ];
23
- const setupPktTestingLibrary = (options) => {
24
- const tools = {
25
- fireEvent: options.fireEvent,
26
- findAllByLabelText: options.findAllByLabelText,
27
- findAllByDisplayValue: options.findAllByDisplayValue,
28
- findAllByTestId: options.findAllByTestId,
29
- findAllByText: options.findAllByText,
30
- getAllByLabelText: options.getAllByLabelText,
31
- getAllByDisplayValue: options.getAllByDisplayValue,
32
- getAllByTestId: options.getAllByTestId,
33
- getAllByText: options.getAllByText
34
- };
35
- return {
36
- findPktElementByLabelText: withTestingLibrary(tools, findPktElementByLabel),
37
- waitForPktElementsToBeDefined,
38
- getPktElementByLabelText: withTestingLibrary(tools, getPktElementByLabel),
39
- setPktElementChecked: withTestingLibrary(tools, setPktElementChecked),
40
- isPktElementChecked: withTestingLibrary(tools, isPktElementChecked),
41
- getPktSelectOptions: withTestingLibrary(tools, getPktSelectOptions),
42
- getAllPktElementsByLabelText: withTestingLibrary(tools, getAllPktElementsByLabelText),
43
- setPktElementValue: withTestingLibrary(tools, setPktElementValue),
44
- pktClickButton: withTestingLibrary(tools, pktClickButton),
45
- setPktSelectedOptionsByLabel: withTestingLibrary(tools, setPktSelectedOptionsByLabel),
46
- getPktElementByDisplayValue: withTestingLibrary(tools, getPktElementByDisplayValue),
47
- findPktElementByDisplayValue: withTestingLibrary(tools, findPktElementByDisplayValue)
48
- };
49
- };
50
- const syncQueryFunctionResolver = (testingLibrary) => (queryType) => {
51
- const queries = {
52
- text: testingLibrary.getAllByText,
53
- label: testingLibrary.getAllByLabelText,
54
- testid: testingLibrary.getAllByTestId,
55
- displayValue: testingLibrary.getAllByDisplayValue
56
- };
57
- const query = queries[queryType];
58
- if (query) {
59
- return query;
60
- } else {
61
- throw new Error("Unsupported query type: " + queryType);
62
- }
63
- };
64
- const asyncQueryFunctionResolver = (testingLibrary) => (queryType) => {
65
- const queries = {
66
- text: testingLibrary.findAllByText,
67
- label: testingLibrary.findAllByLabelText,
68
- testid: testingLibrary.findAllByTestId,
69
- displayValue: testingLibrary.findAllByDisplayValue
70
- };
71
- const query = queries[queryType];
72
- if (query) {
73
- return query;
74
- } else {
75
- throw new Error("Unsupported query type: " + queryType);
76
- }
77
- };
78
- const syncResolveIdentifierOrElement = (testingLibrary) => (elementOrIdentifier, query) => typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? getPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier;
79
- const getByLabelElement = (possibleLabelElement) => {
80
- const control = possibleLabelElement instanceof HTMLLabelElement && possibleLabelElement.control;
81
- if (control) {
82
- return control;
83
- } else {
84
- throw new Error("Fant ikke noe skjema-element for labelen: " + possibleLabelElement.outerHTML);
85
- }
86
- };
87
- const asyncResolveIdentifierOrElement = (testingLibrary) => async (elementOrIdentifier, query) => elementOrIdentifier instanceof HTMLLabelElement && getByLabelElement(elementOrIdentifier) || (typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? await findPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier);
88
- const asyncFuncWithStringIdentifierOrElement = (testingLibrary) => (func, query = "label") => {
89
- return async (labelOrPktElement, ...restArgs) => {
90
- const element = await asyncResolveIdentifierOrElement(testingLibrary)(labelOrPktElement, query);
91
- return await func(element, ...restArgs);
92
- };
93
- };
94
- const syncFuncWithStringIdentifierOrElement = (testingLibrary) => (func, query = "label") => {
95
- return (labelOrPktElement, ...restArgs) => {
96
- const element = syncResolveIdentifierOrElement(testingLibrary)(labelOrPktElement, query);
97
- return func(element, ...restArgs);
98
- };
99
- };
100
- const withTestingLibrary = (testingLibrary, fn) => fn(testingLibrary);
101
- const waitForPktElementsToBeDefined = async () => await Promise.all(
102
- PKT_CUSTOM_ELEMENTS.map((elementName) => {
103
- if (document.querySelector(elementName) !== null) {
104
- return window.customElements.whenDefined(elementName);
105
- }
106
- }).filter((promise) => promise)
107
- );
108
- const findPossibleWrappingPktCustomElement = (testingLibrary) => (innerElement, isByRole, args) => {
109
- if (!innerElement === null) {
110
- throw dom.getElementError(`Finner ikke noe element med ${isByRole ? "role" : "label"} "${args[0]}"`, document.body);
111
- }
112
- const pktElement = innerElement == null ? void 0 : innerElement.closest(PKT_CUSTOM_FORMFIELDS.join(", "));
113
- if (pktElement) {
114
- return pktElement;
115
- } else {
116
- return innerElement;
117
- }
118
- };
119
- const getPktElementBy = (testingLibrary) => (query = "label", identifier, container) => {
120
- try {
121
- const queryFunc = syncQueryFunctionResolver(testingLibrary)(query);
122
- const innerElement = doElementSearch(identifier, query, queryFunc, container)[0];
123
- return findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []);
124
- } catch (e) {
125
- return fallbackSearchForPktSelectByLabel()(identifier, query, container);
126
- }
127
- };
128
- const removeElementBySelector = (ancestor, selector) => {
129
- const elements = Array.from(ancestor.querySelectorAll(selector));
130
- elements.forEach((element) => {
131
- var _a;
132
- (_a = element.parentNode) == null ? void 0 : _a.removeChild(element);
133
- });
134
- };
135
- function getPureLabelText(label) {
136
- var _a;
137
- const clonedLabel = label.cloneNode(true);
138
- removeElementBySelector(clonedLabel, "pkt-helptext");
139
- removeElementBySelector(clonedLabel, ".pkt-input-suffix");
140
- removeElementBySelector(clonedLabel, ".pkt-input-prefix");
141
- removeElementBySelector(clonedLabel, ".pkt-input-icon");
142
- removeElementBySelector(clonedLabel, ".pkt-input__counter");
143
- removeElementBySelector(clonedLabel, "option");
144
- removeElementBySelector(clonedLabel, "pkt-listbox");
145
- removeElementBySelector(clonedLabel, ".pkt-alert--error");
146
- removeElementBySelector(clonedLabel, ".pkt-tag");
147
- removeElementBySelector(clonedLabel, ".pkt-input-check__input-helptext");
148
- removeElementBySelector(clonedLabel, ".pkt-inputwrapper__helptext");
149
- return ((_a = clonedLabel.textContent) == null ? void 0 : _a.trim()) || null;
150
- }
151
- const getPureLabelTextForLabelOwner = (labelOwner) => {
152
- const label = "labels" in labelOwner && labelOwner.labels instanceof NodeList && labelOwner.labels.length > 0 && labelOwner.labels[0] || ["input", ...PKT_CUSTOM_FORMFIELDS].includes(labelOwner.tagName.toLowerCase()) && labelOwner.querySelector("label") || null;
153
- if (label) {
154
- return getPureLabelText(label);
155
- } else {
156
- return null;
157
- }
158
- };
159
- const labelMatcher = (labelTextToMatch) => (nodeContent, element) => {
160
- if (element instanceof HTMLElement) {
161
- const labelWithoutHelptext = getPureLabelTextForLabelOwner(element);
162
- return labelWithoutHelptext === labelTextToMatch;
163
- } else {
164
- return false;
165
- }
166
- };
167
- const fallbackSearchForPktSelectByLabel = (testingLibrary) => (identifier, query, container = document.body) => {
168
- if (typeof identifier === "string" && query === "label") {
169
- const matchingLabel = Array.from(container.querySelectorAll("label")).find(
170
- (labelElement) => getPureLabelText(labelElement) === identifier
171
- );
172
- const labelOwner = (matchingLabel == null ? void 0 : matchingLabel.control) || (matchingLabel == null ? void 0 : matchingLabel.closest("pkt-select")) || (matchingLabel == null ? void 0 : matchingLabel.closest("pkt-combobox"));
173
- if (!labelOwner) {
174
- throw dom.getElementError(`Fant ikke noe element med label "${identifier}"`, container);
175
- }
176
- return labelOwner;
177
- }
178
- throw dom.getElementError(`Fant ikke noe element med ${query} "${identifier}"`, container);
179
- };
180
- const doElementSearch = (identifier, query, queryFunc, container = document.body) => {
181
- return identifier instanceof HTMLLabelElement ? getByLabelElement(identifier) : typeof identifier === "string" && query === "label" ? queryFunc(container, labelMatcher(identifier.trim())) : queryFunc(container, identifier);
182
- };
183
- const findPktElementBy = (testingLibrary) => async (query = "label", identifier, container) => {
184
- try {
185
- if (identifier instanceof HTMLLabelElement) {
186
- return Promise.resolve(getByLabelElement(identifier));
187
- }
188
- const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query);
189
- const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0];
190
- return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []));
191
- } catch (e) {
192
- return fallbackSearchForPktSelectByLabel()(identifier, query, container);
193
- }
194
- };
195
- const getPktElementByLabel = (testingLibrary) => (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : getPktElementBy(testingLibrary)("label", label, container);
196
- const findPktElementByLabel = (testingLibrary) => async (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : findPktElementBy(testingLibrary)("label", label, container);
197
- const setPktElementChecked = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element, checked) => {
198
- if (!("checked" in element)) {
199
- throw new Error('Bare elementer som har en "checked"-attributt støttes');
200
- }
201
- let returnValue = false;
202
- if (element.tagName === "INPUT") {
203
- const htmlInputElement = element;
204
- if (htmlInputElement.type === "radio") {
205
- if (!checked) {
206
- throw new Error("Kan ikke av-velge en <input type='radio'> - prøv å velge en annen radioknapp i samme gruppe");
207
- } else {
208
- returnValue = testingLibrary.fireEvent.click(element);
209
- await new Promise((resolve) => setTimeout(resolve, 0));
210
- }
211
- } else if (htmlInputElement.type === "checkbox") {
212
- if (htmlInputElement.checked !== checked) {
213
- returnValue = testingLibrary.fireEvent.click(element);
214
- }
215
- }
216
- } else {
217
- returnValue = testingLibrary.fireEvent.change(element, { target: { checked } });
218
- }
219
- return Promise.resolve(returnValue);
220
- });
221
- const isPktElementChecked = (testingLibrary) => (target) => {
222
- const element = syncResolveIdentifierOrElement(testingLibrary)(target, "label");
223
- if ("checked" in element) return !!element.checked;
224
- const descendant = element.querySelector('input[type="radio"]:checked, input[type="checkbox"]:checked');
225
- return descendant !== null;
226
- };
227
- const getPktElementByDisplayValue = (testingLibrary) => (text, container) => getPktElementBy(testingLibrary)("displayValue", text, container);
228
- const findPktElementByDisplayValue = (testingLibrary) => (text, container) => findPktElementBy(testingLibrary)("displayValue", text, container);
229
- const getPktSelectOptions = (testingLibrary) => syncFuncWithStringIdentifierOrElement(testingLibrary)(
230
- (selectElement, onlySelected) => {
231
- const optionElements = Array.from(
232
- selectElement.querySelectorAll("option:not(.pkt-hide), data:not(.pkt.hide)")
233
- );
234
- const filter = onlySelected ? ([, , selected]) => selected : (_) => true;
235
- const currentValue = selectElement.value;
236
- return optionElements.map(
237
- (optionElement) => {
238
- var _a;
239
- return [optionElement.value, (_a = optionElement.textContent) == null ? void 0 : _a.trim(), optionElement.value === currentValue];
240
- }
241
- ).filter(filter);
242
- }
243
- );
244
- const getAllPktElementsByLabelText = (testingLibrary) => (label, container) => {
245
- const innerElements = testingLibrary.getAllByLabelText(container || document.body, label);
246
- return innerElements.map((element) => findPossibleWrappingPktCustomElement()(element, false, []));
247
- };
248
- const setPktElementValue = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(
249
- async (element, valueOrValues, optionsOrUseInputEvent = false) => {
250
- const options = typeof optionsOrUseInputEvent === "object" ? optionsOrUseInputEvent : (
251
- // Hvis det er en boolean, så vær bakoverkompatibel
252
- optionsOrUseInputEvent && {
253
- useInputEventForNative: true,
254
- useChangeEventForNative: true,
255
- setValuePropForNative: true
256
- } || {
257
- useInputEventForNative: false,
258
- useChangeEventForNative: true,
259
- setValuePropForNative: false
260
- }
261
- );
262
- if (Array.isArray(valueOrValues) && valueOrValues.length > 1 && element.tagName === "PKT-SELECT") {
263
- throw new Error("Multi-verdi <pkt-select> støttes ikke. Bruk <pkt-combobox> i stedet.");
264
- }
265
- if (element.tagName === "PKT-SELECT" || element.tagName === "PKT-COMBOBOX") {
266
- const pktSelect = element;
267
- const multiple = pktSelect.multiple;
268
- const valueAsArray = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues];
269
- const newValue = multiple && valueAsArray || valueAsArray.length == 0 && "" || valueAsArray[0];
270
- testingLibrary.fireEvent.change(element, { target: { value: newValue } });
271
- return Promise.resolve(true);
272
- } else {
273
- if (options.setValuePropForNative) {
274
- if ("value" in element) {
275
- element.value = valueOrValues.toString();
276
- }
277
- }
278
- if (options.useInputEventForNative) {
279
- testingLibrary.fireEvent.input(element, { target: { value: valueOrValues } });
280
- }
281
- if (options.useChangeEventForNative) {
282
- testingLibrary.fireEvent.change(element, { target: { value: valueOrValues } });
283
- }
284
- return Promise.resolve(true);
285
- }
286
- }
287
- );
288
- const containsRadioInput = (element) => {
289
- var _a;
290
- if (element.tagName === "INPUT" && element.type === "radio") return true;
291
- if ((_a = element.querySelector) == null ? void 0 : _a.call(element, 'input[type="radio"]')) return true;
292
- if (element.tagName === "LABEL") {
293
- const label = element;
294
- const control = label.control || (label.htmlFor ? document.getElementById(label.htmlFor) : null);
295
- return !!(control && control.type === "radio");
296
- }
297
- return false;
298
- };
299
- const pktClickButton = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element) => {
300
- if (containsRadioInput(element)) {
301
- throw new Error("Klikk på <pkt-radiobutton> støttes ikke - bruk setPktElementChecked i stedet");
302
- }
303
- return testingLibrary.fireEvent.click(element);
304
- }, "text");
305
- const setPktSelectedOptionsByLabel = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(
306
- async (pktSelect, ...desiredOptionLabels) => {
307
- const availableOptions = getPktSelectOptions(testingLibrary)(pktSelect);
308
- const selectedOptions = desiredOptionLabels.map((optionLabel) => availableOptions.find(([_, label]) => label === optionLabel)).filter((possibleOption) => possibleOption);
309
- if (selectedOptions.length !== desiredOptionLabels.length) {
310
- throw new Error(
311
- "Noen av option'ene finnes ikke i denne komponenten. Du valgte " + JSON.stringify(desiredOptionLabels) + ", mens valgmulighetene er " + JSON.stringify(availableOptions.map(([, label]) => label))
312
- );
313
- }
314
- return await setPktElementValue(testingLibrary)(
315
- pktSelect,
316
- selectedOptions.map(([value]) => value)
317
- );
318
- }
319
- );
320
- exports2.PKT_CUSTOM_FORMFIELDS = PKT_CUSTOM_FORMFIELDS;
321
- exports2.setupPktTestingLibrary = setupPktTestingLibrary;
322
- Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
323
- }));
324
- //# sourceMappingURL=punkt-testing-utils.umd.js.map
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@testing-library/dom")) : typeof define === "function" && define.amd ? define(["exports", "@testing-library/dom"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.punktTestingUtils = {}, global["dom-testing-library"]));
3
+ })(this, function(exports, _testing_library_dom) {
4
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
5
+ //#region src/index.ts
6
+ var PKT_CUSTOM_FORMFIELDS = [
7
+ "pkt-backlink",
8
+ "pkt-checkbox",
9
+ "pkt-combobox",
10
+ "pkt-progressbar",
11
+ "pkt-radiobutton",
12
+ "pkt-select",
13
+ "pkt-textarea",
14
+ "pkt-textinput"
15
+ ];
16
+ var PKT_CUSTOM_ELEMENTS = [
17
+ "pkt-input-wrapper",
18
+ "pkt-icon",
19
+ "pkt-helptext",
20
+ "pkt-loader",
21
+ "pkt-backlink",
22
+ ...PKT_CUSTOM_FORMFIELDS
23
+ ];
24
+ var setupPktTestingLibrary = (options) => {
25
+ const tools = {
26
+ fireEvent: options.fireEvent,
27
+ findAllByLabelText: options.findAllByLabelText,
28
+ findAllByDisplayValue: options.findAllByDisplayValue,
29
+ findAllByTestId: options.findAllByTestId,
30
+ findAllByText: options.findAllByText,
31
+ getAllByLabelText: options.getAllByLabelText,
32
+ getAllByDisplayValue: options.getAllByDisplayValue,
33
+ getAllByTestId: options.getAllByTestId,
34
+ getAllByText: options.getAllByText
35
+ };
36
+ return {
37
+ findPktElementByLabelText: withTestingLibrary(tools, findPktElementByLabel),
38
+ waitForPktElementsToBeDefined,
39
+ getPktElementByLabelText: withTestingLibrary(tools, getPktElementByLabel),
40
+ setPktElementChecked: withTestingLibrary(tools, setPktElementChecked),
41
+ isPktElementChecked: withTestingLibrary(tools, isPktElementChecked),
42
+ getPktSelectOptions: withTestingLibrary(tools, getPktSelectOptions),
43
+ getAllPktElementsByLabelText: withTestingLibrary(tools, getAllPktElementsByLabelText),
44
+ setPktElementValue: withTestingLibrary(tools, setPktElementValue),
45
+ pktClickButton: withTestingLibrary(tools, pktClickButton),
46
+ setPktSelectedOptionsByLabel: withTestingLibrary(tools, setPktSelectedOptionsByLabel),
47
+ getPktElementByDisplayValue: withTestingLibrary(tools, getPktElementByDisplayValue),
48
+ findPktElementByDisplayValue: withTestingLibrary(tools, findPktElementByDisplayValue)
49
+ };
50
+ };
51
+ var syncQueryFunctionResolver = (testingLibrary) => (queryType) => {
52
+ const query = {
53
+ text: testingLibrary.getAllByText,
54
+ label: testingLibrary.getAllByLabelText,
55
+ testid: testingLibrary.getAllByTestId,
56
+ displayValue: testingLibrary.getAllByDisplayValue
57
+ }[queryType];
58
+ if (query) return query;
59
+ else throw new Error("Unsupported query type: " + queryType);
60
+ };
61
+ var asyncQueryFunctionResolver = (testingLibrary) => (queryType) => {
62
+ const query = {
63
+ text: testingLibrary.findAllByText,
64
+ label: testingLibrary.findAllByLabelText,
65
+ testid: testingLibrary.findAllByTestId,
66
+ displayValue: testingLibrary.findAllByDisplayValue
67
+ }[queryType];
68
+ if (query) return query;
69
+ else throw new Error("Unsupported query type: " + queryType);
70
+ };
71
+ var syncResolveIdentifierOrElement = (testingLibrary) => (elementOrIdentifier, query) => typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? getPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier;
72
+ var getByLabelElement = (possibleLabelElement) => {
73
+ const control = possibleLabelElement instanceof HTMLLabelElement && possibleLabelElement.control;
74
+ if (control) return control;
75
+ else throw new Error("Fant ikke noe skjema-element for labelen: " + possibleLabelElement.outerHTML);
76
+ };
77
+ var asyncResolveIdentifierOrElement = (testingLibrary) => async (elementOrIdentifier, query) => elementOrIdentifier instanceof HTMLLabelElement && getByLabelElement(elementOrIdentifier) || (typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? await findPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier);
78
+ var asyncFuncWithStringIdentifierOrElement = (testingLibrary) => (func, query = "label") => {
79
+ return async (labelOrPktElement, ...restArgs) => {
80
+ return await func(await asyncResolveIdentifierOrElement(testingLibrary)(labelOrPktElement, query), ...restArgs);
81
+ };
82
+ };
83
+ var syncFuncWithStringIdentifierOrElement = (testingLibrary) => (func, query = "label") => {
84
+ return (labelOrPktElement, ...restArgs) => {
85
+ return func(syncResolveIdentifierOrElement(testingLibrary)(labelOrPktElement, query), ...restArgs);
86
+ };
87
+ };
88
+ var withTestingLibrary = (testingLibrary, fn) => fn(testingLibrary);
89
+ /**
90
+ * Sørger for at alle brukte custom elements fra Punkt er definerte og erstattet med implementasjoner.
91
+ * Bør kalles etter `render`, før noen operasjoner og antakelser gjøres.
92
+ *
93
+ * F.eks.:
94
+ * <code>
95
+ * render(<div><PktTextinput id="textinput" name={'textInput'} label="My text input" aria-label="My text input" /></div>);
96
+ * await waitForPktElementsToBeDefined();
97
+ *
98
+ * await setPktElementValue("My text input", "new value");
99
+ * </code>
100
+ */
101
+ var waitForPktElementsToBeDefined = async () => await Promise.all(PKT_CUSTOM_ELEMENTS.map((elementName) => {
102
+ if (document.querySelector(elementName) !== null) return window.customElements.whenDefined(elementName);
103
+ }).filter((promise) => promise));
104
+ var findPossibleWrappingPktCustomElement = (testingLibrary) => (innerElement, isByRole, args) => {
105
+ const pktElement = innerElement?.closest(PKT_CUSTOM_FORMFIELDS.join(", "));
106
+ if (pktElement) return pktElement;
107
+ else return innerElement;
108
+ };
109
+ var getPktElementBy = (testingLibrary) => (query = "label", identifier, container) => {
110
+ try {
111
+ const innerElement = doElementSearch(identifier, query, syncQueryFunctionResolver(testingLibrary)(query), container)[0];
112
+ return findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []);
113
+ } catch (e) {
114
+ return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container);
115
+ }
116
+ };
117
+ var removeElementBySelector = (ancestor, selector) => {
118
+ Array.from(ancestor.querySelectorAll(selector)).forEach((element) => {
119
+ element.parentNode?.removeChild(element);
120
+ });
121
+ };
122
+ function getPureLabelText(label) {
123
+ const clonedLabel = label.cloneNode(true);
124
+ removeElementBySelector(clonedLabel, "pkt-helptext");
125
+ removeElementBySelector(clonedLabel, ".pkt-input-suffix");
126
+ removeElementBySelector(clonedLabel, ".pkt-input-prefix");
127
+ removeElementBySelector(clonedLabel, ".pkt-input-icon");
128
+ removeElementBySelector(clonedLabel, ".pkt-input__counter");
129
+ removeElementBySelector(clonedLabel, "option");
130
+ removeElementBySelector(clonedLabel, "pkt-listbox");
131
+ removeElementBySelector(clonedLabel, ".pkt-alert--error");
132
+ removeElementBySelector(clonedLabel, ".pkt-tag");
133
+ removeElementBySelector(clonedLabel, ".pkt-input-check__input-helptext");
134
+ removeElementBySelector(clonedLabel, ".pkt-inputwrapper__helptext");
135
+ return clonedLabel.textContent?.trim() || null;
136
+ }
137
+ var getPureLabelTextForLabelOwner = (labelOwner) => {
138
+ const label = "labels" in labelOwner && labelOwner.labels instanceof NodeList && labelOwner.labels.length > 0 && labelOwner.labels[0] || ["input", ...PKT_CUSTOM_FORMFIELDS].includes(labelOwner.tagName.toLowerCase()) && labelOwner.querySelector("label") || null;
139
+ if (label) return getPureLabelText(label);
140
+ else return null;
141
+ };
142
+ var labelMatcher = (labelTextToMatch) => (nodeContent, element) => {
143
+ if (element instanceof HTMLElement) return getPureLabelTextForLabelOwner(element) === labelTextToMatch;
144
+ else return false;
145
+ };
146
+ var fallbackSearchForPktSelectByLabel = (testingLibrary) => (identifier, query, container = document.body) => {
147
+ if (typeof identifier === "string" && query === "label") {
148
+ const matchingLabel = Array.from(container.querySelectorAll("label")).find((labelElement) => getPureLabelText(labelElement) === identifier);
149
+ const labelOwner = matchingLabel?.control || matchingLabel?.closest("pkt-select") || matchingLabel?.closest("pkt-combobox");
150
+ if (!labelOwner) throw (0, _testing_library_dom.getElementError)(`Fant ikke noe element med label "${identifier}"`, container);
151
+ return labelOwner;
152
+ }
153
+ throw (0, _testing_library_dom.getElementError)(`Fant ikke noe element med ${query} "${identifier}"`, container);
154
+ };
155
+ var doElementSearch = (identifier, query, queryFunc, container = document.body) => {
156
+ return identifier instanceof HTMLLabelElement ? getByLabelElement(identifier) : typeof identifier === "string" && query === "label" ? queryFunc(container, labelMatcher(identifier.trim())) : queryFunc(container, identifier);
157
+ };
158
+ var findPktElementBy = (testingLibrary) => async (query = "label", identifier, container) => {
159
+ try {
160
+ if (identifier instanceof HTMLLabelElement) return Promise.resolve(getByLabelElement(identifier));
161
+ const innerElement = (await doElementSearch(identifier, query, asyncQueryFunctionResolver(testingLibrary)(query), container))[0];
162
+ return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []));
163
+ } catch (e) {
164
+ return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container);
165
+ }
166
+ };
167
+ var getPktElementByLabel = (testingLibrary) => (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : getPktElementBy(testingLibrary)("label", label, container);
168
+ var findPktElementByLabel = (testingLibrary) => async (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : findPktElementBy(testingLibrary)("label", label, container);
169
+ var setPktElementChecked = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element, checked) => {
170
+ if (!("checked" in element)) throw new Error("Bare elementer som har en \"checked\"-attributt støttes");
171
+ let returnValue = false;
172
+ if (element.tagName === "INPUT") {
173
+ const htmlInputElement = element;
174
+ if (htmlInputElement.type === "radio") if (!checked) throw new Error("Kan ikke av-velge en <input type='radio'> - prøv å velge en annen radioknapp i samme gruppe");
175
+ else {
176
+ returnValue = testingLibrary.fireEvent.click(element);
177
+ await new Promise((resolve) => setTimeout(resolve, 0));
178
+ }
179
+ else if (htmlInputElement.type === "checkbox") {
180
+ if (htmlInputElement.checked !== checked) returnValue = testingLibrary.fireEvent.click(element);
181
+ }
182
+ } else returnValue = testingLibrary.fireEvent.change(element, { target: { checked } });
183
+ return Promise.resolve(returnValue);
184
+ });
185
+ var isPktElementChecked = (testingLibrary) => (target) => {
186
+ const element = syncResolveIdentifierOrElement(testingLibrary)(target, "label");
187
+ if ("checked" in element) return !!element.checked;
188
+ return element.querySelector("input[type=\"radio\"]:checked, input[type=\"checkbox\"]:checked") !== null;
189
+ };
190
+ var getPktElementByDisplayValue = (testingLibrary) => (text, container) => getPktElementBy(testingLibrary)("displayValue", text, container);
191
+ var findPktElementByDisplayValue = (testingLibrary) => (text, container) => findPktElementBy(testingLibrary)("displayValue", text, container);
192
+ var getPktSelectOptions = (testingLibrary) => syncFuncWithStringIdentifierOrElement(testingLibrary)((selectElement, onlySelected) => {
193
+ const optionElements = Array.from(selectElement.querySelectorAll("option:not(.pkt-hide), data:not(.pkt.hide)"));
194
+ const filter = onlySelected ? ([, , selected]) => selected : (_) => true;
195
+ const currentValue = selectElement.value;
196
+ return optionElements.map((optionElement) => [
197
+ optionElement.value,
198
+ optionElement.textContent?.trim(),
199
+ optionElement.value === currentValue
200
+ ]).filter(filter);
201
+ });
202
+ var getAllPktElementsByLabelText = (testingLibrary) => (label, container) => {
203
+ return testingLibrary.getAllByLabelText(container || document.body, label).map((element) => findPossibleWrappingPktCustomElement(testingLibrary)(element, false, []));
204
+ };
205
+ var setPktElementValue = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element, valueOrValues, optionsOrUseInputEvent = false) => {
206
+ const options = typeof optionsOrUseInputEvent === "object" ? optionsOrUseInputEvent : optionsOrUseInputEvent && {
207
+ useInputEventForNative: true,
208
+ useChangeEventForNative: true,
209
+ setValuePropForNative: true
210
+ } || {
211
+ useInputEventForNative: false,
212
+ useChangeEventForNative: true,
213
+ setValuePropForNative: false
214
+ };
215
+ if (Array.isArray(valueOrValues) && valueOrValues.length > 1 && element.tagName === "PKT-SELECT") throw new Error("Multi-verdi <pkt-select> støttes ikke. Bruk <pkt-combobox> i stedet.");
216
+ if (element.tagName === "PKT-SELECT" || element.tagName === "PKT-COMBOBOX") {
217
+ const multiple = element.multiple;
218
+ const valueAsArray = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues];
219
+ const newValue = multiple && valueAsArray || valueAsArray.length == 0 && "" || valueAsArray[0];
220
+ testingLibrary.fireEvent.change(element, { target: { value: newValue } });
221
+ return Promise.resolve(true);
222
+ } else {
223
+ if (options.setValuePropForNative) {
224
+ if ("value" in element) element.value = valueOrValues.toString();
225
+ }
226
+ if (options.useInputEventForNative) testingLibrary.fireEvent.input(element, { target: { value: valueOrValues } });
227
+ if (options.useChangeEventForNative) testingLibrary.fireEvent.change(element, { target: { value: valueOrValues } });
228
+ return Promise.resolve(true);
229
+ }
230
+ });
231
+ var containsRadioInput = (element) => {
232
+ if (element.tagName === "INPUT" && element.type === "radio") return true;
233
+ if (element.querySelector?.("input[type=\"radio\"]")) return true;
234
+ if (element.tagName === "LABEL") {
235
+ const label = element;
236
+ const control = label.control || (label.htmlFor ? document.getElementById(label.htmlFor) : null);
237
+ return !!(control && control.type === "radio");
238
+ }
239
+ return false;
240
+ };
241
+ var pktClickButton = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element) => {
242
+ if (containsRadioInput(element)) throw new Error("Klikk på <pkt-radiobutton> støttes ikke - bruk setPktElementChecked i stedet");
243
+ return testingLibrary.fireEvent.click(element);
244
+ }, "text");
245
+ var setPktSelectedOptionsByLabel = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (pktSelect, ...desiredOptionLabels) => {
246
+ const availableOptions = getPktSelectOptions(testingLibrary)(pktSelect);
247
+ const selectedOptions = desiredOptionLabels.map((optionLabel) => availableOptions.find(([_, label]) => label === optionLabel)).filter((possibleOption) => possibleOption);
248
+ if (selectedOptions.length !== desiredOptionLabels.length) throw new Error("Noen av option'ene finnes ikke i denne komponenten. Du valgte " + JSON.stringify(desiredOptionLabels) + ", mens valgmulighetene er " + JSON.stringify(availableOptions.map(([, label]) => label)));
249
+ return await setPktElementValue(testingLibrary)(pktSelect, selectedOptions.map(([value]) => value));
250
+ });
251
+ //#endregion
252
+ exports.PKT_CUSTOM_FORMFIELDS = PKT_CUSTOM_FORMFIELDS;
253
+ exports.setupPktTestingLibrary = setupPktTestingLibrary;
254
+ });
255
+
256
+ //# sourceMappingURL=punkt-testing-utils.umd.js.map