Module: Language::Node

Defined in:
language/node.rb

Overview

Helper functions for Node formulae.

Defined Under Namespace

Modules: Shebang

Class Method Summary collapse

Class Method Details

.local_npm_install_argsArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



80
81
82
83
84
85
86
87
88
# File 'language/node.rb', line 80

def self.local_npm_install_args
  setup_npm_environment
  # npm install args for local style module format
  %W[
    -ddd
    --build-from-source
    --#{npm_cache_config}
  ]
end

.npm_cache_configString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



10
11
12
# File 'language/node.rb', line 10

def self.npm_cache_config
  "cache=#{HOMEBREW_CACHE}/npm_cache"
end

.pack_for_installationString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'language/node.rb', line 15

def self.pack_for_installation
  # Homebrew assumes the buildpath/testpath will always be disposable
  # and from npm 5.0.0 the logic changed so that when a directory is
  # fed to `npm install` only symlinks are created linking back to that
  # directory, consequently breaking that assumption. We require a tarball
  # because npm install creates a "real" installation when fed a tarball.
  package = Pathname("package.json")
  if package.exist?
    begin
      pkg_json = JSON.parse(package.read)
    rescue JSON::ParserError
      opoo "Could not parse package.json!"
      raise
    end
    prepare_removed = pkg_json["scripts"]&.delete("prepare")
    prepack_removed = pkg_json["scripts"]&.delete("prepack")
    postpack_removed = pkg_json["scripts"]&.delete("postpack")
    package.atomic_write(JSON.pretty_generate(pkg_json)) if prepare_removed || prepack_removed || postpack_removed
  end
  output = Utils.popen_read("npm", "pack", "--ignore-scripts")
  raise "npm failed to pack #{Dir.pwd}" if !$CHILD_STATUS.exitstatus.zero? || output.lines.empty?

  output.lines.last.chomp
end

.setup_npm_environmentvoid

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'language/node.rb', line 41

def self.setup_npm_environment
  # guard that this is only run once
  return if @env_set

  @env_set = T.let(true, T.nilable(T::Boolean))
  # explicitly use our npm and node-gyp executables instead of the user
  # managed ones in HOMEBREW_PREFIX/lib/node_modules which might be broken
  begin
    ENV.prepend_path "PATH", Formula["node"].opt_libexec/"bin"
  rescue FormulaUnavailableError
    nil
  end
end

.std_npm_install_args(libexec) ⇒ Array<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'language/node.rb', line 56

def self.std_npm_install_args(libexec)
  setup_npm_environment

  pack = pack_for_installation

  # npm 7 requires that these dirs exist before install
  (libexec/"lib").mkpath

  # npm install args for global style module format installed into libexec
  args = %W[
    -ddd
    --global
    --build-from-source
    --#{npm_cache_config}
    --prefix=#{libexec}
    #{Dir.pwd}/#{pack}
  ]

  args << "--unsafe-perm" if Process.uid.zero?

  args
end