class Analyzer::Javascript::Fastify

Defined in:

analyzer/analyzers/javascript/fastify.cr

Constant Summary

AUTO_PREFIX_RE = /\bautoPrefix\s*=\s*['"]([^'"]+)['"]/

export const autoPrefix = '/x' (or CJS module.exports.autoPrefix = '/x') lets a route file declare its own autoload prefix. The \bautoPrefix\s*=\s*<string> shape matches the assignment but not a read like reply.redirect(autoPrefix).

AUTOLOAD_MARKERS_RE = Regex.union("@fastify/autoload", "fastify-autoload")

Markers that a file configures @fastify/autoload. Both the scoped package and the legacy bare name are matched so older projects work. Precompiled once — a single PCRE2-JIT scan replaces two naive String#includes? substring scans. Regex.union auto-escapes each literal, so it is provably equivalent to the OR-of-includes? it replaces.

HTTP_METHODS = ["get", "post", "put", "delete", "patch", "options", "head", "query"] of ::String
QUERY_METHOD_MARKERS_RE = Regex.union(/\baddHttpMethod\s*\(\s*['"]QUERY['"]/i, /fastify-http-query/)

Markers indicating that HTTP QUERY method support is registered.

ROUTE_CALL_RES = HTTP_METHODS.map do |m| {m, /\b(?:fastify|app|server)\s*\.\s*#{m}\s*\(\s*['"]([^'"]+)['"]/} end.to_h

Compiled once — an interpolated regex literal would otherwise be rebuilt (full PCRE2 compile) for every method on every line.

Class Method Summary

Instance Method Summary

Instance methods inherited from class Analyzer

analyze analyze, base_path : String base_path, base_paths : Array(String) base_paths, base_relative_path(path : String) : String base_relative_path, callees_needed? : Bool callees_needed?, content_matches?(content : String, markers : Regex) : Bool content_matches?, http_header_name(name : String) : String | Nil http_header_name, line_number_for_index(content : String, char_index : Int32) : Int32 line_number_for_index, logger : NoirLogger logger, parallel_analyze(files : Array(String), &block : String -> Nil) parallel_analyze, read_file_content(path : String) : String read_file_content, result : Array(Endpoint) result, tech : String tech, unique_params(params : Array(Param)) : Array(Param) unique_params, url : String url, web_root_path(path : String, markers : Array(String)) : String web_root_path

Constructor methods inherited from class Analyzer

new(options : Hash(String, YAML::Any)) new

Macros inherited from class Analyzer

analyzer_for(tech) analyzer_for

Instance methods inherited from module FileHelper

all_files : Array(String) all_files, get_files_by_basename(basename : String) : Array(String) get_files_by_basename, get_files_by_extension(extension : String) : Array(String) get_files_by_extension, get_files_by_extensions(extensions : Array(String)) : Array(String) get_files_by_extensions, get_files_by_prefix(prefix : String) : Array(String) get_files_by_prefix, get_files_by_prefix_and_extension(prefix : String, extension : String) : Array(String) get_files_by_prefix_and_extension, get_files_by_relative_path(relative_path : String, root : String = "") : Array(String) get_files_by_relative_path, get_public_dir_files(base_path : String, folder : String) : Array(String) get_public_dir_files, get_public_files(base_path : String, anchors : Array(String) = ["shard.yml", "Gemfile"]) : Array(String) get_public_files, walked_path(expanded : String) : String walked_path

Class Method Detail

def self.tech_name : String #

[View source]

Instance Method Detail

def analyze #

[View source]
def extract_path_from_route_handler(line : String) : String #

[View source]
def line_to_endpoint(line : String, has_query : Bool = true) : Endpoint #

[View source]
def line_to_param(line : String) : Param #

[View source]
def tech : String #

Instance-side view of the same declaration. The per-file rescues live on this base class, which has no way to name the analyzer that is running inside them, so a skipped file could not be attributed to a tech. Deriving it from analyzer_for keeps the name written exactly once.


[View source]