@factiii/stack 0.1.56 → 0.1.57

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 (61) hide show
  1. package/dist/cli/fix.d.ts.map +1 -1
  2. package/dist/cli/fix.js +8 -3
  3. package/dist/cli/fix.js.map +1 -1
  4. package/dist/cli/scan.d.ts.map +1 -1
  5. package/dist/cli/scan.js +13 -2
  6. package/dist/cli/scan.js.map +1 -1
  7. package/dist/generators/generate-stack-auto.d.ts.map +1 -1
  8. package/dist/generators/generate-stack-auto.js +0 -15
  9. package/dist/generators/generate-stack-auto.js.map +1 -1
  10. package/dist/generators/generate-stack-yml.d.ts.map +1 -1
  11. package/dist/generators/generate-stack-yml.js +17 -0
  12. package/dist/generators/generate-stack-yml.js.map +1 -1
  13. package/dist/plugins/addons/vercel/index.d.ts +99 -0
  14. package/dist/plugins/addons/vercel/index.d.ts.map +1 -0
  15. package/dist/plugins/addons/vercel/index.js +234 -0
  16. package/dist/plugins/addons/vercel/index.js.map +1 -0
  17. package/dist/plugins/addons/vercel/scanfix/config.d.ts +8 -0
  18. package/dist/plugins/addons/vercel/scanfix/config.d.ts.map +1 -0
  19. package/dist/plugins/addons/vercel/scanfix/config.js +188 -0
  20. package/dist/plugins/addons/vercel/scanfix/config.js.map +1 -0
  21. package/dist/plugins/addons/vercel/scanfix/token.d.ts +8 -0
  22. package/dist/plugins/addons/vercel/scanfix/token.d.ts.map +1 -0
  23. package/dist/plugins/addons/vercel/scanfix/token.js +134 -0
  24. package/dist/plugins/addons/vercel/scanfix/token.js.map +1 -0
  25. package/dist/plugins/addons/vercel/utils/vercel-api.d.ts +34 -0
  26. package/dist/plugins/addons/vercel/utils/vercel-api.d.ts.map +1 -0
  27. package/dist/plugins/addons/vercel/utils/vercel-api.js +289 -0
  28. package/dist/plugins/addons/vercel/utils/vercel-api.js.map +1 -0
  29. package/dist/plugins/index.d.ts.map +1 -1
  30. package/dist/plugins/index.js +9 -0
  31. package/dist/plugins/index.js.map +1 -1
  32. package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -1
  33. package/dist/plugins/pipelines/aws/scanfix/credentials.js +91 -0
  34. package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -1
  35. package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts.map +1 -1
  36. package/dist/plugins/pipelines/aws/scanfix/ec2.js +15 -1
  37. package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -1
  38. package/dist/plugins/pipelines/aws/scanfix/iam.d.ts.map +1 -1
  39. package/dist/plugins/pipelines/aws/scanfix/iam.js +5 -0
  40. package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -1
  41. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
  42. package/dist/plugins/pipelines/factiii/index.js +67 -6
  43. package/dist/plugins/pipelines/factiii/index.js.map +1 -1
  44. package/dist/plugins/pipelines/factiii/scanfix/secrets.d.ts.map +1 -1
  45. package/dist/plugins/pipelines/factiii/scanfix/secrets.js +77 -0
  46. package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
  47. package/dist/plugins/servers/amazon-linux/index.d.ts +1 -0
  48. package/dist/plugins/servers/amazon-linux/index.d.ts.map +1 -1
  49. package/dist/plugins/servers/mac/index.d.ts +1 -0
  50. package/dist/plugins/servers/mac/index.d.ts.map +1 -1
  51. package/dist/plugins/servers/ubuntu/index.d.ts +1 -0
  52. package/dist/plugins/servers/ubuntu/index.d.ts.map +1 -1
  53. package/dist/types/cli.d.ts +5 -0
  54. package/dist/types/cli.d.ts.map +1 -1
  55. package/dist/types/plugin.d.ts +6 -0
  56. package/dist/types/plugin.d.ts.map +1 -1
  57. package/dist/utils/interactive-prompts.d.ts +19 -0
  58. package/dist/utils/interactive-prompts.d.ts.map +1 -0
  59. package/dist/utils/interactive-prompts.js +101 -0
  60. package/dist/utils/interactive-prompts.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ /**
3
+ * Vercel Addon Plugin
4
+ *
5
+ * Cloud hosting addon for deploying to Vercel via factiii pipeline.
6
+ * Uses API-first architecture (more stable than CLI).
7
+ * CLI is used only for initial linking and when API doesn't support it.
8
+ *
9
+ * This is an ADDON plugin that extends factiii pipeline. It handles:
10
+ * - Vercel deployment orchestration
11
+ * - Project linking and configuration
12
+ * - Domain management
13
+ *
14
+ * ============================================================
15
+ * API vs CLI Decision Logic
16
+ * ============================================================
17
+ *
18
+ * **Use API when:**
19
+ * - Deploying (more stable, fewer breaking changes)
20
+ * - Checking deployment status
21
+ * - Managing environment variables
22
+ * - Listing projects/deployments
23
+ *
24
+ * **Use CLI when:**
25
+ * - Initial project linking (vercel link)
26
+ * - When user explicitly needs CLI features
27
+ * - API doesn't support the operation
28
+ *
29
+ * ============================================================
30
+ * PLUGIN STRUCTURE STANDARD
31
+ * ============================================================
32
+ *
33
+ * **scanfix/** - Scan/fix operations organized by concern
34
+ * - config.ts - Vercel project configuration
35
+ * - token.ts - VERCEL_TOKEN management
36
+ *
37
+ * **utils/** - Vercel API helpers
38
+ * - vercel-api.ts - API client and helpers
39
+ *
40
+ * **index.ts** - Main plugin class
41
+ * - Static metadata (id, name, category, version)
42
+ * - canReach() - Pipeline routing logic
43
+ * - Imports and combines all scanfix arrays
44
+ * ============================================================
45
+ */
46
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
47
+ if (k2 === undefined) k2 = k;
48
+ var desc = Object.getOwnPropertyDescriptor(m, k);
49
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
50
+ desc = { enumerable: true, get: function() { return m[k]; } };
51
+ }
52
+ Object.defineProperty(o, k2, desc);
53
+ }) : (function(o, m, k, k2) {
54
+ if (k2 === undefined) k2 = k;
55
+ o[k2] = m[k];
56
+ }));
57
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
58
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
59
+ }) : function(o, v) {
60
+ o["default"] = v;
61
+ });
62
+ var __importStar = (this && this.__importStar) || (function () {
63
+ var ownKeys = function(o) {
64
+ ownKeys = Object.getOwnPropertyNames || function (o) {
65
+ var ar = [];
66
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
67
+ return ar;
68
+ };
69
+ return ownKeys(o);
70
+ };
71
+ return function (mod) {
72
+ if (mod && mod.__esModule) return mod;
73
+ var result = {};
74
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
75
+ __setModuleDefault(result, mod);
76
+ return result;
77
+ };
78
+ })();
79
+ Object.defineProperty(exports, "__esModule", { value: true });
80
+ // Import scanfixes
81
+ const config_js_1 = require("./scanfix/config.js");
82
+ const token_js_1 = require("./scanfix/token.js");
83
+ class VercelAddon {
84
+ // ============================================================
85
+ // STATIC METADATA
86
+ // ============================================================
87
+ static id = 'vercel';
88
+ static name = 'Vercel Addon';
89
+ static category = 'addon';
90
+ static version = '1.0.0';
91
+ /**
92
+ * Server OS types this pipeline is compatible with
93
+ * Vercel is serverless, but we support all dev machine types
94
+ */
95
+ static compatibleServers = ['mac', 'ubuntu', 'windows'];
96
+ /**
97
+ * Default server (N/A for Vercel - serverless)
98
+ */
99
+ static defaultServer = 'ubuntu';
100
+ // Env vars this plugin requires
101
+ static requiredEnvVars = [];
102
+ // Schema for stack.yml (user-editable)
103
+ static configSchema = {
104
+ vercel: {
105
+ project_name: 'EXAMPLE_my-project',
106
+ org_id: 'EXAMPLE_team_xxx',
107
+ project_id: 'EXAMPLE_prj_xxx',
108
+ },
109
+ };
110
+ // Schema for stackAuto.yml (auto-detected)
111
+ static autoConfigSchema = {
112
+ vercel_cli_installed: 'boolean',
113
+ vercel_project_linked: 'boolean',
114
+ };
115
+ /**
116
+ * Determine if this plugin should be loaded for this project
117
+ * Loads if vercel config exists (factiii pipeline will use this addon as needed)
118
+ */
119
+ static async shouldLoad(_rootDir, config) {
120
+ // Load if top-level vercel config exists
121
+ if (config.vercel?.project_name || config.vercel?.project_id) {
122
+ return true;
123
+ }
124
+ // Load if vercel section exists in any environment
125
+ const { extractEnvironments } = await Promise.resolve().then(() => __importStar(require('../../../utils/config-helpers.js')));
126
+ const environments = extractEnvironments(config);
127
+ for (const env of Object.values(environments)) {
128
+ if (env.vercel) {
129
+ return true;
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ static helpText = {
135
+ VERCEL_TOKEN: `
136
+ Vercel API Token for deployments.
137
+
138
+ Get from: https://vercel.com/account/tokens
139
+
140
+ Create a new token with:
141
+ - Scope: Full Account (or specific team)
142
+ - Expiration: No Expiration (or custom)
143
+
144
+ The token will be stored securely in Ansible Vault.`,
145
+ };
146
+ // ============================================================
147
+ // PIPELINE-SPECIFIC METHODS
148
+ // ============================================================
149
+ /**
150
+ * Check if Vercel is configured and available
151
+ * (Called by factiii pipeline to determine if Vercel deployment is possible)
152
+ */
153
+ static isVercelConfigured(config) {
154
+ // Check if vercel config exists
155
+ if (config.vercel?.project_name) {
156
+ return true;
157
+ }
158
+ return false;
159
+ }
160
+ // ============================================================
161
+ // FIXES - All issues this plugin can detect and resolve
162
+ // ============================================================
163
+ static fixes = [
164
+ ...config_js_1.fixes,
165
+ ...token_js_1.fixes,
166
+ ];
167
+ // ============================================================
168
+ // STATIC HELPER METHODS
169
+ // ============================================================
170
+ /**
171
+ * Auto-detect Vercel configuration
172
+ */
173
+ static async detectConfig(rootDir) {
174
+ const detected = {};
175
+ try {
176
+ // Check if Vercel CLI is installed
177
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
178
+ execSync('which vercel', { stdio: 'pipe' });
179
+ detected.vercel_cli_installed = true;
180
+ }
181
+ catch {
182
+ detected.vercel_cli_installed = false;
183
+ }
184
+ // Check if project is linked (.vercel/project.json)
185
+ try {
186
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
187
+ const path = await Promise.resolve().then(() => __importStar(require('path')));
188
+ const vercelConfigPath = path.join(rootDir, '.vercel', 'project.json');
189
+ if (fs.existsSync(vercelConfigPath)) {
190
+ detected.vercel_project_linked = true;
191
+ }
192
+ else {
193
+ detected.vercel_project_linked = false;
194
+ }
195
+ }
196
+ catch {
197
+ detected.vercel_project_linked = false;
198
+ }
199
+ return detected;
200
+ }
201
+ // ============================================================
202
+ // INSTANCE METHODS
203
+ // ============================================================
204
+ _config;
205
+ constructor(config) {
206
+ this._config = config;
207
+ }
208
+ /**
209
+ * Deploy to Vercel (called by factiii pipeline)
210
+ */
211
+ static async deployToVercel(config, options = {}) {
212
+ const { deployToVercel } = await Promise.resolve().then(() => __importStar(require('./utils/vercel-api.js')));
213
+ return deployToVercel(config, options);
214
+ }
215
+ /**
216
+ * Deploy to an environment
217
+ */
218
+ async deploy(config, environment) {
219
+ const { deployToVercel } = await Promise.resolve().then(() => __importStar(require('./utils/vercel-api.js')));
220
+ const production = environment === 'prod';
221
+ return deployToVercel(config, { production });
222
+ }
223
+ /**
224
+ * Undeploy is not applicable for Vercel (serverless)
225
+ */
226
+ async undeploy(_config, _environment) {
227
+ return {
228
+ success: false,
229
+ error: 'Undeploy not supported for Vercel. Deployments are immutable. Use Vercel dashboard to delete.',
230
+ };
231
+ }
232
+ }
233
+ exports.default = VercelAddon;
234
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/addons/vercel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Vercel Configuration Scanfixes
3
+ *
4
+ * Detects and fixes Vercel project configuration issues.
5
+ */
6
+ import type { Fix } from '../../../../types/index.js';
7
+ export declare const fixes: Fix[];
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/vercel/scanfix/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAGtD,eAAO,MAAM,KAAK,EAAE,GAAG,EAgKtB,CAAC"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * Vercel Configuration Scanfixes
4
+ *
5
+ * Detects and fixes Vercel project configuration issues.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.fixes = void 0;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ exports.fixes = [
45
+ {
46
+ id: 'vercel-config-missing',
47
+ stage: 'dev',
48
+ severity: 'critical',
49
+ description: 'Vercel configuration missing in stack.yml',
50
+ scan: async (config, _rootDir) => {
51
+ // Check if vercel is configured
52
+ if (!config.vercel) {
53
+ return true;
54
+ }
55
+ // Check if vercel config exists
56
+ if (!config.vercel) {
57
+ return false;
58
+ }
59
+ // Check required fields
60
+ const projectName = config.vercel.project_name;
61
+ if (!projectName || projectName.toUpperCase().startsWith('EXAMPLE')) {
62
+ return false;
63
+ }
64
+ return true;
65
+ },
66
+ fix: null,
67
+ manualFix: `
68
+ Add Vercel configuration to stack.yml:
69
+
70
+ vercel:
71
+ project_name: my-project
72
+ org_id: team_xxx # Optional: your Vercel team/org ID
73
+ project_id: prj_xxx # Optional: auto-detected after linking
74
+
75
+ Then link your project:
76
+ vercel link
77
+
78
+ Or use the Vercel dashboard to create a project and add the IDs to stack.yml.
79
+ `,
80
+ },
81
+ {
82
+ id: 'vercel-project-not-linked',
83
+ stage: 'dev',
84
+ severity: 'warning',
85
+ description: 'Vercel project not linked (missing .vercel/project.json)',
86
+ scan: async (config, rootDir) => {
87
+ // Check if vercel pipeline is used
88
+ const { extractEnvironments } = await Promise.resolve().then(() => __importStar(require('../../../../utils/config-helpers.js')));
89
+ const environments = extractEnvironments(config);
90
+ const usesVercel = Object.values(environments).some((env) => env.pipeline === 'vercel');
91
+ if (!usesVercel) {
92
+ return true;
93
+ }
94
+ // Check if .vercel/project.json exists
95
+ const vercelConfigPath = path.join(rootDir, '.vercel', 'project.json');
96
+ if (!fs.existsSync(vercelConfigPath)) {
97
+ return false;
98
+ }
99
+ return true;
100
+ },
101
+ fix: null,
102
+ manualFix: `
103
+ Link your project to Vercel:
104
+
105
+ vercel link
106
+
107
+ This will:
108
+ 1. Prompt you to select your Vercel team/org
109
+ 2. Ask if you want to link to an existing project or create new one
110
+ 3. Create .vercel/project.json with project metadata
111
+
112
+ After linking, the project_id and org_id will be saved in .vercel/project.json.
113
+ You can optionally copy these to stack.yml for documentation.
114
+ `,
115
+ },
116
+ {
117
+ id: 'vercel-cli-not-installed',
118
+ stage: 'dev',
119
+ severity: 'warning',
120
+ description: 'Vercel CLI not installed (needed for initial linking)',
121
+ scan: async (config, _rootDir) => {
122
+ // Check if vercel is configured
123
+ if (!config.vercel) {
124
+ return true;
125
+ }
126
+ // Check if vercel CLI is installed
127
+ try {
128
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
129
+ execSync('which vercel', { stdio: 'pipe' });
130
+ return true;
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ },
136
+ fix: async (_config, _rootDir) => {
137
+ console.log(' Installing Vercel CLI globally...');
138
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
139
+ try {
140
+ execSync('npm install -g vercel', { stdio: 'inherit' });
141
+ console.log(' [OK] Vercel CLI installed');
142
+ return true;
143
+ }
144
+ catch (e) {
145
+ console.log(' [!] Failed to install Vercel CLI: ' + (e instanceof Error ? e.message : String(e)));
146
+ return false;
147
+ }
148
+ },
149
+ manualFix: 'Install Vercel CLI manually: npm install -g vercel',
150
+ },
151
+ {
152
+ id: 'vercel-gitignore-missing',
153
+ stage: 'dev',
154
+ severity: 'info',
155
+ description: '.vercel directory not in .gitignore',
156
+ scan: async (config, rootDir) => {
157
+ // Check if vercel pipeline is used
158
+ const { extractEnvironments } = await Promise.resolve().then(() => __importStar(require('../../../../utils/config-helpers.js')));
159
+ const environments = extractEnvironments(config);
160
+ const usesVercel = Object.values(environments).some((env) => env.pipeline === 'vercel');
161
+ if (!usesVercel) {
162
+ return true;
163
+ }
164
+ // Check if .vercel is in .gitignore
165
+ const { isGitignored } = await Promise.resolve().then(() => __importStar(require('../../../../utils/gitignore.js')));
166
+ const isIgnored = await isGitignored('.vercel', rootDir);
167
+ if (!isIgnored) {
168
+ return false;
169
+ }
170
+ return true;
171
+ },
172
+ fix: async (_config, rootDir) => {
173
+ console.log(' Adding .vercel to .gitignore...');
174
+ const { ensureGitignored } = await Promise.resolve().then(() => __importStar(require('../../../../utils/gitignore.js')));
175
+ try {
176
+ await ensureGitignored('.vercel', rootDir);
177
+ console.log(' [OK] .vercel added to .gitignore');
178
+ return true;
179
+ }
180
+ catch (e) {
181
+ console.log(' [!] Failed to update .gitignore: ' + (e instanceof Error ? e.message : String(e)));
182
+ return false;
183
+ }
184
+ },
185
+ manualFix: 'Add .vercel to .gitignore manually: echo ".vercel" >> .gitignore',
186
+ },
187
+ ];
188
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/plugins/addons/vercel/scanfix/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Vercel Token Scanfixes
3
+ *
4
+ * Manages VERCEL_TOKEN in Ansible Vault for API deployments.
5
+ */
6
+ import type { Fix } from '../../../../types/index.js';
7
+ export declare const fixes: Fix[];
8
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/vercel/scanfix/token.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAGtD,eAAO,MAAM,KAAK,EAAE,GAAG,EAiGtB,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Vercel Token Scanfixes
4
+ *
5
+ * Manages VERCEL_TOKEN in Ansible Vault for API deployments.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.fixes = void 0;
42
+ exports.fixes = [
43
+ {
44
+ id: 'vercel-token-missing',
45
+ stage: 'secrets',
46
+ severity: 'critical',
47
+ description: 'VERCEL_TOKEN not found in Ansible Vault',
48
+ scan: async (config, rootDir) => {
49
+ // Check if vercel is configured
50
+ if (!config.vercel) {
51
+ return true;
52
+ }
53
+ // Check if VERCEL_TOKEN exists in vault
54
+ const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../../../../utils/ansible-vault-secrets.js')));
55
+ const vault = new AnsibleVaultSecrets({
56
+ vault_path: config.ansible?.vault_path || 'group_vars/all/vault.yml',
57
+ vault_password_file: config.ansible?.vault_password_file,
58
+ rootDir,
59
+ });
60
+ try {
61
+ const token = await vault.getSecret('VERCEL_TOKEN');
62
+ if (!token) {
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ },
71
+ fix: async (config, rootDir) => {
72
+ console.log(' Setting up VERCEL_TOKEN in Ansible Vault...');
73
+ console.log('');
74
+ console.log(' Get your token from: https://vercel.com/account/tokens');
75
+ console.log(' Create a new token with:');
76
+ console.log(' - Scope: Full Account (or specific team)');
77
+ console.log(' - Expiration: No Expiration (or custom)');
78
+ console.log('');
79
+ const { promptForSecret } = await Promise.resolve().then(() => __importStar(require('../../../../utils/interactive-prompts.js')));
80
+ const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../../../../utils/ansible-vault-secrets.js')));
81
+ const vault = new AnsibleVaultSecrets({
82
+ vault_path: config.ansible?.vault_path || 'group_vars/all/vault.yml',
83
+ vault_password_file: config.ansible?.vault_password_file,
84
+ rootDir,
85
+ });
86
+ try {
87
+ const token = await promptForSecret('VERCEL_TOKEN', 'Vercel API Token');
88
+ await vault.setSecret('VERCEL_TOKEN', token);
89
+ console.log(' [OK] VERCEL_TOKEN stored in Ansible Vault');
90
+ return true;
91
+ }
92
+ catch (e) {
93
+ console.log(' [!] Failed to store VERCEL_TOKEN: ' + (e instanceof Error ? e.message : String(e)));
94
+ return false;
95
+ }
96
+ },
97
+ manualFix: `
98
+ Store VERCEL_TOKEN in Ansible Vault manually:
99
+
100
+ npx stack deploy --secrets set VERCEL_TOKEN
101
+
102
+ Or get token from: https://vercel.com/account/tokens
103
+ `,
104
+ },
105
+ {
106
+ id: 'vercel-token-env-not-set',
107
+ stage: 'dev',
108
+ severity: 'info',
109
+ description: 'VERCEL_TOKEN not available in environment (deployments will read from vault)',
110
+ scan: async (config, _rootDir) => {
111
+ // Check if vercel is configured
112
+ if (!config.vercel) {
113
+ return true;
114
+ }
115
+ // Check if VERCEL_TOKEN is in env
116
+ if (process.env.VERCEL_TOKEN) {
117
+ return true;
118
+ }
119
+ return false;
120
+ },
121
+ fix: null,
122
+ manualFix: `
123
+ VERCEL_TOKEN is not required in your environment during development.
124
+ It will be automatically read from Ansible Vault during deployment.
125
+
126
+ If you want to set it in your shell for testing:
127
+ export VERCEL_TOKEN="your-token-here"
128
+
129
+ Or add to your shell profile (~/.bashrc, ~/.zshrc):
130
+ export VERCEL_TOKEN="$(npx stack deploy --secrets get VERCEL_TOKEN)"
131
+ `,
132
+ },
133
+ ];
134
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../../src/plugins/addons/vercel/scanfix/token.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKU,QAAA,KAAK,GAAU;IAC1B;QACE,EAAE,EAAE,sBAAsB;QAC1B,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,yCAAyC;QACtD,IAAI,EAAE,KAAK,EAAE,MAAqB,EAAE,OAAe,EAAE,EAAE;YACrD,gCAAgC;YAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,wCAAwC;YACxC,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,4CAA4C,GAAC,CAAC;YAC3F,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,UAAU,EAAG,MAAM,CAAC,OAAO,EAAE,UAAqB,IAAI,0BAA0B;gBAChF,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE,mBAAyC;gBAC9E,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,MAAqB,EAAE,OAAe,EAAE,EAAE;YACpD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,EAAE,eAAe,EAAE,GAAG,wDAAa,0CAA0C,GAAC,CAAC;YACrF,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,4CAA4C,GAAC,CAAC;YAE3F,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,UAAU,EAAG,MAAM,CAAC,OAAO,EAAE,UAAqB,IAAI,0BAA0B;gBAChF,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE,mBAAyC;gBAC9E,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBACxE,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBAC5D,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,uCAAuC,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpG,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,SAAS,EAAE;;;;;;KAMV;KACF;IAED;QACE,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,8EAA8E;QAC3F,IAAI,EAAE,KAAK,EAAE,MAAqB,EAAE,QAAgB,EAAE,EAAE;YACtD,gCAAgC;YAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,kCAAkC;YAClC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QACD,GAAG,EAAE,IAAI;QACT,SAAS,EAAE;;;;;;;;;KASV;KACF;CACF,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Vercel API Utilities
3
+ *
4
+ * API-first integration with Vercel for deployments.
5
+ * Uses Vercel REST API for stability (more stable than CLI).
6
+ *
7
+ * Vercel API Docs: https://vercel.com/docs/rest-api
8
+ */
9
+ import type { FactiiiConfig, DeployResult } from '../../../../types/index.js';
10
+ interface VercelDeployment {
11
+ id: string;
12
+ url: string;
13
+ state: 'BUILDING' | 'READY' | 'ERROR' | 'CANCELED';
14
+ readyState: 'READY' | 'ERROR' | 'BUILDING' | 'QUEUED' | 'CANCELED';
15
+ target: 'production' | 'staging' | 'preview';
16
+ }
17
+ interface DeployOptions {
18
+ production?: boolean;
19
+ branch?: string;
20
+ commit?: string;
21
+ }
22
+ /**
23
+ * Deploy to Vercel via API
24
+ *
25
+ * Uses git-based deployment (most reliable for free tier).
26
+ * Vercel automatically builds from the git commit.
27
+ */
28
+ export declare function deployToVercel(config: FactiiiConfig, options?: DeployOptions): Promise<DeployResult>;
29
+ /**
30
+ * Get deployment status from Vercel API
31
+ */
32
+ export declare function getDeploymentStatus(config: FactiiiConfig, deploymentId: string): Promise<VercelDeployment | null>;
33
+ export {};
34
+ //# sourceMappingURL=vercel-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-api.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/vercel/utils/vercel-api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ9E,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;IACnD,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;IACnE,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;CAC9C;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4ID;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAmIvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAelC"}