create-projx 1.6.2 → 1.6.3

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.
@@ -33,7 +33,7 @@ import {
33
33
  upsertComponentMarker,
34
34
  writeComponentMarker,
35
35
  writeProjxConfig
36
- } from "./chunk-LTIJPVRZ.js";
36
+ } from "./chunk-LYPPFXGK.js";
37
37
  export {
38
38
  COMPONENTS,
39
39
  COMPONENT_MARKER,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-projx",
3
- "version": "1.6.2",
3
+ "version": "1.6.3",
4
4
  "description": "Scaffold production-grade fullstack projects in seconds. FastAPI, Fastify, React, Flutter, Terraform — with auth, database, CI/CD, E2E tests, and Docker. One command, ready to deploy.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,23 +13,23 @@ jobs:
13
13
  permissions:
14
14
  pull-requests: read
15
15
  outputs:
16
- <% if (components.includes('fastapi')) { %>
17
- <%= paths.fastapi %>: ${{ steps.filter.outputs.<%= paths.fastapi %> }}
16
+ <% for (const inst of fastapiInstances) { %>
17
+ <%= inst.path %>: ${{ steps.filter.outputs.<%= inst.path %> }}
18
18
  <% } %>
19
- <% if (components.includes('fastify')) { %>
20
- <%= paths.fastify %>: ${{ steps.filter.outputs.<%= paths.fastify %> }}
19
+ <% for (const inst of fastifyInstances) { %>
20
+ <%= inst.path %>: ${{ steps.filter.outputs.<%= inst.path %> }}
21
21
  <% } %>
22
- <% if (components.includes('frontend')) { %>
23
- <%= paths.frontend %>: ${{ steps.filter.outputs.<%= paths.frontend %> }}
22
+ <% for (const inst of frontendInstances) { %>
23
+ <%= inst.path %>: ${{ steps.filter.outputs.<%= inst.path %> }}
24
24
  <% } %>
25
- <% if (components.includes('mobile')) { %>
26
- <%= paths.mobile %>: ${{ steps.filter.outputs.<%= paths.mobile %> }}
25
+ <% for (const inst of mobileInstances) { %>
26
+ <%= inst.path %>: ${{ steps.filter.outputs.<%= inst.path %> }}
27
27
  <% } %>
28
- <% if (components.includes('e2e')) { %>
29
- <%= paths.e2e %>: ${{ steps.filter.outputs.<%= paths.e2e %> }}
28
+ <% for (const inst of e2eInstances) { %>
29
+ <%= inst.path %>: ${{ steps.filter.outputs.<%= inst.path %> }}
30
30
  <% } %>
31
- <% if (components.includes('infra')) { %>
32
- <%= paths.infra %>: ${{ steps.filter.outputs.<%= paths.infra %> }}
31
+ <% for (const inst of infraInstances) { %>
32
+ <%= inst.path %>: ${{ steps.filter.outputs.<%= inst.path %> }}
33
33
  <% } %>
34
34
  steps:
35
35
  - uses: actions/checkout@v5
@@ -37,29 +37,29 @@ jobs:
37
37
  id: filter
38
38
  with:
39
39
  filters: |
40
- <% if (components.includes('fastapi')) { %>
41
- <%= paths.fastapi %>:
42
- - '<%= paths.fastapi %>/**'
40
+ <% for (const inst of fastapiInstances) { %>
41
+ <%= inst.path %>:
42
+ - '<%= inst.path %>/**'
43
43
  <% } %>
44
- <% if (components.includes('fastify')) { %>
45
- <%= paths.fastify %>:
46
- - '<%= paths.fastify %>/**'
44
+ <% for (const inst of fastifyInstances) { %>
45
+ <%= inst.path %>:
46
+ - '<%= inst.path %>/**'
47
47
  <% } %>
48
- <% if (components.includes('frontend')) { %>
49
- <%= paths.frontend %>:
50
- - '<%= paths.frontend %>/**'
48
+ <% for (const inst of frontendInstances) { %>
49
+ <%= inst.path %>:
50
+ - '<%= inst.path %>/**'
51
51
  <% } %>
52
- <% if (components.includes('mobile')) { %>
53
- <%= paths.mobile %>:
54
- - '<%= paths.mobile %>/**'
52
+ <% for (const inst of mobileInstances) { %>
53
+ <%= inst.path %>:
54
+ - '<%= inst.path %>/**'
55
55
  <% } %>
56
- <% if (components.includes('e2e')) { %>
57
- <%= paths.e2e %>:
58
- - '<%= paths.e2e %>/**'
56
+ <% for (const inst of e2eInstances) { %>
57
+ <%= inst.path %>:
58
+ - '<%= inst.path %>/**'
59
59
  <% } %>
60
- <% if (components.includes('infra')) { %>
61
- <%= paths.infra %>:
62
- - '<%= paths.infra %>/**'
60
+ <% for (const inst of infraInstances) { %>
61
+ <%= inst.path %>:
62
+ - '<%= inst.path %>/**'
63
63
  <% } %>
64
64
 
65
65
  secrets:
@@ -72,16 +72,16 @@ jobs:
72
72
  - uses: gitleaks/gitleaks-action@v2
73
73
  env:
74
74
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
75
- <% if (components.includes('fastapi')) { %>
75
+ <% for (const inst of fastapiInstances) { %>
76
76
 
77
- <%= paths.fastapi %>:
78
- name: <%= displayNames.fastapi %> (format + lint + typecheck + test + audit)
77
+ <%= inst.path %>:
78
+ name: <%= inst.display %> (format + lint + typecheck + test + audit)
79
79
  needs: changes
80
- if: needs.changes.outputs.<%= paths.fastapi %> == 'true'
80
+ if: needs.changes.outputs.<%= inst.path %> == 'true'
81
81
  runs-on: ubuntu-latest
82
82
  defaults:
83
83
  run:
84
- working-directory: <%= paths.fastapi %>
84
+ working-directory: <%= inst.path %>
85
85
  steps:
86
86
  - uses: actions/checkout@v5
87
87
  - uses: astral-sh/setup-uv@v4
@@ -92,16 +92,16 @@ jobs:
92
92
  - run: uv run pytest
93
93
  - run: uv run pip-audit
94
94
  <% } %>
95
- <% if (components.includes('fastify')) { %>
95
+ <% for (const inst of fastifyInstances) { %>
96
96
 
97
- <%= paths.fastify %>:
98
- name: <%= displayNames.fastify %> (format + lint + typecheck + audit)
97
+ <%= inst.path %>:
98
+ name: <%= inst.display %> (format + lint + typecheck + audit)
99
99
  needs: changes
100
- if: needs.changes.outputs.<%= paths.fastify %> == 'true'
100
+ if: needs.changes.outputs.<%= inst.path %> == 'true'
101
101
  runs-on: ubuntu-latest
102
102
  defaults:
103
103
  run:
104
- working-directory: <%= paths.fastify %>
104
+ working-directory: <%= inst.path %>
105
105
  steps:
106
106
  - uses: actions/checkout@v5
107
107
  <% if (pm === 'pnpm') { %>
@@ -117,7 +117,7 @@ jobs:
117
117
  with:
118
118
  node-version: 20
119
119
  cache: <%= pm.name %>
120
- cache-dependency-path: <%= paths.fastify %>/<%= pm.lockfile %>
120
+ cache-dependency-path: <%= inst.path %>/<%= pm.lockfile %>
121
121
  <% } %>
122
122
  - run: <%= pm.ci %>
123
123
  - run: <%= pm.prismaExec %> generate
@@ -126,16 +126,16 @@ jobs:
126
126
  - run: <%= pm.exec %> tsc --noEmit
127
127
  - run: <%= pm.audit %>
128
128
  <% } %>
129
- <% if (components.includes('frontend')) { %>
129
+ <% for (const inst of frontendInstances) { %>
130
130
 
131
- <%= paths.frontend %>:
132
- name: <%= displayNames.frontend %> (format + lint + typecheck + audit)
131
+ <%= inst.path %>:
132
+ name: <%= inst.display %> (format + lint + typecheck + audit)
133
133
  needs: changes
134
- if: needs.changes.outputs.<%= paths.frontend %> == 'true'
134
+ if: needs.changes.outputs.<%= inst.path %> == 'true'
135
135
  runs-on: ubuntu-latest
136
136
  defaults:
137
137
  run:
138
- working-directory: <%= paths.frontend %>
138
+ working-directory: <%= inst.path %>
139
139
  steps:
140
140
  - uses: actions/checkout@v5
141
141
  <% if (pm === 'pnpm') { %>
@@ -151,7 +151,7 @@ jobs:
151
151
  with:
152
152
  node-version: 22
153
153
  cache: <%= pm.name %>
154
- cache-dependency-path: <%= paths.frontend %>/<%= pm.lockfile %>
154
+ cache-dependency-path: <%= inst.path %>/<%= pm.lockfile %>
155
155
  <% } %>
156
156
  - run: <%= pm.ci %>
157
157
  - run: <%= pm.exec %> prettier --check .
@@ -159,16 +159,16 @@ jobs:
159
159
  - run: <%= pm.exec %> tsc --noEmit
160
160
  - run: <%= pm.audit %>
161
161
  <% } %>
162
- <% if (components.includes('mobile')) { %>
162
+ <% for (const inst of mobileInstances) { %>
163
163
 
164
- <%= paths.mobile %>:
165
- name: <%= displayNames.mobile %> (format + analyze)
164
+ <%= inst.path %>:
165
+ name: <%= inst.display %> (format + analyze)
166
166
  needs: changes
167
- if: needs.changes.outputs.<%= paths.mobile %> == 'true'
167
+ if: needs.changes.outputs.<%= inst.path %> == 'true'
168
168
  runs-on: ubuntu-latest
169
169
  defaults:
170
170
  run:
171
- working-directory: <%= paths.mobile %>
171
+ working-directory: <%= inst.path %>
172
172
  steps:
173
173
  - uses: actions/checkout@v5
174
174
  - uses: subosito/flutter-action@v2
@@ -179,16 +179,16 @@ jobs:
179
179
  - run: dart format --set-exit-if-changed .
180
180
  - run: dart analyze --fatal-infos
181
181
  <% } %>
182
- <% if (components.includes('e2e')) { %>
182
+ <% for (const inst of e2eInstances) { %>
183
183
 
184
- <%= paths.e2e %>:
185
- name: <%= displayNames.e2e %> (format + lint + typecheck + audit)
184
+ <%= inst.path %>:
185
+ name: <%= inst.display %> (format + lint + typecheck + audit)
186
186
  needs: changes
187
- if: needs.changes.outputs.<%= paths.e2e %> == 'true'
187
+ if: needs.changes.outputs.<%= inst.path %> == 'true'
188
188
  runs-on: ubuntu-latest
189
189
  defaults:
190
190
  run:
191
- working-directory: <%= paths.e2e %>
191
+ working-directory: <%= inst.path %>
192
192
  steps:
193
193
  - uses: actions/checkout@v5
194
194
  <% if (pm === 'pnpm') { %>
@@ -204,7 +204,7 @@ jobs:
204
204
  with:
205
205
  node-version: 22
206
206
  cache: <%= pm.name %>
207
- cache-dependency-path: <%= paths.e2e %>/<%= pm.lockfile %>
207
+ cache-dependency-path: <%= inst.path %>/<%= pm.lockfile %>
208
208
  <% } %>
209
209
  - run: <%= pm.ci %>
210
210
  - run: <%= pm.exec %> prettier --check .
@@ -212,16 +212,16 @@ jobs:
212
212
  - run: <%= pm.exec %> tsc --noEmit
213
213
  - run: <%= pm.audit %>
214
214
  <% } %>
215
- <% if (components.includes('infra')) { %>
215
+ <% for (const inst of infraInstances) { %>
216
216
 
217
- <%= paths.infra %>:
218
- name: <%= displayNames.infra %> (fmt + validate)
217
+ <%= inst.path %>:
218
+ name: <%= inst.display %> (fmt + validate)
219
219
  needs: changes
220
- if: needs.changes.outputs.<%= paths.infra %> == 'true'
220
+ if: needs.changes.outputs.<%= inst.path %> == 'true'
221
221
  runs-on: ubuntu-latest
222
222
  defaults:
223
223
  run:
224
- working-directory: <%= paths.infra %>/stack
224
+ working-directory: <%= inst.path %>/stack
225
225
  steps:
226
226
  - uses: actions/checkout@v5
227
227
  - uses: hashicorp/setup-terraform@v3
@@ -27,95 +27,95 @@ if [ -n "$STAGED_ENV_FILES" ]; then
27
27
  fi
28
28
 
29
29
  STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACMR)
30
- <% if (components.includes('fastapi')) { %>
30
+ <% for (const inst of fastapiInstances) { %>
31
31
 
32
- <%= pathsUpper.fastapi %>_PY=$(echo "$STAGED_FILES" | grep '^<%= paths.fastapi %>/.*\.py$' || true)
33
- if [ -n "$<%= pathsUpper.fastapi %>_PY" ]; then
34
- echo "Running quality gates for <%= paths.fastapi %>..."
35
- cd <%= paths.fastapi %>
36
- echo "$<%= pathsUpper.fastapi %>_PY" | sed 's|^<%= paths.fastapi %>/||' | xargs uv run ruff format
37
- echo "$<%= pathsUpper.fastapi %>_PY" | sed 's|^<%= paths.fastapi %>/||' | xargs uv run ruff check --fix
32
+ <%= inst.upper %>_PY=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/.*\.py$' || true)
33
+ if [ -n "$<%= inst.upper %>_PY" ]; then
34
+ echo "Running quality gates for <%= inst.path %>..."
35
+ cd <%= inst.path %>
36
+ echo "$<%= inst.upper %>_PY" | sed 's|^<%= inst.path %>/||' | xargs uv run ruff format
37
+ echo "$<%= inst.upper %>_PY" | sed 's|^<%= inst.path %>/||' | xargs uv run ruff check --fix
38
38
  uv run mypy
39
39
  cd ..
40
- echo "$<%= pathsUpper.fastapi %>_PY" | xargs git add
40
+ echo "$<%= inst.upper %>_PY" | xargs git add
41
41
  fi
42
42
  <% } %>
43
- <% if (components.includes('fastify')) { %>
43
+ <% for (const inst of fastifyInstances) { %>
44
44
 
45
- <%= pathsUpper.fastify %>_TS=$(echo "$STAGED_FILES" | grep '^<%= paths.fastify %>/.*\.ts$' || true)
46
- <%= pathsUpper.fastify %>_ALL=$(echo "$STAGED_FILES" | grep '^<%= paths.fastify %>/' || true)
47
- if [ -n "$<%= pathsUpper.fastify %>_ALL" ]; then
48
- echo "Formatting <%= paths.fastify %>..."
49
- cd <%= paths.fastify %>
50
- echo "$<%= pathsUpper.fastify %>_ALL" | sed 's|^<%= paths.fastify %>/||' | xargs <%= pm.exec %> prettier --write --ignore-unknown
51
- if [ -n "$<%= pathsUpper.fastify %>_TS" ]; then
52
- echo "$<%= pathsUpper.fastify %>_TS" | sed 's|^<%= paths.fastify %>/||' | xargs <%= pm.exec %> eslint --fix
45
+ <%= inst.upper %>_TS=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/.*\.ts$' || true)
46
+ <%= inst.upper %>_ALL=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/' || true)
47
+ if [ -n "$<%= inst.upper %>_ALL" ]; then
48
+ echo "Formatting <%= inst.path %>..."
49
+ cd <%= inst.path %>
50
+ echo "$<%= inst.upper %>_ALL" | sed 's|^<%= inst.path %>/||' | xargs <%= pm.exec %> prettier --write --ignore-unknown
51
+ if [ -n "$<%= inst.upper %>_TS" ]; then
52
+ echo "$<%= inst.upper %>_TS" | sed 's|^<%= inst.path %>/||' | xargs <%= pm.exec %> eslint --fix
53
53
  <%= pm.exec %> tsc --noEmit
54
54
  fi
55
55
  cd ..
56
- echo "$<%= pathsUpper.fastify %>_ALL" | xargs git add
56
+ echo "$<%= inst.upper %>_ALL" | xargs git add
57
57
  fi
58
58
  <% } %>
59
- <% if (components.includes('frontend')) { %>
59
+ <% for (const inst of frontendInstances) { %>
60
60
 
61
- <%= pathsUpper.frontend %>_TS=$(echo "$STAGED_FILES" | grep '^<%= paths.frontend %>/.*\.tsx\?$' || true)
62
- <%= pathsUpper.frontend %>_ALL=$(echo "$STAGED_FILES" | grep '^<%= paths.frontend %>/' || true)
63
- if [ -n "$<%= pathsUpper.frontend %>_ALL" ]; then
64
- echo "Formatting <%= paths.frontend %>..."
65
- cd <%= paths.frontend %>
66
- echo "$<%= pathsUpper.frontend %>_ALL" | sed 's|^<%= paths.frontend %>/||' | xargs <%= pm.exec %> prettier --write --ignore-unknown
67
- if [ -n "$<%= pathsUpper.frontend %>_TS" ]; then
68
- echo "$<%= pathsUpper.frontend %>_TS" | sed 's|^<%= paths.frontend %>/||' | xargs <%= pm.exec %> eslint --fix
61
+ <%= inst.upper %>_TS=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/.*\.tsx\?$' || true)
62
+ <%= inst.upper %>_ALL=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/' || true)
63
+ if [ -n "$<%= inst.upper %>_ALL" ]; then
64
+ echo "Formatting <%= inst.path %>..."
65
+ cd <%= inst.path %>
66
+ echo "$<%= inst.upper %>_ALL" | sed 's|^<%= inst.path %>/||' | xargs <%= pm.exec %> prettier --write --ignore-unknown
67
+ if [ -n "$<%= inst.upper %>_TS" ]; then
68
+ echo "$<%= inst.upper %>_TS" | sed 's|^<%= inst.path %>/||' | xargs <%= pm.exec %> eslint --fix
69
69
  <%= pm.exec %> tsc --noEmit
70
70
  fi
71
71
  cd ..
72
- echo "$<%= pathsUpper.frontend %>_ALL" | xargs git add
72
+ echo "$<%= inst.upper %>_ALL" | xargs git add
73
73
  fi
74
74
  <% } %>
75
- <% if (components.includes('e2e')) { %>
75
+ <% for (const inst of e2eInstances) { %>
76
76
 
77
- <%= pathsUpper.e2e %>_TS=$(echo "$STAGED_FILES" | grep '^<%= paths.e2e %>/.*\.ts$' || true)
78
- <%= pathsUpper.e2e %>_ALL=$(echo "$STAGED_FILES" | grep '^<%= paths.e2e %>/' || true)
79
- if [ -n "$<%= pathsUpper.e2e %>_ALL" ]; then
80
- echo "Formatting <%= paths.e2e %>..."
81
- cd <%= paths.e2e %>
82
- echo "$<%= pathsUpper.e2e %>_ALL" | sed 's|^<%= paths.e2e %>/||' | xargs <%= pm.exec %> prettier --write --ignore-unknown
83
- if [ -n "$<%= pathsUpper.e2e %>_TS" ]; then
84
- echo "$<%= pathsUpper.e2e %>_TS" | sed 's|^<%= paths.e2e %>/||' | xargs <%= pm.exec %> eslint --fix
77
+ <%= inst.upper %>_TS=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/.*\.ts$' || true)
78
+ <%= inst.upper %>_ALL=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/' || true)
79
+ if [ -n "$<%= inst.upper %>_ALL" ]; then
80
+ echo "Formatting <%= inst.path %>..."
81
+ cd <%= inst.path %>
82
+ echo "$<%= inst.upper %>_ALL" | sed 's|^<%= inst.path %>/||' | xargs <%= pm.exec %> prettier --write --ignore-unknown
83
+ if [ -n "$<%= inst.upper %>_TS" ]; then
84
+ echo "$<%= inst.upper %>_TS" | sed 's|^<%= inst.path %>/||' | xargs <%= pm.exec %> eslint --fix
85
85
  <%= pm.exec %> tsc --noEmit
86
86
  fi
87
87
  cd ..
88
- echo "$<%= pathsUpper.e2e %>_ALL" | xargs git add
88
+ echo "$<%= inst.upper %>_ALL" | xargs git add
89
89
  fi
90
90
  <% } %>
91
- <% if (components.includes('mobile')) { %>
91
+ <% for (const inst of mobileInstances) { %>
92
92
 
93
- <%= pathsUpper.mobile %>_DART=$(echo "$STAGED_FILES" | grep '^<%= paths.mobile %>/.*\.dart$' || true)
94
- if [ -n "$<%= pathsUpper.mobile %>_DART" ]; then
93
+ <%= inst.upper %>_DART=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/.*\.dart$' || true)
94
+ if [ -n "$<%= inst.upper %>_DART" ]; then
95
95
  if command -v dart &> /dev/null; then
96
- echo "Formatting <%= paths.mobile %>..."
97
- cd <%= paths.mobile %>
98
- echo "$<%= pathsUpper.mobile %>_DART" | sed 's|^<%= paths.mobile %>/||' | xargs dart format
96
+ echo "Formatting <%= inst.path %>..."
97
+ cd <%= inst.path %>
98
+ echo "$<%= inst.upper %>_DART" | sed 's|^<%= inst.path %>/||' | xargs dart format
99
99
  if command -v flutter &> /dev/null; then
100
100
  dart analyze --fatal-infos
101
101
  fi
102
102
  cd ..
103
- echo "$<%= pathsUpper.mobile %>_DART" | xargs git add
103
+ echo "$<%= inst.upper %>_DART" | xargs git add
104
104
  else
105
105
  echo "Skipping mobile lint (dart not installed)"
106
106
  fi
107
107
  fi
108
108
  <% } %>
109
- <% if (components.includes('infra')) { %>
109
+ <% for (const inst of infraInstances) { %>
110
110
 
111
- <%= pathsUpper.infra %>_TF=$(echo "$STAGED_FILES" | grep '^<%= paths.infra %>/.*\.tf$' || true)
112
- if [ -n "$<%= pathsUpper.infra %>_TF" ]; then
111
+ <%= inst.upper %>_TF=$(echo "$STAGED_FILES" | grep '^<%= inst.path %>/.*\.tf$' || true)
112
+ if [ -n "$<%= inst.upper %>_TF" ]; then
113
113
  if command -v terraform &> /dev/null; then
114
- echo "Formatting <%= paths.infra %>..."
115
- cd <%= paths.infra %>/stack
116
- echo "$<%= pathsUpper.infra %>_TF" | sed 's|^<%= paths.infra %>/stack/||' | xargs terraform fmt
114
+ echo "Formatting <%= inst.path %>..."
115
+ cd <%= inst.path %>/stack
116
+ echo "$<%= inst.upper %>_TF" | sed 's|^<%= inst.path %>/stack/||' | xargs terraform fmt
117
117
  cd ../..
118
- echo "$<%= pathsUpper.infra %>_TF" | xargs git add
118
+ echo "$<%= inst.upper %>_TF" | xargs git add
119
119
  else
120
120
  echo "Skipping infra lint (terraform not installed)"
121
121
  fi
@@ -3,33 +3,33 @@ set -e
3
3
 
4
4
  git config core.hooksPath .githooks
5
5
  echo "Git hooks configured."
6
- <% if (components.includes('fastapi')) { %>
6
+ <% for (const inst of fastapiInstances) { %>
7
7
 
8
- cd <%= paths.fastapi %> && uv sync --all-extras && cd ..
9
- echo "<%= displayNames.fastapi %> dependencies installed."
8
+ cd <%= inst.path %> && uv sync --all-extras && cd ..
9
+ echo "<%= inst.display %> dependencies installed."
10
10
  <% } %>
11
- <% if (components.includes('fastify')) { %>
11
+ <% for (const inst of fastifyInstances) { %>
12
12
 
13
- cd <%= paths.fastify %> && <%= pm.ci %> && cd ..
14
- echo "<%= displayNames.fastify %> dependencies installed."
13
+ cd <%= inst.path %> && <%= pm.ci %> && cd ..
14
+ echo "<%= inst.display %> dependencies installed."
15
15
  <% } %>
16
- <% if (components.includes('frontend')) { %>
16
+ <% for (const inst of frontendInstances) { %>
17
17
 
18
- cd <%= paths.frontend %> && <%= pm.ci %> && cd ..
19
- echo "<%= displayNames.frontend %> dependencies installed."
18
+ cd <%= inst.path %> && <%= pm.ci %> && cd ..
19
+ echo "<%= inst.display %> dependencies installed."
20
20
  <% } %>
21
- <% if (components.includes('e2e')) { %>
21
+ <% for (const inst of e2eInstances) { %>
22
22
 
23
- cd <%= paths.e2e %> && <%= pm.ci %> && cd ..
24
- echo "<%= displayNames.e2e %> dependencies installed."
23
+ cd <%= inst.path %> && <%= pm.ci %> && cd ..
24
+ echo "<%= inst.display %> dependencies installed."
25
25
  <% } %>
26
- <% if (components.includes('mobile')) { %>
26
+ <% for (const inst of mobileInstances) { %>
27
27
 
28
28
  if command -v flutter &>/dev/null; then
29
- cd <%= paths.mobile %> && flutter pub get && cd ..
30
- echo "<%= displayNames.mobile %> dependencies installed."
29
+ cd <%= inst.path %> && flutter pub get && cd ..
30
+ echo "<%= inst.display %> dependencies installed."
31
31
  else
32
- echo "<%= displayNames.mobile %> skipped (SDK not installed)."
32
+ echo "<%= inst.display %> skipped (SDK not installed)."
33
33
  fi
34
34
  <% } %>
35
35