react-mfe-gen 1.0.2 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,54 @@
1
+ name: Node.js Package
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: actions/setup-node@v4
14
+ with:
15
+ node-version: 20
16
+ - run: npm ci
17
+
18
+ publish-npm:
19
+ needs: build
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+ - uses: actions/setup-node@v4
24
+ with:
25
+ node-version: 20
26
+ registry-url: https://registry.npmjs.org/
27
+ - run: npm ci
28
+
29
+ - name: Get previous version from main
30
+ id: prev_version
31
+ run: |
32
+ git fetch origin main --depth=1
33
+ PREV_VERSION=$(git show origin/main:package.json | grep '"version":' | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
34
+ echo "PREV_VERSION=$PREV_VERSION" >> $GITHUB_ENV
35
+
36
+ - name: Get current version
37
+ id: curr_version
38
+ run: |
39
+ CURR_VERSION=$(grep '"version":' package.json | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
40
+ echo "CURR_VERSION=$CURR_VERSION" >> $GITHUB_ENV
41
+
42
+ - name: Check version change
43
+ run: |
44
+ echo "Previous version: $PREV_VERSION"
45
+ echo "Current version: $CURR_VERSION"
46
+ if [ "$PREV_VERSION" = "$CURR_VERSION" ]; then
47
+ echo "Version not changed. Skipping publish."
48
+ exit 0
49
+ fi
50
+
51
+ - name: Publish to npm
52
+ run: npm publish --access public
53
+ env:
54
+ NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
package/README.md CHANGED
@@ -1,2 +1,26 @@
1
- # react-mfe-gen
2
- CLI tool for react Microfront end initial setup
1
+ # react-mfe-gen
2
+
3
+ react-mfe-gen is a CLI tool that helps you quickly scaffold a base setup for React Micro-Frontend (MFE) architecture.
4
+
5
+ This tool uses the Runtime Integration approach — meaning each MFE is built as a Web Component and integrated dynamically at runtime. This keeps your applications modular, scalable, and independent.
6
+
7
+ ## 🚀 Features:
8
+
9
+ - Quickly set up a React MFE base project.
10
+ - Follows Runtime Integration best practices.
11
+ - Generates Web Components for seamless runtime integration.
12
+ - Easy to use and beginner-friendly.
13
+
14
+ ## 📦 Prerequisites:
15
+
16
+ Node.js installed (latest LTS recommended).
17
+
18
+ ## ⚡ Installation & Usage:
19
+
20
+ - Install the package globally
21
+ `npm install -g react-mfe-gen`
22
+
23
+ - Run the CLI
24
+ `react-mfe-gen`
25
+
26
+ - Follow the prompts to generate your project or container.
package/constants.js CHANGED
@@ -1,280 +1,280 @@
1
- export const QUESTION = {
2
- ACTION: "Select an action:",
3
- LANGUAGE: "Choose your preferred language:",
4
- PROJECT_NAME: "Enter your project name:",
5
- PROJECT_DESCRIPTION: "Enter your project description:",
6
- NUMBER_OF_MFES: "How many micro-frontends do you plan to include?",
7
- MFE_NAME:
8
- "Enter your micro-frontend name:\n**Note:** This will be used as a prefix in window functions.\n:",
9
- MFE_DESCRIPTION: "Enter a description for your micro-frontend:",
10
- CONTAINER_NAME:
11
- "Enter your container app name:\n**Note:** This should be prefix word in your microfrontends window functions.\n:",
12
- CONTAINER_DESCRIPTION: "Enter a description for your container app:",
13
- STYLING: "Select a styling solution:",
14
- STATE_MANAGEMENT: "Select a state management library:",
15
- FORM_MANAGEMENT: "Select a form management library:",
16
- CONDITIONAL_MFE_NAME: "Enter your micro-frontend name:",
17
- CONTAINER_PATH:
18
- "Please enter a path to create container:\ne.g: G:\\workspace\\sample-container\n:",
19
- MFE_PATH:
20
- "Please enter a path to create microfront end:\ne.g: G:\\workspace\\sample-mfe\n:",
21
- PATH: "Please enter a path to create ",
22
- };
23
- export const CHOICE_CONSTANTS = {
24
- ACTION: {
25
- NEW_PROJECT: "Create a new project 🚀",
26
- CONTAINER: "Create only a container 📦",
27
- SINGLE_MFE: "Create a single micro-frontend 🌐",
28
- },
29
- STYLING: {
30
- SASS: "Sass 🎨",
31
- TAILWIND: "Tailwind 🌊",
32
- MATERIAL_UI: "Material UI 🧩",
33
- BOOTSTRAP: "Bootstrap 🥾",
34
- STYLED_COMPONENTS: "Styled Components ✍️",
35
- },
36
- LANGUAGE: {
37
- JAVA_SCRIPT: "JavaScript 🟨",
38
- TYPE_SCRIPT: "TypeScript 🔷",
39
- },
40
- STATE_MANAGEMENT: {
41
- REDUX: "Redux 🔄",
42
- ZUSTAND: "Zustand 🐻",
43
- },
44
- FORM_MANAGEMENT: {
45
- REACT_HOOK_FORM: "React-hook-form 🪝",
46
- FORMIK: "Formik 📝",
47
- },
48
- NONE: "None ❌",
49
- };
50
-
51
- export const CHOICES = {
52
- ACTION: [
53
- CHOICE_CONSTANTS.ACTION.NEW_PROJECT,
54
- CHOICE_CONSTANTS.ACTION.CONTAINER,
55
- CHOICE_CONSTANTS.ACTION.SINGLE_MFE,
56
- ],
57
- STYLING: [
58
- CHOICE_CONSTANTS.NONE,
59
- CHOICE_CONSTANTS.STYLING.SASS,
60
- CHOICE_CONSTANTS.STYLING.BOOTSTRAP,
61
- CHOICE_CONSTANTS.STYLING.MATERIAL_UI,
62
- CHOICE_CONSTANTS.STYLING.TAILWIND,
63
- CHOICE_CONSTANTS.STYLING.STYLED_COMPONENTS,
64
- ],
65
- LANGUAGE: [
66
- CHOICE_CONSTANTS.LANGUAGE.JAVA_SCRIPT,
67
- CHOICE_CONSTANTS.LANGUAGE.TYPE_SCRIPT,
68
- ],
69
- STATE_MANAGEMENT: [
70
- CHOICE_CONSTANTS.NONE,
71
- CHOICE_CONSTANTS.STATE_MANAGEMENT.REDUX,
72
- CHOICE_CONSTANTS.STATE_MANAGEMENT.ZUSTAND,
73
- ],
74
- FORM_MANAGEMENT: [
75
- CHOICE_CONSTANTS.NONE,
76
- CHOICE_CONSTANTS.FORM_MANAGEMENT.REACT_HOOK_FORM,
77
- CHOICE_CONSTANTS.FORM_MANAGEMENT.FORMIK,
78
- ],
79
- };
80
-
81
- export const PROMPT = {
82
- USER_NEED: [
83
- {
84
- message: QUESTION.ACTION,
85
- type: "list",
86
- name: "typeOfAction",
87
- choices: CHOICES.ACTION,
88
- },
89
- {
90
- message: QUESTION.LANGUAGE,
91
- type: "list",
92
- name: "language",
93
- choices: CHOICES.LANGUAGE,
94
- },
95
- ],
96
- ENTIRE_PROJECT: [
97
- {
98
- message: QUESTION.PROJECT_NAME,
99
- type: "input",
100
- name: "projectName",
101
- validate(value) {
102
- if (!/^[a-z-]+$/.test(value)) {
103
- return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
104
- }
105
- return true;
106
- },
107
- },
108
- {
109
- message: QUESTION.PROJECT_DESCRIPTION,
110
- type: "input",
111
- name: "projectDescription",
112
- },
113
- {
114
- type: "input",
115
- name: "numberOfMfes",
116
- message: QUESTION.NUMBER_OF_MFES,
117
- validate(value) {
118
- const isNumber = !Number.isNaN(Number.parseFloat(value));
119
- return isNumber || "Please enter a valid number";
120
- },
121
- filter: Number,
122
- },
123
- ],
124
- ONE_MFE: [
125
- {
126
- message: QUESTION.MFE_NAME,
127
- type: "input",
128
- name: "mfeName",
129
- validate(value) {
130
- if (!/^[a-z-]+$/.test(value)) {
131
- return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
132
- }
133
- return true;
134
- },
135
- },
136
- {
137
- message: QUESTION.MFE_DESCRIPTION,
138
- type: "input",
139
- name: "mfeDescription",
140
- },
141
- ],
142
- CONTAINER: [
143
- {
144
- message: QUESTION.CONTAINER_NAME,
145
- type: "input",
146
- name: "containerName",
147
- validate(value) {
148
- if (!/^[a-z-]+$/.test(value)) {
149
- return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
150
- }
151
- return true;
152
- },
153
- },
154
- {
155
- message: QUESTION.CONTAINER_DESCRIPTION,
156
- type: "input",
157
- name: "containerDescription",
158
- },
159
- {
160
- type: "input",
161
- name: "numberOfMfes",
162
- message: QUESTION.NUMBER_OF_MFES,
163
- validate(value) {
164
- const isNumber = !Number.isNaN(Number.parseFloat(value));
165
- return isNumber || "Please enter a valid number";
166
- },
167
- filter: Number,
168
- },
169
- ],
170
- COMMON: [
171
- {
172
- message: QUESTION.STYLING,
173
- type: "list",
174
- name: "styling",
175
- choices: CHOICES.STYLING,
176
- },
177
- {
178
- message: QUESTION.STATE_MANAGEMENT,
179
- type: "list",
180
- name: "stateManagement",
181
- choices: CHOICES.STATE_MANAGEMENT,
182
- },
183
- ],
184
- CONDITIONAL: {
185
- MICROFRONT_END_NAME: {
186
- message: QUESTION.CONDITIONAL_MFE_NAME,
187
- type: "input",
188
- name: "mfeName",
189
- validate(value) {
190
- if (!/^[a-z-]+$/.test(value)) {
191
- return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
192
- }
193
- return true;
194
- },
195
- },
196
- CONTAINER_PATH: {
197
- message: QUESTION.CONTAINER_PATH,
198
- type: "input",
199
- name: "containerPath",
200
- },
201
- MFE_PATH: {
202
- message: QUESTION.MFE_PATH,
203
- type: "input",
204
- name: "mfePath",
205
- },
206
- PATH: {
207
- message: QUESTION.PATH,
208
- type: "input",
209
- name: "path",
210
- },
211
- MICROFRONT_END_NAME: {
212
- message: QUESTION.CONDITIONAL_MFE_NAME,
213
- type: "input",
214
- name: "mfeName",
215
- },
216
- FORM_MANAGEMENT: {
217
- message: QUESTION.FORM_MANAGEMENT,
218
- type: "list",
219
- name: "formManagement",
220
- choices: CHOICES.FORM_MANAGEMENT,
221
- },
222
- },
223
- };
224
-
225
- export const INFO_MESSAGE = {
226
- DISCLAIMER:
227
- "Hello there! 👋\n\nThis tool currently supports micro-frontend creation using runtime integration via custom script injection ⚙️.\nPlease keep this limitation in mind when developing your MFE applications 📌.\n",
228
- CREATE_APP: "Let's create ",
229
- CONFIGURE_CONTAINER: "Configuring the container... 🛠️",
230
- APP_CREATION: "Creating your React app... ⚛️ ",
231
- i_DEPENDENCIES: "Installing dependencies... 📦 ",
232
- i_DEV_DEPENDENCIES: "Installing dev dependencies... 🧩 ",
233
- SUCCESS: {
234
- NEW_PRO: "New project created successfully! 🎉",
235
- CONTAINER: "Container created successfully! 📦",
236
- ONE_MFE: "Microfront end created successfully! 🌐",
237
- },
238
- HAPPY_CODING: "Happy coding! 💻✨",
239
- };
240
-
241
- export const LIBRARY_PAIR = {
242
- STYLING: {
243
- [CHOICE_CONSTANTS.STYLING.TAILWIND]: [
244
- "tailwindcss",
245
- "postcss",
246
- "autoprefixer",
247
- ],
248
- [CHOICE_CONSTANTS.STYLING.SASS]: ["sass"],
249
- [CHOICE_CONSTANTS.STYLING.MATERIAL_UI]: [
250
- "@mui/material",
251
- "@emotion/react",
252
- "@emotion/styled",
253
- "@mui/icons-material",
254
- ],
255
- [CHOICE_CONSTANTS.STYLING.BOOTSTRAP]: ["bootstrap"],
256
- [CHOICE_CONSTANTS.STYLING.STYLED_COMPONENTS]: ["styled-components"],
257
- [CHOICE_CONSTANTS.NONE]: [],
258
- },
259
- STATE_MANAGEMENT: {
260
- [CHOICE_CONSTANTS.NONE]: [],
261
- [CHOICE_CONSTANTS.STATE_MANAGEMENT.REDUX]: [
262
- "@reduxjs/toolkit",
263
- "react-redux",
264
- ],
265
- [CHOICE_CONSTANTS.STATE_MANAGEMENT.ZUSTAND]: ["zustand"],
266
- },
267
- FORM_MANAGEMENT: {
268
- [CHOICE_CONSTANTS.NONE]: [],
269
- [CHOICE_CONSTANTS.FORM_MANAGEMENT.REACT_HOOK_FORM]: [
270
- "react-hook-form",
271
- "@hookform/resolvers",
272
- "yup",
273
- ],
274
- [CHOICE_CONSTANTS.FORM_MANAGEMENT.FORMIK]: ["formik", "yup"],
275
- },
276
- };
277
-
278
- export const DEFAULT_DEPENDENCIES = ["axios", "react-router-dom"];
279
-
280
- export const DEFAULT_DEV_DEPENDENCIES = ["cross-env", "react-app-rewired"];
1
+ export const QUESTION = {
2
+ ACTION: "Select an action:",
3
+ LANGUAGE: "Choose your preferred language:",
4
+ PROJECT_NAME: "Enter your project name:",
5
+ PROJECT_DESCRIPTION: "Enter your project description:",
6
+ NUMBER_OF_MFES: "How many micro-frontends do you plan to include?",
7
+ MFE_NAME:
8
+ "Enter your micro-frontend name:\n**Note:** This will be used as a prefix in window functions.\n:",
9
+ MFE_DESCRIPTION: "Enter a description for your micro-frontend:",
10
+ CONTAINER_NAME:
11
+ "Enter your container app name:\n**Note:** This should be prefix word in your microfrontends window functions.\n:",
12
+ CONTAINER_DESCRIPTION: "Enter a description for your container app:",
13
+ STYLING: "Select a styling solution:",
14
+ STATE_MANAGEMENT: "Select a state management library:",
15
+ FORM_MANAGEMENT: "Select a form management library:",
16
+ CONDITIONAL_MFE_NAME: "Enter your micro-frontend name:",
17
+ CONTAINER_PATH:
18
+ "Please enter a path to create container:\ne.g: G:\\workspace\\sample-container\n:",
19
+ MFE_PATH:
20
+ "Please enter a path to create microfront end:\ne.g: G:\\workspace\\sample-mfe\n:",
21
+ PATH: "Please enter a path to create ",
22
+ };
23
+ export const CHOICE_CONSTANTS = {
24
+ ACTION: {
25
+ NEW_PROJECT: "Create a new project 🚀",
26
+ CONTAINER: "Create only a container 📦",
27
+ SINGLE_MFE: "Create a single micro-frontend 🌐",
28
+ },
29
+ STYLING: {
30
+ SASS: "Sass 🎨",
31
+ TAILWIND: "Tailwind 🌊",
32
+ MATERIAL_UI: "Material UI 🧩",
33
+ BOOTSTRAP: "Bootstrap 🥾",
34
+ STYLED_COMPONENTS: "Styled Components ✍️",
35
+ },
36
+ LANGUAGE: {
37
+ JAVA_SCRIPT: "JavaScript 🟨",
38
+ TYPE_SCRIPT: "TypeScript 🔷",
39
+ },
40
+ STATE_MANAGEMENT: {
41
+ REDUX: "Redux 🔄",
42
+ ZUSTAND: "Zustand 🐻",
43
+ },
44
+ FORM_MANAGEMENT: {
45
+ REACT_HOOK_FORM: "React-hook-form 🪝",
46
+ FORMIK: "Formik 📝",
47
+ },
48
+ NONE: "None ❌",
49
+ };
50
+
51
+ export const CHOICES = {
52
+ ACTION: [
53
+ CHOICE_CONSTANTS.ACTION.NEW_PROJECT,
54
+ CHOICE_CONSTANTS.ACTION.CONTAINER,
55
+ CHOICE_CONSTANTS.ACTION.SINGLE_MFE,
56
+ ],
57
+ STYLING: [
58
+ CHOICE_CONSTANTS.NONE,
59
+ CHOICE_CONSTANTS.STYLING.SASS,
60
+ CHOICE_CONSTANTS.STYLING.BOOTSTRAP,
61
+ CHOICE_CONSTANTS.STYLING.MATERIAL_UI,
62
+ CHOICE_CONSTANTS.STYLING.TAILWIND,
63
+ CHOICE_CONSTANTS.STYLING.STYLED_COMPONENTS,
64
+ ],
65
+ LANGUAGE: [
66
+ CHOICE_CONSTANTS.LANGUAGE.JAVA_SCRIPT,
67
+ CHOICE_CONSTANTS.LANGUAGE.TYPE_SCRIPT,
68
+ ],
69
+ STATE_MANAGEMENT: [
70
+ CHOICE_CONSTANTS.NONE,
71
+ CHOICE_CONSTANTS.STATE_MANAGEMENT.REDUX,
72
+ CHOICE_CONSTANTS.STATE_MANAGEMENT.ZUSTAND,
73
+ ],
74
+ FORM_MANAGEMENT: [
75
+ CHOICE_CONSTANTS.NONE,
76
+ CHOICE_CONSTANTS.FORM_MANAGEMENT.REACT_HOOK_FORM,
77
+ CHOICE_CONSTANTS.FORM_MANAGEMENT.FORMIK,
78
+ ],
79
+ };
80
+
81
+ export const PROMPT = {
82
+ USER_NEED: [
83
+ {
84
+ message: QUESTION.ACTION,
85
+ type: "list",
86
+ name: "typeOfAction",
87
+ choices: CHOICES.ACTION,
88
+ },
89
+ {
90
+ message: QUESTION.LANGUAGE,
91
+ type: "list",
92
+ name: "language",
93
+ choices: CHOICES.LANGUAGE,
94
+ },
95
+ ],
96
+ ENTIRE_PROJECT: [
97
+ {
98
+ message: QUESTION.PROJECT_NAME,
99
+ type: "input",
100
+ name: "projectName",
101
+ validate(value) {
102
+ if (!/^[a-z-]+$/.test(value)) {
103
+ return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
104
+ }
105
+ return true;
106
+ },
107
+ },
108
+ {
109
+ message: QUESTION.PROJECT_DESCRIPTION,
110
+ type: "input",
111
+ name: "projectDescription",
112
+ },
113
+ {
114
+ type: "input",
115
+ name: "numberOfMfes",
116
+ message: QUESTION.NUMBER_OF_MFES,
117
+ validate(value) {
118
+ const isNumber = !Number.isNaN(Number.parseFloat(value));
119
+ return isNumber || "Please enter a valid number";
120
+ },
121
+ filter: Number,
122
+ },
123
+ ],
124
+ ONE_MFE: [
125
+ {
126
+ message: QUESTION.MFE_NAME,
127
+ type: "input",
128
+ name: "mfeName",
129
+ validate(value) {
130
+ if (!/^[a-z-]+$/.test(value)) {
131
+ return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
132
+ }
133
+ return true;
134
+ },
135
+ },
136
+ {
137
+ message: QUESTION.MFE_DESCRIPTION,
138
+ type: "input",
139
+ name: "mfeDescription",
140
+ },
141
+ ],
142
+ CONTAINER: [
143
+ {
144
+ message: QUESTION.CONTAINER_NAME,
145
+ type: "input",
146
+ name: "containerName",
147
+ validate(value) {
148
+ if (!/^[a-z-]+$/.test(value)) {
149
+ return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
150
+ }
151
+ return true;
152
+ },
153
+ },
154
+ {
155
+ message: QUESTION.CONTAINER_DESCRIPTION,
156
+ type: "input",
157
+ name: "containerDescription",
158
+ },
159
+ {
160
+ type: "input",
161
+ name: "numberOfMfes",
162
+ message: QUESTION.NUMBER_OF_MFES,
163
+ validate(value) {
164
+ const isNumber = !Number.isNaN(Number.parseFloat(value));
165
+ return isNumber || "Please enter a valid number";
166
+ },
167
+ filter: Number,
168
+ },
169
+ ],
170
+ COMMON: [
171
+ {
172
+ message: QUESTION.STYLING,
173
+ type: "list",
174
+ name: "styling",
175
+ choices: CHOICES.STYLING,
176
+ },
177
+ {
178
+ message: QUESTION.STATE_MANAGEMENT,
179
+ type: "list",
180
+ name: "stateManagement",
181
+ choices: CHOICES.STATE_MANAGEMENT,
182
+ },
183
+ ],
184
+ CONDITIONAL: {
185
+ MICROFRONT_END_NAME: {
186
+ message: QUESTION.CONDITIONAL_MFE_NAME,
187
+ type: "input",
188
+ name: "mfeName",
189
+ validate(value) {
190
+ if (!/^[a-z-]+$/.test(value)) {
191
+ return "Please use only lowercase letters and '-' (numbers, capital letters, and other symbols are not allowed).";
192
+ }
193
+ return true;
194
+ },
195
+ },
196
+ CONTAINER_PATH: {
197
+ message: QUESTION.CONTAINER_PATH,
198
+ type: "input",
199
+ name: "containerPath",
200
+ },
201
+ MFE_PATH: {
202
+ message: QUESTION.MFE_PATH,
203
+ type: "input",
204
+ name: "mfePath",
205
+ },
206
+ PATH: {
207
+ message: QUESTION.PATH,
208
+ type: "input",
209
+ name: "path",
210
+ },
211
+ MICROFRONT_END_NAME: {
212
+ message: QUESTION.CONDITIONAL_MFE_NAME,
213
+ type: "input",
214
+ name: "mfeName",
215
+ },
216
+ FORM_MANAGEMENT: {
217
+ message: QUESTION.FORM_MANAGEMENT,
218
+ type: "list",
219
+ name: "formManagement",
220
+ choices: CHOICES.FORM_MANAGEMENT,
221
+ },
222
+ },
223
+ };
224
+
225
+ export const INFO_MESSAGE = {
226
+ DISCLAIMER:
227
+ "Hello there! 👋\n\nThis tool currently supports micro-frontend creation using runtime integration via custom script injection ⚙️.\nPlease keep this limitation in mind when developing your MFE applications 📌.\n",
228
+ CREATE_APP: "Let's create ",
229
+ CONFIGURE_CONTAINER: "Configuring the container... 🛠️",
230
+ APP_CREATION: "Creating your React app... ⚛️ ",
231
+ i_DEPENDENCIES: "Installing dependencies... 📦 ",
232
+ i_DEV_DEPENDENCIES: "Installing dev dependencies... 🧩 ",
233
+ SUCCESS: {
234
+ NEW_PRO: "New project created successfully! 🎉",
235
+ CONTAINER: "Container created successfully! 📦",
236
+ ONE_MFE: "Microfront end created successfully! 🌐",
237
+ },
238
+ HAPPY_CODING: "Happy coding! 💻✨",
239
+ };
240
+
241
+ export const LIBRARY_PAIR = {
242
+ STYLING: {
243
+ [CHOICE_CONSTANTS.STYLING.TAILWIND]: [
244
+ "tailwindcss",
245
+ "postcss",
246
+ "autoprefixer",
247
+ ],
248
+ [CHOICE_CONSTANTS.STYLING.SASS]: ["sass"],
249
+ [CHOICE_CONSTANTS.STYLING.MATERIAL_UI]: [
250
+ "@mui/material",
251
+ "@emotion/react",
252
+ "@emotion/styled",
253
+ "@mui/icons-material",
254
+ ],
255
+ [CHOICE_CONSTANTS.STYLING.BOOTSTRAP]: ["bootstrap"],
256
+ [CHOICE_CONSTANTS.STYLING.STYLED_COMPONENTS]: ["styled-components"],
257
+ [CHOICE_CONSTANTS.NONE]: [],
258
+ },
259
+ STATE_MANAGEMENT: {
260
+ [CHOICE_CONSTANTS.NONE]: [],
261
+ [CHOICE_CONSTANTS.STATE_MANAGEMENT.REDUX]: [
262
+ "@reduxjs/toolkit",
263
+ "react-redux",
264
+ ],
265
+ [CHOICE_CONSTANTS.STATE_MANAGEMENT.ZUSTAND]: ["zustand"],
266
+ },
267
+ FORM_MANAGEMENT: {
268
+ [CHOICE_CONSTANTS.NONE]: [],
269
+ [CHOICE_CONSTANTS.FORM_MANAGEMENT.REACT_HOOK_FORM]: [
270
+ "react-hook-form",
271
+ "@hookform/resolvers",
272
+ "yup",
273
+ ],
274
+ [CHOICE_CONSTANTS.FORM_MANAGEMENT.FORMIK]: ["formik", "yup"],
275
+ },
276
+ };
277
+
278
+ export const DEFAULT_DEPENDENCIES = ["axios", "react-router-dom"];
279
+
280
+ export const DEFAULT_DEV_DEPENDENCIES = ["cross-env", "react-app-rewired"];