@triptease/tt-navbar 0.1.0 → 0.1.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.
@@ -1,441 +0,0 @@
1
- import '../src/tt-navbar.js';
2
- import { elementUpdated, expect, fixture, nextFrame, waitUntil } from '@open-wc/testing';
3
- import { TtOption } from '@triptease/tt-combobox/tt-option.js';
4
- import { Config, getInitialNavbarState, TtNavbar } from '../src/index.js';
5
- import { Routes } from '../src/Routes.js';
6
-
7
- const getLinkByHref = (links: NodeListOf<HTMLAnchorElement>, href: string) => {
8
- for (const link of links) {
9
- if (link.getAttribute('href') === href) {
10
- return link;
11
- }
12
- }
13
-
14
- return undefined;
15
- };
16
-
17
- const selectComboboxOption = async (combobox: Element, value: string) => {
18
- const input = combobox.shadowRoot!.querySelector('[role="combobox"]') as HTMLInputElement;
19
- input.click();
20
-
21
- await elementUpdated(combobox);
22
-
23
- const option = combobox.shadowRoot!.querySelector(`tt-option[value="${value}"]`) as TtOption;
24
- option.click();
25
- };
26
-
27
- const isVisuallyHidden = (element: Element) => {
28
- const style = getComputedStyle(element);
29
-
30
- return Boolean(
31
- style.position === 'absolute' &&
32
- style.width === '1px' &&
33
- style.height === '1px' &&
34
- style.margin === '-1px' &&
35
- style.padding === '0px' &&
36
- style.borderWidth === '0px' &&
37
- style.overflow === 'hidden' &&
38
- style.clip === 'rect(0px, 0px, 0px, 0px)' &&
39
- style.clipPath === 'inset(50%)' &&
40
- style.whiteSpace === 'nowrap'
41
- );
42
- };
43
-
44
- const CLIENT_KEY = 'zxd47KQGAP';
45
-
46
- describe('TtNavbar', () => {
47
- it('should throw an error if the clientKey is not provided', async () => {
48
- try {
49
- await fixture<TtNavbar>(`<tt-navbar></tt-navbar>`);
50
- } catch (e) {
51
- expect(e).to.match(/clientKey is required/);
52
- }
53
- });
54
- it('should render with the default links', async () => {
55
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
56
- const links = navbar.shadowRoot?.querySelectorAll('a');
57
-
58
- if (links) {
59
- expect(getLinkByHref(links, '/')).to.exist;
60
- expect(getLinkByHref(links, 'https://app.campaign-manager.triptease.io')).to.exist;
61
- expect(getLinkByHref(links, `/${CLIENT_KEY}/channels`)).to.exist;
62
- expect(getLinkByHref(links, `/parity/${CLIENT_KEY}`)).to.exist;
63
- expect(getLinkByHref(links, `/${CLIENT_KEY}/guest-insights`)).to.exist;
64
- expect(getLinkByHref(links, `/${CLIENT_KEY}/guest-behavioural-data`)).to.exist;
65
- expect(getLinkByHref(links, `/${CLIENT_KEY}/crm-config`)).to.exist;
66
- expect(getLinkByHref(links, `/${CLIENT_KEY}/settings/guides`)).to.exist;
67
- expect(getLinkByHref(links, `/${CLIENT_KEY}/settings/hotels`)).to.exist;
68
- expect(getLinkByHref(links, `/account`)).to.exist;
69
- expect(getLinkByHref(links, `/account/team/${CLIENT_KEY}`)).to.exist;
70
- expect(getLinkByHref(links, `/account/billing-management/${CLIENT_KEY}`)).to.exist;
71
- expect(getLinkByHref(links, `/subscriptions/${CLIENT_KEY}`)).to.exist;
72
- }
73
- });
74
-
75
- it('should render platform URLs against the base URL when it is defined', async () => {
76
- const platformUrl = 'https://app.triptease.io';
77
- const navbar = await fixture<TtNavbar>(
78
- `<tt-navbar client-key=${CLIENT_KEY} platform-url="${platformUrl}"></tt-navbar>`
79
- );
80
- const links = navbar.shadowRoot?.querySelectorAll('a');
81
-
82
- if (links) {
83
- expect(getLinkByHref(links, `${platformUrl}/`)).to.exist;
84
- expect(getLinkByHref(links, 'https://app.campaign-manager.triptease.io')).to.exist; // This shouldn't change
85
- expect(getLinkByHref(links, `${platformUrl}/${CLIENT_KEY}/channels`)).to.exist;
86
- }
87
- });
88
-
89
- it.skip('should allow navigation events to be handled externally', async () => {
90
- let navigateEventCount = 0;
91
-
92
- const onNavigate = (e: MouseEvent) => {
93
- e.preventDefault();
94
- navigateEventCount += 1;
95
- };
96
-
97
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
98
- navbar.navigate = onNavigate;
99
- await navbar.updateComplete;
100
-
101
- const links = navbar.shadowRoot?.querySelectorAll('a');
102
- links?.forEach((l) => l.click());
103
-
104
- await waitUntil(() => expect(navigateEventCount).to.equal(13), 'navigate event did not fire');
105
- });
106
-
107
- it('should render a combobox when multiple clients are provided', async () => {
108
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
109
- navbar.clients = [
110
- { clientKey: CLIENT_KEY, displayName: 'Client One' },
111
- { clientKey: 'abc123', displayName: 'Client Two' },
112
- ];
113
- await navbar.updateComplete;
114
-
115
- const combobox = navbar.shadowRoot?.querySelector('tt-combobox');
116
- const singleClientName = navbar.shadowRoot?.querySelector('.single-client-name');
117
-
118
- expect(combobox).to.exist;
119
- expect(singleClientName).to.not.exist;
120
- expect(combobox?.value).to.deep.equal([CLIENT_KEY]);
121
- });
122
-
123
- it('should render the client name when only one client is provided', async () => {
124
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
125
- navbar.clients = [{ clientKey: CLIENT_KEY, displayName: 'Single Client' }];
126
- await navbar.updateComplete;
127
-
128
- const singleClientName = navbar.shadowRoot?.querySelector('.single-client-name');
129
- const combobox = navbar.shadowRoot?.querySelector('tt-combobox');
130
-
131
- expect(singleClientName).to.exist;
132
- expect(singleClientName?.textContent?.trim()).to.equal('Single Client');
133
- expect(combobox).to.not.exist;
134
- });
135
-
136
- it('should render the logout link', async () => {
137
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
138
-
139
- const links = navbar.shadowRoot?.querySelectorAll('a');
140
- const logoutLink = getLinkByHref(links!, '/logout');
141
-
142
- expect(logoutLink).to.exist;
143
- });
144
-
145
- it('should close other details when one is being opened', async () => {
146
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
147
-
148
- const allDetails = navbar.shadowRoot!.querySelectorAll('summary');
149
- const [marketInsights, settings] = allDetails;
150
-
151
- marketInsights.click();
152
- /*
153
- * Wait for the DOM to update before continuing. This is necessary because helpers like elementUpdated don't wait for
154
- * the browser to fire the $toggle handler as well as adding the open attribute.
155
- */
156
- await nextFrame();
157
- await nextFrame();
158
-
159
- expect(marketInsights.closest('details')?.open).to.be.true;
160
-
161
- settings.click();
162
- await nextFrame();
163
- await nextFrame();
164
-
165
- expect(settings.closest('details')?.open).to.be.true;
166
- expect(marketInsights.closest('details')?.open).to.be.false;
167
- });
168
-
169
- it('should collapse the navbar when toggle clicked', async () => {
170
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
171
-
172
- const navbarToggleBtn = navbar.shadowRoot!.querySelector('#navbar-toggle-btn') as HTMLButtonElement;
173
-
174
- navbarToggleBtn.click();
175
- await elementUpdated(navbar);
176
-
177
- const logo = navbar.shadowRoot!.querySelector('.logo');
178
- const rootLinksHiddenElements = navbar.shadowRoot!.querySelectorAll('nav a span');
179
- const summaryHiddenElements = navbar.shadowRoot!.querySelectorAll('nav summary span');
180
- const externalLinks = navbar.shadowRoot!.querySelectorAll('#external-links a');
181
- const logoutLink = navbar.shadowRoot!.querySelector('#logout-link span');
182
- const clientSelector = navbar.shadowRoot!.querySelector('#client-selector');
183
-
184
- // Visually and accessibly hidden
185
- expect(logo?.checkVisibility()).to.be.false;
186
- expect(clientSelector?.checkVisibility()).to.be.false;
187
- for (const link of externalLinks) {
188
- expect(link.checkVisibility()).to.be.false;
189
- }
190
-
191
- // Visually hidden only
192
- expect(logoutLink).to.exist;
193
- expect(rootLinksHiddenElements.length).to.be.greaterThan(1);
194
- expect(summaryHiddenElements.length).to.be.greaterThan(1);
195
- for (const element of [...rootLinksHiddenElements, ...summaryHiddenElements, logoutLink!]) {
196
- expect(isVisuallyHidden(element)).to.be.true;
197
- }
198
- });
199
-
200
- const collapsibleIds: string[] = ['market-insights', 'settings', 'account', 'billing-routes'];
201
- collapsibleIds.forEach((id) => {
202
- it(`should open the nav bar when the ${id} collapsible is clicked`, async () => {
203
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
204
-
205
- const navbarToggleBtn = navbar.shadowRoot!.querySelector('#navbar-toggle-btn') as HTMLButtonElement;
206
-
207
- navbarToggleBtn.click();
208
- await elementUpdated(navbar);
209
-
210
- const logo = navbar.shadowRoot!.querySelector('.logo');
211
- expect(logo?.checkVisibility()).to.be.false;
212
-
213
- const element: HTMLDetailsElement | null = navbar.shadowRoot!.querySelector(`#${id} summary`);
214
-
215
- expect(element).to.exist;
216
-
217
- element!.click();
218
-
219
- await waitUntil(() => logo?.checkVisibility(), 'navbar should be open', {
220
- timeout: 500,
221
- });
222
- });
223
- });
224
-
225
- const URLs = [
226
- ['/', 'Dashboard'],
227
- [`/${CLIENT_KEY}/channels`, 'Channels'],
228
- [`/parity/${CLIENT_KEY}`, 'Parity'],
229
- [`/parity/${CLIENT_KEY}/foo`, 'Parity'],
230
-
231
- [`/paidsearch/${CLIENT_KEY}/performance`, 'Channels'],
232
- [`/meta/${CLIENT_KEY}/performance`, 'Channels'],
233
- [`/retargeting/${CLIENT_KEY}/performance`, 'Channels'],
234
- [`/retargeting/${CLIENT_KEY}/ad-config`, 'Channels'],
235
- [`/messages/${CLIENT_KEY}/messages`, 'Channels'],
236
- [`/messages/${CLIENT_KEY}/messages/wizard`, 'Channels'],
237
- [`/messages/${CLIENT_KEY}/messages/type`, 'Channels'],
238
- [`/messages/${CLIENT_KEY}/messages/notifications`, 'Channels'],
239
- [`/messages/${CLIENT_KEY}/messages/templates/nudge`, 'Channels'],
240
- [`/${CLIENT_KEY}/email`, 'Channels'],
241
- [`/pricematch/${CLIENT_KEY}/performance`, 'Channels'],
242
- [`/chat/insights/${CLIENT_KEY}`, 'Channels'],
243
- [`/messages/${CLIENT_KEY}/messages/new/save-the-search`, 'Channels'],
244
-
245
- [`/${CLIENT_KEY}/meta/performance`, 'Channels'],
246
- [`/${CLIENT_KEY}/paidsearch/performance`, 'Channels'],
247
- [`/${CLIENT_KEY}/retargeting/performance`, 'Channels'],
248
- [`/${CLIENT_KEY}/messages/messages`, 'Channels'],
249
- [`/${CLIENT_KEY}/pricematch/performance`, 'Channels'],
250
-
251
- [`/${CLIENT_KEY}/guest-insights`, 'Guest insights'],
252
- [`/${CLIENT_KEY}/parity`, 'Parity'],
253
-
254
- [`/settings/${CLIENT_KEY}/guides`, 'Group settings'],
255
- [`/settings/${CLIENT_KEY}/branding`, 'Group settings'],
256
- [`/settings/${CLIENT_KEY}/price-check`, 'Group settings'],
257
- [`/settings/${CLIENT_KEY}/price-config`, 'Group settings'],
258
- [`/settings/${CLIENT_KEY}/hotel-details-finder`, 'Group settings'],
259
- [`/settings/${CLIENT_KEY}/deactivation-center`, 'Group settings'],
260
- [`/${CLIENT_KEY}/settings/guides`, 'Group settings'],
261
- [`/${CLIENT_KEY}/settings/branding`, 'Group settings'],
262
- [`/${CLIENT_KEY}/settings/price-check`, 'Group settings'],
263
- [`/${CLIENT_KEY}/settings/price-config`, 'Group settings'],
264
- [`/${CLIENT_KEY}/settings/hotel-details-finder`, 'Group settings'],
265
- [`/${CLIENT_KEY}/settings/deactivation-center`, 'Group settings'],
266
-
267
- [`/${CLIENT_KEY}/settings/hotels`, 'Property settings'],
268
-
269
- [`/account/team/${CLIENT_KEY}`, 'Team and permissions'],
270
- [`/account/billing-management/${CLIENT_KEY}`, 'Booking reconciliation'],
271
- [`/subscriptions/${CLIENT_KEY}`, 'Subscriptions'],
272
-
273
- [`/${CLIENT_KEY}/account/team`, 'Team and permissions'],
274
- [`/${CLIENT_KEY}/account/billing-management`, 'Booking reconciliation'],
275
- [`/${CLIENT_KEY}/subscriptions`, 'Subscriptions'],
276
- ];
277
-
278
- URLs.forEach(([route, text]) => {
279
- it(`should show the current page as active when link is ${route}`, async () => {
280
- history.pushState({}, '', route); // 👈 mock URL
281
-
282
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
283
-
284
- const anchor = navbar.shadowRoot!.querySelector('a[aria-current="page"]');
285
-
286
- expect(anchor).to.exist;
287
- expect(anchor!.textContent).to.include(text);
288
- });
289
- });
290
-
291
- it('should show the current page as campaign manager when on the given campaign manager url', async () => {
292
- const platformUrl = 'https://app.triptease.io';
293
- const campaignManagerUrl = 'http://localhost:8000';
294
-
295
- const navbar = await fixture<TtNavbar>(
296
- `<tt-navbar client-key=${CLIENT_KEY} platform-url=${platformUrl} campaign-manager-url=${campaignManagerUrl} active-route="${Routes.CampaignManager}"></tt-navbar>`
297
- );
298
- const anchor = navbar.shadowRoot!.querySelector('a[aria-current="page"]');
299
- expect(anchor).to.exist;
300
- expect(anchor!.textContent).to.include('Campaigns');
301
- });
302
-
303
- it('should fire an event when the client is changed', async () => {
304
- let selectedClientKey: string | undefined;
305
- const onClientChange = (clientKey: string) => {
306
- selectedClientKey = clientKey;
307
- };
308
-
309
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
310
- navbar.clients = [
311
- { clientKey: CLIENT_KEY, displayName: 'Client One' },
312
- { clientKey: 'abc123', displayName: 'Client Two' },
313
- ];
314
- navbar.onClientChange = onClientChange;
315
-
316
- await navbar.updateComplete;
317
-
318
- const combobox = navbar.shadowRoot?.querySelector('tt-combobox');
319
- expect(combobox).to.exist;
320
-
321
- await selectComboboxOption(combobox!, 'abc123');
322
-
323
- expect(selectedClientKey).to.equal('abc123');
324
- });
325
-
326
- it('should set the --nav-bar-width css variable when collapsed', async () => {
327
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
328
-
329
- await expect(getComputedStyle(navbar).getPropertyValue('--nav-bar-width').trim()).to.equal('260px');
330
-
331
- const navbarToggleBtn = navbar.shadowRoot!.querySelector('#navbar-toggle-btn') as HTMLButtonElement;
332
-
333
- navbarToggleBtn.click();
334
- await elementUpdated(navbar);
335
-
336
- await expect(getComputedStyle(navbar).getPropertyValue('--nav-bar-width').trim()).to.equal('fit-content');
337
- });
338
-
339
- it('should expand the details when the current page is within that section', async () => {
340
- history.pushState({}, '', `/parity/${CLIENT_KEY}`);
341
-
342
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
343
-
344
- const marketInsightsDetails = navbar.shadowRoot!.querySelector('#market-insights') as HTMLDetailsElement;
345
-
346
- expect(marketInsightsDetails).to.exist;
347
- expect(marketInsightsDetails.open).to.be.true;
348
- });
349
-
350
- it('should set the active route when receives `tetris:navigate` event', async () => {
351
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
352
-
353
- history.pushState({}, '', `/account/billing-management/${CLIENT_KEY}`);
354
-
355
- // Dispatch the event to change to Channels route
356
- const navigateEvent = new CustomEvent('tetris:navigate', {});
357
- window.dispatchEvent(navigateEvent);
358
-
359
- await elementUpdated(navbar);
360
- const anchor = navbar.shadowRoot!.querySelector('a[aria-current="page"]');
361
-
362
- expect(anchor).to.exist;
363
- expect(anchor!.textContent).to.include('Booking reconciliation');
364
- });
365
-
366
- it("should default to 'open' when the 'initial-state' attribute is not provided", async () => {
367
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
368
-
369
- const logo = navbar.shadowRoot!.querySelector('.logo');
370
-
371
- expect(logo).to.exist;
372
- expect(logo!.checkVisibility()).to.be.true;
373
- });
374
-
375
- it("should default to 'open' when the 'initial-state' attribute is 'open", async () => {
376
- const navbar = await fixture<TtNavbar>(
377
- `<tt-navbar client-key=${CLIENT_KEY} initial-state=${Config.NavbarStateCookieOpenValue}></tt-navbar>`
378
- );
379
-
380
- const logo = navbar.shadowRoot!.querySelector('.logo');
381
-
382
- expect(logo).to.exist;
383
- expect(logo!.checkVisibility()).to.be.true;
384
- });
385
-
386
- it("should default to 'closed' when the 'initial-state' attribute is 'closed", async () => {
387
- const navbar = await fixture<TtNavbar>(
388
- `<tt-navbar client-key=${CLIENT_KEY} initial-state=${Config.NavbarStateCookieClosedValue}></tt-navbar>`
389
- );
390
-
391
- const logo = navbar.shadowRoot!.querySelector('.logo');
392
-
393
- expect(logo).to.exist;
394
- expect(logo!.checkVisibility()).to.be.false;
395
- });
396
-
397
- it('should create cookie containing navbar state onToggle if it is missing', async () => {
398
- document.cookie = `${Config.NavbarStateCookieName}=; max-age=0; path=/;`;
399
- const startingCookieValue = getInitialNavbarState();
400
-
401
- expect(startingCookieValue).to.be.undefined;
402
-
403
- const navbar = await fixture<TtNavbar>(`<tt-navbar client-key=${CLIENT_KEY}></tt-navbar>`);
404
- const navbarToggleBtn = navbar.shadowRoot!.querySelector('#navbar-toggle-btn') as HTMLButtonElement;
405
-
406
- navbarToggleBtn.click();
407
- await elementUpdated(navbar);
408
-
409
- const newState = getInitialNavbarState();
410
-
411
- await expect(newState).to.equal(Config.NavbarStateCookieClosedValue);
412
- });
413
-
414
- it('should update the cookie value when navbar is expanded', async () => {
415
- const navbar = await fixture<TtNavbar>(
416
- `<tt-navbar client-key=${CLIENT_KEY} initial-state=${Config.NavbarStateCookieClosedValue}></tt-navbar>`
417
- );
418
- const navbarToggleBtn = navbar.shadowRoot!.querySelector('#navbar-toggle-btn') as HTMLButtonElement;
419
-
420
- navbarToggleBtn.click();
421
- await elementUpdated(navbar);
422
-
423
- const newState = getInitialNavbarState();
424
-
425
- await expect(newState).to.equal(Config.NavbarStateCookieOpenValue);
426
- });
427
-
428
- it('should update the cookie value when navbar is collapsed', async () => {
429
- const navbar = await fixture<TtNavbar>(
430
- `<tt-navbar client-key=${CLIENT_KEY} initial-state=${Config.NavbarStateCookieOpenValue}></tt-navbar>`
431
- );
432
- const navbarToggleBtn = navbar.shadowRoot!.querySelector('#navbar-toggle-btn') as HTMLButtonElement;
433
-
434
- navbarToggleBtn.click();
435
- await elementUpdated(navbar);
436
-
437
- const newState = getInitialNavbarState();
438
-
439
- await expect(newState).to.equal(Config.NavbarStateCookieClosedValue);
440
- });
441
- });
package/tsconfig.cjs.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.packages.cjs.json",
3
- "compilerOptions": {
4
- "rootDir": "./",
5
- "outDir": "dist/cjs"
6
- },
7
- "include": ["src/**/*.ts"],
8
- "exclude": ["node_modules", "dist"]
9
- }
package/tsconfig.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.packages.esm.json",
3
- "compilerOptions": {
4
- "rootDir": "./",
5
- "outDir": "dist/esm"
6
- },
7
- "include": ["src/**/*.ts", "test/**/*.ts"],
8
- "exclude": ["node_modules", "dist"]
9
- }
@@ -1,27 +0,0 @@
1
- // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
-
3
- /** Use Hot Module replacement by adding --hmr to the start command */
4
- const hmr = process.argv.includes('--hmr');
5
-
6
- export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
- open: '/demo/',
8
- /** Use regular watch mode if HMR is not enabled. */
9
- watch: !hmr,
10
- /** Resolve bare module imports */
11
- nodeResolve: {
12
- exportConditions: ['browser', 'development'],
13
- },
14
-
15
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
16
- // esbuildTarget: 'auto'
17
-
18
- /** Set appIndex to enable SPA routing */
19
- // appIndex: 'demo/index.html',
20
-
21
- plugins: [
22
- /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
23
- // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.lit] }),
24
- ],
25
-
26
- // See documentation for all available options
27
- });
@@ -1,41 +0,0 @@
1
- // import { playwrightLauncher } from '@web/test-runner-playwright';
2
-
3
- const filteredLogs = ['Running in dev mode', 'Lit is in dev mode'];
4
-
5
- export default /** @type {import("@web/test-runner").TestRunnerConfig} */ ({
6
- /** Test files to run */
7
- files: 'dist/esm/test/**/*.test.js',
8
-
9
- /** Resolve bare module imports */
10
- nodeResolve: {
11
- exportConditions: ['browser', 'development'],
12
- },
13
-
14
- /** Filter out lit dev mode logs */
15
- filterBrowserLogs(log) {
16
- for (const arg of log.args) {
17
- if (typeof arg === 'string' && filteredLogs.some((l) => arg.includes(l))) {
18
- return false;
19
- }
20
- }
21
- return true;
22
- },
23
-
24
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
25
- // esbuildTarget: 'auto',
26
-
27
- /** Amount of browsers to run concurrently */
28
- // concurrentBrowsers: 2,
29
-
30
- /** Amount of test files per browser to test concurrently */
31
- // concurrency: 1,
32
-
33
- /** Browsers to run tests on */
34
- // browsers: [
35
- // playwrightLauncher({ product: 'chromium' }),
36
- // playwrightLauncher({ product: 'firefox' }),
37
- // playwrightLauncher({ product: 'webkit' }),
38
- // ],
39
-
40
- // See documentation for all available options
41
- });