@nocoo/zhe 1.16.1 → 1.19.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/api/client.d.ts +25 -1
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +41 -2
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/types.d.ts +32 -2
  6. package/dist/api/types.d.ts.map +1 -1
  7. package/dist/commands/create.js +1 -18
  8. package/dist/commands/create.js.map +1 -1
  9. package/dist/commands/folder.d.ts +7 -0
  10. package/dist/commands/folder.d.ts.map +1 -0
  11. package/dist/commands/folder.js +226 -0
  12. package/dist/commands/folder.js.map +1 -0
  13. package/dist/commands/get.d.ts.map +1 -1
  14. package/dist/commands/get.js +12 -1
  15. package/dist/commands/get.js.map +1 -1
  16. package/dist/commands/idea/add.d.ts +22 -0
  17. package/dist/commands/idea/add.d.ts.map +1 -0
  18. package/dist/commands/idea/add.js +55 -0
  19. package/dist/commands/idea/add.js.map +1 -0
  20. package/dist/commands/idea/delete.d.ts +17 -0
  21. package/dist/commands/idea/delete.d.ts.map +1 -0
  22. package/dist/commands/idea/delete.js +47 -0
  23. package/dist/commands/idea/delete.js.map +1 -0
  24. package/dist/commands/idea/get.d.ts +12 -0
  25. package/dist/commands/idea/get.d.ts.map +1 -0
  26. package/dist/commands/idea/get.js +45 -0
  27. package/dist/commands/idea/get.js.map +1 -0
  28. package/dist/commands/idea/helpers.d.ts +13 -0
  29. package/dist/commands/idea/helpers.d.ts.map +1 -0
  30. package/dist/commands/idea/helpers.js +78 -0
  31. package/dist/commands/idea/helpers.js.map +1 -0
  32. package/dist/commands/idea/list.d.ts +22 -0
  33. package/dist/commands/idea/list.d.ts.map +1 -0
  34. package/dist/commands/idea/list.js +64 -0
  35. package/dist/commands/idea/list.js.map +1 -0
  36. package/dist/commands/idea/update.d.ts +27 -0
  37. package/dist/commands/idea/update.d.ts.map +1 -0
  38. package/dist/commands/idea/update.js +78 -0
  39. package/dist/commands/idea/update.js.map +1 -0
  40. package/dist/commands/idea.d.ts +6 -1
  41. package/dist/commands/idea.d.ts.map +1 -1
  42. package/dist/commands/idea.js +12 -390
  43. package/dist/commands/idea.js.map +1 -1
  44. package/dist/commands/list.d.ts +4 -0
  45. package/dist/commands/list.d.ts.map +1 -1
  46. package/dist/commands/list.js +133 -61
  47. package/dist/commands/list.js.map +1 -1
  48. package/dist/commands/open.js +1 -23
  49. package/dist/commands/open.js.map +1 -1
  50. package/dist/commands/tag.d.ts +8 -0
  51. package/dist/commands/tag.d.ts.map +1 -0
  52. package/dist/commands/tag.js +289 -0
  53. package/dist/commands/tag.js.map +1 -0
  54. package/dist/commands/update.d.ts.map +1 -1
  55. package/dist/commands/update.js +56 -59
  56. package/dist/commands/update.js.map +1 -1
  57. package/dist/index.js +4 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/utils/format.d.ts +27 -0
  60. package/dist/utils/format.d.ts.map +1 -0
  61. package/dist/utils/format.js +157 -0
  62. package/dist/utils/format.js.map +1 -0
  63. package/dist/utils/resolve.d.ts +41 -0
  64. package/dist/utils/resolve.d.ts.map +1 -0
  65. package/dist/utils/resolve.js +69 -0
  66. package/dist/utils/resolve.js.map +1 -0
  67. package/dist/utils.d.ts +22 -61
  68. package/dist/utils.d.ts.map +1 -1
  69. package/dist/utils.js +66 -187
  70. package/dist/utils.js.map +1 -1
  71. package/package.json +10 -6
package/dist/utils.js CHANGED
@@ -1,10 +1,17 @@
1
1
  /**
2
- * Shared utilities for zhe CLI
2
+ * Shared utilities for zhe CLI.
3
+ *
4
+ * Larger groups live in ./utils/*.ts:
5
+ * - ./utils/format.ts table + detail formatters
6
+ * - ./utils/resolve.ts folder/tag name → id resolvers
7
+ *
8
+ * This file keeps the small primitives (date/string helpers, parsing,
9
+ * browser launcher) so consumers can still import everything from
10
+ * `../utils.js`.
3
11
  */
12
+ import { spawn } from "node:child_process";
4
13
  import { pc } from "@nocoo/cli-base";
5
- /**
6
- * Mask an API key for display: zhe_abcd...wxyz
7
- */
14
+ /** Mask an API key for display: zhe_abcd...wxyz */
8
15
  export function maskApiKey(apiKey) {
9
16
  if (!apiKey || apiKey.length < 12) {
10
17
  return apiKey;
@@ -13,30 +20,22 @@ export function maskApiKey(apiKey) {
13
20
  const suffix = apiKey.slice(-4);
14
21
  return `${prefix}...${suffix}`;
15
22
  }
16
- /**
17
- * Validate API key format: must start with zhe_ and be non-empty
18
- */
23
+ /** Validate API key format: must start with zhe_ and be non-empty. */
19
24
  export function isValidApiKeyFormat(apiKey) {
20
25
  return apiKey.startsWith("zhe_") && apiKey.length > 4;
21
26
  }
22
- /**
23
- * Format a date string for display
24
- */
27
+ /** Format a date string for display (YYYY-MM-DD). */
25
28
  export function formatDate(isoDate) {
26
29
  const date = new Date(isoDate);
27
30
  const parts = date.toISOString().split("T");
28
31
  return parts[0] ?? "";
29
32
  }
30
- /**
31
- * Format a date string with time
32
- */
33
+ /** Format a date string with time (YYYY-MM-DD HH:MM:SS). */
33
34
  export function formatDateTime(isoDate) {
34
35
  const date = new Date(isoDate);
35
36
  return date.toISOString().replace("T", " ").slice(0, 19);
36
37
  }
37
- /**
38
- * Truncate a string to a max length with ellipsis
39
- */
38
+ /** Truncate a string to a max length with ellipsis. */
40
39
  export function truncate(str, maxLength) {
41
40
  if (str.length <= maxLength) {
42
41
  return str;
@@ -44,186 +43,66 @@ export function truncate(str, maxLength) {
44
43
  return `${str.slice(0, maxLength - 3)}...`;
45
44
  }
46
45
  /**
47
- * Format links as a table
48
- */
49
- export function formatLinksTable(links, options = {}) {
50
- if (links.length === 0) {
51
- return "No links found.";
52
- }
53
- const { wide = false, folderMap } = options;
54
- const showFolders = links.some((l) => l.folderId);
55
- if (wide) {
56
- // Wide mode: no truncation
57
- const header = showFolders
58
- ? "ID SLUG URL FOLDER CLICKS CREATED"
59
- : "ID SLUG URL CLICKS CREATED";
60
- const separator = "─".repeat(header.length);
61
- const rows = links.map((link) => {
62
- const id = String(link.id).padEnd(6);
63
- const slug = link.slug.padEnd(20);
64
- const url = link.originalUrl.padEnd(48);
65
- const clicks = String(link.clicks).padEnd(7);
66
- const created = formatDate(link.createdAt);
67
- if (showFolders) {
68
- const folderName = link.folderId
69
- ? (folderMap?.get(link.folderId) ?? link.folderId.slice(0, 8))
70
- : "";
71
- const folder = folderName.padEnd(16);
72
- return `${id} ${slug} ${url} ${folder} ${clicks} ${created}`;
73
- }
74
- return `${id} ${slug} ${url} ${clicks} ${created}`;
75
- });
76
- return [header, separator, ...rows].join("\n");
77
- }
78
- // Default compact mode with truncation
79
- const header = showFolders
80
- ? "ID SLUG URL FOLDER CLICKS CREATED"
81
- : "ID SLUG URL CLICKS CREATED";
82
- const separator = "─".repeat(header.length);
83
- const rows = links.map((link) => {
84
- const id = String(link.id).padEnd(6);
85
- const slug = truncate(link.slug, 10).padEnd(11);
86
- const url = truncate(link.originalUrl, 32).padEnd(32);
87
- const clicks = String(link.clicks).padEnd(7);
88
- const created = formatDate(link.createdAt);
89
- if (showFolders) {
90
- const folderName = link.folderId
91
- ? (folderMap?.get(link.folderId) ?? link.folderId.slice(0, 8))
92
- : "";
93
- const folder = truncate(folderName, 12).padEnd(12);
94
- return `${id} ${slug} ${url} ${folder} ${clicks} ${created}`;
95
- }
96
- return `${id} ${slug} ${url} ${clicks} ${created}`;
97
- });
98
- return [header, separator, ...rows].join("\n");
99
- }
100
- /**
101
- * Format links as minimal output (just short URLs)
46
+ * Strict positive-integer parser.
47
+ * Rejects empty strings, 0, negatives, decimals, scientific notation,
48
+ * hex literals, and any junk-suffixed input (e.g. "12abc", "1e2", "0x10").
49
+ * Only accepts decimal digit sequences without a leading zero.
102
50
  */
103
- export function formatLinksMinimal(links) {
104
- if (links.length === 0) {
105
- return "";
106
- }
107
- return links.map((link) => `zhe.to/${link.slug}`).join("\n");
108
- }
109
- /**
110
- * Format a single link for detailed display
111
- * @param link - The link to format
112
- * @param folderName - Optional folder name (if not provided, shows folder ID)
113
- */
114
- export function formatLinkDetail(link, folderName) {
115
- const lines = [
116
- `Link #${link.id}`,
117
- "",
118
- ` Short URL: ${link.shortUrl}`,
119
- ` Original: ${link.originalUrl}`,
120
- ` Slug: ${link.slug}${link.isCustom ? " (custom)" : ""}`,
121
- ` Clicks: ${link.clicks}`,
122
- ];
123
- if (link.folderId) {
124
- const folderDisplay = folderName ?? link.folderId;
125
- lines.push(` Folder: ${folderDisplay}`);
126
- }
127
- if (link.note) {
128
- lines.push(` Note: ${link.note}`);
51
+ const STRICT_POSITIVE_INT = /^[1-9]\d*$/;
52
+ export function parsePositiveInt(input) {
53
+ if (!STRICT_POSITIVE_INT.test(input)) {
54
+ return null;
129
55
  }
130
- lines.push(` Expires: ${link.expiresAt ? formatDateTime(link.expiresAt) : "Never"}`);
131
- lines.push(` Created: ${formatDateTime(link.createdAt)}`);
132
- return lines.join("\n");
133
- }
134
- /**
135
- * Parse a link ID from string, return null if invalid
136
- */
137
- export function parseLinkId(input) {
138
- const id = Number.parseInt(input, 10);
139
- if (Number.isNaN(id) || id <= 0) {
56
+ const id = Number(input);
57
+ if (!Number.isSafeInteger(id) || id <= 0) {
140
58
  return null;
141
59
  }
142
60
  return id;
143
61
  }
144
- /**
145
- * Format folders as a table
146
- */
147
- export function formatFoldersTable(folders) {
148
- if (folders.length === 0) {
149
- return "No folders found.";
150
- }
151
- const header = "ID NAME LINKS ICON CREATED";
152
- const separator = "─".repeat(header.length);
153
- const rows = folders.map((folder) => {
154
- const id = folder.id.padEnd(36);
155
- const name = truncate(folder.name, 18).padEnd(18);
156
- const links = String(folder.linkCount).padEnd(6);
157
- const icon = truncate(folder.icon, 8).padEnd(8);
158
- const created = formatDate(folder.createdAt);
159
- return `${id} ${name} ${links} ${icon} ${created}`;
160
- });
161
- return [header, separator, ...rows].join("\n");
62
+ /** Parse a link ID from string; uses strict positive-integer parsing. */
63
+ export function parseLinkId(input) {
64
+ return parsePositiveInt(input);
162
65
  }
163
66
  /**
164
- * Format tags as a table
67
+ * Open a URL in the default browser.
68
+ * Uses spawn() with argv to prevent shell injection.
165
69
  */
166
- export function formatTagsTable(tags) {
167
- if (tags.length === 0) {
168
- return "No tags found.";
169
- }
170
- const header = "ID NAME COLOR CREATED";
171
- const separator = "".repeat(header.length);
172
- const rows = tags.map((tag) => {
173
- const id = tag.id.padEnd(36);
174
- const name = truncate(tag.name, 18).padEnd(18);
175
- const color = tag.color.padEnd(8);
176
- const created = formatDate(tag.createdAt);
177
- return `${id} ${name} ${color} ${created}`;
70
+ export function openInBrowser(url) {
71
+ const platform = process.platform;
72
+ let command;
73
+ let args;
74
+ if (platform === "darwin") {
75
+ command = "open";
76
+ args = [url];
77
+ }
78
+ else if (platform === "linux") {
79
+ command = "xdg-open";
80
+ args = [url];
81
+ }
82
+ else if (platform === "win32") {
83
+ command = "cmd";
84
+ args = ["/c", "start", "", url];
85
+ }
86
+ else {
87
+ console.log(pc.dim(`Unable to open browser on ${platform}. Visit: ${url}`));
88
+ return;
89
+ }
90
+ const child = spawn(command, args, { stdio: "ignore" });
91
+ const fallback = () => console.log(pc.dim(`Failed to open browser. Visit: ${url}`));
92
+ let failed = false;
93
+ child.on("error", () => {
94
+ failed = true;
95
+ fallback();
96
+ });
97
+ child.on("close", (code) => {
98
+ if (!failed && code !== 0) {
99
+ fallback();
100
+ }
178
101
  });
179
- return [header, separator, ...rows].join("\n");
180
- }
181
- /**
182
- * Resolve a folder name to folder ID via API.
183
- * If input looks like a UUID, use it directly.
184
- * Returns null if folder is not found (with error message printed).
185
- */
186
- export async function resolveFolderName(client, input) {
187
- // Check if input looks like a UUID (36 chars with dashes)
188
- const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
189
- if (uuidPattern.test(input)) {
190
- return input; // Assume it's already an ID
191
- }
192
- // Otherwise, resolve by name
193
- const { folders } = await client.listFolders();
194
- const matches = folders.filter((f) => f.name.toLowerCase() === input.toLowerCase());
195
- if (matches.length === 0) {
196
- console.log(pc.red(`Folder not found: ${input}`));
197
- return null;
198
- }
199
- if (matches.length > 1) {
200
- console.log(pc.red(`Multiple folders match "${input}". Please use the folder ID instead.`));
201
- console.log(pc.dim("Use `zhe folders` to see all folder IDs."));
202
- return null;
203
- }
204
- return matches[0].id;
205
- }
206
- /**
207
- * Resolve a tag name to tag ID via API.
208
- * If input looks like a UUID, use it directly.
209
- * Returns null if tag is not found (with error message printed).
210
- */
211
- export async function resolveTagName(client, input) {
212
- // Check if input looks like a UUID
213
- const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
214
- if (uuidPattern.test(input)) {
215
- return input;
216
- }
217
- const { tags } = await client.listTags();
218
- const matches = tags.filter((t) => t.name.toLowerCase() === input.toLowerCase());
219
- if (matches.length === 0) {
220
- console.log(pc.red(`Tag not found: ${input}. Create it first.`));
221
- return null;
222
- }
223
- if (matches.length > 1) {
224
- console.log(pc.red(`Multiple tags match "${input}". Please use the tag ID or rename duplicates.`));
225
- return null;
226
- }
227
- return matches[0].id;
228
102
  }
103
+ // ── Re-exports ──────────────────────────────────────────────────────────────
104
+ // Keep `../utils.js` the single public import surface for CLI commands and
105
+ // tests; implementations live in ./utils/*.ts.
106
+ export { formatFoldersTable, formatLinkDetail, formatLinksMinimal, formatLinksTable, formatTagsTable, } from "./utils/format.js";
107
+ export { resolveFolderName, resolveTagName, resolveTagRef, } from "./utils/resolve.js";
229
108
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocoo/zhe",
3
- "version": "1.16.1",
3
+ "version": "1.19.3",
4
4
  "description": "CLI for managing zhe.to short links",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,14 +22,14 @@
22
22
  "release": "bun scripts/release.ts"
23
23
  },
24
24
  "dependencies": {
25
- "@nocoo/cli-base": "^0.2.3"
25
+ "@nocoo/cli-base": "^0.2.4"
26
26
  },
27
27
  "devDependencies": {
28
- "@biomejs/biome": "^1.9.0",
29
- "@types/node": "^22.0.0",
30
- "@vitest/coverage-v8": "^3.2.4",
28
+ "@biomejs/biome": "2.5.0",
29
+ "@types/node": "26.0.0",
30
+ "@vitest/coverage-v8": "^4.1.8",
31
31
  "typescript": "^5.7.0",
32
- "vitest": "^3.2.4"
32
+ "vitest": "^4.1.8"
33
33
  },
34
34
  "keywords": [
35
35
  "zhe",
@@ -43,5 +43,9 @@
43
43
  "type": "git",
44
44
  "url": "https://github.com/nocoo/zhe.git",
45
45
  "directory": "cli"
46
+ },
47
+ "overrides": {
48
+ "esbuild": ">=0.28.1",
49
+ "vite": "^7.3.5"
46
50
  }
47
51
  }