Module: Language::Node

Extended by:
Utils::Output::Mixin
Defined in:
language/node.rb

Overview

Helper functions for Node formulae.

Defined Under Namespace

Modules: Shebang

Class Attribute Summary collapse

Class Method Summary collapse

Methods included from Utils::Output::Mixin

issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, opoo_without_github_actions_annotation, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_uninstalled, pretty_unmarked, pretty_upgradable, pretty_warning

Class Attribute Details

.env_setBoolean?

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:

  • (Boolean, nil)


17
18
19
# File 'language/node.rb', line 17

def env_set
  @env_set
end

Class Method Details

.local_npm_install_args(ignore_scripts: true) ⇒ 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:

  • ignore_scripts (Boolean) (defaults to: true)

Returns:



105
106
107
108
109
110
111
112
113
114
# File 'language/node.rb', line 105

def self.local_npm_install_args(ignore_scripts: true)
  setup_npm_environment
  # npm install args for local style module format
  # Delay packages published in the last day so builds are less likely to
  # install a freshly compromised npm release or dependency.
  %w[
    --loglevel=silly
    --build-from-source
  ] + npm_install_security_args(ignore_scripts:)
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:



21
22
23
# File 'language/node.rb', line 21

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

.npm_install_security_args(ignore_scripts: true) ⇒ 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:

  • ignore_scripts (Boolean) (defaults to: true)

Returns:



26
27
28
29
30
31
32
33
34
35
# File 'language/node.rb', line 26

def self.npm_install_security_args(ignore_scripts: true)
  args = %W[
    --min-release-age=#{Homebrew::RELEASE_COOLDOWN_DAYS}
    --#{npm_cache_config}
  ]

  args << "--ignore-scripts" if ignore_scripts

  args
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:



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'language/node.rb', line 38

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.fetch(-1).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.



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'language/node.rb', line 64

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, ignore_scripts: true) ⇒ 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:

  • libexec (Pathname)
  • ignore_scripts (Boolean) (defaults to: true)

Returns:



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'language/node.rb', line 79

def self.std_npm_install_args(libexec, ignore_scripts: true)
  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
  # Delay packages published in the last day so builds are less likely to
  # install a freshly compromised npm release or dependency.
  args = %w[
    --loglevel=silly
    --global
    --build-from-source
  ] + npm_install_security_args(ignore_scripts:) + %W[
    --prefix=#{libexec}
    #{Dir.pwd}/#{pack}
  ]

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

  args
end