react-scanner-ui 0.0.1 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/start.d.ts +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +126 -4
- package/dist/commands/start.js.map +1 -1
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +109 -0
- package/dist/server/index.js.map +1 -0
- package/dist/utils/dependencies.js +1 -1
- package/dist/utils/dependencies.js.map +1 -1
- package/dist/utils/index.d.ts +5 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +10 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/port.d.ts +14 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +40 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/utils/scannerConfig.d.ts +38 -0
- package/dist/utils/scannerConfig.d.ts.map +1 -0
- package/dist/utils/scannerConfig.js +110 -0
- package/dist/utils/scannerConfig.js.map +1 -0
- package/package.json +13 -2
- package/ui/index.html +12 -0
- package/ui/vite.config.ts +22 -0
package/dist/commands/start.d.ts
CHANGED
|
@@ -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;AAoEpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoEnD"}
|
package/dist/commands/start.js
CHANGED
|
@@ -1,14 +1,136 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.startCommand = startCommand;
|
|
37
|
+
const readline_1 = require("readline");
|
|
4
38
|
const dependencies_1 = require("../utils/dependencies");
|
|
39
|
+
const port_1 = require("../utils/port");
|
|
40
|
+
const server_1 = require("../server");
|
|
41
|
+
const DEFAULT_PORT = 3000;
|
|
42
|
+
/**
|
|
43
|
+
* Prompt user to confirm using a different port (like Storybook does)
|
|
44
|
+
*/
|
|
45
|
+
async function promptForPortChange(requestedPort, availablePort) {
|
|
46
|
+
const rl = (0, readline_1.createInterface)({
|
|
47
|
+
input: process.stdin,
|
|
48
|
+
output: process.stdout,
|
|
49
|
+
});
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
rl.question(`Port ${requestedPort} is not available. Would you like to run on port ${availablePort} instead? (Y/n): `, (answer) => {
|
|
52
|
+
rl.close();
|
|
53
|
+
const normalizedAnswer = answer.trim().toLowerCase();
|
|
54
|
+
// Default to yes if user just presses enter
|
|
55
|
+
resolve(normalizedAnswer === "" ||
|
|
56
|
+
normalizedAnswer === "y" ||
|
|
57
|
+
normalizedAnswer === "yes");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Open the browser to the given URL
|
|
63
|
+
*/
|
|
64
|
+
async function openBrowser(url) {
|
|
65
|
+
const { platform } = process;
|
|
66
|
+
try {
|
|
67
|
+
const { exec } = await Promise.resolve().then(() => __importStar(require("child_process")));
|
|
68
|
+
let command;
|
|
69
|
+
if (platform === "darwin") {
|
|
70
|
+
command = `open "${url}"`;
|
|
71
|
+
}
|
|
72
|
+
else if (platform === "win32") {
|
|
73
|
+
command = `start "" "${url}"`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Linux and other platforms
|
|
77
|
+
command = `xdg-open "${url}"`;
|
|
78
|
+
}
|
|
79
|
+
exec(command, (error) => {
|
|
80
|
+
if (error) {
|
|
81
|
+
console.log(`Could not open browser automatically. Please visit: ${url}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
console.log(`Could not open browser automatically. Please visit: ${url}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
5
89
|
function startCommand(program) {
|
|
6
90
|
program
|
|
7
|
-
.command(
|
|
8
|
-
.description(
|
|
9
|
-
.
|
|
91
|
+
.command("start")
|
|
92
|
+
.description("Start the React Scanner UI server")
|
|
93
|
+
.option("-p, --port <number>", "Port to run the server on", String(DEFAULT_PORT))
|
|
94
|
+
.option("--exact-port", "Exit if the specified port is not available", false)
|
|
95
|
+
.option("--ci", "Run in CI mode (no interactive prompts)", false)
|
|
96
|
+
.option("--open", "Open the browser automatically", false)
|
|
97
|
+
.action(async (options) => {
|
|
10
98
|
(0, dependencies_1.checkPeerDependency)();
|
|
11
|
-
|
|
99
|
+
const requestedPort = parseInt(options.port, 10);
|
|
100
|
+
if (isNaN(requestedPort) || requestedPort < 1 || requestedPort > 65535) {
|
|
101
|
+
console.error("Error: Invalid port number. Please specify a port between 1 and 65535.");
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// Use detect-port to find an available port
|
|
105
|
+
const availablePort = await (0, port_1.getServerPort)(requestedPort, {
|
|
106
|
+
exactPort: options.exactPort,
|
|
107
|
+
});
|
|
108
|
+
// If port changed and not in CI mode, prompt user
|
|
109
|
+
if (availablePort !== requestedPort &&
|
|
110
|
+
!options.ci &&
|
|
111
|
+
!options.exactPort) {
|
|
112
|
+
const shouldChangePort = await promptForPortChange(requestedPort, availablePort);
|
|
113
|
+
if (!shouldChangePort) {
|
|
114
|
+
console.log("Exiting.");
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (availablePort !== requestedPort && options.ci) {
|
|
119
|
+
// In CI mode, just log the port change
|
|
120
|
+
console.log(`Port ${requestedPort} is not available. Using port ${availablePort} instead.`);
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
await (0, server_1.startServer)(availablePort);
|
|
124
|
+
// Open browser if --open flag is set
|
|
125
|
+
if (options.open) {
|
|
126
|
+
const url = `http://localhost:${availablePort}`;
|
|
127
|
+
await openBrowser(url);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error("Failed to start server:", error);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
12
134
|
});
|
|
13
135
|
}
|
|
14
136
|
//# sourceMappingURL=start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAuBA;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE7D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.startServer = startServer;
|
|
40
|
+
const http_1 = require("http");
|
|
41
|
+
const path_1 = require("path");
|
|
42
|
+
const polka_1 = __importDefault(require("polka"));
|
|
43
|
+
const scannerConfig_1 = require("../utils/scannerConfig");
|
|
44
|
+
/**
|
|
45
|
+
* Get the path to the UI directory.
|
|
46
|
+
* Works both in development (src/) and production (dist/)
|
|
47
|
+
*/
|
|
48
|
+
function getUiRoot() {
|
|
49
|
+
// __dirname will be either src/server or dist/server
|
|
50
|
+
// UI is always at project-root/ui
|
|
51
|
+
const currentDir = __dirname;
|
|
52
|
+
// Go up from server/ to src/ or dist/, then up to project root, then into ui/
|
|
53
|
+
return (0, path_1.resolve)(currentDir, "../../ui");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Start the HTTP server using Polka with Vite middleware mode
|
|
57
|
+
* (similar approach to Storybook's builder-vite)
|
|
58
|
+
*/
|
|
59
|
+
async function startServer(port) {
|
|
60
|
+
const server = (0, http_1.createServer)();
|
|
61
|
+
const app = (0, polka_1.default)({ server });
|
|
62
|
+
// API endpoint to get scan data (served before Vite middleware)
|
|
63
|
+
app.get("/api/scan-data", (_req, res) => {
|
|
64
|
+
res.setHeader("Content-Type", "application/json");
|
|
65
|
+
const result = (0, scannerConfig_1.getScanData)();
|
|
66
|
+
res.end(JSON.stringify(result));
|
|
67
|
+
});
|
|
68
|
+
// Dynamically import Vite to create dev server in middleware mode
|
|
69
|
+
const { createServer: createViteServer } = await Promise.resolve().then(() => __importStar(require("vite")));
|
|
70
|
+
const uiRoot = getUiRoot();
|
|
71
|
+
const vite = await createViteServer({
|
|
72
|
+
root: uiRoot,
|
|
73
|
+
configFile: (0, path_1.resolve)(uiRoot, "vite.config.ts"),
|
|
74
|
+
server: {
|
|
75
|
+
middlewareMode: true,
|
|
76
|
+
hmr: {
|
|
77
|
+
server,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
appType: "spa",
|
|
81
|
+
});
|
|
82
|
+
// Use Vite's connect instance as middleware
|
|
83
|
+
app.use(vite.middlewares);
|
|
84
|
+
// Handle server errors
|
|
85
|
+
server.on("error", (err) => {
|
|
86
|
+
console.error("Server error:", err);
|
|
87
|
+
vite.close();
|
|
88
|
+
process.exit(1);
|
|
89
|
+
});
|
|
90
|
+
// Handle graceful shutdown
|
|
91
|
+
const shutdown = async () => {
|
|
92
|
+
console.log("\nShutting down...");
|
|
93
|
+
await vite.close();
|
|
94
|
+
server.close();
|
|
95
|
+
process.exit(0);
|
|
96
|
+
};
|
|
97
|
+
process.on("SIGINT", shutdown);
|
|
98
|
+
process.on("SIGTERM", shutdown);
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
server.on("error", reject);
|
|
101
|
+
app.listen({ port, host: "127.0.0.1" }, () => {
|
|
102
|
+
console.log(`\n🚀 React Scanner UI is running at http://localhost:${port}\n`);
|
|
103
|
+
console.log(" ➜ Hot Module Replacement enabled");
|
|
104
|
+
console.log(" ➜ Press Ctrl+C to stop the server.\n");
|
|
105
|
+
resolve();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,kCAmEC;AA9FD,+BAIc;AACd,+BAAwC;AAExC,kDAA0B;AAC1B,0DAAqD;AAErD;;;GAGG;AACH,SAAS,SAAS;IAChB,qDAAqD;IACrD,kCAAkC;IAClC,MAAM,UAAU,GAAG,SAAS,CAAC;IAE7B,8EAA8E;IAC9E,OAAO,IAAA,cAAO,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,MAAM,GAAG,IAAA,mBAAgB,GAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9B,gEAAgE;IAChE,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,IAAqB,EAAE,GAAmB,EAAE,EAAE;QACvE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAA,2BAAW,GAAE,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,IAAA,cAAO,EAAC,MAAM,EAAE,gBAAgB,CAAC;QAC7C,MAAM,EAAE;YACN,cAAc,EAAE,IAAI;YACpB,GAAG,EAAE;gBACH,MAAM;aACP;SACF;QACD,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,4CAA4C;IAC5C,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,WAII,CACV,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;QAChD,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE3B,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE;YAC3C,OAAO,CAAC,GAAG,CACT,wDAAwD,IAAI,IAAI,CACjE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -53,7 +53,7 @@ function installReactScanner() {
|
|
|
53
53
|
}
|
|
54
54
|
let command;
|
|
55
55
|
if (useYarn) {
|
|
56
|
-
command = `yarn add react-scanner --dev${isWorkspace ? ' -W' : ''}`;
|
|
56
|
+
command = `yarn add react-scanner --dev --ignore-engines${isWorkspace ? ' -W' : ''}`;
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
59
|
command = 'npm install react-scanner --save-dev';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":";;AAIA,0DAOC;AAED,kDAUC;AAED,8DAYC;AAED,kDA2BC;AAlED,2BAA8C;AAC9C,iDAAyC;AACzC,uCAA2C;AAE3C,SAAgB,uBAAuB;IACrC,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB;IACjC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,yBAAyB;IAC7C,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,kEAAkE,EAAE,CAAC,MAAM,EAAE,EAAE;YACzF,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,mBAAmB;IACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,eAAU,EAAC,WAAW,CAAC,CAAC;QACxC,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAA,iBAAY,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC/C,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC3B,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/utils/dependencies.ts"],"names":[],"mappings":";;AAIA,0DAOC;AAED,kDAUC;AAED,8DAYC;AAED,kDA2BC;AAlED,2BAA8C;AAC9C,iDAAyC;AACzC,uCAA2C;AAE3C,SAAgB,uBAAuB;IACrC,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB;IACjC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,yBAAyB;IAC7C,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,kEAAkE,EAAE,CAAC,MAAM,EAAE,EAAE;YACzF,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,mBAAmB;IACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,eAAU,EAAC,WAAW,CAAC,CAAC;QACxC,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAA,iBAAY,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC/C,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC3B,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG,gDAAgD,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,sCAAsC,CAAC;QACnD,CAAC;QAED,IAAA,wBAAQ,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
export { isReactScannerInstalled, checkPeerDependency, promptInstallReactScanner, installReactScanner, } from
|
|
2
|
-
export { createReactScannerConfig } from
|
|
1
|
+
export { isReactScannerInstalled, checkPeerDependency, promptInstallReactScanner, installReactScanner, } from "./dependencies";
|
|
2
|
+
export { createReactScannerConfig } from "./config";
|
|
3
|
+
export { getServerPort, isPortAvailable } from "./port";
|
|
4
|
+
export type { PortOptions } from "./port";
|
|
5
|
+
export { readScannerConfig, getOutputDir, getLatestScanFile, readScanData, getScanData, } from "./scannerConfig";
|
|
3
6
|
//# 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,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,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,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createReactScannerConfig = exports.installReactScanner = exports.promptInstallReactScanner = exports.checkPeerDependency = exports.isReactScannerInstalled = void 0;
|
|
3
|
+
exports.getScanData = exports.readScanData = exports.getLatestScanFile = exports.getOutputDir = exports.readScannerConfig = exports.isPortAvailable = exports.getServerPort = exports.createReactScannerConfig = exports.installReactScanner = exports.promptInstallReactScanner = exports.checkPeerDependency = exports.isReactScannerInstalled = void 0;
|
|
4
4
|
var dependencies_1 = require("./dependencies");
|
|
5
5
|
Object.defineProperty(exports, "isReactScannerInstalled", { enumerable: true, get: function () { return dependencies_1.isReactScannerInstalled; } });
|
|
6
6
|
Object.defineProperty(exports, "checkPeerDependency", { enumerable: true, get: function () { return dependencies_1.checkPeerDependency; } });
|
|
@@ -8,4 +8,13 @@ Object.defineProperty(exports, "promptInstallReactScanner", { enumerable: true,
|
|
|
8
8
|
Object.defineProperty(exports, "installReactScanner", { enumerable: true, get: function () { return dependencies_1.installReactScanner; } });
|
|
9
9
|
var config_1 = require("./config");
|
|
10
10
|
Object.defineProperty(exports, "createReactScannerConfig", { enumerable: true, get: function () { return config_1.createReactScannerConfig; } });
|
|
11
|
+
var port_1 = require("./port");
|
|
12
|
+
Object.defineProperty(exports, "getServerPort", { enumerable: true, get: function () { return port_1.getServerPort; } });
|
|
13
|
+
Object.defineProperty(exports, "isPortAvailable", { enumerable: true, get: function () { return port_1.isPortAvailable; } });
|
|
14
|
+
var scannerConfig_1 = require("./scannerConfig");
|
|
15
|
+
Object.defineProperty(exports, "readScannerConfig", { enumerable: true, get: function () { return scannerConfig_1.readScannerConfig; } });
|
|
16
|
+
Object.defineProperty(exports, "getOutputDir", { enumerable: true, get: function () { return scannerConfig_1.getOutputDir; } });
|
|
17
|
+
Object.defineProperty(exports, "getLatestScanFile", { enumerable: true, get: function () { return scannerConfig_1.getLatestScanFile; } });
|
|
18
|
+
Object.defineProperty(exports, "readScanData", { enumerable: true, get: function () { return scannerConfig_1.readScanData; } });
|
|
19
|
+
Object.defineProperty(exports, "getScanData", { enumerable: true, get: function () { return scannerConfig_1.getScanData; } });
|
|
11
20
|
//# 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,+CAKwB;AAJtB,uHAAA,uBAAuB,OAAA;AACvB,mHAAA,mBAAmB,OAAA;AACnB,yHAAA,yBAAyB,OAAA;AACzB,mHAAA,mBAAmB,OAAA;AAErB,mCAAoD;AAA3C,kHAAA,wBAAwB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,+CAKwB;AAJtB,uHAAA,uBAAuB,OAAA;AACvB,mHAAA,mBAAmB,OAAA;AACnB,yHAAA,yBAAyB,OAAA;AACzB,mHAAA,mBAAmB,OAAA;AAErB,mCAAoD;AAA3C,kHAAA,wBAAwB,OAAA;AACjC,+BAAwD;AAA/C,qGAAA,aAAa,OAAA;AAAE,uGAAA,eAAe,OAAA;AAEvC,iDAMyB;AALvB,kHAAA,iBAAiB,OAAA;AACjB,6GAAA,YAAY,OAAA;AACZ,kHAAA,iBAAiB,OAAA;AACjB,6GAAA,YAAY,OAAA;AACZ,4GAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PortOptions {
|
|
2
|
+
exactPort?: boolean;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Get an available server port using detect-port (same approach as Storybook)
|
|
6
|
+
* If the requested port is busy, it will find the next available port
|
|
7
|
+
* unless exactPort is set to true, in which case it will exit
|
|
8
|
+
*/
|
|
9
|
+
export declare function getServerPort(port?: number, { exactPort }?: PortOptions): Promise<number>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a port is available
|
|
12
|
+
*/
|
|
13
|
+
export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"AAEA,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,CAcjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getServerPort = getServerPort;
|
|
7
|
+
exports.isPortAvailable = isPortAvailable;
|
|
8
|
+
const detect_port_1 = __importDefault(require("detect-port"));
|
|
9
|
+
/**
|
|
10
|
+
* Get an available server port using detect-port (same approach as Storybook)
|
|
11
|
+
* If the requested port is busy, it will find the next available port
|
|
12
|
+
* unless exactPort is set to true, in which case it will exit
|
|
13
|
+
*/
|
|
14
|
+
async function getServerPort(port = 3000, { exactPort } = {}) {
|
|
15
|
+
try {
|
|
16
|
+
const freePort = await (0, detect_port_1.default)(port);
|
|
17
|
+
if (freePort !== port && exactPort) {
|
|
18
|
+
console.error(`Error: Port ${port} is not available.`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
return freePort;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error("Error detecting available port:", error);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a port is available
|
|
30
|
+
*/
|
|
31
|
+
async function isPortAvailable(port) {
|
|
32
|
+
try {
|
|
33
|
+
const freePort = await (0, detect_port_1.default)(port);
|
|
34
|
+
return freePort === port;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":";;;;;AAWA,sCAiBC;AAKD,0CAOC;AAxCD,8DAAqC;AAMrC;;;;GAIG;AACI,KAAK,UAAU,aAAa,CACjC,OAAe,IAAI,EACnB,EAAE,SAAS,KAAkB,EAAE;IAE/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC;QAExC,IAAI,QAAQ,KAAK,IAAI,IAAI,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,oBAAoB,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC;QACxC,OAAO,QAAQ,KAAK,IAAI,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface ScannerConfig {
|
|
2
|
+
crawlFrom?: string;
|
|
3
|
+
includeSubComponents?: boolean;
|
|
4
|
+
importedFrom?: string;
|
|
5
|
+
processors?: Array<[string, {
|
|
6
|
+
outputDir?: string;
|
|
7
|
+
}]>;
|
|
8
|
+
}
|
|
9
|
+
export interface ScanData {
|
|
10
|
+
[componentName: string]: {
|
|
11
|
+
instances: number;
|
|
12
|
+
props?: Record<string, number>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read and parse the react-scanner.config.js file
|
|
17
|
+
*/
|
|
18
|
+
export declare function readScannerConfig(): ScannerConfig | null;
|
|
19
|
+
/**
|
|
20
|
+
* Get the output directory from the scanner config
|
|
21
|
+
*/
|
|
22
|
+
export declare function getOutputDir(config: ScannerConfig): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Get the latest scan file from the output directory
|
|
25
|
+
*/
|
|
26
|
+
export declare function getLatestScanFile(outputDir: string): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Read and parse the scan data from a JSON file
|
|
29
|
+
*/
|
|
30
|
+
export declare function readScanData(filePath: string): ScanData | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get the scan data from the react-scanner output
|
|
33
|
+
*/
|
|
34
|
+
export declare function getScanData(): {
|
|
35
|
+
data: ScanData | null;
|
|
36
|
+
error: string | null;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=scannerConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scannerConfig.d.ts","sourceRoot":"","sources":["../../src/utils/scannerConfig.ts"],"names":[],"mappings":"AAGA,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,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACtD;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,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAiBxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAYjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BlE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ9D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI;IAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAsB7E"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readScannerConfig = readScannerConfig;
|
|
4
|
+
exports.getOutputDir = getOutputDir;
|
|
5
|
+
exports.getLatestScanFile = getLatestScanFile;
|
|
6
|
+
exports.readScanData = readScanData;
|
|
7
|
+
exports.getScanData = getScanData;
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
/**
|
|
11
|
+
* Read and parse the react-scanner.config.js file
|
|
12
|
+
*/
|
|
13
|
+
function readScannerConfig() {
|
|
14
|
+
const configPath = (0, path_1.join)(process.cwd(), 'react-scanner.config.js');
|
|
15
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
16
|
+
console.error('react-scanner.config.js not found. Run `react-scanner-ui init` first.');
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
// Clear require cache to get fresh config
|
|
21
|
+
delete require.cache[require.resolve(configPath)];
|
|
22
|
+
const config = require(configPath);
|
|
23
|
+
return config;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error('Failed to read react-scanner.config.js:', error);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the output directory from the scanner config
|
|
32
|
+
*/
|
|
33
|
+
function getOutputDir(config) {
|
|
34
|
+
if (!config.processors || !Array.isArray(config.processors)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
for (const processor of config.processors) {
|
|
38
|
+
if (Array.isArray(processor) && processor[0] === 'raw-report' && processor[1]?.outputDir) {
|
|
39
|
+
return processor[1].outputDir;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the latest scan file from the output directory
|
|
46
|
+
*/
|
|
47
|
+
function getLatestScanFile(outputDir) {
|
|
48
|
+
const absoluteOutputDir = (0, path_1.resolve)(process.cwd(), outputDir);
|
|
49
|
+
if (!(0, fs_1.existsSync)(absoluteOutputDir)) {
|
|
50
|
+
console.error(`Scan output directory not found: ${absoluteOutputDir}`);
|
|
51
|
+
console.error('Run react-scanner first to generate scan data.');
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const files = (0, fs_1.readdirSync)(absoluteOutputDir)
|
|
56
|
+
.filter((file) => file.endsWith('.json'))
|
|
57
|
+
.map((file) => ({
|
|
58
|
+
name: file,
|
|
59
|
+
path: (0, path_1.join)(absoluteOutputDir, file),
|
|
60
|
+
mtime: (0, fs_1.statSync)((0, path_1.join)(absoluteOutputDir, file)).mtime,
|
|
61
|
+
}))
|
|
62
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
63
|
+
if (files.length === 0) {
|
|
64
|
+
console.error('No scan files found in output directory.');
|
|
65
|
+
console.error('Run react-scanner first to generate scan data.');
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return files[0].path;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error('Failed to read scan output directory:', error);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read and parse the scan data from a JSON file
|
|
77
|
+
*/
|
|
78
|
+
function readScanData(filePath) {
|
|
79
|
+
try {
|
|
80
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
81
|
+
return JSON.parse(content);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Failed to read scan data:', error);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the scan data from the react-scanner output
|
|
90
|
+
*/
|
|
91
|
+
function getScanData() {
|
|
92
|
+
const config = readScannerConfig();
|
|
93
|
+
if (!config) {
|
|
94
|
+
return { data: null, error: 'Could not read react-scanner.config.js' };
|
|
95
|
+
}
|
|
96
|
+
const outputDir = getOutputDir(config);
|
|
97
|
+
if (!outputDir) {
|
|
98
|
+
return { data: null, error: 'Could not find output directory in config. Make sure you have a raw-report processor configured.' };
|
|
99
|
+
}
|
|
100
|
+
const scanFile = getLatestScanFile(outputDir);
|
|
101
|
+
if (!scanFile) {
|
|
102
|
+
return { data: null, error: 'No scan data found. Run react-scanner first.' };
|
|
103
|
+
}
|
|
104
|
+
const data = readScanData(scanFile);
|
|
105
|
+
if (!data) {
|
|
106
|
+
return { data: null, error: 'Failed to parse scan data.' };
|
|
107
|
+
}
|
|
108
|
+
return { data, error: null };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=scannerConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scannerConfig.js","sourceRoot":"","sources":["../../src/utils/scannerConfig.ts"],"names":[],"mappings":";;AAoBA,8CAiBC;AAKD,oCAYC;AAKD,8CA8BC;AAKD,oCAQC;AAKD,kCAsBC;AAjID,2BAAqE;AACrE,+BAAqC;AAgBrC;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAElE,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,0CAA0C;QAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,MAAqB;IAChD,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YACzF,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,MAAM,iBAAiB,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAI,CAAC,IAAA,eAAU,EAAC,iBAAiB,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,oCAAoC,iBAAiB,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,gBAAW,EAAC,iBAAiB,CAAC;aACzC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAA,WAAI,EAAC,iBAAiB,EAAE,IAAI,CAAC;YACnC,KAAK,EAAE,IAAA,aAAQ,EAAC,IAAA,WAAI,EAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK;SACrD,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,kGAAkG,EAAE,CAAC;IACnI,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IAC7D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-scanner-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"react-scanner-ui": "dist/index.js"
|
|
@@ -16,16 +16,27 @@
|
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc",
|
|
19
|
+
"build:ui": "vite build --config ui/vite.config.ts",
|
|
19
20
|
"start": "node dist/index.js",
|
|
20
21
|
"dev": "ts-node src/index.ts",
|
|
22
|
+
"dev:ui": "vite --config ui/vite.config.ts",
|
|
21
23
|
"prepublishOnly": "yarn build",
|
|
22
24
|
"publish:npm": "yarn build && npm publish"
|
|
23
25
|
},
|
|
24
26
|
"dependencies": {
|
|
25
|
-
"
|
|
27
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
28
|
+
"commander": "^14.0.2",
|
|
29
|
+
"detect-port": "^1.6.1",
|
|
30
|
+
"polka": "^0.5.2",
|
|
31
|
+
"react": "^18.3.1",
|
|
32
|
+
"react-dom": "^18.3.1",
|
|
33
|
+
"vite": "^5.4.19"
|
|
26
34
|
},
|
|
27
35
|
"devDependencies": {
|
|
28
36
|
"@types/node": "^25.0.3",
|
|
37
|
+
"@types/polka": "^0.5.7",
|
|
38
|
+
"@types/react": "^18.3.18",
|
|
39
|
+
"@types/react-dom": "^18.3.5",
|
|
29
40
|
"ts-node": "^10.9.2",
|
|
30
41
|
"typescript": "^5.9.3"
|
|
31
42
|
}
|
package/ui/index.html
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>React Scanner UI</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="root"></div>
|
|
10
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineConfig } from "vite";
|
|
2
|
+
import react from "@vitejs/plugin-react";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [react()],
|
|
7
|
+
root: resolve(__dirname),
|
|
8
|
+
server: {
|
|
9
|
+
port: 3000,
|
|
10
|
+
open: false,
|
|
11
|
+
},
|
|
12
|
+
appType: "spa",
|
|
13
|
+
resolve: {
|
|
14
|
+
alias: {
|
|
15
|
+
"@": resolve(__dirname, "src"),
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
build: {
|
|
19
|
+
outDir: resolve(__dirname, "../dist/ui"),
|
|
20
|
+
emptyOutDir: true,
|
|
21
|
+
},
|
|
22
|
+
});
|