primocode 9.3.1 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/area.js DELETED
@@ -1,104 +0,0 @@
1
- /**
2
- * area.js — a área de transferência e o foco do terminal, sem dependência.
3
- *
4
- * "No login quero que ele copie o código pra área de transferência
5
- * automaticamente. [...] Ele libera, você volta ao terminal
6
- * automaticamente."
7
- *
8
- * ── POR QUE FALAR COM O SISTEMA, E NÃO COM UM PACOTE ────────────────────
9
- * O CLI tem zero dependências e isto não é motivo para abrir a primeira: todo
10
- * sistema já tem um programa que escreve na área de transferência (pbcopy,
11
- * clip, wl-copy, xclip, xsel). O que este módulo faz é achar qual existe e
12
- * falar com ele — e FALHAR EM SILÊNCIO quando nenhum existe, porque copiar é
13
- * conveniência: o código continua na tela e a página continua aceitando
14
- * digitação. Conveniência que derruba o login não é conveniência.
15
- *
16
- * ── O FOCO SÓ VOLTA NO MAC, E É HONESTO DIZER ────────────────────────────
17
- * Trazer o terminal para a frente depois de a página aprovar é o que fecha o
18
- * laço "clicou → voltou". No macOS dá: o `TERM_PROGRAM` diz qual app é o
19
- * terminal e o `osascript` o ativa. No Windows e no Linux não há um jeito
20
- * geral que funcione sem depender do gerenciador de janelas — então lá o CLI
21
- * apita e imprime o próximo passo, e a janela do navegador diz "volte ao
22
- * terminal". Prometer o foco onde ele não vem seria pior que não prometer.
23
- */
24
-
25
- 'use strict';
26
-
27
- const os = require('os');
28
- const { execFile, execFileSync } = require('child_process');
29
-
30
- /* Cada candidato é [programa, argumentos]. A ordem dentro de cada sistema é
31
- a do que existe com mais frequência: no Linux o Wayland vem primeiro
32
- porque, quando ele é a sessão, o xclip existe e NÃO funciona. */
33
- function candidatos() {
34
- const p = os.platform();
35
- if (p === 'darwin') return [['pbcopy', []]];
36
- if (p === 'win32') return [['clip', []]];
37
- const lista = [];
38
- if (process.env.WAYLAND_DISPLAY) lista.push(['wl-copy', []]);
39
- lista.push(['xclip', ['-selection', 'clipboard']], ['xsel', ['--clipboard', '--input']]);
40
- if (!process.env.WAYLAND_DISPLAY) lista.push(['wl-copy', []]);
41
- return lista;
42
- }
43
-
44
- /**
45
- * Copia o texto para a área de transferência.
46
- * @returns {Promise<{ok:boolean, como?:string}>} nunca rejeita
47
- */
48
- function copiar(texto) {
49
- const fila = candidatos();
50
- return new Promise((resolve) => {
51
- const tentar = (i) => {
52
- if (i >= fila.length) return resolve({ ok: false });
53
- const [cmd, args] = fila[i];
54
- let filho;
55
- try {
56
- filho = execFile(cmd, args, { timeout: 3000, windowsHide: true }, (erro) => {
57
- if (erro) return tentar(i + 1);
58
- resolve({ ok: true, como: cmd });
59
- });
60
- } catch { return tentar(i + 1); }
61
- filho.on('error', () => tentar(i + 1));
62
- try { filho.stdin.on('error', () => {}); filho.stdin.end(String(texto)); }
63
- catch { tentar(i + 1); }
64
- };
65
- tentar(0);
66
- });
67
- }
68
-
69
- /* O app do terminal, pelo que ele mesmo declara. Os cinco da lista são os que
70
- têm nome de aplicativo diferente do valor da variável — os outros
71
- (Warp, Alacritty, kitty, Ghostty) já se chamam pelo próprio nome. */
72
- const APPS_MAC = {
73
- Apple_Terminal: 'Terminal',
74
- 'iTerm.app': 'iTerm',
75
- vscode: 'Visual Studio Code',
76
- Hyper: 'Hyper',
77
- WezTerm: 'WezTerm',
78
- };
79
-
80
- /**
81
- * Traz o terminal de volta para a frente. Só faz algo no macOS; nos outros
82
- * sistemas devolve {ok:false, motivo} sem tentar nada.
83
- */
84
- function voltarAoTerminal() {
85
- if (os.platform() !== 'darwin') return { ok: false, motivo: 'só no macOS' };
86
- const programa = process.env.TERM_PROGRAM || '';
87
- const app = APPS_MAC[programa] || programa.replace(/\.app$/, '');
88
- if (!app) return { ok: false, motivo: 'terminal não se identificou' };
89
- try {
90
- // O nome vai como ARGUMENTO do AppleScript, nunca dentro do texto do
91
- // script: TERM_PROGRAM é ambiente, e ambiente é o que qualquer coisa
92
- // escreve.
93
- execFileSync('osascript', ['-e', 'on run argv', '-e', 'tell application (item 1 of argv) to activate',
94
- '-e', 'end run', app], { timeout: 3000, stdio: 'ignore' });
95
- return { ok: true, app };
96
- } catch { return { ok: false, motivo: 'osascript recusou' }; }
97
- }
98
-
99
- /** O sino do terminal: chama a atenção de quem está olhando o navegador. */
100
- function apitar() {
101
- try { if (process.stdout.isTTY) process.stdout.write('\x07'); } catch { /* sem tty */ }
102
- }
103
-
104
- module.exports = { copiar, voltarAoTerminal, apitar, candidatos, APPS_MAC };