blob: 13150a02bdc4cf371a1ecf7b8e28e64f28ad6724 [file] [log] [blame]
# frozen_string_literal: true
def node_version
File.foreach('javascript/selenium-webdriver/package.json') do |line|
return line.split(':').last.strip.tr('",', '') if line.include?('version')
end
end
def setup_npm_auth
npmrc = File.join(Dir.home, '.npmrc')
return if File.exist?(npmrc) && File.read(npmrc).include?('//registry.npmjs.org/:_authToken=')
token = ENV.fetch('NODE_AUTH_TOKEN', nil)
raise 'Missing npm credentials: set NODE_AUTH_TOKEN or configure ~/.npmrc' if token.nil? || token.empty?
auth_line = "//registry.npmjs.org/:_authToken=#{token}"
if File.exist?(npmrc)
File.open(npmrc, 'a') { |f| f.puts(auth_line) }
else
File.write(npmrc, "#{auth_line}\n")
end
File.chmod(0o600, npmrc)
end
def setup_github_npm_auth
token = ENV.fetch('GITHUB_TOKEN', nil)
raise 'Missing GitHub token: set GITHUB_TOKEN for nightly npm publish' if token.nil? || token.empty?
# Configure npm for GitHub Packages
npmrc = File.join(Dir.home, '.npmrc')
npmrc_content = [
"//npm.pkg.github.com/:_authToken=#{token}",
'@seleniumhq:registry=https://npm.pkg.github.com',
'always-auth=true'
].join("\n")
if File.exist?(npmrc)
File.open(npmrc, 'a') { |f| f.puts("\n#{npmrc_content}") }
else
File.write(npmrc, "#{npmrc_content}\n")
end
File.chmod(0o600, npmrc)
# Update package.json for GitHub Packages
package_json = 'javascript/selenium-webdriver/package.json'
content = File.read(package_json)
content = content.gsub('https://registry.npmjs.org/', 'https://npm.pkg.github.com')
content = content.gsub('"name": "selenium-webdriver"', '"name": "@seleniumhq/selenium-webdriver"')
File.write(package_json, content)
end
desc 'Build Node npm package'
task :build do |_task, arguments|
args = arguments.to_a
Bazel.execute('build', args, '//javascript/selenium-webdriver')
end
desc 'Pin JavaScript dependencies via pnpm lockfile'
task :pin do
Bazel.execute('run', ['--', 'install', '--dir', Dir.pwd, '--lockfile-only'], '@pnpm//:pnpm')
end
desc 'Update JavaScript dependencies and refresh lockfile (use "latest" to bump ranges)'
task :update, [:latest] do |_task, arguments|
args = ['--', 'update', '-r']
args << '--latest' if arguments[:latest] == 'latest'
args += ['--dir', Dir.pwd]
Bazel.execute('run', args, '@pnpm//:pnpm')
Rake::Task['node:pin'].invoke
end
desc 'Validate Node release credentials'
task :check_credentials do |_task, arguments|
nightly = arguments.to_a.include?('nightly')
next if nightly
npmrc = File.join(Dir.home, '.npmrc')
has_file = File.exist?(npmrc) && File.read(npmrc).include?('//registry.npmjs.org/:_authToken=')
has_env = ENV.fetch('NODE_AUTH_TOKEN', nil) && !ENV['NODE_AUTH_TOKEN'].empty?
raise 'Missing npm credentials: set NODE_AUTH_TOKEN or configure ~/.npmrc' unless has_file || has_env
end
desc 'Release Node npm package (use dry-run to test without publishing)'
task :release do |_task, arguments|
args = arguments.to_a
nightly = args.delete('nightly')
dry_run = args.delete('dry-run')
Rake::Task['node:check_credentials'].invoke(*(nightly ? ['nightly'] : [])) unless dry_run
if nightly
puts 'Updating Node version to nightly...'
Rake::Task['node:version'].invoke('nightly')
setup_github_npm_auth unless dry_run
else
setup_npm_auth unless dry_run
end
puts dry_run ? 'Running Node package dry-run...' : 'Running Node package release...'
target = '//javascript/selenium-webdriver:selenium-webdriver.publish'
bazel_args = ['--config=release']
bazel_args += ['--', '--dry-run=true'] if dry_run
Bazel.execute('run', bazel_args, target)
end
desc 'Verify Node package is published on npm'
task :verify do
SeleniumRake.verify_package_published("https://registry.npmjs.org/selenium-webdriver/#{node_version}")
end
desc 'Alias for node:release'
task deploy: :release
desc 'Generate and stage Node documentation'
task :docs do |_task, arguments|
if node_version.include?('nightly') && !arguments.to_a.include?('force')
abort('Aborting documentation update: nightly versions should not update docs.')
end
Rake::Task['node:docs_generate'].invoke
end
desc 'Generate Node documentation without staging'
task :docs_generate do
puts 'Generating Node documentation'
FileUtils.rm_rf('build/docs/api/javascript/')
Bazel.execute('run', [], '//javascript/selenium-webdriver:docs')
end
desc 'Install Node package locally via npm link'
task :install do
Bazel.execute('build', [], '//javascript/selenium-webdriver')
Dir.chdir('bazel-bin/javascript/selenium-webdriver/selenium-webdriver') do
sh 'npm', 'link'
end
end
desc 'Update JavaScript changelog'
task :changelogs do
header = "## #{node_version}\n"
SeleniumRake.update_changelog(node_version, 'javascript', 'javascript/selenium-webdriver/',
'javascript/selenium-webdriver/CHANGES.md', header)
end
desc 'Update Node version'
task :version, [:version] do |_task, arguments|
old_version = node_version
nightly = "-nightly#{Time.now.strftime('%Y%m%d%H%M')}"
new_version = SeleniumRake.updated_version(old_version, arguments[:version], nightly)
puts "Updating Node from #{old_version} to #{new_version}"
%w[javascript/selenium-webdriver/package.json javascript/selenium-webdriver/BUILD.bazel].each do |file|
text = File.read(file).gsub(old_version, new_version)
File.open(file, 'w') { |f| f.puts text }
end
end
desc 'Format JavaScript code with prettier'
task :format do
node_dir = File.expand_path('javascript/selenium-webdriver')
prettier_config = File.join(node_dir, '.prettierrc')
puts ' Running prettier...'
Bazel.execute('run', ['--', node_dir, '--write', "--config=#{prettier_config}", '--log-level=warn'],
'//javascript:prettier')
end
desc 'Run JavaScript linter (docs only for now, eslint needs bazel integration work)'
task :lint do
# TODO: Add eslint once bazel target properly resolves workspace modules
Rake::Task['node:docs_generate'].invoke
end