@iacmp/cli 1.1.0
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/LICENSE +21 -0
- package/bin/run.js +73 -0
- package/dist/chat.js +4068 -0
- package/dist/commands/ai.js +3985 -0
- package/dist/commands/audit-all.js +1039 -0
- package/dist/commands/audit-dr.js +351 -0
- package/dist/commands/audit-ha.js +375 -0
- package/dist/commands/audit-improvements.js +373 -0
- package/dist/commands/audit-security.js +351 -0
- package/dist/commands/dashboard.js +417 -0
- package/dist/commands/deploy.js +188 -0
- package/dist/commands/destroy.js +194 -0
- package/dist/commands/diagram.js +896 -0
- package/dist/commands/diff.js +4420 -0
- package/dist/commands/doctor.js +191 -0
- package/dist/commands/init.js +507 -0
- package/dist/commands/ls.js +75 -0
- package/dist/commands/registry.js +170 -0
- package/dist/commands/registry.json +29 -0
- package/dist/commands/synth.js +4458 -0
- package/dist/commands/watch.js +133 -0
- package/dist/index.js +30 -0
- package/oclif.manifest.json +727 -0
- package/package.json +95 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/commands/destroy.ts
|
|
31
|
+
var destroy_exports = {};
|
|
32
|
+
__export(destroy_exports, {
|
|
33
|
+
default: () => Destroy
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(destroy_exports);
|
|
36
|
+
var import_core = require("@oclif/core");
|
|
37
|
+
var fs3 = __toESM(require("fs"));
|
|
38
|
+
var path2 = __toESM(require("path"));
|
|
39
|
+
var readline = __toESM(require("readline"));
|
|
40
|
+
var import_chalk = __toESM(require("chalk"));
|
|
41
|
+
|
|
42
|
+
// src/synth-out.ts
|
|
43
|
+
var fs = __toESM(require("fs"));
|
|
44
|
+
var path = __toESM(require("path"));
|
|
45
|
+
function templateExt(provider) {
|
|
46
|
+
return provider === "terraform" ? ".tf" : ".json";
|
|
47
|
+
}
|
|
48
|
+
function synthRoot(cwd) {
|
|
49
|
+
return path.join(cwd, "synth-out");
|
|
50
|
+
}
|
|
51
|
+
function providerOutDir(cwd, provider) {
|
|
52
|
+
return path.join(synthRoot(cwd), provider);
|
|
53
|
+
}
|
|
54
|
+
function hasTemplates(dir, provider) {
|
|
55
|
+
const ext = templateExt(provider);
|
|
56
|
+
try {
|
|
57
|
+
return fs.readdirSync(dir).some((f) => f.endsWith(ext) && fs.statSync(path.join(dir, f)).isFile());
|
|
58
|
+
} catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function resolveTemplateDir(cwd, provider) {
|
|
63
|
+
const dir = providerOutDir(cwd, provider);
|
|
64
|
+
if (fs.existsSync(dir)) return dir;
|
|
65
|
+
const root = synthRoot(cwd);
|
|
66
|
+
if (fs.existsSync(root) && hasTemplates(root, provider)) return root;
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function listTemplates(cwd, provider, stack) {
|
|
70
|
+
const dir = resolveTemplateDir(cwd, provider);
|
|
71
|
+
if (!dir) return [];
|
|
72
|
+
const ext = templateExt(provider);
|
|
73
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith(ext) && fs.statSync(path.join(dir, f)).isFile()).map((f) => ({
|
|
74
|
+
stackName: f.slice(0, -ext.length),
|
|
75
|
+
filePath: path.join(dir, f),
|
|
76
|
+
fileName: f
|
|
77
|
+
})).filter((t) => !stack || t.stackName === stack);
|
|
78
|
+
}
|
|
79
|
+
function countResources(filePath, provider) {
|
|
80
|
+
let content;
|
|
81
|
+
try {
|
|
82
|
+
content = fs.readFileSync(filePath, "utf-8");
|
|
83
|
+
} catch {
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
if (provider === "terraform") {
|
|
87
|
+
const matches = content.match(/^resource\s+"/gm);
|
|
88
|
+
return matches ? matches.length : 0;
|
|
89
|
+
}
|
|
90
|
+
let parsed;
|
|
91
|
+
try {
|
|
92
|
+
parsed = JSON.parse(content);
|
|
93
|
+
} catch {
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
if (parsed && typeof parsed === "object") {
|
|
97
|
+
const obj = parsed;
|
|
98
|
+
if (Array.isArray(obj.resources)) return obj.resources.length;
|
|
99
|
+
if (obj.Resources && typeof obj.Resources === "object") {
|
|
100
|
+
return Object.keys(obj.Resources).length;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// src/utils.ts
|
|
107
|
+
var fs2 = __toESM(require("fs"));
|
|
108
|
+
function readJsonFile(filePath) {
|
|
109
|
+
let content;
|
|
110
|
+
try {
|
|
111
|
+
content = fs2.readFileSync(filePath, "utf-8");
|
|
112
|
+
} catch (e) {
|
|
113
|
+
throw new Error(`Falha ao ler '${filePath}': ${errMessage(e)}`);
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
return JSON.parse(content);
|
|
117
|
+
} catch (e) {
|
|
118
|
+
throw new Error(`JSON inv\xE1lido em '${filePath}': ${errMessage(e)}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function errMessage(e) {
|
|
122
|
+
if (e instanceof Error) return e.message;
|
|
123
|
+
if (typeof e === "string") return e;
|
|
124
|
+
try {
|
|
125
|
+
return JSON.stringify(e);
|
|
126
|
+
} catch {
|
|
127
|
+
return String(e);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// src/commands/destroy.ts
|
|
132
|
+
var MVP_BANNER = "MVP: deploy/destroy real ainda n\xE3o implementado nesta fase. Os arquivos foram impressos como dry-run.";
|
|
133
|
+
var Destroy = class _Destroy extends import_core.Command {
|
|
134
|
+
static description = "Destroi a infraestrutura do provider configurado";
|
|
135
|
+
static flags = {
|
|
136
|
+
provider: import_core.Flags.string({ char: "p", description: "Provider alvo", default: "aws" }),
|
|
137
|
+
stack: import_core.Flags.string({ char: "s", description: "Nome da stack espec\xEDfica" }),
|
|
138
|
+
force: import_core.Flags.boolean({ char: "f", description: "Pula confirma\xE7\xE3o" })
|
|
139
|
+
};
|
|
140
|
+
static examples = [
|
|
141
|
+
"$ iacmp destroy",
|
|
142
|
+
"$ iacmp destroy --stack minha-stack",
|
|
143
|
+
"$ iacmp destroy --force"
|
|
144
|
+
];
|
|
145
|
+
async confirm(message) {
|
|
146
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
147
|
+
return new Promise((resolve) => {
|
|
148
|
+
rl.question(`${message} (y/N): `, (answer) => {
|
|
149
|
+
rl.close();
|
|
150
|
+
resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async run() {
|
|
155
|
+
const { flags } = await this.parse(_Destroy);
|
|
156
|
+
const cwd = process.cwd();
|
|
157
|
+
const configPath = path2.join(cwd, "iacmp.json");
|
|
158
|
+
if (!fs3.existsSync(configPath)) {
|
|
159
|
+
this.error("Projeto n\xE3o inicializado. Rode: iacmp init");
|
|
160
|
+
}
|
|
161
|
+
let config;
|
|
162
|
+
try {
|
|
163
|
+
config = readJsonFile(configPath);
|
|
164
|
+
} catch (err) {
|
|
165
|
+
this.error(errMessage(err));
|
|
166
|
+
}
|
|
167
|
+
const provider = flags.provider ?? config.provider ?? "aws";
|
|
168
|
+
this.log(import_chalk.default.yellow.bold(MVP_BANNER));
|
|
169
|
+
this.log("");
|
|
170
|
+
const templates = listTemplates(cwd, provider, flags.stack);
|
|
171
|
+
if (templates.length === 0) {
|
|
172
|
+
this.error(`Nenhuma stack encontrada para destruir. Rode: iacmp synth --provider ${provider}`);
|
|
173
|
+
}
|
|
174
|
+
let totalResources = 0;
|
|
175
|
+
const stackNames = [];
|
|
176
|
+
for (const t of templates) {
|
|
177
|
+
totalResources += countResources(t.filePath, provider);
|
|
178
|
+
stackNames.push(t.stackName);
|
|
179
|
+
}
|
|
180
|
+
this.log(`Stacks a destruir: ${stackNames.join(", ")}`);
|
|
181
|
+
this.log(`Total de recursos: ${totalResources} em ${provider.toUpperCase()}`);
|
|
182
|
+
this.log("");
|
|
183
|
+
if (!flags.force) {
|
|
184
|
+
const confirmed = await this.confirm("Tem certeza que deseja destruir esses recursos?");
|
|
185
|
+
if (!confirmed) {
|
|
186
|
+
this.log("Opera\xE7\xE3o cancelada.");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
this.log(`Would destroy ${totalResources} resource(s) from ${provider.toUpperCase()}`);
|
|
191
|
+
this.log("");
|
|
192
|
+
this.log("(MVP: destroy real n\xE3o implementado nesta fase)");
|
|
193
|
+
}
|
|
194
|
+
};
|