@trendify/cli 0.1.35 → 0.1.37

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.
@@ -1 +1 @@
1
- {"version":3,"file":"app.component.d.ts","sourceRoot":"","sources":["../src/app.component.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAMvG,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IACpD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjH,CAAC;AA6DF,KAAK,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAiFrD,wBAAgB,GAAG,CAAC,EAClB,UAAU,EACV,YAAY,EACZ,mBAA0B,EAC1B,uBAAmC,EACnC,YAAY,GACb,EAAE,QAAQ,2CAqgBV"}
1
+ {"version":3,"file":"app.component.d.ts","sourceRoot":"","sources":["../src/app.component.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAMvG,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IACpD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjH,CAAC;AA2FF,KAAK,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAkFrD,wBAAgB,GAAG,CAAC,EAClB,UAAU,EACV,YAAY,EACZ,mBAA0B,EAC1B,uBAAmC,EACnC,YAAY,GACb,EAAE,QAAQ,2CAmiBV"}
@@ -6,6 +6,7 @@ import { getUserDisplayName } from './modules/auth/utils/auth-user.util.js';
6
6
  import { getAuthBootstrapResult, } from './modules/auth/services/auth.service.js';
7
7
  import { LoginPage } from './modules/auth/pages/login.page.js';
8
8
  import { ProfilePage } from './modules/auth/pages/profile.page.js';
9
+ import { LocalParametersPage } from './modules/settings/pages/local-parameters.page.js';
9
10
  import { checkForCliUpdate } from './shared/services/cli-update.service.js';
10
11
  import { ActionMenuPage } from './shared/components/action-menu.component.js';
11
12
  import { AppMenu } from './shared/components/app-menu.component.js';
@@ -38,6 +39,36 @@ const MENU_ITEMS = [
38
39
  'supabase',
39
40
  ],
40
41
  },
42
+ {
43
+ id: 'settings',
44
+ titulo: 'Parametros Locais',
45
+ comando: 'parametros',
46
+ aliases: [
47
+ 'configuracoes',
48
+ 'configuracao',
49
+ 'configuração',
50
+ 'configurações',
51
+ 'parametros',
52
+ 'parametro',
53
+ 'parâmetros',
54
+ 'parâmetro',
55
+ 'openai',
56
+ 'chave-openai',
57
+ ],
58
+ descricao: 'Edita os parametros locais da CLI salvos em um arquivo .env proprio.',
59
+ palavrasChave: [
60
+ 'env',
61
+ '.env',
62
+ 'openai',
63
+ 'api key',
64
+ 'chave',
65
+ 'llm',
66
+ 'modelo',
67
+ 'modelos',
68
+ 'local',
69
+ 'config',
70
+ ],
71
+ },
41
72
  {
42
73
  id: 'logout',
43
74
  titulo: 'Encerrar Sessão',
@@ -111,13 +142,14 @@ function buildMenuItems(cliUpdate) {
111
142
  if (cliUpdate.status !== 'available') {
112
143
  return MENU_ITEMS;
113
144
  }
114
- const [discoveryItem, profileItem, logoutItem, exitItem] = MENU_ITEMS;
115
- if (!discoveryItem || !profileItem || !logoutItem || !exitItem) {
145
+ const [discoveryItem, profileItem, settingsItem, logoutItem, exitItem] = MENU_ITEMS;
146
+ if (!discoveryItem || !profileItem || !settingsItem || !logoutItem || !exitItem) {
116
147
  return MENU_ITEMS;
117
148
  }
118
149
  return [
119
150
  discoveryItem,
120
151
  profileItem,
152
+ settingsItem,
121
153
  {
122
154
  id: 'update-cli',
123
155
  titulo: 'Atualizar',
@@ -422,6 +454,15 @@ export function App({ appVersion, initialInput, initialNotification = null, init
422
454
  setNotificationTone(nextTone);
423
455
  } }) }));
424
456
  }
457
+ if (screen === 'settings') {
458
+ return (_jsx(AppShell, { appVersion: appVersion, title: "Parametros Locais", subtitle: `Sessao ativa para ${getAuthenticatedUserLabel(authUser)} em ${getActiveWorkspaceLabel(activeWorkspace)}.`, notification: notification, notificationTone: notificationTone, children: _jsx(LocalParametersPage, { onBack: () => {
459
+ setScreen('menu');
460
+ setMenuKey((current) => current + 1);
461
+ }, onNotificationChange: (nextNotification, nextTone = 'success') => {
462
+ setNotification(nextNotification);
463
+ setNotificationTone(nextTone);
464
+ } }) }));
465
+ }
425
466
  if (screen === 'confirm-logout') {
426
467
  return (_jsx(AppShell, { appVersion: appVersion, title: "Confirmar encerramento de sessao", subtitle: `Voce esta autenticado como ${getAuthenticatedUserLabel(authUser)} em ${getActiveWorkspaceLabel(activeWorkspace)}.`, notification: notification, notificationTone: notificationTone, children: _jsx(ActionMenuPage, { title: "Tem certeza que deseja encerrar a sessao atual?", subtitle: "Se confirmar, a CLI vai remover a sessao salva localmente e pedir login novamente.", options: LOGOUT_OPTIONS, selectedIndex: logoutSelectionIndex, hintText: "Use as setas para navegar. Enter confirma. Esc volta ao menu." }) }));
427
468
  }
@@ -447,6 +488,12 @@ export function App({ appVersion, initialInput, initialNotification = null, init
447
488
  setScreen('profile');
448
489
  return;
449
490
  }
491
+ if (item.id === 'settings') {
492
+ setNotification(null);
493
+ setNotificationTone('success');
494
+ setScreen('settings');
495
+ return;
496
+ }
450
497
  if (item.id === 'exit') {
451
498
  exit();
452
499
  return;
@@ -0,0 +1,8 @@
1
+ type NotificationTone = 'error' | 'info' | 'success';
2
+ type LocalParametersPageProps = {
3
+ readonly onBack: () => void;
4
+ readonly onNotificationChange: (notification: string | null, tone?: NotificationTone) => void;
5
+ };
6
+ export declare function LocalParametersPage({ onBack, onNotificationChange }: LocalParametersPageProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=local-parameters.page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-parameters.page.d.ts","sourceRoot":"","sources":["../../../../src/modules/settings/pages/local-parameters.page.tsx"],"names":[],"mappings":"AAUA,KAAK,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAErD,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/F,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,wBAAwB,2CAiG7F"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from 'ink';
3
+ import { useEffect, useState } from 'react';
4
+ import { StepHeader } from '../../../shared/components/step-header.component.js';
5
+ import { TextField } from '../../../shared/components/text-field.component.js';
6
+ import { getLocalParametersFilePath, readLocalParameters, writeLocalParameters, } from '../../../shared/services/local-parameters.service.js';
7
+ export function LocalParametersPage({ onBack, onNotificationChange }) {
8
+ const [openAIApiKey, setOpenAIApiKey] = useState('');
9
+ const [busy, setBusy] = useState(true);
10
+ useEffect(() => {
11
+ let active = true;
12
+ const loadParameters = async () => {
13
+ try {
14
+ const parameters = await readLocalParameters();
15
+ if (!active) {
16
+ return;
17
+ }
18
+ setOpenAIApiKey(parameters.openAIApiKey);
19
+ }
20
+ catch (error) {
21
+ if (!active) {
22
+ return;
23
+ }
24
+ const message = error instanceof Error && error.message.trim() ? error.message : 'Nao foi possivel carregar os parametros locais.';
25
+ onNotificationChange(message, 'error');
26
+ }
27
+ finally {
28
+ if (active) {
29
+ setBusy(false);
30
+ }
31
+ }
32
+ };
33
+ void loadParameters();
34
+ return () => {
35
+ active = false;
36
+ };
37
+ }, []);
38
+ useInput((_input, key) => {
39
+ if (busy) {
40
+ return;
41
+ }
42
+ if (key.escape) {
43
+ onNotificationChange(null);
44
+ onBack();
45
+ }
46
+ });
47
+ async function handleSubmit() {
48
+ setBusy(true);
49
+ try {
50
+ const normalizedOpenAIApiKey = openAIApiKey.trim();
51
+ await writeLocalParameters({ openAIApiKey: normalizedOpenAIApiKey });
52
+ setOpenAIApiKey(normalizedOpenAIApiKey);
53
+ if (normalizedOpenAIApiKey) {
54
+ onNotificationChange('OPENAI_API_KEY salva com sucesso nos parametros locais da CLI.', 'success');
55
+ }
56
+ else {
57
+ onNotificationChange('OPENAI_API_KEY removida dos parametros locais da CLI.', 'success');
58
+ }
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof Error && error.message.trim() ? error.message : 'Nao foi possivel salvar os parametros locais.';
62
+ onNotificationChange(message, 'error');
63
+ }
64
+ finally {
65
+ setBusy(false);
66
+ }
67
+ }
68
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(StepHeader, { title: "Parametros locais", subtitle: "Esse arquivo fica somente neste computador. Por enquanto, voce pode editar a chave usada futuramente para acessar os modelos da OpenAI via API." }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "cyanBright", children: "Variavel: OPENAI_API_KEY" }), _jsxs(Text, { dimColor: true, children: ["Arquivo local: ", getLocalParametersFilePath()] })] }), busy ? (_jsx(Text, { dimColor: true, children: "Carregando parametros locais..." })) : (_jsx(TextField, { placeholder: "Ex.: sk-proj-...", value: openAIApiKey, onChange: setOpenAIApiKey, onSubmit: () => {
69
+ void handleSubmit();
70
+ } })), _jsx(Text, { dimColor: true, children: "Enter salva o valor atual. Deixe o campo vazio para remover a variavel. Esc volta ao menu." })] }));
71
+ }
@@ -1,6 +1,8 @@
1
1
  export declare const TRENDIFY_HOME_DIR: string;
2
2
  export declare const TRENDIFY_AUTH_DIR: string;
3
3
  export declare const TRENDIFY_AUTH_STORAGE_FILE: string;
4
+ export declare const TRENDIFY_CONFIG_DIR: string;
5
+ export declare const TRENDIFY_LOCAL_ENV_FILE: string;
4
6
  export declare const TRENDIFY_RUNTIME_DIR: string;
5
7
  export declare const TRENDIFY_UPDATE_STATE_FILE: string;
6
8
  //# sourceMappingURL=app-paths.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-paths.config.d.ts","sourceRoot":"","sources":["../../../src/shared/config/app-paths.config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,QAA+B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAkC,CAAC;AACjE,eAAO,MAAM,0BAA0B,QAA0C,CAAC;AAClF,eAAO,MAAM,oBAAoB,QAAqC,CAAC;AACvE,eAAO,MAAM,0BAA0B,QAAiD,CAAC"}
1
+ {"version":3,"file":"app-paths.config.d.ts","sourceRoot":"","sources":["../../../src/shared/config/app-paths.config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,QAA+B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAkC,CAAC;AACjE,eAAO,MAAM,0BAA0B,QAA0C,CAAC;AAClF,eAAO,MAAM,mBAAmB,QAAoC,CAAC;AACrE,eAAO,MAAM,uBAAuB,QAAyC,CAAC;AAC9E,eAAO,MAAM,oBAAoB,QAAqC,CAAC;AACvE,eAAO,MAAM,0BAA0B,QAAiD,CAAC"}
@@ -3,5 +3,7 @@ import { join } from 'node:path';
3
3
  export const TRENDIFY_HOME_DIR = join(homedir(), '.trendify');
4
4
  export const TRENDIFY_AUTH_DIR = join(TRENDIFY_HOME_DIR, 'auth');
5
5
  export const TRENDIFY_AUTH_STORAGE_FILE = join(TRENDIFY_AUTH_DIR, 'storage.json');
6
+ export const TRENDIFY_CONFIG_DIR = join(TRENDIFY_HOME_DIR, 'config');
7
+ export const TRENDIFY_LOCAL_ENV_FILE = join(TRENDIFY_CONFIG_DIR, 'local.env');
6
8
  export const TRENDIFY_RUNTIME_DIR = join(TRENDIFY_HOME_DIR, 'runtime');
7
9
  export const TRENDIFY_UPDATE_STATE_FILE = join(TRENDIFY_RUNTIME_DIR, 'update-state.env');
@@ -1 +1 @@
1
- {"version":3,"file":"env.config.d.ts","sourceRoot":"","sources":["../../../src/shared/config/env.config.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;CACpB,CAAC;AAsBN,wBAAgB,yBAAyB,IAAI,mBAAmB,CA+B/D;AAED,eAAO,MAAM,sBAAsB,QAAmB,CAAC"}
1
+ {"version":3,"file":"env.config.d.ts","sourceRoot":"","sources":["../../../src/shared/config/env.config.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;CACpB,CAAC;AAsBN,wBAAgB,yBAAyB,IAAI,mBAAmB,CA+B/D;AAED,eAAO,MAAM,sBAAsB,QAAmB,CAAC"}
@@ -2,11 +2,13 @@ import { existsSync } from 'node:fs';
2
2
  import { dirname, resolve } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { config as loadEnv } from 'dotenv';
5
+ import { TRENDIFY_LOCAL_ENV_FILE } from './app-paths.config.js';
5
6
  const currentFilePath = fileURLToPath(import.meta.url);
6
7
  const currentDirectory = dirname(currentFilePath);
7
8
  const appRootDirectory = resolve(currentDirectory, '..', '..', '..');
8
9
  const workspaceRootDirectory = resolve(appRootDirectory, '..', '..');
9
10
  const ENV_FILE_PATHS = [
11
+ TRENDIFY_LOCAL_ENV_FILE,
10
12
  resolve(appRootDirectory, '.env'),
11
13
  resolve(workspaceRootDirectory, '.env'),
12
14
  resolve(process.cwd(), '.env'),
@@ -0,0 +1,7 @@
1
+ export type LocalParameters = {
2
+ readonly openAIApiKey: string;
3
+ };
4
+ export declare function readLocalParameters(): Promise<LocalParameters>;
5
+ export declare function writeLocalParameters(parameters: LocalParameters): Promise<void>;
6
+ export declare function getLocalParametersFilePath(): string;
7
+ //# sourceMappingURL=local-parameters.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-parameters.service.d.ts","sourceRoot":"","sources":["../../../src/shared/services/local-parameters.service.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AA2CF,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAMpE;AAED,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAarF;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD"}
@@ -0,0 +1,61 @@
1
+ import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { parse } from 'dotenv';
4
+ import { TRENDIFY_LOCAL_ENV_FILE } from '../config/app-paths.config.js';
5
+ const OPENAI_API_KEY_ENV_NAME = 'OPENAI_API_KEY';
6
+ const LOCAL_ENV_FILE_HEADER = '# Arquivo gerenciado pelo Trendify CLI.\n# Parametros locais desta maquina.\n';
7
+ async function ensureParentDirectory(filePath) {
8
+ await mkdir(dirname(filePath), { recursive: true });
9
+ }
10
+ async function readLocalEnvMap() {
11
+ try {
12
+ const fileContents = await readFile(TRENDIFY_LOCAL_ENV_FILE, 'utf8');
13
+ return parse(fileContents);
14
+ }
15
+ catch (error) {
16
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
17
+ return {};
18
+ }
19
+ throw error;
20
+ }
21
+ }
22
+ function serializeEnvValue(value) {
23
+ if (/^[A-Za-z0-9_./:-]+$/u.test(value)) {
24
+ return value;
25
+ }
26
+ return JSON.stringify(value);
27
+ }
28
+ async function writeLocalEnvMap(data) {
29
+ await ensureParentDirectory(TRENDIFY_LOCAL_ENV_FILE);
30
+ const tempFilePath = `${TRENDIFY_LOCAL_ENV_FILE}.tmp`;
31
+ const entries = Object.entries(data).sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey));
32
+ const body = entries.map(([key, value]) => `${key}=${serializeEnvValue(value)}`).join('\n');
33
+ const fileContents = body ? `${LOCAL_ENV_FILE_HEADER}\n${body}\n` : LOCAL_ENV_FILE_HEADER;
34
+ await writeFile(tempFilePath, fileContents, 'utf8');
35
+ await rename(tempFilePath, TRENDIFY_LOCAL_ENV_FILE);
36
+ if (process.platform !== 'win32') {
37
+ await chmod(TRENDIFY_LOCAL_ENV_FILE, 0o600).catch(() => undefined);
38
+ }
39
+ }
40
+ export async function readLocalParameters() {
41
+ const envMap = await readLocalEnvMap();
42
+ return {
43
+ openAIApiKey: envMap[OPENAI_API_KEY_ENV_NAME] ?? '',
44
+ };
45
+ }
46
+ export async function writeLocalParameters(parameters) {
47
+ const envMap = await readLocalEnvMap();
48
+ const normalizedOpenAIApiKey = parameters.openAIApiKey.trim();
49
+ if (normalizedOpenAIApiKey) {
50
+ envMap[OPENAI_API_KEY_ENV_NAME] = normalizedOpenAIApiKey;
51
+ process.env.OPENAI_API_KEY = normalizedOpenAIApiKey;
52
+ }
53
+ else {
54
+ delete envMap[OPENAI_API_KEY_ENV_NAME];
55
+ delete process.env.OPENAI_API_KEY;
56
+ }
57
+ await writeLocalEnvMap(envMap);
58
+ }
59
+ export function getLocalParametersFilePath() {
60
+ return TRENDIFY_LOCAL_ENV_FILE;
61
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trendify/cli",
3
- "version": "0.1.35",
3
+ "version": "0.1.37",
4
4
  "description": "CLI do Trendify para descoberta de temas e fluxos de conta.",
5
5
  "type": "module",
6
6
  "main": "dist/cli.entry.js",
@@ -11,6 +11,10 @@ cleanup() {
11
11
  if [ -n "${TRENDIFY_TEMP_UPDATER_PATH:-}" ]; then
12
12
  rm -f "$TRENDIFY_TEMP_UPDATER_PATH" >/dev/null 2>&1 || true
13
13
  fi
14
+
15
+ if [ -n "${TRENDIFY_TEMP_UPDATER_DIR:-}" ]; then
16
+ rmdir "$TRENDIFY_TEMP_UPDATER_DIR" >/dev/null 2>&1 || true
17
+ fi
14
18
  }
15
19
 
16
20
  write_state_file() {
@@ -37,11 +41,30 @@ reset_terminal() {
37
41
  fi
38
42
  }
39
43
 
44
+ create_temp_updater_dir() {
45
+ TEMP_ROOT=${TMPDIR:-/tmp}
46
+ TEMP_TEMPLATE="${TEMP_ROOT%/}/trendify-cli-updater.XXXXXX"
47
+
48
+ if TEMP_DIR_PATH=$(mktemp -d "$TEMP_TEMPLATE" 2>/dev/null); then
49
+ printf '%s\n' "$TEMP_DIR_PATH"
50
+ return 0
51
+ fi
52
+
53
+ if TEMP_DIR_PATH=$(TMPDIR="$TEMP_ROOT" mktemp -d -t trendify-cli-updater 2>/dev/null); then
54
+ printf '%s\n' "$TEMP_DIR_PATH"
55
+ return 0
56
+ fi
57
+
58
+ printf 'Falha ao criar um diretorio temporario para o atualizador.\n' >&2
59
+ exit 1
60
+ }
61
+
40
62
  if [ "${TRENDIFY_UPDATER_STAGE:-launcher}" != "temp" ]; then
41
- TEMP_UPDATER_PATH=$(mktemp "${TMPDIR:-/tmp}/trendify-cli-updater.XXXXXX.sh")
63
+ TEMP_UPDATER_DIR=$(create_temp_updater_dir)
64
+ TEMP_UPDATER_PATH="$TEMP_UPDATER_DIR/update-runner.sh"
42
65
  cp "$SELF_PATH" "$TEMP_UPDATER_PATH"
43
66
  chmod 700 "$TEMP_UPDATER_PATH"
44
- exec env TRENDIFY_UPDATER_STAGE=temp TRENDIFY_TEMP_UPDATER_PATH="$TEMP_UPDATER_PATH" /bin/sh "$TEMP_UPDATER_PATH" "$STATE_FILE" "$PACKAGE_ROOT_PATH" "$NODE_COMMAND" "$@"
67
+ exec env TRENDIFY_UPDATER_STAGE=temp TRENDIFY_TEMP_UPDATER_DIR="$TEMP_UPDATER_DIR" TRENDIFY_TEMP_UPDATER_PATH="$TEMP_UPDATER_PATH" /bin/sh "$TEMP_UPDATER_PATH" "$STATE_FILE" "$PACKAGE_ROOT_PATH" "$NODE_COMMAND" "$@"
45
68
  fi
46
69
 
47
70
  trap cleanup EXIT INT TERM
@@ -82,5 +105,6 @@ printf '\n[3/4] Atualizacao concluida.\n'
82
105
  printf '[4/4] Reiniciando o CLI em um processo limpo...\n\n'
83
106
  sleep 0.75
84
107
  reset_terminal
108
+ cleanup
85
109
 
86
110
  exec "$NODE_COMMAND" "$PACKAGE_ROOT_PATH/dist/launcher.entry.js" "$@"