@emulsify/core 0.0.0-development

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.cli/init.js +168 -0
  2. package/.editorconfig +5 -0
  3. package/.eslintignore +2 -0
  4. package/.github/ISSUE_TEMPLATE/BUG_REPORT_TEMPLATE.md +18 -0
  5. package/.github/ISSUE_TEMPLATE/FEATURE_REQUEST_TEMPLATE.md +11 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +19 -0
  7. package/.github/dependabot.yml +6 -0
  8. package/.github/workflows/addtoprojects.yml +21 -0
  9. package/.github/workflows/contributors.yml +23 -0
  10. package/.github/workflows/lint.yml +22 -0
  11. package/.github/workflows/semantic-release.yml +24 -0
  12. package/.history/.releaserc_20240607133550 +11 -0
  13. package/.history/.releaserc_20240607134831 +18 -0
  14. package/.history/.releaserc_20240607135005 +11 -0
  15. package/.history/package_20240607132936.json +121 -0
  16. package/.history/package_20240607135135.json +121 -0
  17. package/.history/package_20240607135150.json +121 -0
  18. package/.history/package_20240607135242.json +124 -0
  19. package/.history/package_20240607135251.json +124 -0
  20. package/.history/package_20240607135337.json +127 -0
  21. package/.history/package_20240607145546.json +135 -0
  22. package/.husky/commit-msg +4 -0
  23. package/.husky/pre-commit +4 -0
  24. package/.nvmrc +1 -0
  25. package/.prettierignore +4 -0
  26. package/.storybook/_drupal.js +27 -0
  27. package/.storybook/emulsifyTheme.js +38 -0
  28. package/.storybook/main.js +22 -0
  29. package/.storybook/manager-head.html +122 -0
  30. package/.storybook/manager.js +15 -0
  31. package/.storybook/preview.js +40 -0
  32. package/.storybook/setupTwig.js +59 -0
  33. package/.storybook/setupTwig.test.js +33 -0
  34. package/.storybook/webpack.config.js +67 -0
  35. package/CODE_OF_CONDUCT.md +56 -0
  36. package/LICENSE +674 -0
  37. package/README.md +72 -0
  38. package/assets/images/corner-bkg.png +0 -0
  39. package/assets/images/emulsify-logo-sb.svg +8 -0
  40. package/assets/images/logo.png +0 -0
  41. package/commitlint.config.js +3 -0
  42. package/config/.prettierrc.json +4 -0
  43. package/config/.stylelintrc.json +61 -0
  44. package/config/a11y.config.js +61 -0
  45. package/config/babel.config.js +18 -0
  46. package/config/eslintrc.config.json +68 -0
  47. package/config/jest.config.js +19 -0
  48. package/config/postcss.config.js +5 -0
  49. package/config/webpack/app.js +1 -0
  50. package/config/webpack/css/style.js +1 -0
  51. package/config/webpack/css.js +1 -0
  52. package/config/webpack/loaders.js +87 -0
  53. package/config/webpack/plugins.js +48 -0
  54. package/config/webpack/svgSprite.js +5 -0
  55. package/config/webpack/webpack.common.js +72 -0
  56. package/config/webpack/webpack.dev.js +7 -0
  57. package/config/webpack/webpack.prod.js +6 -0
  58. package/package.json +136 -0
  59. package/release.config.js +11 -0
  60. package/scripts/a11y.js +92 -0
  61. package/scripts/a11y.test.js +159 -0
  62. package/scripts/loadYaml.js +17 -0
  63. package/scripts/loadYaml.test.js +30 -0
package/.cli/init.js ADDED
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const yaml = require('js-yaml');
6
+
7
+ /**
8
+ * Returns a boolean indicating whether or not the given object is a literal object.
9
+ *
10
+ * @param {any} obj object who's type will be checked.
11
+ * @returns {boolean} boolean indicating whether or not the given obj is a literal object.
12
+ */
13
+ const isObjectLiteral = (obj) =>
14
+ obj != null && obj.constructor.name === 'Object';
15
+
16
+ /**
17
+ * Attempts to require the project.emulsify.json file.
18
+ *
19
+ * @returns parsed project.emulsify.json file.
20
+ */
21
+ const getEmulsifyConfig = () => {
22
+ try {
23
+ return require('../config/project.emulsify.json');
24
+ } catch (e) {
25
+ throw new Error(
26
+ `Unable to load an Emulsify project config file (project.emulsify.json): ${String(
27
+ e,
28
+ )}`,
29
+ );
30
+ }
31
+ };
32
+
33
+ /**
34
+ * Throws if the given emulsify config file is invalid.
35
+ *
36
+ * @param {*} config emulsify project config, as loaded from a project.emulsify.json file.
37
+ */
38
+ const validateEmulsifyConfig = (config) => {
39
+ const prefix = 'Invalid project.emulsify.json config file';
40
+ const example = JSON.stringify({
41
+ project: {
42
+ name: 'Example Project',
43
+ machineName: 'example-project',
44
+ },
45
+ });
46
+
47
+ if (!config) {
48
+ throw new Error(`${prefix}.`);
49
+ }
50
+
51
+ if (!config.project || !isObjectLiteral(config.project)) {
52
+ throw new Error(
53
+ `${prefix}: Must contain a "project" key, with a name and machineName property. ${example}`,
54
+ );
55
+ }
56
+
57
+ if (typeof config.project.name !== 'string') {
58
+ throw new Error(
59
+ `${prefix}: the "project" object must contain a "name" key with a string value. ${example}`,
60
+ );
61
+ }
62
+
63
+ if (typeof config.project.machineName !== 'string') {
64
+ throw new Error(
65
+ `${prefix}: the "project" object must contain a "machineName" key with a string value. ${example}`,
66
+ );
67
+ }
68
+ };
69
+
70
+ /**
71
+ * Takes an array of objects describing the origin and destination of a given file,
72
+ * then moves each specified file according to it's to/from properties.
73
+ *
74
+ * @param {Array<{ to: string, from: string }>} files array of objects depicting the origin and destination of a given file.
75
+ * @returns void.
76
+ */
77
+ const renameFiles = (files) =>
78
+ files.map(({ from, to }) =>
79
+ fs.renameSync(path.join(__dirname, from), path.join(__dirname, to)),
80
+ );
81
+
82
+ /**
83
+ * Takes a machineName, and returns a fn that, when called with a str,
84
+ * replaces all instances of `emulsify` with the given machineName.
85
+ *
86
+ * @param {string} machineName string that should replace emulsify.
87
+ * @returns {function} fn that when called with a str, replaces all instances of `emulsify` with the given machineName.
88
+ */
89
+ const strReplaceEmulsify = (machineName) => (str) =>
90
+ str.replace(/emulsify/g, machineName);
91
+
92
+ /**
93
+ * Loads a yml file at filePath, applies the functor to the contents of the file, and writes it.
94
+ *
95
+ * @param {string} filePath path to the file that should be loaded, modified, and re-saved.
96
+ * @param {fn} functor fn that should return the new contents of the file, to be saved.
97
+ * @returns void.
98
+ */
99
+ const applyToYmlFile = (filePath, functor) => {
100
+ if (!filePath || typeof filePath !== `string`) {
101
+ throw new Error(
102
+ `Cannot modify a file without knowing how to access it: ${filePath}`,
103
+ );
104
+ }
105
+ if (typeof functor !== 'function') {
106
+ return;
107
+ }
108
+
109
+ const file = yaml.load(fs.readFileSync(filePath, 'utf8'));
110
+ fs.writeFileSync(filePath, yaml.dump(functor(file)));
111
+ };
112
+
113
+ const main = () => {
114
+ // Load up config file, throw if none exists.
115
+ const config = getEmulsifyConfig();
116
+
117
+ // Validate config file, throw if it is missing
118
+ //properties or is otherwise malformed.
119
+ validateEmulsifyConfig(config);
120
+
121
+ const {
122
+ project: { machineName, name },
123
+ } = config;
124
+
125
+ // Move all files to their correct location.
126
+ renameFiles([
127
+ {
128
+ from: '../emulsify.info.yml',
129
+ to: `../${machineName}.info.yml`,
130
+ },
131
+ {
132
+ from: '../emulsify.theme',
133
+ to: `../${machineName}.theme`,
134
+ },
135
+ {
136
+ from: '../emulsify.breakpoints.yml',
137
+ to: `../${machineName}.breakpoints.yml`,
138
+ },
139
+ {
140
+ from: '../emulsify.libraries.yml',
141
+ to: `../${machineName}.libraries.yml`,
142
+ },
143
+ ]);
144
+
145
+ // Update info.yml file.
146
+ applyToYmlFile(
147
+ path.join(__dirname, `../${machineName}.info.yml`),
148
+ (info) => ({
149
+ ...info,
150
+ name: machineName,
151
+ libraries: info.libraries.map(strReplaceEmulsify(machineName)),
152
+ }),
153
+ );
154
+
155
+ // Update breakpoint.yml file.
156
+ applyToYmlFile(
157
+ path.join(__dirname, `../${machineName}.breakpoints.yml`),
158
+ (breakpoints) => {
159
+ const newBps = {};
160
+ for (const prop of Object.keys(breakpoints)) {
161
+ newBps[strReplaceEmulsify(machineName)(prop)] = breakpoints[prop];
162
+ }
163
+ return newBps;
164
+ },
165
+ );
166
+ };
167
+
168
+ main();
package/.editorconfig ADDED
@@ -0,0 +1,5 @@
1
+ # Unix-style newlines with a newline ending every file
2
+ [*]
3
+ indent_style = space
4
+ indent_size = 2
5
+ insert_final_newline = true
package/.eslintignore ADDED
@@ -0,0 +1,2 @@
1
+ **/*.min.js
2
+ **/node_modules/**/*
@@ -0,0 +1,18 @@
1
+ ### Describe the bug
2
+ _A clear and concise description of what the bug is._
3
+
4
+ ### Steps to reproduce the bug
5
+ Steps to reproduce the behavior:
6
+ 1. Go to '...'
7
+ 2. Click on '....'
8
+ 3. Scroll down to '....'
9
+ 4. See error
10
+
11
+ ### Expected behavior
12
+ A clear and concise description of what you expected to happen.
13
+
14
+ ### Suggested solution or approach:
15
+ _(optional) Describe a solution or approach to your request that may help with implementation._
16
+
17
+ ### Additional context
18
+ _(optional) Add any other context or screenshots about the feature request here._
@@ -0,0 +1,11 @@
1
+ ### Emulsify Core Version:
2
+ - [1.0.0](https://github.com/emulsify-ds/emulsify-core/releases)):
3
+
4
+ ### Description of the feature request:
5
+ _Please give as much information as possible_
6
+
7
+ ### Suggested solution or approach:
8
+ _(optional) Describe a solution or approach to your request that may help with implementation._
9
+
10
+ ### Additional context:
11
+ _(optional) Add any other context or screenshots about the feature request here._
@@ -0,0 +1,19 @@
1
+ **This PR does the following:**
2
+ - Adds functionality bullet item
3
+ - Fixes this or that bullet item
4
+
5
+ ### Related Issue(s)
6
+ - [Title of the issue](https://github.com/emulsify-ds/emulsify-core/issues/1)
7
+
8
+ ### Notes:
9
+ - (optional) Document any intentionally unfinished parts or known issues within this PR
10
+
11
+ ### Functional Testing:
12
+ - [ ] Document steps that allow someone to fully test your code changes. Include screenshot and links when appropriate.
13
+
14
+ ### Security
15
+ _Security checks that should be reviewed_
16
+
17
+ ### Accessibility
18
+ _Should this be checked for this feature?_
19
+
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: npm
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
@@ -0,0 +1,21 @@
1
+ name: Add to projects
2
+
3
+ on:
4
+ issues:
5
+ types:
6
+ - opened
7
+ pull_request:
8
+ types:
9
+ - opened
10
+
11
+ jobs:
12
+ add-to-project:
13
+ name: Add issue to project
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/add-to-project@v0.3.0
17
+ with:
18
+ # You can target a repository in a different organization
19
+ # to the issue
20
+ project-url: https://github.com/orgs/emulsify-ds/projects/6
21
+ github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
@@ -0,0 +1,23 @@
1
+ name: Add contributors
2
+ on:
3
+ schedule:
4
+ - cron: "20 20 * * *"
5
+ push:
6
+ branches:
7
+ - master
8
+
9
+ jobs:
10
+ add-contributors:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - uses: BobAnkh/add-contributors@master
15
+ with:
16
+ CONTRIBUTOR: "### Contributors"
17
+ COLUMN_PER_ROW: "6"
18
+ ACCESS_TOKEN: ${{secrets.ADD_TO_PROJECT_PAT}}
19
+ IMG_WIDTH: "100"
20
+ FONT_SIZE: "14"
21
+ PATH: "/README.md"
22
+ COMMIT_MESSAGE: "docs(README): update contributors"
23
+ AVATAR_SHAPE: "round"
@@ -0,0 +1,22 @@
1
+ name: Lint
2
+ on:
3
+ push:
4
+ branches: [develop, main]
5
+ pull_request:
6
+ branches: [develop, main]
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - name: Checkout
12
+ uses: actions/checkout@v2
13
+ with:
14
+ fetch-depth: 0
15
+ - name: Install Node.js
16
+ uses: actions/setup-node@v2
17
+ with:
18
+ node-version: 20
19
+ - name: Install
20
+ run: npm install
21
+ - name: Lint
22
+ run: npm run lint
@@ -0,0 +1,24 @@
1
+ name: Semantic Release on Merge
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ jobs:
6
+ release:
7
+ name: Attempt Semantic Release
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - name: Checkout
11
+ uses: actions/checkout@v2
12
+ with:
13
+ fetch-depth: 0
14
+ - name: Install Node.js
15
+ uses: actions/setup-node@v2
16
+ with:
17
+ node-version: 20
18
+ - name: Install
19
+ run: npm install
20
+ - name: Release
21
+ env:
22
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
23
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
24
+ run: npm run semantic-release
@@ -0,0 +1,11 @@
1
+ module.exports = {
2
+ tagFormat: '${version}',
3
+ branches: ['main'],
4
+ repositoryUrl: 'git@github.com:emulsify-ds/emulsify-core.git',
5
+ plugins: [
6
+ '@semantic-release/commit-analyzer',
7
+ '@semantic-release/release-notes-generator',
8
+ ['@semantic-release/npm', { npmPublish: false }],
9
+ '@semantic-release/github',
10
+ ],
11
+ };
@@ -0,0 +1,18 @@
1
+ {
2
+ "tagFormat": "${version}",
3
+ "branches": [
4
+ "main"
5
+ ],
6
+ "repositoryUrl": "git@github.com:emulsify-ds/emulsify-core.git",
7
+ "plugins": [
8
+ "@semantic-release/commit-analyzer",
9
+ "@semantic-release/release-notes-generator",
10
+ [
11
+ "@semantic-release/npm",
12
+ {
13
+ "npmPublish": false
14
+ }
15
+ ],
16
+ "@semantic-release/github"
17
+ ]
18
+ }
@@ -0,0 +1,11 @@
1
+ module.exports = {
2
+ tagFormat: '${version}',
3
+ branches: ['main'],
4
+ repositoryUrl: 'git@github.com:emulsify-ds/emulsify-core.git',
5
+ plugins: [
6
+ '@semantic-release/commit-analyzer',
7
+ '@semantic-release/release-notes-generator',
8
+ ['@semantic-release/npm', { npmPublish: false }],
9
+ '@semantic-release/github',
10
+ ],
11
+ };
@@ -0,0 +1,121 @@
1
+ {
2
+ "name": "emulsify-core",
3
+ "version": "1.0.0",
4
+ "description": "Storybook development + Webpack Build",
5
+ "keywords": [
6
+ "component library",
7
+ "design system",
8
+ "drupal",
9
+ "pattern library",
10
+ "storybook",
11
+ "styleguide"
12
+ ],
13
+ "author": "Four Kitchens <shout@fourkitchens.com>",
14
+ "license": "ISC",
15
+ "scripts": {
16
+ "coverage": "npm run test && open-cli .coverage/lcov-report/index.html",
17
+ "format": "npm run lint-fix; npm run prettier-fix",
18
+ "husky:commit-msg": "commitlint --edit $1",
19
+ "husky:pre-commit": "npm run lint",
20
+ "lint": "npm run lint-js",
21
+ "lint-fix": "npm run lint-js -- --fix",
22
+ "lint-js": "eslint --config config/eslintrc.config.json --no-error-on-unmatched-pattern ./config ./storybook",
23
+ "lint-staged": "lint-staged",
24
+ "prepare": "[ -d '.git' ] && (husky install) || true",
25
+ "prettier": "prettier --config config/prettierrc.json --ignore-unknown \"**/*.{js,yml,scss,md}\"",
26
+ "prettier-fix": "prettier --config config/prettierrc.json --write --ignore-unknown \"**/*.{js,yml,scss,md}\"",
27
+ "semantic-release": "semantic-release",
28
+ "storybook": "storybook dev --ci -s ../../dist,../../assets/images,../../assets/icons,../../assets/videos -p 6006",
29
+ "storybook-build": "storybook build -s ../../dist,../../assets/images,../../assets/icons,../../assets/videos -o .out",
30
+ "storybook-deploy": "storybook-to-ghpages -o .out",
31
+ "test": "jest --coverage --config ./config/jest.config.js",
32
+ "twatch": "jest --no-coverage --watch --verbose"
33
+ },
34
+ "dependencies": {
35
+ "@babel/core": "^7.24.0",
36
+ "@babel/eslint-parser": "^7.23.10",
37
+ "@emulsify/cli": "^1.6.0",
38
+ "@storybook/addon-a11y": "^7.6.17",
39
+ "@storybook/addon-actions": "^7.6.17",
40
+ "@storybook/addon-essentials": "^7.6.17",
41
+ "@storybook/addon-links": "^7.6.17",
42
+ "@storybook/addon-styling-webpack": "^1.0.0",
43
+ "@storybook/addon-themes": "^7.6.17",
44
+ "@storybook/html": "^7.6.17",
45
+ "@storybook/html-webpack5": "^7.6.17",
46
+ "add-attributes-twig-extension": "^0.1.0",
47
+ "autoprefixer": "^10.4.19",
48
+ "babel-loader": "^9.1.3",
49
+ "babel-preset-minify": "^0.5.2",
50
+ "bem-twig-extension": "^0.1.1",
51
+ "breakpoint-sass": "^3.0.0",
52
+ "chalk": "^5.2.0",
53
+ "clean-webpack-plugin": "^4.0.0",
54
+ "concurrently": "^8.2.2",
55
+ "css-loader": "^7.1.1",
56
+ "eslint": "^8.57.0",
57
+ "eslint-config-airbnb-base": "^15.0.0",
58
+ "eslint-config-prettier": "^9.1.0",
59
+ "eslint-plugin-import": "^2.29.1",
60
+ "eslint-plugin-jest": "^27.9.0",
61
+ "eslint-plugin-prettier": "^5.1.3",
62
+ "eslint-plugin-security": "^2.1.1",
63
+ "eslint-plugin-storybook": "^0.8.0",
64
+ "eslint-webpack-plugin": "^4.1.0",
65
+ "file-loader": "^6.2.0",
66
+ "fs-extra": "^11.2.0",
67
+ "glob": "^10.3.12",
68
+ "graceful-fs": "^4.2.11",
69
+ "html-webpack-plugin": "^5.6.0",
70
+ "imagemin-webpack-plugin": "^2.4.2",
71
+ "jest": "^29.7.0",
72
+ "jest-environment-jsdom": "^29.7.0",
73
+ "js-yaml": "^4.1.0",
74
+ "js-yaml-loader": "^1.2.2",
75
+ "lint-staged": "^15.2.2",
76
+ "mini-css-extract-plugin": "^2.9.0",
77
+ "node-sass-glob-importer": "^5.3.3",
78
+ "normalize.css": "^8.0.1",
79
+ "open-cli": "^8.0.0",
80
+ "pa11y": "^7.0.0",
81
+ "postcss": "^8.4.38",
82
+ "postcss-loader": "^8.1.1",
83
+ "postcss-scss": "^4.0.9",
84
+ "ramda": "^0.29.1",
85
+ "react": "^18.2.0",
86
+ "react-dom": "^18.2.0",
87
+ "regenerator-runtime": "^0.14.1",
88
+ "sass": "^1.75.0",
89
+ "sass-loader": "^14.2.1",
90
+ "storybook": "^7.6.17",
91
+ "style-dictionary": "^3.9.2",
92
+ "stylelint": "^16.3.1",
93
+ "stylelint-config-standard-scss": "^13.1.0",
94
+ "stylelint-prettier": "^5.0.0",
95
+ "stylelint-selector-bem-pattern": "^4.0.0",
96
+ "stylelint-webpack-plugin": "^5.0.0",
97
+ "svg-sprite-loader": "^6.0.11",
98
+ "token-transformer": "^0.0.33",
99
+ "twig-drupal-filters": "^3.2.0",
100
+ "twig-loader": "github:fourkitchens/twig-loader",
101
+ "twig-testing-library": "^1.2.0",
102
+ "webpack": "^5.91.0",
103
+ "webpack-cli": "^5.1.4",
104
+ "webpack-merge": "^5.10.0",
105
+ "yaml": "^2.4.1"
106
+ },
107
+ "devDependencies": {
108
+ "@commitlint/cli": "^19.2.0",
109
+ "@commitlint/config-conventional": "^19.1.0",
110
+ "@semantic-release/changelog": "^6.0.2",
111
+ "@semantic-release/commit-analyzer": "^11.1.0",
112
+ "@semantic-release/git": "^10.0.1",
113
+ "@semantic-release/github": "^10.0.2",
114
+ "@semantic-release/release-notes-generator": "^12.1.0",
115
+ "husky": "^9.0.11",
116
+ "semantic-release": "^23.0.4"
117
+ },
118
+ "overrides": {
119
+ "graceful-fs": "^4.2.11"
120
+ }
121
+ }
@@ -0,0 +1,121 @@
1
+ {
2
+ "name": "@emulsify/core",
3
+ "version": "1.0.0",
4
+ "description": "Storybook development + Webpack Build",
5
+ "keywords": [
6
+ "component library",
7
+ "design system",
8
+ "drupal",
9
+ "pattern library",
10
+ "storybook",
11
+ "styleguide"
12
+ ],
13
+ "author": "Four Kitchens <shout@fourkitchens.com>",
14
+ "license": "ISC",
15
+ "scripts": {
16
+ "coverage": "npm run test && open-cli .coverage/lcov-report/index.html",
17
+ "format": "npm run lint-fix; npm run prettier-fix",
18
+ "husky:commit-msg": "commitlint --edit $1",
19
+ "husky:pre-commit": "npm run lint",
20
+ "lint": "npm run lint-js",
21
+ "lint-fix": "npm run lint-js -- --fix",
22
+ "lint-js": "eslint --config config/eslintrc.config.json --no-error-on-unmatched-pattern ./config ./storybook",
23
+ "lint-staged": "lint-staged",
24
+ "prepare": "[ -d '.git' ] && (husky install) || true",
25
+ "prettier": "prettier --config config/prettierrc.json --ignore-unknown \"**/*.{js,yml,scss,md}\"",
26
+ "prettier-fix": "prettier --config config/prettierrc.json --write --ignore-unknown \"**/*.{js,yml,scss,md}\"",
27
+ "semantic-release": "semantic-release",
28
+ "storybook": "storybook dev --ci -s ../../dist,../../assets/images,../../assets/icons,../../assets/videos -p 6006",
29
+ "storybook-build": "storybook build -s ../../dist,../../assets/images,../../assets/icons,../../assets/videos -o .out",
30
+ "storybook-deploy": "storybook-to-ghpages -o .out",
31
+ "test": "jest --coverage --config ./config/jest.config.js",
32
+ "twatch": "jest --no-coverage --watch --verbose"
33
+ },
34
+ "dependencies": {
35
+ "@babel/core": "^7.24.0",
36
+ "@babel/eslint-parser": "^7.23.10",
37
+ "@emulsify/cli": "^1.6.0",
38
+ "@storybook/addon-a11y": "^7.6.17",
39
+ "@storybook/addon-actions": "^7.6.17",
40
+ "@storybook/addon-essentials": "^7.6.17",
41
+ "@storybook/addon-links": "^7.6.17",
42
+ "@storybook/addon-styling-webpack": "^1.0.0",
43
+ "@storybook/addon-themes": "^7.6.17",
44
+ "@storybook/html": "^7.6.17",
45
+ "@storybook/html-webpack5": "^7.6.17",
46
+ "add-attributes-twig-extension": "^0.1.0",
47
+ "autoprefixer": "^10.4.19",
48
+ "babel-loader": "^9.1.3",
49
+ "babel-preset-minify": "^0.5.2",
50
+ "bem-twig-extension": "^0.1.1",
51
+ "breakpoint-sass": "^3.0.0",
52
+ "chalk": "^5.2.0",
53
+ "clean-webpack-plugin": "^4.0.0",
54
+ "concurrently": "^8.2.2",
55
+ "css-loader": "^7.1.1",
56
+ "eslint": "^8.57.0",
57
+ "eslint-config-airbnb-base": "^15.0.0",
58
+ "eslint-config-prettier": "^9.1.0",
59
+ "eslint-plugin-import": "^2.29.1",
60
+ "eslint-plugin-jest": "^27.9.0",
61
+ "eslint-plugin-prettier": "^5.1.3",
62
+ "eslint-plugin-security": "^2.1.1",
63
+ "eslint-plugin-storybook": "^0.8.0",
64
+ "eslint-webpack-plugin": "^4.1.0",
65
+ "file-loader": "^6.2.0",
66
+ "fs-extra": "^11.2.0",
67
+ "glob": "^10.3.12",
68
+ "graceful-fs": "^4.2.11",
69
+ "html-webpack-plugin": "^5.6.0",
70
+ "imagemin-webpack-plugin": "^2.4.2",
71
+ "jest": "^29.7.0",
72
+ "jest-environment-jsdom": "^29.7.0",
73
+ "js-yaml": "^4.1.0",
74
+ "js-yaml-loader": "^1.2.2",
75
+ "lint-staged": "^15.2.2",
76
+ "mini-css-extract-plugin": "^2.9.0",
77
+ "node-sass-glob-importer": "^5.3.3",
78
+ "normalize.css": "^8.0.1",
79
+ "open-cli": "^8.0.0",
80
+ "pa11y": "^7.0.0",
81
+ "postcss": "^8.4.38",
82
+ "postcss-loader": "^8.1.1",
83
+ "postcss-scss": "^4.0.9",
84
+ "ramda": "^0.29.1",
85
+ "react": "^18.2.0",
86
+ "react-dom": "^18.2.0",
87
+ "regenerator-runtime": "^0.14.1",
88
+ "sass": "^1.75.0",
89
+ "sass-loader": "^14.2.1",
90
+ "storybook": "^7.6.17",
91
+ "style-dictionary": "^3.9.2",
92
+ "stylelint": "^16.3.1",
93
+ "stylelint-config-standard-scss": "^13.1.0",
94
+ "stylelint-prettier": "^5.0.0",
95
+ "stylelint-selector-bem-pattern": "^4.0.0",
96
+ "stylelint-webpack-plugin": "^5.0.0",
97
+ "svg-sprite-loader": "^6.0.11",
98
+ "token-transformer": "^0.0.33",
99
+ "twig-drupal-filters": "^3.2.0",
100
+ "twig-loader": "github:fourkitchens/twig-loader",
101
+ "twig-testing-library": "^1.2.0",
102
+ "webpack": "^5.91.0",
103
+ "webpack-cli": "^5.1.4",
104
+ "webpack-merge": "^5.10.0",
105
+ "yaml": "^2.4.1"
106
+ },
107
+ "devDependencies": {
108
+ "@commitlint/cli": "^19.2.0",
109
+ "@commitlint/config-conventional": "^19.1.0",
110
+ "@semantic-release/changelog": "^6.0.2",
111
+ "@semantic-release/commit-analyzer": "^11.1.0",
112
+ "@semantic-release/git": "^10.0.1",
113
+ "@semantic-release/github": "^10.0.2",
114
+ "@semantic-release/release-notes-generator": "^12.1.0",
115
+ "husky": "^9.0.11",
116
+ "semantic-release": "^23.0.4"
117
+ },
118
+ "overrides": {
119
+ "graceful-fs": "^4.2.11"
120
+ }
121
+ }