@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.
Files changed (43) hide show
  1. package/bin/forge.js +18 -2
  2. package/dist/client.cjs.map +1 -1
  3. package/dist/client.mjs.map +1 -1
  4. package/dist/lint/cli.d.ts +9 -0
  5. package/dist/lint/cli.js +228 -0
  6. package/dist/lint/cli.js.map +1 -0
  7. package/dist/lint/config.d.ts +6 -0
  8. package/dist/lint/config.js +49 -0
  9. package/dist/lint/config.js.map +1 -0
  10. package/dist/lint/dependency_collector.d.ts +39 -0
  11. package/dist/lint/dependency_collector.js +205 -0
  12. package/dist/lint/dependency_collector.js.map +1 -0
  13. package/dist/lint/errors.d.ts +4 -0
  14. package/dist/lint/errors.js +10 -0
  15. package/dist/lint/errors.js.map +1 -0
  16. package/dist/lint/eslint_loader.d.ts +3 -0
  17. package/dist/lint/eslint_loader.js +11 -0
  18. package/dist/lint/eslint_loader.js.map +1 -0
  19. package/dist/lint/route_parser.d.ts +2 -0
  20. package/dist/lint/route_parser.js +236 -0
  21. package/dist/lint/route_parser.js.map +1 -0
  22. package/dist/lint/tests/dependency_collector.test.d.ts +1 -0
  23. package/dist/lint/tests/dependency_collector.test.js +220 -0
  24. package/dist/lint/tests/dependency_collector.test.js.map +1 -0
  25. package/dist/lint/tests/fixtures/svelte/mixed/utils/format.d.ts +2 -0
  26. package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js +7 -0
  27. package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js.map +1 -0
  28. package/dist/lint/tests/fixtures/svelte/typescript/helper.d.ts +7 -0
  29. package/dist/lint/tests/fixtures/svelte/typescript/helper.js +7 -0
  30. package/dist/lint/tests/fixtures/svelte/typescript/helper.js.map +1 -0
  31. package/dist-ssr/server.cjs +8 -7
  32. package/dist-ssr/server.cjs.map +1 -1
  33. package/dist-ssr/server.js +2 -1
  34. package/dist-ssr/server.js.map +1 -1
  35. package/dist-ssr/static.cjs +1 -1
  36. package/dist-ssr/static.js +1 -1
  37. package/dist-ssr/{url_parser-C-aLYzi3.cjs → url_parser-BGkQselu.cjs} +5 -235
  38. package/dist-ssr/url_parser-BGkQselu.cjs.map +1 -0
  39. package/dist-ssr/{url_parser-BY7Z0l_n.js → url_parser-DHQiBy_-.js} +2 -232
  40. package/dist-ssr/url_parser-DHQiBy_-.js.map +1 -0
  41. package/package.json +17 -4
  42. package/dist-ssr/url_parser-BY7Z0l_n.js.map +0 -1
  43. package/dist-ssr/url_parser-C-aLYzi3.cjs.map +0 -1
@@ -0,0 +1,9 @@
1
+ export interface LintOptions {
2
+ fix?: boolean;
3
+ deps?: boolean;
4
+ files: string[];
5
+ help?: boolean;
6
+ warnings?: boolean;
7
+ }
8
+ export declare function parseArgs(args: string[]): LintOptions;
9
+ export declare function runLint(args: string[]): Promise<number>;
@@ -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,6 @@
1
+ import type { Linter } from 'eslint';
2
+ /**
3
+ * Dynamically loads the lint configuration for zero-setup linting.
4
+ * Supports TypeScript in Svelte files out of the box.
5
+ */
6
+ export declare function loadLintConfig(): Promise<Linter.Config[]>;
@@ -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,4 @@
1
+ export declare class ESLintNotInstalledError extends Error {
2
+ name: "ESLintNotInstalledError";
3
+ constructor();
4
+ }
@@ -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,3 @@
1
+ type ESLintModule = typeof import('eslint');
2
+ export declare function loadESLint(): Promise<ESLintModule>;
3
+ export {};
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export declare function findRouteConfig(rootDir: string): Promise<string | null>;
2
+ export declare function getSvelteFilesFromRoutes(cwd: string): Promise<string[]>;