@rayburst/cli 0.2.4 → 0.2.6

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.
@@ -191,6 +191,10 @@ async function analyzeProject(projectPath, projectId, onLog) {
191
191
  packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
192
192
  }
193
193
  const branchId = gitInfo.branch.replace(/[^a-zA-Z0-9]/g, "-");
194
+ const entryPoint = detectEntryPoint(projectPath);
195
+ if (entryPoint) {
196
+ log(` Entry point detected: ${entryPoint}`);
197
+ }
194
198
  const projectMetadata = {
195
199
  id: projectId || crypto.createHash("md5").update(projectPath).digest("hex").substring(0, 12),
196
200
  title: packageJson.name || path2.basename(projectPath),
@@ -198,7 +202,8 @@ async function analyzeProject(projectPath, projectId, onLog) {
198
202
  value: `${nodes.length} nodes`,
199
203
  trend: 0,
200
204
  chartData: [30, 40, 35, 50, 45, 60, 55, 70],
201
- chartColor: "#22c55e"
205
+ chartColor: "#22c55e",
206
+ entryPoint
202
207
  };
203
208
  const branchMetadata = {
204
209
  id: branchId,
@@ -245,6 +250,7 @@ function createEmptyAnalysis(projectPath, gitInfo) {
245
250
  packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
246
251
  }
247
252
  const branchId = gitInfo.branch.replace(/[^a-zA-Z0-9]/g, "-");
253
+ const entryPoint = detectEntryPoint(projectPath);
248
254
  return {
249
255
  project: {
250
256
  id: crypto.createHash("md5").update(projectPath).digest("hex").substring(0, 12),
@@ -253,7 +259,8 @@ function createEmptyAnalysis(projectPath, gitInfo) {
253
259
  value: "0 nodes",
254
260
  trend: 0,
255
261
  chartData: [],
256
- chartColor: "#6b7280"
262
+ chartColor: "#6b7280",
263
+ entryPoint
257
264
  },
258
265
  branches: [{
259
266
  id: branchId,
@@ -292,6 +299,64 @@ function getGitInfo(projectPath) {
292
299
  };
293
300
  }
294
301
  }
302
+ function detectEntryPoint(projectPath) {
303
+ const packageJsonPath = path2.join(projectPath, "package.json");
304
+ if (fs.existsSync(packageJsonPath)) {
305
+ try {
306
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
307
+ if (packageJson.main) {
308
+ return packageJson.main;
309
+ }
310
+ } catch (error) {
311
+ console.error("Error reading package.json:", error);
312
+ }
313
+ }
314
+ const viteConfigPaths = [
315
+ "vite.config.ts",
316
+ "vite.config.js",
317
+ "vite.config.mts",
318
+ "vite.config.mjs"
319
+ ];
320
+ for (const configFile of viteConfigPaths) {
321
+ const configPath = path2.join(projectPath, configFile);
322
+ if (fs.existsSync(configPath)) {
323
+ try {
324
+ const configContent = fs.readFileSync(configPath, "utf-8");
325
+ const inputMatch = configContent.match(/input:\s*['"]([\w\/\.-]+)['"]/);
326
+ if (inputMatch) {
327
+ return inputMatch[1];
328
+ }
329
+ const htmlMatch = configContent.match(/['"]\.\/?(index\.html)['"]/);
330
+ if (htmlMatch) {
331
+ const indexHtmlPath = path2.join(projectPath, "index.html");
332
+ if (fs.existsSync(indexHtmlPath)) {
333
+ const htmlContent = fs.readFileSync(indexHtmlPath, "utf-8");
334
+ const scriptMatch = htmlContent.match(/<script[^>]+src=["']\/?([^"']+)["']/);
335
+ if (scriptMatch) {
336
+ return scriptMatch[1];
337
+ }
338
+ }
339
+ }
340
+ } catch (error) {
341
+ console.error(`Error reading ${configFile}:`, error);
342
+ }
343
+ }
344
+ }
345
+ const commonEntryPoints = [
346
+ "src/main.ts",
347
+ "src/main.tsx",
348
+ "src/index.ts",
349
+ "src/index.tsx",
350
+ "src/app.ts",
351
+ "src/app.tsx"
352
+ ];
353
+ for (const entry of commonEntryPoints) {
354
+ if (fs.existsSync(path2.join(projectPath, entry))) {
355
+ return entry;
356
+ }
357
+ }
358
+ return void 0;
359
+ }
295
360
  function createNodeId(filePath, nodeName, gitHash, counter = 0) {
296
361
  const suffix = counter > 0 ? `-${counter}` : "";
297
362
  return `${filePath}::${nodeName}${suffix}::${gitHash}`;
@@ -309,21 +374,37 @@ function getUniqueNodeId(filePath, nodeName, gitHash, usedIds, idCounters) {
309
374
  return id;
310
375
  }
311
376
  function isReactComponent(func) {
312
- const name = func.getName() || func.getParent()?.asKind?.(SyntaxKind.VariableDeclaration)?.getName?.();
313
- const hasComponentName = name && /^[A-Z]/.test(name);
314
- const returnType = func.getReturnType().getText();
315
- const hasJsxReturnType = returnType.includes("JSX.Element") || returnType.includes("React.ReactElement") || returnType.includes("ReactElement") || returnType.includes("React.ReactNode") || returnType.includes("ReactNode");
316
- const body = func.getBody();
317
- if (!body) return false;
318
- const hasJsxElements = body.getDescendantsOfKind(SyntaxKind.JsxElement).length > 0 || body.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).length > 0 || body.getDescendantsOfKind(SyntaxKind.JsxFragment).length > 0;
319
- const hasHooks = body.getDescendantsOfKind(SyntaxKind.CallExpression).some((call) => {
320
- const expr = call.getExpression().getText();
321
- return expr.startsWith("use") && /^use[A-Z]/.test(expr);
322
- });
323
- if (hasJsxElements) return true;
324
- if (hasJsxReturnType) return true;
325
- if (hasComponentName && hasHooks) return true;
326
- return false;
377
+ try {
378
+ let name = "";
379
+ if (typeof func.getName === "function") {
380
+ name = func.getName() || "";
381
+ }
382
+ if (!name && func.getParent) {
383
+ const parent = func.getParent();
384
+ if (parent && typeof parent.asKind === "function") {
385
+ const varDecl = parent.asKind(SyntaxKind.VariableDeclaration);
386
+ if (varDecl && typeof varDecl.getName === "function") {
387
+ name = varDecl.getName() || "";
388
+ }
389
+ }
390
+ }
391
+ const hasComponentName = name && /^[A-Z]/.test(name);
392
+ const returnType = func.getReturnType()?.getText() || "";
393
+ const hasJsxReturnType = returnType.includes("JSX.Element") || returnType.includes("React.ReactElement") || returnType.includes("ReactElement") || returnType.includes("React.ReactNode") || returnType.includes("ReactNode");
394
+ const body = func.getBody();
395
+ if (!body) return false;
396
+ const hasJsxElements = body.getDescendantsOfKind(SyntaxKind.JsxElement).length > 0 || body.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).length > 0 || body.getDescendantsOfKind(SyntaxKind.JsxFragment).length > 0;
397
+ const hasHooks = body.getDescendantsOfKind(SyntaxKind.CallExpression).some((call) => {
398
+ const expr = call.getExpression().getText();
399
+ return expr.startsWith("use") && /^use[A-Z]/.test(expr);
400
+ });
401
+ if (hasJsxElements) return true;
402
+ if (hasJsxReturnType) return true;
403
+ if (hasComponentName && hasHooks) return true;
404
+ return false;
405
+ } catch (error) {
406
+ return false;
407
+ }
327
408
  }
328
409
  function analyzeReturnStatements(func) {
329
410
  const body = func.getBody();
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  readLocalMeta,
10
10
  writeLocalAnalysis,
11
11
  writeLocalMeta
12
- } from "./chunk-74JMCHWV.js";
12
+ } from "./chunk-XZXZKHVG.js";
13
13
  export {
14
14
  addGitignoreEntry,
15
15
  analyzeProject,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  rayburstPlugin
3
- } from "./chunk-74JMCHWV.js";
3
+ } from "./chunk-XZXZKHVG.js";
4
4
  export {
5
5
  rayburstPlugin
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rayburst/cli",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Rayburst - Automatic code analysis for TypeScript/JavaScript projects via Vite plugin",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,7 +47,7 @@
47
47
  "zod": "^4.2.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@rayburst/types": "^0.1.4",
50
+ "@rayburst/types": "^0.1.5",
51
51
  "@types/node": "^25.0.2",
52
52
  "tsup": "^8.5.1",
53
53
  "typescript": "^5.9.3",