@trendify/cli 0.1.10 → 0.1.12

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.
@@ -241,7 +241,7 @@ export function App({ appVersion, initialInput, initialNotification = null, init
241
241
  useEffect(() => {
242
242
  let active = true;
243
243
  const checkUpdates = async () => {
244
- const result = await checkForCliUpdate(appVersion);
244
+ const result = await checkForCliUpdate();
245
245
  if (!active) {
246
246
  return;
247
247
  }
package/dist/cli.entry.js CHANGED
@@ -2,8 +2,8 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { render } from 'ink';
4
4
  import { App } from './app.component.js';
5
- import { APP_VERSION } from './shared/constants/app-version.constant.js';
6
- import { runCliSelfUpdate } from './shared/services/cli-update.service.js';
5
+ import { getInstalledCliMetadata, runCliSelfUpdate } from './shared/services/cli-update.service.js';
6
+ const { packageVersion: APP_VERSION } = getInstalledCliMetadata();
7
7
  const args = process.argv.slice(2);
8
8
  const initialInput = args
9
9
  .filter((arg) => !arg.startsWith('-'))
@@ -70,6 +70,10 @@ function mountApp(feedback = null) {
70
70
  message: `Nao foi possivel atualizar a CLI automaticamente. ${result.error}`,
71
71
  tone: 'error',
72
72
  });
73
- } }));
73
+ } }), {
74
+ kittyKeyboard: {
75
+ mode: 'disabled',
76
+ },
77
+ });
74
78
  }
75
79
  mountApp();
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.component.d.ts","sourceRoot":"","sources":["../../../src/shared/components/text-field.component.tsx"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,KAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE,cAAc,2CAanH"}
1
+ {"version":3,"file":"text-field.component.d.ts","sourceRoot":"","sources":["../../../src/shared/components/text-field.component.tsx"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAsBF,wBAAgB,SAAS,CAAC,EAAE,KAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE,cAAc,2CA4FnH"}
@@ -1,6 +1,74 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Box } from 'ink';
3
- import TextInput from 'ink-text-input';
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
+ const ANSI_ESCAPE_SEQUENCE_PATTERN = /\u001b(?:\[[0-9;:?]*[ -/]*[@-~]|O[A-Za-z])/gu;
5
+ const NON_PRINTABLE_CHARACTER_PATTERN = /[\u0000-\u0008\u000b-\u001f\u007f]/gu;
6
+ const SUSPICIOUS_TERMINAL_FRAGMENT_PATTERN = /^(?:O[A-Za-z~]|BO[A-Za-z~]|\[[A-Za-z0-9;:~]+)$/u;
7
+ function sanitizeInputFragment(input) {
8
+ const trimmedControlSequences = input
9
+ .replace(ANSI_ESCAPE_SEQUENCE_PATTERN, '')
10
+ .replace(NON_PRINTABLE_CHARACTER_PATTERN, '');
11
+ if (!trimmedControlSequences) {
12
+ return '';
13
+ }
14
+ if (trimmedControlSequences.length <= 6 && SUSPICIOUS_TERMINAL_FRAGMENT_PATTERN.test(trimmedControlSequences)) {
15
+ return '';
16
+ }
17
+ return trimmedControlSequences;
18
+ }
4
19
  export function TextField({ focus = true, mask, onChange, onSubmit, placeholder, value, width = 72 }) {
5
- return (_jsx(Box, { borderStyle: "round", borderColor: "green", paddingX: 1, width: width, children: _jsx(TextInput, { focus: focus, mask: mask, placeholder: placeholder, value: value, onChange: onChange, onSubmit: onSubmit }) }));
20
+ const [cursorOffset, setCursorOffset] = useState(value.length);
21
+ useEffect(() => {
22
+ setCursorOffset((current) => Math.max(0, Math.min(current, value.length)));
23
+ }, [value]);
24
+ useInput((input, key) => {
25
+ if (key.eventType && key.eventType !== 'press') {
26
+ return;
27
+ }
28
+ if (key.return) {
29
+ onSubmit?.(value);
30
+ return;
31
+ }
32
+ if (key.upArrow || key.downArrow || key.tab || key.escape || key.ctrl || key.meta) {
33
+ return;
34
+ }
35
+ if (key.leftArrow) {
36
+ setCursorOffset((current) => Math.max(0, current - 1));
37
+ return;
38
+ }
39
+ if (key.rightArrow) {
40
+ setCursorOffset((current) => Math.min(value.length, current + 1));
41
+ return;
42
+ }
43
+ if (key.home) {
44
+ setCursorOffset(0);
45
+ return;
46
+ }
47
+ if (key.end) {
48
+ setCursorOffset(value.length);
49
+ return;
50
+ }
51
+ if (key.backspace || key.delete) {
52
+ if (cursorOffset === 0) {
53
+ return;
54
+ }
55
+ const nextValue = value.slice(0, cursorOffset - 1) + value.slice(cursorOffset);
56
+ setCursorOffset((current) => Math.max(0, current - 1));
57
+ onChange(nextValue);
58
+ return;
59
+ }
60
+ const sanitizedInput = sanitizeInputFragment(input);
61
+ if (!sanitizedInput) {
62
+ return;
63
+ }
64
+ const nextValue = value.slice(0, cursorOffset) + sanitizedInput + value.slice(cursorOffset);
65
+ setCursorOffset((current) => current + sanitizedInput.length);
66
+ onChange(nextValue);
67
+ }, { isActive: focus });
68
+ const maskedValue = mask ? mask.repeat(value.length) : value;
69
+ const safeCursorOffset = Math.max(0, Math.min(cursorOffset, maskedValue.length));
70
+ const prefix = maskedValue.slice(0, safeCursorOffset);
71
+ const cursorCharacter = maskedValue[safeCursorOffset] ?? ' ';
72
+ const suffix = maskedValue.slice(safeCursorOffset + (safeCursorOffset < maskedValue.length ? 1 : 0));
73
+ return (_jsx(Box, { borderStyle: "round", borderColor: "green", paddingX: 1, width: width, children: focus && !maskedValue ? (_jsxs(Text, { children: [_jsx(Text, { inverse: true, children: placeholder[0] ?? ' ' }), _jsx(Text, { dimColor: true, children: placeholder.slice(1) })] })) : focus ? (_jsxs(Text, { children: [prefix, _jsx(Text, { inverse: true, children: cursorCharacter }), suffix] })) : value ? (_jsx(Text, { children: mask ? mask.repeat(value.length) : value })) : (_jsx(Text, { dimColor: true, children: placeholder })) }));
6
74
  }
@@ -24,6 +24,12 @@ export type CliSelfUpdateResult = {
24
24
  readonly error: string;
25
25
  readonly ok: false;
26
26
  };
27
- export declare function checkForCliUpdate(currentVersion: string): Promise<CliUpdateCheckResult>;
27
+ type InstalledPackageMetadata = {
28
+ readonly packageName: string;
29
+ readonly packageVersion: string;
30
+ };
31
+ export declare function getInstalledCliMetadata(): InstalledPackageMetadata;
32
+ export declare function checkForCliUpdate(): Promise<CliUpdateCheckResult>;
28
33
  export declare function runCliSelfUpdate(packageName: string, latestVersion: string): Promise<CliSelfUpdateResult>;
34
+ export {};
29
35
  //# sourceMappingURL=cli-update.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-update.service.d.ts","sourceRoot":"","sources":["../../../src/shared/services/cli-update.service.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,GACD;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEN,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;CACpB,CAAC;AA0QN,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B7F;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwB/G"}
1
+ {"version":3,"file":"cli-update.service.d.ts","sourceRoot":"","sources":["../../../src/shared/services/cli-update.service.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,GACD;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEN,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;CACpB,CAAC;AAEN,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,CAAC;AA4CF,wBAAgB,uBAAuB,IAAI,wBAAwB,CAElE;AAgOD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA6BvE;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwB/G"}
@@ -1,9 +1,10 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { spawn } from 'node:child_process';
3
3
  const DEFAULT_PACKAGE_NAME = '@trendify/cli';
4
+ const DEFAULT_PACKAGE_VERSION = '0.0.0';
4
5
  const VERSION_PATTERN = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/u;
5
6
  function getPackageManifestPath() {
6
- return new URL('../package.json', import.meta.url);
7
+ return new URL('../../../package.json', import.meta.url);
7
8
  }
8
9
  function getNpmCommand() {
9
10
  return process.platform === 'win32' ? 'npm.cmd' : 'npm';
@@ -21,12 +22,18 @@ function readInstalledPackageMetadata() {
21
22
  const packageName = typeof manifest.name === 'string' && manifest.name.trim().length > 0
22
23
  ? manifest.name.trim()
23
24
  : DEFAULT_PACKAGE_NAME;
24
- return { packageName };
25
+ const packageVersion = typeof manifest.version === 'string' && manifest.version.trim().length > 0
26
+ ? manifest.version.trim()
27
+ : DEFAULT_PACKAGE_VERSION;
28
+ return { packageName, packageVersion };
25
29
  }
26
30
  catch {
27
- return { packageName: DEFAULT_PACKAGE_NAME };
31
+ return { packageName: DEFAULT_PACKAGE_NAME, packageVersion: DEFAULT_PACKAGE_VERSION };
28
32
  }
29
33
  }
34
+ export function getInstalledCliMetadata() {
35
+ return readInstalledPackageMetadata();
36
+ }
30
37
  function parseVersion(version) {
31
38
  const match = VERSION_PATTERN.exec(version.trim());
32
39
  if (!match) {
@@ -213,20 +220,20 @@ waitForParentToExit();
213
220
  });
214
221
  });
215
222
  }
216
- export async function checkForCliUpdate(currentVersion) {
217
- const { packageName } = readInstalledPackageMetadata();
223
+ export async function checkForCliUpdate() {
224
+ const { packageName, packageVersion } = readInstalledPackageMetadata();
218
225
  try {
219
226
  const latestVersion = await fetchLatestPublishedVersion(packageName);
220
- if (compareVersions(latestVersion, currentVersion) > 0) {
227
+ if (compareVersions(latestVersion, packageVersion) > 0) {
221
228
  return {
222
- currentVersion,
229
+ currentVersion: packageVersion,
223
230
  latestVersion,
224
231
  packageName,
225
232
  status: 'available',
226
233
  };
227
234
  }
228
235
  return {
229
- currentVersion,
236
+ currentVersion: packageVersion,
230
237
  latestVersion,
231
238
  packageName,
232
239
  status: 'current',
@@ -234,7 +241,7 @@ export async function checkForCliUpdate(currentVersion) {
234
241
  }
235
242
  catch (error) {
236
243
  return {
237
- currentVersion,
244
+ currentVersion: packageVersion,
238
245
  message: toErrorMessage(error),
239
246
  packageName,
240
247
  status: 'error',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trendify/cli",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
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",
@@ -1,2 +0,0 @@
1
- export declare const APP_VERSION = "0.1.8";
2
- //# sourceMappingURL=app-version.constant.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-version.constant.d.ts","sourceRoot":"","sources":["../../../src/shared/constants/app-version.constant.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -1 +0,0 @@
1
- export const APP_VERSION = '0.1.8';
package/dist/version.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare const APP_VERSION = "0.1.10";
2
- //# sourceMappingURL=version.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,WAAW,CAAC"}
package/dist/version.js DELETED
@@ -1 +0,0 @@
1
- export const APP_VERSION = '0.1.10';