* npm_binary (download tarball packaged npm apps)
* bower_archive (download a zip file, to be put in WORKSPACE)
* bower_component (defining a bower library, with dependency )
* bower_component_bundle (zipping up libraries together)
* js_component (insert plain js file into bower component bundle)
* bower2bazel.py: run bower to find dependencies, generate a .bzl to
  define archives and define components
Tested:
 python tools/js/bower2bazel.py -w lib/js/bower_archives.bzl -b \
    lib/js/bower_components.bzl
 bazel build polygerrit-ui:components
 unzip -v bazel-bin/polygerrit-ui/components.zip > /tmp/baz
 buck build polygerrit-ui:polygerrit_components
 unzip -v buck-out/gen/polygerrit-ui/polygerrit_components/polygerrit_components.bower_components.zip > /tmp/buck
 diff /tmp/buck /tmp/baz
The diff corresponds to newer file versions pinned through bower2bazel.
Change-Id: I4f33914d4853bcf8afe78b4719d0e0e83b139031
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# Copyright (C) 2015 The Android Open Source Project
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
# http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
NPMJS = 'NPMJS'
 | 
						|
GERRIT = 'GERRIT'
 | 
						|
 | 
						|
# NOTE: npm_binary rules do not get their licenses checked by gen_licenses.py,
 | 
						|
# as we would have to cut too many edges. DO NOT include these binaries in
 | 
						|
# build outputs. Using them in the build _process_ is ok.
 | 
						|
def npm_binary(
 | 
						|
    name,
 | 
						|
    version,
 | 
						|
    sha1 = '',
 | 
						|
    repository = NPMJS,
 | 
						|
    visibility = ['PUBLIC']):
 | 
						|
 | 
						|
  dir = '%s-%s' % (name, version)
 | 
						|
  filename = '%s.tgz' % dir
 | 
						|
  dest = '%s@%s.npm_binary.tgz' % (name, version)
 | 
						|
  if repository == GERRIT:
 | 
						|
    url = 'http://gerrit-maven.storage.googleapis.com/npm-packages/%s' % filename
 | 
						|
  elif repository == NPMJS:
 | 
						|
    url = 'http://registry.npmjs.org/%s/-/%s' % (name, filename)
 | 
						|
  else:
 | 
						|
    raise ValueError('invalid repository: %s' % repository)
 | 
						|
  cmd = ['$(exe //tools:download_file)', '-o', '$OUT', '-u', url]
 | 
						|
  if sha1:
 | 
						|
    cmd.extend(['-v', sha1])
 | 
						|
  genrule(
 | 
						|
    name = name,
 | 
						|
    cmd = ' '.join(cmd),
 | 
						|
    out = dest,
 | 
						|
    visibility = visibility,
 | 
						|
  )
 | 
						|
 | 
						|
 | 
						|
def run_npm_binary(target):
 | 
						|
  return '$(location //tools/js:run_npm_binary) $(location %s)' % target
 | 
						|
 | 
						|
 | 
						|
def bower_component(
 | 
						|
    name,
 | 
						|
    package,
 | 
						|
    version,
 | 
						|
    license,
 | 
						|
    deps = [],
 | 
						|
    semver = None,
 | 
						|
    sha1 = '',
 | 
						|
    visibility = ['PUBLIC']):
 | 
						|
  download_name = '%s__download_bower' % name
 | 
						|
  genrule(
 | 
						|
    name = download_name,
 | 
						|
    cmd = ' '.join([
 | 
						|
      '$(exe //tools/js:download_bower)',
 | 
						|
      '-b', '"%s"' % run_npm_binary('//lib/js:bower'),
 | 
						|
      '-n', name,
 | 
						|
      '-p', package,
 | 
						|
      '-v', version,
 | 
						|
      '-s', sha1,
 | 
						|
      '-o', '$OUT',
 | 
						|
    ]),
 | 
						|
    out = '%s.zip' % download_name,
 | 
						|
    license = license,
 | 
						|
    visibility = [],
 | 
						|
  )
 | 
						|
 | 
						|
  renamed_name = '%s__renamed' % name
 | 
						|
  genrule(
 | 
						|
    name = renamed_name,
 | 
						|
    cmd = ' && '.join([
 | 
						|
      'cd $TMP',
 | 
						|
      'mkdir bower_components',
 | 
						|
      'cd bower_components',
 | 
						|
      'unzip $(location :%s)' % download_name,
 | 
						|
      'cd ..',
 | 
						|
      'zip -r $OUT bower_components',
 | 
						|
    ]),
 | 
						|
    out = '%s.zip' % renamed_name,
 | 
						|
    visibility = [],
 | 
						|
  )
 | 
						|
 | 
						|
  genrule(
 | 
						|
    name = name,
 | 
						|
    cmd = _combine_components([':%s' % renamed_name] + deps),
 | 
						|
    out = '%s-%s.zip' % (name, version),
 | 
						|
    visibility = visibility,
 | 
						|
  )
 | 
						|
 | 
						|
  version_name = '%s__bower_version' % name
 | 
						|
  dep_version = semver if semver is not None else version
 | 
						|
  deps_json = '{"%s": "%s#%s"}' % (name, package, dep_version)
 | 
						|
  genrule(
 | 
						|
    name = version_name,
 | 
						|
    cmd = "echo '%s' > $OUT" % deps_json,
 | 
						|
    out = version_name,
 | 
						|
    visibility = visibility,
 | 
						|
  )
 | 
						|
 | 
						|
 | 
						|
def bower_components(
 | 
						|
    name,
 | 
						|
    deps,
 | 
						|
    visibility = ['PUBLIC']):
 | 
						|
  genrule(
 | 
						|
    name = name,
 | 
						|
    cmd = _combine_components(deps),
 | 
						|
    out = '%s.bower_components.zip' % name,
 | 
						|
    visibility = visibility,
 | 
						|
  )
 | 
						|
 | 
						|
 | 
						|
def _combine_components(deps):
 | 
						|
  cmds = ['cd $TMP']
 | 
						|
  for d in deps:
 | 
						|
    cmds.append('unzip -qo $(location %s)' % d)
 | 
						|
  cmds.append("find bower_components -exec touch -t 198001010000 '{}' ';'")
 | 
						|
  cmds.append('zip -r $OUT bower_components/*')
 | 
						|
  return ' && '.join(cmds)
 | 
						|
 | 
						|
 | 
						|
VULCANIZE_FLAGS = [
 | 
						|
  '--inline-scripts',
 | 
						|
  '--inline-css',
 | 
						|
  '--strip-comments',
 | 
						|
]
 | 
						|
 | 
						|
def vulcanize(
 | 
						|
    name,
 | 
						|
    app,
 | 
						|
    srcs,
 | 
						|
    components,
 | 
						|
    extra_flags = [],
 | 
						|
    visibility = ['PUBLIC']):
 | 
						|
  genrule(
 | 
						|
    name = '%s__vulcanized' % name,
 | 
						|
    cmd = ' '.join([
 | 
						|
      'unzip', '-qd', '$TMP', '$(location %s)' % components,
 | 
						|
      '&&', 'rm', '-rf', '$SRCDIR/bower_components',
 | 
						|
      '&&', 'ln', '-s', '-f', '$TMP/bower_components', '.',
 | 
						|
      '&&', run_npm_binary('//lib/js:vulcanize')
 | 
						|
    ] + VULCANIZE_FLAGS + extra_flags + [
 | 
						|
      '--out-html', '$OUT',
 | 
						|
      '$SRCDIR/%s' % app,
 | 
						|
    ]),
 | 
						|
    srcs = srcs,
 | 
						|
    out = '%s.vulcanized.html' % name,
 | 
						|
    visibility = visibility,
 | 
						|
  )
 | 
						|
 | 
						|
  genrule(
 | 
						|
    name = name,
 | 
						|
    cmd = ' '.join([
 | 
						|
      'cd', '$TMP',
 | 
						|
      '&&', run_npm_binary('//lib/js:crisper'), '--always-write-script',
 | 
						|
      '--source', '$(location :%s__vulcanized)' % name,
 | 
						|
      '--html', '%s.html' % name,
 | 
						|
      '--js', '%s.js' % name,
 | 
						|
      '&&', 'zip', '$OUT', '%s.html' % name, '%s.js' % name,
 | 
						|
    ]),
 | 
						|
    out = '%s.vulcanized.zip' % name,
 | 
						|
  )
 |