@oktis-works/cms 0.1.14 → 0.2.1
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/assets.d.ts +94 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +671 -0
- package/dist/assets.js.map +1 -0
- package/dist/bluegreen.d.ts +121 -0
- package/dist/bluegreen.d.ts.map +1 -0
- package/dist/bluegreen.js +393 -0
- package/dist/bluegreen.js.map +1 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +158 -61
- package/dist/commands.js.map +1 -1
- package/dist/config-wizard.d.ts +39 -0
- package/dist/config-wizard.d.ts.map +1 -0
- package/dist/config-wizard.js +308 -0
- package/dist/config-wizard.js.map +1 -0
- package/dist/deploy.d.ts +20 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +304 -0
- package/dist/deploy.js.map +1 -0
- package/dist/docker.d.ts +148 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +324 -0
- package/dist/docker.js.map +1 -0
- package/dist/docs-updater.d.ts +10 -0
- package/dist/docs-updater.d.ts.map +1 -0
- package/dist/docs-updater.js +45 -0
- package/dist/docs-updater.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +51 -0
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +45 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +200 -0
- package/dist/env-file.js.map +1 -0
- package/dist/env-schema.d.ts +28 -0
- package/dist/env-schema.d.ts.map +1 -0
- package/dist/env-schema.js +497 -0
- package/dist/env-schema.js.map +1 -0
- package/dist/guards.d.ts +40 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +159 -0
- package/dist/guards.js.map +1 -0
- package/dist/history.d.ts +48 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +104 -0
- package/dist/history.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +12 -3
- package/dist/parser.js.map +1 -1
- package/dist/project-config.js +2 -2
- package/dist/prompt.d.ts +81 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +379 -0
- package/dist/prompt.js.map +1 -0
- package/dist/redeploy.d.ts +109 -0
- package/dist/redeploy.d.ts.map +1 -0
- package/dist/redeploy.js +363 -0
- package/dist/redeploy.js.map +1 -0
- package/dist/rollback.d.ts +15 -0
- package/dist/rollback.d.ts.map +1 -0
- package/dist/rollback.js +170 -0
- package/dist/rollback.js.map +1 -0
- package/dist/scaffold-docs.d.ts +30 -6
- package/dist/scaffold-docs.d.ts.map +1 -1
- package/dist/scaffold-docs.js +728 -33
- package/dist/scaffold-docs.js.map +1 -1
- package/dist/scaffold.d.ts +17 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +77 -14
- package/dist/scaffold.js.map +1 -1
- package/dist/theme-build.d.ts +35 -0
- package/dist/theme-build.d.ts.map +1 -0
- package/dist/theme-build.js +86 -0
- package/dist/theme-build.js.map +1 -0
- package/dist/update.d.ts +52 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +273 -0
- package/dist/update.js.map +1 -0
- package/package.json +7 -7
package/dist/redeploy.js
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
// @oktis-works/cms - `okcms redeploy` (F4)
|
|
2
|
+
//
|
|
3
|
+
// Instalar plugin/tema no host ainda não muda o que está no ar:
|
|
4
|
+
//
|
|
5
|
+
// plugins e temas entram na imagem pelo `COPY . .` do Dockerfile (o
|
|
6
|
+
// `.dockerignore` os preserva de propósito) — sem rebuild, o container segue
|
|
7
|
+
// servindo a cópia antiga;
|
|
8
|
+
//
|
|
9
|
+
// `themes/<n>/dist/theme.css` só existe se o build de estilo rodou no host:
|
|
10
|
+
// o web linka esse arquivo pronto, ele não é compilado dentro do container;
|
|
11
|
+
//
|
|
12
|
+
// um plugin que mexe no banco traz SQL em `plugins/<n>/migrations/`, que
|
|
13
|
+
// precisa chegar em `migrations/` para o `db:migrate` aplicá-lo — o runner
|
|
14
|
+
// só lê UM diretório e classifica como PLUGIN todo owner que não é `core`
|
|
15
|
+
// (`V###__owner__nome.sql`, rastreado por `owner:version`).
|
|
16
|
+
//
|
|
17
|
+
// Redeploy = preparar no host (stage do SQL + build dos temas) e então
|
|
18
|
+
// delegar a troca ao mesmo blue/green do `okcms update --mode deploy`, só que
|
|
19
|
+
// sem `bun add`: o que mudou é conteúdo de extensão, não versão de pacote.
|
|
20
|
+
//
|
|
21
|
+
// Ordem e garantias são as do deploy normal: falha no preparo = nada foi
|
|
22
|
+
// buildado nem trocado; falha no deploy = rollback e a lane que estava
|
|
23
|
+
// servindo continua servindo.
|
|
24
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync } from 'node:fs';
|
|
25
|
+
import { dirname, join } from 'node:path';
|
|
26
|
+
import { deployBlueGreen } from './bluegreen.js';
|
|
27
|
+
import { assertHostOnly } from './guards.js';
|
|
28
|
+
import { loadProjectConfig } from './project-config.js';
|
|
29
|
+
import { Prompt } from './prompt.js';
|
|
30
|
+
import { buildThemeStylesOnDisk, resolveThemeStyle, themeManifestPath, } from './theme-build.js';
|
|
31
|
+
import { resolveDeployChoices } from './update.js';
|
|
32
|
+
/**
|
|
33
|
+
* Mesmo padrão de `parseMigrationName` (packages/database): qualquer `.sql`
|
|
34
|
+
* fora dele derruba `loadMigrationsFromDir` para TODAS as migrations do
|
|
35
|
+
* diretório — por isso nada fora do padrão é copiado para `migrations/`.
|
|
36
|
+
*/
|
|
37
|
+
export const MIGRATION_FILENAME = /^V\d+__\w+__.+\.sql$/;
|
|
38
|
+
function listDirs(dir) {
|
|
39
|
+
if (!existsSync(dir))
|
|
40
|
+
return [];
|
|
41
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
42
|
+
.filter((entry) => entry.isDirectory())
|
|
43
|
+
.map((entry) => entry.name)
|
|
44
|
+
.sort();
|
|
45
|
+
}
|
|
46
|
+
function listSql(dir) {
|
|
47
|
+
if (!existsSync(dir))
|
|
48
|
+
return [];
|
|
49
|
+
return readdirSync(dir)
|
|
50
|
+
.filter((file) => file.endsWith('.sql'))
|
|
51
|
+
.sort();
|
|
52
|
+
}
|
|
53
|
+
function sameContent(a, b) {
|
|
54
|
+
try {
|
|
55
|
+
return readFileSync(a, 'utf-8') === readFileSync(b, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Lê o estado de plugins/temas e devolve o que o redeploy faria. Só lê —
|
|
63
|
+
* nenhum byte é escrito aqui, o que torna `--dry-run` e os testes triviais.
|
|
64
|
+
*/
|
|
65
|
+
export function planRedeploy(opts = {}) {
|
|
66
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
67
|
+
const config = loadProjectConfig(cwd);
|
|
68
|
+
const pluginsDir = join(cwd, config.pluginsDir);
|
|
69
|
+
const themesDir = join(cwd, config.themesDir);
|
|
70
|
+
const migrationsDir = opts.migrationsDir ?? join(cwd, 'migrations');
|
|
71
|
+
const plugins = listDirs(pluginsDir);
|
|
72
|
+
const themes = listDirs(themesDir);
|
|
73
|
+
// ---- migrations de plugin ------------------------------------------------
|
|
74
|
+
const migrations = [];
|
|
75
|
+
const scopedPlugins = opts.plugin ? plugins.filter((name) => name === opts.plugin) : plugins;
|
|
76
|
+
for (const plugin of scopedPlugins) {
|
|
77
|
+
const dir = join(pluginsDir, plugin, 'migrations');
|
|
78
|
+
for (const file of listSql(dir)) {
|
|
79
|
+
const source = join(dir, file);
|
|
80
|
+
const target = join(migrationsDir, file);
|
|
81
|
+
let status;
|
|
82
|
+
if (!MIGRATION_FILENAME.test(file))
|
|
83
|
+
status = 'invalid';
|
|
84
|
+
else if (!existsSync(target))
|
|
85
|
+
status = 'new';
|
|
86
|
+
else if (sameContent(source, target))
|
|
87
|
+
status = 'staged';
|
|
88
|
+
else
|
|
89
|
+
status = 'conflict';
|
|
90
|
+
migrations.push({ plugin, file, source, target, status });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ---- build de tema -------------------------------------------------------
|
|
94
|
+
const themeBuilds = [];
|
|
95
|
+
const scopedThemes = opts.theme ? themes.filter((name) => name === opts.theme) : themes;
|
|
96
|
+
for (const theme of scopedThemes) {
|
|
97
|
+
const manifestPath = themeManifestPath(themesDir, theme);
|
|
98
|
+
if (!manifestPath) {
|
|
99
|
+
themeBuilds.push({
|
|
100
|
+
theme,
|
|
101
|
+
manifestPath: null,
|
|
102
|
+
engine: '-',
|
|
103
|
+
output: 'dist/theme.css',
|
|
104
|
+
entry: null,
|
|
105
|
+
status: 'missing-manifest',
|
|
106
|
+
problems: [],
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const resolved = resolveThemeStyle(themesDir, theme);
|
|
111
|
+
if (!resolved) {
|
|
112
|
+
themeBuilds.push({
|
|
113
|
+
theme,
|
|
114
|
+
manifestPath,
|
|
115
|
+
engine: '-',
|
|
116
|
+
output: 'dist/theme.css',
|
|
117
|
+
entry: null,
|
|
118
|
+
status: 'invalid-manifest',
|
|
119
|
+
problems: ['manifesto não é um JSON válido'],
|
|
120
|
+
});
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
// O ThemeLoader recusa manifesto sem name/version — buildar seria trabalho
|
|
124
|
+
// jogado fora.
|
|
125
|
+
const problems = [];
|
|
126
|
+
if (typeof resolved.manifest['name'] !== 'string' ||
|
|
127
|
+
typeof resolved.manifest['version'] !== 'string') {
|
|
128
|
+
problems.push('manifesto sem "name" e/ou "version"');
|
|
129
|
+
}
|
|
130
|
+
problems.push(...resolved.report.errors);
|
|
131
|
+
const { report } = resolved;
|
|
132
|
+
themeBuilds.push({
|
|
133
|
+
theme,
|
|
134
|
+
manifestPath,
|
|
135
|
+
engine: report.engine,
|
|
136
|
+
output: report.output,
|
|
137
|
+
entry: report.entry,
|
|
138
|
+
status: problems.length > 0 ? 'invalid-manifest' : report.entry ? 'build' : 'no-entry',
|
|
139
|
+
problems,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// ---- higiene do diretório canônico de migrations --------------------------
|
|
143
|
+
const invalidExisting = listSql(migrationsDir).filter((file) => !MIGRATION_FILENAME.test(file));
|
|
144
|
+
return { plugins, themes, migrations, themeBuilds, invalidExisting };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Copia o SQL de plugin para `migrations/` (o único diretório que o runner
|
|
148
|
+
* lê). Idempotente: arquivo idêntico não é tocado, arquivo divergente é
|
|
149
|
+
* PRESERVADO — `migrations/` pertence ao operador e a versão aplicada no
|
|
150
|
+
* banco já tem checksum registrado.
|
|
151
|
+
*/
|
|
152
|
+
export function stagePluginMigrations(plan) {
|
|
153
|
+
const result = { copied: [], already: [], conflicts: [], invalid: [] };
|
|
154
|
+
for (const entry of plan.migrations) {
|
|
155
|
+
if (entry.status === 'invalid') {
|
|
156
|
+
result.invalid.push(`${entry.plugin}: ${entry.file}`);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (entry.status === 'conflict') {
|
|
160
|
+
result.conflicts.push(`${entry.plugin}: ${entry.file}`);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (entry.status === 'staged') {
|
|
164
|
+
result.already.push(`${entry.plugin}: ${entry.file}`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
mkdirSync(dirname(entry.target), { recursive: true });
|
|
168
|
+
copyFileSync(entry.source, entry.target);
|
|
169
|
+
result.copied.push(`${entry.plugin}: ${entry.file}`);
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
/** Linhas do resumo do redeploy — puras, para `--dry-run` e para os testes. */
|
|
174
|
+
export function renderPlan(plan, opts = {}) {
|
|
175
|
+
const lines = [];
|
|
176
|
+
lines.push(`plugins: ${plan.plugins.length > 0 ? plan.plugins.join(', ') : 'nenhum'}`);
|
|
177
|
+
lines.push(`temas: ${plan.themes.length > 0 ? plan.themes.join(', ') : 'nenhum'}`);
|
|
178
|
+
if (opts.skipMigrations) {
|
|
179
|
+
lines.push('migrations de plugin: puladas (--skip-migrations)');
|
|
180
|
+
}
|
|
181
|
+
else if (plan.migrations.length === 0) {
|
|
182
|
+
lines.push('migrations de plugin: nenhuma');
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
lines.push('migrations de plugin (plugins/*/migrations → migrations/):');
|
|
186
|
+
for (const entry of plan.migrations) {
|
|
187
|
+
const who = `${entry.plugin}: ${entry.file}`;
|
|
188
|
+
if (entry.status === 'new')
|
|
189
|
+
lines.push(` + ${who} → migrations/ (novo)`);
|
|
190
|
+
else if (entry.status === 'staged')
|
|
191
|
+
lines.push(` = ${who} (já em migrations/)`);
|
|
192
|
+
else if (entry.status === 'conflict')
|
|
193
|
+
lines.push(` ! ${who} difere do que já está em migrations/ — mantido o do projeto`);
|
|
194
|
+
else
|
|
195
|
+
lines.push(` ! ${who} fora do padrão V###__owner__nome.sql — não copiado`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (opts.skipThemeBuild) {
|
|
199
|
+
lines.push('build de tema: pulado (--skip-theme-build)');
|
|
200
|
+
}
|
|
201
|
+
else if (plan.themeBuilds.length === 0) {
|
|
202
|
+
lines.push('build de tema: nenhum tema instalado');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
lines.push('build de tema:');
|
|
206
|
+
for (const entry of plan.themeBuilds) {
|
|
207
|
+
if (entry.status === 'build') {
|
|
208
|
+
lines.push(` ✓ ${entry.theme} — ${entry.engine} → ${entry.output}`);
|
|
209
|
+
}
|
|
210
|
+
else if (entry.status === 'no-entry') {
|
|
211
|
+
lines.push(` - ${entry.theme} — sem entrada de estilo (${entry.engine})`);
|
|
212
|
+
}
|
|
213
|
+
else if (entry.status === 'missing-manifest') {
|
|
214
|
+
lines.push(` ! ${entry.theme} — sem theme.json`);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
lines.push(` ! ${entry.theme} — manifest recusado: ${entry.problems.join('; ')}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
for (const file of plan.invalidExisting) {
|
|
222
|
+
lines.push(` ! migrations/${file} fora do padrão V###__owner__nome.sql — quebra todo db:migrate`);
|
|
223
|
+
}
|
|
224
|
+
lines.push('ordem: stage no host → build da imagem → migrations → health → swap → worker → down');
|
|
225
|
+
return lines;
|
|
226
|
+
}
|
|
227
|
+
export async function runRedeploy(opts = {}) {
|
|
228
|
+
const prompt = opts.prompt ?? new Prompt();
|
|
229
|
+
const ownsPrompt = opts.prompt === undefined;
|
|
230
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
231
|
+
const write = opts.log ?? ((message) => prompt.write(message));
|
|
232
|
+
// Mesmo motivo do `okcms update`: dentro de um container a CLI viraria um
|
|
233
|
+
// executor de `bun add` na rede do banco, com o .env na mão.
|
|
234
|
+
const guard = assertHostOnly('okcms redeploy', { force: opts.force, probe: opts.probe });
|
|
235
|
+
if (!guard.ok) {
|
|
236
|
+
console.error(guard.message);
|
|
237
|
+
if (ownsPrompt)
|
|
238
|
+
prompt.close();
|
|
239
|
+
return 1;
|
|
240
|
+
}
|
|
241
|
+
const onInterrupt = () => {
|
|
242
|
+
prompt.write(`\n interrompido — nenhuma troca de lane em andamento foi registrada.\n`);
|
|
243
|
+
process.exit(130);
|
|
244
|
+
};
|
|
245
|
+
process.once('SIGINT', onInterrupt);
|
|
246
|
+
try {
|
|
247
|
+
const plan = planRedeploy({ cwd, plugin: opts.plugin, theme: opts.theme });
|
|
248
|
+
const config = loadProjectConfig(cwd);
|
|
249
|
+
const themesDir = join(cwd, config.themesDir);
|
|
250
|
+
if (opts.plugin && !plan.plugins.includes(opts.plugin)) {
|
|
251
|
+
prompt.error(`plugin não encontrado: ${opts.plugin}`);
|
|
252
|
+
prompt.info(`instalados: ${plan.plugins.join(', ') || 'nenhum'}`);
|
|
253
|
+
return 1;
|
|
254
|
+
}
|
|
255
|
+
if (opts.theme && !plan.themes.includes(opts.theme)) {
|
|
256
|
+
prompt.error(`tema não encontrado: ${opts.theme}`);
|
|
257
|
+
prompt.info(`instalados: ${plan.themes.join(', ') || 'nenhum'}`);
|
|
258
|
+
return 1;
|
|
259
|
+
}
|
|
260
|
+
prompt.heading('OkCMS redeploy');
|
|
261
|
+
for (const line of renderPlan(plan, opts))
|
|
262
|
+
write(`${line}\n`);
|
|
263
|
+
// `.sql` inválido em migrations/ derruba o `db:migrate` do passo 5 do
|
|
264
|
+
// deploy. Falhar aqui é melhor que falhar no meio do blue/green.
|
|
265
|
+
if (plan.invalidExisting.length > 0) {
|
|
266
|
+
prompt.error(`${plan.invalidExisting.length} arquivo(s) em migrations/ fora do padrão ` +
|
|
267
|
+
`V###__owner__nome.sql — o db:migrate falharia. Renomeie ou remova.`);
|
|
268
|
+
return 1;
|
|
269
|
+
}
|
|
270
|
+
if (opts.dryRun) {
|
|
271
|
+
prompt.info('dry-run: nada foi executado.');
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
const choices = await resolveDeployChoices(opts, prompt);
|
|
275
|
+
const interactive = prompt.interactive && opts.yes !== true;
|
|
276
|
+
if (interactive) {
|
|
277
|
+
prompt.heading('Resumo do redeploy');
|
|
278
|
+
prompt.info(`stage: ${plan.migrations.filter((m) => m.status === 'new').length} migration(s) de plugin`);
|
|
279
|
+
prompt.info(`build de estilo: ${plan.themeBuilds.filter((t) => t.status === 'build').length} tema(s)`);
|
|
280
|
+
prompt.info(`imagem: ${choices.noCache ? 'sem cache' : 'com cache de camadas'}`);
|
|
281
|
+
prompt.info(`órfãos da lane antiga: ${choices.removeOrphans ? 'remover' : 'manter'}`);
|
|
282
|
+
const confirmed = await prompt.confirm('Iniciar redeploy?', { defaultValue: true });
|
|
283
|
+
if (!confirmed) {
|
|
284
|
+
prompt.warn('cancelado — nada foi executado.');
|
|
285
|
+
return 0;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// ---- stage de migrations ----------------------------------------------
|
|
289
|
+
if (opts.skipMigrations) {
|
|
290
|
+
const pending = plan.migrations.filter((m) => m.status === 'new').length;
|
|
291
|
+
if (pending > 0) {
|
|
292
|
+
prompt.warn(`${pending} migration(s) de plugin não copiadas (--skip-migrations).`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
const staged = stagePluginMigrations(plan);
|
|
297
|
+
for (const item of staged.copied)
|
|
298
|
+
write(` + migrations: ${item}\n`);
|
|
299
|
+
if (staged.copied.length > 0) {
|
|
300
|
+
prompt.success(`${staged.copied.length} migration(s) de plugin em migrations/`);
|
|
301
|
+
}
|
|
302
|
+
for (const item of staged.conflicts)
|
|
303
|
+
prompt.warn(`conflito (mantido o do projeto): ${item}`);
|
|
304
|
+
for (const item of staged.invalid)
|
|
305
|
+
prompt.warn(`fora do padrão, não copiada: ${item}`);
|
|
306
|
+
}
|
|
307
|
+
// ---- build de estilo ---------------------------------------------------
|
|
308
|
+
const toBuild = plan.themeBuilds.filter((entry) => entry.status === 'build');
|
|
309
|
+
if (opts.skipThemeBuild) {
|
|
310
|
+
if (toBuild.length > 0) {
|
|
311
|
+
prompt.warn(`${toBuild.length} tema(s) sem build de estilo (--skip-theme-build).`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
for (const entry of toBuild) {
|
|
316
|
+
try {
|
|
317
|
+
const outcome = await buildThemeStylesOnDisk(themesDir, entry.theme);
|
|
318
|
+
for (const warning of outcome.warnings)
|
|
319
|
+
prompt.warn(`${entry.theme}: ${warning}`);
|
|
320
|
+
write(` ✓ tema ${outcome.theme}: ${outcome.engine} → ${outcome.output} ` +
|
|
321
|
+
`(${outcome.bytes} bytes, isolated=${outcome.isolated})\n`);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
prompt.error(`build do tema ${entry.theme} falhou: ${error instanceof Error ? error.message : String(error)}`);
|
|
325
|
+
prompt.warn('nada foi buildado nem trocado — a lane atual segue no ar.');
|
|
326
|
+
return 1;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
for (const entry of plan.themeBuilds) {
|
|
330
|
+
if (entry.status === 'missing-manifest') {
|
|
331
|
+
prompt.warn(`${entry.theme}: sem theme.json — ignorado.`);
|
|
332
|
+
}
|
|
333
|
+
else if (entry.status === 'invalid-manifest') {
|
|
334
|
+
prompt.warn(`${entry.theme}: manifest recusado — ${entry.problems.join('; ')}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// ---- deploy blue/green -------------------------------------------------
|
|
339
|
+
const result = await deployBlueGreen({
|
|
340
|
+
cwd,
|
|
341
|
+
runner: opts.runner,
|
|
342
|
+
choices,
|
|
343
|
+
// Sem `bun add`: o que mudou é conteúdo de extensão, não versão de
|
|
344
|
+
// pacote. Só instala tudo quando o host nem tem node_modules — sem ele
|
|
345
|
+
// o `db:migrate` do passo 5 não tem como rodar.
|
|
346
|
+
packages: [],
|
|
347
|
+
installAll: !existsSync(join(cwd, 'node_modules', '@oktis-works')),
|
|
348
|
+
log: write,
|
|
349
|
+
warn: write,
|
|
350
|
+
});
|
|
351
|
+
if (result.ok) {
|
|
352
|
+
prompt.success(`redeploy concluído na lane ${result.lane}` +
|
|
353
|
+
(result.previousLane ? ` (lane anterior: ${result.previousLane})` : ''));
|
|
354
|
+
}
|
|
355
|
+
return result.ok ? 0 : 1;
|
|
356
|
+
}
|
|
357
|
+
finally {
|
|
358
|
+
process.removeListener('SIGINT', onInterrupt);
|
|
359
|
+
if (ownsPrompt)
|
|
360
|
+
prompt.close();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=redeploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../src/redeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Prompt } from './prompt.js';
|
|
2
|
+
import { defaultRunner } from './docker.js';
|
|
3
|
+
export interface RollbackOptions {
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** ID da entrada do histórico (se omitido, abre menu interativo). */
|
|
6
|
+
id?: number;
|
|
7
|
+
/** `--yes`: confirma sem prompt. */
|
|
8
|
+
yes?: boolean;
|
|
9
|
+
/** `--force`: permite rodar dentro de container (não recomendado). */
|
|
10
|
+
force?: boolean;
|
|
11
|
+
prompt?: Prompt;
|
|
12
|
+
runner?: typeof defaultRunner;
|
|
13
|
+
}
|
|
14
|
+
export declare function runRollback(opts?: RollbackOptions): Promise<number>;
|
|
15
|
+
//# sourceMappingURL=rollback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../src/rollback.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,aAAa,CAAC;CAC/B;AA8HD,wBAAsB,WAAW,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE7E"}
|
package/dist/rollback.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// @oktis-works/cms - `okcms rollback` (histórico + rollback)
|
|
2
|
+
//
|
|
3
|
+
// Lista o histórico de updates/deploys e permite voltar para um estado anterior.
|
|
4
|
+
// O rollback de "download" restaura package.json (requer reinstall).
|
|
5
|
+
// O rollback de "deploy" troca a lane ativa no proxy (blue <-> green).
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { Prompt } from './prompt.js';
|
|
9
|
+
import { listHistory, getHistoryEntry } from './history.js';
|
|
10
|
+
import { reloadProxy, writeUpstreams } from './docker.js';
|
|
11
|
+
import { defaultRunner } from './docker.js';
|
|
12
|
+
import { loadEnvFile } from './env-file.js';
|
|
13
|
+
function printHistory(cwd) {
|
|
14
|
+
const entries = listHistory(cwd);
|
|
15
|
+
if (entries.length === 0) {
|
|
16
|
+
console.log('Histórico vazio.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log('\nHistórico de updates/deploys (mais recente primeiro):\n');
|
|
20
|
+
for (const entry of entries) {
|
|
21
|
+
console.log(entry.id + '. ' + entry.at.split('T')[0] + ' ' + entry.at.split('T')[1]?.slice(0, 8));
|
|
22
|
+
console.log(' ' + entry.mode + ': ' + entry.message);
|
|
23
|
+
if (entry.packages && entry.packages.length > 0) {
|
|
24
|
+
for (const p of entry.packages) {
|
|
25
|
+
console.log(` @oktis-works/${p.name}: ${p.from} → ${p.to}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (entry.lane) {
|
|
29
|
+
console.log(` lane: ${entry.lane}${entry.previousLane ? ` (era ${entry.previousLane})` : ''}`);
|
|
30
|
+
}
|
|
31
|
+
console.log('');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Executa rollback de download: restaura package.json e orienta reinstall. */
|
|
35
|
+
async function rollbackDownload(cwd, entry, prompt) {
|
|
36
|
+
const pkgPath = join(cwd, 'package.json');
|
|
37
|
+
if (!existsSync(pkgPath)) {
|
|
38
|
+
prompt.error('package.json não encontrado.');
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
const currentPkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
42
|
+
let changed = false;
|
|
43
|
+
if (entry.packages) {
|
|
44
|
+
for (const p of entry.packages) {
|
|
45
|
+
const depName = `@oktis-works/${p.name}`;
|
|
46
|
+
for (const depType of ['dependencies', 'devDependencies', 'optionalDependencies']) {
|
|
47
|
+
if (currentPkg[depType]?.[depName]) {
|
|
48
|
+
currentPkg[depType][depName] = p.from;
|
|
49
|
+
changed = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (!changed) {
|
|
55
|
+
prompt.warn('Nenhuma dependência @oktis-works/* para reverter no package.json.');
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
writeFileSync(pkgPath, JSON.stringify(currentPkg, null, 2) + '\n', 'utf-8');
|
|
59
|
+
prompt.success('package.json revertido para versões anteriores.');
|
|
60
|
+
prompt.info('Execute `bun install` (ou `npm install`) para aplicar o rollback.');
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
/** Executa rollback de deploy: troca a lane ativa no proxy. */
|
|
64
|
+
async function rollbackDeploy(cwd, entry, prompt, runner) {
|
|
65
|
+
if (!entry.previousLane) {
|
|
66
|
+
prompt.error('Não há lane anterior para rollback (primeiro deploy?).');
|
|
67
|
+
return 1;
|
|
68
|
+
}
|
|
69
|
+
const targetLane = entry.previousLane;
|
|
70
|
+
const currentLane = entry.lane;
|
|
71
|
+
prompt.heading(`Rollback de deploy: ${currentLane} → ${targetLane}`);
|
|
72
|
+
prompt.info('Trocando o proxy para a lane anterior...');
|
|
73
|
+
const record = loadEnvFile(join(cwd, '.env')).toRecord();
|
|
74
|
+
writeUpstreams(cwd, targetLane, record);
|
|
75
|
+
const reloaded = reloadProxy(cwd, runner);
|
|
76
|
+
if (!reloaded.ok) {
|
|
77
|
+
prompt.error('Falha ao recarregar nginx: ' + reloaded.stderr);
|
|
78
|
+
return 1;
|
|
79
|
+
}
|
|
80
|
+
// Atualiza estado da lane
|
|
81
|
+
const statePath = join(cwd, '.deploy', 'state.json');
|
|
82
|
+
let state = { lane: targetLane, previousLane: currentLane, version: '', at: new Date().toISOString(), history: [] };
|
|
83
|
+
try {
|
|
84
|
+
const raw = readFileSync(statePath, 'utf-8');
|
|
85
|
+
state = JSON.parse(raw);
|
|
86
|
+
}
|
|
87
|
+
catch { }
|
|
88
|
+
state.lane = targetLane;
|
|
89
|
+
state.previousLane = currentLane;
|
|
90
|
+
state.at = new Date().toISOString();
|
|
91
|
+
const { writeLaneState } = await import('./docker.js');
|
|
92
|
+
writeLaneState(cwd, state);
|
|
93
|
+
prompt.success(`Rollback concluído. Lane ativa: ${targetLane}`);
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
/** Executa rollback de PM2: restaura ecosystem.config.js anterior (se houver snapshot). */
|
|
97
|
+
async function rollbackPm2(cwd, entry, prompt) {
|
|
98
|
+
if (!entry.packageJsonSnapshot) {
|
|
99
|
+
prompt.error('Sem snapshot de package.json para rollback PM2.');
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
const pkgPath = join(cwd, 'package.json');
|
|
103
|
+
writeFileSync(pkgPath, entry.packageJsonSnapshot, 'utf-8');
|
|
104
|
+
prompt.success('package.json restaurado. Rode `bun install` e `pm2 reload all`.');
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
export async function runRollback(opts = {}) {
|
|
108
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
109
|
+
const prompt = opts.prompt ?? new Prompt();
|
|
110
|
+
const ownsPrompt = opts.prompt === undefined;
|
|
111
|
+
const runner = opts.runner ?? defaultRunner;
|
|
112
|
+
const guard = (await import('./guards.js')).assertHostOnly('okcms rollback', { force: opts.force });
|
|
113
|
+
if (!guard.ok) {
|
|
114
|
+
console.error(guard.message);
|
|
115
|
+
if (ownsPrompt)
|
|
116
|
+
prompt.close();
|
|
117
|
+
return 1;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const entries = listHistory(cwd);
|
|
121
|
+
if (entries.length === 0) {
|
|
122
|
+
prompt.warn('Histórico vazio — nada para fazer rollback.');
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
let targetId = opts.id;
|
|
126
|
+
if (targetId === undefined) {
|
|
127
|
+
printHistory(cwd);
|
|
128
|
+
targetId = await prompt.select('Escolha o estado para rollback (mais recente = 1):', entries.map((e) => ({
|
|
129
|
+
value: e.id,
|
|
130
|
+
label: `#${e.id} ${e.at.slice(0, 19).replace('T', ' ')} — ${e.mode}: ${e.message}`,
|
|
131
|
+
})), { defaultValue: entries[0]?.id });
|
|
132
|
+
}
|
|
133
|
+
const entry = getHistoryEntry(cwd, targetId);
|
|
134
|
+
if (!entry) {
|
|
135
|
+
prompt.error(`Entrada #${targetId} não encontrada no histórico.`);
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
if (!opts.yes) {
|
|
139
|
+
const confirmed = await prompt.confirm(`Confirmar rollback para #${entry.id} (${entry.mode}: ${entry.message})?`, { defaultValue: false });
|
|
140
|
+
if (!confirmed) {
|
|
141
|
+
prompt.info('Cancelado.');
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
let code;
|
|
146
|
+
switch (entry.mode) {
|
|
147
|
+
case 'download':
|
|
148
|
+
code = await rollbackDownload(cwd, entry, prompt);
|
|
149
|
+
break;
|
|
150
|
+
case 'deploy':
|
|
151
|
+
code = await rollbackDeploy(cwd, entry, prompt, runner);
|
|
152
|
+
break;
|
|
153
|
+
case 'pm2':
|
|
154
|
+
code = await rollbackPm2(cwd, entry, prompt);
|
|
155
|
+
break;
|
|
156
|
+
default:
|
|
157
|
+
prompt.error(`Modo desconhecido: ${entry.mode}`);
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
if (code === 0) {
|
|
161
|
+
prompt.success('Rollback concluído com sucesso.');
|
|
162
|
+
}
|
|
163
|
+
return code;
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
if (ownsPrompt)
|
|
167
|
+
prompt.close();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=rollback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../src/rollback.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold-docs.d.ts
CHANGED
|
@@ -1,7 +1,31 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export
|
|
3
|
-
/**
|
|
4
|
-
export declare const
|
|
5
|
-
/**
|
|
6
|
-
|
|
1
|
+
/** Língua da documentação gerada no scaffold. */
|
|
2
|
+
export type DocsLang = 'en' | 'pt';
|
|
3
|
+
/** Línguas suportadas (ordem = ordem do menu do init). */
|
|
4
|
+
export declare const DOCS_LANGS: DocsLang[];
|
|
5
|
+
/**
|
|
6
|
+
* Default: inglês — é o que o Enter do prompt escolhe e o único valor em
|
|
7
|
+
* modo não-interativo (CI/scripts), onde o prompt nunca aparece.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_DOCS_LANG: DocsLang;
|
|
10
|
+
/**
|
|
11
|
+
* Normaliza o valor de `--lang`. Devolve `null` para valor desconhecido (ou
|
|
12
|
+
* vazio): o chamador decide entre erro (flag explícita) e default (flag ausente).
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseDocsLang(value: string | undefined | null): DocsLang | null;
|
|
15
|
+
/** Rótulo legível da língua (mensagens da CLI). */
|
|
16
|
+
export declare function docsLangLabel(lang: DocsLang): string;
|
|
17
|
+
/**
|
|
18
|
+
* Detecta a língua do projeto lendo o README.md existente.
|
|
19
|
+
* Usado pelo `okcms update`/`deploy` para atualizar docs na língua certa.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectProjectDocsLang(cwd: string): 'en' | 'pt';
|
|
22
|
+
/**
|
|
23
|
+
* README.md do projeto scaffoldado, na língua escolhida no \`okcms init\`.
|
|
24
|
+
* Default \`en\` (Enter do prompt e único valor em modo não-interativo).
|
|
25
|
+
*/
|
|
26
|
+
export declare function projectReadme(projectName: string, lang?: DocsLang): string;
|
|
27
|
+
/** PLUGIN.md na língua pedida. */
|
|
28
|
+
export declare function pluginDoc(lang?: DocsLang): string;
|
|
29
|
+
/** THEME.md na língua pedida. */
|
|
30
|
+
export declare function themeDoc(lang?: DocsLang): string;
|
|
7
31
|
//# sourceMappingURL=scaffold-docs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-docs.d.ts","sourceRoot":"","sources":["../src/scaffold-docs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaffold-docs.d.ts","sourceRoot":"","sources":["../src/scaffold-docs.ts"],"names":[],"mappings":"AAiBA,iDAAiD;AACjD,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,0DAA0D;AAC1D,eAAO,MAAM,UAAU,EAAE,QAAQ,EAAiB,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAe,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAW/E;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQ9D;AAsgCD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,QAA4B,GACjC,MAAM,CAER;AAED,kCAAkC;AAClC,wBAAgB,SAAS,CAAC,IAAI,GAAE,QAA4B,GAAG,MAAM,CAEpE;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,IAAI,GAAE,QAA4B,GAAG,MAAM,CAEnE"}
|