@portel/photon 1.2.0 → 1.4.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/README.md +319 -60
- package/dist/cli-alias.d.ts +21 -0
- package/dist/cli-alias.d.ts.map +1 -0
- package/dist/cli-alias.js +232 -0
- package/dist/cli-alias.js.map +1 -0
- package/dist/cli-formatter.d.ts +25 -0
- package/dist/cli-formatter.d.ts.map +1 -0
- package/dist/cli-formatter.js +326 -0
- package/dist/cli-formatter.js.map +1 -0
- package/dist/cli.js +961 -484
- package/dist/cli.js.map +1 -1
- package/dist/daemon/client.d.ts +15 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +126 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/manager.d.ts +32 -0
- package/dist/daemon/manager.d.ts.map +1 -0
- package/dist/daemon/manager.js +155 -0
- package/dist/daemon/manager.js.map +1 -0
- package/dist/daemon/protocol.d.ts +48 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +7 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.d.ts +12 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +215 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/session-manager.d.ts +46 -0
- package/dist/daemon/session-manager.d.ts.map +1 -0
- package/dist/daemon/session-manager.js +120 -0
- package/dist/daemon/session-manager.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +16 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +125 -19
- package/dist/loader.js.map +1 -1
- package/dist/path-resolver.d.ts +12 -19
- package/dist/path-resolver.d.ts.map +1 -1
- package/dist/path-resolver.js +35 -61
- package/dist/path-resolver.js.map +1 -1
- package/dist/photon-cli-runner.d.ts +15 -0
- package/dist/photon-cli-runner.d.ts.map +1 -0
- package/dist/photon-cli-runner.js +1124 -0
- package/dist/photon-cli-runner.js.map +1 -0
- package/dist/photon-doc-extractor.d.ts +10 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +89 -9
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/schema-extractor.d.ts +27 -0
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +333 -2
- package/dist/schema-extractor.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -8
- package/dist/server.js.map +1 -1
- package/dist/template-manager.js +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Alias Manager (Cross-Platform)
|
|
3
|
+
*
|
|
4
|
+
* Creates executable aliases for photons so they can be called directly
|
|
5
|
+
* Supports: Windows, macOS, Linux
|
|
6
|
+
* Example: Instead of `photon cli lg-remote discover`
|
|
7
|
+
* Run: `lg-remote discover`
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as os from 'os';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { resolvePhotonPath } from './path-resolver.js';
|
|
14
|
+
const ALIAS_DIR = path.join(os.homedir(), '.photon', 'bin');
|
|
15
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
16
|
+
const PATH_SEPARATOR = IS_WINDOWS ? ';' : ':';
|
|
17
|
+
/**
|
|
18
|
+
* Create a CLI alias for a photon (cross-platform)
|
|
19
|
+
*/
|
|
20
|
+
export async function createAlias(photonName, aliasName) {
|
|
21
|
+
try {
|
|
22
|
+
// Verify photon exists
|
|
23
|
+
const photonPath = await resolvePhotonPath(photonName);
|
|
24
|
+
if (!photonPath) {
|
|
25
|
+
console.error(`❌ Photon '${photonName}' not found`);
|
|
26
|
+
console.error(`\nInstall it first with: photon add ${photonName}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// Use provided alias name or default to photon name
|
|
30
|
+
const cmdName = aliasName || photonName;
|
|
31
|
+
// Create bin directory if it doesn't exist
|
|
32
|
+
await fs.mkdir(ALIAS_DIR, { recursive: true });
|
|
33
|
+
// Determine which photon executable to use
|
|
34
|
+
const photonCmd = await findPhotonExecutable();
|
|
35
|
+
// Create platform-specific alias file
|
|
36
|
+
if (IS_WINDOWS) {
|
|
37
|
+
await createWindowsAlias(cmdName, photonName, photonCmd);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
await createUnixAlias(cmdName, photonName, photonCmd);
|
|
41
|
+
}
|
|
42
|
+
console.log(`✅ Created alias: ${cmdName}`);
|
|
43
|
+
console.log(`\nYou can now run:`);
|
|
44
|
+
console.log(` ${cmdName} <command> [options]`);
|
|
45
|
+
console.log(`\nInstead of:`);
|
|
46
|
+
console.log(` photon cli ${photonName} <command> [options]`);
|
|
47
|
+
// Check if bin directory is in PATH and provide instructions
|
|
48
|
+
await checkAndInstructPath();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`❌ Error: ${error.message}`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create Unix-style alias (bash script)
|
|
57
|
+
*/
|
|
58
|
+
async function createUnixAlias(cmdName, photonName, photonCmd) {
|
|
59
|
+
const aliasPath = path.join(ALIAS_DIR, cmdName);
|
|
60
|
+
// Check if alias already exists
|
|
61
|
+
if (existsSync(aliasPath)) {
|
|
62
|
+
console.error(`⚠️ Alias '${cmdName}' already exists`);
|
|
63
|
+
console.error(`\nRemove it first with: photon unalias ${cmdName}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
const script = `#!/bin/bash
|
|
67
|
+
# Auto-generated alias for photon: ${photonName}
|
|
68
|
+
${photonCmd} cli ${photonName} "$@"
|
|
69
|
+
`;
|
|
70
|
+
await fs.writeFile(aliasPath, script, { mode: 0o755 });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create Windows-style alias (batch file)
|
|
74
|
+
*/
|
|
75
|
+
async function createWindowsAlias(cmdName, photonName, photonCmd) {
|
|
76
|
+
const aliasPath = path.join(ALIAS_DIR, `${cmdName}.cmd`);
|
|
77
|
+
// Check if alias already exists
|
|
78
|
+
if (existsSync(aliasPath)) {
|
|
79
|
+
console.error(`⚠️ Alias '${cmdName}' already exists`);
|
|
80
|
+
console.error(`\nRemove it first with: photon unalias ${cmdName}`);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const script = `@echo off
|
|
84
|
+
REM Auto-generated alias for photon: ${photonName}
|
|
85
|
+
${photonCmd} cli ${photonName} %*
|
|
86
|
+
`;
|
|
87
|
+
await fs.writeFile(aliasPath, script);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if alias directory is in PATH and provide platform-specific instructions
|
|
91
|
+
*/
|
|
92
|
+
async function checkAndInstructPath() {
|
|
93
|
+
const pathEnv = process.env.PATH || '';
|
|
94
|
+
const paths = pathEnv.split(PATH_SEPARATOR);
|
|
95
|
+
if (paths.includes(ALIAS_DIR)) {
|
|
96
|
+
// Already in PATH
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log(`\n⚠️ ${ALIAS_DIR} is not in your PATH`);
|
|
100
|
+
if (IS_WINDOWS) {
|
|
101
|
+
console.log(`\nTo add it permanently, run this in PowerShell (as Administrator):`);
|
|
102
|
+
console.log(` [Environment]::SetEnvironmentVariable("Path", $env:Path + ";${ALIAS_DIR}", "User")`);
|
|
103
|
+
console.log(`\nOr add it manually:`);
|
|
104
|
+
console.log(` 1. Open "Environment Variables" in Windows settings`);
|
|
105
|
+
console.log(` 2. Edit the "Path" variable for your user`);
|
|
106
|
+
console.log(` 3. Add: ${ALIAS_DIR}`);
|
|
107
|
+
console.log(` 4. Restart your terminal`);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Detect shell
|
|
111
|
+
const shell = process.env.SHELL || '';
|
|
112
|
+
let configFile = '~/.bashrc';
|
|
113
|
+
if (shell.includes('zsh')) {
|
|
114
|
+
configFile = '~/.zshrc';
|
|
115
|
+
}
|
|
116
|
+
else if (shell.includes('fish')) {
|
|
117
|
+
configFile = '~/.config/fish/config.fish';
|
|
118
|
+
}
|
|
119
|
+
console.log(`\nAdd this to your ${configFile}:`);
|
|
120
|
+
console.log(` export PATH="$PATH:${ALIAS_DIR}"`);
|
|
121
|
+
console.log(`\nThen reload your shell:`);
|
|
122
|
+
console.log(` source ${configFile}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Remove a CLI alias (cross-platform)
|
|
127
|
+
*/
|
|
128
|
+
export async function removeAlias(aliasName) {
|
|
129
|
+
try {
|
|
130
|
+
// Try both Unix and Windows formats
|
|
131
|
+
const unixPath = path.join(ALIAS_DIR, aliasName);
|
|
132
|
+
const windowsPath = path.join(ALIAS_DIR, `${aliasName}.cmd`);
|
|
133
|
+
let aliasPath = null;
|
|
134
|
+
if (existsSync(unixPath)) {
|
|
135
|
+
aliasPath = unixPath;
|
|
136
|
+
}
|
|
137
|
+
else if (existsSync(windowsPath)) {
|
|
138
|
+
aliasPath = windowsPath;
|
|
139
|
+
}
|
|
140
|
+
if (!aliasPath) {
|
|
141
|
+
console.error(`❌ Alias '${aliasName}' not found`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
await fs.unlink(aliasPath);
|
|
145
|
+
console.log(`✅ Removed alias: ${aliasName}`);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.error(`❌ Error: ${error.message}`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* List all CLI aliases (cross-platform)
|
|
154
|
+
*/
|
|
155
|
+
export async function listAliases() {
|
|
156
|
+
try {
|
|
157
|
+
const { formatOutput, printInfo, printWarning } = await import('./cli-formatter.js');
|
|
158
|
+
if (!existsSync(ALIAS_DIR)) {
|
|
159
|
+
printInfo('No aliases created yet.');
|
|
160
|
+
printInfo('Create one with: photon alias <photon-name>');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const files = await fs.readdir(ALIAS_DIR);
|
|
164
|
+
if (files.length === 0) {
|
|
165
|
+
printInfo('No aliases created yet.');
|
|
166
|
+
printInfo('Create one with: photon alias <photon-name>');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Build table data
|
|
170
|
+
const tableData = [];
|
|
171
|
+
for (const file of files) {
|
|
172
|
+
const aliasPath = path.join(ALIAS_DIR, file);
|
|
173
|
+
const stat = await fs.stat(aliasPath);
|
|
174
|
+
if (stat.isFile()) {
|
|
175
|
+
// Read the script to find which photon it points to
|
|
176
|
+
const content = await fs.readFile(aliasPath, 'utf-8');
|
|
177
|
+
const match = content.match(/photon cli (\S+)/);
|
|
178
|
+
const photonName = match ? match[1] : 'unknown';
|
|
179
|
+
// Display name without .cmd extension on Windows
|
|
180
|
+
const displayName = file.replace(/\.cmd$/, '');
|
|
181
|
+
tableData.push({ alias: displayName, photon: photonName });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
printInfo(`CLI Aliases (${tableData.length}):\n`);
|
|
185
|
+
formatOutput(tableData, 'table');
|
|
186
|
+
// Check if bin directory is in PATH
|
|
187
|
+
const pathEnv = process.env.PATH || '';
|
|
188
|
+
const paths = pathEnv.split(PATH_SEPARATOR);
|
|
189
|
+
if (!paths.includes(ALIAS_DIR)) {
|
|
190
|
+
printWarning(`${ALIAS_DIR} is not in your PATH`);
|
|
191
|
+
await checkAndInstructPath();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
const { printError } = await import('./cli-formatter.js');
|
|
196
|
+
printError(error.message);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Find the photon executable path
|
|
202
|
+
*/
|
|
203
|
+
async function findPhotonExecutable() {
|
|
204
|
+
// Check if running from global installation
|
|
205
|
+
const globalPhoton = await findInPath('photon');
|
|
206
|
+
if (globalPhoton) {
|
|
207
|
+
return globalPhoton;
|
|
208
|
+
}
|
|
209
|
+
// Fallback to npx
|
|
210
|
+
return 'npx @portel/photon';
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Find a command in PATH
|
|
214
|
+
*/
|
|
215
|
+
async function findInPath(cmd) {
|
|
216
|
+
const pathEnv = process.env.PATH || '';
|
|
217
|
+
const paths = pathEnv.split(':');
|
|
218
|
+
for (const dir of paths) {
|
|
219
|
+
const fullPath = path.join(dir, cmd);
|
|
220
|
+
if (existsSync(fullPath)) {
|
|
221
|
+
try {
|
|
222
|
+
await fs.access(fullPath, fs.constants.X_OK);
|
|
223
|
+
return fullPath;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=cli-alias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-alias.js","sourceRoot":"","sources":["../src/cli-alias.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type OutputFormat = 'primitive' | 'table' | 'tree' | 'list' | 'none' | 'json' | 'markdown' | 'yaml' | 'xml' | 'html' | 'code' | `code:${string}`;
|
|
2
|
+
export declare const STATUS: {
|
|
3
|
+
OK: string;
|
|
4
|
+
ERROR: string;
|
|
5
|
+
WARN: string;
|
|
6
|
+
UNKNOWN: string;
|
|
7
|
+
UPDATE: string;
|
|
8
|
+
OFF: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function formatOutput(data: any, hint?: OutputFormat): void;
|
|
11
|
+
export declare function detectFormat(data: any): OutputFormat;
|
|
12
|
+
export declare function renderPrimitive(value: any): void;
|
|
13
|
+
export declare function renderList(data: any[]): void;
|
|
14
|
+
export declare function renderTable(data: any): void;
|
|
15
|
+
export declare function renderTree(data: any, indent?: number): void;
|
|
16
|
+
export declare function renderNone(): void;
|
|
17
|
+
export declare function formatKey(key: string): string;
|
|
18
|
+
export declare function formatValue(value: any): string;
|
|
19
|
+
export declare function formatToMimeType(format: OutputFormat): string | undefined;
|
|
20
|
+
export declare function printSuccess(message: string): void;
|
|
21
|
+
export declare function printError(message: string): void;
|
|
22
|
+
export declare function printInfo(message: string): void;
|
|
23
|
+
export declare function printWarning(message: string): void;
|
|
24
|
+
export declare function printHeader(message: string): void;
|
|
25
|
+
//# sourceMappingURL=cli-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-formatter.d.ts","sourceRoot":"","sources":["../src/cli-formatter.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,UAAU,GACV,MAAM,GACN,KAAK,GACL,MAAM,GACN,MAAM,GACN,QAAQ,MAAM,EAAE,CAAC;AAErB,eAAO,MAAM,MAAM;;;;;;;CAOlB,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CASjE;AAgID,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,YAAY,CA2BpD;AASD,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAMhD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAM5C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAuE3C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,SAAI,GAAG,IAAI,CAkBtD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAUD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAQ9C;AAcD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAezE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { highlight } from 'cli-highlight';
|
|
3
|
+
export const STATUS = {
|
|
4
|
+
OK: chalk.green('OK'),
|
|
5
|
+
ERROR: chalk.red('ERROR'),
|
|
6
|
+
WARN: chalk.yellow('WARN'),
|
|
7
|
+
UNKNOWN: chalk.gray('UNKNOWN'),
|
|
8
|
+
UPDATE: chalk.blue('UPDATE'),
|
|
9
|
+
OFF: chalk.gray('OFF'),
|
|
10
|
+
};
|
|
11
|
+
export function formatOutput(data, hint) {
|
|
12
|
+
const format = hint || detectFormat(data);
|
|
13
|
+
if (typeof data === 'string' && isContentFormat(format)) {
|
|
14
|
+
renderContent(data, format);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
formatDataWithHint(data, format);
|
|
18
|
+
}
|
|
19
|
+
function isContentFormat(format) {
|
|
20
|
+
return (format === 'json' ||
|
|
21
|
+
format === 'markdown' ||
|
|
22
|
+
format === 'yaml' ||
|
|
23
|
+
format === 'xml' ||
|
|
24
|
+
format === 'html' ||
|
|
25
|
+
format === 'code' ||
|
|
26
|
+
format.startsWith('code:'));
|
|
27
|
+
}
|
|
28
|
+
function renderContent(content, format) {
|
|
29
|
+
switch (format) {
|
|
30
|
+
case 'json':
|
|
31
|
+
renderJson(content);
|
|
32
|
+
break;
|
|
33
|
+
case 'markdown':
|
|
34
|
+
renderMarkdown(content);
|
|
35
|
+
break;
|
|
36
|
+
case 'yaml':
|
|
37
|
+
renderYaml(content);
|
|
38
|
+
break;
|
|
39
|
+
case 'xml':
|
|
40
|
+
case 'html':
|
|
41
|
+
renderXml(content);
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
if (format === 'code' || format.startsWith('code:')) {
|
|
45
|
+
const lang = format === 'code' ? undefined : format.slice(5);
|
|
46
|
+
renderCode(content, lang);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(content);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function renderJson(content) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(content);
|
|
56
|
+
console.log(highlight(JSON.stringify(parsed, null, 2), { language: 'json', ignoreIllegals: true }));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
console.log(content);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function renderMarkdown(content) {
|
|
63
|
+
let rendered = content;
|
|
64
|
+
rendered = rendered.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => {
|
|
65
|
+
const trimmedCode = code.trim();
|
|
66
|
+
if (lang && lang !== '') {
|
|
67
|
+
try {
|
|
68
|
+
return '\n' + highlight(trimmedCode, { language: lang, ignoreIllegals: true }) + '\n';
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return '\n' + chalk.gray(trimmedCode) + '\n';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return '\n' + chalk.gray(trimmedCode) + '\n';
|
|
75
|
+
});
|
|
76
|
+
rendered = rendered.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_m, text, url) => chalk.blue.underline(text) + chalk.dim(` (${url})`));
|
|
77
|
+
rendered = rendered
|
|
78
|
+
.replace(/^### (.+)$/gm, (_m, h) => `\n${chalk.cyan(' ' + h)}\n ${chalk.dim('-'.repeat(20))}`)
|
|
79
|
+
.replace(/^## (.+)$/gm, (_m, h) => `\n${chalk.yellow.bold(' ' + h)}\n ${chalk.dim('='.repeat(30))}`)
|
|
80
|
+
.replace(/^# (.+)$/gm, (_m, h) => `\n${chalk.magenta.bold(h)}\n${chalk.dim('='.repeat(40))}`);
|
|
81
|
+
rendered = rendered.replace(/^> (.+)$/gm, (_m, quote) => chalk.dim('│ ') + chalk.italic(quote));
|
|
82
|
+
rendered = rendered.replace(/^---+$/gm, chalk.dim('─'.repeat(40)));
|
|
83
|
+
rendered = rendered.replace(/^- /gm, chalk.dim(' • '));
|
|
84
|
+
rendered = rendered.replace(/^(\d+)\. /gm, (_m, num) => chalk.dim(` ${num}. `));
|
|
85
|
+
rendered = rendered.replace(/\*\*(.+?)\*\*/g, (_m, text) => chalk.bold(text));
|
|
86
|
+
rendered = rendered.replace(/\*(.+?)\*/g, (_m, text) => chalk.italic(text));
|
|
87
|
+
rendered = rendered.replace(/_(.+?)_/g, (_m, text) => chalk.italic(text));
|
|
88
|
+
rendered = rendered.replace(/`([^`]+)`/g, (_m, code) => chalk.cyan(code));
|
|
89
|
+
console.log(rendered.trimEnd());
|
|
90
|
+
}
|
|
91
|
+
function renderYaml(content) {
|
|
92
|
+
try {
|
|
93
|
+
console.log(highlight(content, { language: 'yaml', ignoreIllegals: true }));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
console.log(content);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function renderXml(content) {
|
|
100
|
+
try {
|
|
101
|
+
console.log(highlight(content, { language: 'xml', ignoreIllegals: true }));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
console.log(content);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function renderCode(content, lang) {
|
|
108
|
+
try {
|
|
109
|
+
console.log(highlight(content, { language: lang, ignoreIllegals: true }));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
console.log(content);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function formatDataWithHint(data, format) {
|
|
116
|
+
switch (format) {
|
|
117
|
+
case 'primitive':
|
|
118
|
+
renderPrimitive(data);
|
|
119
|
+
break;
|
|
120
|
+
case 'list':
|
|
121
|
+
renderList(Array.isArray(data) ? data : [data]);
|
|
122
|
+
break;
|
|
123
|
+
case 'table':
|
|
124
|
+
renderTable(data);
|
|
125
|
+
break;
|
|
126
|
+
case 'tree':
|
|
127
|
+
renderTree(data);
|
|
128
|
+
break;
|
|
129
|
+
case 'none':
|
|
130
|
+
renderNone();
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function detectFormat(data) {
|
|
135
|
+
if (data === null || data === undefined) {
|
|
136
|
+
return 'none';
|
|
137
|
+
}
|
|
138
|
+
if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean') {
|
|
139
|
+
return 'primitive';
|
|
140
|
+
}
|
|
141
|
+
if (Array.isArray(data)) {
|
|
142
|
+
if (data.length === 0) {
|
|
143
|
+
return 'list';
|
|
144
|
+
}
|
|
145
|
+
const firstItem = data[0];
|
|
146
|
+
if (typeof firstItem !== 'object' || firstItem === null) {
|
|
147
|
+
return 'list';
|
|
148
|
+
}
|
|
149
|
+
if (isFlatObject(firstItem)) {
|
|
150
|
+
return 'table';
|
|
151
|
+
}
|
|
152
|
+
return 'tree';
|
|
153
|
+
}
|
|
154
|
+
if (typeof data === 'object') {
|
|
155
|
+
if (isFlatObject(data)) {
|
|
156
|
+
return 'table';
|
|
157
|
+
}
|
|
158
|
+
return 'tree';
|
|
159
|
+
}
|
|
160
|
+
return 'none';
|
|
161
|
+
}
|
|
162
|
+
function isFlatObject(obj) {
|
|
163
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
return !Object.values(obj).some(value => typeof value === 'object' && value !== null);
|
|
167
|
+
}
|
|
168
|
+
export function renderPrimitive(value) {
|
|
169
|
+
if (typeof value === 'boolean') {
|
|
170
|
+
console.log(value ? 'yes' : 'no');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log(value);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
export function renderList(data) {
|
|
177
|
+
if (data.length === 0) {
|
|
178
|
+
console.log('(empty)');
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
data.forEach(item => console.log(` * ${item}`));
|
|
182
|
+
}
|
|
183
|
+
export function renderTable(data) {
|
|
184
|
+
if (!Array.isArray(data)) {
|
|
185
|
+
const entries = Object.entries(data).filter(([key]) => key !== 'returnValue');
|
|
186
|
+
if (entries.length === 0) {
|
|
187
|
+
console.log('(empty)');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const keyCells = entries.map(([key]) => formatKey(key));
|
|
191
|
+
const valueCells = entries.map(([, value]) => String(formatValue(value)));
|
|
192
|
+
const keyCol = Math.max(...keyCells.map(cell => visibleLength(cell)));
|
|
193
|
+
const valueCol = Math.max(...valueCells.map(cell => visibleLength(cell)));
|
|
194
|
+
const horizontal = (width) => '─'.repeat(width + 2);
|
|
195
|
+
console.log(`┌${horizontal(keyCol)}┬${horizontal(valueCol)}┐`);
|
|
196
|
+
entries.forEach((_entry, index) => {
|
|
197
|
+
const keyCell = padAnsi(keyCells[index], keyCol);
|
|
198
|
+
const valueCell = padAnsi(valueCells[index], valueCol);
|
|
199
|
+
console.log(`│ ${keyCell} │ ${valueCell} │`);
|
|
200
|
+
console.log(index < entries.length - 1 ? `├${horizontal(keyCol)}┼${horizontal(valueCol)}┤` : `└${horizontal(keyCol)}┴${horizontal(valueCol)}┘`);
|
|
201
|
+
});
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (data.length === 0) {
|
|
205
|
+
console.log('(empty)');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const keys = Array.from(new Set(data.flatMap(obj => Object.keys(obj)))).filter(key => key !== 'returnValue');
|
|
209
|
+
if (keys.length === 0) {
|
|
210
|
+
console.log('(no data)');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const columnWidths = new Map();
|
|
214
|
+
const headerCells = new Map();
|
|
215
|
+
keys.forEach(key => {
|
|
216
|
+
const header = formatKey(key);
|
|
217
|
+
headerCells.set(key, header);
|
|
218
|
+
const maxWidth = Math.max(visibleLength(header), ...data.map(obj => visibleLength(String(formatValue(obj[key] ?? '')))));
|
|
219
|
+
columnWidths.set(key, maxWidth);
|
|
220
|
+
});
|
|
221
|
+
const horizontal = (key) => '─'.repeat(columnWidths.get(key) + 2);
|
|
222
|
+
console.log('┌' + keys.map(horizontal).join('┬') + '┐');
|
|
223
|
+
console.log('│' +
|
|
224
|
+
keys
|
|
225
|
+
.map(key => ` ${padAnsi(headerCells.get(key), columnWidths.get(key))} `)
|
|
226
|
+
.join('│') +
|
|
227
|
+
'│');
|
|
228
|
+
console.log('├' + keys.map(horizontal).join('┼') + '┤');
|
|
229
|
+
data.forEach((obj, rowIndex) => {
|
|
230
|
+
console.log('│' +
|
|
231
|
+
keys
|
|
232
|
+
.map(key => {
|
|
233
|
+
const value = String(formatValue(obj[key] ?? ''));
|
|
234
|
+
return ` ${padAnsi(value, columnWidths.get(key))} `;
|
|
235
|
+
})
|
|
236
|
+
.join('│') +
|
|
237
|
+
'│');
|
|
238
|
+
if (rowIndex === data.length - 1) {
|
|
239
|
+
console.log('└' + keys.map(horizontal).join('┴') + '┘');
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
export function renderTree(data, indent = 0) {
|
|
244
|
+
const spacing = ' '.repeat(indent);
|
|
245
|
+
if (Array.isArray(data)) {
|
|
246
|
+
data.forEach(item => renderTree(item, indent));
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (typeof data === 'object' && data !== null) {
|
|
250
|
+
for (const [key, value] of Object.entries(data)) {
|
|
251
|
+
if (typeof value === 'object' && value !== null) {
|
|
252
|
+
console.log(`${spacing}${chalk.bold(formatKey(key))}:`);
|
|
253
|
+
renderTree(value, indent + 1);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
console.log(`${spacing}${chalk.bold(formatKey(key))}: ${formatValue(value)}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
console.log(`${spacing}${data}`);
|
|
262
|
+
}
|
|
263
|
+
export function renderNone() {
|
|
264
|
+
console.log('(empty)');
|
|
265
|
+
}
|
|
266
|
+
function humanizeKey(key) {
|
|
267
|
+
return key
|
|
268
|
+
.replace(/([A-Z])/g, ' $1')
|
|
269
|
+
.replace(/_/g, ' ')
|
|
270
|
+
.replace(/\b\w/g, char => char.toUpperCase())
|
|
271
|
+
.trim();
|
|
272
|
+
}
|
|
273
|
+
export function formatKey(key) {
|
|
274
|
+
return chalk.yellow(humanizeKey(key));
|
|
275
|
+
}
|
|
276
|
+
export function formatValue(value) {
|
|
277
|
+
if (typeof value === 'boolean') {
|
|
278
|
+
return value ? chalk.green('yes') : chalk.red('no');
|
|
279
|
+
}
|
|
280
|
+
if (value === null || value === undefined) {
|
|
281
|
+
return chalk.dim('nil');
|
|
282
|
+
}
|
|
283
|
+
return chalk.white(String(value));
|
|
284
|
+
}
|
|
285
|
+
function visibleLength(text) {
|
|
286
|
+
return text.replace(/\[[0-9;]*m/g, '').length;
|
|
287
|
+
}
|
|
288
|
+
function padAnsi(text, width) {
|
|
289
|
+
const len = visibleLength(text);
|
|
290
|
+
if (len >= width) {
|
|
291
|
+
return text;
|
|
292
|
+
}
|
|
293
|
+
return text + ' '.repeat(width - len);
|
|
294
|
+
}
|
|
295
|
+
export function formatToMimeType(format) {
|
|
296
|
+
switch (format) {
|
|
297
|
+
case 'json':
|
|
298
|
+
return 'application/json';
|
|
299
|
+
case 'markdown':
|
|
300
|
+
return 'text/markdown';
|
|
301
|
+
case 'yaml':
|
|
302
|
+
return 'text/yaml';
|
|
303
|
+
case 'xml':
|
|
304
|
+
case 'html':
|
|
305
|
+
return 'text/html';
|
|
306
|
+
case 'code':
|
|
307
|
+
default:
|
|
308
|
+
return 'text/plain';
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export function printSuccess(message) {
|
|
312
|
+
console.log(chalk.green('✅'), message);
|
|
313
|
+
}
|
|
314
|
+
export function printError(message) {
|
|
315
|
+
console.log(chalk.red('❌'), message);
|
|
316
|
+
}
|
|
317
|
+
export function printInfo(message) {
|
|
318
|
+
console.log(chalk.cyan('ℹ️'), message);
|
|
319
|
+
}
|
|
320
|
+
export function printWarning(message) {
|
|
321
|
+
console.log(chalk.yellow('⚠️'), message);
|
|
322
|
+
}
|
|
323
|
+
export function printHeader(message) {
|
|
324
|
+
console.log(chalk.bold(message));
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=cli-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-formatter.js","sourceRoot":"","sources":["../src/cli-formatter.ts"],"names":[],"mappings":"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"}
|