@factiii/stack 0.1.56 → 0.1.58

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 (78) hide show
  1. package/dist/cli/deploy-secrets.js +1 -1
  2. package/dist/cli/deploy-secrets.js.map +1 -1
  3. package/dist/cli/fix.d.ts.map +1 -1
  4. package/dist/cli/fix.js +27 -4
  5. package/dist/cli/fix.js.map +1 -1
  6. package/dist/cli/scan.d.ts.map +1 -1
  7. package/dist/cli/scan.js +24 -3
  8. package/dist/cli/scan.js.map +1 -1
  9. package/dist/cli/secrets.js +1 -1
  10. package/dist/cli/secrets.js.map +1 -1
  11. package/dist/generators/generate-stack-auto.d.ts.map +1 -1
  12. package/dist/generators/generate-stack-auto.js +17 -16
  13. package/dist/generators/generate-stack-auto.js.map +1 -1
  14. package/dist/generators/generate-stack-yml.d.ts.map +1 -1
  15. package/dist/generators/generate-stack-yml.js +23 -1
  16. package/dist/generators/generate-stack-yml.js.map +1 -1
  17. package/dist/plugins/addons/vercel/index.d.ts +99 -0
  18. package/dist/plugins/addons/vercel/index.d.ts.map +1 -0
  19. package/dist/plugins/addons/vercel/index.js +234 -0
  20. package/dist/plugins/addons/vercel/index.js.map +1 -0
  21. package/dist/plugins/addons/vercel/scanfix/config.d.ts +8 -0
  22. package/dist/plugins/addons/vercel/scanfix/config.d.ts.map +1 -0
  23. package/dist/plugins/addons/vercel/scanfix/config.js +182 -0
  24. package/dist/plugins/addons/vercel/scanfix/config.js.map +1 -0
  25. package/dist/plugins/addons/vercel/scanfix/token.d.ts +8 -0
  26. package/dist/plugins/addons/vercel/scanfix/token.d.ts.map +1 -0
  27. package/dist/plugins/addons/vercel/scanfix/token.js +127 -0
  28. package/dist/plugins/addons/vercel/scanfix/token.js.map +1 -0
  29. package/dist/plugins/addons/vercel/utils/vercel-api.d.ts +34 -0
  30. package/dist/plugins/addons/vercel/utils/vercel-api.d.ts.map +1 -0
  31. package/dist/plugins/addons/vercel/utils/vercel-api.js +290 -0
  32. package/dist/plugins/addons/vercel/utils/vercel-api.js.map +1 -0
  33. package/dist/plugins/index.d.ts.map +1 -1
  34. package/dist/plugins/index.js +9 -0
  35. package/dist/plugins/index.js.map +1 -1
  36. package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -1
  37. package/dist/plugins/pipelines/aws/scanfix/credentials.js +91 -0
  38. package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -1
  39. package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts.map +1 -1
  40. package/dist/plugins/pipelines/aws/scanfix/ec2.js +15 -1
  41. package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -1
  42. package/dist/plugins/pipelines/aws/scanfix/iam.d.ts.map +1 -1
  43. package/dist/plugins/pipelines/aws/scanfix/iam.js +5 -0
  44. package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -1
  45. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
  46. package/dist/plugins/pipelines/factiii/index.js +68 -7
  47. package/dist/plugins/pipelines/factiii/index.js.map +1 -1
  48. package/dist/plugins/pipelines/factiii/scanfix/config.js +2 -2
  49. package/dist/plugins/pipelines/factiii/scanfix/config.js.map +1 -1
  50. package/dist/plugins/pipelines/factiii/scanfix/secrets.d.ts.map +1 -1
  51. package/dist/plugins/pipelines/factiii/scanfix/secrets.js +78 -1
  52. package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
  53. package/dist/plugins/pipelines/factiii/scanfix/vault.d.ts.map +1 -1
  54. package/dist/plugins/pipelines/factiii/scanfix/vault.js +5 -3
  55. package/dist/plugins/pipelines/factiii/scanfix/vault.js.map +1 -1
  56. package/dist/plugins/servers/amazon-linux/index.d.ts +1 -0
  57. package/dist/plugins/servers/amazon-linux/index.d.ts.map +1 -1
  58. package/dist/plugins/servers/mac/index.d.ts +1 -0
  59. package/dist/plugins/servers/mac/index.d.ts.map +1 -1
  60. package/dist/plugins/servers/mac/scanfix/config.js +1 -1
  61. package/dist/plugins/servers/mac/scanfix/config.js.map +1 -1
  62. package/dist/plugins/servers/ubuntu/index.d.ts +1 -0
  63. package/dist/plugins/servers/ubuntu/index.d.ts.map +1 -1
  64. package/dist/types/cli.d.ts +5 -0
  65. package/dist/types/cli.d.ts.map +1 -1
  66. package/dist/types/config.d.ts +1 -0
  67. package/dist/types/config.d.ts.map +1 -1
  68. package/dist/types/plugin.d.ts +6 -0
  69. package/dist/types/plugin.d.ts.map +1 -1
  70. package/dist/utils/config-helpers.d.ts +14 -1
  71. package/dist/utils/config-helpers.d.ts.map +1 -1
  72. package/dist/utils/config-helpers.js +51 -0
  73. package/dist/utils/config-helpers.js.map +1 -1
  74. package/dist/utils/interactive-prompts.d.ts +19 -0
  75. package/dist/utils/interactive-prompts.d.ts.map +1 -0
  76. package/dist/utils/interactive-prompts.js +101 -0
  77. package/dist/utils/interactive-prompts.js.map +1 -0
  78. package/package.json +2 -2
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Vercel Addon Plugin
3
+ *
4
+ * Cloud hosting addon for deploying to Vercel via factiii pipeline.
5
+ * Uses API-first architecture (more stable than CLI).
6
+ * CLI is used only for initial linking and when API doesn't support it.
7
+ *
8
+ * This is an ADDON plugin that extends factiii pipeline. It handles:
9
+ * - Vercel deployment orchestration
10
+ * - Project linking and configuration
11
+ * - Domain management
12
+ *
13
+ * ============================================================
14
+ * API vs CLI Decision Logic
15
+ * ============================================================
16
+ *
17
+ * **Use API when:**
18
+ * - Deploying (more stable, fewer breaking changes)
19
+ * - Checking deployment status
20
+ * - Managing environment variables
21
+ * - Listing projects/deployments
22
+ *
23
+ * **Use CLI when:**
24
+ * - Initial project linking (vercel link)
25
+ * - When user explicitly needs CLI features
26
+ * - API doesn't support the operation
27
+ *
28
+ * ============================================================
29
+ * PLUGIN STRUCTURE STANDARD
30
+ * ============================================================
31
+ *
32
+ * **scanfix/** - Scan/fix operations organized by concern
33
+ * - config.ts - Vercel project configuration
34
+ * - token.ts - VERCEL_TOKEN management
35
+ *
36
+ * **utils/** - Vercel API helpers
37
+ * - vercel-api.ts - API client and helpers
38
+ *
39
+ * **index.ts** - Main plugin class
40
+ * - Static metadata (id, name, category, version)
41
+ * - canReach() - Pipeline routing logic
42
+ * - Imports and combines all scanfix arrays
43
+ * ============================================================
44
+ */
45
+ import type { FactiiiConfig, DeployResult, Fix, ServerOS } from '../../../types/index.js';
46
+ declare class VercelAddon {
47
+ static readonly id = "vercel";
48
+ static readonly name = "Vercel Addon";
49
+ static readonly category: 'addon';
50
+ static readonly version = "1.0.0";
51
+ /**
52
+ * Server OS types this pipeline is compatible with
53
+ * Vercel is serverless, but we support all dev machine types
54
+ */
55
+ static readonly compatibleServers: ServerOS[];
56
+ /**
57
+ * Default server (N/A for Vercel - serverless)
58
+ */
59
+ static readonly defaultServer: ServerOS;
60
+ static readonly requiredEnvVars: string[];
61
+ static readonly configSchema: Record<string, unknown>;
62
+ static readonly autoConfigSchema: Record<string, string>;
63
+ /**
64
+ * Determine if this plugin should be loaded for this project
65
+ * Loads if vercel config exists (factiii pipeline will use this addon as needed)
66
+ */
67
+ static shouldLoad(_rootDir: string, config: FactiiiConfig): Promise<boolean>;
68
+ static helpText: Record<string, string>;
69
+ /**
70
+ * Check if Vercel is configured and available
71
+ * (Called by factiii pipeline to determine if Vercel deployment is possible)
72
+ */
73
+ static isVercelConfigured(config: FactiiiConfig): boolean;
74
+ static readonly fixes: Fix[];
75
+ /**
76
+ * Auto-detect Vercel configuration
77
+ */
78
+ static detectConfig(rootDir: string): Promise<Record<string, unknown>>;
79
+ private _config;
80
+ constructor(config: FactiiiConfig);
81
+ /**
82
+ * Deploy to Vercel (called by factiii pipeline)
83
+ */
84
+ static deployToVercel(config: FactiiiConfig, options?: {
85
+ production?: boolean;
86
+ branch?: string;
87
+ commit?: string;
88
+ }): Promise<DeployResult>;
89
+ /**
90
+ * Deploy to an environment
91
+ */
92
+ deploy(config: FactiiiConfig, environment: string): Promise<DeployResult>;
93
+ /**
94
+ * Undeploy is not applicable for Vercel (serverless)
95
+ */
96
+ undeploy(_config: FactiiiConfig, _environment: string): Promise<DeployResult>;
97
+ }
98
+ export default VercelAddon;
99
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/addons/vercel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EACV,aAAa,EAEb,YAAY,EACZ,GAAG,EAGH,QAAQ,EACT,MAAM,yBAAyB,CAAC;AAMjC,cAAM,WAAW;IAKf,MAAM,CAAC,QAAQ,CAAC,EAAE,YAAY;IAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,kBAAkB;IACtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAW;IAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAElC;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,EAAE,CAAgC;IAE7E;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAY;IAGnD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAoB;IAG7D,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMnD;IAGF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGtD;IAEF;;;OAGG;WACU,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBlF,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWrC;IAMF;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAYzD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAG1B;IAMF;;OAEG;WACU,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiC5E,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,EAAE,aAAa;IAIjC;;OAEG;WACU,cAAc,CACzB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GACvE,OAAO,CAAC,YAAY,CAAC;IAKxB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAO/E;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAMpF;AAED,eAAe,WAAW,CAAC"}
@@ -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 = ['VERCEL_TOKEN'];
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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,mBAAmB;AACnB,mDAA2D;AAC3D,iDAAyD;AAEzD,MAAM,WAAW;IACf,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,MAAM,CAAU,EAAE,GAAG,QAAQ,CAAC;IAC9B,MAAM,CAAU,IAAI,GAAG,cAAc,CAAC;IACtC,MAAM,CAAU,QAAQ,GAAY,OAAO,CAAC;IAC5C,MAAM,CAAU,OAAO,GAAG,OAAO,CAAC;IAElC;;;OAGG;IACH,MAAM,CAAU,iBAAiB,GAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7E;;OAEG;IACH,MAAM,CAAU,aAAa,GAAa,QAAQ,CAAC;IAEnD,gCAAgC;IAChC,MAAM,CAAU,eAAe,GAAa,CAAC,cAAc,CAAC,CAAC;IAE7D,uCAAuC;IACvC,MAAM,CAAU,YAAY,GAA4B;QACtD,MAAM,EAAE;YACN,YAAY,EAAE,oBAAoB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,iBAAiB;SAC9B;KACF,CAAC;IAEF,2CAA2C;IAC3C,MAAM,CAAU,gBAAgB,GAA2B;QACzD,oBAAoB,EAAE,SAAS;QAC/B,qBAAqB,EAAE,SAAS;KACjC,CAAC;IAEF;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,MAAqB;QAC7D,yCAAyC;QACzC,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;QACjF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9C,IAAK,GAA4B,CAAC,MAAM,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAQ,GAA2B;QACxC,YAAY,EAAE;;;;;;;;;uDASqC;KACpD,CAAC;IAEF,+DAA+D;IAC/D,4BAA4B;IAC5B,+DAA+D;IAE/D;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,MAAqB;QAC7C,gCAAgC;QAChC,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+DAA+D;IAC/D,wDAAwD;IACxD,+DAA+D;IAE/D,MAAM,CAAU,KAAK,GAAU;QAC7B,GAAG,iBAAW;QACd,GAAG,gBAAU;KACd,CAAC;IAEF,+DAA+D;IAC/D,wBAAwB;IACxB,+DAA+D;IAE/D;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAe;QACvC,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAE7C,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;YACnD,QAAQ,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5C,QAAQ,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,oBAAoB,GAAG,KAAK,CAAC;QACxC,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;YAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;YACvE,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAEvD,OAAO,CAAgB;IAE/B,YAAY,MAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,MAAqB,EACrB,UAAsE,EAAE;QAExE,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,uBAAuB,GAAC,CAAC;QACjE,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAqB,EAAE,WAAmB;QACrD,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,uBAAuB,GAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,WAAW,KAAK,MAAM,CAAC;QAC1C,OAAO,cAAc,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAsB,EAAE,YAAoB;QACzD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+FAA+F;SACvG,CAAC;IACJ,CAAC;;AAGH,kBAAe,WAAW,CAAC"}
@@ -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,EAuJtB,CAAC"}
@@ -0,0 +1,182 @@
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
+ // Skip if vercel not configured
52
+ if (!config.vercel)
53
+ return false;
54
+ // Check required fields
55
+ const projectName = config.vercel.project_name;
56
+ if (!projectName || projectName.toUpperCase().startsWith('EXAMPLE')) {
57
+ return true; // Problem: missing or example project name
58
+ }
59
+ return false; // Configured properly
60
+ },
61
+ fix: null,
62
+ manualFix: `
63
+ Add Vercel configuration to stack.yml:
64
+
65
+ vercel:
66
+ project_name: my-project
67
+ org_id: team_xxx # Optional: your Vercel team/org ID
68
+ project_id: prj_xxx # Optional: auto-detected after linking
69
+
70
+ Then link your project:
71
+ vercel link
72
+
73
+ Or use the Vercel dashboard to create a project and add the IDs to stack.yml.
74
+ `,
75
+ },
76
+ {
77
+ id: 'vercel-project-not-linked',
78
+ stage: 'dev',
79
+ severity: 'warning',
80
+ description: 'Vercel project not linked (missing .vercel/project.json)',
81
+ scan: async (config, rootDir) => {
82
+ // Check if vercel pipeline is used
83
+ const { extractEnvironments } = await Promise.resolve().then(() => __importStar(require('../../../../utils/config-helpers.js')));
84
+ const environments = extractEnvironments(config);
85
+ const usesVercel = Object.values(environments).some((env) => env.pipeline === 'vercel');
86
+ if (!usesVercel) {
87
+ return true;
88
+ }
89
+ // Check if .vercel/project.json exists
90
+ const vercelConfigPath = path.join(rootDir, '.vercel', 'project.json');
91
+ if (!fs.existsSync(vercelConfigPath)) {
92
+ return false;
93
+ }
94
+ return true;
95
+ },
96
+ fix: null,
97
+ manualFix: `
98
+ Link your project to Vercel:
99
+
100
+ vercel link
101
+
102
+ This will:
103
+ 1. Prompt you to select your Vercel team/org
104
+ 2. Ask if you want to link to an existing project or create new one
105
+ 3. Create .vercel/project.json with project metadata
106
+
107
+ After linking, the project_id and org_id will be saved in .vercel/project.json.
108
+ You can optionally copy these to stack.yml for documentation.
109
+ `,
110
+ },
111
+ {
112
+ id: 'vercel-cli-not-installed',
113
+ stage: 'dev',
114
+ severity: 'warning',
115
+ description: 'Vercel CLI not installed (needed for initial linking)',
116
+ scan: async (config, _rootDir) => {
117
+ // Skip if vercel not configured
118
+ if (!config.vercel)
119
+ return false;
120
+ // Check if vercel CLI is installed
121
+ try {
122
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
123
+ execSync('which vercel', { stdio: 'pipe' });
124
+ return false; // CLI installed = no problem
125
+ }
126
+ catch {
127
+ return true; // CLI not installed = problem
128
+ }
129
+ },
130
+ fix: async (_config, _rootDir) => {
131
+ console.log(' Installing Vercel CLI globally...');
132
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
133
+ try {
134
+ execSync('npm install -g vercel', { stdio: 'inherit' });
135
+ console.log(' [OK] Vercel CLI installed');
136
+ return true;
137
+ }
138
+ catch (e) {
139
+ console.log(' [!] Failed to install Vercel CLI: ' + (e instanceof Error ? e.message : String(e)));
140
+ return false;
141
+ }
142
+ },
143
+ manualFix: 'Install Vercel CLI manually: npm install -g vercel',
144
+ },
145
+ {
146
+ id: 'vercel-gitignore-missing',
147
+ stage: 'dev',
148
+ severity: 'info',
149
+ description: '.vercel directory not in .gitignore',
150
+ scan: async (config, rootDir) => {
151
+ // Check if vercel pipeline is used
152
+ const { extractEnvironments } = await Promise.resolve().then(() => __importStar(require('../../../../utils/config-helpers.js')));
153
+ const environments = extractEnvironments(config);
154
+ const usesVercel = Object.values(environments).some((env) => env.pipeline === 'vercel');
155
+ if (!usesVercel) {
156
+ return true;
157
+ }
158
+ // Check if .vercel is in .gitignore
159
+ const { isGitignored } = await Promise.resolve().then(() => __importStar(require('../../../../utils/gitignore.js')));
160
+ const isIgnored = await isGitignored('.vercel', rootDir);
161
+ if (!isIgnored) {
162
+ return false;
163
+ }
164
+ return true;
165
+ },
166
+ fix: async (_config, rootDir) => {
167
+ console.log(' Adding .vercel to .gitignore...');
168
+ const { ensureGitignored } = await Promise.resolve().then(() => __importStar(require('../../../../utils/gitignore.js')));
169
+ try {
170
+ await ensureGitignored('.vercel', rootDir);
171
+ console.log(' [OK] .vercel added to .gitignore');
172
+ return true;
173
+ }
174
+ catch (e) {
175
+ console.log(' [!] Failed to update .gitignore: ' + (e instanceof Error ? e.message : String(e)));
176
+ return false;
177
+ }
178
+ },
179
+ manualFix: 'Add .vercel to .gitignore manually: echo ".vercel" >> .gitignore',
180
+ },
181
+ ];
182
+ //# 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;AAItD,eAAO,MAAM,KAAK,EAAE,GAAG,EAsFtB,CAAC"}