@norescan/analyzer 0.0.0-stage → 0.1.2

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 CHANGED
@@ -1,3 +1,40 @@
1
- # Temporary Holding Version
1
+ # @norescan/analyzer
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ > Multi-language AST and lexical structural code parsers (TypeScript, JavaScript, Python, SQL, JSON).
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@norescan/analyzer.svg)](https://www.npmjs.com/package/@norescan/analyzer)
6
+ [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
7
+ [![GitHub](https://img.shields.io/badge/GitHub-th3karn%2FNoReScan-brightgreen)](https://github.com/th3karn/NoReScan)
8
+
9
+ Part of the **[NoReScan](https://github.com/th3karn/NoReScan)** persistent codebase memory infrastructure for AI coding agents.
10
+
11
+ ---
12
+
13
+ ### Installation
14
+ ```bash
15
+ npm install @norescan/analyzer
16
+ ```
17
+
18
+ ### Usage
19
+ ```typescript
20
+ import { CodeAnalyzer } from '@norescan/analyzer';
21
+
22
+ const analyzer = new CodeAnalyzer();
23
+ const output = await analyzer.analyzeFile('/path/to/server.ts', 'src/server.ts', 'typescript');
24
+
25
+ console.log('Exports:', output.astMetadata.exports);
26
+ console.log('HTTP Routes:', output.astMetadata.routes);
27
+ console.log('Summary:', output.summary);
28
+ ```
29
+
30
+ ---
31
+
32
+ ## Part of NoReScan
33
+
34
+ This package is part of the **NoReScan monorepo**. Learn more at:
35
+ - **GitHub Repository**: [https://github.com/th3karn/NoReScan](https://github.com/th3karn/NoReScan)
36
+ - **Main CLI**: [`@norescan/cli`](https://www.npmjs.com/package/@norescan/cli)
37
+
38
+ ## License
39
+
40
+ Apache-2.0 © LostGit Solutions
@@ -0,0 +1,14 @@
1
+ import { AstMetadata } from '@norescan/shared';
2
+ export declare const CURRENT_ANALYZER_VERSION = "1.0.0";
3
+ export declare const CURRENT_SCHEMA_VERSION = 1;
4
+ export interface AnalysisOutput {
5
+ summary: string;
6
+ astMetadata: AstMetadata;
7
+ analyzerVersion: string;
8
+ schemaVersion: number;
9
+ }
10
+ export declare class CodeAnalyzer {
11
+ analyzeFile(absolutePath: string, relativePath: string, language: string): Promise<AnalysisOutput>;
12
+ analyzeSource(sourceText: string, relativePath: string, language: string): AnalysisOutput;
13
+ }
14
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,YAAY;IACV,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKxG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc;CA0BjG"}
@@ -0,0 +1,45 @@
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.CodeAnalyzer = exports.CURRENT_SCHEMA_VERSION = exports.CURRENT_ANALYZER_VERSION = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const typescript_js_1 = require("./parsers/typescript.js");
9
+ const python_js_1 = require("./parsers/python.js");
10
+ const sql_js_1 = require("./parsers/sql.js");
11
+ const generic_js_1 = require("./parsers/generic.js");
12
+ exports.CURRENT_ANALYZER_VERSION = '1.0.0';
13
+ exports.CURRENT_SCHEMA_VERSION = 1;
14
+ class CodeAnalyzer {
15
+ async analyzeFile(absolutePath, relativePath, language) {
16
+ const content = await promises_1.default.readFile(absolutePath, 'utf8');
17
+ return this.analyzeSource(content, relativePath, language);
18
+ }
19
+ analyzeSource(sourceText, relativePath, language) {
20
+ let result;
21
+ switch (language) {
22
+ case 'typescript':
23
+ case 'javascript':
24
+ result = (0, typescript_js_1.parseTypeScript)(sourceText, relativePath);
25
+ break;
26
+ case 'python':
27
+ result = (0, python_js_1.parsePython)(sourceText, relativePath);
28
+ break;
29
+ case 'sql':
30
+ result = (0, sql_js_1.parseSql)(sourceText, relativePath);
31
+ break;
32
+ default:
33
+ result = (0, generic_js_1.parseGeneric)(sourceText, relativePath, language);
34
+ break;
35
+ }
36
+ return {
37
+ summary: result.summary,
38
+ astMetadata: result.metadata,
39
+ analyzerVersion: exports.CURRENT_ANALYZER_VERSION,
40
+ schemaVersion: exports.CURRENT_SCHEMA_VERSION,
41
+ };
42
+ }
43
+ }
44
+ exports.CodeAnalyzer = CodeAnalyzer;
45
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAkC;AAClC,2DAA0D;AAC1D,mDAAkD;AAClD,6CAA4C;AAC5C,qDAAoD;AAGvC,QAAA,wBAAwB,GAAG,OAAO,CAAC;AACnC,QAAA,sBAAsB,GAAG,CAAC,CAAC;AASxC,MAAa,YAAY;IAChB,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,YAAoB,EAAE,QAAgB;QACnF,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEM,aAAa,CAAC,UAAkB,EAAE,YAAoB,EAAE,QAAgB;QAC7E,IAAI,MAAkD,CAAC;QAEvD,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY;gBACf,MAAM,GAAG,IAAA,+BAAe,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACnD,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,GAAG,IAAA,uBAAW,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBAC/C,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,GAAG,IAAA,iBAAQ,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBAC5C,MAAM;YACR;gBACE,MAAM,GAAG,IAAA,yBAAY,EAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAC1D,MAAM;QACV,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,QAAQ;YAC5B,eAAe,EAAE,gCAAwB;YACzC,aAAa,EAAE,8BAAsB;SACtC,CAAC;IACJ,CAAC;CACF;AAhCD,oCAgCC"}
@@ -0,0 +1,6 @@
1
+ export * from './analyzer.js';
2
+ export * from './parsers/typescript.js';
3
+ export * from './parsers/python.js';
4
+ export * from './parsers/sql.js';
5
+ export * from './parsers/generic.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./analyzer.js"), exports);
18
+ __exportStar(require("./parsers/typescript.js"), exports);
19
+ __exportStar(require("./parsers/python.js"), exports);
20
+ __exportStar(require("./parsers/sql.js"), exports);
21
+ __exportStar(require("./parsers/generic.js"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,0DAAwC;AACxC,sDAAoC;AACpC,mDAAiC;AACjC,uDAAqC"}
@@ -0,0 +1,6 @@
1
+ import { AstMetadata } from '@norescan/shared';
2
+ export declare function parseGeneric(sourceText: string, fileName: string, language: string): {
3
+ metadata: AstMetadata;
4
+ summary: string;
5
+ };
6
+ //# sourceMappingURL=generic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../src/parsers/generic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsC,MAAM,kBAAkB,CAAC;AAEnF,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAoF/H"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseGeneric = parseGeneric;
4
+ function parseGeneric(sourceText, fileName, language) {
5
+ const symbols = [];
6
+ const exports = [];
7
+ // JSON files
8
+ if (language === 'json') {
9
+ try {
10
+ const parsed = JSON.parse(sourceText);
11
+ const keys = Object.keys(parsed).slice(0, 10);
12
+ return {
13
+ metadata: {
14
+ symbols: keys.map((k) => ({ name: k, kind: 'property', line: 1, exported: true })),
15
+ imports: [],
16
+ exports: keys.map((k) => ({ name: k, kind: 'variable' })),
17
+ },
18
+ summary: `JSON configuration with keys: ${keys.join(', ')}`,
19
+ };
20
+ }
21
+ catch {
22
+ return { metadata: { symbols: [], imports: [], exports: [] }, summary: `JSON file ${fileName}` };
23
+ }
24
+ }
25
+ // Go / Rust / Java symbol regex matching
26
+ const lines = sourceText.split(/\r?\n/);
27
+ for (let i = 0; i < lines.length; i++) {
28
+ const line = lines[i].trim();
29
+ const lineNum = i + 1;
30
+ // Go: func (r *Receiver) Name(...) or func Name(...)
31
+ if (language === 'go') {
32
+ const funcMatch = line.match(/^func\s+(?:\([^)]+\)\s+)?([A-Za-z0-9_]+)\s*\(/);
33
+ if (funcMatch) {
34
+ const name = funcMatch[1];
35
+ const isExported = /^[A-Z]/.test(name);
36
+ symbols.push({ name, kind: 'function', line: lineNum, exported: isExported });
37
+ if (isExported)
38
+ exports.push({ name, kind: 'function' });
39
+ }
40
+ const typeMatch = line.match(/^type\s+([A-Za-z0-9_]+)\s+(?:struct|interface)/);
41
+ if (typeMatch) {
42
+ const name = typeMatch[1];
43
+ const isExported = /^[A-Z]/.test(name);
44
+ symbols.push({ name, kind: 'type', line: lineNum, exported: isExported });
45
+ if (isExported)
46
+ exports.push({ name, kind: 'type' });
47
+ }
48
+ }
49
+ // Rust: pub fn name(...) or fn name(...)
50
+ if (language === 'rust') {
51
+ const fnMatch = line.match(/^(?:pub\s+)?(?:async\s+)?fn\s+([A-Za-z0-9_]+)\s*\(/);
52
+ if (fnMatch) {
53
+ const name = fnMatch[1];
54
+ const isExported = line.startsWith('pub ');
55
+ symbols.push({ name, kind: 'function', line: lineNum, exported: isExported });
56
+ if (isExported)
57
+ exports.push({ name, kind: 'function' });
58
+ }
59
+ const structMatch = line.match(/^(?:pub\s+)?(?:struct|enum)\s+([A-Za-z0-9_]+)/);
60
+ if (structMatch) {
61
+ const name = structMatch[1];
62
+ const isExported = line.startsWith('pub ');
63
+ symbols.push({ name, kind: 'type', line: lineNum, exported: isExported });
64
+ if (isExported)
65
+ exports.push({ name, kind: 'type' });
66
+ }
67
+ }
68
+ // Java: public class Name or public void name(...)
69
+ if (language === 'java') {
70
+ const classMatch = line.match(/^public\s+class\s+([A-Za-z0-9_]+)/);
71
+ if (classMatch) {
72
+ const name = classMatch[1];
73
+ symbols.push({ name, kind: 'class', line: lineNum, exported: true });
74
+ exports.push({ name, kind: 'class' });
75
+ }
76
+ }
77
+ }
78
+ const parts = [];
79
+ if (exports.length > 0)
80
+ parts.push(`Exports: ${exports.slice(0, 5).map((e) => e.name).join(', ')}`);
81
+ else if (symbols.length > 0)
82
+ parts.push(`Symbols: ${symbols.slice(0, 5).map((s) => s.name).join(', ')}`);
83
+ const summary = parts.length > 0 ? parts.join(' | ') : `${language} file ${fileName}`;
84
+ return {
85
+ metadata: { symbols, imports: [], exports },
86
+ summary,
87
+ };
88
+ }
89
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../src/parsers/generic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AstMetadata } from '@norescan/shared';
2
+ export declare function parsePython(sourceText: string, fileName: string): {
3
+ metadata: AstMetadata;
4
+ summary: string;
5
+ };
6
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/parsers/python.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAyE,MAAM,kBAAkB,CAAC;AAEtH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwF5G"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePython = parsePython;
4
+ function parsePython(sourceText, fileName) {
5
+ const lines = sourceText.split(/\r?\n/);
6
+ const imports = [];
7
+ const exports = [];
8
+ const symbols = [];
9
+ const routes = [];
10
+ let pendingDecorator = null;
11
+ for (let i = 0; i < lines.length; i++) {
12
+ const line = lines[i].trim();
13
+ const lineNum = i + 1;
14
+ // 1. Imports
15
+ // e.g. import os, sys
16
+ if (line.startsWith('import ')) {
17
+ const parts = line.slice(7).split(',').map((p) => p.trim());
18
+ for (const p of parts) {
19
+ imports.push({ source: p, specifiers: [p], isDynamic: false, isTypeOnly: false });
20
+ }
21
+ }
22
+ // e.g. from fastapi import FastAPI, Depends
23
+ if (line.startsWith('from ')) {
24
+ const match = line.match(/^from\s+([\w\.]+)\s+import\s+(.+)$/);
25
+ if (match) {
26
+ const source = match[1];
27
+ const specifiers = match[2].split(',').map((s) => s.trim().split(/\s+as\s+/)[0]);
28
+ imports.push({ source, specifiers, isDynamic: false, isTypeOnly: false });
29
+ }
30
+ }
31
+ // 2. Route decorators (FastAPI/Flask)
32
+ // e.g. @app.get("/users") or @router.post('/login')
33
+ const routeMatch = line.match(/^@(?:app|router)\.(get|post|put|delete|patch)\(\s*["']([^"']+)["']/i);
34
+ if (routeMatch) {
35
+ pendingDecorator = {
36
+ method: routeMatch[1].toUpperCase(),
37
+ path: routeMatch[2],
38
+ };
39
+ }
40
+ // 3. Classes
41
+ // e.g. class User(BaseModel):
42
+ const classMatch = line.match(/^class\s+([A-Za-z0-9_]+)(?:\(([^)]+)\))?:/);
43
+ if (classMatch) {
44
+ const name = classMatch[1];
45
+ symbols.push({ name, kind: 'class', line: lineNum, exported: !name.startsWith('_') });
46
+ if (!name.startsWith('_')) {
47
+ exports.push({ name, kind: 'class' });
48
+ }
49
+ }
50
+ // 4. Functions / async functions
51
+ // e.g. def get_user(id: int):
52
+ const funcMatch = line.match(/^(?:async\s+)?def\s+([A-Za-z0-9_]+)\s*\(([^)]*)\)/);
53
+ if (funcMatch) {
54
+ const name = funcMatch[1];
55
+ const isPublic = !name.startsWith('_');
56
+ symbols.push({ name, kind: 'function', line: lineNum, exported: isPublic });
57
+ if (isPublic) {
58
+ exports.push({ name, kind: 'function', signature: funcMatch[0] });
59
+ }
60
+ if (pendingDecorator) {
61
+ routes.push({
62
+ method: pendingDecorator.method,
63
+ path: pendingDecorator.path,
64
+ handler: name,
65
+ });
66
+ pendingDecorator = null;
67
+ }
68
+ }
69
+ }
70
+ const parts = [];
71
+ if (routes.length > 0)
72
+ parts.push(`Routes: ${routes.map((r) => `${r.method} ${r.path}`).join(', ')}`);
73
+ if (exports.length > 0)
74
+ parts.push(`Exports: ${exports.map((e) => `${e.kind} ${e.name}`).join(', ')}`);
75
+ if (imports.length > 0)
76
+ parts.push(`Imports: ${imports.length} modules`);
77
+ const summary = parts.length > 0 ? parts.join(' | ') : `Python module ${fileName}`;
78
+ return {
79
+ metadata: {
80
+ symbols,
81
+ imports,
82
+ exports,
83
+ routes: routes.length > 0 ? routes : undefined,
84
+ },
85
+ summary,
86
+ };
87
+ }
88
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/parsers/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AstMetadata } from '@norescan/shared';
2
+ export declare function parseSql(sourceText: string, fileName: string): {
3
+ metadata: AstMetadata;
4
+ summary: string;
5
+ };
6
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/parsers/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqC,MAAM,kBAAkB,CAAC;AAElF,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8CzG"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSql = parseSql;
4
+ function parseSql(sourceText, fileName) {
5
+ const models = [];
6
+ const symbols = [];
7
+ // Match CREATE TABLE [IF NOT EXISTS] tableName (...)
8
+ const tableRegex = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?([A-Za-z0-9_"]+)\s*\(([\s\S]*?)\);/gi;
9
+ let match;
10
+ while ((match = tableRegex.exec(sourceText)) !== null) {
11
+ const rawTableName = match[1].replace(/["`]/g, '');
12
+ const body = match[2];
13
+ const fields = [];
14
+ const lines = body.split(',').map((l) => l.trim()).filter((l) => l.length > 0);
15
+ for (const l of lines) {
16
+ if (l.startsWith('PRIMARY KEY') || l.startsWith('FOREIGN KEY') || l.startsWith('CONSTRAINT') || l.startsWith('UNIQUE')) {
17
+ continue;
18
+ }
19
+ const parts = l.split(/\s+/);
20
+ if (parts.length >= 2) {
21
+ fields.push({
22
+ name: parts[0].replace(/["`]/g, ''),
23
+ type: parts[1],
24
+ isOptional: !l.toUpperCase().includes('NOT NULL'),
25
+ });
26
+ }
27
+ }
28
+ models.push({ name: rawTableName, fields });
29
+ symbols.push({ name: rawTableName, kind: 'table', line: 1, exported: true });
30
+ }
31
+ const summary = models.length > 0
32
+ ? `Database tables: ${models.map((m) => m.name).join(', ')}`
33
+ : `SQL schema file ${fileName}`;
34
+ return {
35
+ metadata: {
36
+ symbols,
37
+ imports: [],
38
+ exports: models.map((m) => ({ name: m.name, kind: 'class' })),
39
+ models,
40
+ },
41
+ summary,
42
+ };
43
+ }
44
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/parsers/sql.ts"],"names":[],"mappings":";;AAEA,4BA8CC;AA9CD,SAAgB,QAAQ,CAAC,UAAkB,EAAE,QAAgB;IAC3D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,qDAAqD;IACrD,MAAM,UAAU,GAAG,gFAAgF,CAAC;IACpG,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,MAAM,MAAM,GAAgE,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvH,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACnC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;oBACd,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;iBAClD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC5D,CAAC,CAAC,mBAAmB,QAAQ,EAAE,CAAC;IAElC,OAAO;QACL,QAAQ,EAAE;YACR,OAAO;YACP,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM;SACP;QACD,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { AstMetadata } from '@norescan/shared';
2
+ export declare function parseTypeScript(sourceText: string, fileName: string): {
3
+ metadata: AstMetadata;
4
+ summary: string;
5
+ };
6
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/parsers/typescript.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAyE,MAAM,kBAAkB,CAAC;AAEtH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsIhH"}
@@ -0,0 +1,145 @@
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.parseTypeScript = parseTypeScript;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ function parseTypeScript(sourceText, fileName) {
9
+ const isJsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');
10
+ const sourceFile = typescript_1.default.createSourceFile(fileName, sourceText, typescript_1.default.ScriptTarget.Latest, true, isJsx ? typescript_1.default.ScriptKind.TSX : typescript_1.default.ScriptKind.TS);
11
+ const imports = [];
12
+ const exports = [];
13
+ const symbols = [];
14
+ const routes = [];
15
+ function visit(node) {
16
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
17
+ // 1. Imports
18
+ if (typescript_1.default.isImportDeclaration(node)) {
19
+ const moduleSpecifier = node.moduleSpecifier.text;
20
+ const specifiers = [];
21
+ let isTypeOnly = node.importClause?.isTypeOnly ?? false;
22
+ if (node.importClause?.name) {
23
+ specifiers.push(node.importClause.name.text);
24
+ }
25
+ if (node.importClause?.namedBindings) {
26
+ if (typescript_1.default.isNamedImports(node.importClause.namedBindings)) {
27
+ for (const el of node.importClause.namedBindings.elements) {
28
+ specifiers.push(el.name.text);
29
+ }
30
+ }
31
+ else if (typescript_1.default.isNamespaceImport(node.importClause.namedBindings)) {
32
+ specifiers.push(`* as ${node.importClause.namedBindings.name.text}`);
33
+ }
34
+ }
35
+ imports.push({
36
+ source: moduleSpecifier,
37
+ specifiers,
38
+ isTypeOnly,
39
+ isDynamic: false,
40
+ });
41
+ }
42
+ // 2. Call expressions (dynamic imports, routes, etc.)
43
+ if (typescript_1.default.isCallExpression(node)) {
44
+ const text = node.expression.getText(sourceFile);
45
+ // HTTP Route detection (e.g., app.get, router.post, route.delete)
46
+ const routeMatch = text.match(/(?:app|router|fastify|server)\.(get|post|put|delete|patch|all)$/i);
47
+ if (routeMatch && node.arguments.length > 0) {
48
+ const method = routeMatch[1].toUpperCase();
49
+ const firstArg = node.arguments[0];
50
+ if (typescript_1.default.isStringLiteral(firstArg)) {
51
+ routes.push({
52
+ method,
53
+ path: firstArg.text,
54
+ handler: text,
55
+ });
56
+ }
57
+ }
58
+ }
59
+ // 3. Functions
60
+ if (typescript_1.default.isFunctionDeclaration(node) && node.name) {
61
+ const isExported = hasExportModifier(node);
62
+ const name = node.name.text;
63
+ const signature = node.getText(sourceFile).split('{')[0].trim();
64
+ symbols.push({ name, kind: 'function', line, signature, exported: isExported });
65
+ if (isExported) {
66
+ exports.push({ name, kind: 'function', signature });
67
+ }
68
+ }
69
+ // 4. Classes
70
+ if (typescript_1.default.isClassDeclaration(node) && node.name) {
71
+ const isExported = hasExportModifier(node);
72
+ const name = node.name.text;
73
+ symbols.push({ name, kind: 'class', line, exported: isExported });
74
+ if (isExported) {
75
+ exports.push({ name, kind: 'class' });
76
+ }
77
+ }
78
+ // 5. Interfaces
79
+ if (typescript_1.default.isInterfaceDeclaration(node)) {
80
+ const isExported = hasExportModifier(node);
81
+ const name = node.name.text;
82
+ symbols.push({ name, kind: 'interface', line, exported: isExported });
83
+ if (isExported) {
84
+ exports.push({ name, kind: 'interface' });
85
+ }
86
+ }
87
+ // 6. Type Aliases
88
+ if (typescript_1.default.isTypeAliasDeclaration(node)) {
89
+ const isExported = hasExportModifier(node);
90
+ const name = node.name.text;
91
+ symbols.push({ name, kind: 'type', line, exported: isExported });
92
+ if (isExported) {
93
+ exports.push({ name, kind: 'type' });
94
+ }
95
+ }
96
+ // 7. Variable Statements (const foo = () => {}, export const x = 1)
97
+ if (typescript_1.default.isVariableStatement(node)) {
98
+ const isExported = hasExportModifier(node);
99
+ for (const decl of node.declarationList.declarations) {
100
+ if (typescript_1.default.isIdentifier(decl.name)) {
101
+ const name = decl.name.text;
102
+ const isFunc = decl.initializer && (typescript_1.default.isArrowFunction(decl.initializer) || typescript_1.default.isFunctionExpression(decl.initializer));
103
+ const kind = isFunc ? 'function' : 'variable';
104
+ symbols.push({ name, kind, line, exported: isExported });
105
+ if (isExported) {
106
+ exports.push({ name, kind });
107
+ }
108
+ }
109
+ }
110
+ }
111
+ typescript_1.default.forEachChild(node, visit);
112
+ }
113
+ visit(sourceFile);
114
+ const summary = generateSummary(fileName, symbols, exports, routes, imports);
115
+ return {
116
+ metadata: {
117
+ symbols,
118
+ imports,
119
+ exports,
120
+ routes: routes.length > 0 ? routes : undefined,
121
+ },
122
+ summary,
123
+ };
124
+ }
125
+ function hasExportModifier(node) {
126
+ const modifiers = typescript_1.default.canHaveModifiers(node) ? typescript_1.default.getModifiers(node) : undefined;
127
+ return Boolean(modifiers?.some((m) => m.kind === typescript_1.default.SyntaxKind.ExportKeyword));
128
+ }
129
+ function generateSummary(fileName, symbols, exports, routes, imports) {
130
+ const parts = [];
131
+ if (routes.length > 0) {
132
+ parts.push(`Routes: ${routes.map((r) => `${r.method} ${r.path}`).join(', ')}`);
133
+ }
134
+ if (exports.length > 0) {
135
+ parts.push(`Exports: ${exports.map((e) => `${e.kind} ${e.name}`).join(', ')}`);
136
+ }
137
+ else if (symbols.length > 0) {
138
+ parts.push(`Symbols: ${symbols.slice(0, 5).map((s) => s.name).join(', ')}`);
139
+ }
140
+ if (imports.length > 0) {
141
+ parts.push(`Imports from ${imports.length} modules`);
142
+ }
143
+ return parts.length > 0 ? parts.join(' | ') : `Source file ${fileName}`;
144
+ }
145
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/parsers/typescript.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "@norescan/analyzer",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.2",
4
+ "description": "Multi-language AST and structural code analyzer for norescan",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "dependencies": {
8
+ "@norescan/shared": "0.1.2",
9
+ "typescript": "^5.8.2"
10
+ },
11
+ "devDependencies": {
12
+ "@types/node": "^22.13.10",
13
+ "vitest": "^3.0.8"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "license": "Apache-2.0",
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "homepage": "https://github.com/th3karn/NoReScan#readme",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/th3karn/NoReScan.git",
26
+ "directory": "packages/analyzer"
27
+ },
28
+ "keywords": [
29
+ "norescan",
30
+ "analyzer",
31
+ "ast",
32
+ "typescript-compiler",
33
+ "python-ast",
34
+ "symbols",
35
+ "routes"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "clean": "rimraf dist",
40
+ "typecheck": "tsc --noEmit",
41
+ "test": "vitest run"
42
+ }
6
43
  }