@factiii/stack 0.1.55 → 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.
- package/dist/cli/fix.d.ts.map +1 -1
- package/dist/cli/fix.js +8 -3
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/scan.d.ts.map +1 -1
- package/dist/cli/scan.js +13 -2
- package/dist/cli/scan.js.map +1 -1
- package/dist/generators/generate-stack-auto.d.ts.map +1 -1
- package/dist/generators/generate-stack-auto.js +0 -15
- package/dist/generators/generate-stack-auto.js.map +1 -1
- package/dist/generators/generate-stack-yml.d.ts.map +1 -1
- package/dist/generators/generate-stack-yml.js +17 -0
- package/dist/generators/generate-stack-yml.js.map +1 -1
- package/dist/plugins/addons/vercel/index.d.ts +99 -0
- package/dist/plugins/addons/vercel/index.d.ts.map +1 -0
- package/dist/plugins/addons/vercel/index.js +234 -0
- package/dist/plugins/addons/vercel/index.js.map +1 -0
- package/dist/plugins/addons/vercel/scanfix/config.d.ts +8 -0
- package/dist/plugins/addons/vercel/scanfix/config.d.ts.map +1 -0
- package/dist/plugins/addons/vercel/scanfix/config.js +188 -0
- package/dist/plugins/addons/vercel/scanfix/config.js.map +1 -0
- package/dist/plugins/addons/vercel/scanfix/token.d.ts +8 -0
- package/dist/plugins/addons/vercel/scanfix/token.d.ts.map +1 -0
- package/dist/plugins/addons/vercel/scanfix/token.js +134 -0
- package/dist/plugins/addons/vercel/scanfix/token.js.map +1 -0
- package/dist/plugins/addons/vercel/utils/vercel-api.d.ts +34 -0
- package/dist/plugins/addons/vercel/utils/vercel-api.d.ts.map +1 -0
- package/dist/plugins/addons/vercel/utils/vercel-api.js +289 -0
- package/dist/plugins/addons/vercel/utils/vercel-api.js.map +1 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +9 -0
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/credentials.js +91 -0
- package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/ec2.js +15 -1
- package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/iam.d.ts.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/iam.js +5 -0
- package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -1
- package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/index.js +67 -6
- package/dist/plugins/pipelines/factiii/index.js.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/secrets.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/secrets.js +77 -0
- package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
- package/dist/plugins/servers/amazon-linux/index.d.ts +1 -0
- package/dist/plugins/servers/amazon-linux/index.d.ts.map +1 -1
- package/dist/plugins/servers/mac/index.d.ts +1 -0
- package/dist/plugins/servers/mac/index.d.ts.map +1 -1
- package/dist/plugins/servers/ubuntu/index.d.ts +1 -0
- package/dist/plugins/servers/ubuntu/index.d.ts.map +1 -1
- package/dist/types/cli.d.ts +5 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +6 -0
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/utils/interactive-prompts.d.ts +19 -0
- package/dist/utils/interactive-prompts.d.ts.map +1 -0
- package/dist/utils/interactive-prompts.js +101 -0
- package/dist/utils/interactive-prompts.js.map +1 -0
- 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":";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,EAAE,CAAC;IAE/C,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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|