yuzuha 0.1.4 → 0.1.5
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/CHANGELOG.md +10 -0
- package/README.md +12 -10
- package/VERSIONING.md +18 -5
- package/dist/cli/arguments.d.ts +1 -0
- package/dist/cli/arguments.d.ts.map +1 -1
- package/dist/cli/arguments.js +8 -6
- package/dist/cli/arguments.js.map +1 -1
- package/dist/cli/command-catalog.d.ts +14 -0
- package/dist/cli/command-catalog.d.ts.map +1 -0
- package/dist/cli/command-catalog.js +22 -0
- package/dist/cli/command-catalog.js.map +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +5 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/scaffold.d.ts +1 -1
- package/dist/cli/scaffold.d.ts.map +1 -1
- package/dist/cli/scaffold.js +10 -7
- package/dist/cli/scaffold.js.map +1 -1
- package/dist/commands/arguments.d.ts +5 -0
- package/dist/commands/arguments.d.ts.map +1 -1
- package/dist/commands/arguments.js +70 -1
- package/dist/commands/arguments.js.map +1 -1
- package/dist/commands/builders.d.ts +2 -0
- package/dist/commands/builders.d.ts.map +1 -1
- package/dist/commands/builders.js +3 -0
- package/dist/commands/builders.js.map +1 -1
- package/dist/commands/context.d.ts +7 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +39 -7
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/definition.d.ts +12 -5
- package/dist/commands/definition.d.ts.map +1 -1
- package/dist/commands/definition.js +3 -5
- package/dist/commands/definition.js.map +1 -1
- package/dist/commands/help.d.ts +4 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +45 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/context.d.ts +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -0
- package/dist/context.js.map +1 -1
- package/dist/framework/bot.d.ts +2 -2
- package/dist/framework/bot.d.ts.map +1 -1
- package/dist/framework/bot.js +27 -11
- package/dist/framework/bot.js.map +1 -1
- package/dist/framework/command-registry.d.ts +8 -1
- package/dist/framework/command-registry.d.ts.map +1 -1
- package/dist/framework/command-registry.js +93 -38
- package/dist/framework/command-registry.js.map +1 -1
- package/dist/framework/options.d.ts +2 -0
- package/dist/framework/options.d.ts.map +1 -1
- package/dist/framework/options.js.map +1 -1
- package/dist/framework/routing.d.ts +1 -0
- package/dist/framework/routing.d.ts.map +1 -1
- package/dist/framework/routing.js +1 -1
- package/dist/framework/routing.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/scripting/builtins/schedule.js +4 -4
- package/dist/scripting/builtins/schedule.js.map +1 -1
- package/dist/testing.d.ts +34 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +60 -0
- package/dist/testing.js.map +1 -1
- package/docs/API.md +12 -2
- package/docs/CLI.md +24 -8
- package/docs/EDITOR.md +2 -2
- package/docs/FRAMEWORK.md +7 -0
- package/docs/FUNCTION-GAPS.md +1 -1
- package/docs/NATIVE.md +78 -1
- package/docs/PARITY.md +6 -1
- package/docs/PLAN.md +6 -0
- package/docs/QUICKSTART.md +11 -8
- package/docs/README.md +1 -1
- package/docs/TESTING.md +61 -1
- package/docs/TROUBLESHOOTING.md +2 -2
- package/docs/VALIDATION.md +43 -0
- package/editors/vscode/package.json +1 -1
- package/package.json +9 -1
- package/src/cli/arguments.ts +9 -6
- package/src/cli/command-catalog.ts +37 -0
- package/src/cli/main.ts +5 -2
- package/src/cli/scaffold.ts +10 -7
- package/src/commands/arguments.ts +54 -1
- package/src/commands/builders.ts +3 -0
- package/src/commands/context.ts +33 -5
- package/src/commands/definition.ts +15 -11
- package/src/commands/help.ts +37 -0
- package/src/context.ts +1 -0
- package/src/framework/bot.ts +26 -13
- package/src/framework/command-registry.ts +89 -45
- package/src/framework/options.ts +2 -0
- package/src/framework/routing.ts +2 -2
- package/src/index.ts +1 -0
- package/src/scripting/builtins/schedule.ts +4 -4
- package/src/testing.ts +88 -0
package/CHANGELOG.md
CHANGED
|
@@ -21,6 +21,16 @@ documentos. Veja a [política completa](VERSIONING.md).
|
|
|
21
21
|
|
|
22
22
|
</details>
|
|
23
23
|
|
|
24
|
+
## v0.1.5 · 22/10/2026
|
|
25
|
+
|
|
26
|
+
Subcomandos e flags tipadas, ajuda derivada das definições e testes nativos com relógio controlável, com projetos gerados prontos para compartilhar. Esta atualização da biblioteca Yuzuha foi preparada em 22/10/2026 (v0.1.5).
|
|
27
|
+
|
|
28
|
+
- Comandos aceitam árvores de subcomandos e flags com inferência de tipos, aliases, valores entre aspas e separador `--`. As restrições dos grupos são preservadas na execução dos filhos.
|
|
29
|
+
- Ajuda detalha argumentos, flags, escolhas, valores padrão, exemplos e subcomandos. Erros de entrada incluem o uso esperado; metadados também ficam disponíveis no JSON de `check`.
|
|
30
|
+
- `createTestBot`, em `yuzuha/testing`, reúne transporte, recursos simulados, estado isolado, mensagens, erros e resultados. O relógio controlável permite verificar cooldown, TTL e tarefas sem aguardar tempo real; o descarte aguarda o encerramento.
|
|
31
|
+
- `init` usa dependência npm por padrão; `--local` seleciona a instalação local explicitamente. Projetos JS/TS incluem teste offline de exemplo e `npm test`.
|
|
32
|
+
- SDK permanece em 3.3.0 e o catálogo mantém 288 funções. Os contratos e exemplos novos são compartilhados com a documentação e a validação do pacote instalado.
|
|
33
|
+
|
|
24
34
|
## v0.1.4 · 22/10/2026
|
|
25
35
|
|
|
26
36
|
Eventos em scripts, cron com fuso, HTTP em streaming e ferramentas de manutenção e testes offline, com autorização compartilhada nos recursos. Esta atualização da biblioteca Yuzuha foi preparada em 22/10/2026 (v0.1.4).
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Framework para bots do Fluxer: a ergonomia que falta no Fluxer.js, com comandos
|
|
4
4
|
tipados, guards, estado, moderação, agendamentos e testes offline. Function mode
|
|
5
|
-
(scripts no estilo ForgeScript) é opcional. Versão **0.1.
|
|
5
|
+
(scripts no estilo ForgeScript) é opcional. Versão **0.1.5**.
|
|
6
6
|
|
|
7
7
|
```ts
|
|
8
8
|
import { arg, defineCommand, Yuzuha } from 'yuzuha';
|
|
@@ -33,7 +33,8 @@ executa o banimento e registra o caso. O token vem de `FLUXER_BOT_TOKEN`.
|
|
|
33
33
|
|
|
34
34
|
## O que o Yuzuha adiciona ao Fluxer.js
|
|
35
35
|
|
|
36
|
-
- Comandos com prefixos,
|
|
36
|
+
- Comandos com prefixos, subcomandos, flags e argumentos tipados, cooldowns e permissões.
|
|
37
|
+
- Ajuda com uso, escolhas e exemplos a partir das definições dos comandos.
|
|
37
38
|
- Guards, middleware, plugins, eventos tipados e recarga de comandos sem reiniciar.
|
|
38
39
|
- Moderação compartilhada (ban, kick, timeout, unban) com casos por servidor.
|
|
39
40
|
- Recursos prontos: usuários, cargos, canais, mensagens, convites, webhooks,
|
|
@@ -42,7 +43,7 @@ executa o banimento e registra o caso. O token vem de `FLUXER_BOT_TOKEN`.
|
|
|
42
43
|
- Estado em memória, JSON ou SQLite, com transações e variáveis por escopo.
|
|
43
44
|
- Agendamentos persistentes com cron, fuso IANA, concorrência e retry com jitter.
|
|
44
45
|
- HTTP textual/binário, streaming e multipart, com limites e políticas por comando.
|
|
45
|
-
- `
|
|
46
|
+
- `createTestBot`, relógio controlável, `MockTransport` e stores isolados para testar sem token.
|
|
46
47
|
- Transações entre chaves, agendamentos editáveis com pausa/retry e apelidos com autorização compartilhada.
|
|
47
48
|
- Limpeza de expirados, estatísticas e backup/restauração versionados com simulação.
|
|
48
49
|
- `doctor`, lint JSON, cenários offline, catálogos de plugins e extensão VS Code.
|
|
@@ -82,23 +83,24 @@ Requer Node **22.13 ou mais recente**. O pacote é ESM; use `"type": "module"`
|
|
|
82
83
|
no `package.json` do seu projeto.
|
|
83
84
|
|
|
84
85
|
```sh
|
|
85
|
-
npm install yuzuha@0.1.
|
|
86
|
+
npm install yuzuha@0.1.5
|
|
86
87
|
```
|
|
87
88
|
|
|
88
89
|
Para gerar um bot novo:
|
|
89
90
|
|
|
90
91
|
```sh
|
|
91
|
-
npx yuzuha@0.1.
|
|
92
|
+
npx yuzuha@0.1.5 init ./meu-bot --ts
|
|
92
93
|
cd meu-bot
|
|
93
|
-
npm install
|
|
94
|
+
npm install
|
|
94
95
|
npm run check
|
|
95
96
|
npm run typecheck
|
|
97
|
+
npm test
|
|
96
98
|
cp .env.example .env
|
|
97
99
|
```
|
|
98
100
|
|
|
99
|
-
`init`
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
`init` declara a dependência npm e gera um teste offline. O projeto pode ser
|
|
102
|
+
movido e compartilhado sem depender do caminho da instalação que o criou.
|
|
103
|
+
Para JavaScript, use `--js` e omita `typecheck`.
|
|
102
104
|
Para acrescentar um exemplo de script, use `--functions`.
|
|
103
105
|
|
|
104
106
|
Preencha `FLUXER_BOT_TOKEN` no `.env` e execute `npm run dev`.
|
|
@@ -109,7 +111,7 @@ Preencha `FLUXER_BOT_TOKEN` no `.env` e execute `npm run dev`.
|
|
|
109
111
|
cd ~/Projects/yuzuha
|
|
110
112
|
npm ci
|
|
111
113
|
npm run build
|
|
112
|
-
node dist/cli.js init ~/Projects/meu-bot --ts
|
|
114
|
+
node dist/cli.js init ~/Projects/meu-bot --ts --local
|
|
113
115
|
cd ~/Projects/meu-bot
|
|
114
116
|
npm install
|
|
115
117
|
npm run check
|
package/VERSIONING.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Versionamento
|
|
2
2
|
|
|
3
3
|
O Yuzuha aplica o formato Hory ao histórico e usa **SemVer simples** no pacote.
|
|
4
|
-
A versão desta atualização é **0.1.
|
|
4
|
+
A versão desta atualização é **0.1.5**.
|
|
5
5
|
|
|
6
6
|
## Pacote e histórico
|
|
7
7
|
|
|
8
8
|
| Lugar | Formato nesta versão |
|
|
9
9
|
|---|---|
|
|
10
|
-
| `package.json` e raiz do `package-lock.json` | `0.1.
|
|
11
|
-
| Pacote npm e saída de `yuzuha --version` | `0.1.
|
|
12
|
-
| Título do changelog | `## v0.1.
|
|
13
|
-
| Eventual tag Git | `v0.1.
|
|
10
|
+
| `package.json` e raiz do `package-lock.json` | `0.1.5` |
|
|
11
|
+
| Pacote npm e saída de `yuzuha --version` | `0.1.5` |
|
|
12
|
+
| Título do changelog | `## v0.1.5 · 22/10/2026` |
|
|
13
|
+
| Eventual tag Git | `v0.1.5` |
|
|
14
14
|
|
|
15
15
|
O SDK e a CLI pertencem ao mesmo pacote. Para bibliotecas, a convenção Hory mantém
|
|
16
16
|
SemVer sem `m`, sem seções por superfície e sem sufixos de canal.
|
|
@@ -40,6 +40,19 @@ gerado por `init` pertence ao consumidor e não precisa acompanhar a biblioteca.
|
|
|
40
40
|
|
|
41
41
|
## Preparar uma atualização
|
|
42
42
|
|
|
43
|
+
### Migrar para 0.1.5
|
|
44
|
+
|
|
45
|
+
Imports, argumentos posicionais e comandos existentes continuam disponíveis.
|
|
46
|
+
Flags são interpretadas somente em comandos que as declaram. Grupos de
|
|
47
|
+
subcomandos não declaram argumentos ou flags próprios; a folha define sua entrada.
|
|
48
|
+
Permissões, checks, middleware e demais restrições dos grupos continuam valendo
|
|
49
|
+
nos filhos. Veja o contrato em [NATIVE.md](docs/NATIVE.md).
|
|
50
|
+
|
|
51
|
+
O scaffold agora declara a versão npm do Yuzuha. Para desenvolver contra a
|
|
52
|
+
instalação que executa a CLI, use `init --local`. Projetos já gerados conservam
|
|
53
|
+
suas dependências; a atualização não reescreve projetos consumidores.
|
|
54
|
+
O schema de persistência permanece em 2 e o SDK em 3.3.0.
|
|
55
|
+
|
|
43
56
|
### Migrar para 0.1.4
|
|
44
57
|
|
|
45
58
|
O schema persistido continua em 2. Cron, timezone, missedRun e retryJitter são
|
package/dist/cli/arguments.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,QAgBjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACjE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAChG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACpH;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACpE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IACpG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAChG;IAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAkF3D"}
|
package/dist/cli/arguments.js
CHANGED
|
@@ -2,7 +2,7 @@ import { YuzuhaError } from '../errors.js';
|
|
|
2
2
|
import { NODE_REQUIREMENT, VERSION } from './version.js';
|
|
3
3
|
export const usage = `Yuzuha ${VERSION}
|
|
4
4
|
|
|
5
|
-
yuzuha init <diretório> [--js | --ts] [--functions] Cria um bot
|
|
5
|
+
yuzuha init <diretório> [--js | --ts] [--functions] [--local] Cria um projeto de bot
|
|
6
6
|
yuzuha check [config ou diretório] [--json] Valida comandos sem login
|
|
7
7
|
yuzuha functions [--json] [--category nome] Lista funções e assinaturas
|
|
8
8
|
yuzuha lint <arquivo|diretório> [--json] [--catalog arquivo] Valida texto sem importar
|
|
@@ -15,6 +15,7 @@ yuzuha run [config] Carrega .env e conecta
|
|
|
15
15
|
yuzuha dev [config] Recarrega comandos ao editar
|
|
16
16
|
|
|
17
17
|
Config padrão: yuzuha.config.ts ou yuzuha.config.js. Node ${NODE_REQUIREMENT}.
|
|
18
|
+
init usa o pacote npm; --local vincula a instalação atual para desenvolvimento.
|
|
18
19
|
`;
|
|
19
20
|
export function parseArguments(args) {
|
|
20
21
|
const [action, ...rest] = args;
|
|
@@ -37,11 +38,12 @@ export function parseArguments(args) {
|
|
|
37
38
|
if (action === 'init') {
|
|
38
39
|
const [directory, ...flags] = rest;
|
|
39
40
|
if (!directory)
|
|
40
|
-
return fail('Use init <diretório> [--js | --ts].');
|
|
41
|
-
if (directory.startsWith('-') || flags.some(flag => !['--js', '--ts', '--functions'].includes(flag))
|
|
42
|
-
|| flags.filter(flag => flag === '--js' || flag === '--ts').length > 1)
|
|
43
|
-
fail('Use init <diretório> [--js | --ts] [--functions].');
|
|
44
|
-
|
|
41
|
+
return fail('Use init <diretório> [--js | --ts] [--functions] [--local].');
|
|
42
|
+
if (directory.startsWith('-') || flags.some(flag => !['--js', '--ts', '--functions', '--local'].includes(flag))
|
|
43
|
+
|| new Set(flags).size !== flags.length || flags.filter(flag => flag === '--js' || flag === '--ts').length > 1) {
|
|
44
|
+
fail('Use init <diretório> [--js | --ts] [--functions] [--local].');
|
|
45
|
+
}
|
|
46
|
+
return { action, directory, language: flags.includes('--js') ? 'js' : 'ts', functions: flags.includes('--functions'), local: flags.includes('--local') };
|
|
45
47
|
}
|
|
46
48
|
if (action === 'functions') {
|
|
47
49
|
let json = false, category, catalog = false, config, pluginsOnly = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"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","sourcesContent":["import { YuzuhaError } from '../errors.js';\nimport { NODE_REQUIREMENT, VERSION } from './version.js';\n\nexport const usage = `Yuzuha ${VERSION}\n\nyuzuha init <diretório> [--js | --ts] [--functions] Cria um bot local\nyuzuha check [config ou diretório] [--json] Valida comandos sem login\nyuzuha functions [--json] [--category nome] Lista funções e assinaturas\nyuzuha lint <arquivo|diretório> [--json] [--catalog arquivo] Valida texto sem importar\nyuzuha test <cenários.json> [--json] Executa cenários offline\nyuzuha data <stats|cleanup|backup|restore> <store> [opções] Manutenção offline\nyuzuha functions --catalog [--config arquivo] Exporta catálogo JSON\nyuzuha doctor [config] [--json] Diagnostica ambiente e configuração sem login\nyuzuha editor Mostra o caminho da extensão VS Code\nyuzuha run [config] Carrega .env e conecta\nyuzuha dev [config] Recarrega comandos ao editar\n\nConfig padrão: yuzuha.config.ts ou yuzuha.config.js. Node ${NODE_REQUIREMENT}.\n`;\n\nexport type CLIArguments = { action: 'help' } | { action: 'version' }\n | { action: 'init'; directory: string; language: 'js' | 'ts'; functions: boolean }\n | { action: 'functions'; json: boolean; category?: string; catalog?: boolean; config?: string; pluginsOnly?: boolean }\n | { action: 'lint'; input: string; json: boolean; catalogs: string[] }\n | { action: 'test'; input: string; json: boolean }\n | { action: 'data'; operation: 'stats' | 'cleanup' | 'backup' | 'restore'; input: string; json: boolean;\n limit?: number; cursor?: string; file?: string; policy?: 'replace' | 'merge'; apply: boolean }\n | { action: 'check' | 'doctor'; input?: string; json: boolean }\n | { action: 'editor' }\n | { action: 'run' | 'dev'; input?: string };\n\nexport function parseArguments(args: string[]): CLIArguments {\n const [action, ...rest] = args;\n const fail = (message = 'Argumentos inválidos.'): never => { throw new YuzuhaError('USAGE', `${message}\\n${usage}`); };\n if (!action || action === 'help' || action === '--help') {\n if (rest.length) fail();\n return { action: 'help' };\n }\n if (action === '--version') { if (rest.length) fail(); return { action: 'version' }; }\n if (action === 'editor') { if (rest.length) fail(); return { action }; }\n if (action === 'init') {\n const [directory, ...flags] = rest;\n if (!directory) return fail('Use init <diretório> [--js | --ts].');\n if (directory.startsWith('-') || flags.some(flag => !['--js', '--ts', '--functions'].includes(flag))\n || flags.filter(flag => flag === '--js' || flag === '--ts').length > 1) fail('Use init <diretório> [--js | --ts] [--functions].');\n return { action, directory, language: flags.includes('--js') ? 'js' : 'ts', functions: flags.includes('--functions') };\n }\n if (action === 'functions') {\n let json = false, category: string | undefined, catalog = false, config: string | undefined, pluginsOnly = false;\n for (let i = 0; i < rest.length; i++) {\n if (rest[i] === '--json' && !json) json = true;\n else if (rest[i] === '--catalog' && !catalog) catalog = true;\n else if (rest[i] === '--plugins-only' && !pluginsOnly) pluginsOnly = true;\n else if (rest[i] === '--category' && !category && rest[i + 1] && !rest[i + 1]!.startsWith('-')) category = rest[++i];\n else if (rest[i] === '--config' && !config && rest[i + 1] && !rest[i + 1]!.startsWith('-')) config = rest[++i];\n else fail();\n }\n if (config && !catalog) fail('--config exige functions --catalog.');\n if (pluginsOnly && (!catalog || !config)) fail('--plugins-only exige --catalog e --config explícito.');\n return { action, json, category, ...(catalog ? { catalog } : {}), ...(config ? { config } : {}), ...(pluginsOnly ? { pluginsOnly } : {}) };\n }\n if (action === 'lint' || action === 'test') {\n let input: string | undefined, json = false;\n const catalogs: string[] = [];\n for (let i = 0; i < rest.length; i++) {\n const value = rest[i]!;\n if (value === '--json' && !json) json = true;\n else if (action === 'lint' && value === '--catalog' && rest[i + 1] && !rest[i + 1]!.startsWith('-')) catalogs.push(rest[++i]!);\n else if (!value.startsWith('-') && !input) input = value;\n else fail();\n }\n if (!input) fail(`Use ${action} <arquivo ou diretório>.`);\n return action === 'lint' ? { action, input: input!, json, catalogs } : { action, input: input!, json };\n }\n if (action === 'data') {\n const [operation, input, ...flags] = rest;\n if (!['stats', 'cleanup', 'backup', 'restore'].includes(operation ?? '') || !input || input.startsWith('-')) fail('Use data <stats|cleanup|backup|restore> <store>.');\n let json = false, apply = false, limit: number | undefined, cursor: string | undefined, file: string | undefined, policy: 'replace' | 'merge' | undefined;\n for (let i = 0; i < flags.length; i++) {\n const flag = flags[i]!;\n const next = () => {\n const value = flags[++i];\n if (value === undefined || value.startsWith('--')) return fail('Opção exige um valor.');\n return value;\n };\n if (flag === '--json' && !json) json = true;\n else if (flag === '--apply' && operation === 'restore' && !apply) apply = true;\n else if (flag === '--limit' && operation === 'cleanup' && limit === undefined) {\n const raw = next(); limit = Number(raw);\n if (!/^\\d+$/.test(raw) || !Number.isSafeInteger(limit) || limit < 1 || limit > 10000) fail('Limite deve estar entre 1 e 10000.');\n } else if (flag === '--cursor' && operation === 'cleanup' && cursor === undefined) cursor = next();\n else if (flag === '--file' && ['backup', 'restore'].includes(operation!) && file === undefined) file = next();\n else if (flag === '--policy' && operation === 'restore' && policy === undefined) {\n const value = next(); if (value !== 'replace' && value !== 'merge') fail('Política deve ser replace ou merge.'); policy = value as 'replace' | 'merge';\n } else fail();\n }\n if (operation === 'restore' && !file) fail('Restauração exige --file <backup.json>.');\n return { action, operation: operation as 'stats' | 'cleanup' | 'backup' | 'restore', input: input!, json, apply,\n ...(limit === undefined ? {} : { limit }), ...(cursor === undefined ? {} : { cursor }),\n ...(file === undefined ? {} : { file }), ...(policy === undefined ? {} : { policy }) };\n }\n if (action === 'check' || action === 'doctor' || action === 'run' || action === 'dev') {\n let input: string | undefined, json = false;\n for (const value of rest) {\n if ((action === 'check' || action === 'doctor') && value === '--json' && !json) json = true;\n else if (!value.startsWith('-') && !input) input = value;\n else fail();\n }\n return action === 'check' || action === 'doctor' ? { action, input, json } : { action, input };\n }\n return fail(`Comando desconhecido: ${action}.`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"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","sourcesContent":["import { YuzuhaError } from '../errors.js';\nimport { NODE_REQUIREMENT, VERSION } from './version.js';\n\nexport const usage = `Yuzuha ${VERSION}\n\nyuzuha init <diretório> [--js | --ts] [--functions] [--local] Cria um projeto de bot\nyuzuha check [config ou diretório] [--json] Valida comandos sem login\nyuzuha functions [--json] [--category nome] Lista funções e assinaturas\nyuzuha lint <arquivo|diretório> [--json] [--catalog arquivo] Valida texto sem importar\nyuzuha test <cenários.json> [--json] Executa cenários offline\nyuzuha data <stats|cleanup|backup|restore> <store> [opções] Manutenção offline\nyuzuha functions --catalog [--config arquivo] Exporta catálogo JSON\nyuzuha doctor [config] [--json] Diagnostica ambiente e configuração sem login\nyuzuha editor Mostra o caminho da extensão VS Code\nyuzuha run [config] Carrega .env e conecta\nyuzuha dev [config] Recarrega comandos ao editar\n\nConfig padrão: yuzuha.config.ts ou yuzuha.config.js. Node ${NODE_REQUIREMENT}.\ninit usa o pacote npm; --local vincula a instalação atual para desenvolvimento.\n`;\n\nexport type CLIArguments = { action: 'help' } | { action: 'version' }\n | { action: 'init'; directory: string; language: 'js' | 'ts'; functions: boolean; local: boolean }\n | { action: 'functions'; json: boolean; category?: string; catalog?: boolean; config?: string; pluginsOnly?: boolean }\n | { action: 'lint'; input: string; json: boolean; catalogs: string[] }\n | { action: 'test'; input: string; json: boolean }\n | { action: 'data'; operation: 'stats' | 'cleanup' | 'backup' | 'restore'; input: string; json: boolean;\n limit?: number; cursor?: string; file?: string; policy?: 'replace' | 'merge'; apply: boolean }\n | { action: 'check' | 'doctor'; input?: string; json: boolean }\n | { action: 'editor' }\n | { action: 'run' | 'dev'; input?: string };\n\nexport function parseArguments(args: string[]): CLIArguments {\n const [action, ...rest] = args;\n const fail = (message = 'Argumentos inválidos.'): never => { throw new YuzuhaError('USAGE', `${message}\\n${usage}`); };\n if (!action || action === 'help' || action === '--help') {\n if (rest.length) fail();\n return { action: 'help' };\n }\n if (action === '--version') { if (rest.length) fail(); return { action: 'version' }; }\n if (action === 'editor') { if (rest.length) fail(); return { action }; }\n if (action === 'init') {\n const [directory, ...flags] = rest;\n if (!directory) return fail('Use init <diretório> [--js | --ts] [--functions] [--local].');\n if (directory.startsWith('-') || flags.some(flag => !['--js', '--ts', '--functions', '--local'].includes(flag))\n || new Set(flags).size !== flags.length || flags.filter(flag => flag === '--js' || flag === '--ts').length > 1) {\n fail('Use init <diretório> [--js | --ts] [--functions] [--local].');\n }\n return { action, directory, language: flags.includes('--js') ? 'js' : 'ts', functions: flags.includes('--functions'), local: flags.includes('--local') };\n }\n if (action === 'functions') {\n let json = false, category: string | undefined, catalog = false, config: string | undefined, pluginsOnly = false;\n for (let i = 0; i < rest.length; i++) {\n if (rest[i] === '--json' && !json) json = true;\n else if (rest[i] === '--catalog' && !catalog) catalog = true;\n else if (rest[i] === '--plugins-only' && !pluginsOnly) pluginsOnly = true;\n else if (rest[i] === '--category' && !category && rest[i + 1] && !rest[i + 1]!.startsWith('-')) category = rest[++i];\n else if (rest[i] === '--config' && !config && rest[i + 1] && !rest[i + 1]!.startsWith('-')) config = rest[++i];\n else fail();\n }\n if (config && !catalog) fail('--config exige functions --catalog.');\n if (pluginsOnly && (!catalog || !config)) fail('--plugins-only exige --catalog e --config explícito.');\n return { action, json, category, ...(catalog ? { catalog } : {}), ...(config ? { config } : {}), ...(pluginsOnly ? { pluginsOnly } : {}) };\n }\n if (action === 'lint' || action === 'test') {\n let input: string | undefined, json = false;\n const catalogs: string[] = [];\n for (let i = 0; i < rest.length; i++) {\n const value = rest[i]!;\n if (value === '--json' && !json) json = true;\n else if (action === 'lint' && value === '--catalog' && rest[i + 1] && !rest[i + 1]!.startsWith('-')) catalogs.push(rest[++i]!);\n else if (!value.startsWith('-') && !input) input = value;\n else fail();\n }\n if (!input) fail(`Use ${action} <arquivo ou diretório>.`);\n return action === 'lint' ? { action, input: input!, json, catalogs } : { action, input: input!, json };\n }\n if (action === 'data') {\n const [operation, input, ...flags] = rest;\n if (!['stats', 'cleanup', 'backup', 'restore'].includes(operation ?? '') || !input || input.startsWith('-')) fail('Use data <stats|cleanup|backup|restore> <store>.');\n let json = false, apply = false, limit: number | undefined, cursor: string | undefined, file: string | undefined, policy: 'replace' | 'merge' | undefined;\n for (let i = 0; i < flags.length; i++) {\n const flag = flags[i]!;\n const next = () => {\n const value = flags[++i];\n if (value === undefined || value.startsWith('--')) return fail('Opção exige um valor.');\n return value;\n };\n if (flag === '--json' && !json) json = true;\n else if (flag === '--apply' && operation === 'restore' && !apply) apply = true;\n else if (flag === '--limit' && operation === 'cleanup' && limit === undefined) {\n const raw = next(); limit = Number(raw);\n if (!/^\\d+$/.test(raw) || !Number.isSafeInteger(limit) || limit < 1 || limit > 10000) fail('Limite deve estar entre 1 e 10000.');\n } else if (flag === '--cursor' && operation === 'cleanup' && cursor === undefined) cursor = next();\n else if (flag === '--file' && ['backup', 'restore'].includes(operation!) && file === undefined) file = next();\n else if (flag === '--policy' && operation === 'restore' && policy === undefined) {\n const value = next(); if (value !== 'replace' && value !== 'merge') fail('Política deve ser replace ou merge.'); policy = value as 'replace' | 'merge';\n } else fail();\n }\n if (operation === 'restore' && !file) fail('Restauração exige --file <backup.json>.');\n return { action, operation: operation as 'stats' | 'cleanup' | 'backup' | 'restore', input: input!, json, apply,\n ...(limit === undefined ? {} : { limit }), ...(cursor === undefined ? {} : { cursor }),\n ...(file === undefined ? {} : { file }), ...(policy === undefined ? {} : { policy }) };\n }\n if (action === 'check' || action === 'doctor' || action === 'run' || action === 'dev') {\n let input: string | undefined, json = false;\n for (const value of rest) {\n if ((action === 'check' || action === 'doctor') && value === '--json' && !json) json = true;\n else if (!value.startsWith('-') && !input) input = value;\n else fail();\n }\n return action === 'check' || action === 'doctor' ? { action, input, json } : { action, input };\n }\n return fail(`Comando desconhecido: ${action}.`);\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ArgumentDefinition, Command } from '../commands/definition.js';
|
|
2
|
+
export type ArgumentMetadata = Omit<ArgumentDefinition, 'validators'>;
|
|
3
|
+
export interface CommandMetadata {
|
|
4
|
+
name: string;
|
|
5
|
+
aliases?: string[];
|
|
6
|
+
description?: string;
|
|
7
|
+
usage: string;
|
|
8
|
+
args: ArgumentMetadata[];
|
|
9
|
+
flags: ArgumentMetadata[];
|
|
10
|
+
examples: string[];
|
|
11
|
+
subcommands: CommandMetadata[];
|
|
12
|
+
}
|
|
13
|
+
export declare function commandCatalog(commands: readonly Command[], prefix?: string, parent?: string): CommandMetadata[];
|
|
14
|
+
//# sourceMappingURL=command-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-catalog.d.ts","sourceRoot":"","sources":["../../src/cli/command-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAG7E,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAQD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,MAAM,SAAK,EAAE,MAAM,SAAK,GAAG,eAAe,EAAE,CAcxG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { commandUsage } from '../commands/help.js';
|
|
2
|
+
function argumentMetadata(definition) {
|
|
3
|
+
const { name, type, required, rest, choices, defaultValue, min, max, aliases, description } = definition;
|
|
4
|
+
return { name, type, required, rest, choices: choices && [...choices], defaultValue, min, max,
|
|
5
|
+
aliases: aliases && [...aliases], description };
|
|
6
|
+
}
|
|
7
|
+
export function commandCatalog(commands, prefix = '', parent = '') {
|
|
8
|
+
return commands.map(command => {
|
|
9
|
+
const path = parent ? `${parent} ${command.name}` : command.name;
|
|
10
|
+
return {
|
|
11
|
+
name: command.name,
|
|
12
|
+
aliases: command.aliases && [...command.aliases],
|
|
13
|
+
description: command.description,
|
|
14
|
+
usage: commandUsage({ ...command, name: path }, prefix),
|
|
15
|
+
args: (command.args ?? []).map(argumentMetadata),
|
|
16
|
+
flags: (command.flags ?? []).map(argumentMetadata),
|
|
17
|
+
examples: [...command.examples ?? []],
|
|
18
|
+
subcommands: commandCatalog(command.subcommands ?? [], prefix, path),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=command-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-catalog.js","sourceRoot":"","sources":["../../src/cli/command-catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAenD,SAAS,gBAAgB,CAAC,UAA8B;IACtD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;IACzG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;QAC3F,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA4B,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE;IACnF,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAChD,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC;YACvD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAChD,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAClD,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YACrC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC;SACrE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { ArgumentDefinition, Command } from '../commands/definition.js';\nimport { commandUsage } from '../commands/help.js';\n\nexport type ArgumentMetadata = Omit<ArgumentDefinition, 'validators'>;\n\nexport interface CommandMetadata {\n name: string;\n aliases?: string[];\n description?: string;\n usage: string;\n args: ArgumentMetadata[];\n flags: ArgumentMetadata[];\n examples: string[];\n subcommands: CommandMetadata[];\n}\n\nfunction argumentMetadata(definition: ArgumentDefinition): ArgumentMetadata {\n const { name, type, required, rest, choices, defaultValue, min, max, aliases, description } = definition;\n return { name, type, required, rest, choices: choices && [...choices], defaultValue, min, max,\n aliases: aliases && [...aliases], description };\n}\n\nexport function commandCatalog(commands: readonly Command[], prefix = '', parent = ''): CommandMetadata[] {\n return commands.map(command => {\n const path = parent ? `${parent} ${command.name}` : command.name;\n return {\n name: command.name,\n aliases: command.aliases && [...command.aliases],\n description: command.description,\n usage: commandUsage({ ...command, name: path }, prefix),\n args: (command.args ?? []).map(argumentMetadata),\n flags: (command.flags ?? []).map(argumentMetadata),\n examples: [...command.examples ?? []],\n subcommands: commandCatalog(command.subcommands ?? [], prefix, path),\n };\n });\n}\n"]}
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAiBA,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEtE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAQpE"}
|
package/dist/cli/main.js
CHANGED
|
@@ -13,6 +13,7 @@ import { runBot } from './runner.js';
|
|
|
13
13
|
import { scaffold } from './scaffold.js';
|
|
14
14
|
import { packageRoot, VERSION } from './version.js';
|
|
15
15
|
import { doctor } from './doctor.js';
|
|
16
|
+
import { commandCatalog } from './command-catalog.js';
|
|
16
17
|
export async function main(args = process.argv.slice(2)) {
|
|
17
18
|
const options = parseArguments(args);
|
|
18
19
|
if (options.action === 'help') {
|
|
@@ -56,7 +57,7 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
59
|
if (options.action === 'init') {
|
|
59
|
-
await scaffold(options.directory, options.language, options.functions);
|
|
60
|
+
await scaffold(options.directory, options.language, options.functions, options.local);
|
|
60
61
|
return;
|
|
61
62
|
}
|
|
62
63
|
if (options.action === 'functions') {
|
|
@@ -101,7 +102,9 @@ export async function main(args = process.argv.slice(2)) {
|
|
|
101
102
|
({ bot, commandsPath } = await configuredBot(await findConfig(options.input), options.action !== 'check'));
|
|
102
103
|
if (options.action === 'check') {
|
|
103
104
|
try {
|
|
104
|
-
const
|
|
105
|
+
const configuredPrefix = bot.options.prefix;
|
|
106
|
+
const prefix = typeof configuredPrefix === 'string' ? configuredPrefix : Array.isArray(configuredPrefix) ? configuredPrefix[0] ?? '!' : '!';
|
|
107
|
+
const commands = commandCatalog(bot.listCommands(), prefix);
|
|
105
108
|
console.log(options.json ? JSON.stringify({ valid: true, version: VERSION, commands }, null, 2) : `${commands.length} comandos válidos. Nenhum login realizado.`);
|
|
106
109
|
}
|
|
107
110
|
finally {
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { lint } from './lint.js';\nimport { runScenarios } from './scenarios.js';\nimport { dataCommand } from './data.js';\nimport { stat } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { Yuzuha } from '../bot.js';\nimport { ScriptError, YuzuhaError } from '../errors.js';\nimport { registerBuiltins } from '../functions.js';\nimport { Runtime } from '../runtime.js';\nimport { parseArguments, usage } from './arguments.js';\nimport { configuredBot, findConfig } from './config.js';\nimport { runBot } from './runner.js';\nimport { scaffold } from './scaffold.js';\nimport { packageRoot, VERSION } from './version.js';\nimport { doctor } from './doctor.js';\n\nexport async function main(args = process.argv.slice(2)): Promise<void> {\n const options = parseArguments(args);\n if (options.action === 'help') { console.log(usage); return; }\n if (options.action === 'version') { console.log(VERSION); return; }\n if (options.action === 'editor') { console.log(resolve(packageRoot, 'editors/vscode')); return; }\n if (options.action === 'lint') {\n const report = await lint(options.input, options.catalogs);\n console.log(options.json ? JSON.stringify(report, null, 2) : report.diagnostics.length\n ? report.diagnostics.map(value => `${value.file}:${value.range.start.line}:${value.range.start.column} [${value.code}] ${value.message}`).join('\\n')\n : `${report.files} arquivos válidos. Nenhum módulo importado.`);\n if (!report.valid) process.exitCode = 1;\n return;\n }\n if (options.action === 'test') {\n const report = await runScenarios(resolve(options.input));\n console.log(options.json ? JSON.stringify(report, null, 2) : report.scenarios.map(value => `${value.passed ? 'PASS' : 'FAIL'} ${value.name}: ${value.messages.filter(message => message.passed).length}/${value.messages.length}`).join('\\n'));\n if (!report.valid) process.exitCode = 1;\n return;\n }\n if (options.action === 'data') {\n const report = await dataCommand(options);\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n if (options.action === 'doctor') {\n const report = await doctor(options.input);\n console.log(options.json ? JSON.stringify(report, null, 2) : report.checks.map(check => `${check.status.toUpperCase()} ${check.name}: ${check.message}`).join('\\n'));\n if (!report.ok) process.exitCode = 1;\n return;\n }\n if (options.action === 'init') { await scaffold(options.directory, options.language, options.functions); return; }\n if (options.action === 'functions') {\n let catalogBot: Yuzuha | undefined;\n let all;\n try {\n if (options.config) {\n ({ bot: catalogBot } = await configuredBot(await findConfig(options.config), false, false));\n all = catalogBot.enableFunctions().runtime.functions();\n } else all = registerBuiltins(new Runtime()).functions();\n } finally { if (catalogBot) { await catalogBot.destroy(); await catalogBot.options.store?.close?.(); } }\n\n const builtinNames = options.pluginsOnly ? new Set(registerBuiltins(new Runtime()).functions().map(fn => fn.name.replace(/^\\$/, '').toLowerCase())) : undefined;\n const visible = builtinNames ? all.filter(fn => !builtinNames.has(fn.name.replace(/^\\$/, '').toLowerCase())) : all;\n const functions = options.category ? visible.filter(fn => fn.category === options.category) : visible;\n if (options.category && !functions.length) throw new YuzuhaError('CATEGORY', `Categoria desconhecida. Escolha: ${[...new Set(all.map(fn => fn.category))].join(', ')}.`);\n const metadata = functions.map(({ execute: _execute, ...value }) => value);\n console.log(options.catalog ? JSON.stringify({ version: 1, functions: metadata }, null, 2) : options.json ? JSON.stringify(metadata, null, 2) : functions.map(fn => `${fn.usage.padEnd(52)} ${fn.description}`).join('\\n'));\n return;\n }\n let bot: Yuzuha, commandsPath: string;\n if (options.action === 'check' && options.input && (await stat(resolve(options.input))).isDirectory()) {\n bot = new Yuzuha(); commandsPath = resolve(options.input);\n try { await bot.load(commandsPath); } catch (error) { await bot.destroy(); throw error; }\n } else ({ bot, commandsPath } = await configuredBot(await findConfig(options.input), options.action !== 'check'));\n if (options.action === 'check') {\n try {\n const commands = bot.listCommands().map(({ name, aliases, description }) => ({ name, aliases, description }));\n console.log(options.json ? JSON.stringify({ valid: true, version: VERSION, commands }, null, 2) : `${commands.length} comandos válidos. Nenhum login realizado.`);\n } finally { await bot.destroy(); await bot.options.store?.close?.(); }\n return;\n }\n await runBot(bot, commandsPath, options.action === 'dev');\n}\n\nexport function formatCLIError(error: unknown, json: boolean): string {\n const code = error instanceof YuzuhaError ? error.code : (error as NodeJS.ErrnoException)?.code ?? 'CLI_ERROR';\n const message = error instanceof ScriptError ? error.format()\n : error instanceof YuzuhaError ? error.message\n : code === 'ENOENT' ? 'Arquivo ou diretório não encontrado. Confira o caminho informado.'\n : code === 'EEXIST' ? 'O diretório já existe. Escolha um diretório novo para gerar o bot.'\n : 'Falha ao executar. Confira configuração, dependências e conexão.';\n return json ? JSON.stringify({ valid: false, code, message }) : `[${code}] ${message}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACjG,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM;YACpF,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACpJ,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,6CAA6C,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/O,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrK,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACjI,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,IAAI,UAA8B,CAAC;QACnC,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC5F,GAAG,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACzD,CAAC;;gBAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAC3D,CAAC;gBAAS,CAAC;YAAC,IAAI,UAAU,EAAE,CAAC;gBAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;YAAC,CAAC;QAAC,CAAC;QAExG,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChK,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACnH,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACtG,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,oCAAoC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzK,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5N,OAAO;IACT,CAAC;IACD,IAAI,GAAW,EAAE,YAAoB,CAAC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtG,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;QAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IAC3F,CAAC;;QAAM,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC;IAClH,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C,MAAM,MAAM,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5I,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,4CAA4C,CAAC,CAAC;QACpK,CAAC;gBAAS,CAAC;YAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAAC,CAAC;QACtE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAa;IAC1D,MAAM,IAAI,GAAG,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,KAA+B,EAAE,IAAI,IAAI,WAAW,CAAC;IAC/G,MAAM,OAAO,GAAG,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;QAC3D,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;YAC9C,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mEAAmE;gBACzF,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,oEAAoE;oBAC1F,CAAC,CAAC,kEAAkE,CAAC;IACvE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;AACzF,CAAC","sourcesContent":["import { lint } from './lint.js';\nimport { runScenarios } from './scenarios.js';\nimport { dataCommand } from './data.js';\nimport { stat } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { Yuzuha } from '../bot.js';\nimport { ScriptError, YuzuhaError } from '../errors.js';\nimport { registerBuiltins } from '../functions.js';\nimport { Runtime } from '../runtime.js';\nimport { parseArguments, usage } from './arguments.js';\nimport { configuredBot, findConfig } from './config.js';\nimport { runBot } from './runner.js';\nimport { scaffold } from './scaffold.js';\nimport { packageRoot, VERSION } from './version.js';\nimport { doctor } from './doctor.js';\nimport { commandCatalog } from './command-catalog.js';\n\nexport async function main(args = process.argv.slice(2)): Promise<void> {\n const options = parseArguments(args);\n if (options.action === 'help') { console.log(usage); return; }\n if (options.action === 'version') { console.log(VERSION); return; }\n if (options.action === 'editor') { console.log(resolve(packageRoot, 'editors/vscode')); return; }\n if (options.action === 'lint') {\n const report = await lint(options.input, options.catalogs);\n console.log(options.json ? JSON.stringify(report, null, 2) : report.diagnostics.length\n ? report.diagnostics.map(value => `${value.file}:${value.range.start.line}:${value.range.start.column} [${value.code}] ${value.message}`).join('\\n')\n : `${report.files} arquivos válidos. Nenhum módulo importado.`);\n if (!report.valid) process.exitCode = 1;\n return;\n }\n if (options.action === 'test') {\n const report = await runScenarios(resolve(options.input));\n console.log(options.json ? JSON.stringify(report, null, 2) : report.scenarios.map(value => `${value.passed ? 'PASS' : 'FAIL'} ${value.name}: ${value.messages.filter(message => message.passed).length}/${value.messages.length}`).join('\\n'));\n if (!report.valid) process.exitCode = 1;\n return;\n }\n if (options.action === 'data') {\n const report = await dataCommand(options);\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n if (options.action === 'doctor') {\n const report = await doctor(options.input);\n console.log(options.json ? JSON.stringify(report, null, 2) : report.checks.map(check => `${check.status.toUpperCase()} ${check.name}: ${check.message}`).join('\\n'));\n if (!report.ok) process.exitCode = 1;\n return;\n }\n if (options.action === 'init') { await scaffold(options.directory, options.language, options.functions, options.local); return; }\n if (options.action === 'functions') {\n let catalogBot: Yuzuha | undefined;\n let all;\n try {\n if (options.config) {\n ({ bot: catalogBot } = await configuredBot(await findConfig(options.config), false, false));\n all = catalogBot.enableFunctions().runtime.functions();\n } else all = registerBuiltins(new Runtime()).functions();\n } finally { if (catalogBot) { await catalogBot.destroy(); await catalogBot.options.store?.close?.(); } }\n\n const builtinNames = options.pluginsOnly ? new Set(registerBuiltins(new Runtime()).functions().map(fn => fn.name.replace(/^\\$/, '').toLowerCase())) : undefined;\n const visible = builtinNames ? all.filter(fn => !builtinNames.has(fn.name.replace(/^\\$/, '').toLowerCase())) : all;\n const functions = options.category ? visible.filter(fn => fn.category === options.category) : visible;\n if (options.category && !functions.length) throw new YuzuhaError('CATEGORY', `Categoria desconhecida. Escolha: ${[...new Set(all.map(fn => fn.category))].join(', ')}.`);\n const metadata = functions.map(({ execute: _execute, ...value }) => value);\n console.log(options.catalog ? JSON.stringify({ version: 1, functions: metadata }, null, 2) : options.json ? JSON.stringify(metadata, null, 2) : functions.map(fn => `${fn.usage.padEnd(52)} ${fn.description}`).join('\\n'));\n return;\n }\n let bot: Yuzuha, commandsPath: string;\n if (options.action === 'check' && options.input && (await stat(resolve(options.input))).isDirectory()) {\n bot = new Yuzuha(); commandsPath = resolve(options.input);\n try { await bot.load(commandsPath); } catch (error) { await bot.destroy(); throw error; }\n } else ({ bot, commandsPath } = await configuredBot(await findConfig(options.input), options.action !== 'check'));\n if (options.action === 'check') {\n try {\n const configuredPrefix = bot.options.prefix;\n const prefix = typeof configuredPrefix === 'string' ? configuredPrefix : Array.isArray(configuredPrefix) ? configuredPrefix[0] ?? '!' : '!';\n const commands = commandCatalog(bot.listCommands(), prefix);\n console.log(options.json ? JSON.stringify({ valid: true, version: VERSION, commands }, null, 2) : `${commands.length} comandos válidos. Nenhum login realizado.`);\n } finally { await bot.destroy(); await bot.options.store?.close?.(); }\n return;\n }\n await runBot(bot, commandsPath, options.action === 'dev');\n}\n\nexport function formatCLIError(error: unknown, json: boolean): string {\n const code = error instanceof YuzuhaError ? error.code : (error as NodeJS.ErrnoException)?.code ?? 'CLI_ERROR';\n const message = error instanceof ScriptError ? error.format()\n : error instanceof YuzuhaError ? error.message\n : code === 'ENOENT' ? 'Arquivo ou diretório não encontrado. Confira o caminho informado.'\n : code === 'EEXIST' ? 'O diretório já existe. Escolha um diretório novo para gerar o bot.'\n : 'Falha ao executar. Confira configuração, dependências e conexão.';\n return json ? JSON.stringify({ valid: false, code, message }) : `[${code}] ${message}`;\n}\n"]}
|
package/dist/cli/scaffold.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function scaffold(directory: string, language: 'js' | 'ts', functions?: boolean): Promise<void>;
|
|
1
|
+
export declare function scaffold(directory: string, language: 'js' | 'ts', functions?: boolean, local?: boolean): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAiBA,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAiBA,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,UAAQ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BxH"}
|
package/dist/cli/scaffold.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { basename, join, resolve } from 'node:path';
|
|
3
3
|
import { YuzuhaError } from '../errors.js';
|
|
4
|
-
import { NODE_REQUIREMENT, packageRoot } from './version.js';
|
|
4
|
+
import { NODE_REQUIREMENT, packageRoot, VERSION } from './version.js';
|
|
5
5
|
function commandFiles(extension, functions) {
|
|
6
6
|
const files = {
|
|
7
7
|
[`commands/ping.${extension}`]: `import { defineCommand } from 'yuzuha';\n\nexport default defineCommand({\n name: 'ping',\n description: 'Latência do bot.',\n async run(ctx) {\n await ctx.reply(\`Pong! \${ctx.transport.ping} ms\`);\n },\n});\n`,
|
|
@@ -13,31 +13,34 @@ function commandFiles(extension, functions) {
|
|
|
13
13
|
}
|
|
14
14
|
return files;
|
|
15
15
|
}
|
|
16
|
-
export async function scaffold(directory, language, functions = false) {
|
|
16
|
+
export async function scaffold(directory, language, functions = false, local = false) {
|
|
17
17
|
const root = resolve(directory);
|
|
18
18
|
const name = basename(root).toLowerCase().replace(/[^a-z0-9_-]/g, '-');
|
|
19
19
|
if (!name || name.startsWith('-'))
|
|
20
20
|
throw new YuzuhaError('INIT_NAME', 'Escolha um nome de diretório válido.');
|
|
21
|
-
const scripts = { start: 'yuzuha run', dev: 'yuzuha dev', check: 'yuzuha check'
|
|
21
|
+
const scripts = { start: 'yuzuha run', dev: 'yuzuha dev', check: 'yuzuha check',
|
|
22
|
+
test: language === 'ts' ? 'tsx --test test/*.test.ts' : 'node --test test/*.test.js' };
|
|
22
23
|
if (language === 'ts')
|
|
23
24
|
scripts['typecheck'] = 'tsc --noEmit';
|
|
24
25
|
const manifest = { name, version: '0.1.0', private: true, type: 'module', engines: { node: NODE_REQUIREMENT },
|
|
25
|
-
scripts, dependencies: { yuzuha: `file:${packageRoot}` },
|
|
26
|
-
...(language === 'ts' ? { devDependencies: { typescript: '^5.9.0', '@types/node': '^22.0.0' } } : {}),
|
|
26
|
+
scripts, dependencies: { yuzuha: local ? `file:${packageRoot}` : `^${VERSION}` },
|
|
27
|
+
...(language === 'ts' ? { devDependencies: { typescript: '^5.9.0', '@types/node': '^22.0.0', tsx: '^4.20.0' } } : {}),
|
|
27
28
|
};
|
|
28
29
|
const files = {
|
|
29
30
|
...commandFiles(language, functions),
|
|
31
|
+
[`test/hello.test.${language}`]: `import test from 'node:test';\nimport assert from 'node:assert/strict';\nimport { createTestBot } from 'yuzuha/testing';\nimport hello from '../commands/hello.js';\n\ntest('hello responde com o nome informado sem conectar ao Fluxer', async t => {\n const fixture = createTestBot({ commands: [hello] });\n t.after(() => fixture.destroy());\n\n const outcome = await fixture.send('!hello Yuzuha');\n\n assert.equal(outcome, 'success');\n assert.deepEqual(fixture.messages.map(message => message.payload.content), ['Olá, Yuzuha!']);\n assert.deepEqual(fixture.errors, []);\n});\n`,
|
|
30
32
|
'package.json': `${JSON.stringify(manifest, null, 2)}\n`,
|
|
31
33
|
'.env.example': 'FLUXER_BOT_TOKEN=\n',
|
|
32
34
|
'.gitignore': 'node_modules/\n.env\ndata/\n',
|
|
33
35
|
[`yuzuha.config.${language}`]: `import { defineConfig } from 'yuzuha';\n\nexport default defineConfig({\n name: ${JSON.stringify(name)},\n prefix: '!',\n commands: './commands',\n});\n`,
|
|
34
|
-
'README.md': `# ${name}\n\nBot do Fluxer com Yuzuha.\n\n1. Execute \`npm install\`.\n2. Execute \`npm run check\` para validar offline.\n3. Copie \`.env.example\` para \`.env\` e preencha o token.\n4. Execute \`npm run dev\` ou \`npm start\`.\n\nComandos: \`!ping\`, \`!hello\`, \`!ban @membro motivo\`.\n\
|
|
36
|
+
'README.md': `# ${name}\n\nBot do Fluxer com Yuzuha.\n\n1. Execute \`npm install\`.\n2. Execute \`npm run check\` e \`npm test\` para validar offline.\n3. Copie \`.env.example\` para \`.env\` e preencha o token.\n4. Execute \`npm run dev\` ou \`npm start\`.\n\nComandos: \`!ping\`, \`!hello\`, \`!ban @membro motivo\`.\n\n${local ? 'A dependência local aponta para a instalação que gerou este projeto. Para compartilhar, troque-a pela versão publicada no npm.' : 'A dependência do Yuzuha usa a versão do npm, permitindo instalar o projeto em outra máquina.'}\nO teste de exemplo usa \`yuzuha/testing\`, sem token nem conexão ao Fluxer.\nCasos e variáveis ficam no diretório XDG de dados do Yuzuha, sob o nome deste bot.\n`,
|
|
35
37
|
};
|
|
36
38
|
if (language === 'ts')
|
|
37
39
|
files['tsconfig.json'] = `${JSON.stringify({ compilerOptions: { target: 'ES2023', module: 'NodeNext', moduleResolution: 'NodeNext', strict: true, noEmit: true }, include: ['**/*.ts'] }, null, 2)}\n`;
|
|
38
40
|
await mkdir(root, { recursive: false });
|
|
39
41
|
try {
|
|
40
42
|
await mkdir(join(root, 'commands'));
|
|
43
|
+
await mkdir(join(root, 'test'));
|
|
41
44
|
for (const [file, content] of Object.entries(files))
|
|
42
45
|
await writeFile(join(root, file), content, { flag: 'wx', mode: 0o644 });
|
|
43
46
|
}
|
|
@@ -45,6 +48,6 @@ export async function scaffold(directory, language, functions = false) {
|
|
|
45
48
|
await rm(root, { recursive: true, force: true });
|
|
46
49
|
throw error;
|
|
47
50
|
}
|
|
48
|
-
console.log(`Criado: ${root}\nEntre no diretório e execute npm install
|
|
51
|
+
console.log(`Criado: ${root}\nEntre no diretório e execute npm install, npm run check e npm test.`);
|
|
49
52
|
}
|
|
50
53
|
//# sourceMappingURL=scaffold.js.map
|
package/dist/cli/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtE,SAAS,YAAY,CAAC,SAAiB,EAAE,SAAkB;IACzD,MAAM,KAAK,GAA2B;QACpC,CAAC,iBAAiB,SAAS,EAAE,CAAC,EAAE,4NAA4N;QAC5P,CAAC,gBAAgB,SAAS,EAAE,CAAC,EAAE,6bAA6b;QAC5d,CAAC,kBAAkB,SAAS,EAAE,CAAC,EAAE,gTAAgT;KAClV,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,gBAAgB,SAAS,EAAE,CAAC,GAAG,gLAAgL,CAAC;IACxN,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,QAAqB,EAAE,SAAS,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK;IACvG,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,sCAAsC,CAAC,CAAC;IAC9G,MAAM,OAAO,GAA2B,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc;QACrG,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC;IACzF,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC;IAC7D,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;QAC3G,OAAO,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,EAAE;QAChF,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtH,CAAC;IACF,MAAM,KAAK,GAA2B;QACpC,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC;QACpC,CAAC,mBAAmB,QAAQ,EAAE,CAAC,EAAE,wkBAAwkB;QACzmB,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;QACxD,cAAc,EAAE,qBAAqB;QACrC,YAAY,EAAE,8BAA8B;QAC5C,CAAC,iBAAiB,QAAQ,EAAE,CAAC,EAAE,oFAAoF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qDAAqD;QAC5L,WAAW,EAAE,KAAK,IAAI,8SAA8S,KAAK,CAAC,CAAC,CAAC,gIAAgI,CAAC,CAAC,CAAC,8FAA8F,qKAAqK;KACntB,CAAC;IACF,IAAI,QAAQ,KAAK,IAAI;QAAE,KAAK,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC9N,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,uEAAuE,CAAC,CAAC;AACtG,CAAC","sourcesContent":["import { mkdir, rm, writeFile } from 'node:fs/promises';\nimport { basename, join, resolve } from 'node:path';\nimport { YuzuhaError } from '../errors.js';\nimport { NODE_REQUIREMENT, packageRoot, VERSION } from './version.js';\n\nfunction commandFiles(extension: string, functions: boolean): Record<string, string> {\n const files: Record<string, string> = {\n [`commands/ping.${extension}`]: `import { defineCommand } from 'yuzuha';\\n\\nexport default defineCommand({\\n name: 'ping',\\n description: 'Latência do bot.',\\n async run(ctx) {\\n await ctx.reply(\\`Pong! \\${ctx.transport.ping} ms\\`);\\n },\\n});\\n`,\n [`commands/ban.${extension}`]: `import { arg, defineCommand } from 'yuzuha';\\n\\nexport default defineCommand({\\n name: 'ban',\\n description: 'Bane um membro e registra um caso.',\\n args: {\\n membro: arg.user().required(),\\n motivo: arg.text().rest(),\\n },\\n async run(ctx) {\\n const caso = await ctx.mod.ban(ctx.args.get('membro'), {\\n reason: ctx.args.get('motivo') ?? '',\\n });\\n await ctx.reply(\\`Membro banido. Caso #\\${caso.id}.\\`);\\n },\\n});\\n`,\n [`commands/hello.${extension}`]: `import { arg, defineCommand } from 'yuzuha';\\n\\nexport default defineCommand({\\n name: 'hello',\\n description: 'Exemplo de comando nativo com argumento tipado.',\\n args: { nome: arg.text().default('mundo') },\\n async run(ctx) {\\n await ctx.reply(\\`Olá, \\${ctx.args.get('nome')}!\\`);\\n },\\n});\\n`,\n };\n if (functions) {\n files[`commands/eco.${extension}`] = `import { script } from 'yuzuha/functions';\\n\\nexport default script({\\n name: 'eco',\\n description: 'Exemplo de function mode.',\\n code: '$reply[$messageSlice[0]]',\\n});\\n`;\n }\n return files;\n}\n\nexport async function scaffold(directory: string, language: 'js' | 'ts', functions = false, local = false): Promise<void> {\n const root = resolve(directory);\n const name = basename(root).toLowerCase().replace(/[^a-z0-9_-]/g, '-');\n if (!name || name.startsWith('-')) throw new YuzuhaError('INIT_NAME', 'Escolha um nome de diretório válido.');\n const scripts: Record<string, string> = { start: 'yuzuha run', dev: 'yuzuha dev', check: 'yuzuha check',\n test: language === 'ts' ? 'tsx --test test/*.test.ts' : 'node --test test/*.test.js' };\n if (language === 'ts') scripts['typecheck'] = 'tsc --noEmit';\n const manifest = { name, version: '0.1.0', private: true, type: 'module', engines: { node: NODE_REQUIREMENT },\n scripts, dependencies: { yuzuha: local ? `file:${packageRoot}` : `^${VERSION}` },\n ...(language === 'ts' ? { devDependencies: { typescript: '^5.9.0', '@types/node': '^22.0.0', tsx: '^4.20.0' } } : {}),\n };\n const files: Record<string, string> = {\n ...commandFiles(language, functions),\n [`test/hello.test.${language}`]: `import test from 'node:test';\\nimport assert from 'node:assert/strict';\\nimport { createTestBot } from 'yuzuha/testing';\\nimport hello from '../commands/hello.js';\\n\\ntest('hello responde com o nome informado sem conectar ao Fluxer', async t => {\\n const fixture = createTestBot({ commands: [hello] });\\n t.after(() => fixture.destroy());\\n\\n const outcome = await fixture.send('!hello Yuzuha');\\n\\n assert.equal(outcome, 'success');\\n assert.deepEqual(fixture.messages.map(message => message.payload.content), ['Olá, Yuzuha!']);\\n assert.deepEqual(fixture.errors, []);\\n});\\n`,\n 'package.json': `${JSON.stringify(manifest, null, 2)}\\n`,\n '.env.example': 'FLUXER_BOT_TOKEN=\\n',\n '.gitignore': 'node_modules/\\n.env\\ndata/\\n',\n [`yuzuha.config.${language}`]: `import { defineConfig } from 'yuzuha';\\n\\nexport default defineConfig({\\n name: ${JSON.stringify(name)},\\n prefix: '!',\\n commands: './commands',\\n});\\n`,\n 'README.md': `# ${name}\\n\\nBot do Fluxer com Yuzuha.\\n\\n1. Execute \\`npm install\\`.\\n2. Execute \\`npm run check\\` e \\`npm test\\` para validar offline.\\n3. Copie \\`.env.example\\` para \\`.env\\` e preencha o token.\\n4. Execute \\`npm run dev\\` ou \\`npm start\\`.\\n\\nComandos: \\`!ping\\`, \\`!hello\\`, \\`!ban @membro motivo\\`.\\n\\n${local ? 'A dependência local aponta para a instalação que gerou este projeto. Para compartilhar, troque-a pela versão publicada no npm.' : 'A dependência do Yuzuha usa a versão do npm, permitindo instalar o projeto em outra máquina.'}\\nO teste de exemplo usa \\`yuzuha/testing\\`, sem token nem conexão ao Fluxer.\\nCasos e variáveis ficam no diretório XDG de dados do Yuzuha, sob o nome deste bot.\\n`,\n };\n if (language === 'ts') files['tsconfig.json'] = `${JSON.stringify({ compilerOptions: { target: 'ES2023', module: 'NodeNext', moduleResolution: 'NodeNext', strict: true, noEmit: true }, include: ['**/*.ts'] }, null, 2)}\\n`;\n await mkdir(root, { recursive: false });\n try {\n await mkdir(join(root, 'commands'));\n await mkdir(join(root, 'test'));\n for (const [file, content] of Object.entries(files)) await writeFile(join(root, file), content, { flag: 'wx', mode: 0o644 });\n } catch (error) { await rm(root, { recursive: true, force: true }); throw error; }\n console.log(`Criado: ${root}\\nEntre no diretório e execute npm install, npm run check e npm test.`);\n}\n"]}
|
|
@@ -3,4 +3,9 @@ export type ArgumentValue = string | number | boolean;
|
|
|
3
3
|
export declare function validateArgumentDefinitions(definitions: readonly ArgumentDefinition[], commandName?: string): void;
|
|
4
4
|
export declare function parseArguments(definitions: readonly ArgumentDefinition[], tokens: readonly string[]): Map<string, ArgumentValue>;
|
|
5
5
|
export declare function tokenize(input: string): string[];
|
|
6
|
+
export declare function validateFlagDefinitions(definitions: readonly ArgumentDefinition[], commandName: string): void;
|
|
7
|
+
export declare function parseFlags(definitions: readonly ArgumentDefinition[] | undefined, tokens: readonly string[]): {
|
|
8
|
+
tokens: string[];
|
|
9
|
+
flags: Map<string, ArgumentValue>;
|
|
10
|
+
};
|
|
6
11
|
//# sourceMappingURL=arguments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/commands/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAI1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAqBtD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,EAAE,WAAW,SAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/commands/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAI1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAqBtD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,EAAE,WAAW,SAAY,GAAG,IAAI,CAuCrH;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAoChI;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBhD;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAY7G;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG;IAC7G,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACrD,CAiCA"}
|