index.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * Framework Resolver Registry
  3. *
  4. * Manages framework-specific resolvers.
  5. */
  6. import { FrameworkResolver, ResolutionContext } from '../types';
  7. import type { Language } from '../../types';
  8. import { laravelResolver } from './laravel';
  9. import { expressResolver } from './express';
  10. import { nestjsResolver } from './nestjs';
  11. import { reactResolver } from './react';
  12. import { svelteResolver } from './svelte';
  13. import { vueResolver } from './vue';
  14. import { djangoResolver, flaskResolver, fastapiResolver } from './python';
  15. import { railsResolver } from './ruby';
  16. import { springResolver } from './java';
  17. import { goResolver } from './go';
  18. import { rustResolver } from './rust';
  19. import { aspnetResolver } from './csharp';
  20. import { swiftUIResolver, uikitResolver, vaporResolver } from './swift';
  21. /**
  22. * All registered framework resolvers
  23. */
  24. const FRAMEWORK_RESOLVERS: FrameworkResolver[] = [
  25. // PHP
  26. laravelResolver,
  27. // JavaScript/TypeScript
  28. expressResolver,
  29. nestjsResolver,
  30. reactResolver,
  31. svelteResolver,
  32. vueResolver,
  33. // Python
  34. djangoResolver,
  35. flaskResolver,
  36. fastapiResolver,
  37. // Ruby
  38. railsResolver,
  39. // Java
  40. springResolver,
  41. // Go
  42. goResolver,
  43. // Rust
  44. rustResolver,
  45. // C#
  46. aspnetResolver,
  47. // Swift
  48. swiftUIResolver,
  49. uikitResolver,
  50. vaporResolver,
  51. ];
  52. /**
  53. * Get all framework resolvers
  54. */
  55. export function getAllFrameworkResolvers(): FrameworkResolver[] {
  56. return FRAMEWORK_RESOLVERS;
  57. }
  58. /**
  59. * Get a resolver by name
  60. */
  61. export function getFrameworkResolver(name: string): FrameworkResolver | undefined {
  62. return FRAMEWORK_RESOLVERS.find((r) => r.name === name);
  63. }
  64. /**
  65. * Detect which frameworks are used in a project
  66. */
  67. export function detectFrameworks(context: ResolutionContext): FrameworkResolver[] {
  68. return FRAMEWORK_RESOLVERS.filter((resolver) => {
  69. try {
  70. return resolver.detect(context);
  71. } catch {
  72. return false;
  73. }
  74. });
  75. }
  76. /**
  77. * Filter a list of detected frameworks down to ones that apply to a given language.
  78. * Frameworks without an explicit `languages` list are treated as universal.
  79. */
  80. export function getApplicableFrameworks(
  81. detected: FrameworkResolver[],
  82. language: Language
  83. ): FrameworkResolver[] {
  84. return detected.filter(
  85. (fw) => !fw.languages || fw.languages.includes(language)
  86. );
  87. }
  88. /**
  89. * Register a custom framework resolver
  90. */
  91. export function registerFrameworkResolver(resolver: FrameworkResolver): void {
  92. // Remove existing resolver with same name
  93. const index = FRAMEWORK_RESOLVERS.findIndex((r) => r.name === resolver.name);
  94. if (index !== -1) {
  95. FRAMEWORK_RESOLVERS.splice(index, 1);
  96. }
  97. FRAMEWORK_RESOLVERS.push(resolver);
  98. }
  99. // Re-export framework resolvers
  100. export { laravelResolver, FACADE_MAPPINGS } from './laravel';
  101. export { expressResolver } from './express';
  102. export { nestjsResolver } from './nestjs';
  103. export { reactResolver } from './react';
  104. export { svelteResolver } from './svelte';
  105. export { vueResolver } from './vue';
  106. export { djangoResolver, flaskResolver, fastapiResolver } from './python';
  107. export { railsResolver } from './ruby';
  108. export { springResolver } from './java';
  109. export { goResolver } from './go';
  110. export { rustResolver } from './rust';
  111. export { aspnetResolver } from './csharp';
  112. export { swiftUIResolver, uikitResolver, vaporResolver } from './swift';