@factiii/stack 0.1.32 → 0.1.34

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 (129) hide show
  1. package/dist/cli/deploy-secrets.js +1 -1
  2. package/dist/cli/deploy.js +1 -1
  3. package/dist/cli/dev-sync.js +1 -1
  4. package/dist/cli/execute-plugin-command.js +1 -1
  5. package/dist/cli/fix.d.ts.map +1 -1
  6. package/dist/cli/fix.js +8 -2
  7. package/dist/cli/fix.js.map +1 -1
  8. package/dist/cli/scan.js +1 -1
  9. package/dist/cli/undeploy.js +1 -1
  10. package/dist/constants/config-files.d.ts +3 -3
  11. package/dist/constants/config-files.d.ts.map +1 -1
  12. package/dist/constants/config-files.js +3 -3
  13. package/dist/constants/config-files.js.map +1 -1
  14. package/dist/plugins/addons/server-mode/index.d.ts +1 -1
  15. package/dist/plugins/addons/server-mode/index.js +2 -2
  16. package/dist/plugins/addons/server-mode/index.js.map +1 -1
  17. package/dist/plugins/frameworks/expo/index.d.ts +45 -0
  18. package/dist/plugins/frameworks/expo/index.d.ts.map +1 -0
  19. package/dist/plugins/frameworks/expo/index.js +549 -0
  20. package/dist/plugins/frameworks/expo/index.js.map +1 -0
  21. package/dist/plugins/frameworks/prisma-trpc/index.js +9 -9
  22. package/dist/plugins/frameworks/prisma-trpc/index.js.map +1 -1
  23. package/dist/plugins/index.d.ts.map +1 -1
  24. package/dist/plugins/index.js +8 -0
  25. package/dist/plugins/index.js.map +1 -1
  26. package/dist/plugins/interfaces/pipeline.d.ts +1 -1
  27. package/dist/plugins/interfaces/pipeline.js +1 -1
  28. package/dist/plugins/pipelines/aws/configs/index.d.ts +1 -1
  29. package/dist/plugins/pipelines/aws/configs/index.js +1 -1
  30. package/dist/plugins/pipelines/aws/configs/types.d.ts +1 -1
  31. package/dist/plugins/pipelines/aws/index.js +2 -2
  32. package/dist/plugins/pipelines/aws/index.js.map +1 -1
  33. package/dist/plugins/pipelines/aws/prod.js +3 -3
  34. package/dist/plugins/pipelines/aws/prod.js.map +1 -1
  35. package/dist/plugins/pipelines/aws/scanfix/aws-cli.js +1 -1
  36. package/dist/plugins/pipelines/aws/scanfix/aws-cli.js.map +1 -1
  37. package/dist/plugins/pipelines/aws/scanfix/config.js +6 -6
  38. package/dist/plugins/pipelines/aws/scanfix/config.js.map +1 -1
  39. package/dist/plugins/pipelines/aws/scanfix/credentials.js +5 -5
  40. package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -1
  41. package/dist/plugins/pipelines/aws/scanfix/db-replication.js +2 -2
  42. package/dist/plugins/pipelines/aws/scanfix/db-replication.js.map +1 -1
  43. package/dist/plugins/pipelines/aws/scanfix/ec2.js +4 -4
  44. package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -1
  45. package/dist/plugins/pipelines/aws/scanfix/ecr.js +2 -2
  46. package/dist/plugins/pipelines/aws/scanfix/ecr.js.map +1 -1
  47. package/dist/plugins/pipelines/aws/scanfix/iam.js +2 -2
  48. package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -1
  49. package/dist/plugins/pipelines/aws/scanfix/rds.js +4 -4
  50. package/dist/plugins/pipelines/aws/scanfix/rds.js.map +1 -1
  51. package/dist/plugins/pipelines/aws/scanfix/s3.js +3 -3
  52. package/dist/plugins/pipelines/aws/scanfix/s3.js.map +1 -1
  53. package/dist/plugins/pipelines/aws/scanfix/security-groups.js +3 -3
  54. package/dist/plugins/pipelines/aws/scanfix/security-groups.js.map +1 -1
  55. package/dist/plugins/pipelines/aws/scanfix/ses.js +4 -4
  56. package/dist/plugins/pipelines/aws/scanfix/ses.js.map +1 -1
  57. package/dist/plugins/pipelines/aws/scanfix/vpc.js +4 -4
  58. package/dist/plugins/pipelines/aws/scanfix/vpc.js.map +1 -1
  59. package/dist/plugins/pipelines/factiii/index.d.ts +1 -1
  60. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
  61. package/dist/plugins/pipelines/factiii/index.js +7 -5
  62. package/dist/plugins/pipelines/factiii/index.js.map +1 -1
  63. package/dist/plugins/pipelines/factiii/pr-check.d.ts +1 -1
  64. package/dist/plugins/pipelines/factiii/pr-check.js +2 -2
  65. package/dist/plugins/pipelines/factiii/pr-check.js.map +1 -1
  66. package/dist/plugins/pipelines/factiii/scanfix/ansible.d.ts +12 -0
  67. package/dist/plugins/pipelines/factiii/scanfix/ansible.d.ts.map +1 -0
  68. package/dist/plugins/pipelines/factiii/scanfix/ansible.js +109 -0
  69. package/dist/plugins/pipelines/factiii/scanfix/ansible.js.map +1 -0
  70. package/dist/plugins/pipelines/factiii/scanfix/bootstrap.js +6 -6
  71. package/dist/plugins/pipelines/factiii/scanfix/bootstrap.js.map +1 -1
  72. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts.map +1 -1
  73. package/dist/plugins/pipelines/factiii/scanfix/config.js +4 -2
  74. package/dist/plugins/pipelines/factiii/scanfix/config.js.map +1 -1
  75. package/dist/plugins/pipelines/factiii/scanfix/env-files.js +7 -7
  76. package/dist/plugins/pipelines/factiii/scanfix/env-files.js.map +1 -1
  77. package/dist/plugins/pipelines/factiii/scanfix/github-cli.js +1 -1
  78. package/dist/plugins/pipelines/factiii/scanfix/github-cli.js.map +1 -1
  79. package/dist/plugins/pipelines/factiii/scanfix/secrets.js +9 -9
  80. package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
  81. package/dist/plugins/pipelines/factiii/scanfix/workflows.d.ts.map +1 -1
  82. package/dist/plugins/pipelines/factiii/scanfix/workflows.js +52 -4
  83. package/dist/plugins/pipelines/factiii/scanfix/workflows.js.map +1 -1
  84. package/dist/plugins/servers/amazon-linux/index.js +1 -1
  85. package/dist/plugins/servers/amazon-linux/index.js.map +1 -1
  86. package/dist/plugins/servers/mac/index.js +1 -1
  87. package/dist/plugins/servers/mac/index.js.map +1 -1
  88. package/dist/plugins/servers/mac/scanfix/config.js +6 -6
  89. package/dist/plugins/servers/mac/scanfix/config.js.map +1 -1
  90. package/dist/plugins/servers/mac/scanfix/containers.js +2 -2
  91. package/dist/plugins/servers/mac/scanfix/containers.js.map +1 -1
  92. package/dist/plugins/servers/mac/scanfix/system.d.ts.map +1 -1
  93. package/dist/plugins/servers/mac/scanfix/system.js +30 -5
  94. package/dist/plugins/servers/mac/scanfix/system.js.map +1 -1
  95. package/dist/plugins/servers/mac/staging.js +3 -3
  96. package/dist/plugins/servers/mac/staging.js.map +1 -1
  97. package/dist/plugins/servers/ubuntu/index.js +1 -1
  98. package/dist/plugins/servers/ubuntu/index.js.map +1 -1
  99. package/dist/plugins/servers/windows/index.d.ts +2 -2
  100. package/dist/plugins/servers/windows/index.d.ts.map +1 -1
  101. package/dist/plugins/servers/windows/index.js +45 -6
  102. package/dist/plugins/servers/windows/index.js.map +1 -1
  103. package/dist/scanfix/fixes/certbot.js +2 -2
  104. package/dist/scanfix/fixes/certbot.js.map +1 -1
  105. package/dist/scanfix/fixes/docker.js +1 -1
  106. package/dist/scanfix/fixes/docker.js.map +1 -1
  107. package/dist/scripts/get-repo-name.d.ts +1 -1
  108. package/dist/scripts/get-repo-name.js +1 -1
  109. package/dist/types/config.d.ts +2 -2
  110. package/dist/types/config.js +1 -1
  111. package/dist/utils/ansible-vault-secrets.js +1 -1
  112. package/dist/utils/ansible-vault-secrets.js.map +1 -1
  113. package/dist/utils/config-helpers.d.ts +5 -5
  114. package/dist/utils/config-helpers.js +5 -5
  115. package/dist/utils/config-schema.d.ts +2 -2
  116. package/dist/utils/config-schema.js +2 -2
  117. package/dist/utils/config-validator.js +1 -1
  118. package/dist/utils/config-validator.js.map +1 -1
  119. package/dist/utils/config-writer.d.ts +1 -1
  120. package/dist/utils/config-writer.js +1 -1
  121. package/dist/utils/env-validator.d.ts +1 -1
  122. package/dist/utils/env-validator.js +1 -1
  123. package/dist/utils/secret-prompts.js +4 -4
  124. package/dist/utils/ssh-helper.d.ts +3 -3
  125. package/dist/utils/ssh-helper.js +4 -4
  126. package/dist/utils/ssh-helper.js.map +1 -1
  127. package/dist/utils/template-generator.d.ts +2 -2
  128. package/dist/utils/template-generator.js +3 -3
  129. package/package.json +1 -1
@@ -0,0 +1,549 @@
1
+ "use strict";
2
+ /**
3
+ * Expo (React Native) Framework Plugin
4
+ *
5
+ * Validates all dependencies needed for EAS Build to work.
6
+ * Each dependency has its own scanfix so `eas build` succeeds
7
+ * once all checks pass.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const config_helpers_js_1 = require("../../../utils/config-helpers.js");
47
+ /**
48
+ * Read and parse app.json from rootDir
49
+ */
50
+ function readAppJson(rootDir) {
51
+ const appJsonPath = path.join(rootDir, 'app.json');
52
+ if (!fs.existsSync(appJsonPath))
53
+ return null;
54
+ try {
55
+ return JSON.parse(fs.readFileSync(appJsonPath, 'utf8'));
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Check if any app config file exists (app.json, app.config.js, app.config.ts)
63
+ */
64
+ function hasAppConfig(rootDir) {
65
+ return (fs.existsSync(path.join(rootDir, 'app.json')) ||
66
+ fs.existsSync(path.join(rootDir, 'app.config.js')) ||
67
+ fs.existsSync(path.join(rootDir, 'app.config.ts')));
68
+ }
69
+ /**
70
+ * Get dev OS from stack.local.yml or fall back to process.platform
71
+ */
72
+ function getDevOS(rootDir) {
73
+ const localConfig = (0, config_helpers_js_1.loadLocalConfig)(rootDir);
74
+ if (localConfig.dev_os)
75
+ return localConfig.dev_os;
76
+ if (process.platform === 'darwin')
77
+ return 'mac';
78
+ if (process.platform === 'win32')
79
+ return 'windows';
80
+ return 'ubuntu';
81
+ }
82
+ class ExpoPlugin {
83
+ // ============================================================
84
+ // STATIC METADATA
85
+ // ============================================================
86
+ static id = 'expo';
87
+ static name = 'Expo (React Native)';
88
+ static category = 'framework';
89
+ static version = '1.0.0';
90
+ static requiredEnvVars = [];
91
+ static configSchema = {
92
+ expo: {
93
+ profile: null, // Optional: EAS build profile override
94
+ },
95
+ };
96
+ static autoConfigSchema = {
97
+ has_expo: 'boolean',
98
+ expo_version: 'string',
99
+ has_app_json: 'boolean',
100
+ has_eas_json: 'boolean',
101
+ };
102
+ /**
103
+ * Determine if this plugin should be loaded for this project
104
+ * Loads if 'expo' is in package.json dependencies
105
+ */
106
+ static async shouldLoad(rootDir, _config) {
107
+ const pkgPath = path.join(rootDir, 'package.json');
108
+ if (!fs.existsSync(pkgPath))
109
+ return false;
110
+ try {
111
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
112
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
113
+ return !!deps.expo;
114
+ }
115
+ catch {
116
+ return false;
117
+ }
118
+ }
119
+ // ============================================================
120
+ // FIXES - All EAS Build dependencies
121
+ // ============================================================
122
+ static fixes = [
123
+ // ============================================================
124
+ // CLI & Runtime
125
+ // ============================================================
126
+ {
127
+ id: 'expo-not-installed',
128
+ stage: 'dev',
129
+ severity: 'critical',
130
+ description: '📦 Expo SDK not found in package.json dependencies',
131
+ scan: async (_config, rootDir) => {
132
+ const pkgPath = path.join(rootDir, 'package.json');
133
+ if (!fs.existsSync(pkgPath))
134
+ return true;
135
+ try {
136
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
137
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
138
+ return !deps.expo;
139
+ }
140
+ catch {
141
+ return true;
142
+ }
143
+ },
144
+ fix: async (_config, rootDir) => {
145
+ try {
146
+ (0, child_process_1.execSync)('pnpm add expo', { cwd: rootDir, stdio: 'inherit' });
147
+ console.log(' Installed Expo SDK');
148
+ return true;
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ },
154
+ manualFix: 'Run: pnpm add expo',
155
+ },
156
+ {
157
+ id: 'eas-cli-not-installed',
158
+ stage: 'dev',
159
+ severity: 'critical',
160
+ description: '🔧 EAS CLI not installed (required for eas build)',
161
+ scan: async (_config, _rootDir) => {
162
+ try {
163
+ (0, child_process_1.execSync)('npx eas --version', { stdio: 'pipe' });
164
+ return false;
165
+ }
166
+ catch {
167
+ return true;
168
+ }
169
+ },
170
+ fix: async (_config, _rootDir) => {
171
+ try {
172
+ (0, child_process_1.execSync)('pnpm add -g eas-cli', { stdio: 'inherit' });
173
+ console.log(' Installed eas-cli globally');
174
+ return true;
175
+ }
176
+ catch {
177
+ return false;
178
+ }
179
+ },
180
+ manualFix: 'Run: pnpm add -g eas-cli',
181
+ },
182
+ // ============================================================
183
+ // Config Files
184
+ // ============================================================
185
+ {
186
+ id: 'expo-app-config-missing',
187
+ stage: 'dev',
188
+ severity: 'critical',
189
+ description: '📋 Expo app config not found (app.json, app.config.js, or app.config.ts)',
190
+ scan: async (_config, rootDir) => {
191
+ return !hasAppConfig(rootDir);
192
+ },
193
+ fix: null,
194
+ manualFix: 'Create app.json in your project root:\n' +
195
+ ' {\n' +
196
+ ' "expo": {\n' +
197
+ ' "name": "My App",\n' +
198
+ ' "slug": "my-app",\n' +
199
+ ' "version": "1.0.0",\n' +
200
+ ' "ios": { "bundleIdentifier": "com.example.myapp" },\n' +
201
+ ' "android": { "package": "com.example.myapp" }\n' +
202
+ ' }\n' +
203
+ ' }',
204
+ },
205
+ {
206
+ id: 'expo-eas-json-missing',
207
+ stage: 'dev',
208
+ severity: 'critical',
209
+ description: '📋 eas.json not found (required for EAS Build configuration)',
210
+ scan: async (_config, rootDir) => {
211
+ return !fs.existsSync(path.join(rootDir, 'eas.json'));
212
+ },
213
+ fix: async (_config, rootDir) => {
214
+ try {
215
+ (0, child_process_1.execSync)('npx eas build:configure', { cwd: rootDir, stdio: 'inherit' });
216
+ console.log(' Created eas.json via eas build:configure');
217
+ return true;
218
+ }
219
+ catch {
220
+ return false;
221
+ }
222
+ },
223
+ manualFix: 'Run: npx eas build:configure',
224
+ },
225
+ {
226
+ id: 'expo-app-name-missing',
227
+ stage: 'dev',
228
+ severity: 'warning',
229
+ description: '📝 Expo app name or slug missing in app.json',
230
+ scan: async (_config, rootDir) => {
231
+ const appJson = readAppJson(rootDir);
232
+ if (!appJson)
233
+ return false; // Caught by expo-app-config-missing
234
+ return !appJson.expo?.name || !appJson.expo?.slug;
235
+ },
236
+ fix: null,
237
+ manualFix: 'Add name and slug to app.json:\n' +
238
+ ' "expo": {\n' +
239
+ ' "name": "Your App Name",\n' +
240
+ ' "slug": "your-app-slug"\n' +
241
+ ' }',
242
+ },
243
+ {
244
+ id: 'expo-bundle-id-missing',
245
+ stage: 'dev',
246
+ severity: 'warning',
247
+ description: '🍎 iOS bundleIdentifier not set in app.json (required for iOS builds)',
248
+ scan: async (_config, rootDir) => {
249
+ const appJson = readAppJson(rootDir);
250
+ if (!appJson)
251
+ return false; // Caught by expo-app-config-missing
252
+ return !appJson.expo?.ios?.bundleIdentifier;
253
+ },
254
+ fix: null,
255
+ manualFix: 'Add ios.bundleIdentifier to app.json:\n' +
256
+ ' "expo": {\n' +
257
+ ' "ios": { "bundleIdentifier": "com.yourcompany.yourapp" }\n' +
258
+ ' }',
259
+ },
260
+ {
261
+ id: 'expo-package-name-missing',
262
+ stage: 'dev',
263
+ severity: 'warning',
264
+ description: '🤖 Android package name not set in app.json (required for Android builds)',
265
+ scan: async (_config, rootDir) => {
266
+ const appJson = readAppJson(rootDir);
267
+ if (!appJson)
268
+ return false; // Caught by expo-app-config-missing
269
+ return !appJson.expo?.android?.package;
270
+ },
271
+ fix: null,
272
+ manualFix: 'Add android.package to app.json:\n' +
273
+ ' "expo": {\n' +
274
+ ' "android": { "package": "com.yourcompany.yourapp" }\n' +
275
+ ' }',
276
+ },
277
+ // ============================================================
278
+ // Auth
279
+ // ============================================================
280
+ {
281
+ id: 'expo-not-logged-in',
282
+ stage: 'dev',
283
+ severity: 'critical',
284
+ description: '🔑 Not logged into Expo account (required for EAS Build)',
285
+ scan: async (_config, _rootDir) => {
286
+ try {
287
+ (0, child_process_1.execSync)('npx eas whoami', { stdio: 'pipe' });
288
+ return false;
289
+ }
290
+ catch {
291
+ return true;
292
+ }
293
+ },
294
+ fix: async (_config, _rootDir) => {
295
+ try {
296
+ (0, child_process_1.execSync)('npx eas login', { stdio: 'inherit' });
297
+ // Verify login succeeded
298
+ (0, child_process_1.execSync)('npx eas whoami', { stdio: 'pipe' });
299
+ console.log(' Logged into Expo account');
300
+ return true;
301
+ }
302
+ catch {
303
+ return false;
304
+ }
305
+ },
306
+ manualFix: 'Log into your Expo account:\n' +
307
+ ' npx eas login\n' +
308
+ ' For CI, set EXPO_TOKEN environment variable',
309
+ },
310
+ // ============================================================
311
+ // Platform Tools (OS-aware)
312
+ // ============================================================
313
+ {
314
+ id: 'expo-xcode-missing',
315
+ stage: 'dev',
316
+ severity: 'warning',
317
+ description: '🍎 Xcode not installed (required for local iOS builds)',
318
+ scan: async (_config, rootDir) => {
319
+ const devOS = getDevOS(rootDir);
320
+ if (devOS !== 'mac')
321
+ return false; // Only check on macOS
322
+ try {
323
+ (0, child_process_1.execSync)('xcodebuild -version', { stdio: 'pipe' });
324
+ return false;
325
+ }
326
+ catch {
327
+ return true;
328
+ }
329
+ },
330
+ fix: null,
331
+ manualFix: 'Install Xcode from the Mac App Store:\n' +
332
+ ' 1. Open App Store and search for "Xcode"\n' +
333
+ ' 2. Install Xcode\n' +
334
+ ' 3. Run: sudo xcode-select --switch /Applications/Xcode.app\n' +
335
+ ' 4. Run: sudo xcodebuild -license accept',
336
+ },
337
+ {
338
+ id: 'expo-cocoapods-missing',
339
+ stage: 'dev',
340
+ severity: 'warning',
341
+ description: '🍎 CocoaPods not installed (required for iOS builds)',
342
+ scan: async (_config, rootDir) => {
343
+ const devOS = getDevOS(rootDir);
344
+ if (devOS !== 'mac')
345
+ return false; // Only check on macOS
346
+ try {
347
+ (0, child_process_1.execSync)('pod --version', { stdio: 'pipe' });
348
+ return false;
349
+ }
350
+ catch {
351
+ return true;
352
+ }
353
+ },
354
+ fix: async (_config, _rootDir) => {
355
+ try {
356
+ (0, child_process_1.execSync)('brew install cocoapods', { stdio: 'inherit' });
357
+ console.log(' Installed CocoaPods via Homebrew');
358
+ return true;
359
+ }
360
+ catch {
361
+ // Fallback to gem install
362
+ try {
363
+ (0, child_process_1.execSync)('sudo gem install cocoapods', { stdio: 'inherit' });
364
+ console.log(' Installed CocoaPods via gem');
365
+ return true;
366
+ }
367
+ catch {
368
+ return false;
369
+ }
370
+ }
371
+ },
372
+ manualFix: 'Run: brew install cocoapods (or: sudo gem install cocoapods)',
373
+ },
374
+ {
375
+ id: 'expo-jdk-missing',
376
+ stage: 'dev',
377
+ severity: 'warning',
378
+ description: '☕ JDK 17+ not installed (required for Android builds)',
379
+ scan: async (_config, _rootDir) => {
380
+ try {
381
+ const output = (0, child_process_1.execSync)('java -version 2>&1', {
382
+ encoding: 'utf8',
383
+ stdio: ['pipe', 'pipe', 'pipe'],
384
+ });
385
+ // Parse version: "openjdk version "17.0.x"" or "java version "17.0.x""
386
+ const versionMatch = output.match(/version "(\d+)/);
387
+ if (versionMatch) {
388
+ const major = parseInt(versionMatch[1], 10);
389
+ return major < 17;
390
+ }
391
+ return true; // Can't parse version
392
+ }
393
+ catch {
394
+ return true;
395
+ }
396
+ },
397
+ fix: async (_config, rootDir) => {
398
+ const devOS = getDevOS(rootDir);
399
+ try {
400
+ if (devOS === 'mac') {
401
+ (0, child_process_1.execSync)('brew install openjdk@17', { stdio: 'inherit' });
402
+ console.log(' Installed JDK 17 via Homebrew');
403
+ }
404
+ else if (devOS === 'windows') {
405
+ (0, child_process_1.execSync)('winget install --id=EclipseAdoptium.Temurin.17.JDK --accept-source-agreements --accept-package-agreements', { stdio: 'inherit' });
406
+ console.log(' Installed JDK 17 via winget');
407
+ }
408
+ else {
409
+ (0, child_process_1.execSync)('sudo apt-get install -y openjdk-17-jdk', { stdio: 'inherit' });
410
+ console.log(' Installed JDK 17 via apt-get');
411
+ }
412
+ return true;
413
+ }
414
+ catch {
415
+ return false;
416
+ }
417
+ },
418
+ manualFix: 'Install JDK 17+:\n' +
419
+ ' macOS: brew install openjdk@17\n' +
420
+ ' Windows: winget install EclipseAdoptium.Temurin.17.JDK\n' +
421
+ ' Linux: sudo apt-get install openjdk-17-jdk',
422
+ },
423
+ {
424
+ id: 'expo-android-sdk-missing',
425
+ stage: 'dev',
426
+ severity: 'info',
427
+ description: '🤖 ANDROID_HOME not set (Android SDK required for local Android builds)',
428
+ scan: async (_config, _rootDir) => {
429
+ const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
430
+ if (!androidHome)
431
+ return true;
432
+ return !fs.existsSync(androidHome);
433
+ },
434
+ fix: null,
435
+ manualFix: 'Install Android Studio and set ANDROID_HOME:\n' +
436
+ ' 1. Download Android Studio from https://developer.android.com/studio\n' +
437
+ ' 2. Install and open Android Studio\n' +
438
+ ' 3. Install Android SDK via SDK Manager\n' +
439
+ ' 4. Set ANDROID_HOME environment variable:\n' +
440
+ ' macOS: export ANDROID_HOME=$HOME/Library/Android/sdk\n' +
441
+ ' Windows: setx ANDROID_HOME "%LOCALAPPDATA%\\Android\\Sdk"\n' +
442
+ ' Linux: export ANDROID_HOME=$HOME/Android/Sdk',
443
+ },
444
+ // ============================================================
445
+ // Project Integrity
446
+ // ============================================================
447
+ {
448
+ id: 'expo-project-id-missing',
449
+ stage: 'dev',
450
+ severity: 'warning',
451
+ description: '🆔 EAS project ID not configured (required for EAS Build)',
452
+ scan: async (_config, rootDir) => {
453
+ const appJson = readAppJson(rootDir);
454
+ if (!appJson)
455
+ return false; // Caught by expo-app-config-missing
456
+ // Check app.json for projectId
457
+ if (appJson.expo?.extra?.eas?.projectId)
458
+ return false;
459
+ // Also check app.config.js/ts (can't parse, but check if eas.json has projectId)
460
+ const easJsonPath = path.join(rootDir, 'eas.json');
461
+ if (fs.existsSync(easJsonPath)) {
462
+ try {
463
+ const easJson = JSON.parse(fs.readFileSync(easJsonPath, 'utf8'));
464
+ // eas.json doesn't store projectId, but if eas init was run, app.json would have it
465
+ }
466
+ catch {
467
+ // ignore
468
+ }
469
+ }
470
+ return true;
471
+ },
472
+ fix: async (_config, rootDir) => {
473
+ try {
474
+ (0, child_process_1.execSync)('npx eas init', { cwd: rootDir, stdio: 'inherit' });
475
+ console.log(' Configured EAS project ID');
476
+ return true;
477
+ }
478
+ catch {
479
+ return false;
480
+ }
481
+ },
482
+ manualFix: 'Run: npx eas init (links your project to an EAS project)',
483
+ },
484
+ ];
485
+ // ============================================================
486
+ // STATIC HELPER METHODS
487
+ // ============================================================
488
+ /**
489
+ * Auto-detect Expo configuration
490
+ */
491
+ static async detectConfig(rootDir) {
492
+ const pkgPath = path.join(rootDir, 'package.json');
493
+ if (!fs.existsSync(pkgPath))
494
+ return null;
495
+ let expoVersion = null;
496
+ try {
497
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
498
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
499
+ if (!deps.expo)
500
+ return null;
501
+ expoVersion = deps.expo ? deps.expo.replace(/^[\^~]/, '') : null;
502
+ }
503
+ catch {
504
+ return null;
505
+ }
506
+ return {
507
+ has_expo: true,
508
+ expo_version: expoVersion,
509
+ has_app_json: fs.existsSync(path.join(rootDir, 'app.json')),
510
+ has_eas_json: fs.existsSync(path.join(rootDir, 'eas.json')),
511
+ };
512
+ }
513
+ // ============================================================
514
+ // INSTANCE METHODS
515
+ // ============================================================
516
+ _config;
517
+ constructor(config) {
518
+ this._config = config;
519
+ }
520
+ /**
521
+ * Deploy - trigger EAS Build
522
+ */
523
+ async deploy(_config, environment) {
524
+ const rootDir = process.cwd();
525
+ const profile = environment === 'prod' ? 'production' : environment;
526
+ console.log(' Building with EAS for ' + environment + ' (profile: ' + profile + ')...');
527
+ try {
528
+ (0, child_process_1.execSync)('npx eas build --profile ' + profile + ' --non-interactive', {
529
+ cwd: rootDir,
530
+ stdio: 'inherit',
531
+ });
532
+ return { success: true, message: 'EAS Build submitted for ' + environment };
533
+ }
534
+ catch (error) {
535
+ return {
536
+ success: false,
537
+ error: error instanceof Error ? error.message : String(error),
538
+ };
539
+ }
540
+ }
541
+ /**
542
+ * Undeploy - nothing to do for Expo
543
+ */
544
+ async undeploy(_config, _environment) {
545
+ return { success: true, message: 'Nothing to undeploy for Expo' };
546
+ }
547
+ }
548
+ exports.default = ExpoPlugin;
549
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/frameworks/expo/index.ts"],"names":[],"mappings":"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"}
@@ -56,7 +56,7 @@ class PrismaTrpcPlugin {
56
56
  static version = '1.0.0';
57
57
  // Env vars this plugin requires (will be validated against .env.example)
58
58
  static requiredEnvVars = ['DATABASE_URL'];
59
- // Schema for factiii.yml (user-editable)
59
+ // Schema for stack.yml (user-editable)
60
60
  static configSchema = {
61
61
  prisma: {
62
62
  schema_path: null, // Optional override
@@ -99,7 +99,7 @@ class PrismaTrpcPlugin {
99
99
  id: 'missing-prisma',
100
100
  stage: 'dev',
101
101
  severity: 'info',
102
- description: 'Prisma not detected in project',
102
+ description: '📦 Prisma not detected in project',
103
103
  scan: async (_config, rootDir) => {
104
104
  // Check if prisma is in package.json
105
105
  const pkgPath = path.join(rootDir, 'package.json');
@@ -121,7 +121,7 @@ class PrismaTrpcPlugin {
121
121
  id: 'missing-prisma-schema',
122
122
  stage: 'dev',
123
123
  severity: 'critical',
124
- description: 'Prisma schema not found',
124
+ description: '📋 Prisma schema not found',
125
125
  scan: async (_config, rootDir) => {
126
126
  // Only check if Prisma is installed
127
127
  const hasPrisma = await PrismaTrpcPlugin.hasPrisma(rootDir);
@@ -136,7 +136,7 @@ class PrismaTrpcPlugin {
136
136
  id: 'missing-env-file',
137
137
  stage: 'dev',
138
138
  severity: 'warning',
139
- description: '.env file missing (copy of .env.example)',
139
+ description: '📄 .env file missing (copy of .env.example)',
140
140
  scan: async (_config, rootDir) => {
141
141
  if (!fs.existsSync(path.join(rootDir, '.env.example')))
142
142
  return false;
@@ -153,7 +153,7 @@ class PrismaTrpcPlugin {
153
153
  id: 'prisma-client-not-generated',
154
154
  stage: 'dev',
155
155
  severity: 'warning',
156
- description: 'Prisma client not generated',
156
+ description: '⚙️ Prisma client not generated',
157
157
  scan: async (_config, rootDir) => {
158
158
  const hasPrisma = await PrismaTrpcPlugin.hasPrisma(rootDir);
159
159
  if (!hasPrisma)
@@ -180,7 +180,7 @@ class PrismaTrpcPlugin {
180
180
  id: 'pending-migrations-dev',
181
181
  stage: 'dev',
182
182
  severity: 'warning',
183
- description: 'Prisma migrations pending locally',
183
+ description: '🗃️ Prisma migrations pending locally',
184
184
  scan: async (_config, rootDir) => {
185
185
  const hasPrisma = await PrismaTrpcPlugin.hasPrisma(rootDir);
186
186
  if (!hasPrisma)
@@ -213,7 +213,7 @@ class PrismaTrpcPlugin {
213
213
  id: 'missing-env-staging',
214
214
  stage: 'staging',
215
215
  severity: 'critical',
216
- description: '.env.staging file missing',
216
+ description: '📄 .env.staging file missing',
217
217
  scan: async (_config, rootDir) => {
218
218
  return !fs.existsSync(path.join(rootDir, '.env.staging'));
219
219
  },
@@ -233,7 +233,7 @@ class PrismaTrpcPlugin {
233
233
  id: 'missing-env-prod',
234
234
  stage: 'prod',
235
235
  severity: 'critical',
236
- description: '.env.prod file missing',
236
+ description: '📄 .env.prod file missing',
237
237
  scan: async (_config, rootDir) => {
238
238
  return !fs.existsSync(path.join(rootDir, '.env.prod'));
239
239
  },
@@ -252,7 +252,7 @@ class PrismaTrpcPlugin {
252
252
  id: 'env-example-staging-format',
253
253
  stage: 'dev',
254
254
  severity: 'warning',
255
- description: '.env.example and .env.staging should use postgres:5432 format (container format) and match each other',
255
+ description: '🔗 .env.example and .env.staging should use postgres:5432 format (container format) and match each other',
256
256
  scan: async (config, rootDir) => {
257
257
  const hasPrisma = await PrismaTrpcPlugin.hasPrisma(rootDir);
258
258
  if (!hasPrisma)