@oktis-works/cms 0.1.14 → 0.2.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.
Files changed (65) hide show
  1. package/dist/assets.d.ts +94 -0
  2. package/dist/assets.d.ts.map +1 -0
  3. package/dist/assets.js +671 -0
  4. package/dist/assets.js.map +1 -0
  5. package/dist/bluegreen.d.ts +121 -0
  6. package/dist/bluegreen.d.ts.map +1 -0
  7. package/dist/bluegreen.js +393 -0
  8. package/dist/bluegreen.js.map +1 -0
  9. package/dist/commands.d.ts +6 -0
  10. package/dist/commands.d.ts.map +1 -1
  11. package/dist/commands.js +116 -61
  12. package/dist/commands.js.map +1 -1
  13. package/dist/config-wizard.d.ts +39 -0
  14. package/dist/config-wizard.d.ts.map +1 -0
  15. package/dist/config-wizard.js +308 -0
  16. package/dist/config-wizard.js.map +1 -0
  17. package/dist/docker.d.ts +148 -0
  18. package/dist/docker.d.ts.map +1 -0
  19. package/dist/docker.js +324 -0
  20. package/dist/docker.js.map +1 -0
  21. package/dist/doctor.d.ts +2 -0
  22. package/dist/doctor.d.ts.map +1 -1
  23. package/dist/doctor.js +51 -0
  24. package/dist/doctor.js.map +1 -1
  25. package/dist/env-file.d.ts +45 -0
  26. package/dist/env-file.d.ts.map +1 -0
  27. package/dist/env-file.js +200 -0
  28. package/dist/env-file.js.map +1 -0
  29. package/dist/env-schema.d.ts +28 -0
  30. package/dist/env-schema.d.ts.map +1 -0
  31. package/dist/env-schema.js +497 -0
  32. package/dist/env-schema.js.map +1 -0
  33. package/dist/guards.d.ts +40 -0
  34. package/dist/guards.d.ts.map +1 -0
  35. package/dist/guards.js +159 -0
  36. package/dist/guards.js.map +1 -0
  37. package/dist/parser.d.ts.map +1 -1
  38. package/dist/parser.js +12 -3
  39. package/dist/parser.js.map +1 -1
  40. package/dist/project-config.js +2 -2
  41. package/dist/prompt.d.ts +81 -0
  42. package/dist/prompt.d.ts.map +1 -0
  43. package/dist/prompt.js +379 -0
  44. package/dist/prompt.js.map +1 -0
  45. package/dist/redeploy.d.ts +109 -0
  46. package/dist/redeploy.d.ts.map +1 -0
  47. package/dist/redeploy.js +363 -0
  48. package/dist/redeploy.js.map +1 -0
  49. package/dist/scaffold-docs.d.ts +25 -6
  50. package/dist/scaffold-docs.d.ts.map +1 -1
  51. package/dist/scaffold-docs.js +711 -33
  52. package/dist/scaffold-docs.js.map +1 -1
  53. package/dist/scaffold.d.ts +17 -1
  54. package/dist/scaffold.d.ts.map +1 -1
  55. package/dist/scaffold.js +77 -14
  56. package/dist/scaffold.js.map +1 -1
  57. package/dist/theme-build.d.ts +35 -0
  58. package/dist/theme-build.d.ts.map +1 -0
  59. package/dist/theme-build.js +86 -0
  60. package/dist/theme-build.js.map +1 -0
  61. package/dist/update.d.ts +51 -0
  62. package/dist/update.d.ts.map +1 -0
  63. package/dist/update.js +210 -0
  64. package/dist/update.js.map +1 -0
  65. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-docs.js","sourceRoot":"","sources":["../src/scaffold-docs.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,wEAAwE;AACxE,gFAAgF;AAEhF,wCAAwC;AACxC,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoMxB,CAAC;AACF,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFzB,CAAC;AAEF,mDAAmD;AACnD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGxB,CAAC"}
1
+ {"version":3,"file":"scaffold-docs.js","sourceRoot":"","sources":["../src/scaffold-docs.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,23 @@
1
1
  import { spawnSync } from 'node:child_process';
2
+ import type { DocsLang } from './scaffold-docs.js';
2
3
  /** Normaliza o nome do projeto para um npm name válido (slug). */
3
4
  export declare function toPackageName(name: string): string;
4
- export declare function scaffoldProject(targetDir: string, name: string): Promise<string>;
5
+ /**
6
+ * Range que o projeto usa para os 5 pacotes do OkCMS (4 apps + a própria CLI).
7
+ *
8
+ * Por que não `^0.2.0` (o minor da CLI):
9
+ * `^0.2.0` em 0.x é `>=0.2.0 <0.3.0` — se os apps ainda não foram publicados
10
+ * nesse minor (mudanças no `ignore` do changeset, como admin/web, podem ficar
11
+ * um release atrás), o `bun install` do scaffold cai em ETARGET. Foi
12
+ * exatamente esse o bug de 0.1.14 → 0.2.0.
13
+ *
14
+ * A janela é de DOIS minors em 0.x — para cima e para baixo — então o npm/bun
15
+ * sempre acha a versão mais nova publicada dentro dela. Como os cinco
16
+ * pacotes compartilham o MESMO range, eles também ficam consistentes entre si.
17
+ * A partir de 1.x vira `^MAJOR.0.0` (compatibilidade semântica madura).
18
+ */
19
+ export declare function appRangeFor(cliVersion: string): string;
20
+ export declare function scaffoldProject(targetDir: string, name: string, lang?: DocsLang): Promise<string>;
5
21
  export interface InstallResult {
6
22
  ok: boolean;
7
23
  tool: string;
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAM/C,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsKtF;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,SAAS,CAAA;CAAO,GACzC,aAAa,CAmBf"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAWtD;AAoBD,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,QAA4B,GACjC,OAAO,CAAC,MAAM,CAAC,CAwLjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,SAAS,CAAA;CAAO,GACzC,aAAa,CAmBf"}
package/dist/scaffold.js CHANGED
@@ -1,9 +1,12 @@
1
1
  // @oktis-works/cms - Project Scaffolding
2
2
  import { spawnSync } from 'node:child_process';
3
- import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
4
  import { existsSync } from 'node:fs';
5
5
  import { join, resolve } from 'node:path';
6
6
  import { defaultProjectConfig, DEFAULT_CONFIG_FILENAME } from './project-config.js';
7
+ import { DEPLOY_GITIGNORE } from './assets.js';
8
+ import { writeDeployAssets } from './bluegreen.js';
9
+ import { DEFAULT_DOCS_LANG, docsLangLabel, pluginDoc, projectReadme, themeDoc } from './scaffold-docs.js';
7
10
  /** Normaliza o nome do projeto para um npm name válido (slug). */
8
11
  export function toPackageName(name) {
9
12
  const slug = name
@@ -12,7 +15,51 @@ export function toPackageName(name) {
12
15
  .replace(/^[-.]+|[-.]+$/g, '');
13
16
  return slug.length > 0 ? slug : 'okcms-project';
14
17
  }
15
- export async function scaffoldProject(targetDir, name) {
18
+ /**
19
+ * Range que o projeto usa para os 5 pacotes do OkCMS (4 apps + a própria CLI).
20
+ *
21
+ * Por que não `^0.2.0` (o minor da CLI):
22
+ * `^0.2.0` em 0.x é `>=0.2.0 <0.3.0` — se os apps ainda não foram publicados
23
+ * nesse minor (mudanças no `ignore` do changeset, como admin/web, podem ficar
24
+ * um release atrás), o `bun install` do scaffold cai em ETARGET. Foi
25
+ * exatamente esse o bug de 0.1.14 → 0.2.0.
26
+ *
27
+ * A janela é de DOIS minors em 0.x — para cima e para baixo — então o npm/bun
28
+ * sempre acha a versão mais nova publicada dentro dela. Como os cinco
29
+ * pacotes compartilham o MESMO range, eles também ficam consistentes entre si.
30
+ * A partir de 1.x vira `^MAJOR.0.0` (compatibilidade semântica madura).
31
+ */
32
+ export function appRangeFor(cliVersion) {
33
+ const [rawMajor, rawMinor] = cliVersion.split('.');
34
+ const major = Number(rawMajor);
35
+ const minor = Number(rawMinor);
36
+ if (!Number.isInteger(major) || !Number.isInteger(minor) || major < 0 || minor < 0) {
37
+ // versão ilegível → cai no comportamento histórico em vez de quebrar o init
38
+ return `^${cliVersion}`;
39
+ }
40
+ if (major > 0)
41
+ return `>=${major}.0.0 <${major + 1}.0.0`;
42
+ const lower = minor > 0 ? minor - 1 : 0;
43
+ return `>=0.${lower}.0 <0.${minor + 1}.0`;
44
+ }
45
+ /**
46
+ * Acrescenta ao `.gitignore` do projeto só o que ainda não está lá.
47
+ *
48
+ * `okcms init` pode rodar num diretório que o operador já versionou — reescrever
49
+ * o arquivo apagaria as regras dele. Por isso é merge, sempre.
50
+ */
51
+ async function mergeGitignore(root, entries) {
52
+ const path = join(root, '.gitignore');
53
+ const current = existsSync(path) ? await readFile(path, 'utf-8') : '';
54
+ const present = new Set(current.split(/\r?\n/).map((line) => line.trim()));
55
+ const missing = entries.filter((entry) => !present.has(entry));
56
+ if (missing.length === 0)
57
+ return;
58
+ const body = current.length === 0 ? '' : `${current.replace(/\s+$/, '')}\n\n`;
59
+ const header = current.length === 0 ? '# OkCMS\n' : '# okcms init\n';
60
+ await writeFile(`${path}`, `${body}${header}${missing.join('\n')}\n`, 'utf-8');
61
+ }
62
+ export async function scaffoldProject(targetDir, name, lang = DEFAULT_DOCS_LANG) {
16
63
  const root = resolve(process.cwd(), targetDir);
17
64
  console.log(`Criando projeto "${name}" em ${root}...`);
18
65
  await mkdir(join(root, 'themes'), { recursive: true });
@@ -20,16 +67,13 @@ export async function scaffoldProject(targetDir, name) {
20
67
  await mkdir(join(root, 'migrations'), { recursive: true });
21
68
  const config = defaultProjectConfig(name);
22
69
  await writeFile(join(root, DEFAULT_CONFIG_FILENAME), JSON.stringify(config, null, 2), 'utf-8');
23
- // package.json do projeto — apps do OkCMS como dependências, em range
24
- // ^MAIOR.MENOR.0 (e não ^versão-exata do CLI): os apps são independentes no
25
- // changesets e podem estar alguns patches atrás do CLI — range exata quebraria
26
- // o install (ETARGET) sempre que CLI e apps não forem publicados juntos.
27
- // Assim o `bunx` dos apps resolve local, `okcms update` enxerga
28
- // node_modules/@oktis-works/* e tudo funciona sem configuração manual.
70
+ // package.json do projeto — apps do OkCMS como dependências. O range vem de
71
+ // `appRangeFor` (janela de dois minors em 0.x) e NUNCA é a versão exata do
72
+ // CLI; ver a documentação dessa função para o histórico do ETARGET.
29
73
  // Não sobrescreve manifest existente.
30
74
  const cliPkg = await import('../package.json', { with: { type: 'json' } });
31
75
  const cliVersion = cliPkg.default.version;
32
- const appRange = `^${cliVersion.split('.').slice(0, 2).join('.')}.0`;
76
+ const appRange = appRangeFor(cliVersion);
33
77
  const manifestPath = join(root, 'package.json');
34
78
  if (!existsSync(manifestPath)) {
35
79
  const manifest = {
@@ -133,22 +177,41 @@ volumes:
133
177
  redisdata:
134
178
  `;
135
179
  await writeFile(join(root, 'docker-compose.yml'), compose, 'utf-8');
180
+ // --- deploy Docker (blue/green) ------------------------------------------
181
+ // Escrito no init, não no primeiro deploy: o projeto nasce com a estrutura
182
+ // completa (imagem única, infra, lanes, template do nginx) e o operador vê
183
+ // tudo no git desde o primeiro commit. `writeDeployAssets` não sobrescreve
184
+ // nada — um re-init de projeto já configurado é no-op aqui.
185
+ const deployCreated = writeDeployAssets(root, 'blue', {
186
+ PORT: String(config.ports.api),
187
+ WEB_PORT: String(config.ports.web),
188
+ ADMIN_PORT: String(config.ports.admin),
189
+ });
190
+ await mergeGitignore(root, ['.env', 'node_modules/', 'dist/', ...DEPLOY_GITIGNORE]);
136
191
  // Documentação do projeto — só escreve se não existir (não sobrescreve
137
- // README editado pelo usuário em re-init).
138
- const { projectReadme, PLUGIN_DOC, THEME_DOC } = await import('./scaffold-docs.js');
192
+ // README editado pelo usuário em re-init). A língua (en/pt) vem do `--lang`
193
+ // ou do menu do init; o nome do arquivo é sempre o mesmo.
194
+ let docsWritten = 0;
139
195
  for (const [filename, content] of [
140
- ['README.md', projectReadme(name)],
141
- ['PLUGIN.md', PLUGIN_DOC],
142
- ['THEME.md', THEME_DOC],
196
+ ['README.md', projectReadme(name, lang)],
197
+ ['PLUGIN.md', pluginDoc(lang)],
198
+ ['THEME.md', themeDoc(lang)],
143
199
  ]) {
144
200
  const docPath = join(root, filename);
145
201
  if (!existsSync(docPath)) {
146
202
  await writeFile(docPath, content, 'utf-8');
203
+ docsWritten += 1;
147
204
  }
148
205
  }
206
+ if (docsWritten > 0) {
207
+ console.log(`Documentação gerada em ${docsLangLabel(lang)}: ${docsWritten} arquivo(s)`);
208
+ }
149
209
  const relTarget = targetDir === '.' ? null : targetDir;
150
210
  const cfgName = DEFAULT_CONFIG_FILENAME;
151
211
  console.log(`Projeto "${name}" criado em ${root}`);
212
+ if (deployCreated.length > 0) {
213
+ console.log(`Arquivos de deploy Docker criados: ${deployCreated.join(', ')}`);
214
+ }
152
215
  console.log('Próximos passos:');
153
216
  let step = 1;
154
217
  if (relTarget !== null) {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { resolveStyleEngine } from '@oktis-works/theme-runtime';
2
+ /** Manifesto cru: quem valida de verdade é o theme-runtime. */
3
+ export declare function readThemeManifest(path: string): any | null;
4
+ /**
5
+ * `theme.json` é o canônico (ThemeLoader); `manifest.json` é aceito como
6
+ * fallback para temas antigos que nasceram com esse nome.
7
+ */
8
+ export declare function themeManifestPath(themesDir: string, theme: string): string | null;
9
+ export interface ThemeStyleResolution {
10
+ manifestPath: string;
11
+ manifest: any;
12
+ report: ReturnType<typeof resolveStyleEngine>;
13
+ }
14
+ /**
15
+ * Lê o manifesto (qualquer um dos dois nomes) e resolve engine/entrada/saída.
16
+ * `null` = arquivo ausente ou JSON inválido.
17
+ */
18
+ export declare function resolveThemeStyle(themesDir: string, theme: string): ThemeStyleResolution | null;
19
+ export interface ThemeBuildOutcome {
20
+ theme: string;
21
+ engine: string;
22
+ output: string;
23
+ bytes: number;
24
+ isolated: boolean;
25
+ entry: string | null;
26
+ warnings: string[];
27
+ }
28
+ /**
29
+ * Compila o tema e grava `dist/theme.css`.
30
+ *
31
+ * Lança (em vez de `process.exit`) para o chamador decidir: o `theme:build`
32
+ * avulso imprime e sai com 1; o redeploy aborta ANTES de tocar no Docker.
33
+ */
34
+ export declare function buildThemeStylesOnDisk(themesDir: string, themeName: string): Promise<ThemeBuildOutcome>;
35
+ //# sourceMappingURL=theme-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-build.d.ts","sourceRoot":"","sources":["../src/theme-build.ts"],"names":[],"mappings":"AAYA,OAAO,EAAoB,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAElF,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAQ1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMjF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC;IACd,MAAM,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;CAC/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAU/F;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAgC5B"}
@@ -0,0 +1,86 @@
1
+ // @oktis-works/cms - Build de estilo de tema (compartilhado por theme:build e redeploy)
2
+ //
3
+ // `themes/<n>/dist/theme.css` é lido PRONTO pelo web (`/themes/<tema>/dist/
4
+ // theme.css`) — ninguém compila SCSS/Tailwind dentro do container. Então o
5
+ // build roda no host, e o artefato só chega na imagem no rebuild. É exatamente
6
+ // isso que o `okcms redeploy` orquestra; este módulo é a parte "compilar um
7
+ // tema", usada pelo comando avulso e pelo redeploy, para não existirem dois
8
+ // caminhos ligeiramente diferentes do mesmo pipeline.
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
10
+ import { dirname, isAbsolute, join } from 'node:path';
11
+ import { buildThemeStyles, resolveStyleEngine } from '@oktis-works/theme-runtime';
12
+ /** Manifesto cru: quem valida de verdade é o theme-runtime. */
13
+ export function readThemeManifest(path) {
14
+ if (!existsSync(path))
15
+ return null;
16
+ try {
17
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
18
+ return parsed && typeof parsed === 'object' ? parsed : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ /**
25
+ * `theme.json` é o canônico (ThemeLoader); `manifest.json` é aceito como
26
+ * fallback para temas antigos que nasceram com esse nome.
27
+ */
28
+ export function themeManifestPath(themesDir, theme) {
29
+ for (const file of ['theme.json', 'manifest.json']) {
30
+ const path = join(themesDir, theme, file);
31
+ if (existsSync(path))
32
+ return path;
33
+ }
34
+ return null;
35
+ }
36
+ /**
37
+ * Lê o manifesto (qualquer um dos dois nomes) e resolve engine/entrada/saída.
38
+ * `null` = arquivo ausente ou JSON inválido.
39
+ */
40
+ export function resolveThemeStyle(themesDir, theme) {
41
+ const manifestPath = themeManifestPath(themesDir, theme);
42
+ if (!manifestPath)
43
+ return null;
44
+ const manifest = readThemeManifest(manifestPath);
45
+ if (!manifest)
46
+ return null;
47
+ return {
48
+ manifestPath,
49
+ manifest,
50
+ report: resolveStyleEngine({ themesRoot: themesDir, themeName: theme, manifest }),
51
+ };
52
+ }
53
+ /**
54
+ * Compila o tema e grava `dist/theme.css`.
55
+ *
56
+ * Lança (em vez de `process.exit`) para o chamador decidir: o `theme:build`
57
+ * avulso imprime e sai com 1; o redeploy aborta ANTES de tocar no Docker.
58
+ */
59
+ export async function buildThemeStylesOnDisk(themesDir, themeName) {
60
+ const manifestPath = themeManifestPath(themesDir, themeName);
61
+ if (!manifestPath) {
62
+ throw new Error(`manifesto do tema não encontrado em ${join(themesDir, themeName)} (theme.json)`);
63
+ }
64
+ const manifest = readThemeManifest(manifestPath);
65
+ if (!manifest) {
66
+ throw new Error(`manifesto inválido (JSON): ${manifestPath}`);
67
+ }
68
+ const { css, report } = await buildThemeStyles({ themesRoot: themesDir, themeName, manifest });
69
+ // `output` vem do manifesto: nunca escrever fora do diretório do tema.
70
+ if (report.output.includes('..') || isAbsolute(report.output)) {
71
+ throw new Error(`stylesConfig.output inválido em ${manifestPath}: ${report.output}`);
72
+ }
73
+ const target = join(themesDir, themeName, report.output);
74
+ mkdirSync(dirname(target), { recursive: true });
75
+ writeFileSync(target, css, 'utf-8');
76
+ return {
77
+ theme: themeName,
78
+ engine: report.engine,
79
+ output: report.output,
80
+ bytes: Buffer.byteLength(css, 'utf-8'),
81
+ isolated: report.isolated,
82
+ entry: report.entry,
83
+ warnings: report.warnings,
84
+ };
85
+ }
86
+ //# sourceMappingURL=theme-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-build.js","sourceRoot":"","sources":["../src/theme-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { type DeployChoices } from './bluegreen.js';
2
+ import { type Runner } from './docker.js';
3
+ import { type ContainerProbe } from './guards.js';
4
+ import { Prompt } from './prompt.js';
5
+ export type UpdateMode = 'download' | 'deploy';
6
+ export interface OutdatedEntry {
7
+ /** nome curto do pacote (`api`), como aparece em node_modules. */
8
+ name: string;
9
+ /** nome publicado (`@oktis-works/api`). */
10
+ pkg: string;
11
+ current: string;
12
+ latest: string;
13
+ }
14
+ export interface ScanResult {
15
+ /** false = não existe `node_modules/@oktis-works` (projeto nunca instalou). */
16
+ installed: boolean;
17
+ outdated: OutdatedEntry[];
18
+ }
19
+ export interface UpdateOptions {
20
+ cwd?: string;
21
+ /** `--install`: aplica as atualizações no modo download. */
22
+ install?: boolean;
23
+ /** `--mode download|deploy` (aliases abaixo); ausente = menu/default. */
24
+ mode?: string;
25
+ /** `--no-cache`: build limpo. */
26
+ noCache?: boolean;
27
+ /** `--remove-orphans` / `--keep-orphans`. */
28
+ removeOrphans?: boolean;
29
+ keepOrphans?: boolean;
30
+ /** `--yes`: nenhum prompt, tudo em default. */
31
+ yes?: boolean;
32
+ /** `--force`: permite rodar dentro de container (não recomendado). */
33
+ force?: boolean;
34
+ /** Sonda do `assertHostOnly` (testes); em produção usa a detecção real. */
35
+ probe?: ContainerProbe;
36
+ runner?: Runner;
37
+ prompt?: Prompt;
38
+ log?: (message: string) => void;
39
+ }
40
+ /** `null` = valor inválido (diferente de "não informado"). */
41
+ export declare function parseMode(value: string): UpdateMode | null;
42
+ /**
43
+ * Varre `node_modules/@oktis-works/*` e compara cada versão instalada com a
44
+ * do registry. Falha de rede num pacote não derruba a varredura: ele fica de
45
+ * fora e o operador vê `?` na próxima rodada.
46
+ */
47
+ export declare function scanOutdated(cwd: string, log?: (message: string) => void): Promise<ScanResult>;
48
+ /** Flags > prompt. Fora de TTY, defaults conservadores e determinísticos. */
49
+ export declare function resolveDeployChoices(opts: Pick<UpdateOptions, 'noCache' | 'removeOrphans' | 'keepOrphans' | 'yes'>, prompt: Prompt): Promise<DeployChoices>;
50
+ export declare function runUpdate(opts?: UpdateOptions): Promise<number>;
51
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,+EAA+E;IAC/E,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAcD,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE1D;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAkB,GAC3C,OAAO,CAAC,UAAU,CAAC,CAiCrB;AAED,6EAA6E;AAC7E,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,eAAe,GAAG,aAAa,GAAG,KAAK,CAAC,EAC9E,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAwBxB;AA6CD,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwFzE"}
package/dist/update.js ADDED
@@ -0,0 +1,210 @@
1
+ // @oktis-works/cms - `okcms update` (F3)
2
+ //
3
+ // Dois caminhos, um só comando:
4
+ //
5
+ // download baixa/atualiza os pacotes @oktis-works no host. É o
6
+ // comportamento histórico (`okcms update -i`) e continua sendo o
7
+ // default em não-TTY — script nenhum passa a fazer deploy por
8
+ // acidente só porque a CLI ganhou um menu.
9
+ //
10
+ // deploy sobe a aplicação em Docker com troca blue/green: pacotes no
11
+ // host → build → migrations → edge da lane nova → healthcheck →
12
+ // swap do nginx → dreno do worker → derruba a lane antiga.
13
+ // A CLI roda no HOST, sempre (ver assertHostOnly).
14
+ //
15
+ // A escolha entre os dois é o menu de TTY; fora de TTY vale `--mode` ou o
16
+ // default histórico.
17
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { deployBlueGreen } from './bluegreen.js';
20
+ import { defaultRunner } from './docker.js';
21
+ import { assertHostOnly } from './guards.js';
22
+ import { getLatestVersion } from './npm-registry.js';
23
+ import { Prompt, style, symbol } from './prompt.js';
24
+ const MODE_ALIASES = {
25
+ download: 'download',
26
+ pkg: 'download',
27
+ packages: 'download',
28
+ pacotes: 'download',
29
+ deploy: 'deploy',
30
+ docker: 'deploy',
31
+ bluegreen: 'deploy',
32
+ 'blue-green': 'deploy',
33
+ 'blue_green': 'deploy',
34
+ };
35
+ /** `null` = valor inválido (diferente de "não informado"). */
36
+ export function parseMode(value) {
37
+ return MODE_ALIASES[value.trim().toLowerCase()] ?? null;
38
+ }
39
+ /**
40
+ * Varre `node_modules/@oktis-works/*` e compara cada versão instalada com a
41
+ * do registry. Falha de rede num pacote não derruba a varredura: ele fica de
42
+ * fora e o operador vê `?` na próxima rodada.
43
+ */
44
+ export async function scanOutdated(cwd, log = console.log) {
45
+ const nmDir = join(cwd, 'node_modules', '@oktis-works');
46
+ if (!existsSync(nmDir))
47
+ return { installed: false, outdated: [] };
48
+ const installed = readdirSync(nmDir, { withFileTypes: true })
49
+ .filter((entry) => entry.isDirectory())
50
+ .map((entry) => entry.name);
51
+ const outdated = [];
52
+ for (const name of installed) {
53
+ let current = '?';
54
+ try {
55
+ const pkgJson = JSON.parse(readFileSync(join(nmDir, name, 'package.json'), 'utf-8'));
56
+ current = pkgJson.version ?? '?';
57
+ }
58
+ catch {
59
+ // sem package.json legível — tratado como desconhecido abaixo
60
+ }
61
+ const latest = await getLatestVersion(`@oktis-works/${name}`);
62
+ if (!latest || latest === current) {
63
+ log(` ✓ @oktis-works/${name} ${current} (em dia)`);
64
+ continue;
65
+ }
66
+ log(` ↑ @oktis-works/${name} ${current} → ${latest} disponível`);
67
+ outdated.push({ name, pkg: `@oktis-works/${name}`, current, latest });
68
+ }
69
+ return { installed: true, outdated };
70
+ }
71
+ /** Flags > prompt. Fora de TTY, defaults conservadores e determinísticos. */
72
+ export async function resolveDeployChoices(opts, prompt) {
73
+ const interactive = prompt.interactive && opts.yes !== true;
74
+ const noCache = opts.noCache === true
75
+ ? true
76
+ : interactive
77
+ ? !(await prompt.confirm('Build com cache de camadas? (não = rebuild limpo, mais lento)', {
78
+ defaultValue: true,
79
+ }))
80
+ : false;
81
+ const removeOrphans = opts.keepOrphans === true
82
+ ? false
83
+ : opts.removeOrphans === true
84
+ ? true
85
+ : interactive
86
+ ? await prompt.confirm('Remover contêineres órfãos da lane antiga?', {
87
+ defaultValue: true,
88
+ })
89
+ : true;
90
+ return { noCache, removeOrphans };
91
+ }
92
+ async function runDownload(scan, opts, prompt) {
93
+ const cwd = opts.cwd ?? process.cwd();
94
+ const runner = opts.runner ?? defaultRunner;
95
+ if (!scan.installed) {
96
+ console.error('Nenhum pacote @oktis-works/* instalado em node_modules.');
97
+ console.error('Rode `bun install` (ou `okcms init`) antes de atualizar.');
98
+ return 1;
99
+ }
100
+ if (scan.outdated.length === 0) {
101
+ prompt.success('Todos os pacotes estão em dia.');
102
+ return 0;
103
+ }
104
+ if (opts.install !== true) {
105
+ prompt.info('Use --install para atualizar automaticamente.');
106
+ prompt.info('Ou --mode deploy para um deploy Docker blue/green completo.');
107
+ return 0;
108
+ }
109
+ prompt.write('\nAtualizando...\n');
110
+ const specs = scan.outdated.map((entry) => `${entry.pkg}@latest`);
111
+ const result = runner('bun', ['add', ...specs], {
112
+ cwd,
113
+ inherit: true,
114
+ timeoutMs: 600_000,
115
+ });
116
+ if (result.ok)
117
+ return 0;
118
+ // host sem bun: o npm faz o mesmo trabalho, só mais devagar
119
+ const npm = runner('npm', ['install', ...specs], {
120
+ cwd,
121
+ inherit: true,
122
+ timeoutMs: 600_000,
123
+ });
124
+ return npm.ok ? 0 : 1;
125
+ }
126
+ export async function runUpdate(opts = {}) {
127
+ const prompt = opts.prompt ?? new Prompt();
128
+ const ownsPrompt = opts.prompt === undefined;
129
+ // A CLI de deploy/config só existe no host: dentro de um container ela
130
+ // viraria um instalador de pacotes na rede do banco, com .env exposto.
131
+ const guard = assertHostOnly('okcms update', { force: opts.force, probe: opts.probe });
132
+ if (!guard.ok) {
133
+ console.error(guard.message);
134
+ if (ownsPrompt)
135
+ prompt.close();
136
+ return 1;
137
+ }
138
+ const onInterrupt = () => {
139
+ prompt.write(`\n ${style.yellow(symbol.warn)} interrompido — nenhum passo de deploy em andamento foi registrado.\n`);
140
+ process.exit(130);
141
+ };
142
+ process.once('SIGINT', onInterrupt);
143
+ try {
144
+ // ---- 1. modo ----------------------------------------------------------
145
+ let mode;
146
+ if (opts.mode !== undefined) {
147
+ const parsed = parseMode(opts.mode);
148
+ if (parsed === null) {
149
+ prompt.error(`--mode inválido: ${opts.mode} — use "download" ou "deploy"`);
150
+ return 1;
151
+ }
152
+ mode = parsed;
153
+ }
154
+ else if (prompt.interactive && opts.yes !== true) {
155
+ mode = await prompt.select('O que o update deve fazer?', [
156
+ {
157
+ value: 'download',
158
+ label: 'Só baixar pacotes',
159
+ hint: 'node_modules atualizado · nada sobe no Docker',
160
+ },
161
+ {
162
+ value: 'deploy',
163
+ label: 'Deploy Docker blue/green completo',
164
+ hint: 'build · migrations · swap de lane · worker drenado',
165
+ },
166
+ ], { defaultValue: 'download' });
167
+ }
168
+ else {
169
+ // não-TTY sem --mode = comportamento histórico, inalterado
170
+ mode = 'download';
171
+ }
172
+ // ---- 2. varredura -----------------------------------------------------
173
+ prompt.heading(`OkCMS update — modo ${mode}`);
174
+ const scan = await scanOutdated(opts.cwd ?? process.cwd(), (message) => prompt.write(`${message}\n`));
175
+ if (mode === 'download')
176
+ return await runDownload(scan, opts, prompt);
177
+ // ---- 3. escolhas do deploy -------------------------------------------
178
+ const choices = await resolveDeployChoices(opts, prompt);
179
+ const interactive = prompt.interactive && opts.yes !== true;
180
+ if (interactive) {
181
+ prompt.heading('Resumo do deploy blue/green');
182
+ prompt.info(`pacotes: ${scan.outdated.length} atualização(ões)`);
183
+ prompt.info(`build: ${choices.noCache ? 'sem cache (rebuild limpo)' : 'com cache de camadas'}`);
184
+ prompt.info(`órfãos da lane antiga: ${choices.removeOrphans ? 'remover' : 'manter'}`);
185
+ prompt.info('ordem: build → migrations no host → edge → health → swap → worker → down');
186
+ const confirmed = await prompt.confirm('Iniciar deploy?', { defaultValue: true });
187
+ if (!confirmed) {
188
+ prompt.warn('cancelado — nada foi executado.');
189
+ return 0;
190
+ }
191
+ }
192
+ // ---- 4. deploy --------------------------------------------------------
193
+ const result = await deployBlueGreen({
194
+ cwd: opts.cwd,
195
+ runner: opts.runner,
196
+ choices,
197
+ packages: scan.outdated.map((entry) => `${entry.pkg}@latest`),
198
+ installAll: !scan.installed,
199
+ log: (message) => prompt.write(`${message}\n`),
200
+ warn: (message) => prompt.write(`${message}\n`),
201
+ });
202
+ return result.ok ? 0 : 1;
203
+ }
204
+ finally {
205
+ process.removeListener('SIGINT', onInterrupt);
206
+ if (ownsPrompt)
207
+ prompt.close();
208
+ }
209
+ }
210
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,gCAAgC;AAChC,EAAE;AACF,kEAAkE;AAClE,6EAA6E;AAC7E,0EAA0E;AAC1E,uDAAuD;AACvD,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,+DAA+D;AAC/D,EAAE;AACF,0EAA0E;AAC1E,qBAAqB;AAErB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,cAAc,EAAuB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyCpD,MAAM,YAAY,GAA+B;IAC/C,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,UAAU;IACf,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,QAAQ;IACnB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;CACvB,CAAC;AAEF,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,MAAiC,OAAO,CAAC,GAAG;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAElE,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC1D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAElF,CAAC;YACF,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAClC,GAAG,CAAC,oBAAoB,IAAI,IAAI,OAAO,WAAW,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,GAAG,CAAC,oBAAoB,IAAI,IAAI,OAAO,MAAM,MAAM,aAAa,CAAC,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA8E,EAC9E,MAAc;IAEd,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;IAE5D,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,KAAK,IAAI;QACnB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW;YACX,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,+DAA+D,EAAE;gBACtF,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACL,CAAC,CAAC,KAAK,CAAC;IAEd,MAAM,aAAa,GACjB,IAAI,CAAC,WAAW,KAAK,IAAI;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI;YAC3B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,WAAW;gBACX,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE;oBACjE,YAAY,EAAE,IAAI;iBACnB,CAAC;gBACJ,CAAC,CAAC,IAAI,CAAC;IAEf,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAgB,EAChB,IAAmB,EACnB,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAE5C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE;QAC9C,GAAG;QACH,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAExB,4DAA4D;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,EAAE;QAC/C,GAAG;QACH,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB,EAAE;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IAE7C,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,UAAU;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QACtH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,0EAA0E;QAC1E,IAAI,IAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,+BAA+B,CAAC,CAAC;gBAC3E,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACnD,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAa,4BAA4B,EAAE;gBACnE;oBACE,KAAK,EAAE,UAAU;oBACjB,KAAK,EAAE,mBAAmB;oBAC1B,IAAI,EAAE,+CAA+C;iBACtD;gBACD;oBACE,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,mCAAmC;oBAC1C,IAAI,EAAE,oDAAoD;iBAC3D;aACF,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,IAAI,GAAG,UAAU,CAAC;QACpB,CAAC;QAED,0EAA0E;QAC1E,MAAM,CAAC,OAAO,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CACrE,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAC7B,CAAC;QAEF,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEtE,yEAAyE;QACzE,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;QAE5D,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAChG,MAAM,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;YACxF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,SAAS,CAAC;YAC7D,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS;YAC3B,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC;YAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC;SAChD,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC9C,IAAI,UAAU;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}