@nocoo/zhe 1.18.0 → 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.
- package/dist/commands/idea/add.d.ts +22 -0
- package/dist/commands/idea/add.d.ts.map +1 -0
- package/dist/commands/idea/add.js +55 -0
- package/dist/commands/idea/add.js.map +1 -0
- package/dist/commands/idea/delete.d.ts +17 -0
- package/dist/commands/idea/delete.d.ts.map +1 -0
- package/dist/commands/idea/delete.js +47 -0
- package/dist/commands/idea/delete.js.map +1 -0
- package/dist/commands/idea/get.d.ts +12 -0
- package/dist/commands/idea/get.d.ts.map +1 -0
- package/dist/commands/idea/get.js +45 -0
- package/dist/commands/idea/get.js.map +1 -0
- package/dist/commands/idea/helpers.d.ts +13 -0
- package/dist/commands/idea/helpers.d.ts.map +1 -0
- package/dist/commands/idea/helpers.js +78 -0
- package/dist/commands/idea/helpers.js.map +1 -0
- package/dist/commands/idea/list.d.ts +22 -0
- package/dist/commands/idea/list.d.ts.map +1 -0
- package/dist/commands/idea/list.js +64 -0
- package/dist/commands/idea/list.js.map +1 -0
- package/dist/commands/idea/update.d.ts +27 -0
- package/dist/commands/idea/update.d.ts.map +1 -0
- package/dist/commands/idea/update.js +78 -0
- package/dist/commands/idea/update.js.map +1 -0
- package/dist/commands/idea.d.ts +6 -2
- package/dist/commands/idea.d.ts.map +1 -1
- package/dist/commands/idea.js +12 -393
- package/dist/commands/idea.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +97 -96
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +56 -59
- package/dist/commands/update.js.map +1 -1
- package/dist/utils/format.d.ts +27 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +157 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/resolve.d.ts +41 -0
- package/dist/utils/resolve.d.ts.map +1 -0
- package/dist/utils/resolve.js +69 -0
- package/dist/utils/resolve.js.map +1 -0
- package/dist/utils.d.ts +17 -90
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +20 -250
- package/dist/utils.js.map +1 -1
- package/package.json +10 -6
package/dist/utils.d.ts
CHANGED
|
@@ -1,105 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared utilities for zhe CLI
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*
|
|
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`.
|
|
8
11
|
*/
|
|
12
|
+
/** Mask an API key for display: zhe_abcd...wxyz */
|
|
9
13
|
export declare function maskApiKey(apiKey: string): string;
|
|
10
|
-
/**
|
|
11
|
-
* Validate API key format: must start with zhe_ and be non-empty
|
|
12
|
-
*/
|
|
14
|
+
/** Validate API key format: must start with zhe_ and be non-empty. */
|
|
13
15
|
export declare function isValidApiKeyFormat(apiKey: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Format a date string for display
|
|
16
|
-
*/
|
|
16
|
+
/** Format a date string for display (YYYY-MM-DD). */
|
|
17
17
|
export declare function formatDate(isoDate: string): string;
|
|
18
|
-
/**
|
|
19
|
-
* Format a date string with time
|
|
20
|
-
*/
|
|
18
|
+
/** Format a date string with time (YYYY-MM-DD HH:MM:SS). */
|
|
21
19
|
export declare function formatDateTime(isoDate: string): string;
|
|
22
|
-
/**
|
|
23
|
-
* Truncate a string to a max length with ellipsis
|
|
24
|
-
*/
|
|
20
|
+
/** Truncate a string to a max length with ellipsis. */
|
|
25
21
|
export declare function truncate(str: string, maxLength: number): string;
|
|
26
|
-
/**
|
|
27
|
-
* Options for formatLinksTable
|
|
28
|
-
*/
|
|
29
|
-
export interface FormatLinksTableOptions {
|
|
30
|
-
wide?: boolean;
|
|
31
|
-
folderMap?: Map<string, string>;
|
|
32
|
-
tagMap?: Map<string, string>;
|
|
33
|
-
showTags?: boolean;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Format links as a table
|
|
37
|
-
*/
|
|
38
|
-
export declare function formatLinksTable(links: Link[], options?: FormatLinksTableOptions): string;
|
|
39
|
-
/**
|
|
40
|
-
* Format links as minimal output (just short URLs)
|
|
41
|
-
*/
|
|
42
|
-
export declare function formatLinksMinimal(links: Link[]): string;
|
|
43
|
-
/**
|
|
44
|
-
* Format a single link for detailed display
|
|
45
|
-
* @param link - The link to format
|
|
46
|
-
* @param folderName - Optional folder name (if not provided, shows folder ID)
|
|
47
|
-
* @param tagMap - Optional map of tagId → name (falls back to tagId if missing)
|
|
48
|
-
*/
|
|
49
|
-
export declare function formatLinkDetail(link: Link, folderName?: string, tagMap?: Map<string, string>): string;
|
|
50
22
|
export declare function parsePositiveInt(input: string): number | null;
|
|
51
|
-
/**
|
|
52
|
-
* Parse a link ID from string, return null if invalid.
|
|
53
|
-
* Uses strict positive-integer parsing.
|
|
54
|
-
*/
|
|
23
|
+
/** Parse a link ID from string; uses strict positive-integer parsing. */
|
|
55
24
|
export declare function parseLinkId(input: string): number | null;
|
|
56
|
-
/**
|
|
57
|
-
* Format folders as a table
|
|
58
|
-
*/
|
|
59
|
-
export declare function formatFoldersTable(folders: Folder[]): string;
|
|
60
|
-
/**
|
|
61
|
-
* Format tags as a table
|
|
62
|
-
*/
|
|
63
|
-
export declare function formatTagsTable(tags: Tag[]): string;
|
|
64
|
-
/**
|
|
65
|
-
* Resolve a folder name to folder ID via API.
|
|
66
|
-
* If input looks like a UUID, use it directly.
|
|
67
|
-
* Returns null if folder is not found (with error message printed).
|
|
68
|
-
*/
|
|
69
|
-
export declare function resolveFolderName(client: ApiClient, input: string): Promise<string | null>;
|
|
70
25
|
/**
|
|
71
26
|
* Open a URL in the default browser.
|
|
72
27
|
* Uses spawn() with argv to prevent shell injection.
|
|
73
28
|
*/
|
|
74
29
|
export declare function openInBrowser(url: string): void;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
* If input looks like a UUID, use it directly.
|
|
78
|
-
* Returns null if tag is not found (with error message printed).
|
|
79
|
-
*/
|
|
80
|
-
export declare function resolveTagName(client: ApiClient, input: string): Promise<string | null>;
|
|
81
|
-
/**
|
|
82
|
-
* Resolve a tag reference (name or UUID) to its canonical id + name.
|
|
83
|
-
*
|
|
84
|
-
* Unlike `resolveTagName`, this:
|
|
85
|
-
* - Distinguishes `not_found` (zero matches) from `ambiguous` (multiple
|
|
86
|
-
* name matches), letting callers map them to different exit codes.
|
|
87
|
-
* - For UUID input, returns immediately without calling `listTags()` so
|
|
88
|
-
* that API keys with only `tags:write` (no `tags:read`) can still
|
|
89
|
-
* update/delete by ID. The server is the source of truth for whether
|
|
90
|
-
* the tag exists. `name` is `undefined` in that case; callers should
|
|
91
|
-
* fall back to the UUID in any prompt text.
|
|
92
|
-
*
|
|
93
|
-
* Does NOT print any error itself — callers decide messaging and exit codes.
|
|
94
|
-
*/
|
|
95
|
-
export type TagRef = {
|
|
96
|
-
kind: "found";
|
|
97
|
-
id: string;
|
|
98
|
-
name: string | undefined;
|
|
99
|
-
} | {
|
|
100
|
-
kind: "not_found";
|
|
101
|
-
} | {
|
|
102
|
-
kind: "ambiguous";
|
|
103
|
-
};
|
|
104
|
-
export declare function resolveTagRef(client: ApiClient, input: string): Promise<TagRef>;
|
|
30
|
+
export { type FormatLinksTableOptions, formatFoldersTable, formatLinkDetail, formatLinksMinimal, formatLinksTable, formatTagsTable, } from "./utils/format.js";
|
|
31
|
+
export { resolveFolderName, resolveTagName, resolveTagRef, type TagRef, } from "./utils/resolve.js";
|
|
105
32
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK/D;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAgC/C;AAMD,OAAO,EACN,KAAK,uBAAuB,EAC5B,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,MAAM,GACX,MAAM,oBAAoB,CAAC"}
|
package/dist/utils.js
CHANGED
|
@@ -1,11 +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
|
*/
|
|
4
12
|
import { spawn } from "node:child_process";
|
|
5
13
|
import { pc } from "@nocoo/cli-base";
|
|
6
|
-
/**
|
|
7
|
-
* Mask an API key for display: zhe_abcd...wxyz
|
|
8
|
-
*/
|
|
14
|
+
/** Mask an API key for display: zhe_abcd...wxyz */
|
|
9
15
|
export function maskApiKey(apiKey) {
|
|
10
16
|
if (!apiKey || apiKey.length < 12) {
|
|
11
17
|
return apiKey;
|
|
@@ -14,160 +20,28 @@ export function maskApiKey(apiKey) {
|
|
|
14
20
|
const suffix = apiKey.slice(-4);
|
|
15
21
|
return `${prefix}...${suffix}`;
|
|
16
22
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Validate API key format: must start with zhe_ and be non-empty
|
|
19
|
-
*/
|
|
23
|
+
/** Validate API key format: must start with zhe_ and be non-empty. */
|
|
20
24
|
export function isValidApiKeyFormat(apiKey) {
|
|
21
25
|
return apiKey.startsWith("zhe_") && apiKey.length > 4;
|
|
22
26
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Format a date string for display
|
|
25
|
-
*/
|
|
27
|
+
/** Format a date string for display (YYYY-MM-DD). */
|
|
26
28
|
export function formatDate(isoDate) {
|
|
27
29
|
const date = new Date(isoDate);
|
|
28
30
|
const parts = date.toISOString().split("T");
|
|
29
31
|
return parts[0] ?? "";
|
|
30
32
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Format a date string with time
|
|
33
|
-
*/
|
|
33
|
+
/** Format a date string with time (YYYY-MM-DD HH:MM:SS). */
|
|
34
34
|
export function formatDateTime(isoDate) {
|
|
35
35
|
const date = new Date(isoDate);
|
|
36
36
|
return date.toISOString().replace("T", " ").slice(0, 19);
|
|
37
37
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Truncate a string to a max length with ellipsis
|
|
40
|
-
*/
|
|
38
|
+
/** Truncate a string to a max length with ellipsis. */
|
|
41
39
|
export function truncate(str, maxLength) {
|
|
42
40
|
if (str.length <= maxLength) {
|
|
43
41
|
return str;
|
|
44
42
|
}
|
|
45
43
|
return `${str.slice(0, maxLength - 3)}...`;
|
|
46
44
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Format links as a table
|
|
49
|
-
*/
|
|
50
|
-
export function formatLinksTable(links, options = {}) {
|
|
51
|
-
if (links.length === 0) {
|
|
52
|
-
return "No links found.";
|
|
53
|
-
}
|
|
54
|
-
const { wide = false, folderMap, tagMap, showTags = false } = options;
|
|
55
|
-
const showFolders = links.some((l) => l.folderId);
|
|
56
|
-
const formatTags = (link) => {
|
|
57
|
-
// Prefer embedded tags (carries names) — avoids needing a tagMap
|
|
58
|
-
// fetch from the caller when /links already returned tag details.
|
|
59
|
-
if (link.tags && link.tags.length > 0) {
|
|
60
|
-
return link.tags.map((t) => t.name).join(",");
|
|
61
|
-
}
|
|
62
|
-
const ids = link.tagIds ?? [];
|
|
63
|
-
if (ids.length === 0)
|
|
64
|
-
return "";
|
|
65
|
-
return ids.map((id) => tagMap?.get(id) ?? id.slice(0, 8)).join(",");
|
|
66
|
-
};
|
|
67
|
-
if (wide) {
|
|
68
|
-
// Wide mode: no truncation
|
|
69
|
-
let header = "ID SLUG URL ";
|
|
70
|
-
if (showFolders)
|
|
71
|
-
header += "FOLDER ";
|
|
72
|
-
if (showTags)
|
|
73
|
-
header += "TAGS ";
|
|
74
|
-
header += "CLICKS CREATED";
|
|
75
|
-
const separator = "─".repeat(header.length);
|
|
76
|
-
const rows = links.map((link) => {
|
|
77
|
-
const id = String(link.id).padEnd(6);
|
|
78
|
-
const slug = link.slug.padEnd(20);
|
|
79
|
-
const url = link.originalUrl.padEnd(48);
|
|
80
|
-
const clicks = String(link.clicks).padEnd(7);
|
|
81
|
-
const created = formatDate(link.createdAt);
|
|
82
|
-
let row = `${id} ${slug} ${url} `;
|
|
83
|
-
if (showFolders) {
|
|
84
|
-
const folderName = link.folderId
|
|
85
|
-
? (folderMap?.get(link.folderId) ?? link.folderId.slice(0, 8))
|
|
86
|
-
: "";
|
|
87
|
-
row += `${folderName.padEnd(16)} `;
|
|
88
|
-
}
|
|
89
|
-
if (showTags) {
|
|
90
|
-
row += `${formatTags(link).padEnd(26)} `;
|
|
91
|
-
}
|
|
92
|
-
row += `${clicks} ${created}`;
|
|
93
|
-
return row;
|
|
94
|
-
});
|
|
95
|
-
return [header, separator, ...rows].join("\n");
|
|
96
|
-
}
|
|
97
|
-
// Default compact mode with truncation
|
|
98
|
-
let header = "ID SLUG URL ";
|
|
99
|
-
if (showFolders)
|
|
100
|
-
header += "FOLDER ";
|
|
101
|
-
if (showTags)
|
|
102
|
-
header += "TAGS ";
|
|
103
|
-
header += "CLICKS CREATED";
|
|
104
|
-
const separator = "─".repeat(header.length);
|
|
105
|
-
const rows = links.map((link) => {
|
|
106
|
-
const id = String(link.id).padEnd(6);
|
|
107
|
-
const slug = truncate(link.slug, 10).padEnd(11);
|
|
108
|
-
const url = truncate(link.originalUrl, 32).padEnd(32);
|
|
109
|
-
const clicks = String(link.clicks).padEnd(7);
|
|
110
|
-
const created = formatDate(link.createdAt);
|
|
111
|
-
let row = `${id} ${slug} ${url} `;
|
|
112
|
-
if (showFolders) {
|
|
113
|
-
const folderName = link.folderId
|
|
114
|
-
? (folderMap?.get(link.folderId) ?? link.folderId.slice(0, 8))
|
|
115
|
-
: "";
|
|
116
|
-
row += `${truncate(folderName, 12).padEnd(12)} `;
|
|
117
|
-
}
|
|
118
|
-
if (showTags) {
|
|
119
|
-
row += `${truncate(formatTags(link), 12).padEnd(12)} `;
|
|
120
|
-
}
|
|
121
|
-
row += `${clicks} ${created}`;
|
|
122
|
-
return row;
|
|
123
|
-
});
|
|
124
|
-
return [header, separator, ...rows].join("\n");
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Format links as minimal output (just short URLs)
|
|
128
|
-
*/
|
|
129
|
-
export function formatLinksMinimal(links) {
|
|
130
|
-
if (links.length === 0) {
|
|
131
|
-
return "";
|
|
132
|
-
}
|
|
133
|
-
return links.map((link) => `zhe.to/${link.slug}`).join("\n");
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Format a single link for detailed display
|
|
137
|
-
* @param link - The link to format
|
|
138
|
-
* @param folderName - Optional folder name (if not provided, shows folder ID)
|
|
139
|
-
* @param tagMap - Optional map of tagId → name (falls back to tagId if missing)
|
|
140
|
-
*/
|
|
141
|
-
export function formatLinkDetail(link, folderName, tagMap) {
|
|
142
|
-
const lines = [
|
|
143
|
-
`Link #${link.id}`,
|
|
144
|
-
"",
|
|
145
|
-
` Short URL: ${link.shortUrl}`,
|
|
146
|
-
` Original: ${link.originalUrl}`,
|
|
147
|
-
` Slug: ${link.slug}${link.isCustom ? " (custom)" : ""}`,
|
|
148
|
-
` Clicks: ${link.clicks}`,
|
|
149
|
-
];
|
|
150
|
-
if (link.folderId) {
|
|
151
|
-
const folderDisplay = folderName ?? link.folderId;
|
|
152
|
-
lines.push(` Folder: ${folderDisplay}`);
|
|
153
|
-
}
|
|
154
|
-
if (link.tags && link.tags.length > 0) {
|
|
155
|
-
lines.push(` Tags: ${link.tags.map((t) => t.name).join(", ")}`);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
const tagIds = link.tagIds ?? [];
|
|
159
|
-
if (tagIds.length > 0) {
|
|
160
|
-
const tagDisplay = tagIds.map((id) => tagMap?.get(id) ?? id).join(", ");
|
|
161
|
-
lines.push(` Tags: ${tagDisplay}`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (link.note) {
|
|
165
|
-
lines.push(` Note: ${link.note}`);
|
|
166
|
-
}
|
|
167
|
-
lines.push(` Expires: ${link.expiresAt ? formatDateTime(link.expiresAt) : "Never"}`);
|
|
168
|
-
lines.push(` Created: ${formatDateTime(link.createdAt)}`);
|
|
169
|
-
return lines.join("\n");
|
|
170
|
-
}
|
|
171
45
|
/**
|
|
172
46
|
* Strict positive-integer parser.
|
|
173
47
|
* Rejects empty strings, 0, negatives, decimals, scientific notation,
|
|
@@ -185,75 +59,10 @@ export function parsePositiveInt(input) {
|
|
|
185
59
|
}
|
|
186
60
|
return id;
|
|
187
61
|
}
|
|
188
|
-
/**
|
|
189
|
-
* Parse a link ID from string, return null if invalid.
|
|
190
|
-
* Uses strict positive-integer parsing.
|
|
191
|
-
*/
|
|
62
|
+
/** Parse a link ID from string; uses strict positive-integer parsing. */
|
|
192
63
|
export function parseLinkId(input) {
|
|
193
64
|
return parsePositiveInt(input);
|
|
194
65
|
}
|
|
195
|
-
/**
|
|
196
|
-
* Format folders as a table
|
|
197
|
-
*/
|
|
198
|
-
export function formatFoldersTable(folders) {
|
|
199
|
-
if (folders.length === 0) {
|
|
200
|
-
return "No folders found.";
|
|
201
|
-
}
|
|
202
|
-
const header = "ID NAME LINKS ICON CREATED";
|
|
203
|
-
const separator = "─".repeat(header.length);
|
|
204
|
-
const rows = folders.map((folder) => {
|
|
205
|
-
const id = folder.id.padEnd(36);
|
|
206
|
-
const name = truncate(folder.name, 18).padEnd(18);
|
|
207
|
-
const links = String(folder.linkCount).padEnd(6);
|
|
208
|
-
const icon = truncate(folder.icon, 8).padEnd(8);
|
|
209
|
-
const created = formatDate(folder.createdAt);
|
|
210
|
-
return `${id} ${name} ${links} ${icon} ${created}`;
|
|
211
|
-
});
|
|
212
|
-
return [header, separator, ...rows].join("\n");
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Format tags as a table
|
|
216
|
-
*/
|
|
217
|
-
export function formatTagsTable(tags) {
|
|
218
|
-
if (tags.length === 0) {
|
|
219
|
-
return "No tags found.";
|
|
220
|
-
}
|
|
221
|
-
const header = "ID NAME COLOR CREATED";
|
|
222
|
-
const separator = "─".repeat(header.length);
|
|
223
|
-
const rows = tags.map((tag) => {
|
|
224
|
-
const id = tag.id.padEnd(36);
|
|
225
|
-
const name = truncate(tag.name, 18).padEnd(18);
|
|
226
|
-
const color = tag.color.padEnd(8);
|
|
227
|
-
const created = formatDate(tag.createdAt);
|
|
228
|
-
return `${id} ${name} ${color} ${created}`;
|
|
229
|
-
});
|
|
230
|
-
return [header, separator, ...rows].join("\n");
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Resolve a folder name to folder ID via API.
|
|
234
|
-
* If input looks like a UUID, use it directly.
|
|
235
|
-
* Returns null if folder is not found (with error message printed).
|
|
236
|
-
*/
|
|
237
|
-
export async function resolveFolderName(client, input) {
|
|
238
|
-
// Check if input looks like a UUID (36 chars with dashes)
|
|
239
|
-
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
240
|
-
if (uuidPattern.test(input)) {
|
|
241
|
-
return input; // Assume it's already an ID
|
|
242
|
-
}
|
|
243
|
-
// Otherwise, resolve by name
|
|
244
|
-
const { folders } = await client.listFolders();
|
|
245
|
-
const matches = folders.filter((f) => f.name.toLowerCase() === input.toLowerCase());
|
|
246
|
-
if (matches.length === 0) {
|
|
247
|
-
console.log(pc.red(`Folder not found: ${input}`));
|
|
248
|
-
return null;
|
|
249
|
-
}
|
|
250
|
-
if (matches.length > 1) {
|
|
251
|
-
console.log(pc.red(`Multiple folders match "${input}". Please use the folder ID instead.`));
|
|
252
|
-
console.log(pc.dim("Use `zhe folders` to see all folder IDs."));
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
return matches[0].id;
|
|
256
|
-
}
|
|
257
66
|
/**
|
|
258
67
|
* Open a URL in the default browser.
|
|
259
68
|
* Uses spawn() with argv to prevent shell injection.
|
|
@@ -291,48 +100,9 @@ export function openInBrowser(url) {
|
|
|
291
100
|
}
|
|
292
101
|
});
|
|
293
102
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
export async function resolveTagName(client, input) {
|
|
300
|
-
// Check if input looks like a UUID
|
|
301
|
-
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
302
|
-
if (uuidPattern.test(input)) {
|
|
303
|
-
return input;
|
|
304
|
-
}
|
|
305
|
-
const { tags } = await client.listTags();
|
|
306
|
-
const matches = tags.filter((t) => t.name.toLowerCase() === input.toLowerCase());
|
|
307
|
-
if (matches.length === 0) {
|
|
308
|
-
console.log(pc.red(`Tag not found: ${input}. Create it first.`));
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
if (matches.length > 1) {
|
|
312
|
-
console.log(pc.red(`Multiple tags match "${input}". Please use the tag ID or rename duplicates.`));
|
|
313
|
-
return null;
|
|
314
|
-
}
|
|
315
|
-
return matches[0].id;
|
|
316
|
-
}
|
|
317
|
-
export async function resolveTagRef(client, input) {
|
|
318
|
-
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
319
|
-
if (uuidPattern.test(input)) {
|
|
320
|
-
// Trust the UUID; let the destructive op's PATCH/DELETE be the
|
|
321
|
-
// authoritative existence check. Avoids requiring tags:read.
|
|
322
|
-
// Normalize to lowercase: tag IDs are stored lowercase, but the
|
|
323
|
-
// regex accepts uppercase (RFC 4122 allows either case in
|
|
324
|
-
// notation). The DB is `WHERE id = ?` text-equal, so an
|
|
325
|
-
// uppercase UUID would 404 on a tag that actually exists.
|
|
326
|
-
return { kind: "found", id: input.toLowerCase(), name: undefined };
|
|
327
|
-
}
|
|
328
|
-
const { tags } = await client.listTags();
|
|
329
|
-
const matches = tags.filter((t) => t.name.toLowerCase() === input.toLowerCase());
|
|
330
|
-
if (matches.length === 0) {
|
|
331
|
-
return { kind: "not_found" };
|
|
332
|
-
}
|
|
333
|
-
if (matches.length > 1) {
|
|
334
|
-
return { kind: "ambiguous" };
|
|
335
|
-
}
|
|
336
|
-
return { kind: "found", id: matches[0].id, name: matches[0].name };
|
|
337
|
-
}
|
|
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";
|
|
338
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.
|
|
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.
|
|
25
|
+
"@nocoo/cli-base": "^0.2.4"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@biomejs/biome": "
|
|
29
|
-
"@types/node": "
|
|
30
|
-
"@vitest/coverage-v8": "^
|
|
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": "^
|
|
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
|
}
|