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.
- package/.github/workflows/npm-publish.yml +54 -0
- package/README.md +26 -2
- package/constants.js +280 -280
- package/creation/container-creation.js +75 -75
- package/creation/index.js +5 -5
- package/creation/new-pro-creation.js +109 -109
- package/creation/single-mfe-creation.js +49 -49
- package/index.js +2 -2
- package/mfe-gen.js +22 -22
- package/package.json +1 -1
- package/templates/container/app-comp-template.js +9 -9
- package/templates/container/container-comp-template.js +28 -28
- package/templates/container/env-template.js +7 -7
- package/templates/container/heart-template.js +59 -59
- package/templates/container/index.js +17 -17
- package/templates/container/mfe-comp-template.js +8 -8
- package/templates/mfe/app-comp-template.js +13 -13
- package/templates/mfe/config-overrides-template.js +12 -12
- package/templates/mfe/index.js +8 -8
- package/templates/mfe/mfe-index-template.js +35 -35
- package/utility.js +231 -231
|
@@ -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
|
-
|
|
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"];
|