Detects Drupal projects via composer.json drupal/* deps; extracts routes from *.routing.yml (route nodes + references edges to controllers/forms/entity handlers) and Drupal hook implementations from .module/.install/.theme/.inc. Adds yaml/twig as file-level languages and excludes core/contrib by default. Resolves #268.
124 lines
3.3 KiB
TypeScript
124 lines
3.3 KiB
TypeScript
/**
|
|
* Framework Resolver Registry
|
|
*
|
|
* Manages framework-specific resolvers.
|
|
*/
|
|
|
|
import { FrameworkResolver, ResolutionContext } from '../types';
|
|
import type { Language } from '../../types';
|
|
import { drupalResolver } from './drupal';
|
|
import { laravelResolver } from './laravel';
|
|
import { expressResolver } from './express';
|
|
import { nestjsResolver } from './nestjs';
|
|
import { reactResolver } from './react';
|
|
import { svelteResolver } from './svelte';
|
|
import { vueResolver } from './vue';
|
|
import { djangoResolver, flaskResolver, fastapiResolver } from './python';
|
|
import { railsResolver } from './ruby';
|
|
import { springResolver } from './java';
|
|
import { goResolver } from './go';
|
|
import { rustResolver } from './rust';
|
|
import { aspnetResolver } from './csharp';
|
|
import { swiftUIResolver, uikitResolver, vaporResolver } from './swift';
|
|
|
|
/**
|
|
* All registered framework resolvers
|
|
*/
|
|
const FRAMEWORK_RESOLVERS: FrameworkResolver[] = [
|
|
// PHP
|
|
laravelResolver,
|
|
drupalResolver,
|
|
// JavaScript/TypeScript
|
|
expressResolver,
|
|
nestjsResolver,
|
|
reactResolver,
|
|
svelteResolver,
|
|
vueResolver,
|
|
// Python
|
|
djangoResolver,
|
|
flaskResolver,
|
|
fastapiResolver,
|
|
// Ruby
|
|
railsResolver,
|
|
// Java
|
|
springResolver,
|
|
// Go
|
|
goResolver,
|
|
// Rust
|
|
rustResolver,
|
|
// C#
|
|
aspnetResolver,
|
|
// Swift
|
|
swiftUIResolver,
|
|
uikitResolver,
|
|
vaporResolver,
|
|
];
|
|
|
|
/**
|
|
* Get all framework resolvers
|
|
*/
|
|
export function getAllFrameworkResolvers(): FrameworkResolver[] {
|
|
return FRAMEWORK_RESOLVERS;
|
|
}
|
|
|
|
/**
|
|
* Get a resolver by name
|
|
*/
|
|
export function getFrameworkResolver(name: string): FrameworkResolver | undefined {
|
|
return FRAMEWORK_RESOLVERS.find((r) => r.name === name);
|
|
}
|
|
|
|
/**
|
|
* Detect which frameworks are used in a project
|
|
*/
|
|
export function detectFrameworks(context: ResolutionContext): FrameworkResolver[] {
|
|
return FRAMEWORK_RESOLVERS.filter((resolver) => {
|
|
try {
|
|
return resolver.detect(context);
|
|
} catch {
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Filter a list of detected frameworks down to ones that apply to a given language.
|
|
* Frameworks without an explicit `languages` list are treated as universal.
|
|
*/
|
|
export function getApplicableFrameworks(
|
|
detected: FrameworkResolver[],
|
|
language: Language
|
|
): FrameworkResolver[] {
|
|
return detected.filter(
|
|
(fw) => !fw.languages || fw.languages.includes(language)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Register a custom framework resolver
|
|
*/
|
|
export function registerFrameworkResolver(resolver: FrameworkResolver): void {
|
|
// Remove existing resolver with same name
|
|
const index = FRAMEWORK_RESOLVERS.findIndex((r) => r.name === resolver.name);
|
|
if (index !== -1) {
|
|
FRAMEWORK_RESOLVERS.splice(index, 1);
|
|
}
|
|
FRAMEWORK_RESOLVERS.push(resolver);
|
|
}
|
|
|
|
// Re-export framework resolvers
|
|
export { drupalResolver } from './drupal';
|
|
export { laravelResolver, FACADE_MAPPINGS } from './laravel';
|
|
export { expressResolver } from './express';
|
|
export { nestjsResolver } from './nestjs';
|
|
export { reactResolver } from './react';
|
|
export { svelteResolver } from './svelte';
|
|
export { vueResolver } from './vue';
|
|
export { djangoResolver, flaskResolver, fastapiResolver } from './python';
|
|
export { railsResolver } from './ruby';
|
|
export { springResolver } from './java';
|
|
export { goResolver } from './go';
|
|
export { rustResolver } from './rust';
|
|
export { aspnetResolver } from './csharp';
|
|
export { swiftUIResolver, uikitResolver, vaporResolver } from './swift';
|