@@ -2,6 +2,7 @@ import type { RuleContext } from '../types.js';
22import fs from 'fs' ;
33import path from 'path' ;
44import { getPackageJsons } from './get-package-json.js' ;
5+ import { getNodeModule } from './get-node-module.js' ;
56import { getFilename , getSourceCode } from './compat.js' ;
67import { createCache } from './cache.js' ;
78
@@ -170,6 +171,23 @@ function getSvelteKitContext(
170171
171172const svelteVersionCache = createCache < SvelteContext [ 'svelteVersion' ] > ( ) ;
172173
174+ function checkAndSetSvelteVersion (
175+ version : string ,
176+ filePath : string
177+ ) : SvelteContext [ 'svelteVersion' ] | null {
178+ const major = extractMajorVersion ( version , false ) ;
179+ if ( major == null ) {
180+ svelteVersionCache . set ( filePath , null ) ;
181+ return null ;
182+ }
183+ if ( major === '3' || major === '4' ) {
184+ svelteVersionCache . set ( filePath , '3/4' ) ;
185+ return '3/4' ;
186+ }
187+ svelteVersionCache . set ( filePath , major as SvelteContext [ 'svelteVersion' ] ) ;
188+ return major as SvelteContext [ 'svelteVersion' ] ;
189+ }
190+
173191export function getSvelteVersion ( filePath : string ) : SvelteContext [ 'svelteVersion' ] {
174192 const cached = svelteVersionCache . get ( filePath ) ;
175193 if ( cached ) return cached ;
@@ -187,32 +205,45 @@ export function getSvelteVersion(filePath: string): SvelteContext['svelteVersion
187205 if ( typeof version !== 'string' ) {
188206 continue ;
189207 }
190- const major = extractMajorVersion ( version , false ) ;
191- if ( major === '3' || major === '4' ) {
192- svelteVersionCache . set ( filePath , '3/4' ) ;
193- return '3/4' ;
208+ const result = checkAndSetSvelteVersion ( version , filePath ) ;
209+ if ( result != null ) {
210+ return result ;
194211 }
195- svelteVersionCache . set ( filePath , major as SvelteContext [ 'svelteVersion' ] ) ;
196- return major as SvelteContext [ 'svelteVersion' ] ;
197212 }
198213 } catch {
199214 /** do nothing */
200215 }
201216
217+ const nodeModule = getNodeModule ( 'svelte' , filePath ) ;
218+ if ( nodeModule ) {
219+ try {
220+ const packageJson = JSON . parse (
221+ fs . readFileSync ( path . join ( nodeModule , 'package.json' ) , 'utf8' )
222+ ) ;
223+ const result = checkAndSetSvelteVersion ( packageJson . version , filePath ) ;
224+ if ( result != null ) {
225+ return result ;
226+ }
227+ } catch {
228+ /** do nothing */
229+ }
230+ }
231+
202232 svelteVersionCache . set ( filePath , null ) ;
203233 return null ;
204234}
205235
206236const svelteKitVersionCache = createCache < SvelteContext [ 'svelteKitVersion' ] > ( ) ;
207237
208- /**
209- * Check givin file is under SvelteKit project.
210- *
211- * If it runs on browser, it always returns true.
212- *
213- * @param filePath A file path.
214- * @returns
215- */
238+ function checkAndSetSvelteKitVersion (
239+ version : string ,
240+ filePath : string
241+ ) : SvelteContext [ 'svelteKitVersion' ] {
242+ const major = extractMajorVersion ( version , true ) as SvelteContext [ 'svelteKitVersion' ] ;
243+ svelteKitVersionCache . set ( filePath , major ) ;
244+ return major ;
245+ }
246+
216247function getSvelteKitVersion ( filePath : string ) : SvelteContext [ 'svelteKitVersion' ] {
217248 const cached = svelteKitVersionCache . get ( filePath ) ;
218249 if ( cached ) return cached ;
@@ -225,30 +256,45 @@ function getSvelteKitVersion(filePath: string): SvelteContext['svelteKitVersion'
225256
226257 try {
227258 const packageJsons = getPackageJsons ( filePath ) ;
228- if ( packageJsons . length === 0 ) return null ;
229- if ( packageJsons [ 0 ] . name === 'eslint-plugin-svelte' ) {
230- // Hack: CI removes `@sveltejs/kit` and it returns false and test failed.
231- // So always it returns 2 if it runs on the package.
232- svelteKitVersionCache . set ( filePath , '2' ) ;
233- return '2' ;
234- }
259+ if ( packageJsons . length > 0 ) {
260+ if ( packageJsons [ 0 ] . name === 'eslint-plugin-svelte' ) {
261+ // Hack: CI removes `@sveltejs/kit` and it returns false and test failed.
262+ // So always it returns 2 if it runs on the package.
263+ svelteKitVersionCache . set ( filePath , '2' ) ;
264+ return '2' ;
265+ }
235266
236- for ( const packageJson of packageJsons ) {
237- const version =
238- packageJson . dependencies ?. [ '@sveltejs/kit' ] ??
239- packageJson . devDependencies ?. [ '@sveltejs/kit' ] ;
240- if ( typeof version !== 'string' ) {
241- svelteKitVersionCache . set ( filePath , null ) ;
242- return null ;
267+ for ( const packageJson of packageJsons ) {
268+ const version =
269+ packageJson . dependencies ?. [ '@sveltejs/kit' ] ??
270+ packageJson . devDependencies ?. [ '@sveltejs/kit' ] ;
271+ if ( typeof version === 'string' ) {
272+ const result = checkAndSetSvelteKitVersion ( version , filePath ) ;
273+ if ( result != null ) {
274+ return result ;
275+ }
276+ }
243277 }
244- const major = extractMajorVersion ( version , true ) as SvelteContext [ 'svelteKitVersion' ] ;
245- svelteKitVersionCache . set ( filePath , major ) ;
246- return major ;
247278 }
248279 } catch {
249280 /** do nothing */
250281 }
251282
283+ const nodeModule = getNodeModule ( '@sveltejs/kit' , filePath ) ;
284+ if ( nodeModule ) {
285+ try {
286+ const packageJson = JSON . parse (
287+ fs . readFileSync ( path . join ( nodeModule , 'package.json' ) , 'utf8' )
288+ ) ;
289+ const result = checkAndSetSvelteKitVersion ( packageJson . version , filePath ) ;
290+ if ( result != null ) {
291+ return result ;
292+ }
293+ } catch {
294+ /** do nothing */
295+ }
296+ }
297+
252298 svelteKitVersionCache . set ( filePath , null ) ;
253299 return null ;
254300}
0 commit comments