class Detector::Javascript::Express

Defined in:

detector/detectors/javascript/express.cr

Constant Summary

SIGNAL = Regex.union(/require\(['"]express['"]\)/, /from ['"]express['"]/, /app\.use\(express\.json\(\)\)/, /app\.use\(express\.urlencoded\(\{ extended: true \}\)\)/)

Single precompiled alternation — one PCRE2 scan over the file instead of up to four separate .match passes. Regex.union wraps each branch verbatim, so the boolean result is identical.

Instance Method Summary

Instance methods inherited from class Detector

applicable?(filename : String) : Bool applicable?, detect(filename : String, file_contents : String) : Bool detect, gemfile_dependency?(file_contents : String, gem_name : String) : Bool gemfile_dependency?, gemspec_dependency?(file_contents : String, gem_name : String) : Bool gemspec_dependency?, idempotent? : Bool idempotent?, logger : NoirLogger logger, name : String name

Constructor methods inherited from class Detector

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

Macros inherited from class Detector

define_getter_methods(names) define_getter_methods

Instance Method Detail

def applicable?(filename : String) : Bool #
Description copied from class Detector

Cheap filename-only filter the detector pass uses to skip #detect on files the detector cannot possibly match. The default true preserves prior behavior (every detector runs on every file). Override with the same predicate the body of #detect starts with — e.g., filename.ends_with?(".py") for a Python framework detector — so the detector loop avoids the #detect dispatch on files outside the detector's language.

On large codebases (saleor's 4255 .py files) this lifts ~100 virtual #detect calls per file out of the hot loop because most detectors' inner first-line is exactly this kind of cheap filename check.


[View source]
def detect(filename : String, file_contents : String) : Bool #

[View source]
def set_name #

[View source]