From 1b5e69eb580c22d1e45f6a9c4f456deeab285c97 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Fri, 17 Nov 2017 09:16:13 -0800 Subject: [PATCH 1/4] WIP: ts_test rule --- BUILD.bazel | 3 +- defs.bzl | 2 + examples/testing/BUILD.bazel | 21 ++++++ examples/testing/decrement.spec.ts | 7 ++ examples/testing/decrement.ts | 3 + internal/karma/BUILD.bazel | 19 ++++++ internal/karma/index.ts | 74 +++++++++++++++++++++ internal/karma/karma.conf.js | 59 +++++++++++++++++ internal/karma/test-main.js | 27 ++++++++ internal/ts_test.bzl | 100 +++++++++++++++++++++++++++++ package.json | 2 +- 11 files changed, 315 insertions(+), 2 deletions(-) create mode 100644 examples/testing/BUILD.bazel create mode 100644 examples/testing/decrement.spec.ts create mode 100644 examples/testing/decrement.ts create mode 100644 internal/karma/BUILD.bazel create mode 100644 internal/karma/index.ts create mode 100644 internal/karma/karma.conf.js create mode 100644 internal/karma/test-main.js create mode 100644 internal/ts_test.bzl diff --git a/BUILD.bazel b/BUILD.bazel index acb32119..eb370da9 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -33,7 +33,8 @@ filegroup( srcs = glob([ "node_modules/**/*.js", "node_modules/**/*.d.ts", - "node_modules/**/*.json" + "node_modules/**/*.json", + "node_modules/karma/bin/karma", ]), visibility = ["//visibility:public"], ) diff --git a/defs.bzl b/defs.bzl index 7a27cd2d..94767642 100644 --- a/defs.bzl +++ b/defs.bzl @@ -20,8 +20,10 @@ load("//internal:build_defs.bzl", _ts_library = "ts_library") load("//internal:ts_config.bzl", _ts_config = "ts_config") load("//internal/devserver:ts_devserver.bzl", _ts_devserver = "ts_devserver_macro") load("//internal:ts_repositories.bzl", _ts_repositories = "ts_repositories") +load("//internal:ts_test.bzl", _ts_test = "ts_web_test_macro") ts_library = _ts_library ts_config = _ts_config ts_repositories = _ts_repositories ts_devserver = _ts_devserver +ts_web_test = _ts_web_test diff --git a/examples/testing/BUILD.bazel b/examples/testing/BUILD.bazel new file mode 100644 index 00000000..d9e6690e --- /dev/null +++ b/examples/testing/BUILD.bazel @@ -0,0 +1,21 @@ +load("@build_bazel_rules_typescript//:defs.bzl", "ts_library", "ts_test") + +ts_library( + name = "lib", + srcs = ["decrement.ts"], +) + +ts_library( + name = "tests", + srcs = ["decrement.spec.ts"], + deps = [":lib"], + testonly = 1, +) + +ts_test( + name = "testing", + deps = [ + ":lib", + ":tests", + ], +) diff --git a/examples/testing/decrement.spec.ts b/examples/testing/decrement.spec.ts new file mode 100644 index 00000000..bf1bd91d --- /dev/null +++ b/examples/testing/decrement.spec.ts @@ -0,0 +1,7 @@ +import {decrement} from './decrement'; + +describe('decrementing', () => { + it('should do that', () => { + expect(decrement(1)).toBe(0); + }); +}); diff --git a/examples/testing/decrement.ts b/examples/testing/decrement.ts new file mode 100644 index 00000000..7173ecc4 --- /dev/null +++ b/examples/testing/decrement.ts @@ -0,0 +1,3 @@ +export function decrement(n: number) { + return n - 1; +} diff --git a/internal/karma/BUILD.bazel b/internal/karma/BUILD.bazel new file mode 100644 index 00000000..a099082f --- /dev/null +++ b/internal/karma/BUILD.bazel @@ -0,0 +1,19 @@ +package(default_visibility=["//visibility:public"]) + +exports_files(["test-main.js", "karma.conf.js"]) + +load("@build_bazel_rules_typescript//:defs.bzl", "ts_library") + +ts_library( + name = "karma_concat_js", + srcs = glob(["*.ts"]), + module_name = "karma-concat-js", +) + +load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") + +nodejs_binary( + name = "karma_bin", + entry_point = "karma/bin/karma", + data = [":karma_concat_js"], +) diff --git a/internal/karma/index.ts b/internal/karma/index.ts new file mode 100644 index 00000000..1e029700 --- /dev/null +++ b/internal/karma/index.ts @@ -0,0 +1,74 @@ +/* + * Concat all JS files before serving. + */ +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import * as path from 'path'; +import * as process from 'process'; +import * as tmp from 'tmp'; +/// + +/** + * Return SHA1 of data buffer. + */ +function sha1(data) { + const hash = crypto.createHash('sha1'); + hash.update(data); + return hash.digest('hex'); +} + +/** + * Entry-point for the Karma plugin. + */ +function initConcatJs(logger, emitter, basePath) { + const log = logger.create('framework.concat_js'); + + // Create a tmp file for the concat bundle that is automatically cleaned up on + // exit. + const tmpFile = tmp.fileSync({keep: false}); + + emitter.on('file_list_modified', files => { + const bundleFile = { + path: '/concatjs_bundle.js', + contentPath: tmpFile.name, + isUrl: false, + content: '' + } as any; + const included = []; + + files.included.forEach(file => { + if (path.extname(file.originalPath) !== '.js') { + // Preserve all non-JS that were there in the included list. + included.push(file); + } else { + const relativePath = path.relative(basePath, file.originalPath); + + // Remove 'use strict'. + let content = file.content.replace(/('use strict'|"use strict");?/, + ''); + content = JSON.stringify( + content + '\n//# sourceURL=http://concatjs/base/' + + relativePath + '\n'); + content = `//${relativePath}\neval(${content});\n`; + bundleFile.content += content; + } + }); + + bundleFile.sha = sha1(new Buffer(bundleFile.content)); + bundleFile.mtime = new Date(); + included.unshift(bundleFile); + + files.included = included; + files.served.push(bundleFile); + + log.debug('Writing concatjs bundle to tmp file %s', + bundleFile.contentPath); + fs.writeFileSync(bundleFile.contentPath, bundleFile.content); + }); +} + +(initConcatJs as any).$inject = ['logger', 'emitter', 'config.basePath']; + +module.exports = { + 'framework:concat_js': ['factory', initConcatJs] +}; diff --git a/internal/karma/karma.conf.js b/internal/karma/karma.conf.js new file mode 100644 index 00000000..17d09968 --- /dev/null +++ b/internal/karma/karma.conf.js @@ -0,0 +1,59 @@ +// Karma configuration +// GENERATED BY Bazel +module.exports = function(config) { + if (process.env['IBAZEL_NOTIFY_CHANGES'] === 'y') { + // Tell karma to only listen for ibazel messages on stdin rather than watch all the input files + // This is from fork alexeagle/karma in the ibazel branch: + // https://github.com/alexeagle/karma/blob/576d262af50b10e63485b86aee99c5358958c4dd/lib/server.js#L172 + config.set({watchMode: 'ibazel'}); + } + + config.set({ + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: 'TMPL_basePath', + files: [ + '../build_bazel_rules_typescript/internal/karma/test-main.js', + TMPL_files + ], + plugins: ['karma-*', 'karma-concat-js'], + frameworks: ['jasmine', 'concat_js', 'requirejs'], + client: { + args: ["TMPL_workspace_name"] + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + // note: run_karma.sh may override this as a command-line option. + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} diff --git a/internal/karma/test-main.js b/internal/karma/test-main.js new file mode 100644 index 00000000..80919ad3 --- /dev/null +++ b/internal/karma/test-main.js @@ -0,0 +1,27 @@ +var allTestFiles = [] +var TEST_REGEXP = /(spec|test)\.js$/i + +// TODO(alexeagle): this seems kinda hacky +var WORKSPACE_NAME = window.__karma__.config.args[0]; + +// Get a list of all the test files to include +Object.keys(window.__karma__.files).forEach(function (file) { + if (TEST_REGEXP.test(file)) { + // Normalize paths to RequireJS module names. + // If you require sub-dependencies of test files to be loaded as-is (requiring file extension) + // then do not normalize the paths + var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, ''); + allTestFiles.push(WORKSPACE_NAME + "/" + normalizedTestModule); + } +}) + +require.config({ + // Karma serves files under /base, which is the basePath from your config file + baseUrl: '/base', + + // load all test files + deps: allTestFiles, + + // we have to kickoff jasmine, as it is asynchronous + callback: window.__karma__.start +}) diff --git a/internal/ts_test.bzl b/internal/ts_test.bzl new file mode 100644 index 00000000..28008146 --- /dev/null +++ b/internal/ts_test.bzl @@ -0,0 +1,100 @@ +load("@build_bazel_rules_nodejs//internal:node.bzl", + "sources_aspect", + "expand_path_into_runfiles", +) + +_CONF_TMPL = "//internal/karma:karma.conf.js" +_LOADER = "//internal/karma:test-main.js" + +def _ts_test_impl(ctx): + conf = ctx.actions.declare_file( + "%s.conf.js" % ctx.label.name, + sibling=ctx.outputs.executable) + + files = depset(ctx.files.srcs) + for d in ctx.attr.deps: + if hasattr(d, "node_sources"): + files += d.node_sources + elif hasattr(d, "files"): + files += d.files + + TMPL_files = "\n".join([ + "'../%s'," % expand_path_into_runfiles(ctx, f.short_path) + for f in files + ]) + + basePath = "/".join([".."] * len(ctx.label.package.split("/"))) + ctx.actions.expand_template( + output = conf, + template = ctx.file._conf_tmpl, + substitutions = { + "TMPL_basePath": basePath, + "TMPL_files": TMPL_files, + "TMPL_workspace_name": ctx.workspace_name, + }) + + ctx.actions.write( + output = ctx.outputs.executable, + is_executable = True, + content = """#!/usr/bin/env bash +readonly KARMA={TMPL_karma} +readonly CONF={TMPL_conf} +export HOME=$(mktemp -d) +ARGV=( "start" $CONF ) + +# Detect that we are running as a test, by using a well-known environment +# variable. See go/test-encyclopedia +if [ ! -z "$TEST_TMPDIR" ]; then + ARGV+=( "--single-run" ) +fi + +$KARMA ${{ARGV[@]}} +""".format(TMPL_karma = ctx.executable._karma.short_path, + TMPL_conf = conf.short_path)) + return [DefaultInfo( + runfiles = ctx.runfiles( + files = ctx.files.srcs + ctx.files.deps + [ + conf, + ctx.file._loader, + ], + transitive_files = files, + # Propagate karma_bin and its runfiles + collect_data = True, + ), + )] + +ts_test = rule( + implementation = _ts_test_impl, + test = True, + attrs = { + "srcs": attr.label_list(allow_files = ["js"]), + "deps": attr.label_list( + allow_files = True, + aspects = [sources_aspect], + ), + "data": attr.label_list(cfg = "data"), + "_karma": attr.label( + default = Label("//internal/karma:karma_bin"), + executable = True, + cfg = "data", + single_file = False, + allow_files = True), + "_conf_tmpl": attr.label( + default = Label(_CONF_TMPL), + allow_files = True, single_file = True), + "_loader": attr.label( + default = Label(_LOADER), + allow_files = True, single_file = True), + }, +) + +# This macro exists only to modify the users rule definition a bit. +# DO NOT add composition of additional rules here. +def ts_test_macro(tags = [], data = [], **kwargs): + ts_test( + # Users don't need to know that this tag is required to run under ibazel + tags = tags + ["iblaze_notify_changes"], + # Our binary dependency must be in data[] for collect_data to pick it up + # FIXME: maybe we can just ask the attr._karma for its runfiles attr + data = data + ["//internal/karma:karma_bin"], + **kwargs) diff --git a/package.json b/package.json index 4bc3376e..4967b111 100644 --- a/package.json +++ b/package.json @@ -27,4 +27,4 @@ "pretest": "webdriver-manager update && bazel build examples/app:all", "test": "concurrently \"bazel run examples/app:devserver\" protractor --kill-others --success first" } -} +} \ No newline at end of file From 98bb133ca814ae3076dc90f8269c3e3de5723f62 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Fri, 17 Nov 2017 10:47:12 -0800 Subject: [PATCH 2/4] get it working from an external repo --- examples/testing/BUILD.bazel | 1 - internal/karma/karma.conf.js | 9 +++------ internal/karma/test-main.js | 5 +---- internal/ts_test.bzl | 19 ++++++++++++++----- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/examples/testing/BUILD.bazel b/examples/testing/BUILD.bazel index d9e6690e..998339d8 100644 --- a/examples/testing/BUILD.bazel +++ b/examples/testing/BUILD.bazel @@ -15,7 +15,6 @@ ts_library( ts_test( name = "testing", deps = [ - ":lib", ":tests", ], ) diff --git a/internal/karma/karma.conf.js b/internal/karma/karma.conf.js index 17d09968..1ce5f524 100644 --- a/internal/karma/karma.conf.js +++ b/internal/karma/karma.conf.js @@ -10,16 +10,13 @@ module.exports = function(config) { config.set({ // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: 'TMPL_basePath', + basePath: 'TMPL_runfiles_path', files: [ - '../build_bazel_rules_typescript/internal/karma/test-main.js', - TMPL_files + 'build_bazel_rules_typescript/internal/karma/test-main.js', +TMPL_files ], plugins: ['karma-*', 'karma-concat-js'], frameworks: ['jasmine', 'concat_js', 'requirejs'], - client: { - args: ["TMPL_workspace_name"] - }, // test results reporter to use // possible values: 'dots', 'progress' diff --git a/internal/karma/test-main.js b/internal/karma/test-main.js index 80919ad3..cca1aa39 100644 --- a/internal/karma/test-main.js +++ b/internal/karma/test-main.js @@ -1,9 +1,6 @@ var allTestFiles = [] var TEST_REGEXP = /(spec|test)\.js$/i -// TODO(alexeagle): this seems kinda hacky -var WORKSPACE_NAME = window.__karma__.config.args[0]; - // Get a list of all the test files to include Object.keys(window.__karma__.files).forEach(function (file) { if (TEST_REGEXP.test(file)) { @@ -11,7 +8,7 @@ Object.keys(window.__karma__.files).forEach(function (file) { // If you require sub-dependencies of test files to be loaded as-is (requiring file extension) // then do not normalize the paths var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, ''); - allTestFiles.push(WORKSPACE_NAME + "/" + normalizedTestModule); + allTestFiles.push(normalizedTestModule); } }) diff --git a/internal/ts_test.bzl b/internal/ts_test.bzl index 28008146..8da99c88 100644 --- a/internal/ts_test.bzl +++ b/internal/ts_test.bzl @@ -19,16 +19,25 @@ def _ts_test_impl(ctx): files += d.files TMPL_files = "\n".join([ - "'../%s'," % expand_path_into_runfiles(ctx, f.short_path) + " '%s'," % expand_path_into_runfiles(ctx, f.short_path) for f in files ]) - - basePath = "/".join([".."] * len(ctx.label.package.split("/"))) + # root-relative (runfiles) path to the directory containing karma.conf + config_dir = "/".join([p + for p in [ + ctx.label.workspace_root, + ctx.label.package + ] + ctx.label.name.split("/")[:-1] + # Skip empty path segments (eg. workspace_root when in same repo) + if p]) + config_segments = len(config_dir.split("/")) + if ctx.workspace_name == 'build_bazel_rules_typescript': + config_segments += 1 # WHY?? ctx.actions.expand_template( output = conf, template = ctx.file._conf_tmpl, substitutions = { - "TMPL_basePath": basePath, + "TMPL_runfiles_path": "/".join([".."] * config_segments), "TMPL_files": TMPL_files, "TMPL_workspace_name": ctx.workspace_name, }) @@ -96,5 +105,5 @@ def ts_test_macro(tags = [], data = [], **kwargs): tags = tags + ["iblaze_notify_changes"], # Our binary dependency must be in data[] for collect_data to pick it up # FIXME: maybe we can just ask the attr._karma for its runfiles attr - data = data + ["//internal/karma:karma_bin"], + data = data + ["@build_bazel_rules_typescript//internal/karma:karma_bin"], **kwargs) From 9002c39e1732cfaa56f63a4426589c9a120cd90a Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Fri, 17 Nov 2017 11:37:24 -0800 Subject: [PATCH 3/4] simplify path handling: we already have a file whose short_path is the runfiles relative path --- internal/ts_test.bzl | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/internal/ts_test.bzl b/internal/ts_test.bzl index 8da99c88..bef708b1 100644 --- a/internal/ts_test.bzl +++ b/internal/ts_test.bzl @@ -22,17 +22,10 @@ def _ts_test_impl(ctx): " '%s'," % expand_path_into_runfiles(ctx, f.short_path) for f in files ]) + # root-relative (runfiles) path to the directory containing karma.conf - config_dir = "/".join([p - for p in [ - ctx.label.workspace_root, - ctx.label.package - ] + ctx.label.name.split("/")[:-1] - # Skip empty path segments (eg. workspace_root when in same repo) - if p]) - config_segments = len(config_dir.split("/")) - if ctx.workspace_name == 'build_bazel_rules_typescript': - config_segments += 1 # WHY?? + config_segments = len(conf.short_path.split("/")) + ctx.actions.expand_template( output = conf, template = ctx.file._conf_tmpl, From 79f156294f4f30a4c1dc967ee916651e7c76f79b Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Tue, 12 Dec 2017 12:00:31 -0800 Subject: [PATCH 4/4] rename to ts_web_test --- defs.bzl | 2 +- examples/testing/BUILD.bazel | 4 ++-- internal/karma/BUILD.bazel | 1 + internal/karma/package.json | 13 +++++++++++++ internal/ts_repositories.bzl | 4 ++++ internal/{ts_test.bzl => ts_web_test.bzl} | 12 ++++++------ package.json | 3 ++- yarn.lock | 4 ++++ 8 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 internal/karma/package.json rename internal/{ts_test.bzl => ts_web_test.bzl} (93%) diff --git a/defs.bzl b/defs.bzl index 94767642..e02646fe 100644 --- a/defs.bzl +++ b/defs.bzl @@ -20,7 +20,7 @@ load("//internal:build_defs.bzl", _ts_library = "ts_library") load("//internal:ts_config.bzl", _ts_config = "ts_config") load("//internal/devserver:ts_devserver.bzl", _ts_devserver = "ts_devserver_macro") load("//internal:ts_repositories.bzl", _ts_repositories = "ts_repositories") -load("//internal:ts_test.bzl", _ts_test = "ts_web_test_macro") +load("//internal:ts_web_test.bzl", _ts_web_test = "ts_web_test_macro") ts_library = _ts_library ts_config = _ts_config diff --git a/examples/testing/BUILD.bazel b/examples/testing/BUILD.bazel index 998339d8..cb79f03a 100644 --- a/examples/testing/BUILD.bazel +++ b/examples/testing/BUILD.bazel @@ -1,4 +1,4 @@ -load("@build_bazel_rules_typescript//:defs.bzl", "ts_library", "ts_test") +load("@build_bazel_rules_typescript//:defs.bzl", "ts_library", "ts_web_test") ts_library( name = "lib", @@ -12,7 +12,7 @@ ts_library( testonly = 1, ) -ts_test( +ts_web_test( name = "testing", deps = [ ":tests", diff --git a/internal/karma/BUILD.bazel b/internal/karma/BUILD.bazel index a099082f..9a45e8e6 100644 --- a/internal/karma/BUILD.bazel +++ b/internal/karma/BUILD.bazel @@ -16,4 +16,5 @@ nodejs_binary( name = "karma_bin", entry_point = "karma/bin/karma", data = [":karma_concat_js"], + node_modules = "@build_bazel_rules_typescript_karma_deps//:node_modules", ) diff --git a/internal/karma/package.json b/internal/karma/package.json new file mode 100644 index 00000000..86e6f47b --- /dev/null +++ b/internal/karma/package.json @@ -0,0 +1,13 @@ +{ + "description": "runtime dependences for ts_web_test rules", + "devDependencies": { + "@types/tmp": "0.0.33", + "jasmine-core": "2.8.0", + "karma": "alexeagle/karma#fa1a84ac881485b5657cb669e9b4e5da77b79f0a", + "karma-chrome-launcher": "2.2.0", + "karma-jasmine": "1.1.1", + "karma-requirejs": "1.1.0", + "requirejs": "2.3.5", + "tmp": "0.0.33" + } +} diff --git a/internal/ts_repositories.bzl b/internal/ts_repositories.bzl index 512543d1..a6d5612f 100644 --- a/internal/ts_repositories.bzl +++ b/internal/ts_repositories.bzl @@ -26,3 +26,7 @@ def ts_repositories(): name = "build_bazel_rules_typescript_devserver_deps", package_json = "@build_bazel_rules_typescript//internal/devserver:package.json", ) + npm_install( + name = "build_bazel_rules_typescript_karma_deps", + package_json = "@build_bazel_rules_typescript//internal/karma:package.json", + ) diff --git a/internal/ts_test.bzl b/internal/ts_web_test.bzl similarity index 93% rename from internal/ts_test.bzl rename to internal/ts_web_test.bzl index bef708b1..78457b3d 100644 --- a/internal/ts_test.bzl +++ b/internal/ts_web_test.bzl @@ -6,7 +6,7 @@ load("@build_bazel_rules_nodejs//internal:node.bzl", _CONF_TMPL = "//internal/karma:karma.conf.js" _LOADER = "//internal/karma:test-main.js" -def _ts_test_impl(ctx): +def _ts_web_test_impl(ctx): conf = ctx.actions.declare_file( "%s.conf.js" % ctx.label.name, sibling=ctx.outputs.executable) @@ -65,8 +65,8 @@ $KARMA ${{ARGV[@]}} ), )] -ts_test = rule( - implementation = _ts_test_impl, +ts_web_test = rule( + implementation = _ts_web_test_impl, test = True, attrs = { "srcs": attr.label_list(allow_files = ["js"]), @@ -92,10 +92,10 @@ ts_test = rule( # This macro exists only to modify the users rule definition a bit. # DO NOT add composition of additional rules here. -def ts_test_macro(tags = [], data = [], **kwargs): - ts_test( +def ts_web_test_macro(tags = [], data = [], **kwargs): + ts_web_test( # Users don't need to know that this tag is required to run under ibazel - tags = tags + ["iblaze_notify_changes"], + tags = tags + ["ibazel_notify_changes"], # Our binary dependency must be in data[] for collect_data to pick it up # FIXME: maybe we can just ask the attr._karma for its runfiles attr data = data + ["@build_bazel_rules_typescript//internal/karma:karma_bin"], diff --git a/package.json b/package.json index 4967b111..42cf4917 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "typescript": ">=2.4.2" }, "devDependencies": { + "@bazel/ibazel": "^0.2.0", "@types/jasmine": "^2.8.2", "@types/node": "7.0.18", "@types/source-map": "^0.5.1", @@ -27,4 +28,4 @@ "pretest": "webdriver-manager update && bazel build examples/app:all", "test": "concurrently \"bazel run examples/app:devserver\" protractor --kill-others --success first" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 707e88aa..a7894c89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,10 @@ # yarn lockfile v1 +"@bazel/ibazel@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.2.0.tgz#c119aef4344a789cef5e792caaee52264123e71c" + "@types/jasmine@^2.8.2": version "2.8.2" resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.2.tgz#6ae4d8740c0da5d5a627df725b4eed71b8e36668"