| /** |
| * @license |
| * Copyright 2017 The Bazel Authors. All rights reserved. |
| * |
| * 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. |
| */ |
| /** |
| * @fileoverview This script runs as a postinstall in the published npm packages |
| * and checks that the version of the build_bazel_rules_typescript external |
| * repository matches that of the published npm package. |
| * |
| * Note, this check is only performed with bazel managed deps when the yarn or |
| * npm install is from a yarn_install or npm_install repository rule. For self |
| * managed bazel deps this check is not performed and it is the responsibility |
| * of the user to ensure that the versions match. |
| */ |
| 'use strict'; |
| |
| const path = require('path'); |
| const fs = require('fs'); |
| |
| // Version in package.bzl should match the npm package version |
| // but this should be tolerant of development stamped versions such as |
| // "0.17.0-7-g76dc057" |
| const npmPackageVersion = process.env.npm_package_version.split('-')[0]; |
| |
| // If this is a bazel managed deps yarn_install or npm_install then the |
| // cwd is $(bazel info |
| // output_base)/external/<wksp>/node_modules/@bazel/typescript and there should |
| // be $(bazel info output_base)/external/<wksp>/generate_build_file.js |
| // folder |
| function isBazelManagedDeps() { |
| try { |
| fs.statSync('../../../generate_build_file.js'); |
| return true; |
| } catch (e) { |
| return false; |
| } |
| } |
| |
| if (isBazelManagedDeps()) { |
| let contents; |
| try { |
| // If this is a yarn_install or npm_install then the cwd is $(bazel info |
| // output_base)/external/<wksp>/node_modules/@bazel/pkg so we can look for |
| // the package.bzl file under $(bazel info |
| // output_base)/external/build_bazel_rules_typescript/package.bzl |
| const packagePath = path.resolve( |
| process.cwd(), '../../../../build_bazel_rules_typescript/package.bzl'); |
| contents = fs.readFileSync(packagePath, 'utf8'); |
| } catch (e) { |
| throw new Error( |
| 'The build_bazel_rules_typescript repository is not installed in your Bazel WORKSPACE file'); |
| } |
| if (!contents.includes('def rules_typescript_dependencies():')) { |
| throw new Error('Invalid package.bzl in build_bazel_rules_typescript'); |
| } else if (!contents.includes(`VERSION = "${npmPackageVersion}"`)) { |
| // TODO: we might need to support a range here. |
| // For example, if you end up with @bazel/typescript@1.0.0 and |
| // @bazel/typescript@1.0.1 both installed one of the postinstalls is |
| // guaranteed to fail since there's only one version of |
| // build_bazel_rules_typescript |
| throw new Error(`Expected build_bazel_rules_typescript to be version ${ |
| npmPackageVersion}`); |
| } |
| } else { |
| // No version check |
| console.warn( |
| `WARNING: With self managed deps you must ensure the @bazel/typescript |
| npm package version matches the build_bazel_rules_typescript repository version. |
| Use yarn_install or npm_install for this version to be checked automatically. |
| `); |
| } |