Browse Source

chore: auto deploy AMO unlisted version

Gerald 5 years ago
parent
commit
9cc7a0e0bb
10 changed files with 302 additions and 70 deletions
  1. 14 4
      .github/workflows/release.yml
  2. 2 0
      .gitignore
  3. 0 8
      README.md
  4. 3 39
      gulpfile.js
  5. 3 3
      package.json
  6. 23 12
      scripts/action-helper.js
  7. 32 0
      scripts/amo-sign.js
  8. 43 0
      scripts/manifest-helper.js
  9. 4 1
      scripts/version-helper.js
  10. 178 3
      yarn.lock

+ 14 - 4
.github/workflows/release.yml

@@ -20,11 +20,21 @@ jobs:
       - name: Build
         run: |
           yarn build
-          cd dist && zip -r ../$RELEASE_PREFIX-webext-v$VERSION.zip . && cd ..
+          mkdir -p $ASSETS_DIR $TEMP_DIR
+          cd dist && zip -r ../$ASSETS_DIR/$ASSET_ZIP . && cd ..
 
           # Same as `yarn build:selfHosted` but only manifest is changed for now
-          TARGET=selfHosted npx gulp manifest
-          cd dist && zip -r ../$RELEASE_PREFIX-webext-ffself-v$VERSION.zip . && cd ..
+          TARGET=selfHosted BETA=1 npx gulp manifest
+          cd dist && zip -r ../$TEMP_DIR/$ASSET_SELF_HOSTED_ZIP . && cd ..
+      - name: Sign AMO
+        continue-on-error: true
+        run: |
+          node scripts/amo-sign
+          hub release edit beta -p -m '' -a $TEMP_DIR/updates.json
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          AMO_KEY: ${{ secrets.AMO_KEY }}
+          AMO_SECRET: ${{ secrets.AMO_SECRET }}
       - name: Create Release
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -34,7 +44,7 @@ jobs:
           if [ "$PRERELEASE" = "true" ]; then
             params+=("-p")
           fi
-          for asset in ./*.zip; do
+          for asset in $ASSETS_DIR/*; do
             params+=("-a" "$asset")
           done
           hub release create "${params[@]}" v$VERSION

+ 2 - 0
.gitignore

@@ -2,3 +2,5 @@
 node_modules/
 *.log
 /stats.json
+/tmp/
+/dist-assets/

+ 0 - 8
README.md

@@ -57,11 +57,3 @@ $ yarn bump
 # Create a patch release
 $ yarn version --patch
 ```
-
-### Announcing updates
-
-Create a new `updates.json` so that self-hosted versions can be updated to the new version.
-
-```sh
-$ yarn update:selfHosted
-```

+ 3 - 39
gulpfile.js

@@ -5,12 +5,12 @@ const log = require('fancy-log');
 const gulpFilter = require('gulp-filter');
 const uglify = require('gulp-uglify');
 const plumber = require('gulp-plumber');
-const yaml = require('js-yaml');
 const Sharp = require('sharp');
 const { isProd } = require('@gera2ld/plaid/util');
 const spawn = require('cross-spawn');
 const i18n = require('./scripts/i18n');
 const { getVersion, isBeta } = require('./scripts/version-helper');
+const { buildManifest } = require('./scripts/manifest-helper');
 const pkg = require('./package.json');
 
 const DIST = 'dist';
@@ -48,12 +48,6 @@ async function jsProd() {
   });
 }
 
-async function readManifest() {
-  const input = await fs.readFile(paths.manifest, 'utf8');
-  const data = yaml.safeLoad(input);
-  return data;
-}
-
 /**
  * Versioning
  *
@@ -63,15 +57,7 @@ async function readManifest() {
  *
  */
 async function manifest() {
-  const data = await readManifest();
-  data.version = getVersion();
-  if (process.env.TARGET === 'selfHosted') {
-    data.browser_specific_settings.gecko.update_url = 'https://raw.githubusercontent.com/violentmonkey/violentmonkey/master/updates.json';
-  }
-  if (isBeta()) {
-    // Do not support i18n in beta version
-    data.name = 'Violentmonkey BETA';
-  }
+  const data = await buildManifest();
   await fs.writeFile(`${DIST}/manifest.json`, JSON.stringify(data), 'utf8');
 }
 
@@ -79,7 +65,7 @@ async function createIcons() {
   const ALPHA = .5;
   const dist = `${DIST}/public/images`;
   await fs.mkdir(dist, { recursive: true });
-  const icon = Sharp(`src/resources/icon${pkg.beta ? '-beta' : ''}.png`);
+  const icon = Sharp(`src/resources/icon${isBeta() ? '-beta' : ''}.png`);
   const gray = icon.clone().grayscale();
   const transparent = icon.clone().composite([{
     input: Buffer.from([255, 255, 255, 256 * ALPHA]),
@@ -131,27 +117,6 @@ async function bump() {
   }
 }
 
-/**
- * Create an update manifest file to announce a new self-hosted release.
- */
-async function updateVersions() {
-  const manifest = await readManifest();
-  const version = getVersion();
-  const data = {
-    addons: {
-      [manifest.browser_specific_settings.gecko.id]: {
-        updates: [
-          {
-            version,
-            update_link: `https://github.com/violentmonkey/violentmonkey/releases/download/v${version}/violentmonkey-${version}-an.fx.xpi`,
-          },
-        ],
-      }
-    },
-  };
-  await fs.writeFile('updates.json', JSON.stringify(data, null, 2), 'utf8');
-}
-
 function copyFiles() {
   const jsFilter = gulpFilter(['**/*.js'], { restore: true });
   let stream = gulp.src(paths.copy, { base: 'src' });
@@ -213,4 +178,3 @@ exports.i18n = updateI18n;
 exports.check = checkI18n;
 exports.copyI18n = copyI18n;
 exports.bump = bump;
-exports.updateVersions = updateVersions;

+ 3 - 3
package.json

@@ -5,7 +5,7 @@
     "dev": "gulp dev",
     "prebuild": "yarn ci",
     "build": "cross-env NODE_ENV=production gulp build",
-    "build:selfHosted": "cross-env TARGET=selfHosted yarn build",
+    "build:selfHosted": "cross-env TARGET=selfHosted BETA=1 yarn build",
     "analyze": "cross-env RUN_ENV=analyze npm run build",
     "i18n": "gulp i18n",
     "copyI18n": "gulp copyI18n",
@@ -17,8 +17,7 @@
     "ci": "yarn lint && yarn test",
     "transform": "locky yarn yarn",
     "bump": "yarn ci && gulp bump --commit",
-    "preversion": "yarn ci && gulp bump --reset",
-    "update:selfHosted": "gulp updateVersions"
+    "preversion": "yarn ci && gulp bump --reset"
   },
   "description": "Violentmonkey",
   "devDependencies": {
@@ -43,6 +42,7 @@
     "jsdom": "^16.2.1",
     "plugin-error": "^1.0.0",
     "sharp": "^0.26.2",
+    "sign-addon": "^3.1.0",
     "tape": "^4.13.2",
     "through2": "^3.0.1",
     "vinyl": "^2.1.0",

+ 23 - 12
scripts/action-helper.js

@@ -4,20 +4,31 @@ const { getVersion, isBeta } = require('./version-helper');
 const version = getVersion();
 const beta = isBeta();
 
-core.exportVariable('VERSION', version);
-core.exportVariable('RELEASE_NAME', [
-  beta && 'BETA',
-  `v${version}`,
-].filter(Boolean).join(' '));
-core.exportVariable('RELEASE_PREFIX', [
-  'Violentmonkey',
-  beta && 'beta',
-].filter(Boolean).join('-'));
-core.exportVariable('PRERELEASE', !!beta);
+const envs = {
+  VERSION: version,
+  RELEASE_NAME: [
+    beta && 'BETA',
+    `v${version}`,
+  ].filter(Boolean).join(' '),
+  RELEASE_PREFIX: [
+    'Violentmonkey',
+    beta && 'beta',
+  ].filter(Boolean).join('-'),
+  PRERELEASE: !!beta,
+  TEMP_DIR: 'tmp',
+  ASSETS_DIR: 'dist-assets',
+};
+
+envs.ASSET_ZIP = `${envs.RELEASE_PREFIX}-webext-v${envs.VERSION}.zip`;
+envs.ASSET_SELF_HOSTED_ZIP = `${envs.RELEASE_PREFIX}-webext-ffself-v${envs.VERSION}.zip`;
 
 // TODO generate release notes by conventional commit messages and add installation instructions
-core.exportVariable('RELEASE_NOTE', beta ? `\
+envs.RELEASE_NOTE = beta ? `\
 **This is a beta release of Violentmonkey, use it at your own risk.**
 ` : `\
 See <https://violentmonkey.github.io/> for more details.
-`);
+`;
+
+Object.entries(envs).forEach(([key, value]) => {
+  core.exportVariable(key, value);
+});

+ 32 - 0
scripts/amo-sign.js

@@ -0,0 +1,32 @@
+const fs = require('fs').promises;
+const path = require('path');
+const { signAddon } = require('sign-addon');
+const { readManifest, buildUpdatesList } = require('./manifest-helper');
+const { getVersion } = require('./version-helper');
+
+async function main() {
+  const manifest = await readManifest();
+  const rawVersion = process.env.VERSION;
+  // version may be suffixed for unlisted version
+  const version = getVersion();
+  const result = await signAddon({
+    xpiPath: path.join(process.env.TEMP_DIR, process.env.ASSET_SELF_HOSTED_ZIP),
+    version,
+    apiKey: process.env.AMO_KEY,
+    apiSecret: process.env.AMO_SECRET,
+    channel: 'unlisted',
+    downloadDir: process.env.ASSETS_DIR,
+    id: manifest.browser_specific_settings.gecko.id,
+  });
+  if (!result.success) {
+    console.error(result);
+    process.exitCode = 1;
+    return;
+  }
+  const fileName = path.basename(result.downloadedFiles[0]);
+  const url = `https://github.com/violentmonkey/violentmonkey/releases/download/v${rawVersion}/${fileName}`;
+  const updates = await buildUpdatesList(version, url);
+  await fs.writeFile(path.join(process.env.TEMP_DIR, 'updates.json'), JSON.stringify(updates, null, 2), 'utf8');
+}
+
+main();

+ 43 - 0
scripts/manifest-helper.js

@@ -0,0 +1,43 @@
+const fs = require('fs').promises;
+const yaml = require('js-yaml');
+const { getVersion, isBeta } = require('./version-helper');
+
+async function readManifest() {
+  const input = await fs.readFile('src/manifest.yml', 'utf8');
+  const data = yaml.safeLoad(input);
+  return data;
+}
+
+async function buildManifest() {
+  const data = await readManifest();
+  data.version = getVersion();
+  if (process.env.TARGET === 'selfHosted') {
+    data.browser_specific_settings.gecko.update_url = 'https://github.com/violentmonkey/violentmonkey/releases/download/beta/updates.json';
+  }
+  if (isBeta()) {
+    // Do not support i18n in beta version
+    data.name = 'Violentmonkey BETA';
+  }
+  return data;
+}
+
+async function buildUpdatesList(version, url) {
+  const manifest = await readManifest();
+  const data = {
+    addons: {
+      [manifest.browser_specific_settings.gecko.id]: {
+        updates: [
+          {
+            version,
+            update_link: url,
+          },
+        ],
+      }
+    },
+  };
+  return data;
+}
+
+exports.readManifest = readManifest;
+exports.buildManifest = buildManifest;
+exports.buildUpdatesList = buildUpdatesList;

+ 4 - 1
scripts/version-helper.js

@@ -8,11 +8,14 @@ const pkg = require('../package.json');
 function getVersion() {
   let version = pkg.version.replace(/-[^.]*/, '');
   if (pkg.beta) version += `.${pkg.beta}`;
+  // Create a beta release with the same code as in stable release.
+  // Used in unlisted version.
+  else if (process.env.BETA) version += 'b';
   return version;
 }
 
 function isBeta() {
-  return pkg.beta > 0;
+  return process.env.BETA || pkg.beta > 0;
 }
 
 exports.getVersion = getVersion;

+ 178 - 3
yarn.lock

@@ -1460,6 +1460,11 @@ [email protected], ansi-wrap@^0.1.0:
   resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
   integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
 
+any-promise@^1.0.0, any-promise@^1.1.0, any-promise@~1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+  integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
 anymatch@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -2096,6 +2101,11 @@ browserslist@^4.0.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9
     node-releases "^1.1.52"
     pkg-up "^3.1.0"
 
[email protected]:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+  integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
+
 buffer-equal@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
@@ -2576,7 +2586,7 @@ commander@~2.19.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
   integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
 
-common-tags@^1.8.0:
+[email protected], common-tags@^1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
   integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
@@ -2735,6 +2745,11 @@ core-js-pure@^3.0.0:
   resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a"
   integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==
 
[email protected]:
+  version "3.6.5"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
+  integrity sha1-c5XcJzrzf7LlDpvT2f6EEoUjHRo=
+
 core-js@^2.4.0:
   version "2.6.11"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
@@ -3177,6 +3192,13 @@ deep-is@~0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
[email protected]:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-2.1.0.tgz#2deb0dd52d079c2ecb7924b640a7c3abd4db1d6d"
+  integrity sha1-LesN1S0HnC7LeSS2QKfDq9TbHW0=
+  dependencies:
+    type-detect "^4.0.8"
+
 [email protected]:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050"
@@ -3482,6 +3504,13 @@ ecc-jsbn@~0.1.1:
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
 
[email protected]:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+  integrity sha1-rg8PothQRe8UqBfao86azQSJ5b8=
+  dependencies:
+    safe-buffer "^5.0.1"
+
 [email protected]:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -3535,7 +3564,7 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 
-end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@~1.4.1:
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -3626,6 +3655,11 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50:
     es6-symbol "~3.1.3"
     next-tick "~1.0.0"
 
[email protected]:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+  integrity sha1-njr0B0Wd7tR+mpH5uIWoTrBcVh0=
+
 es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
@@ -3635,6 +3669,11 @@ es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3:
     es5-ext "^0.10.35"
     es6-symbol "^3.1.1"
 
[email protected]:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621"
+  integrity sha1-RoN2Ubewa/b/+JPQPyk5NmjQFiE=
+
 es6-symbol@^3.1.1, es6-symbol@~3.1.3:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
@@ -5754,6 +5793,22 @@ jsonify@~0.0.0:
   resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
   integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
 
[email protected]:
+  version "8.5.1"
+  resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
+  integrity sha1-AOceC431TCEhofJhN98igGc7zA0=
+  dependencies:
+    jws "^3.2.2"
+    lodash.includes "^4.3.0"
+    lodash.isboolean "^3.0.3"
+    lodash.isinteger "^4.0.4"
+    lodash.isnumber "^3.0.3"
+    lodash.isplainobject "^4.0.6"
+    lodash.isstring "^4.0.1"
+    lodash.once "^4.0.0"
+    ms "^2.1.1"
+    semver "^5.6.0"
+
 jsprim@^1.2.2:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -5777,6 +5832,23 @@ just-debounce@^1.0.0:
   resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea"
   integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=
 
+jwa@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
+  integrity sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=
+  dependencies:
+    buffer-equal-constant-time "1.0.1"
+    ecdsa-sig-formatter "1.0.11"
+    safe-buffer "^5.0.1"
+
+jws@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
+  integrity sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=
+  dependencies:
+    jwa "^1.4.1"
+    safe-buffer "^5.0.1"
+
 killable@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -5985,11 +6057,46 @@ lodash._reinterpolate@^3.0.0:
   resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
   integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
 
+lodash.includes@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+  integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
+
+lodash.isboolean@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+  integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
+
+lodash.isinteger@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+  integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
+
+lodash.isnumber@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+  integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
+
+lodash.isplainobject@^4.0.6:
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+  integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
+lodash.isstring@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+  integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
+
 lodash.memoize@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
   integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
 
+lodash.once@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+  integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+
 lodash.sortby@^4.7.0:
   version "4.7.0"
   resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@@ -6418,6 +6525,15 @@ [email protected]:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
[email protected]:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+  integrity sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
 nan@^2.12.1:
   version "2.14.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@@ -8546,7 +8662,7 @@ request-promise-native@^1.0.8:
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
-request@^2.88.2:
+[email protected], request@^2.88.2:
   version "2.88.2"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
   integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -8981,6 +9097,22 @@ side-channel@^1.0.2:
     es-abstract "^1.17.0-next.1"
     object-inspect "^1.7.0"
 
+sign-addon@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/sign-addon/-/sign-addon-3.1.0.tgz#3dd6cd1bf6359f08e16b8e05927c4af8530247b9"
+  integrity sha1-PdbNG/Y1nwjha44FknxK+FMCR7k=
+  dependencies:
+    common-tags "1.8.0"
+    core-js "3.6.5"
+    deepcopy "2.1.0"
+    es6-error "4.1.1"
+    es6-promisify "6.1.1"
+    jsonwebtoken "8.5.1"
+    mz "2.7.0"
+    request "2.88.2"
+    source-map-support "0.5.19"
+    stream-to-promise "3.0.0"
+
 signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@@ -9103,6 +9235,14 @@ source-map-resolve@^0.5.0:
     source-map-url "^0.4.0"
     urix "^0.1.0"
 
[email protected]:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
 source-map-support@^0.5.16, source-map-support@~0.5.12:
   version "0.5.16"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
@@ -9284,6 +9424,22 @@ stream-shift@^1.0.0:
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
   integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
 
+stream-to-array@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353"
+  integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=
+  dependencies:
+    any-promise "^1.1.0"
+
[email protected]:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/stream-to-promise/-/stream-to-promise-3.0.0.tgz#8934d66dcbc9189394e8b33200da3bb9611db774"
+  integrity sha1-iTTWbcvJGJOU6LMyANo7uWEdt3Q=
+  dependencies:
+    any-promise "~1.3.0"
+    end-of-stream "~1.4.1"
+    stream-to-array "~2.3.0"
+
 streamfilter@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-3.0.0.tgz#8c61b08179a6c336c6efccc5df30861b7a9675e7"
@@ -9670,6 +9826,20 @@ text-table@^0.2.0:
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+  integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+  integrity sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=
+  dependencies:
+    any-promise "^1.0.0"
+
 through2-filter@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
@@ -9864,6 +10034,11 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
+type-detect@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+  integrity sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=
+
 type-fest@^0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"