Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: updates to support Node ESM #3287

Merged
merged 25 commits into from
Jan 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e1a4e1b
chore(react): updates to support Node ESM
zchenwei Jan 10, 2023
b412357
chore(react-core): updates to support Node ESM
zchenwei Jan 10, 2023
28fe304
chore(ui): updates to support Node ESM
zchenwei Jan 10, 2023
791528e
chore: update package.json files
zchenwei Jan 10, 2023
78e68b9
Merge branch 'main' into chenwz-dev-esmfix
zchenwei Jan 10, 2023
2badeb8
chore: switch back to old JSX transform
zchenwei Jan 11, 2023
3ce47f2
fix: fix yarn.lock
zchenwei Jan 11, 2023
d68bc53
fix: fix yarn.lock
zchenwei Jan 11, 2023
101daea
Merge branch 'main' into chenwz-dev-esmfix
zchenwei Jan 11, 2023
0b7fbd1
chore: remove unused import
zchenwei Jan 11, 2023
f7c0b41
chore: clean up unused rollup plugin
zchenwei Jan 11, 2023
78f8d82
chore: fix radix imports to make it work in CJS
zchenwei Jan 12, 2023
699f8e6
chore: set up tag release workflow
zchenwei Jan 12, 2023
73abf12
chore: fix size limit error
zchenwei Jan 13, 2023
5f280cb
chore: remove unrelated changes
zchenwei Jan 13, 2023
57a51ff
chore: remove tagged release workflow
zchenwei Jan 13, 2023
7b89fb3
Merge branch 'main' into chenwz-dev-esmfix
zchenwei Jan 13, 2023
8e76502
chore: update size test import paths
zchenwei Jan 13, 2023
1bb87fb
chore: add notes to Radix imports
zchenwei Jan 13, 2023
04c8ec6
Merge branch 'main' into chenwz-dev-esmfix
zchenwei Jan 18, 2023
9eda9e5
chore: update internal package.json
zchenwei Jan 18, 2023
8a8e373
Merge branch 'main' into chenwz-dev-esmfix
zchenwei Jan 24, 2023
dd68577
Create quiet-glasses-smile.md
zchenwei Jan 26, 2023
22c0060
Update quiet-glasses-smile.md
zchenwei Jan 26, 2023
773aee6
Merge branch 'main' into chenwz-dev-esmfix
zchenwei Jan 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .changeset/quiet-glasses-smile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
"@aws-amplify/ui-react-core": patch
"@aws-amplify/ui-react": patch
"@aws-amplify/ui": patch
---

build: updates to support Node ESM

Confirmed that both #3155 and #3206 are fixed without having to apply any workaround

Also, test out the changes with the following frameworks/tools:

| Name | Tested? | Notes |
|---|---|---|
| Next.js@11, 12, 13 | ✅ | |
| Gatsby | ✅ | Works with ESM. Not support loading CJS build |
| Remix | ✅ | |
| Astro | ✅ | Works with ESM. Not support loading CJS build |
| webpack | ✅ | |
| Vite | ✅ | Works with ESM. Not support loading CJS build |
| Rollup | ✅ | Works with ESM. Not support loading CJS build |
| esbuild | ✅ | |
| Parcel | ✅ | |
| Snowpack | ✅ | Need `--polyfill-node` to fix JS incompatibility in dev mode, but is a known [issue](https://github.com/FredKSchott/snowpack/discussions/718) |
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ Amplify UI is an open-source UI library with cloud-connected components that are

## Component Matrix

| **Connected Components** | **React** | **React Native** | **Angular** | **Vue** |
| :----------------------- | :-------: | :--------------: | :---------: | :---------:|
| Authenticator | | 🚧 | | ✅ |
| In-App Messaging | | | | |
| Geo (MapView) | | | | |
| Account Settings | 🚧 | | | |
| Storage (FileUploader) | 🚧 | | | |
| **Connected Components** | **React** | **React Native** | **Angular** | **Vue** |
| :----------------------- | :-------: | :--------------: | :---------: | :-----: |
| Authenticator | | 🚧 | | ✅ |
| In-App Messaging | | | | |
| Geo (MapView) | | | | |
| Account Settings | 🚧 | | | |
| Storage (FileUploader) | 🚧 | | | |

| **Primitives** | **React** | **Angular** | **Vue** |
| :--------------- | :-------: | :---------: | :-----: |
Expand Down
5 changes: 2 additions & 3 deletions packages/react-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
"name": "@aws-amplify/ui-react-core",
"version": "2.1.10",
"main": "dist/index.js",
"module": "dist/esm/index.js",
"module": "dist/esm/index.mjs",
"react-native": "dist/index.js",
"exports": {
".": {
"import": "./dist/esm/index.js",
"import": "./dist/esm/index.mjs",
"require": "./dist/index.js"
},
"./package.json": "./package.json"
Expand Down Expand Up @@ -38,7 +38,6 @@
"react": ">= 16.14.0"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^22.0.1",
"@rollup/plugin-typescript": "^8.3.1",
"@testing-library/react": "^12.0.0",
"@testing-library/react-hooks": "^7.0.2",
Expand Down
4 changes: 1 addition & 3 deletions packages/react-core/rollup.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// rollup.config.js
import { defineConfig } from 'rollup';
import typescript from '@rollup/plugin-typescript';
import commonjs from '@rollup/plugin-commonjs';
import externals from 'rollup-plugin-node-externals';

const config = defineConfig([
Expand All @@ -14,7 +13,6 @@ const config = defineConfig([
sourcemap: false,
},
plugins: [
commonjs(),
zchenwei marked this conversation as resolved.
Show resolved Hide resolved
externals({ include: /^@aws-amplify/ }),
typescript({ declarationDir: 'dist/types', sourceMap: false }),
],
Expand All @@ -25,12 +23,12 @@ const config = defineConfig([
output: {
dir: 'dist/esm',
format: 'es',
entryFileNames: '[name].mjs',
preserveModules: true,
preserveModulesRoot: 'src',
sourcemap: false,
},
plugins: [
commonjs(),
externals({ include: /^@aws-amplify/ }),
typescript({ outDir: 'dist/esm', declaration: false, sourceMap: false }),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
InAppMessageInteractionEvent,
Notifications,
} from '@aws-amplify/notifications';
import isNil from 'lodash/isNil';
import isNil from 'lodash/isNil.js';

import { RenderNothing } from '../../../components';
import { useInAppMessaging } from '../useInAppMessaging';
Expand Down
3 changes: 1 addition & 2 deletions packages/react-core/src/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import isEmpty from 'lodash/isEmpty';

import isEmpty from 'lodash/isEmpty.js';
import { isObject, isString } from '@aws-amplify/ui';

function isEmptyArray<T>(value: T): boolean {
Expand Down
2 changes: 1 addition & 1 deletion packages/react-core/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"baseUrl": ".",
"declaration": true,
"esModuleInterop": true,
"jsx": "react-jsx",
"jsx": "react",
Copy link
Contributor Author

@zchenwei zchenwei Jan 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately we will have to switch back to old JSX transform because its ESM support only landed in 18 and the team does not plan to backport it to older version <- facebook/react#20304

Unless we drop the support for React 16 and 17, we cannot leverage the new JSX transform in order to support Node ESM

Copy link
Contributor Author

@zchenwei zchenwei Jan 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Otherwise errors like following will show up and it is dumb for us to add .js file extension to every single line of them

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Volumes/workplace/amplify-ui/packages/react/node_modules/react/jsx-runtime' imported from /Volumes/workplace/amplify-ui/packages/react/dist/esm/components/Authenticator/Authenticator.mjs
Did you mean to import react/node_modules/react/jsx-runtime.js?

"importHelpers": true,
"moduleResolution": "node",
"noImplicitAny": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/react/internal/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
"private": true,
"name": "@aws-amplify/ui-react-internal",
"main": "../dist/internal.js",
"module": "../dist/esm/internal.js",
"module": "../dist/esm/internal.mjs",
"types": "../dist/types/internal.d.ts"
}
20 changes: 10 additions & 10 deletions packages/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
"name": "@aws-amplify/ui-react",
"version": "4.3.5",
"main": "dist/index.js",
"module": "dist/esm/index.js",
"module": "dist/esm/index.mjs",
"exports": {
".": {
"types": "./dist/types/index.d.ts",
"import": "./dist/esm/index.js",
"import": "./dist/esm/index.mjs",
"require": "./dist/index.js"
},
"./internal": {
"import": "./dist/esm/internal.js",
"import": "./dist/esm/internal.mjs",
"require": "./dist/internal.js"
},
"./styles.css": "./dist/styles.css",
Expand Down Expand Up @@ -40,7 +40,8 @@
"dev:build": "tsup",
"clean": "rimraf dist node_modules",
"lint": "tsc --noEmit --project tsconfig.dev.json && eslint src --ext .js,.ts,.tsx",
"test": "yarn test:unit",
"test": "yarn test:unit && yarn test:esm",
"test:esm": "node --input-type=module --eval 'import \"@aws-amplify/ui-react\"'",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simple ESM test to prevent regression

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is nice!

"test:watch": "yarn test:unit:watch",
"test:unit": "jest",
"test:unit:watch": "jest --watch",
Expand Down Expand Up @@ -79,7 +80,6 @@
}
},
"devDependencies": {
"@rollup/plugin-commonjs": "^22.0.1",
"@rollup/plugin-typescript": "^8.3.1",
"@size-limit/preset-big-lib": "^7.0.8",
"@svgr/core": "^5.5.0",
Expand Down Expand Up @@ -123,31 +123,31 @@
"size-limit": [
{
"name": "Authenticator",
"path": "dist/esm/index.js",
"path": "dist/esm/index.mjs",
"import": "{ Authenticator }",
"limit": "120 kB"
},
{
"name": "Geo",
"path": "dist/esm/index.js",
"path": "dist/esm/index.mjs",
"import": "{ MapView, LocationSearch }",
"limit": "330 kB"
},
{
"name": "Storage - FileUploader",
"path": "dist/esm/index.js",
"path": "dist/esm/index.mjs",
"import": "{ FileUploader }",
"limit": "140 kB"
},
{
"name": "AccountSettings",
"path": "dist/esm/index.js",
"path": "dist/esm/index.mjs",
"import": "{ AccountSettings }",
"limit": "60 kB"
},
{
"name": "InAppMessaging",
"path": "dist/esm/index.js",
"path": "dist/esm/index.mjs",
"import": "{ InAppMessagingProvider, InAppMessageDisplay }",
"limit": "110 kB"
}
Expand Down
4 changes: 1 addition & 3 deletions packages/react/rollup.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// rollup.config.js
import { defineConfig } from 'rollup';
import typescript from '@rollup/plugin-typescript';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
import styles from 'rollup-plugin-styles';
import externals from 'rollup-plugin-node-externals';
Expand All @@ -16,7 +15,6 @@ const config = defineConfig([
sourcemap: false,
},
plugins: [
commonjs(),
externals({ include: /^@aws-amplify/ }),
typescript({ declarationDir: 'dist/types', sourceMap: false }),
terser(),
Expand All @@ -28,12 +26,12 @@ const config = defineConfig([
output: {
dir: 'dist/esm',
format: 'es',
entryFileNames: '[name].mjs',
preserveModules: true,
preserveModulesRoot: 'src',
sourcemap: false,
},
plugins: [
commonjs(),
externals({ include: /^@aws-amplify/ }),
typescript({ outDir: 'dist/esm', declaration: false, sourceMap: false }),
terser(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import isEqual from 'lodash/isEqual';
import isEqual from 'lodash/isEqual.js';

import { Logger } from 'aws-amplify';
import {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useEffect, useMemo, useRef } from 'react';
import isEmpty from 'lodash/isEmpty';
import isEmpty from 'lodash/isEmpty.js';
import { MessageComponentBaseProps } from '@aws-amplify/ui-react-core';

import { useMessageImage } from '../useMessageImage';
Expand Down
10 changes: 9 additions & 1 deletion packages/react/src/components/ThemeProvider/index.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
import * as React from 'react';
import { DirectionProvider } from '@radix-ui/react-direction';
import * as RadixDirection from '@radix-ui/react-direction';

import { createTheme, Theme, WebTheme } from '@aws-amplify/ui';

import { AmplifyContext } from './AmplifyContext';

// Radix packages don't support ESM in Node, in some scenarios(e.g. SSR),
// the module will be imported as CommonJS module, in which we have to reference the `default`
let sanitizedRadixDirection = { default: undefined, ...RadixDirection };
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to your lodash idea, maybe we could reexport the radix imports from a single file, to prevent adding this workaround to primitive/component files?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would extract this to a util function in the follow up PR along with lodash

// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
sanitizedRadixDirection =
sanitizedRadixDirection.default ?? sanitizedRadixDirection;
const { DirectionProvider } = sanitizedRadixDirection;

export type ColorMode = 'system' | 'light' | 'dark';
export type Direction = 'ltr' | 'rtl';

Expand Down
2 changes: 1 addition & 1 deletion packages/react/src/primitives/Collection/Collection.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import classNames from 'classnames';
import debounce from 'lodash/debounce';
import debounce from 'lodash/debounce.js';
import * as React from 'react';

import { Flex } from '../Flex';
Expand Down
9 changes: 8 additions & 1 deletion packages/react/src/primitives/Expander/Expander.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { Root } from '@radix-ui/react-accordion';
import * as Accordion from '@radix-ui/react-accordion';
Copy link
Contributor Author

@zchenwei zchenwei Jan 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have to use name space imports for radix components because it does not support Node ESM and so Node will reference its CJS build(main field) instead(Node does not know module field). Name space imports works in both format.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another reason to get rid of radix when we can...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Totally agree

import classNames from 'classnames';

import { useDeprecationWarning } from '../../hooks/useDeprecationWarning';
Expand All @@ -9,6 +9,13 @@ import { ExpanderProps } from '../types/expander';
import { Primitive } from '../types/view';
import { splitPrimitiveProps } from '../utils/splitPrimitiveProps';

// Radix packages don't support ESM in Node, in some scenarios(e.g. SSR),
// the module will be imported as CommonJS module, in which we have to reference the `default`
let sanitizedAccordion = { default: undefined, ...Accordion };
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
sanitizedAccordion = sanitizedAccordion.default ?? sanitizedAccordion;
const { Root } = sanitizedAccordion;

const ExpanderPrimitive: Primitive<ExpanderProps, 'div'> = (
{
children,
Expand Down
9 changes: 8 additions & 1 deletion packages/react/src/primitives/Expander/ExpanderItem.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { Item, Header, Trigger, Content } from '@radix-ui/react-accordion';
import * as Accordion from '@radix-ui/react-accordion';
import classNames from 'classnames';

import { ComponentClassNames } from '../shared/constants';
Expand All @@ -10,6 +10,13 @@ import { splitPrimitiveProps } from '../utils/splitPrimitiveProps';
import { useStableId } from '../utils/useStableId';
import { View } from '../View';

// Radix packages don't support ESM in Node, in some scenarios(e.g. SSR),
// the module will be imported as CommonJS module, in which we have to reference the `default`
let sanitizedAccordion = { default: undefined, ...Accordion };
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
sanitizedAccordion = sanitizedAccordion.default ?? sanitizedAccordion;
const { Item, Header, Trigger, Content } = sanitizedAccordion;

export const EXPANDER_ITEM_TEST_ID = 'expander-item';
export const EXPANDER_HEADER_TEST_ID = 'expander-header';
export const EXPANDER_ICON_TEST_ID = 'expander-icon';
Expand Down
14 changes: 9 additions & 5 deletions packages/react/src/primitives/Menu/Menu.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import * as React from 'react';
import classNames from 'classnames';
import {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
} from '@radix-ui/react-dropdown-menu';
import * as Dropdown from '@radix-ui/react-dropdown-menu';

import { ButtonGroup } from '../ButtonGroup';
import { ComponentClassNames } from '../shared/constants';
import { IconMenu } from '../Icon/internal';
import { MenuButton } from './MenuButton';
import { MenuProps, Primitive } from '../types';

// Radix packages don't support ESM in Node, in some scenarios(e.g. SSR),
// the module will be imported as CommonJS module, in which we have to reference the `default`
let sanitizedDropdown = { default: undefined, ...Dropdown };
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
sanitizedDropdown = sanitizedDropdown.default ?? sanitizedDropdown;
const { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent } =
sanitizedDropdown;
Comment on lines +14 to +17
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious, is this eslint comment avoidable?

Copy link
Contributor Author

@zchenwei zchenwei Jan 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does not allow me to do that because there is a chance sanitizedDropdown.default is undefined and undefined is inferred as any type which falls into this unsafe assignment

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To add to this point, writing in this way is the less eslint comment way I found 😈

Copy link
Contributor

@wlee221 wlee221 Jan 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Understood. For my understanding, when will sanitizedDropdown.default be defined vs undefined?

That conditional was confusing to me, because I was thinking that it would always be one or the other.

Copy link
Contributor Author

@zchenwei zchenwei Jan 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh radix packages do not fully support Node ESM and it may be imported as CJS format in some cases. When the radix module was imported as CJS via name space import, the default will be defined. Its meaningful content will be place into default({ default: <module.exports> }) while an ESM name space import will just give you the exact exports.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it, makes sense to me now, thanks

Copy link
Contributor

@reesscot reesscot Jan 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zchenwei Can we add a comment for this? I think your explanation is great, but would like to help out future us who are confused. :) (nevermind, comment you added is sufficient)

But we could also add a comment linking the the radix issue which could allow us to removed this workaround?

Copy link
Contributor Author

@zchenwei zchenwei Jan 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I already have a comment there. Refresh? I would have a follow up PR to extract this workaround to a util function, I do not want to add too much work in this PR


export const MENU_TRIGGER_TEST_ID = 'amplify-menu-trigger-test-id';
export const MENU_ITEMS_GROUP_TEST_ID = 'amplify-menu-items-group-test-id';

Expand Down
9 changes: 8 additions & 1 deletion packages/react/src/primitives/Menu/MenuItem.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import * as React from 'react';
import classNames from 'classnames';
import { DropdownMenuItem } from '@radix-ui/react-dropdown-menu';
import * as Dropdown from '@radix-ui/react-dropdown-menu';

import { ComponentClassNames } from '../shared/constants';
import { MenuButton } from './MenuButton';
import { MenuItemProps } from '../types';

// Radix packages don't support ESM in Node, in some scenarios(e.g. SSR),
// the module will be imported as CommonJS module, in which we have to reference the `default`
let sanitizedDropdown = { default: undefined, ...Dropdown };
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
sanitizedDropdown = sanitizedDropdown.default ?? sanitizedDropdown;
const { DropdownMenuItem } = sanitizedDropdown;

export const MENU_ITEM_TEST_ID = 'amplify-menu-item-test-id';

/**
Expand Down
9 changes: 8 additions & 1 deletion packages/react/src/primitives/SliderField/SliderField.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import classNames from 'classnames';
import { Range, Root, Thumb, Track } from '@radix-ui/react-slider';
import * as RadixSlider from '@radix-ui/react-slider';
import * as React from 'react';

import { classNameModifier } from '../shared/utils';
Expand All @@ -15,6 +15,13 @@ import { splitPrimitiveProps } from '../utils/splitPrimitiveProps';
import { View } from '../View';
import { useStableId } from '../utils/useStableId';

// Radix packages don't support ESM in Node, in some scenarios(e.g. SSR),
// the module will be imported as CommonJS module, in which we have to reference the `default`
let sanitizedRadixSlider = { default: undefined, ...RadixSlider };
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
sanitizedRadixSlider = sanitizedRadixSlider.default ?? sanitizedRadixSlider;
const { Range, Root, Thumb, Track } = sanitizedRadixSlider;

export const SLIDER_LABEL_TEST_ID = 'slider-label';
export const SLIDER_ROOT_TEST_ID = 'slider-root';
export const SLIDER_TRACK_TEST_ID = 'slider-track';
Expand Down
Loading