react-scanner-ui 0.0.14 → 0.0.16
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 +5 -6
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +105 -3
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +2 -1
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +9 -7
- package/dist/commands/start.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +11 -5
- package/dist/server/index.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +5 -3
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/dependencies.d.ts.map +1 -1
- package/dist/utils/dependencies.js +13 -11
- package/dist/utils/dependencies.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +104 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +269 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/port.d.ts.map +1 -1
- package/dist/utils/port.js +3 -2
- package/dist/utils/port.js.map +1 -1
- package/dist/utils/scannerConfig.d.ts.map +1 -1
- package/dist/utils/scannerConfig.js +5 -5
- package/dist/utils/scannerConfig.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
<img src="./logo.png" alt="React Scanner UI Logo" width="100" height="100">
|
|
3
|
-
|
|
4
|
-
# React Scanner UI
|
|
1
|
+
A dashboard generator that transforms 'react-scanner' output into a portable, interactive component usage insights dashboard.
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
<div display="flex" align-items="center" justify-content="center" flex-direction="column">
|
|
4
|
+
<img src="./logo.png" alt="React Scanner UI Logo" width="150" height="150">
|
|
5
|
+
<h1> React Scanner UI </h1>
|
|
7
6
|
</div>
|
|
8
|
-
|
|
7
|
+
|
|
9
8
|
[](https://badge.fury.io/js/react-scanner-ui)
|
|
10
9
|
[](https://github.com/vimalmunjani/react-scanner-ui/stargazers)
|
|
11
10
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUnD"}
|
package/dist/commands/build.js
CHANGED
|
@@ -1,11 +1,113 @@
|
|
|
1
|
+
import { resolve, dirname } from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
1
4
|
import { checkPeerDependency } from '../utils/dependencies.js';
|
|
5
|
+
import { getScanData } from '../utils/scannerConfig.js';
|
|
6
|
+
import { logger } from '../utils/index.js';
|
|
7
|
+
// ESM equivalent of __dirname
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
/**
|
|
11
|
+
* Get the path to the UI directory.
|
|
12
|
+
* Works both in development (src/) and production (dist/)
|
|
13
|
+
*/
|
|
14
|
+
function getUiRoot() {
|
|
15
|
+
// __dirname will be either src/commands or dist/commands
|
|
16
|
+
// UI is always at project-root/ui
|
|
17
|
+
const currentDir = __dirname;
|
|
18
|
+
// Go up from commands/ to src/ or dist/, then up to project root, then into ui/
|
|
19
|
+
return resolve(currentDir, '../../ui');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build the React Scanner UI and output to consumer's .react-scanner-ui/ folder
|
|
23
|
+
*/
|
|
24
|
+
async function runBuild() {
|
|
25
|
+
const consumerRoot = process.cwd();
|
|
26
|
+
const outputDir = resolve(consumerRoot, '.react-scanner-ui');
|
|
27
|
+
logger.infoBox('React Scanner UI', 'Building static files for production...');
|
|
28
|
+
// Step 1: Get the scan data
|
|
29
|
+
logger.startSpinner('Reading scan data...');
|
|
30
|
+
const scanResult = await getScanData();
|
|
31
|
+
if (scanResult.error) {
|
|
32
|
+
logger.spinnerError('Failed to read scan data');
|
|
33
|
+
logger.errorBox('Error', scanResult.error);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
if (!scanResult.data) {
|
|
37
|
+
logger.spinnerError('Failed to read scan data');
|
|
38
|
+
logger.errorBox('Error', 'No scan data found.');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
logger.spinnerSuccess('Scan data loaded');
|
|
42
|
+
// Step 2: Build the UI with Vite
|
|
43
|
+
logger.startSpinner('Building UI with Vite...');
|
|
44
|
+
const { build } = await import('vite');
|
|
45
|
+
const react = (await import('@vitejs/plugin-react')).default;
|
|
46
|
+
const uiRoot = getUiRoot();
|
|
47
|
+
// Create output directory if it doesn't exist
|
|
48
|
+
if (!existsSync(outputDir)) {
|
|
49
|
+
mkdirSync(outputDir, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await build({
|
|
53
|
+
root: uiRoot,
|
|
54
|
+
plugins: [react()],
|
|
55
|
+
base: './', // Use relative paths for assets
|
|
56
|
+
build: {
|
|
57
|
+
outDir: outputDir,
|
|
58
|
+
emptyOutDir: true,
|
|
59
|
+
},
|
|
60
|
+
resolve: {
|
|
61
|
+
alias: {
|
|
62
|
+
'@': resolve(uiRoot, 'src'),
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
logLevel: 'warn', // Reduce noise during build
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
logger.spinnerError('Vite build failed');
|
|
70
|
+
logger.errorBox('Build Error', String(error));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
logger.spinnerSuccess('UI built successfully');
|
|
74
|
+
// Step 3: Write the scan data as a JSON file
|
|
75
|
+
logger.startSpinner('Embedding scan data...');
|
|
76
|
+
const scanDataPath = resolve(outputDir, 'scan-data.json');
|
|
77
|
+
writeFileSync(scanDataPath, JSON.stringify({ data: scanResult.data, error: null }, null, 2));
|
|
78
|
+
// Step 4: Create a custom index.html that loads scan data from the JSON file
|
|
79
|
+
// We need to modify the built index.html to handle static data loading
|
|
80
|
+
const indexPath = resolve(outputDir, 'index.html');
|
|
81
|
+
const { readFileSync } = await import('fs');
|
|
82
|
+
let indexHtml = readFileSync(indexPath, 'utf-8');
|
|
83
|
+
// Inject a script that intercepts fetch calls to /api/scan-data
|
|
84
|
+
const injectScript = `
|
|
85
|
+
<script>
|
|
86
|
+
// Intercept fetch for static build
|
|
87
|
+
const originalFetch = window.fetch;
|
|
88
|
+
window.fetch = async function(url, options) {
|
|
89
|
+
if (url === '/api/scan-data' || url.endsWith('/api/scan-data')) {
|
|
90
|
+
const response = await originalFetch('./scan-data.json', options);
|
|
91
|
+
return response;
|
|
92
|
+
}
|
|
93
|
+
return originalFetch(url, options);
|
|
94
|
+
};
|
|
95
|
+
</script>
|
|
96
|
+
`;
|
|
97
|
+
// Inject the script before the closing </head> tag
|
|
98
|
+
indexHtml = indexHtml.replace('</head>', `${injectScript}</head>`);
|
|
99
|
+
writeFileSync(indexPath, indexHtml);
|
|
100
|
+
logger.spinnerSuccess('Scan data embedded');
|
|
101
|
+
// Display build complete message
|
|
102
|
+
logger.buildComplete(outputDir, [`npx serve ${outputDir}`]);
|
|
103
|
+
}
|
|
2
104
|
export function buildCommand(program) {
|
|
3
105
|
program
|
|
4
106
|
.command('build')
|
|
5
|
-
.description('
|
|
6
|
-
.action(() => {
|
|
107
|
+
.description('Build the React Scanner UI as static files to .react-scanner-ui/')
|
|
108
|
+
.action(async () => {
|
|
7
109
|
checkPeerDependency();
|
|
8
|
-
|
|
110
|
+
await runBuild();
|
|
9
111
|
});
|
|
10
112
|
}
|
|
11
113
|
//# sourceMappingURL=build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUlD"}
|
package/dist/commands/info.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { logger } from '../utils/index.js';
|
|
1
2
|
export function infoCommand(program) {
|
|
2
3
|
program
|
|
3
4
|
.command('info')
|
|
4
5
|
.description('Coming soon')
|
|
5
6
|
.action(() => {
|
|
6
|
-
|
|
7
|
+
logger.infoBox('Coming Soon', 'This feature is currently under development.\nStay tuned for updates!');
|
|
7
8
|
});
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,CAAC,OAAO,CACZ,aAAa,EACb,uEAAuE,CACxE,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2BlD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import { isReactScannerInstalled, promptInstallReactScanner, installReactScanner, createReactScannerConfig, } from '../utils/index.js';
|
|
1
|
+
import { isReactScannerInstalled, promptInstallReactScanner, installReactScanner, createReactScannerConfig, logger, } from '../utils/index.js';
|
|
2
2
|
export function initCommand(program) {
|
|
3
3
|
program
|
|
4
4
|
.command('init')
|
|
5
5
|
.description('Initialize react-scanner configuration')
|
|
6
6
|
.action(async () => {
|
|
7
|
+
logger.infoBox('React Scanner UI', 'Initializing your project...');
|
|
7
8
|
if (!isReactScannerInstalled()) {
|
|
8
9
|
const shouldInstall = await promptInstallReactScanner();
|
|
9
10
|
if (shouldInstall) {
|
|
10
11
|
installReactScanner();
|
|
11
12
|
}
|
|
12
13
|
else {
|
|
13
|
-
|
|
14
|
+
logger.errorBox('Installation Required', 'react-scanner is required to continue.\nPlease install it manually and try again.');
|
|
14
15
|
process.exit(1);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
createReactScannerConfig();
|
|
18
|
-
|
|
19
|
+
logger.successBox('Initialization Complete', 'Your project is now configured for React Scanner UI.\nRun ' +
|
|
20
|
+
logger.bold('react-scanner-ui start') +
|
|
21
|
+
' to begin.');
|
|
19
22
|
});
|
|
20
23
|
}
|
|
21
24
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EACxB,MAAM,GACP,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAC;QAEnE,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,MAAM,yBAAyB,EAAE,CAAC;YACxD,IAAI,aAAa,EAAE,CAAC;gBAClB,mBAAmB,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CACb,uBAAuB,EACvB,mFAAmF,CACpF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,wBAAwB,EAAE,CAAC;QAC3B,MAAM,CAAC,UAAU,CACf,yBAAyB,EACzB,4DAA4D;YAC1D,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;YACrC,YAAY,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqEnD"}
|
package/dist/commands/start.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createInterface } from 'readline';
|
|
|
2
2
|
import { checkPeerDependency } from '../utils/dependencies.js';
|
|
3
3
|
import { getServerPort } from '../utils/port.js';
|
|
4
4
|
import { startServer } from '../server/index.js';
|
|
5
|
+
import { logger } from '../utils/index.js';
|
|
5
6
|
const DEFAULT_PORT = 3000;
|
|
6
7
|
/**
|
|
7
8
|
* Prompt user to confirm using a different port (like Storybook does)
|
|
@@ -12,7 +13,8 @@ async function promptForPortChange(requestedPort, availablePort) {
|
|
|
12
13
|
output: process.stdout,
|
|
13
14
|
});
|
|
14
15
|
return new Promise(resolve => {
|
|
15
|
-
|
|
16
|
+
logger.warning(`Port ${logger.bold(String(requestedPort))} is not available.`);
|
|
17
|
+
rl.question(` Would you like to run on port ${logger.bold(String(availablePort))} instead? (Y/n): `, answer => {
|
|
16
18
|
rl.close();
|
|
17
19
|
const normalizedAnswer = answer.trim().toLowerCase();
|
|
18
20
|
// Default to yes if user just presses enter
|
|
@@ -42,12 +44,12 @@ async function openBrowser(url) {
|
|
|
42
44
|
}
|
|
43
45
|
exec(command, error => {
|
|
44
46
|
if (error) {
|
|
45
|
-
|
|
47
|
+
logger.info(`Could not open browser automatically. Please visit: ${logger.link(url)}`);
|
|
46
48
|
}
|
|
47
49
|
});
|
|
48
50
|
}
|
|
49
51
|
catch {
|
|
50
|
-
|
|
52
|
+
logger.info(`Could not open browser automatically. Please visit: ${logger.link(url)}`);
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
55
|
export function startCommand(program) {
|
|
@@ -62,7 +64,7 @@ export function startCommand(program) {
|
|
|
62
64
|
checkPeerDependency();
|
|
63
65
|
const requestedPort = parseInt(options.port, 10);
|
|
64
66
|
if (isNaN(requestedPort) || requestedPort < 1 || requestedPort > 65535) {
|
|
65
|
-
|
|
67
|
+
logger.errorBox('Invalid Port', 'Please specify a port between 1 and 65535.');
|
|
66
68
|
process.exit(1);
|
|
67
69
|
}
|
|
68
70
|
// Use detect-port to find an available port
|
|
@@ -75,13 +77,13 @@ export function startCommand(program) {
|
|
|
75
77
|
!options.exactPort) {
|
|
76
78
|
const shouldChangePort = await promptForPortChange(requestedPort, availablePort);
|
|
77
79
|
if (!shouldChangePort) {
|
|
78
|
-
|
|
80
|
+
logger.info('Exiting.');
|
|
79
81
|
process.exit(1);
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
else if (availablePort !== requestedPort && options.ci) {
|
|
83
85
|
// In CI mode, just log the port change
|
|
84
|
-
|
|
86
|
+
logger.warning(`Port ${logger.bold(String(requestedPort))} is not available. Using port ${logger.bold(String(availablePort))} instead.`);
|
|
85
87
|
}
|
|
86
88
|
try {
|
|
87
89
|
await startServer(availablePort);
|
|
@@ -92,7 +94,7 @@ export function startCommand(program) {
|
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
catch (error) {
|
|
95
|
-
|
|
97
|
+
logger.errorBox('Server Error', `Failed to start server: ${error}`);
|
|
96
98
|
process.exit(1);
|
|
97
99
|
}
|
|
98
100
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE7D"}
|
package/dist/server/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createServer as createHttpServer, } from 'http';
|
|
|
2
2
|
import { resolve, dirname } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import { getScanData } from '../utils/scannerConfig.js';
|
|
5
|
+
import { logger } from '../utils/index.js';
|
|
5
6
|
// ESM equivalent of __dirname
|
|
6
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
8
|
const __dirname = dirname(__filename);
|
|
@@ -21,6 +22,7 @@ function getUiRoot() {
|
|
|
21
22
|
* (similar approach to Storybook's builder-vite)
|
|
22
23
|
*/
|
|
23
24
|
export async function startServer(port) {
|
|
25
|
+
logger.startSpinner('Starting development server...');
|
|
24
26
|
// Dynamically import Vite to create dev server in middleware mode
|
|
25
27
|
const { createServer: createViteServer } = await import('vite');
|
|
26
28
|
const uiRoot = getUiRoot();
|
|
@@ -48,15 +50,17 @@ export async function startServer(port) {
|
|
|
48
50
|
});
|
|
49
51
|
// Handle server errors
|
|
50
52
|
server.on('error', (err) => {
|
|
51
|
-
|
|
53
|
+
logger.spinnerError('Server error');
|
|
54
|
+
logger.errorBox('Server Error', err.message);
|
|
52
55
|
vite.close();
|
|
53
56
|
process.exit(1);
|
|
54
57
|
});
|
|
55
58
|
// Handle graceful shutdown
|
|
56
59
|
const shutdown = async () => {
|
|
57
|
-
|
|
60
|
+
logger.info('Shutting down server...');
|
|
58
61
|
await vite.close();
|
|
59
62
|
server.close();
|
|
63
|
+
logger.success('Server stopped gracefully');
|
|
60
64
|
process.exit(0);
|
|
61
65
|
};
|
|
62
66
|
process.on('SIGINT', shutdown);
|
|
@@ -64,9 +68,11 @@ export async function startServer(port) {
|
|
|
64
68
|
return new Promise((resolvePromise, reject) => {
|
|
65
69
|
server.on('error', reject);
|
|
66
70
|
server.listen(port, '127.0.0.1', () => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
logger.spinnerSuccess('Server started');
|
|
72
|
+
logger.serverInfo(port, [
|
|
73
|
+
'Hot Module Replacement enabled',
|
|
74
|
+
'Press Ctrl+C to stop the server',
|
|
75
|
+
]);
|
|
70
76
|
resolvePromise();
|
|
71
77
|
});
|
|
72
78
|
});
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,IAAI,gBAAgB,GAGjC,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA,wBAAgB,wBAAwB,IAAI,IAAI,CA8B/C"}
|
package/dist/utils/config.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { writeFileSync, existsSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import * as logger from './logger.js';
|
|
3
4
|
export function createReactScannerConfig() {
|
|
4
5
|
const configPath = join(process.cwd(), 'react-scanner.config.js');
|
|
5
6
|
if (existsSync(configPath)) {
|
|
6
|
-
|
|
7
|
+
logger.info('react-scanner.config.js already exists.');
|
|
7
8
|
return;
|
|
8
9
|
}
|
|
9
10
|
const configContent = `module.exports = {
|
|
@@ -17,10 +18,11 @@ export function createReactScannerConfig() {
|
|
|
17
18
|
`;
|
|
18
19
|
try {
|
|
19
20
|
writeFileSync(configPath, configContent);
|
|
20
|
-
|
|
21
|
+
logger.success('Created react-scanner.config.js');
|
|
22
|
+
logger.info(`Tip: Add ${logger.bold('.react-scanner-ui/')} to your .gitignore file.`);
|
|
21
23
|
}
|
|
22
24
|
catch (error) {
|
|
23
|
-
|
|
25
|
+
logger.errorBox('Configuration Error', `Failed to create react-scanner.config.js\n${error}`);
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=config.js.map
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,wBAAwB;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAElE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG;;;;;;;;CAQvB,CAAC;IAEA,IAAI,CAAC;QACH,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CACT,YAAY,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CACzE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,CACb,qBAAqB,EACrB,6CAA6C,KAAK,EAAE,CACrD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":"AASA,wBAAgB,uBAAuB,IAAI,OAAO,CAOjD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAiBlE;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CA+B1C"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from 'fs';
|
|
|
2
2
|
import { execSync } from 'child_process';
|
|
3
3
|
import { createInterface } from 'readline';
|
|
4
4
|
import { createRequire } from 'module';
|
|
5
|
+
import * as logger from './logger.js';
|
|
5
6
|
// ESM equivalent of require.resolve
|
|
6
7
|
const require = createRequire(import.meta.url);
|
|
7
8
|
export function isReactScannerInstalled() {
|
|
@@ -15,11 +16,8 @@ export function isReactScannerInstalled() {
|
|
|
15
16
|
}
|
|
16
17
|
export function checkPeerDependency() {
|
|
17
18
|
if (!isReactScannerInstalled()) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
console.error(' npm install react-scanner');
|
|
21
|
-
console.error(' or');
|
|
22
|
-
console.error(' yarn add react-scanner');
|
|
19
|
+
logger.errorBox('Missing Dependency: "react-scanner"', 'react-scanner is not installed.\nThis package is required to analyze your React components.');
|
|
20
|
+
logger.installInstructions('react-scanner');
|
|
23
21
|
process.exit(1);
|
|
24
22
|
}
|
|
25
23
|
return true;
|
|
@@ -30,14 +28,17 @@ export async function promptInstallReactScanner() {
|
|
|
30
28
|
output: process.stdout,
|
|
31
29
|
});
|
|
32
30
|
return new Promise(resolve => {
|
|
33
|
-
|
|
31
|
+
logger.warning('react-scanner is required but not installed.');
|
|
32
|
+
rl.question(` Would you like to install it now? (Y/n): `, answer => {
|
|
34
33
|
rl.close();
|
|
35
|
-
resolve(answer.toLowerCase() === 'y' ||
|
|
34
|
+
resolve(answer.toLowerCase() === 'y' ||
|
|
35
|
+
answer.toLowerCase() === 'yes' ||
|
|
36
|
+
answer === '');
|
|
36
37
|
});
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
export function installReactScanner() {
|
|
40
|
-
|
|
41
|
+
logger.startSpinner('Installing react-scanner...');
|
|
41
42
|
try {
|
|
42
43
|
const useYarn = existsSync('yarn.lock');
|
|
43
44
|
let isWorkspace = false;
|
|
@@ -55,11 +56,12 @@ export function installReactScanner() {
|
|
|
55
56
|
else {
|
|
56
57
|
command = 'npm install react-scanner --save-dev';
|
|
57
58
|
}
|
|
58
|
-
execSync(command, { stdio: '
|
|
59
|
-
|
|
59
|
+
execSync(command, { stdio: 'pipe' });
|
|
60
|
+
logger.spinnerSuccess('react-scanner installed successfully!');
|
|
60
61
|
}
|
|
61
62
|
catch {
|
|
62
|
-
|
|
63
|
+
logger.spinnerError('Failed to install react-scanner');
|
|
64
|
+
logger.errorBox('Installation Failed', 'Could not install react-scanner automatically.\nPlease install it manually and try again.');
|
|
63
65
|
process.exit(1);
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { createReactScannerConfig } from './config.js';
|
|
|
3
3
|
export { getServerPort, isPortAvailable } from './port.js';
|
|
4
4
|
export type { PortOptions } from './port.js';
|
|
5
5
|
export { readScannerConfig, readScanData, getScanData, } from './scannerConfig.js';
|
|
6
|
+
export * as logger from './logger.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -2,4 +2,5 @@ export { isReactScannerInstalled, checkPeerDependency, promptInstallReactScanner
|
|
|
2
2
|
export { createReactScannerConfig } from './config.js';
|
|
3
3
|
export { getServerPort, isPortAvailable } from './port.js';
|
|
4
4
|
export { readScannerConfig, readScanData, getScanData, } from './scannerConfig.js';
|
|
5
|
+
export * as logger from './logger.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { type Ora } from 'ora';
|
|
3
|
+
/**
|
|
4
|
+
* Display a styled info box
|
|
5
|
+
*/
|
|
6
|
+
export declare function infoBox(title: string, content?: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Display a styled success box
|
|
9
|
+
*/
|
|
10
|
+
export declare function successBox(title: string, content?: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Display a styled error box
|
|
13
|
+
*/
|
|
14
|
+
export declare function errorBox(title: string, content?: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Display a styled warning box
|
|
17
|
+
*/
|
|
18
|
+
export declare function warningBox(title: string, content?: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Log a success message with a checkmark
|
|
21
|
+
*/
|
|
22
|
+
export declare function success(message: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Log an error message with an X
|
|
25
|
+
*/
|
|
26
|
+
export declare function error(message: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Log a warning message
|
|
29
|
+
*/
|
|
30
|
+
export declare function warning(message: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Log an info message
|
|
33
|
+
*/
|
|
34
|
+
export declare function info(message: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Log a step/bullet point
|
|
37
|
+
*/
|
|
38
|
+
export declare function step(message: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Log a highlighted message
|
|
41
|
+
*/
|
|
42
|
+
export declare function highlight(message: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Log a dimmed/subtle message
|
|
45
|
+
*/
|
|
46
|
+
export declare function dim(message: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Log a URL or link
|
|
49
|
+
*/
|
|
50
|
+
export declare function link(url: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Format text as bold
|
|
53
|
+
*/
|
|
54
|
+
export declare function bold(text: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Start a spinner with a message
|
|
57
|
+
*/
|
|
58
|
+
export declare function startSpinner(message: string): Ora;
|
|
59
|
+
/**
|
|
60
|
+
* Update the spinner text
|
|
61
|
+
*/
|
|
62
|
+
export declare function updateSpinner(message: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Stop the spinner with a success message
|
|
65
|
+
*/
|
|
66
|
+
export declare function spinnerSuccess(message: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Stop the spinner with an error message
|
|
69
|
+
*/
|
|
70
|
+
export declare function spinnerError(message: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Stop the spinner with a warning message
|
|
73
|
+
*/
|
|
74
|
+
export declare function spinnerWarning(message: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Stop the spinner with an info message
|
|
77
|
+
*/
|
|
78
|
+
export declare function spinnerInfo(message: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* Stop the spinner without a message
|
|
81
|
+
*/
|
|
82
|
+
export declare function stopSpinner(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Display the welcome/banner box for the CLI
|
|
85
|
+
*/
|
|
86
|
+
export declare function banner(name: string, version?: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Display server running information
|
|
89
|
+
*/
|
|
90
|
+
export declare function serverInfo(port: number, features?: string[]): void;
|
|
91
|
+
/**
|
|
92
|
+
* Display build complete information
|
|
93
|
+
*/
|
|
94
|
+
export declare function buildComplete(outputDir: string, commands?: string[]): void;
|
|
95
|
+
/**
|
|
96
|
+
* Display an error with details
|
|
97
|
+
*/
|
|
98
|
+
export declare function errorWithDetails(title: string, details: string[]): void;
|
|
99
|
+
/**
|
|
100
|
+
* Display installation instructions
|
|
101
|
+
*/
|
|
102
|
+
export declare function installInstructions(packageName: string): void;
|
|
103
|
+
export { pc };
|
|
104
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AASpC;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAY7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAYhE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAY9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAYhE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CASjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAInD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAW3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,IAAI,CAkBtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAM,EAAO,GACtB,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAUvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAiB7D;AAGD,OAAO,EAAE,EAAE,EAAE,CAAC"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
/**
|
|
5
|
+
* Beautiful logger utility using boxen, picocolors, and ora
|
|
6
|
+
*/
|
|
7
|
+
// Spinner instance for loading states
|
|
8
|
+
let currentSpinner = null;
|
|
9
|
+
/**
|
|
10
|
+
* Display a styled info box
|
|
11
|
+
*/
|
|
12
|
+
export function infoBox(title, content) {
|
|
13
|
+
const message = content
|
|
14
|
+
? `${pc.bold(pc.cyan(title))}\n\n${content}`
|
|
15
|
+
: pc.bold(pc.cyan(title));
|
|
16
|
+
console.log(boxen(message, {
|
|
17
|
+
padding: 1,
|
|
18
|
+
margin: 1,
|
|
19
|
+
borderStyle: 'round',
|
|
20
|
+
borderColor: 'cyan',
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Display a styled success box
|
|
25
|
+
*/
|
|
26
|
+
export function successBox(title, content) {
|
|
27
|
+
const message = content
|
|
28
|
+
? `${pc.bold(pc.green(title))}\n\n${content}`
|
|
29
|
+
: pc.bold(pc.green(title));
|
|
30
|
+
console.log(boxen(message, {
|
|
31
|
+
padding: 1,
|
|
32
|
+
margin: 1,
|
|
33
|
+
borderStyle: 'round',
|
|
34
|
+
borderColor: 'green',
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Display a styled error box
|
|
39
|
+
*/
|
|
40
|
+
export function errorBox(title, content) {
|
|
41
|
+
const message = content
|
|
42
|
+
? `${pc.bold(pc.red(title))}\n\n${content}`
|
|
43
|
+
: pc.bold(pc.red(title));
|
|
44
|
+
console.log(boxen(message, {
|
|
45
|
+
padding: 1,
|
|
46
|
+
margin: 1,
|
|
47
|
+
borderStyle: 'round',
|
|
48
|
+
borderColor: 'red',
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Display a styled warning box
|
|
53
|
+
*/
|
|
54
|
+
export function warningBox(title, content) {
|
|
55
|
+
const message = content
|
|
56
|
+
? `${pc.bold(pc.yellow(title))}\n\n${content}`
|
|
57
|
+
: pc.bold(pc.yellow(title));
|
|
58
|
+
console.log(boxen(message, {
|
|
59
|
+
padding: 1,
|
|
60
|
+
margin: 1,
|
|
61
|
+
borderStyle: 'round',
|
|
62
|
+
borderColor: 'yellow',
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Log a success message with a checkmark
|
|
67
|
+
*/
|
|
68
|
+
export function success(message) {
|
|
69
|
+
console.log(`${pc.green('✔')} ${pc.green(message)}`);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Log an error message with an X
|
|
73
|
+
*/
|
|
74
|
+
export function error(message) {
|
|
75
|
+
console.log(`${pc.red('✖')} ${pc.red(message)}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Log a warning message
|
|
79
|
+
*/
|
|
80
|
+
export function warning(message) {
|
|
81
|
+
console.log(`${pc.yellow('⚠')} ${pc.yellow(message)}`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Log an info message
|
|
85
|
+
*/
|
|
86
|
+
export function info(message) {
|
|
87
|
+
console.log(`${pc.cyan('ℹ')} ${pc.cyan(message)}`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Log a step/bullet point
|
|
91
|
+
*/
|
|
92
|
+
export function step(message) {
|
|
93
|
+
console.log(` ${pc.dim('➜')} ${message}`);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Log a highlighted message
|
|
97
|
+
*/
|
|
98
|
+
export function highlight(message) {
|
|
99
|
+
console.log(pc.bold(pc.magenta(message)));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Log a dimmed/subtle message
|
|
103
|
+
*/
|
|
104
|
+
export function dim(message) {
|
|
105
|
+
console.log(pc.dim(message));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Log a URL or link
|
|
109
|
+
*/
|
|
110
|
+
export function link(url) {
|
|
111
|
+
return pc.underline(pc.cyan(url));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Format text as bold
|
|
115
|
+
*/
|
|
116
|
+
export function bold(text) {
|
|
117
|
+
return pc.bold(text);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Start a spinner with a message
|
|
121
|
+
*/
|
|
122
|
+
export function startSpinner(message) {
|
|
123
|
+
if (currentSpinner) {
|
|
124
|
+
currentSpinner.stop();
|
|
125
|
+
}
|
|
126
|
+
currentSpinner = ora({
|
|
127
|
+
text: message,
|
|
128
|
+
color: 'cyan',
|
|
129
|
+
}).start();
|
|
130
|
+
return currentSpinner;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Update the spinner text
|
|
134
|
+
*/
|
|
135
|
+
export function updateSpinner(message) {
|
|
136
|
+
if (currentSpinner) {
|
|
137
|
+
currentSpinner.text = message;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Stop the spinner with a success message
|
|
142
|
+
*/
|
|
143
|
+
export function spinnerSuccess(message) {
|
|
144
|
+
if (currentSpinner) {
|
|
145
|
+
currentSpinner.succeed(pc.green(message));
|
|
146
|
+
currentSpinner = null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Stop the spinner with an error message
|
|
151
|
+
*/
|
|
152
|
+
export function spinnerError(message) {
|
|
153
|
+
if (currentSpinner) {
|
|
154
|
+
currentSpinner.fail(pc.red(message));
|
|
155
|
+
currentSpinner = null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Stop the spinner with a warning message
|
|
160
|
+
*/
|
|
161
|
+
export function spinnerWarning(message) {
|
|
162
|
+
if (currentSpinner) {
|
|
163
|
+
currentSpinner.warn(pc.yellow(message));
|
|
164
|
+
currentSpinner = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Stop the spinner with an info message
|
|
169
|
+
*/
|
|
170
|
+
export function spinnerInfo(message) {
|
|
171
|
+
if (currentSpinner) {
|
|
172
|
+
currentSpinner.info(pc.cyan(message));
|
|
173
|
+
currentSpinner = null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Stop the spinner without a message
|
|
178
|
+
*/
|
|
179
|
+
export function stopSpinner() {
|
|
180
|
+
if (currentSpinner) {
|
|
181
|
+
currentSpinner.stop();
|
|
182
|
+
currentSpinner = null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Display the welcome/banner box for the CLI
|
|
187
|
+
*/
|
|
188
|
+
export function banner(name, version) {
|
|
189
|
+
const versionText = version ? pc.dim(`v${version}`) : '';
|
|
190
|
+
const title = `${pc.bold(pc.cyan(name))} ${versionText}`;
|
|
191
|
+
console.log(boxen(title, {
|
|
192
|
+
padding: 1,
|
|
193
|
+
margin: 1,
|
|
194
|
+
borderStyle: 'double',
|
|
195
|
+
borderColor: 'cyan',
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Display server running information
|
|
200
|
+
*/
|
|
201
|
+
export function serverInfo(port, features = []) {
|
|
202
|
+
const url = `http://localhost:${port}`;
|
|
203
|
+
let content = `${pc.bold('Local:')} ${link(url)}`;
|
|
204
|
+
if (features.length > 0) {
|
|
205
|
+
content += '\n\n' + features.map(f => `${pc.dim('➜')} ${f}`).join('\n');
|
|
206
|
+
}
|
|
207
|
+
console.log(boxen(content, {
|
|
208
|
+
padding: 1,
|
|
209
|
+
margin: 1,
|
|
210
|
+
borderStyle: 'round',
|
|
211
|
+
borderColor: 'green',
|
|
212
|
+
title: pc.bold(pc.green('🚀 Server Running')),
|
|
213
|
+
titleAlignment: 'center',
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Display build complete information
|
|
218
|
+
*/
|
|
219
|
+
export function buildComplete(outputDir, commands = []) {
|
|
220
|
+
let content = `${pc.bold('Output:')} ${pc.cyan(outputDir)}`;
|
|
221
|
+
if (commands.length > 0) {
|
|
222
|
+
content +=
|
|
223
|
+
'\n\n' +
|
|
224
|
+
pc.dim('Serve with:') +
|
|
225
|
+
'\n' +
|
|
226
|
+
commands.map(c => ` ${pc.cyan(c)}`).join('\n');
|
|
227
|
+
}
|
|
228
|
+
console.log(boxen(content, {
|
|
229
|
+
padding: 1,
|
|
230
|
+
margin: 1,
|
|
231
|
+
borderStyle: 'round',
|
|
232
|
+
borderColor: 'green',
|
|
233
|
+
title: pc.bold(pc.green('✔ Build Complete')),
|
|
234
|
+
titleAlignment: 'center',
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Display an error with details
|
|
239
|
+
*/
|
|
240
|
+
export function errorWithDetails(title, details) {
|
|
241
|
+
const content = details.map(d => `${pc.dim('•')} ${d}`).join('\n');
|
|
242
|
+
console.log(boxen(`${pc.bold(pc.red(title))}\n\n${content}`, {
|
|
243
|
+
padding: 1,
|
|
244
|
+
margin: 1,
|
|
245
|
+
borderStyle: 'round',
|
|
246
|
+
borderColor: 'red',
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Display installation instructions
|
|
251
|
+
*/
|
|
252
|
+
export function installInstructions(packageName) {
|
|
253
|
+
const content = [
|
|
254
|
+
`${pc.bold('npm:')} npm install ${packageName}`,
|
|
255
|
+
`${pc.bold('yarn:')} yarn add ${packageName}`,
|
|
256
|
+
`${pc.bold('pnpm:')} pnpm add ${packageName}`,
|
|
257
|
+
].join('\n');
|
|
258
|
+
console.log(boxen(content, {
|
|
259
|
+
padding: 1,
|
|
260
|
+
margin: 1,
|
|
261
|
+
borderStyle: 'round',
|
|
262
|
+
borderColor: 'yellow',
|
|
263
|
+
title: pc.bold(pc.yellow('📦 Install Required')),
|
|
264
|
+
titleAlignment: 'center',
|
|
265
|
+
}));
|
|
266
|
+
}
|
|
267
|
+
// Export picocolors for direct use if needed
|
|
268
|
+
export { pc };
|
|
269
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/port.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,GAAE,MAAa,EACnB,EAAE,SAAS,EAAE,GAAE,WAAgB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE"}
|
package/dist/utils/port.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import detectPort from 'detect-port';
|
|
2
|
+
import * as logger from './logger.js';
|
|
2
3
|
/**
|
|
3
4
|
* Get an available server port using detect-port (same approach as Storybook)
|
|
4
5
|
* If the requested port is busy, it will find the next available port
|
|
@@ -8,13 +9,13 @@ export async function getServerPort(port = 3000, { exactPort } = {}) {
|
|
|
8
9
|
try {
|
|
9
10
|
const freePort = await detectPort(port);
|
|
10
11
|
if (freePort !== port && exactPort) {
|
|
11
|
-
|
|
12
|
+
logger.errorBox('Port Unavailable', `Port ${logger.bold(String(port))} is not available.\nUse a different port or remove the --exact-port flag.`);
|
|
12
13
|
process.exit(1);
|
|
13
14
|
}
|
|
14
15
|
return freePort;
|
|
15
16
|
}
|
|
16
17
|
catch (error) {
|
|
17
|
-
|
|
18
|
+
logger.errorBox('Port Detection Error', `Failed to detect available port: ${error}`);
|
|
18
19
|
process.exit(1);
|
|
19
20
|
}
|
|
20
21
|
}
|
package/dist/utils/port.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAMtC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,IAAI,EACnB,EAAE,SAAS,KAAkB,EAAE;IAE/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,QAAQ,KAAK,IAAI,IAAI,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,QAAQ,CACb,kBAAkB,EAClB,QAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,2EAA2E,CAC7G,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,CACb,sBAAsB,EACtB,oCAAoC,KAAK,EAAE,CAC5C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,QAAQ,KAAK,IAAI,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scannerConfig.d.ts","sourceRoot":"","sources":["../../src/utils/scannerConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scannerConfig.d.ts","sourceRoot":"","sources":["../../src/utils/scannerConfig.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,aAAa,EAAE,MAAM,GAAG;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsBvE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAgBlE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAkB9D;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAC3C,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC,CAqBD"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'fs';
|
|
2
2
|
import { join, resolve } from 'path';
|
|
3
|
+
import * as logger from './logger.js';
|
|
3
4
|
/**
|
|
4
5
|
* Read and parse the react-scanner.config.js file
|
|
5
6
|
*/
|
|
6
7
|
export async function readScannerConfig() {
|
|
7
8
|
const configPath = join(process.cwd(), 'react-scanner.config.js');
|
|
8
9
|
if (!existsSync(configPath)) {
|
|
9
|
-
|
|
10
|
+
logger.errorBox('Configuration Not Found', `${logger.bold('react-scanner.config.js')} not found.\nRun ${logger.bold('react-scanner-ui init')} first to create the configuration.`);
|
|
10
11
|
return null;
|
|
11
12
|
}
|
|
12
13
|
try {
|
|
@@ -15,7 +16,7 @@ export async function readScannerConfig() {
|
|
|
15
16
|
return config.default || config;
|
|
16
17
|
}
|
|
17
18
|
catch (error) {
|
|
18
|
-
|
|
19
|
+
logger.errorBox('Configuration Error', `Failed to read react-scanner.config.js\n${error}`);
|
|
19
20
|
return null;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
@@ -41,8 +42,7 @@ export function getOutputFile(config) {
|
|
|
41
42
|
export function readScanData(filePath) {
|
|
42
43
|
const absolutePath = resolve(process.cwd(), filePath);
|
|
43
44
|
if (!existsSync(absolutePath)) {
|
|
44
|
-
|
|
45
|
-
console.error('Run react-scanner first to generate scan data.');
|
|
45
|
+
logger.errorBox('Scan Data Not Found', `Scan data file not found: ${logger.bold(absolutePath)}\n\nRun ${logger.bold('npx react-scanner')} first to generate the scan data.`);
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
48
48
|
try {
|
|
@@ -50,7 +50,7 @@ export function readScanData(filePath) {
|
|
|
50
50
|
return JSON.parse(content);
|
|
51
51
|
}
|
|
52
52
|
catch (error) {
|
|
53
|
-
|
|
53
|
+
logger.errorBox('Parse Error', `Failed to read scan data: ${error}`);
|
|
54
54
|
return null;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scannerConfig.js","sourceRoot":"","sources":["../../src/utils/scannerConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"scannerConfig.js","sourceRoot":"","sources":["../../src/utils/scannerConfig.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-scanner-ui",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.16",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"react-scanner-ui": "dist/index.js"
|
|
@@ -36,8 +36,11 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@vitejs/plugin-react": "^4.3.4",
|
|
39
|
+
"boxen": "^8.0.1",
|
|
39
40
|
"commander": "^14.0.2",
|
|
40
41
|
"detect-port": "^1.6.1",
|
|
42
|
+
"ora": "^9.0.0",
|
|
43
|
+
"picocolors": "^1.1.1",
|
|
41
44
|
"react": "^18.3.1",
|
|
42
45
|
"react-dom": "^18.3.1",
|
|
43
46
|
"vite": "^5.4.19"
|