Module: ReactManifest::SymbolExtractor

Defined in:
lib/react_manifest/symbol_extractor.rb

Constant Summary collapse

DEFINITION_PATTERNS =
[
  /(?:const|let|var)\s+([A-Z][A-Za-z0-9_]*)\s*=/,
  /function\s+([A-Z][A-Za-z0-9_]*)\s*\(/,
  /class\s+([A-Z][A-Za-z0-9_]*)\s*(?:extends|\{)/,
  /(?:const|let|var)\s+(use[A-Z][A-Za-z0-9_]*)\s*=/,
  /function\s+(use[A-Z][A-Za-z0-9_]*)\s*\(/,
  /^export\s+default\s+(?:function|class)\s+([A-Z][A-Za-z0-9_]*)/,
  /^export\s+default\s+(?:function|class)\s+(use[A-Z][A-Za-z0-9_]*)/,
  /^export\s+(?:const|let|var)\s+([A-Z][A-Za-z0-9_]*)\s*=/,
  /^export\s+(?:const|let|var)\s+(use[A-Z][A-Za-z0-9_]*)\s*=/,
  /^export\s+function\s+([A-Z][A-Za-z0-9_]*)\s*\(/,
  /^export\s+function\s+(use[A-Z][A-Za-z0-9_]*)\s*\(/,
  /^export\s+class\s+([A-Z][A-Za-z0-9_]*)\s*(?:extends|\{)/
].freeze
PASCAL_TOKEN_PATTERN =
/\b([A-Z][A-Za-z0-9_]*)\b/
HOOK_TOKEN_PATTERN =
/\b(use[A-Z][A-Za-z0-9_]*)\b/
LIB_CALL_PATTERN =
/\b([a-z][A-Za-z0-9_]{2,})\s*\(/
JS_BUILTINS =
%w[
  require function return typeof instanceof delete void
  console document window location history navigator
  setTimeout setInterval clearTimeout clearInterval
  parseInt parseFloat isNaN isFinite encodeURI decodeURI
  fetch Promise Object Array String Number Boolean Math JSON
  Object Array String Number Boolean Symbol Map Set WeakMap
].freeze

Class Method Summary collapse

Class Method Details

.extract_definitions(content) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/react_manifest/symbol_extractor.rb', line 33

def extract_definitions(content)
  return [] unless content

  symbols = []
  DEFINITION_PATTERNS.each do |pattern|
    content.scan(pattern) { |m| symbols << m[0] }
  end
  symbols.uniq
end

.extract_usages(content) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/react_manifest/symbol_extractor.rb', line 43

def extract_usages(content)
  return [] unless content

  local_syms = Set.new
  DEFINITION_PATTERNS.each { |p| content.scan(p) { |m| local_syms << m[0] } }

  used = []

  content.scan(PASCAL_TOKEN_PATTERN) do |match|
    sym = match[0]
    used << sym unless local_syms.include?(sym)
  end

  content.scan(HOOK_TOKEN_PATTERN) do |match|
    sym = match[0]
    used << sym unless local_syms.include?(sym)
  end

  content.scan(LIB_CALL_PATTERN) do |match|
    sym = match[0]
    used << sym unless JS_BUILTINS.include?(sym) || local_syms.include?(sym)
  end

  used.uniq
end