@noego/forge 0.1.22 → 0.1.24
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/bin/forge.js +18 -2
- package/dist/client.cjs.map +1 -1
- package/dist/client.mjs.map +1 -1
- package/dist/lint/cli.d.ts +9 -0
- package/dist/lint/cli.js +228 -0
- package/dist/lint/cli.js.map +1 -0
- package/dist/lint/config.d.ts +6 -0
- package/dist/lint/config.js +49 -0
- package/dist/lint/config.js.map +1 -0
- package/dist/lint/dependency_collector.d.ts +39 -0
- package/dist/lint/dependency_collector.js +205 -0
- package/dist/lint/dependency_collector.js.map +1 -0
- package/dist/lint/errors.d.ts +4 -0
- package/dist/lint/errors.js +10 -0
- package/dist/lint/errors.js.map +1 -0
- package/dist/lint/eslint_loader.d.ts +3 -0
- package/dist/lint/eslint_loader.js +11 -0
- package/dist/lint/eslint_loader.js.map +1 -0
- package/dist/lint/route_parser.d.ts +2 -0
- package/dist/lint/route_parser.js +236 -0
- package/dist/lint/route_parser.js.map +1 -0
- package/dist/lint/tests/dependency_collector.test.d.ts +1 -0
- package/dist/lint/tests/dependency_collector.test.js +220 -0
- package/dist/lint/tests/dependency_collector.test.js.map +1 -0
- package/dist/lint/tests/fixtures/svelte/mixed/utils/format.d.ts +2 -0
- package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js +7 -0
- package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js.map +1 -0
- package/dist/lint/tests/fixtures/svelte/typescript/helper.d.ts +7 -0
- package/dist/lint/tests/fixtures/svelte/typescript/helper.js +7 -0
- package/dist/lint/tests/fixtures/svelte/typescript/helper.js.map +1 -0
- package/dist-ssr/server.cjs +8 -7
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +2 -1
- package/dist-ssr/server.js.map +1 -1
- package/dist-ssr/static.cjs +1 -1
- package/dist-ssr/static.js +1 -1
- package/dist-ssr/{url_parser-C-aLYzi3.cjs → url_parser-BGkQselu.cjs} +5 -235
- package/dist-ssr/url_parser-BGkQselu.cjs.map +1 -0
- package/dist-ssr/{url_parser-BY7Z0l_n.js → url_parser-DHQiBy_-.js} +2 -232
- package/dist-ssr/url_parser-DHQiBy_-.js.map +1 -0
- package/package.json +17 -4
- package/dist-ssr/url_parser-BY7Z0l_n.js.map +0 -1
- package/dist-ssr/url_parser-C-aLYzi3.cjs.map +0 -1
package/dist/lint/cli.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { loadESLint } from './eslint_loader.js';
|
|
2
|
+
import { DependencyCollector } from './dependency_collector.js';
|
|
3
|
+
import { getSvelteFilesFromRoutes } from './route_parser.js';
|
|
4
|
+
import { loadLintConfig } from './config.js';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
function showHelp() {
|
|
7
|
+
console.log(`
|
|
8
|
+
Usage: forge lint [options] [files...]
|
|
9
|
+
|
|
10
|
+
Lint Svelte and TypeScript files with smart dependency analysis.
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
--fix Automatically fix problems
|
|
14
|
+
--no-deps Skip dependency analysis for specified files
|
|
15
|
+
--warnings, --warn, -w Show warnings (hidden by default)
|
|
16
|
+
--help, -h Show this help message
|
|
17
|
+
|
|
18
|
+
Examples:
|
|
19
|
+
forge lint Lint all components from route config
|
|
20
|
+
forge lint src/App.svelte Lint App.svelte and all its dependencies
|
|
21
|
+
forge lint --fix Lint and auto-fix all files
|
|
22
|
+
forge lint --no-deps src/utils.ts Lint only utils.ts (no dependencies)
|
|
23
|
+
|
|
24
|
+
How it works:
|
|
25
|
+
- Without files: Discovers components from routes.yaml/openapi.yaml
|
|
26
|
+
- With files: Lints specified files + their dependencies (unless --no-deps)
|
|
27
|
+
- Fallback: Uses src/**/*.{svelte,ts,js} if no route config found
|
|
28
|
+
|
|
29
|
+
Notes:
|
|
30
|
+
- Zero-setup: No eslint.config.js required in your project
|
|
31
|
+
- Requires: npm install eslint eslint-plugin-svelte typescript-eslint
|
|
32
|
+
- Circular dependencies are reported as warnings
|
|
33
|
+
- Exit code 0 = no errors, 1 = errors found
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
export function parseArgs(args) {
|
|
37
|
+
const options = {
|
|
38
|
+
fix: false,
|
|
39
|
+
deps: true,
|
|
40
|
+
files: [],
|
|
41
|
+
help: false,
|
|
42
|
+
warnings: false,
|
|
43
|
+
};
|
|
44
|
+
for (let i = 0; i < args.length; i++) {
|
|
45
|
+
const arg = args[i];
|
|
46
|
+
if (arg === '--help' || arg === '-h') {
|
|
47
|
+
options.help = true;
|
|
48
|
+
}
|
|
49
|
+
else if (arg === '--fix') {
|
|
50
|
+
options.fix = true;
|
|
51
|
+
}
|
|
52
|
+
else if (arg === '--no-deps') {
|
|
53
|
+
options.deps = false;
|
|
54
|
+
}
|
|
55
|
+
else if (arg === '--warnings' || arg === '--warn' || arg === '-w') {
|
|
56
|
+
options.warnings = true;
|
|
57
|
+
}
|
|
58
|
+
else if (!arg.startsWith('-')) {
|
|
59
|
+
options.files.push(arg);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return options;
|
|
63
|
+
}
|
|
64
|
+
export async function runLint(args) {
|
|
65
|
+
const options = parseArgs(args);
|
|
66
|
+
// Handle --help flag
|
|
67
|
+
if (options.help) {
|
|
68
|
+
showHelp();
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
const cwd = process.cwd();
|
|
72
|
+
try {
|
|
73
|
+
// Load ESLint dynamically
|
|
74
|
+
const { ESLint } = await loadESLint();
|
|
75
|
+
let filesToLint = [];
|
|
76
|
+
if (options.files.length === 0) {
|
|
77
|
+
// Discover files the same way forge does - by parsing routes
|
|
78
|
+
console.log('Discovering files from route configuration...\n');
|
|
79
|
+
const routeFiles = await getSvelteFilesFromRoutes(cwd);
|
|
80
|
+
if (routeFiles.length > 0) {
|
|
81
|
+
filesToLint = routeFiles;
|
|
82
|
+
console.log(`Found ${filesToLint.length} component(s) from route configuration\n`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Fallback: No route config found, use glob patterns
|
|
86
|
+
console.log('⚠️ No route configuration found (routes.yaml, openapi.yaml, etc.)');
|
|
87
|
+
console.log(' Using fallback pattern: src/**/*.{svelte,ts,js}\n');
|
|
88
|
+
filesToLint = ['src/**/*.svelte', 'src/**/*.ts', 'src/**/*.js'];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Lint specific files with optional dependency analysis
|
|
93
|
+
for (const file of options.files) {
|
|
94
|
+
const absolutePath = path.isAbsolute(file)
|
|
95
|
+
? file
|
|
96
|
+
: path.resolve(cwd, file);
|
|
97
|
+
if (file.endsWith('.svelte') && options.deps) {
|
|
98
|
+
// Collect dependencies for Svelte files
|
|
99
|
+
const collector = new DependencyCollector({
|
|
100
|
+
recursive: true,
|
|
101
|
+
projectRoot: cwd,
|
|
102
|
+
});
|
|
103
|
+
const result = await collector.collect(absolutePath);
|
|
104
|
+
// Add all files from the dependency graph
|
|
105
|
+
for (const dep of result.dependencies) {
|
|
106
|
+
filesToLint.push(dep.file);
|
|
107
|
+
}
|
|
108
|
+
// Report circular dependencies as warnings
|
|
109
|
+
if (result.circular.length > 0) {
|
|
110
|
+
console.warn(`\n⚠️ Warning: Detected ${result.circular.length} circular dependencies:`);
|
|
111
|
+
for (const circ of result.circular) {
|
|
112
|
+
console.warn(` ${path.basename(circ.from)} ⟷ ${path.basename(circ.to)}`);
|
|
113
|
+
}
|
|
114
|
+
console.warn('');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Just lint the single file
|
|
119
|
+
filesToLint.push(absolutePath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Load built-in config for zero-setup linting
|
|
124
|
+
const config = await loadLintConfig();
|
|
125
|
+
// Create ESLint instance with built-in config
|
|
126
|
+
const eslint = new ESLint({
|
|
127
|
+
fix: options.fix,
|
|
128
|
+
overrideConfigFile: true, // Ignore any eslint.config.js in target project
|
|
129
|
+
overrideConfig: config,
|
|
130
|
+
});
|
|
131
|
+
console.log(`\nLinting ${filesToLint.length} file(s):\n`);
|
|
132
|
+
for (const file of filesToLint) {
|
|
133
|
+
console.log(` ${path.relative(cwd, file)}`);
|
|
134
|
+
}
|
|
135
|
+
console.log('');
|
|
136
|
+
// Lint the files
|
|
137
|
+
const results = await eslint.lintFiles(filesToLint);
|
|
138
|
+
// Apply fixes if requested
|
|
139
|
+
if (options.fix) {
|
|
140
|
+
await ESLint.outputFixes(results);
|
|
141
|
+
}
|
|
142
|
+
// Filter out warnings if --warnings flag not provided
|
|
143
|
+
const filteredResults = options.warnings
|
|
144
|
+
? results
|
|
145
|
+
: results.map((result) => ({
|
|
146
|
+
...result,
|
|
147
|
+
messages: result.messages.filter((msg) => msg.severity === 2), // 2 = error, 1 = warning
|
|
148
|
+
warningCount: 0,
|
|
149
|
+
}));
|
|
150
|
+
// Format results
|
|
151
|
+
const formatter = await eslint.loadFormatter('stylish');
|
|
152
|
+
const resultText = await formatter.format(filteredResults);
|
|
153
|
+
if (resultText) {
|
|
154
|
+
console.log(resultText);
|
|
155
|
+
}
|
|
156
|
+
// Calculate totals
|
|
157
|
+
const errorCount = results.reduce((sum, r) => sum + r.errorCount, 0);
|
|
158
|
+
const warningCount = results.reduce((sum, r) => sum + r.warningCount, 0);
|
|
159
|
+
// Print summary
|
|
160
|
+
if (errorCount === 0 && warningCount === 0) {
|
|
161
|
+
console.log('✓ No errors found\n');
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.log(`\nLint complete: ${errorCount} error(s), ${warningCount} warning(s)`);
|
|
165
|
+
if (options.fix) {
|
|
166
|
+
console.log('Fixed issues have been written to disk');
|
|
167
|
+
}
|
|
168
|
+
else if (errorCount > 0 || warningCount > 0) {
|
|
169
|
+
console.log('Run "forge lint --fix" to auto-fix issues\n');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Return exit code
|
|
173
|
+
return errorCount > 0 ? 1 : 0;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
// Handle specific error types with better messages
|
|
177
|
+
if (error instanceof Error) {
|
|
178
|
+
// ESLint configuration errors
|
|
179
|
+
if (error.message.includes('Cannot find package') ||
|
|
180
|
+
error.message.includes('Cannot find module')) {
|
|
181
|
+
const packageMatch = error.message.match(/Cannot find (?:package|module) '([^']+)'/);
|
|
182
|
+
const packageName = packageMatch ? packageMatch[1] : 'unknown';
|
|
183
|
+
console.error('\n❌ ESLint Configuration Error\n');
|
|
184
|
+
console.error(` Missing package: ${packageName}`);
|
|
185
|
+
console.error('\n This package is imported in your eslint.config.js but not installed.');
|
|
186
|
+
console.error('\n To fix this, install the missing package:');
|
|
187
|
+
console.error(` npm install --save-dev ${packageName}`);
|
|
188
|
+
console.error('');
|
|
189
|
+
return 1;
|
|
190
|
+
}
|
|
191
|
+
// Config file missing error
|
|
192
|
+
if (error.message.includes('Could not find config file')) {
|
|
193
|
+
console.error('\n❌ ESLint Configuration Missing\n');
|
|
194
|
+
console.error(' No eslint.config.js found in your project.');
|
|
195
|
+
console.error('\n To fix this, create an eslint.config.js file:');
|
|
196
|
+
console.error(' npm install --save-dev eslint eslint-plugin-svelte');
|
|
197
|
+
console.error(' npx eslint --init');
|
|
198
|
+
console.error('');
|
|
199
|
+
return 1;
|
|
200
|
+
}
|
|
201
|
+
// No files found error
|
|
202
|
+
if (error.message.includes('No files matching')) {
|
|
203
|
+
console.error('\n❌ No Files Found\n');
|
|
204
|
+
console.error(' ' + error.message);
|
|
205
|
+
console.error('\n Try specifying files explicitly:');
|
|
206
|
+
console.error(' forge lint src/Component.svelte');
|
|
207
|
+
console.error('');
|
|
208
|
+
return 1;
|
|
209
|
+
}
|
|
210
|
+
// Generic error with better formatting
|
|
211
|
+
console.error('\n❌ Error\n');
|
|
212
|
+
console.error(' ' + error.message);
|
|
213
|
+
// Show stack trace only in verbose mode or if it's not a known error type
|
|
214
|
+
if (process.env.DEBUG || process.env.VERBOSE) {
|
|
215
|
+
console.error('\n Stack trace:');
|
|
216
|
+
console.error(error.stack?.split('\n').map(line => ' ' + line).join('\n'));
|
|
217
|
+
}
|
|
218
|
+
console.error('');
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
console.error('\n❌ Unexpected Error\n');
|
|
222
|
+
console.error(' ', error);
|
|
223
|
+
console.error('');
|
|
224
|
+
}
|
|
225
|
+
return 1;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/lint/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamically loads the lint configuration for zero-setup linting.
|
|
3
|
+
* Supports TypeScript in Svelte files out of the box.
|
|
4
|
+
*/
|
|
5
|
+
export async function loadLintConfig() {
|
|
6
|
+
// Load required packages dynamically
|
|
7
|
+
const [js, tseslint, sveltePlugin, globals] = await Promise.all([
|
|
8
|
+
import('@eslint/js').then((m) => m.default),
|
|
9
|
+
import('typescript-eslint').then((m) => m.default),
|
|
10
|
+
import('eslint-plugin-svelte').then((m) => m.default),
|
|
11
|
+
import('globals').then((m) => m.default),
|
|
12
|
+
]);
|
|
13
|
+
return [
|
|
14
|
+
js.configs.recommended,
|
|
15
|
+
...tseslint.configs.recommended,
|
|
16
|
+
...sveltePlugin.configs['flat/recommended'],
|
|
17
|
+
{
|
|
18
|
+
languageOptions: {
|
|
19
|
+
ecmaVersion: 2022,
|
|
20
|
+
sourceType: 'module',
|
|
21
|
+
globals: {
|
|
22
|
+
...globals.browser,
|
|
23
|
+
...globals.node,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
rules: {
|
|
27
|
+
// Svelte 5 specific rules
|
|
28
|
+
'svelte/valid-compile': 'error',
|
|
29
|
+
// Disable rules that TypeScript handles
|
|
30
|
+
'no-unused-vars': 'off',
|
|
31
|
+
'no-undef': 'off',
|
|
32
|
+
// Unused vars as warning, not error
|
|
33
|
+
'@typescript-eslint/no-unused-vars': 'warn',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
files: ['**/*.svelte'],
|
|
38
|
+
languageOptions: {
|
|
39
|
+
parserOptions: {
|
|
40
|
+
parser: tseslint.parser,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
ignores: ['node_modules', 'dist', 'dist-ssr', '.svelte-kit'],
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,qCAAqC;IACrC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3C,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;IAEH,OAAO;QACL,EAAE,CAAC,OAAO,CAAC,WAAW;QACtB,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW;QAC/B,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC3C;YACE,eAAe,EAAE;gBACf,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE;oBACP,GAAG,OAAO,CAAC,OAAO;oBAClB,GAAG,OAAO,CAAC,IAAI;iBAChB;aACF;YACD,KAAK,EAAE;gBACL,0BAA0B;gBAC1B,sBAAsB,EAAE,OAAO;gBAE/B,wCAAwC;gBACxC,gBAAgB,EAAE,KAAK;gBACvB,UAAU,EAAE,KAAK;gBAEjB,oCAAoC;gBACpC,mCAAmC,EAAE,MAAM;aAC5C;SACF;QACD;YACE,KAAK,EAAE,CAAC,aAAa,CAAC;YACtB,eAAe,EAAE;gBACf,aAAa,EAAE;oBACb,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACxB;aACF;SACF;QACD;YACE,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC;SAC7D;KACiB,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface DependencyInfo {
|
|
2
|
+
file: string;
|
|
3
|
+
imports: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface CircularDependency {
|
|
6
|
+
from: string;
|
|
7
|
+
to: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MissingImport {
|
|
10
|
+
file: string;
|
|
11
|
+
importPath: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CollectionResult {
|
|
14
|
+
dependencies: DependencyInfo[];
|
|
15
|
+
circular: CircularDependency[];
|
|
16
|
+
missing: MissingImport[];
|
|
17
|
+
}
|
|
18
|
+
export interface CollectorOptions {
|
|
19
|
+
recursive?: boolean;
|
|
20
|
+
reportMissing?: boolean;
|
|
21
|
+
aliases?: Record<string, string>;
|
|
22
|
+
projectRoot?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class DependencyCollector {
|
|
25
|
+
private visited;
|
|
26
|
+
private inProgress;
|
|
27
|
+
private dependencies;
|
|
28
|
+
private circular;
|
|
29
|
+
private missing;
|
|
30
|
+
private options;
|
|
31
|
+
private initialized;
|
|
32
|
+
constructor(options?: CollectorOptions);
|
|
33
|
+
collect(entryFile: string): Promise<CollectionResult>;
|
|
34
|
+
private traverse;
|
|
35
|
+
private extractJavaScript;
|
|
36
|
+
private isExternalPackage;
|
|
37
|
+
private resolveImport;
|
|
38
|
+
private tryResolveFile;
|
|
39
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { init, parse } from 'es-module-lexer';
|
|
4
|
+
export class DependencyCollector {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.visited = new Set();
|
|
7
|
+
this.inProgress = new Set();
|
|
8
|
+
this.dependencies = new Map();
|
|
9
|
+
this.circular = [];
|
|
10
|
+
this.missing = [];
|
|
11
|
+
this.initialized = false;
|
|
12
|
+
this.options = {
|
|
13
|
+
recursive: options.recursive ?? true,
|
|
14
|
+
reportMissing: options.reportMissing ?? false,
|
|
15
|
+
aliases: options.aliases ?? {},
|
|
16
|
+
projectRoot: options.projectRoot ?? process.cwd(),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async collect(entryFile) {
|
|
20
|
+
// Initialize es-module-lexer once
|
|
21
|
+
if (!this.initialized) {
|
|
22
|
+
await init;
|
|
23
|
+
this.initialized = true;
|
|
24
|
+
}
|
|
25
|
+
// Reset state for new collection
|
|
26
|
+
this.visited.clear();
|
|
27
|
+
this.inProgress.clear();
|
|
28
|
+
this.dependencies.clear();
|
|
29
|
+
this.circular = [];
|
|
30
|
+
this.missing = [];
|
|
31
|
+
const absolutePath = path.isAbsolute(entryFile)
|
|
32
|
+
? entryFile
|
|
33
|
+
: path.resolve(this.options.projectRoot, entryFile);
|
|
34
|
+
await this.traverse(absolutePath);
|
|
35
|
+
// Convert Map to array of DependencyInfo
|
|
36
|
+
const dependencies = [];
|
|
37
|
+
for (const [file, imports] of this.dependencies.entries()) {
|
|
38
|
+
dependencies.push({ file, imports });
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
dependencies,
|
|
42
|
+
circular: this.circular,
|
|
43
|
+
missing: this.missing,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async traverse(filePath) {
|
|
47
|
+
// Normalize the path
|
|
48
|
+
const normalizedPath = path.normalize(filePath);
|
|
49
|
+
// Check if already visited
|
|
50
|
+
if (this.visited.has(normalizedPath)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Check for circular dependency
|
|
54
|
+
if (this.inProgress.has(normalizedPath)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.inProgress.add(normalizedPath);
|
|
58
|
+
try {
|
|
59
|
+
// Read file content
|
|
60
|
+
const content = await fs.readFile(normalizedPath, 'utf-8');
|
|
61
|
+
// Extract JavaScript content (for .svelte files, extract <script> content)
|
|
62
|
+
const jsContent = this.extractJavaScript(content, normalizedPath);
|
|
63
|
+
// Parse imports using es-module-lexer
|
|
64
|
+
const [imports] = parse(jsContent);
|
|
65
|
+
const importPaths = [];
|
|
66
|
+
// Process each import
|
|
67
|
+
for (const imp of imports) {
|
|
68
|
+
const importSpecifier = imp.n;
|
|
69
|
+
if (!importSpecifier)
|
|
70
|
+
continue;
|
|
71
|
+
// Skip external packages (node_modules)
|
|
72
|
+
if (this.isExternalPackage(importSpecifier)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Resolve the import path
|
|
76
|
+
const resolvedPath = await this.resolveImport(importSpecifier, normalizedPath);
|
|
77
|
+
if (!resolvedPath) {
|
|
78
|
+
if (this.options.reportMissing) {
|
|
79
|
+
this.missing.push({
|
|
80
|
+
file: normalizedPath,
|
|
81
|
+
importPath: importSpecifier,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
importPaths.push(resolvedPath);
|
|
87
|
+
// Check for circular dependency before recursing
|
|
88
|
+
if (this.inProgress.has(resolvedPath)) {
|
|
89
|
+
this.circular.push({
|
|
90
|
+
from: normalizedPath,
|
|
91
|
+
to: resolvedPath,
|
|
92
|
+
});
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Recursively collect dependencies
|
|
96
|
+
if (this.options.recursive) {
|
|
97
|
+
await this.traverse(resolvedPath);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Store dependencies for this file
|
|
101
|
+
this.dependencies.set(normalizedPath, importPaths);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Re-throw file system errors (ENOENT, etc.)
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.inProgress.delete(normalizedPath);
|
|
109
|
+
this.visited.add(normalizedPath);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
extractJavaScript(content, filePath) {
|
|
113
|
+
// For .svelte files, extract script content
|
|
114
|
+
if (filePath.endsWith('.svelte')) {
|
|
115
|
+
let scriptContent = '';
|
|
116
|
+
// Match <script> tags (both regular and module)
|
|
117
|
+
// Handles <script>, <script lang="ts">, <script context="module">, etc.
|
|
118
|
+
const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi;
|
|
119
|
+
let match;
|
|
120
|
+
while ((match = scriptRegex.exec(content)) !== null) {
|
|
121
|
+
scriptContent += match[1] + '\n';
|
|
122
|
+
}
|
|
123
|
+
return scriptContent;
|
|
124
|
+
}
|
|
125
|
+
// For .ts, .js files, return content as-is
|
|
126
|
+
return content;
|
|
127
|
+
}
|
|
128
|
+
isExternalPackage(importPath) {
|
|
129
|
+
// External packages don't start with . or /
|
|
130
|
+
// They also don't start with configured aliases
|
|
131
|
+
if (importPath.startsWith('.') || importPath.startsWith('/')) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
// Check if it matches any configured alias
|
|
135
|
+
for (const alias of Object.keys(this.options.aliases)) {
|
|
136
|
+
if (importPath.startsWith(alias)) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Everything else is external
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
async resolveImport(importPath, fromFile) {
|
|
144
|
+
// Handle alias resolution first
|
|
145
|
+
for (const [alias, target] of Object.entries(this.options.aliases)) {
|
|
146
|
+
if (importPath.startsWith(alias)) {
|
|
147
|
+
const resolved = importPath.replace(alias, target);
|
|
148
|
+
importPath = path.resolve(this.options.projectRoot, resolved);
|
|
149
|
+
return this.tryResolveFile(importPath);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Handle relative imports
|
|
153
|
+
if (importPath.startsWith('.')) {
|
|
154
|
+
const dir = path.dirname(fromFile);
|
|
155
|
+
const resolved = path.resolve(dir, importPath);
|
|
156
|
+
return this.tryResolveFile(resolved);
|
|
157
|
+
}
|
|
158
|
+
// Handle absolute imports
|
|
159
|
+
if (importPath.startsWith('/')) {
|
|
160
|
+
return this.tryResolveFile(importPath);
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
async tryResolveFile(filePath) {
|
|
165
|
+
// Try exact path first
|
|
166
|
+
try {
|
|
167
|
+
const stat = await fs.stat(filePath);
|
|
168
|
+
if (stat.isFile()) {
|
|
169
|
+
return filePath;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Continue to try with extensions
|
|
174
|
+
}
|
|
175
|
+
// Try with common extensions
|
|
176
|
+
const extensions = ['.svelte', '.ts', '.js', '.tsx', '.jsx'];
|
|
177
|
+
for (const ext of extensions) {
|
|
178
|
+
const withExt = filePath + ext;
|
|
179
|
+
try {
|
|
180
|
+
const stat = await fs.stat(withExt);
|
|
181
|
+
if (stat.isFile()) {
|
|
182
|
+
return withExt;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Try index files
|
|
190
|
+
for (const ext of extensions) {
|
|
191
|
+
const indexFile = path.join(filePath, `index${ext}`);
|
|
192
|
+
try {
|
|
193
|
+
const stat = await fs.stat(indexFile);
|
|
194
|
+
if (stat.isFile()) {
|
|
195
|
+
return indexFile;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=dependency_collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency_collector.js","sourceRoot":"","sources":["../../src/lint/dependency_collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class ESLintNotInstalledError extends Error {
|
|
2
|
+
constructor() {
|
|
3
|
+
super('forge lint requires ESLint and eslint-plugin-svelte. Install them with:\n\n' +
|
|
4
|
+
' npm install eslint eslint-plugin-svelte\n\n' +
|
|
5
|
+
'Then create an eslint.config.js in your project root.\n' +
|
|
6
|
+
'See https://eslint.org/docs/user-guide/getting-started');
|
|
7
|
+
this.name = 'ESLintNotInstalledError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lint/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAGhD;QACE,KAAK,CACH,6EAA6E;YAC3E,+CAA+C;YAC/C,yDAAyD;YACzD,wDAAwD,CAC3D,CAAC;QARJ,SAAI,GAAG,yBAAkC,CAAC;IAS1C,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ESLintNotInstalledError } from './errors.js';
|
|
2
|
+
export async function loadESLint() {
|
|
3
|
+
try {
|
|
4
|
+
const eslint = await import('eslint');
|
|
5
|
+
return eslint;
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
throw new ESLintNotInstalledError();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=eslint_loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint_loader.js","sourceRoot":"","sources":["../../src/lint/eslint_loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAItD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,uBAAuB,EAAE,CAAC;IACtC,CAAC;AACH,CAAC"}
|