Class: RailsAiContext::Introspectors::FrontendFrameworkIntrospector
- Inherits:
-
Object
- Object
- RailsAiContext::Introspectors::FrontendFrameworkIntrospector
- Extended by:
- StaticTier
- Defined in:
- lib/rails_ai_context/introspectors/frontend_framework_introspector.rb
Overview
Detects frontend frameworks, build tools, TypeScript config, monorepo layout, and component file counts from package.json, lockfiles, and bundler configs (Vite, Shakapacker, Webpacker).
Constant Summary collapse
- MAX_PACKAGE_JSON_SIZE =
256 KB
256 * 1024
- FRAMEWORK_MARKERS =
{ "react" => :react, "react-dom" => :react, "next" => :nextjs, "vue" => :vue, "nuxt" => :nuxt, "@angular/core" => :angular, "svelte" => :svelte, "@sveltejs/kit" => :sveltekit, "react-native" => :react_native, "expo" => :expo, "solid-js" => :solid, "preact" => :preact }.freeze
- MOUNTING_MARKERS =
{ "react_ujs" => :react_rails, "react-on-rails" => :react_on_rails, "@inertiajs/react" => :inertia, "@inertiajs/vue3" => :inertia, "@inertiajs/svelte" => :inertia, "vite-plugin-ruby" => :vite_rails, "vite-plugin-rails" => :vite_rails }.freeze
- STATE_MARKERS =
{ "redux" => "Redux", "@reduxjs/toolkit" => "Redux Toolkit", "zustand" => "Zustand", "jotai" => "Jotai", "pinia" => "Pinia", "vuex" => "Vuex", "mobx" => "MobX", "@tanstack/react-query" => "TanStack Query" }.freeze
- TEST_MARKERS =
{ "jest" => "Jest", "vitest" => "Vitest", "@playwright/test" => "Playwright", "cypress" => "Cypress", "@testing-library/react" => "Testing Library" }.freeze
- COMPONENT_EXTENSIONS =
%w[.jsx .tsx .vue .svelte].freeze
- SCAN_SKIP_DIRS =
%w[node_modules dist build .next coverage __tests__].freeze
- VITE_IMPORT_MARKERS =
{ "vite-plugin-ruby" => :vite_rails, "@vitejs/plugin-react" => :react, "@vitejs/plugin-vue" => :vue, "@sveltejs/vite-plugin-svelte" => :svelte }.freeze
Constants included from StaticTier
StaticTier::ALTERNATE_SOURCE, StaticTier::FILES_ONLY, StaticTier::KINDS, StaticTier::RUNTIME_ONLY
Instance Attribute Summary collapse
-
#app ⇒ Object
readonly
Returns the value of attribute app.
Instance Method Summary collapse
- #call ⇒ Object
-
#initialize(app) ⇒ FrontendFrameworkIntrospector
constructor
A new instance of FrontendFrameworkIntrospector.
Methods included from StaticTier
answers_statically?, static_tier, static_tier_declared?, unavailable_reason, validate_static_tier!
Constructor Details
#initialize(app) ⇒ FrontendFrameworkIntrospector
Returns a new instance of FrontendFrameworkIntrospector.
66 67 68 |
# File 'lib/rails_ai_context/introspectors/frontend_framework_introspector.rb', line 66 def initialize(app) @app = app end |
Instance Attribute Details
#app ⇒ Object (readonly)
Returns the value of attribute app.
15 16 17 |
# File 'lib/rails_ai_context/introspectors/frontend_framework_introspector.rb', line 15 def app @app end |
Instance Method Details
#call ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/rails_ai_context/introspectors/frontend_framework_introspector.rb', line 70 def call all_deps = read_package_json_deps frameworks = detect_frameworks(all_deps) mounting = detect_mounting_strategy(all_deps) state = detect_state_management(all_deps) testing = detect_testing(all_deps) pkg_mgr = detect_package_manager ts = detect_typescript mono = detect_monorepo(all_deps) build = detect_build_tool vite_fw = detect_vite_config_frameworks roots = detect_frontend_roots # Merge vite config detected frameworks into main frameworks hash vite_fw.each { |sym| frameworks[sym] ||= nil unless frameworks.key?(sym) } # Enrich each frontend root with component scan data enriched_roots = roots.map do |fr| full_path = File.join(root, fr[:path]) counts = scan_components(full_path) primary_fw = frameworks.keys.first version = frameworks.values.compact.first fr.merge( framework: primary_fw, version: version, component_count: counts.values.sum, component_dirs: counts ) end total_components = enriched_roots.sum { |r| r[:component_count] } { frontend_roots: enriched_roots, frameworks: frameworks, mounting_strategy: mounting, state_management: state, testing: testing, package_manager: pkg_mgr, typescript: ts, monorepo: mono, build_tool: build, api_clients: detect_api_clients(all_deps), component_libraries: detect_component_libraries(all_deps), summary: build_summary(frameworks, mounting, build, ts, total_components) } rescue => e { error: e. } end |