@archlinter/core 0.4.1

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.
Files changed (3) hide show
  1. package/index.d.ts +147 -0
  2. package/index.js +292 -0
  3. package/package.json +49 -0
package/index.d.ts ADDED
@@ -0,0 +1,147 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ export interface JsScanOptions {
7
+ /** Path to config file */
8
+ configPath?: string;
9
+ /** Only run these detectors (by ID) */
10
+ detectors?: Array<string>;
11
+ /** Exclude these detectors (by ID) */
12
+ excludeDetectors?: Array<string>;
13
+ /** Minimum severity to report */
14
+ minSeverity?: string;
15
+ /** Minimum score to report */
16
+ minScore?: number;
17
+ /** Enable caching (default: true) */
18
+ cache?: boolean;
19
+ /** Enable git integration (default: true) */
20
+ git?: boolean;
21
+ }
22
+ export interface JsScanResult {
23
+ smells: Array<JsSmellWithExplanation>;
24
+ summary: JsSummary;
25
+ files: Array<JsFileInfo>;
26
+ grade: JsArchitectureGrade;
27
+ projectPath: string;
28
+ }
29
+ export interface JsSmellWithExplanation {
30
+ smell: JsSmell;
31
+ explanation: JsExplanation;
32
+ }
33
+ export interface JsSmell {
34
+ smellType: string;
35
+ severity: string;
36
+ files: Array<string>;
37
+ locations: Array<JsLocationDetail>;
38
+ /** Additional metrics as JSON */
39
+ metrics: Record<string, unknown>;
40
+ cluster?: JsCycleCluster;
41
+ }
42
+ export interface JsLocationDetail {
43
+ file: string;
44
+ line: number;
45
+ column?: number;
46
+ range?: JsCodeRange;
47
+ description: string;
48
+ }
49
+ export interface JsCodeRange {
50
+ startLine: number;
51
+ startColumn: number;
52
+ endLine: number;
53
+ endColumn: number;
54
+ }
55
+ export interface JsExplanation {
56
+ problem: string;
57
+ reason: string;
58
+ risks: Array<string>;
59
+ recommendations: Array<string>;
60
+ }
61
+ export interface JsSummary {
62
+ filesAnalyzed: number;
63
+ totalSmells: number;
64
+ cyclicDependencies: number;
65
+ cycleClusters: number;
66
+ filesInCycles: number;
67
+ godModules: number;
68
+ deadCode: number;
69
+ deadSymbols: number;
70
+ highComplexityFunctions: number;
71
+ unstableInterfaces: number;
72
+ featureEnvy: number;
73
+ shotgunSurgery: number;
74
+ hubDependencies: number;
75
+ }
76
+ export interface JsArchitectureGrade {
77
+ score: number;
78
+ level: string;
79
+ density: number;
80
+ }
81
+ export interface JsFileInfo {
82
+ path: string;
83
+ relativePath: string;
84
+ imports: Array<JsImportInfo>;
85
+ exports: Array<JsExportInfo>;
86
+ metrics: JsFileMetrics;
87
+ }
88
+ export interface JsImportInfo {
89
+ source: string;
90
+ names: Array<string>;
91
+ line: number;
92
+ isDefault: boolean;
93
+ isNamespace: boolean;
94
+ }
95
+ export interface JsExportInfo {
96
+ name: string;
97
+ kind: string;
98
+ isDefault: boolean;
99
+ source?: string;
100
+ }
101
+ export interface JsFileMetrics {
102
+ lines: number;
103
+ complexity?: number;
104
+ fanIn: number;
105
+ fanOut: number;
106
+ }
107
+ export interface JsCycleCluster {
108
+ files: Array<string>;
109
+ hotspots: Array<JsCycleHotspot>;
110
+ criticalEdges: Array<JsCriticalEdge>;
111
+ }
112
+ export interface JsCycleHotspot {
113
+ file: string;
114
+ inDegree: number;
115
+ outDegree: number;
116
+ }
117
+ export interface JsCriticalEdge {
118
+ from: string;
119
+ to: string;
120
+ line: number;
121
+ range?: JsCodeRange;
122
+ impact: string;
123
+ }
124
+ export interface JsDetectorInfo {
125
+ id: string;
126
+ name: string;
127
+ description: string;
128
+ defaultEnabled: boolean;
129
+ isDeep: boolean;
130
+ }
131
+ export interface JsConfig {
132
+ ignore: Array<string>;
133
+ aliases: Record<string, string>;
134
+ thresholds: Record<string, unknown>;
135
+ entryPoints: Array<string>;
136
+ enableGit: boolean;
137
+ }
138
+ export declare function scan(
139
+ path: string,
140
+ options?: JsScanOptions | undefined | null
141
+ ): Promise<JsScanResult>;
142
+ export declare function scanSync(
143
+ path: string,
144
+ options?: JsScanOptions | undefined | null
145
+ ): JsScanResult;
146
+ export declare function loadConfig(path?: string | undefined | null): JsConfig;
147
+ export declare function getDetectors(): Array<JsDetectorInfo>;
package/index.js ADDED
@@ -0,0 +1,292 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /* prettier-ignore */
4
+
5
+ /* auto-generated by NAPI-RS */
6
+
7
+ const { existsSync, readFileSync } = require('fs')
8
+ const { join } = require('path');
9
+
10
+ const { platform, arch } = process;
11
+
12
+ let nativeBinding = null;
13
+ let localFileExisted = false;
14
+ let loadError = null;
15
+
16
+ function isMusl() {
17
+ // For Node 10
18
+ if (!process.report || typeof process.report.getReport !== 'function') {
19
+ try {
20
+ const lddPath = require('child_process').execSync('which ldd').toString().trim();
21
+ return readFileSync(lddPath, 'utf8').includes('musl');
22
+ } catch (e) {
23
+ return true;
24
+ }
25
+ } else {
26
+ const { glibcVersionRuntime } = process.report.getReport().header;
27
+ return !glibcVersionRuntime;
28
+ }
29
+ }
30
+
31
+ switch (platform) {
32
+ case 'android':
33
+ switch (arch) {
34
+ case 'arm64':
35
+ localFileExisted = existsSync(join(__dirname, 'archlint.android-arm64.node'));
36
+ try {
37
+ if (localFileExisted) {
38
+ nativeBinding = require('./archlint.android-arm64.node');
39
+ } else {
40
+ nativeBinding = require('@archlinter/core-android-arm64');
41
+ }
42
+ } catch (e) {
43
+ loadError = e;
44
+ }
45
+ break;
46
+ case 'arm':
47
+ localFileExisted = existsSync(join(__dirname, 'archlint.android-arm-eabi.node'));
48
+ try {
49
+ if (localFileExisted) {
50
+ nativeBinding = require('./archlint.android-arm-eabi.node');
51
+ } else {
52
+ nativeBinding = require('@archlinter/core-android-arm-eabi');
53
+ }
54
+ } catch (e) {
55
+ loadError = e;
56
+ }
57
+ break;
58
+ default:
59
+ throw new Error(`Unsupported architecture on Android ${arch}`);
60
+ }
61
+ break;
62
+ case 'win32':
63
+ switch (arch) {
64
+ case 'x64':
65
+ localFileExisted = existsSync(join(__dirname, 'archlint.win32-x64-msvc.node'));
66
+ try {
67
+ if (localFileExisted) {
68
+ nativeBinding = require('./archlint.win32-x64-msvc.node');
69
+ } else {
70
+ nativeBinding = require('@archlinter/core-win32-x64-msvc');
71
+ }
72
+ } catch (e) {
73
+ loadError = e;
74
+ }
75
+ break;
76
+ case 'ia32':
77
+ localFileExisted = existsSync(join(__dirname, 'archlint.win32-ia32-msvc.node'));
78
+ try {
79
+ if (localFileExisted) {
80
+ nativeBinding = require('./archlint.win32-ia32-msvc.node');
81
+ } else {
82
+ nativeBinding = require('@archlinter/core-win32-ia32-msvc');
83
+ }
84
+ } catch (e) {
85
+ loadError = e;
86
+ }
87
+ break;
88
+ case 'arm64':
89
+ localFileExisted = existsSync(join(__dirname, 'archlint.win32-arm64-msvc.node'));
90
+ try {
91
+ if (localFileExisted) {
92
+ nativeBinding = require('./archlint.win32-arm64-msvc.node');
93
+ } else {
94
+ nativeBinding = require('@archlinter/core-win32-arm64-msvc');
95
+ }
96
+ } catch (e) {
97
+ loadError = e;
98
+ }
99
+ break;
100
+ default:
101
+ throw new Error(`Unsupported architecture on Windows: ${arch}`);
102
+ }
103
+ break;
104
+ case 'darwin':
105
+ localFileExisted = existsSync(join(__dirname, 'archlint.darwin-universal.node'));
106
+ try {
107
+ if (localFileExisted) {
108
+ nativeBinding = require('./archlint.darwin-universal.node');
109
+ } else {
110
+ nativeBinding = require('@archlinter/core-darwin-universal');
111
+ }
112
+ break;
113
+ } catch {}
114
+ switch (arch) {
115
+ case 'x64':
116
+ localFileExisted = existsSync(join(__dirname, 'archlint.darwin-x64.node'));
117
+ try {
118
+ if (localFileExisted) {
119
+ nativeBinding = require('./archlint.darwin-x64.node');
120
+ } else {
121
+ nativeBinding = require('@archlinter/core-darwin-x64');
122
+ }
123
+ } catch (e) {
124
+ loadError = e;
125
+ }
126
+ break;
127
+ case 'arm64':
128
+ localFileExisted = existsSync(join(__dirname, 'archlint.darwin-arm64.node'));
129
+ try {
130
+ if (localFileExisted) {
131
+ nativeBinding = require('./archlint.darwin-arm64.node');
132
+ } else {
133
+ nativeBinding = require('@archlinter/core-darwin-arm64');
134
+ }
135
+ } catch (e) {
136
+ loadError = e;
137
+ }
138
+ break;
139
+ default:
140
+ throw new Error(`Unsupported architecture on macOS: ${arch}`);
141
+ }
142
+ break;
143
+ case 'freebsd':
144
+ if (arch !== 'x64') {
145
+ throw new Error(`Unsupported architecture on FreeBSD: ${arch}`);
146
+ }
147
+ localFileExisted = existsSync(join(__dirname, 'archlint.freebsd-x64.node'));
148
+ try {
149
+ if (localFileExisted) {
150
+ nativeBinding = require('./archlint.freebsd-x64.node');
151
+ } else {
152
+ nativeBinding = require('@archlinter/core-freebsd-x64');
153
+ }
154
+ } catch (e) {
155
+ loadError = e;
156
+ }
157
+ break;
158
+ case 'linux':
159
+ switch (arch) {
160
+ case 'x64':
161
+ if (isMusl()) {
162
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-x64-musl.node'));
163
+ try {
164
+ if (localFileExisted) {
165
+ nativeBinding = require('./archlint.linux-x64-musl.node');
166
+ } else {
167
+ nativeBinding = require('@archlinter/core-linux-x64-musl');
168
+ }
169
+ } catch (e) {
170
+ loadError = e;
171
+ }
172
+ } else {
173
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-x64-gnu.node'));
174
+ try {
175
+ if (localFileExisted) {
176
+ nativeBinding = require('./archlint.linux-x64-gnu.node');
177
+ } else {
178
+ nativeBinding = require('@archlinter/core-linux-x64-gnu');
179
+ }
180
+ } catch (e) {
181
+ loadError = e;
182
+ }
183
+ }
184
+ break;
185
+ case 'arm64':
186
+ if (isMusl()) {
187
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-arm64-musl.node'));
188
+ try {
189
+ if (localFileExisted) {
190
+ nativeBinding = require('./archlint.linux-arm64-musl.node');
191
+ } else {
192
+ nativeBinding = require('@archlinter/core-linux-arm64-musl');
193
+ }
194
+ } catch (e) {
195
+ loadError = e;
196
+ }
197
+ } else {
198
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-arm64-gnu.node'));
199
+ try {
200
+ if (localFileExisted) {
201
+ nativeBinding = require('./archlint.linux-arm64-gnu.node');
202
+ } else {
203
+ nativeBinding = require('@archlinter/core-linux-arm64-gnu');
204
+ }
205
+ } catch (e) {
206
+ loadError = e;
207
+ }
208
+ }
209
+ break;
210
+ case 'arm':
211
+ if (isMusl()) {
212
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-arm-musleabihf.node'));
213
+ try {
214
+ if (localFileExisted) {
215
+ nativeBinding = require('./archlint.linux-arm-musleabihf.node');
216
+ } else {
217
+ nativeBinding = require('@archlinter/core-linux-arm-musleabihf');
218
+ }
219
+ } catch (e) {
220
+ loadError = e;
221
+ }
222
+ } else {
223
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-arm-gnueabihf.node'));
224
+ try {
225
+ if (localFileExisted) {
226
+ nativeBinding = require('./archlint.linux-arm-gnueabihf.node');
227
+ } else {
228
+ nativeBinding = require('@archlinter/core-linux-arm-gnueabihf');
229
+ }
230
+ } catch (e) {
231
+ loadError = e;
232
+ }
233
+ }
234
+ break;
235
+ case 'riscv64':
236
+ if (isMusl()) {
237
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-riscv64-musl.node'));
238
+ try {
239
+ if (localFileExisted) {
240
+ nativeBinding = require('./archlint.linux-riscv64-musl.node');
241
+ } else {
242
+ nativeBinding = require('@archlinter/core-linux-riscv64-musl');
243
+ }
244
+ } catch (e) {
245
+ loadError = e;
246
+ }
247
+ } else {
248
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-riscv64-gnu.node'));
249
+ try {
250
+ if (localFileExisted) {
251
+ nativeBinding = require('./archlint.linux-riscv64-gnu.node');
252
+ } else {
253
+ nativeBinding = require('@archlinter/core-linux-riscv64-gnu');
254
+ }
255
+ } catch (e) {
256
+ loadError = e;
257
+ }
258
+ }
259
+ break;
260
+ case 's390x':
261
+ localFileExisted = existsSync(join(__dirname, 'archlint.linux-s390x-gnu.node'));
262
+ try {
263
+ if (localFileExisted) {
264
+ nativeBinding = require('./archlint.linux-s390x-gnu.node');
265
+ } else {
266
+ nativeBinding = require('@archlinter/core-linux-s390x-gnu');
267
+ }
268
+ } catch (e) {
269
+ loadError = e;
270
+ }
271
+ break;
272
+ default:
273
+ throw new Error(`Unsupported architecture on Linux: ${arch}`);
274
+ }
275
+ break;
276
+ default:
277
+ throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`);
278
+ }
279
+
280
+ if (!nativeBinding) {
281
+ if (loadError) {
282
+ throw loadError;
283
+ }
284
+ throw new Error(`Failed to load native binding`);
285
+ }
286
+
287
+ const { scan, scanSync, loadConfig, getDetectors } = nativeBinding;
288
+
289
+ module.exports.scan = scan;
290
+ module.exports.scanSync = scanSync;
291
+ module.exports.loadConfig = loadConfig;
292
+ module.exports.getDetectors = getDetectors;
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@archlinter/core",
3
+ "version": "0.4.1",
4
+ "description": "Core library for archlint - programmatic API",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/archlinter/archlint.git",
9
+ "directory": "packages/core"
10
+ },
11
+ "main": "index.js",
12
+ "types": "index.d.ts",
13
+ "files": [
14
+ "index.js",
15
+ "index.d.ts",
16
+ "*.node"
17
+ ],
18
+ "napi": {
19
+ "name": "archlint",
20
+ "triples": {
21
+ "defaults": true,
22
+ "additional": [
23
+ "x86_64-unknown-linux-musl",
24
+ "aarch64-unknown-linux-gnu",
25
+ "aarch64-apple-darwin"
26
+ ]
27
+ }
28
+ },
29
+ "optionalDependencies": {
30
+ "@archlinter/core-win32-x64-msvc": "0.4.1",
31
+ "@archlinter/core-darwin-x64": "0.4.1",
32
+ "@archlinter/core-linux-x64-gnu": "0.4.1",
33
+ "@archlinter/core-linux-x64-musl": "0.4.1",
34
+ "@archlinter/core-linux-arm64-gnu": "0.4.1",
35
+ "@archlinter/core-darwin-arm64": "0.4.1"
36
+ },
37
+ "engines": {
38
+ "node": ">=18"
39
+ },
40
+ "scripts": {
41
+ "build": "napi build --release --platform --cargo-cwd ../../crates/archlint-napi .",
42
+ "build:debug": "napi build --platform --cargo-cwd ../../crates/archlint-napi .",
43
+ "test": "vitest run",
44
+ "prepublishOnly": "napi prepublish -t npm"
45
+ },
46
+ "devDependencies": {
47
+ "@napi-rs/cli": "^2.18.0"
48
+ }
49
+ }