@momentum-design/components 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc.js +16 -0
- package/CONTRIBUTING.md +5 -0
- package/README.md +39 -0
- package/SCRIPTS.md +15 -0
- package/TESTING.md +38 -0
- package/config/api-extractor.json +33 -0
- package/config/custom-elements-manifest.config.js +28 -0
- package/config/esbuild/configs/browser.js +21 -0
- package/config/esbuild/configs/e2e.js +10 -0
- package/config/esbuild/esbuild-e2e.config.js +22 -0
- package/config/esbuild/esbuild.config.js +9 -0
- package/config/playwright/playwright.config.ts +107 -0
- package/config/playwright/public/index.css +43 -0
- package/config/playwright/public/index.html +26 -0
- package/config/playwright/setup/Components.page.ts +163 -0
- package/config/playwright/setup/constants.ts +27 -0
- package/config/playwright/setup/index.ts +42 -0
- package/config/playwright/setup/steps/accessibility.ts +9 -0
- package/config/playwright/setup/types.ts +5 -0
- package/config/playwright/setup/utils/accessibility.ts +70 -0
- package/config/playwright/setup/utils/visual-regression.ts +35 -0
- package/config/plop/actions/AddComponent.ts +21 -0
- package/config/plop/actions/AddToComponentExports.ts +16 -0
- package/config/plop/actions/AddToComponentImports.ts +16 -0
- package/config/plop/constants/index.ts +31 -0
- package/config/plop/esbuild.config.plop.js +4 -0
- package/config/plop/generators/component/index.ts +25 -0
- package/config/plop/plopfile.ts +6 -0
- package/config/plop/prompts/index.ts +8 -0
- package/config/plop/templates/add/component/index.ts.hbs +12 -0
- package/config/plop/templates/add/component/{{componentName}}.component.ts.hbs +22 -0
- package/config/plop/templates/add/component/{{componentName}}.constants.ts.hbs +5 -0
- package/config/plop/templates/add/component/{{componentName}}.e2e-test.ts.hbs +67 -0
- package/config/plop/templates/add/component/{{componentName}}.fixtures.ts.hbs +13 -0
- package/config/plop/templates/add/component/{{componentName}}.stories.ts.hbs +18 -0
- package/config/plop/templates/add/component/{{componentName}}.styles.ts.hbs +8 -0
- package/config/plop/tsconfig.plop.json +11 -0
- package/config/storybook/MomentumStorybookTheme.js +41 -0
- package/config/storybook/main.js +21 -0
- package/config/storybook/manager.js +17 -0
- package/config/storybook/preview.js +63 -0
- package/config/storybook/provider/iconProvider.js +8 -0
- package/config/storybook/provider/themeProvider.js +31 -0
- package/config/storybook/public/background-graphic.png +0 -0
- package/config/storybook/public/fonts/Inter.var.woff2 +0 -0
- package/config/storybook/public/momentum-logo.png +0 -0
- package/config/storybook/themes/index.js +14 -0
- package/config/storybook/themes/themes.css +15 -0
- package/data/custom-elements.json +677 -0
- package/dist/browser/index.js +366 -0
- package/dist/browser/index.js.map +7 -0
- package/dist/components/avatar/avatar.component.d.ts +28 -0
- package/dist/components/avatar/avatar.component.js +79 -0
- package/dist/components/avatar/avatar.constants.d.ts +7 -0
- package/dist/components/avatar/avatar.constants.js +14 -0
- package/dist/components/avatar/avatar.styles.d.ts +2 -0
- package/dist/components/avatar/avatar.styles.js +20 -0
- package/dist/components/avatar/avatar.types.d.ts +1 -0
- package/dist/components/avatar/avatar.types.js +2 -0
- package/dist/components/avatar/index.d.ts +7 -0
- package/dist/components/avatar/index.js +7 -0
- package/dist/components/badge/badge.component.d.ts +51 -0
- package/dist/components/badge/badge.component.js +114 -0
- package/dist/components/badge/badge.constants.d.ts +8 -0
- package/dist/components/badge/badge.constants.js +15 -0
- package/dist/components/badge/badge.styles.d.ts +2 -0
- package/dist/components/badge/badge.styles.js +26 -0
- package/dist/components/badge/badge.types.d.ts +1 -0
- package/dist/components/badge/badge.types.js +2 -0
- package/dist/components/badge/index.d.ts +7 -0
- package/dist/components/badge/index.js +7 -0
- package/dist/components/icon/icon.component.d.ts +63 -0
- package/dist/components/icon/icon.component.js +158 -0
- package/dist/components/icon/icon.constants.d.ts +6 -0
- package/dist/components/icon/icon.constants.js +12 -0
- package/dist/components/icon/icon.styles.d.ts +2 -0
- package/dist/components/icon/icon.styles.js +15 -0
- package/dist/components/icon/icon.utils.d.ts +2 -0
- package/dist/components/icon/icon.utils.js +13 -0
- package/dist/components/icon/index.d.ts +7 -0
- package/dist/components/icon/index.js +7 -0
- package/dist/components/iconprovider/iconprovider.component.d.ts +34 -0
- package/dist/components/iconprovider/iconprovider.component.js +71 -0
- package/dist/components/iconprovider/iconprovider.constants.d.ts +7 -0
- package/dist/components/iconprovider/iconprovider.constants.js +14 -0
- package/dist/components/iconprovider/iconprovider.context.d.ts +9 -0
- package/dist/components/iconprovider/iconprovider.context.js +9 -0
- package/dist/components/iconprovider/index.d.ts +7 -0
- package/dist/components/iconprovider/index.js +7 -0
- package/dist/components/text/fonts.styles.d.ts +1 -0
- package/dist/components/text/fonts.styles.js +100 -0
- package/dist/components/text/index.d.ts +7 -0
- package/dist/components/text/index.js +7 -0
- package/dist/components/text/text.component.d.ts +29 -0
- package/dist/components/text/text.component.js +41 -0
- package/dist/components/text/text.constants.d.ts +9 -0
- package/dist/components/text/text.constants.js +28 -0
- package/dist/components/text/text.styles.d.ts +2 -0
- package/dist/components/text/text.styles.js +17 -0
- package/dist/components/text/text.types.d.ts +1 -0
- package/dist/components/text/text.types.js +2 -0
- package/dist/components/text/text.utils.d.ts +20 -0
- package/dist/components/text/text.utils.js +50 -0
- package/dist/components/themeprovider/index.d.ts +7 -0
- package/dist/components/themeprovider/index.js +7 -0
- package/dist/components/themeprovider/themeprovider.component.d.ts +48 -0
- package/dist/components/themeprovider/themeprovider.component.js +86 -0
- package/dist/components/themeprovider/themeprovider.constants.d.ts +10 -0
- package/dist/components/themeprovider/themeprovider.constants.js +31 -0
- package/dist/components/themeprovider/themeprovider.context.d.ts +9 -0
- package/dist/components/themeprovider/themeprovider.context.js +13 -0
- package/dist/components/themeprovider/themeprovider.styles.d.ts +2 -0
- package/dist/components/themeprovider/themeprovider.styles.js +13 -0
- package/dist/components/themeprovider/themeprovider.types.d.ts +5 -0
- package/dist/components/themeprovider/themeprovider.types.js +2 -0
- package/dist/components/themeprovider/themeprovider.utils.d.ts +9 -0
- package/dist/components/themeprovider/themeprovider.utils.js +10 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +19 -0
- package/dist/models/component/component.component.d.ts +38 -0
- package/dist/models/component/component.component.js +45 -0
- package/dist/models/component/component.types.d.ts +15 -0
- package/dist/models/component/component.types.js +2 -0
- package/dist/models/component/index.d.ts +3 -0
- package/dist/models/component/index.js +5 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.js +8 -0
- package/dist/models/provider/index.d.ts +2 -0
- package/dist/models/provider/index.js +5 -0
- package/dist/models/provider/provider.component.d.ts +70 -0
- package/dist/models/provider/provider.component.js +56 -0
- package/dist/models/provider/provider.styles.d.ts +2 -0
- package/dist/models/provider/provider.styles.js +14 -0
- package/dist/utils/provider/index.d.ts +13 -0
- package/dist/utils/provider/index.js +14 -0
- package/dist/utils/styles/index.d.ts +2 -0
- package/dist/utils/styles/index.js +14 -0
- package/dist/utils/tag-name/constants.d.ts +7 -0
- package/dist/utils/tag-name/constants.js +10 -0
- package/dist/utils/tag-name/index.d.ts +4 -0
- package/dist/utils/tag-name/index.js +10 -0
- package/dist/utils/types.d.ts +1 -0
- package/dist/utils/types.js +2 -0
- package/jest.config.js +3 -0
- package/package.json +78 -0
- package/scripts/copyFonts.js +31 -0
- package/scripts/copyIcons.js +31 -0
- package/scripts/copyTokens.js +24 -0
- package/src/components/avatar/__screenshots__/mdc-avatar.png +0 -0
- package/src/components/avatar/avatar.component.ts +74 -0
- package/src/components/avatar/avatar.constants.ts +12 -0
- package/src/components/avatar/avatar.e2e-test.ts +70 -0
- package/src/components/avatar/avatar.stories.ts +25 -0
- package/src/components/avatar/avatar.styles.ts +20 -0
- package/src/components/avatar/avatar.types.ts +1 -0
- package/src/components/avatar/index.ts +12 -0
- package/src/components/badge/__screenshots__/mdc-badge.png +0 -0
- package/src/components/badge/badge.component.ts +121 -0
- package/src/components/badge/badge.constants.ts +13 -0
- package/src/components/badge/badge.e2e-test.ts +68 -0
- package/src/components/badge/badge.stories.ts +33 -0
- package/src/components/badge/badge.styles.ts +26 -0
- package/src/components/badge/badge.types.ts +1 -0
- package/src/components/badge/index.ts +12 -0
- package/src/components/icon/__screenshots__/mdc-icon-default.png +0 -0
- package/src/components/icon/__screenshots__/mdc-icon-scale.png +0 -0
- package/src/components/icon/icon.component.ts +155 -0
- package/src/components/icon/icon.constants.ts +10 -0
- package/src/components/icon/icon.e2e-test.ts +101 -0
- package/src/components/icon/icon.stories.ts +34 -0
- package/src/components/icon/icon.styles.ts +15 -0
- package/src/components/icon/icon.utils.ts +13 -0
- package/src/components/icon/index.ts +12 -0
- package/src/components/iconprovider/__screenshots__/mdc-iconprovider.png +0 -0
- package/src/components/iconprovider/iconprovider.component.ts +76 -0
- package/src/components/iconprovider/iconprovider.constants.ts +12 -0
- package/src/components/iconprovider/iconprovider.context.ts +16 -0
- package/src/components/iconprovider/iconprovider.e2e-test.ts +65 -0
- package/src/components/iconprovider/iconprovider.stories.ts +27 -0
- package/src/components/iconprovider/iconprovider.stories.utils.ts +27 -0
- package/src/components/iconprovider/index.ts +12 -0
- package/src/components/text/__screenshots__/mdc-text-body-large.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-body-regular.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-body-small.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-1.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-2.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-3.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-4.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-5.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-6.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-heading-7.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-image-title.png +0 -0
- package/src/components/text/__screenshots__/mdc-text-label.png +0 -0
- package/src/components/text/fonts.styles.ts +99 -0
- package/src/components/text/index.ts +12 -0
- package/src/components/text/text.component.ts +51 -0
- package/src/components/text/text.constants.ts +27 -0
- package/src/components/text/text.e2e-test.ts +76 -0
- package/src/components/text/text.stories.ts +29 -0
- package/src/components/text/text.styles.ts +17 -0
- package/src/components/text/text.types.ts +13 -0
- package/src/components/text/text.utils.ts +51 -0
- package/src/components/themeprovider/__screenshots__/mdc-themeprovider-darkWebex.png +0 -0
- package/src/components/themeprovider/__screenshots__/mdc-themeprovider-lightWebex.png +0 -0
- package/src/components/themeprovider/index.ts +12 -0
- package/src/components/themeprovider/themeprovider.component.ts +91 -0
- package/src/components/themeprovider/themeprovider.constants.ts +32 -0
- package/src/components/themeprovider/themeprovider.context.ts +18 -0
- package/src/components/themeprovider/themeprovider.e2e-test.ts +89 -0
- package/src/components/themeprovider/themeprovider.stories.styles.css +22 -0
- package/src/components/themeprovider/themeprovider.stories.ts +38 -0
- package/src/components/themeprovider/themeprovider.stories.utils.ts +23 -0
- package/src/components/themeprovider/themeprovider.styles.ts +13 -0
- package/src/components/themeprovider/themeprovider.types.ts +7 -0
- package/src/components/themeprovider/themeprovider.utils.ts +16 -0
- package/src/index.ts +22 -0
- package/src/models/component/component.component.ts +46 -0
- package/src/models/component/component.types.ts +16 -0
- package/src/models/component/index.ts +7 -0
- package/src/models/index.ts +11 -0
- package/src/models/provider/index.ts +3 -0
- package/src/models/provider/provider.component.ts +87 -0
- package/src/models/provider/provider.styles.ts +14 -0
- package/src/stories/colors.mdx +32 -0
- package/src/stories/icons.mdx +13 -0
- package/src/stories/typography.mdx +20 -0
- package/src/utils/mixins/DisabledMixin.ts +19 -0
- package/src/utils/mixins/TabIndexMixin.ts +19 -0
- package/src/utils/provider/index.ts +21 -0
- package/src/utils/styles/index.ts +13 -0
- package/src/utils/tag-name/constants.ts +10 -0
- package/src/utils/tag-name/index.ts +15 -0
- package/src/utils/types.ts +1 -0
- package/tsconfig.json +45 -0
- package/tsconfig.module.json +47 -0
package/.eslintrc.js
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
const config = require('../../../.eslintrc.js');
|
2
|
+
|
3
|
+
module.exports = {
|
4
|
+
...config,
|
5
|
+
extends: [
|
6
|
+
...config.extends,
|
7
|
+
'plugin:lit/recommended',
|
8
|
+
],
|
9
|
+
parserOptions: { project: './tsconfig.json' },
|
10
|
+
rules: {
|
11
|
+
...config.rules,
|
12
|
+
'@typescript-eslint/no-floating-promises': 'error',
|
13
|
+
'no-redeclare': 'off',
|
14
|
+
'implicit-arrow-linebreak': 'off',
|
15
|
+
},
|
16
|
+
};
|
package/CONTRIBUTING.md
ADDED
package/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# @momentum-design/components
|
2
|
+
|
3
|
+
[![license: mit](https://img.shields.io/badge/License-MIT-blueviolet?style=flat-square)](https://github.com/momentum-design/momentum-design/blob/main/LICENSE)
|
4
|
+
![State](https://img.shields.io/badge/State-Alpha-blue?style=flat-square)
|
5
|
+
|
6
|
+
## Overview
|
7
|
+
|
8
|
+
This package is Work In Progress - there is no guarantee for consistency, stability till properly released.
|
9
|
+
There will be breaking changes coming up - it is not recommended to consume this package in this early stage.
|
10
|
+
|
11
|
+
## Steps to run this package
|
12
|
+
|
13
|
+
- Follow the steps mentioned in the [first time setup](https://github.com/momentum-design/momentum-design/blob/main/CONTRIBUTING.md#first-time-setup).
|
14
|
+
- Build all dependencies to run components package
|
15
|
+
```
|
16
|
+
yarn telemetry build
|
17
|
+
yarn token-builder build
|
18
|
+
yarn tokens build
|
19
|
+
yarn common build
|
20
|
+
yarn builder build
|
21
|
+
yarn fonts build
|
22
|
+
yarn icons build
|
23
|
+
```
|
24
|
+
- Run this to start storybook and develop components
|
25
|
+
```
|
26
|
+
yarn components dev
|
27
|
+
```
|
28
|
+
|
29
|
+
## Contributing
|
30
|
+
|
31
|
+
See [our contributing guide](./CONTRIBUTING.md)
|
32
|
+
|
33
|
+
## Scripts
|
34
|
+
|
35
|
+
See [our script documentation](./SCRIPTS.md)
|
36
|
+
|
37
|
+
## Testing
|
38
|
+
|
39
|
+
See [our testing documentation](./TESTING.md)
|
package/SCRIPTS.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# @momentum-design/components - Scripts Guide
|
2
|
+
|
3
|
+
## Scripts
|
4
|
+
|
5
|
+
### dev
|
6
|
+
- Run the Components Development tool locally
|
7
|
+
|
8
|
+
### build
|
9
|
+
- Builds to ./dist for export - only `dist` folder is published to NPM
|
10
|
+
|
11
|
+
### test
|
12
|
+
- Executes all tests
|
13
|
+
|
14
|
+
### analyze
|
15
|
+
- Runs linting and typescript, as well as all other static analysis scripts
|
package/TESTING.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Testing
|
2
|
+
|
3
|
+
## Unit Testing
|
4
|
+
|
5
|
+
## E2E Testing
|
6
|
+
|
7
|
+
Testing of the mounted, built component in real browsers.
|
8
|
+
E2E Testing is done with the help of [Playwright](https://playwright.dev/).
|
9
|
+
|
10
|
+
### Scope
|
11
|
+
|
12
|
+
* Testing visual consistency of a component
|
13
|
+
* Does the component display correctly in x browser (consistency and responsiveness)?
|
14
|
+
* Does the components functions work correctly in x browser?
|
15
|
+
* Is the component accessible in x browser?
|
16
|
+
* Are interactions with the component working as expected in x browser?
|
17
|
+
|
18
|
+
### Browser List to test
|
19
|
+
|
20
|
+
* Chrome
|
21
|
+
* Firefox
|
22
|
+
* Edge
|
23
|
+
* Safari/webkit
|
24
|
+
|
25
|
+
### Local development
|
26
|
+
|
27
|
+
For the best local development experience, the following E2E setup testing is recommended:
|
28
|
+
|
29
|
+
1. Open 2 terminals
|
30
|
+
2. In the first terminal, run `yarn components test:e2e:setup`
|
31
|
+
* This will spin up the local dev environment with dev server
|
32
|
+
* Wait till a `Serving!` message appears
|
33
|
+
3. In the second terminal, run `yarn components test:e2e`
|
34
|
+
* This allows to run all E2E tests
|
35
|
+
* To run a specific E2E test, run `yarn components test:e2e XXX.e2e-test.ts`
|
36
|
+
* To run the tests in `headed mode`, run `yarn components test:e2e -- --headed`
|
37
|
+
|
38
|
+
You can keep the first terminal open, while running/developing E2E tests in the second terminal.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/**
|
2
|
+
* Config file for API Extractor. For more info, please visit: https://api-extractor.com
|
3
|
+
*/
|
4
|
+
{
|
5
|
+
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Optionally specifies another JSON config file that this file extends from. This provides a way for
|
9
|
+
* standard settings to be shared across multiple projects.
|
10
|
+
*
|
11
|
+
* If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains
|
12
|
+
* the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be
|
13
|
+
* resolved using NodeJS require().
|
14
|
+
*
|
15
|
+
* SUPPORTED TOKENS: none
|
16
|
+
* DEFAULT VALUE: ""
|
17
|
+
*/
|
18
|
+
"extends": "../../../../config/api-extractor/api-extractor-base.json",
|
19
|
+
|
20
|
+
|
21
|
+
/**
|
22
|
+
* (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor
|
23
|
+
* analyzes the symbols exported by this module.
|
24
|
+
*
|
25
|
+
* The file extension must be ".d.ts" and not ".ts".
|
26
|
+
*
|
27
|
+
* The path is resolved relative to the folder of the config file that contains the setting; to change this,
|
28
|
+
* prepend a folder token such as "<projectFolder>".
|
29
|
+
*
|
30
|
+
* SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
|
31
|
+
*/
|
32
|
+
"mainEntryPointFilePath": "<projectFolder>/dist/index.d.ts"
|
33
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module.exports = {
|
2
|
+
/** Globs to analyze */
|
3
|
+
globs: ['src/components/**/*.component.ts'],
|
4
|
+
/** Globs to exclude */
|
5
|
+
exclude: [
|
6
|
+
'*.js',
|
7
|
+
],
|
8
|
+
/** Directory to output CEM to */
|
9
|
+
outdir: 'data',
|
10
|
+
/** Run in dev mode, provides extra logging */
|
11
|
+
dev: false,
|
12
|
+
/** Run in watch mode, runs on file changes */
|
13
|
+
watch: true,
|
14
|
+
/** Include third party custom elements manifests */
|
15
|
+
dependencies: false,
|
16
|
+
/** Output CEM path to `package.json`, defaults to true */
|
17
|
+
packagejson: false,
|
18
|
+
/** Enable special handling for litelement */
|
19
|
+
litelement: true,
|
20
|
+
/** Enable special handling for catalyst */
|
21
|
+
catalyst: false,
|
22
|
+
/** Enable special handling for fast */
|
23
|
+
fast: false,
|
24
|
+
/** Enable special handling for stencil */
|
25
|
+
stencil: false,
|
26
|
+
/** Provide custom plugins */
|
27
|
+
plugins: [],
|
28
|
+
};
|
@@ -0,0 +1,21 @@
|
|
1
|
+
const { join } = require('path');
|
2
|
+
|
3
|
+
const projectPath = process.cwd();
|
4
|
+
const outPath = join('dist', 'browser', 'index.js');
|
5
|
+
|
6
|
+
// todo: define browser targets here:
|
7
|
+
const browsers = ['chrome114', 'firefox114'];
|
8
|
+
|
9
|
+
const buildConfig = {
|
10
|
+
bundle: true,
|
11
|
+
entryPoints: [`${join(projectPath, 'src', 'index.ts')}`],
|
12
|
+
minify: true,
|
13
|
+
sourcemap: true,
|
14
|
+
outfile: `${join(projectPath, outPath)}`,
|
15
|
+
target: browsers,
|
16
|
+
};
|
17
|
+
|
18
|
+
module.exports = {
|
19
|
+
config: buildConfig,
|
20
|
+
outPath,
|
21
|
+
};
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-floating-promises */
|
2
|
+
const esbuild = require('esbuild');
|
3
|
+
const chalk = require('chalk');
|
4
|
+
const { join } = require('path');
|
5
|
+
const { config, outPath } = require('./configs/browser');
|
6
|
+
const { publicPath, port } = require('./configs/e2e');
|
7
|
+
|
8
|
+
const iife = async () => {
|
9
|
+
const ctx = await esbuild.context({
|
10
|
+
...config,
|
11
|
+
outfile: `${join(publicPath, outPath)}`,
|
12
|
+
});
|
13
|
+
|
14
|
+
await ctx.watch();
|
15
|
+
await ctx.serve({
|
16
|
+
servedir: publicPath,
|
17
|
+
port,
|
18
|
+
});
|
19
|
+
console.log(chalk.cyan('Serving at http://localhost:4000'));
|
20
|
+
};
|
21
|
+
|
22
|
+
iife();
|
@@ -0,0 +1,107 @@
|
|
1
|
+
import type { PlaywrightTestConfig } from '@playwright/test';
|
2
|
+
import { devices } from '@playwright/test';
|
3
|
+
import { port } from '../esbuild/configs/e2e';
|
4
|
+
/**
|
5
|
+
* Read environment variables from file.
|
6
|
+
* https://github.com/motdotla/dotenv
|
7
|
+
*/
|
8
|
+
// require('dotenv').config();
|
9
|
+
|
10
|
+
const url = `http://localhost:${port}`;
|
11
|
+
|
12
|
+
/**
|
13
|
+
* See https://playwright.dev/docs/test-configuration.
|
14
|
+
*/
|
15
|
+
const config: PlaywrightTestConfig = {
|
16
|
+
testDir: '../../src',
|
17
|
+
testMatch: /.*\.e2e-test\.ts/,
|
18
|
+
/* Maximum time one test can run for. */
|
19
|
+
timeout: 30 * 1000,
|
20
|
+
expect: {
|
21
|
+
/**
|
22
|
+
* Maximum time expect() should wait for the condition to be met.
|
23
|
+
* For example in `await expect(locator).toHaveText();`
|
24
|
+
*/
|
25
|
+
timeout: 5000,
|
26
|
+
},
|
27
|
+
/* Run tests in files in parallel */
|
28
|
+
fullyParallel: true,
|
29
|
+
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
30
|
+
forbidOnly: !!process.env.CI,
|
31
|
+
/* Retry on CI only */
|
32
|
+
retries: process.env.CI ? 2 : 0,
|
33
|
+
/* Opt out of parallel tests on CI. */
|
34
|
+
workers: process.env.CI ? 1 : undefined,
|
35
|
+
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
36
|
+
reporter: 'html',
|
37
|
+
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
38
|
+
use: {
|
39
|
+
/* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
|
40
|
+
actionTimeout: 0,
|
41
|
+
/* Base URL to use in actions like `await page.goto('/')`. */
|
42
|
+
baseURL: url,
|
43
|
+
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
44
|
+
trace: 'retain-on-failure',
|
45
|
+
},
|
46
|
+
|
47
|
+
snapshotPathTemplate: '{testDir}/{testFileDir}/__screenshots__/{arg}{ext}',
|
48
|
+
|
49
|
+
/* Configure projects for major browsers */
|
50
|
+
projects: [
|
51
|
+
{
|
52
|
+
name: 'Google Chrome',
|
53
|
+
use: {
|
54
|
+
...devices['Desktop Chrome'],
|
55
|
+
channel: 'chrome',
|
56
|
+
},
|
57
|
+
},
|
58
|
+
// {
|
59
|
+
// name: 'firefox',
|
60
|
+
// use: {
|
61
|
+
// ...devices['Desktop Firefox'],
|
62
|
+
// },
|
63
|
+
// },
|
64
|
+
|
65
|
+
// {
|
66
|
+
// name: 'webkit',
|
67
|
+
// use: {
|
68
|
+
// ...devices['Desktop Safari'],
|
69
|
+
// },
|
70
|
+
// },
|
71
|
+
|
72
|
+
/* Test against mobile viewports. */
|
73
|
+
// {
|
74
|
+
// name: 'Mobile Chrome',
|
75
|
+
// use: {
|
76
|
+
// ...devices['Pixel 5'],
|
77
|
+
// },
|
78
|
+
// },
|
79
|
+
// {
|
80
|
+
// name: 'Mobile Safari',
|
81
|
+
// use: {
|
82
|
+
// ...devices['iPhone 12'],
|
83
|
+
// },
|
84
|
+
// },
|
85
|
+
|
86
|
+
/* Test against branded browsers. */
|
87
|
+
// {
|
88
|
+
// name: 'Microsoft Edge',
|
89
|
+
// use: {
|
90
|
+
// channel: 'msedge',
|
91
|
+
// },
|
92
|
+
// },
|
93
|
+
],
|
94
|
+
|
95
|
+
/* Folder for test artifacts such as screenshots, videos, traces, etc. */
|
96
|
+
outputDir: 'test-results/',
|
97
|
+
|
98
|
+
/* Run your local dev server before starting the tests */
|
99
|
+
webServer: {
|
100
|
+
command: 'yarn test:e2e:setup',
|
101
|
+
url,
|
102
|
+
timeout: 240 * 1000,
|
103
|
+
reuseExistingServer: true,
|
104
|
+
},
|
105
|
+
};
|
106
|
+
|
107
|
+
export default config;
|
@@ -0,0 +1,43 @@
|
|
1
|
+
@font-face {
|
2
|
+
font-family: "Momentum";
|
3
|
+
src: url("/dist/fonts/Inter.var.woff2") format("woff2");
|
4
|
+
}
|
5
|
+
|
6
|
+
body {
|
7
|
+
position: fixed;
|
8
|
+
height: 100%;
|
9
|
+
width: 100%;
|
10
|
+
margin: 0;
|
11
|
+
padding: 0;
|
12
|
+
}
|
13
|
+
|
14
|
+
#root {
|
15
|
+
height: 100%;
|
16
|
+
width: 100%;
|
17
|
+
background: var(--mds-color-theme-background-solid-primary-normal);
|
18
|
+
}
|
19
|
+
|
20
|
+
.themeWrapper {
|
21
|
+
display: flex;
|
22
|
+
flex-direction: column;
|
23
|
+
width: calc(30%);
|
24
|
+
height: auto;
|
25
|
+
background: var(--mds-color-theme-background-solid-primary-normal);
|
26
|
+
color: var(--mds-color-theme-text-primary-normal);
|
27
|
+
padding: 10px;
|
28
|
+
border: 1px solid var(--mds-color-theme-text-primary-normal)
|
29
|
+
}
|
30
|
+
|
31
|
+
.themeWrapper+.themeWrapper {
|
32
|
+
margin-top: 10px;
|
33
|
+
}
|
34
|
+
|
35
|
+
.colorBox {
|
36
|
+
width: 100%;
|
37
|
+
height: 10px;
|
38
|
+
border-radius: 5px;
|
39
|
+
}
|
40
|
+
|
41
|
+
.colorBox+.colorBox {
|
42
|
+
margin-top: 10px;
|
43
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
8
|
+
<title>Momentum Components Dev Page</title>
|
9
|
+
<script type="module" src="/dist/browser/index.js"></script>
|
10
|
+
<link rel="stylesheet" href="index.css">
|
11
|
+
<link rel="stylesheet" href="/dist/complete.css">
|
12
|
+
<link rel="stylesheet" href="/dist/dark-stable.css">
|
13
|
+
<link rel="stylesheet" href="/dist/light-stable.css">
|
14
|
+
</head>
|
15
|
+
|
16
|
+
<body>
|
17
|
+
<mdc-themeprovider theme="mds-theme-stable-darkWebex"
|
18
|
+
themes="mds-theme-stable-darkWebex mds-theme-stable-lightWebex">
|
19
|
+
<mdc-iconprovider url="/dist/icons/svg">
|
20
|
+
<div id="root">
|
21
|
+
</div>
|
22
|
+
</mdc-iconprovider>
|
23
|
+
</mdc-themeprovider>
|
24
|
+
</body>
|
25
|
+
|
26
|
+
</html>
|
@@ -0,0 +1,163 @@
|
|
1
|
+
/* eslint-disable no-redeclare */
|
2
|
+
import { Page, expect, Locator, TestInfo } from '@playwright/test';
|
3
|
+
import type { ThemeName } from '../../../src/components/themeprovider/themeprovider.types';
|
4
|
+
import utils from '../../../src/components/themeprovider/themeprovider.utils';
|
5
|
+
import Accessibility from './utils/accessibility';
|
6
|
+
import VisualRegression from './utils/visual-regression';
|
7
|
+
|
8
|
+
const componentsDevPageTitle = 'Momentum Components Dev Page';
|
9
|
+
const htmlRootElementSelector = '#root';
|
10
|
+
|
11
|
+
interface MountOptions {
|
12
|
+
html: string;
|
13
|
+
clearDocument?: boolean;
|
14
|
+
}
|
15
|
+
|
16
|
+
interface ComponentsPage {
|
17
|
+
accessibility: Accessibility;
|
18
|
+
visualRegression: VisualRegression;
|
19
|
+
page: Page;
|
20
|
+
testInfo: TestInfo
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* Components Page Object Model
|
25
|
+
*
|
26
|
+
* This object model includes basic functionalities like setup, teardown, mount, etc.
|
27
|
+
* used for Momentum components E2E testing
|
28
|
+
*/
|
29
|
+
class ComponentsPage {
|
30
|
+
constructor(page: Page, testInfo: TestInfo) {
|
31
|
+
this.page = page;
|
32
|
+
this.testInfo = testInfo;
|
33
|
+
|
34
|
+
// creates utility objects on components page and inject dependencies:
|
35
|
+
this.accessibility = new Accessibility(this.page, this.testInfo);
|
36
|
+
this.visualRegression = new VisualRegression(this.page);
|
37
|
+
}
|
38
|
+
|
39
|
+
/**
|
40
|
+
* Sets the theme on the global theme provider
|
41
|
+
* for e2e tests. This allows testing
|
42
|
+
* with specified themes.
|
43
|
+
* @param theme - themeName to be used for setting theme on themeprovider
|
44
|
+
*/
|
45
|
+
async setGlobalTheme(theme: ThemeName) {
|
46
|
+
const themeClass = utils.getFullQualifiedTheme(theme);
|
47
|
+
await this.page.evaluate(
|
48
|
+
(args) => {
|
49
|
+
const themeProvider = window.document.querySelector('body mdc-themeprovider');
|
50
|
+
if (themeProvider) {
|
51
|
+
themeProvider.setAttribute('theme', args.themeClass);
|
52
|
+
}
|
53
|
+
},
|
54
|
+
{ themeClass },
|
55
|
+
);
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* **Setup function**
|
60
|
+
*
|
61
|
+
* to run before the test to navigate correctly
|
62
|
+
*/
|
63
|
+
async setup() {
|
64
|
+
await this.navigate();
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* **TearDown function**
|
69
|
+
*
|
70
|
+
* to run after the test
|
71
|
+
*/
|
72
|
+
async tearDown() {
|
73
|
+
await this.page.close();
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* **Navigate function**
|
78
|
+
*
|
79
|
+
* Path urls are allowed
|
80
|
+
*
|
81
|
+
* If no url provided, it navigates to baseURL
|
82
|
+
*
|
83
|
+
* - Go to the provided url
|
84
|
+
* - Await till page has been loaded
|
85
|
+
*/
|
86
|
+
async navigate(url?: string) {
|
87
|
+
await this.page.goto(url || '');
|
88
|
+
await expect(this.page).toHaveTitle(componentsDevPageTitle);
|
89
|
+
}
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Mount a html string to the index.html which gets displayed
|
93
|
+
*
|
94
|
+
* @param options - a object with options, including the `html` string to mount
|
95
|
+
*/
|
96
|
+
async mount({ html, clearDocument = false }: MountOptions) {
|
97
|
+
await this.page.evaluate(
|
98
|
+
(args) => {
|
99
|
+
function htmlToElement(htmlString: string): Element {
|
100
|
+
const template = document.createElement('template');
|
101
|
+
template.innerHTML = htmlString.trim();
|
102
|
+
return template.content.firstChild as Element;
|
103
|
+
}
|
104
|
+
const rootElement = window.document.querySelector(args.htmlRootElementSelector);
|
105
|
+
if (rootElement) {
|
106
|
+
// delete children of textContent before mounting the passed in html:
|
107
|
+
if (args.clearDocument) {
|
108
|
+
rootElement.textContent = '';
|
109
|
+
}
|
110
|
+
rootElement.appendChild(htmlToElement(args.html));
|
111
|
+
}
|
112
|
+
},
|
113
|
+
{ html, htmlRootElementSelector, clearDocument },
|
114
|
+
);
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
* Wait for the event `eventName` to be fired on a HTMLElement, queried by the passed in `locator`
|
119
|
+
* @param locator - Playwright locator
|
120
|
+
* @param eventName - eventName to wait for to be fired on queried HTMLElement
|
121
|
+
* @returns Promise, which resolves when event `eventName` gets fired
|
122
|
+
*/
|
123
|
+
async waitForEvent(locator: Locator, eventName: string) {
|
124
|
+
return locator.evaluate(
|
125
|
+
(element: HTMLElement, args) => new Promise((resolve: (value?: unknown) => void) => {
|
126
|
+
element.addEventListener(args.eventName, () => {
|
127
|
+
resolve();
|
128
|
+
});
|
129
|
+
}),
|
130
|
+
{ eventName },
|
131
|
+
);
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Set a attribute on a HTMLElement, queried by the passed in `locator`
|
136
|
+
* @param locator - Playwright locator
|
137
|
+
* @param qualifiedName - qualifiedName of the attribute to be set
|
138
|
+
* @param value - value of the attribute to be set
|
139
|
+
*/
|
140
|
+
async setAttribute(locator: Locator, qualifiedName: string, value: any) {
|
141
|
+
await locator.evaluate(
|
142
|
+
(element: HTMLElement, args) => {
|
143
|
+
element.setAttribute(args.qualifiedName, args.value);
|
144
|
+
},
|
145
|
+
{ qualifiedName, value },
|
146
|
+
);
|
147
|
+
}
|
148
|
+
|
149
|
+
/**
|
150
|
+
* Remove a attribute of a HTMLElement, queried by the passed in `locator`
|
151
|
+
* @param locator - Playwright locator
|
152
|
+
* @param qualifiedName - qualifiedName of the attribute to be removed
|
153
|
+
*/
|
154
|
+
async removeAttribute(locator: Locator, qualifiedName: string) {
|
155
|
+
await locator.evaluate(
|
156
|
+
(element: HTMLElement, args) => {
|
157
|
+
element.removeAttribute(args.qualifiedName);
|
158
|
+
},
|
159
|
+
{ qualifiedName },
|
160
|
+
);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
export default ComponentsPage;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
/**
|
2
|
+
* Accessibility constants
|
3
|
+
*
|
4
|
+
* WCAG_TAGS_TO_CHECK which should be checked,
|
5
|
+
* see full list here (Axe-core Tags): https://www.deque.com/axe/core-documentation/api-documentation/#axe-core-tags
|
6
|
+
* Note: WCAG Tags are cummulative, such that when confirming WCAG 2.2 AA,
|
7
|
+
* the less strict tags have to be added as well, like wcag2a, wcag2aa, wcag21aa
|
8
|
+
*
|
9
|
+
* RULES_TO_DISABLE which should not be checked,
|
10
|
+
* see full list here: https://github.com/dequelabs/axe-core/blob/master/doc/rule-descriptions.md
|
11
|
+
*/
|
12
|
+
const ACCESSIBILITY = {
|
13
|
+
WCAG_TAGS_TO_CHECK: ['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'],
|
14
|
+
RULES_TO_DISABLE: [],
|
15
|
+
};
|
16
|
+
|
17
|
+
const VISUAL_REGRESSION = {
|
18
|
+
THRESHOLD: 0,
|
19
|
+
MAX_DIFF_PIXELS_RATIO: 0.03,
|
20
|
+
FILE_EXTENSION: 'png',
|
21
|
+
};
|
22
|
+
|
23
|
+
const CONSTANTS = {
|
24
|
+
ACCESSIBILITY,
|
25
|
+
VISUAL_REGRESSION,
|
26
|
+
};
|
27
|
+
export default CONSTANTS;
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { test as base } from '@playwright/test';
|
2
|
+
import { THEME_NAMES } from '../../../src/components/themeprovider/themeprovider.constants';
|
3
|
+
import type { ThemeName } from '../../../src/components/themeprovider/themeprovider.types';
|
4
|
+
import ComponentsPage from './Components.page';
|
5
|
+
|
6
|
+
type Options = {
|
7
|
+
/**
|
8
|
+
* Theme to choose
|
9
|
+
*/
|
10
|
+
theme: ThemeName
|
11
|
+
};
|
12
|
+
|
13
|
+
type Fixtures = {
|
14
|
+
/**
|
15
|
+
* componentsPage fixture - to be used to group momentum e2e utils
|
16
|
+
*/
|
17
|
+
componentsPage: ComponentsPage;
|
18
|
+
};
|
19
|
+
|
20
|
+
// Extend base test by providing our fixtures based on Page Object Models
|
21
|
+
// This new "test" can be used in multiple test files, and each of them will get the fixtures.
|
22
|
+
export const test = base.extend<Fixtures & Options>({
|
23
|
+
theme: [THEME_NAMES.DARK_WEBEX, { option: true }],
|
24
|
+
|
25
|
+
componentsPage: async ({ page, theme }, use, testInfo) => {
|
26
|
+
const componentsPage = new ComponentsPage(page, testInfo);
|
27
|
+
|
28
|
+
if (theme) {
|
29
|
+
await componentsPage.setGlobalTheme(theme);
|
30
|
+
}
|
31
|
+
// navigate to the baseURL at the beginning
|
32
|
+
await componentsPage.setup();
|
33
|
+
|
34
|
+
// Use the fixture value in the test:
|
35
|
+
await use(componentsPage);
|
36
|
+
|
37
|
+
// Clean up at the end of the test:
|
38
|
+
await componentsPage.tearDown();
|
39
|
+
},
|
40
|
+
});
|
41
|
+
|
42
|
+
export { ComponentsPage };
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { ComponentsPage, test } from '..';
|
2
|
+
|
3
|
+
const automaticA11yCheckStep = (componentsPage: ComponentsPage) => test.step('check for A11y violations', async () => {
|
4
|
+
await componentsPage.accessibility.checkForA11yViolations();
|
5
|
+
});
|
6
|
+
|
7
|
+
export default {
|
8
|
+
automaticA11yCheckStep,
|
9
|
+
};
|