react-scanner-ui 0.0.15 ā 0.0.17
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 +25 -17
- 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 +26 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +14 -20
- 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 +9 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +76 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/dependencies.d.ts +1 -1
- package/dist/utils/dependencies.d.ts.map +1 -1
- package/dist/utils/dependencies.js +67 -38
- package/dist/utils/dependencies.js.map +1 -1
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +111 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +276 -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 +1 -0
- package/dist/utils/scannerConfig.d.ts.map +1 -1
- package/dist/utils/scannerConfig.js +22 -6
- package/dist/utils/scannerConfig.js.map +1 -1
- package/package.json +5 -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;AAyIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUnD"}
|
package/dist/commands/build.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { resolve, dirname } from 'path';
|
|
1
|
+
import { resolve, dirname, basename } from 'path';
|
|
2
2
|
import { fileURLToPath } from 'url';
|
|
3
3
|
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
4
4
|
import { checkPeerDependency } from '../utils/dependencies.js';
|
|
5
|
-
import { getScanData } from '../utils/scannerConfig.js';
|
|
5
|
+
import { getScanData, readScannerConfig, getOutputFile, } from '../utils/scannerConfig.js';
|
|
6
|
+
import { logger } from '../utils/index.js';
|
|
6
7
|
// ESM equivalent of __dirname
|
|
7
8
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
9
|
const __dirname = dirname(__filename);
|
|
@@ -23,20 +24,23 @@ function getUiRoot() {
|
|
|
23
24
|
async function runBuild() {
|
|
24
25
|
const consumerRoot = process.cwd();
|
|
25
26
|
const outputDir = resolve(consumerRoot, '.react-scanner-ui');
|
|
26
|
-
|
|
27
|
+
logger.infoBox('React Scanner UI', 'Building static files for production...');
|
|
27
28
|
// Step 1: Get the scan data
|
|
28
|
-
|
|
29
|
+
logger.startSpinner('Reading scan data...');
|
|
29
30
|
const scanResult = await getScanData();
|
|
30
31
|
if (scanResult.error) {
|
|
31
|
-
|
|
32
|
+
logger.spinnerError('Failed to read scan data');
|
|
33
|
+
logger.errorBox('Error', scanResult.error);
|
|
32
34
|
process.exit(1);
|
|
33
35
|
}
|
|
34
36
|
if (!scanResult.data) {
|
|
35
|
-
|
|
37
|
+
logger.spinnerError('Failed to read scan data');
|
|
38
|
+
logger.errorBox('Error', 'No scan data found.');
|
|
36
39
|
process.exit(1);
|
|
37
40
|
}
|
|
41
|
+
logger.spinnerSuccess('Scan data loaded');
|
|
38
42
|
// Step 2: Build the UI with Vite
|
|
39
|
-
|
|
43
|
+
logger.startSpinner('Building UI with Vite...');
|
|
40
44
|
const { build } = await import('vite');
|
|
41
45
|
const react = (await import('@vitejs/plugin-react')).default;
|
|
42
46
|
const uiRoot = getUiRoot();
|
|
@@ -44,6 +48,10 @@ async function runBuild() {
|
|
|
44
48
|
if (!existsSync(outputDir)) {
|
|
45
49
|
mkdirSync(outputDir, { recursive: true });
|
|
46
50
|
}
|
|
51
|
+
// Get the scan data file name from config
|
|
52
|
+
const config = await readScannerConfig();
|
|
53
|
+
const scanFile = config ? getOutputFile(config) : null;
|
|
54
|
+
const scanFileName = scanFile ? basename(scanFile) : 'scan-data.json';
|
|
47
55
|
try {
|
|
48
56
|
await build({
|
|
49
57
|
root: uiRoot,
|
|
@@ -62,12 +70,14 @@ async function runBuild() {
|
|
|
62
70
|
});
|
|
63
71
|
}
|
|
64
72
|
catch (error) {
|
|
65
|
-
|
|
73
|
+
logger.spinnerError('Vite build failed');
|
|
74
|
+
logger.errorBox('Build Error', String(error));
|
|
66
75
|
process.exit(1);
|
|
67
76
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
logger.spinnerSuccess('UI built successfully');
|
|
78
|
+
// Step 3: Write the scan data as a JSON file (using same filename from config)
|
|
79
|
+
logger.startSpinner('Embedding scan data...');
|
|
80
|
+
const scanDataPath = resolve(outputDir, scanFileName);
|
|
71
81
|
writeFileSync(scanDataPath, JSON.stringify({ data: scanResult.data, error: null }, null, 2));
|
|
72
82
|
// Step 4: Create a custom index.html that loads scan data from the JSON file
|
|
73
83
|
// We need to modify the built index.html to handle static data loading
|
|
@@ -81,7 +91,7 @@ async function runBuild() {
|
|
|
81
91
|
const originalFetch = window.fetch;
|
|
82
92
|
window.fetch = async function(url, options) {
|
|
83
93
|
if (url === '/api/scan-data' || url.endsWith('/api/scan-data')) {
|
|
84
|
-
const response = await originalFetch('
|
|
94
|
+
const response = await originalFetch('./${scanFileName}', options);
|
|
85
95
|
return response;
|
|
86
96
|
}
|
|
87
97
|
return originalFetch(url, options);
|
|
@@ -91,11 +101,9 @@ async function runBuild() {
|
|
|
91
101
|
// Inject the script before the closing </head> tag
|
|
92
102
|
indexHtml = indexHtml.replace('</head>', `${injectScript}</head>`);
|
|
93
103
|
writeFileSync(indexPath, indexHtml);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
console.log(` ā python -m http.server -d ${outputDir}`);
|
|
98
|
-
console.log('');
|
|
104
|
+
logger.spinnerSuccess('Scan data embedded');
|
|
105
|
+
// Display build complete message
|
|
106
|
+
logger.buildComplete(outputDir, [`npx serve ${outputDir}`]);
|
|
99
107
|
}
|
|
100
108
|
export function buildCommand(program) {
|
|
101
109
|
program
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,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;AAYpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2DlD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,21 +1,42 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { input } from '@inquirer/prompts';
|
|
2
|
+
import { isReactScannerInstalled, promptInstallReactScanner, installReactScanner, createReactScannerConfig, updateIgnoreFiles, logger, inquirerTheme, } from '../utils/index.js';
|
|
2
3
|
export function initCommand(program) {
|
|
3
4
|
program
|
|
4
5
|
.command('init')
|
|
5
6
|
.description('Initialize react-scanner configuration')
|
|
6
7
|
.action(async () => {
|
|
8
|
+
logger.infoBox('Welcome to React Scanner UI', 'Initializing your project...');
|
|
7
9
|
if (!isReactScannerInstalled()) {
|
|
8
10
|
const shouldInstall = await promptInstallReactScanner();
|
|
9
11
|
if (shouldInstall) {
|
|
10
|
-
installReactScanner();
|
|
12
|
+
await installReactScanner();
|
|
11
13
|
}
|
|
12
14
|
else {
|
|
13
|
-
|
|
15
|
+
logger.errorBox('Installation Required', 'react-scanner is required to continue.\nPlease install it manually and try again.');
|
|
14
16
|
process.exit(1);
|
|
15
17
|
}
|
|
16
18
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
// Prompt for crawlFrom
|
|
20
|
+
logger.info(`${logger.bgHighlight('crawlFrom')} The directory where react-scanner will start crawling for React components.`);
|
|
21
|
+
logger.dim('This is typically your source folder (e.g., ./src, ./app).');
|
|
22
|
+
const crawlFrom = await input({
|
|
23
|
+
message: 'Enter the path to crawl from:',
|
|
24
|
+
default: './src',
|
|
25
|
+
theme: inquirerTheme,
|
|
26
|
+
});
|
|
27
|
+
// Prompt for importedFrom
|
|
28
|
+
logger.info(`${logger.bgHighlight('importedFrom')} The package or path that components are imported from.`);
|
|
29
|
+
logger.dim('This filters which components to track (e.g., @mui/material, @chakra-ui/react, ./components).');
|
|
30
|
+
const importedFrom = await input({
|
|
31
|
+
message: 'Enter the import source to track:',
|
|
32
|
+
default: '@mui/material',
|
|
33
|
+
theme: inquirerTheme,
|
|
34
|
+
});
|
|
35
|
+
createReactScannerConfig({ crawlFrom, importedFrom });
|
|
36
|
+
updateIgnoreFiles();
|
|
37
|
+
logger.successBox('Initialization Complete', 'Your project is now configured for React Scanner UI.\nRun ' +
|
|
38
|
+
logger.bold('react-scanner-ui start') +
|
|
39
|
+
' to begin.');
|
|
19
40
|
});
|
|
20
41
|
}
|
|
21
42
|
//# 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,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,MAAM,EACN,aAAa,GACd,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,CACZ,6BAA6B,EAC7B,8BAA8B,CAC/B,CAAC;QAEF,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,MAAM,yBAAyB,EAAE,CAAC;YACxD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,mBAAmB,EAAE,CAAC;YAC9B,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;QAED,uBAAuB;QACvB,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,8EAA8E,CACjH,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAEzE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;YAC5B,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,aAAa;SACrB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,yDAAyD,CAC/F,CAAC;QACF,MAAM,CAAC,GAAG,CACR,+FAA+F,CAChG,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC;YAC/B,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,aAAa;SACrB,CAAC,CAAC;QAEH,wBAAwB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACtD,iBAAiB,EAAE,CAAC;QAEpB,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;AA8DpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqEnD"}
|
package/dist/commands/start.js
CHANGED
|
@@ -1,26 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { confirm } from '@inquirer/prompts';
|
|
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, inquirerTheme } 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)
|
|
8
9
|
*/
|
|
9
10
|
async function promptForPortChange(requestedPort, availablePort) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
rl.question(`Port ${requestedPort} is not available. Would you like to run on port ${availablePort} instead? (Y/n): `, answer => {
|
|
16
|
-
rl.close();
|
|
17
|
-
const normalizedAnswer = answer.trim().toLowerCase();
|
|
18
|
-
// Default to yes if user just presses enter
|
|
19
|
-
resolve(normalizedAnswer === '' ||
|
|
20
|
-
normalizedAnswer === 'y' ||
|
|
21
|
-
normalizedAnswer === 'yes');
|
|
22
|
-
});
|
|
11
|
+
logger.warning(`Port ${logger.bold(String(requestedPort))} is not available.`);
|
|
12
|
+
const shouldChangePort = await confirm({
|
|
13
|
+
message: `Would you like to run on port ${availablePort} instead?`,
|
|
14
|
+
default: true,
|
|
15
|
+
theme: inquirerTheme,
|
|
23
16
|
});
|
|
17
|
+
return shouldChangePort;
|
|
24
18
|
}
|
|
25
19
|
/**
|
|
26
20
|
* Open the browser to the given URL
|
|
@@ -42,12 +36,12 @@ async function openBrowser(url) {
|
|
|
42
36
|
}
|
|
43
37
|
exec(command, error => {
|
|
44
38
|
if (error) {
|
|
45
|
-
|
|
39
|
+
logger.info(`Could not open browser automatically. Please visit: ${logger.link(url)}`);
|
|
46
40
|
}
|
|
47
41
|
});
|
|
48
42
|
}
|
|
49
43
|
catch {
|
|
50
|
-
|
|
44
|
+
logger.info(`Could not open browser automatically. Please visit: ${logger.link(url)}`);
|
|
51
45
|
}
|
|
52
46
|
}
|
|
53
47
|
export function startCommand(program) {
|
|
@@ -62,7 +56,7 @@ export function startCommand(program) {
|
|
|
62
56
|
checkPeerDependency();
|
|
63
57
|
const requestedPort = parseInt(options.port, 10);
|
|
64
58
|
if (isNaN(requestedPort) || requestedPort < 1 || requestedPort > 65535) {
|
|
65
|
-
|
|
59
|
+
logger.errorBox('Invalid Port', 'Please specify a port between 1 and 65535.');
|
|
66
60
|
process.exit(1);
|
|
67
61
|
}
|
|
68
62
|
// Use detect-port to find an available port
|
|
@@ -75,13 +69,13 @@ export function startCommand(program) {
|
|
|
75
69
|
!options.exactPort) {
|
|
76
70
|
const shouldChangePort = await promptForPortChange(requestedPort, availablePort);
|
|
77
71
|
if (!shouldChangePort) {
|
|
78
|
-
|
|
72
|
+
logger.info('Exiting.');
|
|
79
73
|
process.exit(1);
|
|
80
74
|
}
|
|
81
75
|
}
|
|
82
76
|
else if (availablePort !== requestedPort && options.ci) {
|
|
83
77
|
// In CI mode, just log the port change
|
|
84
|
-
|
|
78
|
+
logger.warning(`Port ${logger.bold(String(requestedPort))} is not available. Using port ${logger.bold(String(availablePort))} instead.`);
|
|
85
79
|
}
|
|
86
80
|
try {
|
|
87
81
|
await startServer(availablePort);
|
|
@@ -92,7 +86,7 @@ export function startCommand(program) {
|
|
|
92
86
|
}
|
|
93
87
|
}
|
|
94
88
|
catch (error) {
|
|
95
|
-
|
|
89
|
+
logger.errorBox('Server Error', `Failed to start server: ${error}`);
|
|
96
90
|
process.exit(1);
|
|
97
91
|
}
|
|
98
92
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,aAAqB,EACrB,aAAqB;IAErB,MAAM,CAAC,OAAO,CACZ,QAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAC/D,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC;QACrC,OAAO,EAAE,iCAAiC,aAAa,WAAW;QAClE,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAE/C,IAAI,OAAe,CAAC;QACpB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;QAC5B,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YACpB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CACT,uDAAuD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC1E,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACT,uDAAuD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CACL,qBAAqB,EACrB,2BAA2B,EAC3B,MAAM,CAAC,YAAY,CAAC,CACrB;SACA,MAAM,CACL,cAAc,EACd,6CAA6C,EAC7C,KAAK,CACN;SACA,MAAM,CAAC,MAAM,EAAE,yCAAyC,EAAE,KAAK,CAAC;SAChE,MAAM,CAAC,QAAQ,EAAE,gCAAgC,EAAE,KAAK,CAAC;SACzD,MAAM,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;QACtB,mBAAmB,EAAE,CAAC;QAEtB,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEjD,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,KAAK,EAAE,CAAC;YACvE,MAAM,CAAC,QAAQ,CACb,cAAc,EACd,4CAA4C,CAC7C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,4CAA4C;QAC5C,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE;YACvD,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,kDAAkD;QAClD,IACE,aAAa,KAAK,aAAa;YAC/B,CAAC,OAAO,CAAC,EAAE;YACX,CAAC,OAAO,CAAC,SAAS,EAClB,CAAC;YACD,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAChD,aAAa,EACb,aAAa,CACd,CAAC;YAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,KAAK,aAAa,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACzD,uCAAuC;YACvC,MAAM,CAAC,OAAO,CACZ,QAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iCAAiC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,CACzH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;YAEjC,qCAAqC;YACrC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,oBAAoB,aAAa,EAAE,CAAC;gBAChD,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,2BAA2B,KAAK,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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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"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Update all ignore files to exclude .react-scanner-ui/
|
|
3
|
+
*/
|
|
4
|
+
export declare function updateIgnoreFiles(): void;
|
|
5
|
+
export interface ScannerConfigOptions {
|
|
6
|
+
crawlFrom: string;
|
|
7
|
+
importedFrom: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createReactScannerConfig(options: ScannerConfigOptions): void;
|
|
2
10
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -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":"AAmDA;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAmCxC;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CA2B5E"}
|
package/dist/utils/config.js
CHANGED
|
@@ -1,15 +1,84 @@
|
|
|
1
|
-
import { writeFileSync, existsSync } from 'fs';
|
|
1
|
+
import { writeFileSync, existsSync, readFileSync, appendFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
|
|
3
|
+
import * as logger from './logger.js';
|
|
4
|
+
const IGNORE_ENTRY = '.react-scanner-ui/';
|
|
5
|
+
const IGNORE_COMMENT = '# React Scanner UI';
|
|
6
|
+
const IGNORE_FILES = [
|
|
7
|
+
{ filename: '.gitignore', displayName: '.gitignore' },
|
|
8
|
+
{ filename: '.eslintignore', displayName: '.eslintignore' },
|
|
9
|
+
{ filename: '.prettierignore', displayName: '.prettierignore' },
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Check if an ignore file already contains the react-scanner-ui entry
|
|
13
|
+
*/
|
|
14
|
+
function hasIgnoreEntry(filePath) {
|
|
15
|
+
if (!existsSync(filePath)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
19
|
+
return content.includes(IGNORE_ENTRY);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add react-scanner-ui entry to an ignore file
|
|
23
|
+
*/
|
|
24
|
+
function addIgnoreEntry(filePath) {
|
|
25
|
+
try {
|
|
26
|
+
const entryWithComment = `\n${IGNORE_COMMENT}\n${IGNORE_ENTRY}\n`;
|
|
27
|
+
if (!existsSync(filePath)) {
|
|
28
|
+
// Create the file with the entry
|
|
29
|
+
writeFileSync(filePath, `${IGNORE_COMMENT}\n${IGNORE_ENTRY}\n`);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
// Append to existing file
|
|
33
|
+
appendFileSync(filePath, entryWithComment);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Update all ignore files to exclude .react-scanner-ui/
|
|
42
|
+
*/
|
|
43
|
+
export function updateIgnoreFiles() {
|
|
44
|
+
const cwd = process.cwd();
|
|
45
|
+
const updatedFiles = [];
|
|
46
|
+
const skippedFiles = [];
|
|
47
|
+
const failedFiles = [];
|
|
48
|
+
for (const ignoreFile of IGNORE_FILES) {
|
|
49
|
+
const filePath = join(cwd, ignoreFile.filename);
|
|
50
|
+
if (hasIgnoreEntry(filePath)) {
|
|
51
|
+
skippedFiles.push(ignoreFile.displayName);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (addIgnoreEntry(filePath)) {
|
|
55
|
+
updatedFiles.push(ignoreFile.displayName);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
failedFiles.push(ignoreFile.displayName);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Log results
|
|
62
|
+
if (updatedFiles.length > 0) {
|
|
63
|
+
logger.success(`Added ${logger.bold(IGNORE_ENTRY)} to: ${updatedFiles.join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
if (skippedFiles.length > 0) {
|
|
66
|
+
logger.dim(`Already configured in: ${skippedFiles.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
if (failedFiles.length > 0) {
|
|
69
|
+
logger.warning(`Failed to update: ${failedFiles.join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function createReactScannerConfig(options) {
|
|
4
73
|
const configPath = join(process.cwd(), 'react-scanner.config.js');
|
|
5
74
|
if (existsSync(configPath)) {
|
|
6
|
-
|
|
75
|
+
logger.info('react-scanner.config.js already exists.');
|
|
7
76
|
return;
|
|
8
77
|
}
|
|
9
78
|
const configContent = `module.exports = {
|
|
10
|
-
crawlFrom: '
|
|
79
|
+
crawlFrom: '${options.crawlFrom}',
|
|
11
80
|
includeSubComponents: true,
|
|
12
|
-
importedFrom: '
|
|
81
|
+
importedFrom: '${options.importedFrom}',
|
|
13
82
|
processors: [
|
|
14
83
|
['count-components-and-props', { outputTo: './.react-scanner-ui/scan-report.json' }],
|
|
15
84
|
],
|
|
@@ -17,11 +86,10 @@ export function createReactScannerConfig() {
|
|
|
17
86
|
`;
|
|
18
87
|
try {
|
|
19
88
|
writeFileSync(configPath, configContent);
|
|
20
|
-
|
|
21
|
-
console.log('\nš” Tip: Add .react-scanner-ui/ to your .gitignore file.');
|
|
89
|
+
logger.success('Created react-scanner.config.js');
|
|
22
90
|
}
|
|
23
91
|
catch (error) {
|
|
24
|
-
|
|
92
|
+
logger.errorBox('Configuration Error', `Failed to create react-scanner.config.js\n${error}`);
|
|
25
93
|
}
|
|
26
94
|
}
|
|
27
95
|
//# 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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare function isReactScannerInstalled(): boolean;
|
|
2
2
|
export declare function checkPeerDependency(): boolean;
|
|
3
3
|
export declare function promptInstallReactScanner(): Promise<boolean>;
|
|
4
|
-
export declare function installReactScanner(): void
|
|
4
|
+
export declare function installReactScanner(): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -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":"AAUA,wBAAgB,uBAAuB,IAAI,OAAO,CAOjD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAUlE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0EzD"}
|