diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..30f5812 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +# Ignore everything +** + +# Allow files and directories +!.env* +!/package.json +!/yarn.lock +!/tsconfig.json +!/src/** +!/node_modules/arweave/** +!/rds-combined-ca-bundle.pem + + +# Ignore unnecessary files inside allowed directories +# This should go after the allowed directories +**/*.log +**/.DS_Store +**/Thumbs.db diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..63278e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*# +*~ +dist +# package directories +node_modules +package-lock.json +jspm_packages + +result + +# Serverless directories +.serverless +.terraform + +.DS_STORE +.idea diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..620795d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:16.3 + +RUN apt update && apt install bash git python3 + +WORKDIR /usr/app + +COPY ./package.json . +COPY ./yarn.lock . +COPY ./.env . +COPY ./tsconfig.json . +COPY ./src ./src +COPY ./node_modules ./node_modules + +RUN yarn install +RUN yarn build + +ENTRYPOINT ["node"] + +CMD ["dist/gateway/app.js"] diff --git a/ec2/README.md b/ec2/README.md new file mode 100644 index 0000000..057dd9e --- /dev/null +++ b/ec2/README.md @@ -0,0 +1,3 @@ +### osx with linux nixos-builders + +`sudo nix build .#packages.x86_64-linux.import-blocks -j0` diff --git a/ec2/base.nix b/ec2/base.nix new file mode 100644 index 0000000..2fb5109 --- /dev/null +++ b/ec2/base.nix @@ -0,0 +1,43 @@ +{ config, lib, pkgs, ... }: + +{ + + imports = [ ]; + + config = { + nix.autoOptimiseStore = true; + users.users.root.openssh.authorizedKeys.keys = []; + services.tailscale.enable = true; + networking.firewall.trustedInterfaces = [ "tailscale0" ]; + + # Tell the firewall to implicitly trust packets routed over Tailscale: + # config. + security.auditd.enable = true; + security.audit.enable = true; + security.audit.rules = [ + "-a exit,always -F arch=b64 -S execve" + ]; + + nix.trustedUsers = [ "root" "@wheel" ]; + security.sudo.enable = true; + security.sudo.wheelNeedsPassword = false; + environment.defaultPackages = lib.mkForce []; + + services.openssh = { + passwordAuthentication = false; + allowSFTP = false; # Don't set this if you need sftp + challengeResponseAuthentication = false; + extraConfig = '' + AllowTcpForwarding yes + X11Forwarding no + AllowAgentForwarding no + AllowStreamLocalForwarding no + AuthenticationMethods publickey + ''; + }; + + # PCI compliance + environment.systemPackages = with pkgs; [ clamav ]; + + }; +} diff --git a/ec2/flake.lock b/ec2/flake.lock new file mode 100644 index 0000000..0070134 --- /dev/null +++ b/ec2/flake.lock @@ -0,0 +1,63 @@ +{ + "nodes": { + "nixlib": { + "locked": { + "lastModified": 1636849918, + "narHash": "sha256-nzUK6dPcTmNVrgTAC1EOybSMsrcx+QrVPyqRdyKLkjA=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "28a5b0557f14124608db68d3ee1f77e9329e9dd5", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixos-generators": { + "inputs": { + "nixlib": "nixlib", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1637655461, + "narHash": "sha256-kXZPbclN3gKwjhp2/RYFDFpAsSBwzX1iLF4EcnHZsPQ=", + "owner": "nix-community", + "repo": "nixos-generators", + "rev": "05a3eb158a9c7746a5d463726d7f7cccf07500e4", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-generators", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1639347265, + "narHash": "sha256-q5feWoC64+h6T6J89o2HJJ8DOnB/4vwMODBlZIgeIlA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b0bf5f888d377dd2f36d90340df6dc9f035aaada", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixos-generators": "nixos-generators", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/ec2/flake.nix b/ec2/flake.nix new file mode 100644 index 0000000..085a753 --- /dev/null +++ b/ec2/flake.nix @@ -0,0 +1,50 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +{ + inputs = { + nixpkgs.url = "nixpkgs/nixos-unstable"; + nixos-generators = { + url = "github:nix-community/nixos-generators"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { self, nixpkgs, nixos-generators, ... }: + + let + system = "x86_64-linux"; + pkgs = (import nixpkgs { + inherit overlays system; + config = { allowUnfree = true; }; + }); + overlays = [ (import ./import-blocks/overlay.nix) ]; + + in { + packages.x86_64-linux = { + import-blocks = nixos-generators.nixosGenerate { + inherit pkgs; + modules = [ + ./base.nix + ./import-blocks/module.nix + ]; + format = "amazon"; + }; + }; + }; +} diff --git a/ec2/import-blocks/module.nix b/ec2/import-blocks/module.nix new file mode 100644 index 0000000..3335cd2 --- /dev/null +++ b/ec2/import-blocks/module.nix @@ -0,0 +1,66 @@ +{ pkgs, lib, config, modulesPath, ... }: + + +{ + imports = [ "${modulesPath}/virtualisation/amazon-image.nix" ]; + + config = { + ec2.hvm = true; + time.timeZone = "Europe/Berlin"; + networking.hostName = "import-blocks"; + # services.tailscale.enable = true; + # networking.firewall.trustedInterfaces = [ "tailscale0" ]; + + security.auditd.enable = true; + security.audit.enable = true; + security.audit.rules = [ + "-a exit,always -F arch=b64 -S execve" + ]; + + nix.trustedUsers = [ "root" "@wheel" ]; + security.sudo.enable = true; + security.sudo.wheelNeedsPassword = false; + + nix.autoOptimiseStore = true; + + users.users.root.openssh.authorizedKeys.keys = []; + + + services.openssh = { + passwordAuthentication = false; + allowSFTP = false; # Don't set this if you need sftp + challengeResponseAuthentication = false; + extraConfig = '' + AllowTcpForwarding yes + X11Forwarding no + AllowAgentForwarding no + AllowStreamLocalForwarding no + AuthenticationMethods publickey + ''; + }; + + # PCI compliance + environment.systemPackages = with pkgs; [ clamav ]; + + systemd.services.import-blocks = { + description = "import-block poller"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + environment = { + ARWEAVE_DOTENV_PATH = "/var/dotenv"; + }; + + script = '' + ${pkgs.import-blocks-wrapped}/bin/import-blocks + ''; + + serviceConfig = { + Restart = "on-failure"; + RestartSec = "5s"; + TimeoutStartSec = 0; + KillSignal = "SIGINT"; + }; + }; + }; +} diff --git a/ec2/import-blocks/overlay.nix b/ec2/import-blocks/overlay.nix new file mode 100644 index 0000000..c53f6d2 --- /dev/null +++ b/ec2/import-blocks/overlay.nix @@ -0,0 +1,9 @@ +final: prev: { + import-blocks = (import ./package-lock.nix prev)."@arweave/import-blocks"; + import-blocks-wrapped = prev.writeShellScriptBin "import-blocks" '' + cd ${final.import-blocks}/lib/node_modules/@arweave/import-blocks + ${prev.bash}/bin/bash /etc/ec2-metadata/user-data + ${prev.nodejs_latest}/bin/node src/index.mjs + ''; + +} diff --git a/ec2/import-blocks/package-lock.nix b/ec2/import-blocks/package-lock.nix new file mode 100644 index 0000000..15058c2 --- /dev/null +++ b/ec2/import-blocks/package-lock.nix @@ -0,0 +1,3865 @@ +{pkgs, stdenv, lib, nodejs, fetchurl, fetchgit, fetchFromGitHub, jq, makeWrapper, python3, runCommand, runCommandCC, xcodebuild, ... }: + +let + packageNix = import ./package.nix; + copyNodeModules = {dependencies ? [] }: + (lib.lists.foldr (dep: acc: + let pkgName = if (builtins.hasAttr "packageName" dep) + then dep.packageName else dep.name; + in + acc + '' + if [[ ! -f "node_modules/${pkgName}" && \ + ! -d "node_modules/${pkgName}" && \ + ! -L "node_modules/${pkgName}" && \ + ! -e "node_modules/${pkgName}" ]] + then + mkdir -p "node_modules/${pkgName}" + cp -rLT "${dep}/lib/node_modules/${pkgName}" "node_modules/${pkgName}" + chmod -R +rw "node_modules/${pkgName}" + fi + '') + "" dependencies); + linkNodeModules = {dependencies ? [], extraDependencies ? []}: + (lib.lists.foldr (dep: acc: + let pkgName = if (builtins.hasAttr "packageName" dep) + then dep.packageName else dep.name; + in (acc + (lib.optionalString + ((lib.findSingle (px: px.packageName == dep.packageName) "none" "found" extraDependencies) == "none") + '' + if [[ ! -f "node_modules/${pkgName}" && \ + ! -d "node_modules/${pkgName}" && \ + ! -L "node_modules/${pkgName}" && \ + ! -e "node_modules/${pkgName}" ]] + then + mkdir -p "node_modules/${pkgName}" + ln -s "${dep}/lib/node_modules/${pkgName}"/* "node_modules/${pkgName}" + ${lib.optionalString (builtins.hasAttr "dependencies" dep) + '' + rm -rf "node_modules/${pkgName}/node_modules" + (cd node_modules/${dep.packageName}; ${linkNodeModules { inherit (dep) dependencies; inherit extraDependencies;}}) + ''} + fi + ''))) + "" dependencies); + gitignoreSource = + (import (fetchFromGitHub { + owner = "hercules-ci"; + repo = "gitignore.nix"; + rev = "5b9e0ff9d3b551234b4f3eb3983744fa354b17f1"; + sha256 = "o/BdVjNwcB6jOmzZjOH703BesSkkS5O7ej3xhyO8hAY="; + }) { inherit lib; }).gitignoreSource; + transitiveDepInstallPhase = {dependencies ? [], pkgName}: '' + export packageDir="$(pwd)" + mkdir -p $out/lib/node_modules/${pkgName} + cd $out/lib/node_modules/${pkgName} + cp -rfT "$packageDir" "$(pwd)" + ${copyNodeModules { inherit dependencies; }} ''; + transitiveDepUnpackPhase = {dependencies ? [], pkgName}: '' + unpackFile "$src"; + # not ideal, but some perms are fubar + chmod -R +777 . || true + packageDir="$(find . -maxdepth 1 -type d | tail -1)" + cd "$packageDir" + ''; + getNodeDep = packageName: dependencies: + (let depList = if ((builtins.typeOf dependencies) == "set") + then (builtins.attrValues dependencies) + else dependencies; + in (builtins.head + (builtins.filter (p: p.packageName == packageName) depList))); + nodeSources = runCommand "node-sources" {} '' + tar --no-same-owner --no-same-permissions -xf ${nodejs.src} + mv node-* $out + ''; + linkBins = '' + ${goBinLink}/bin/bin-link +''; + flattenScript = args: '' ${goFlatten}/bin/flatten ${args}''; + sanitizeName = nm: lib.strings.sanitizeDerivationName + (builtins.replaceStrings [ "@" "/" ] [ "_at_" "_" ] nm); + jsnixDrvOverrides = { drv_, jsnixDeps, dedupedDeps, isolateDeps }: + let drv = drv_ (pkgs // { inherit nodejs copyNodeModules gitignoreSource jsnixDeps nodeModules getNodeDep; }); + skipUnpackFor = if (builtins.hasAttr "skipUnpackFor" drv) + then drv.skipUnpackFor else []; + copyUnpackFor = if (builtins.hasAttr "copyUnpackFor" drv) + then drv.copyUnpackFor else []; + pkgJsonFile = runCommand "package.json" { buildInputs = [jq]; } '' + echo ${toPackageJson { inherit jsnixDeps; extraDeps = (if (builtins.hasAttr "extraDependencies" drv) then drv.extraDependencies else []); }} > $out + cat <<< $(cat $out | jq) > $out + ''; + copyDeps = builtins.attrValues jsnixDeps; + copyDepsStr = builtins.concatStringsSep " " (builtins.map (dep: if (builtins.hasAttr "packageName" dep) then dep.packageName else dep.name) copyDeps); + extraDeps = (builtins.map (dep: if (builtins.hasAttr "packageName" dep) then dep.packageName else dep.name) + (lib.optionals (builtins.hasAttr "extraDependencies" drv) drv.extraDependencies)); + extraDepsStr = builtins.concatStringsSep " " extraDeps; + buildDepDep = lib.lists.unique (lib.lists.concatMap (d: d.buildInputs) + (copyDeps ++ (lib.optionals (builtins.hasAttr "extraDependencies" drv) drv.extraDependencies))); + nodeModules = runCommandCC "${sanitizeName packageNix.name}_node_modules" + { buildInputs = [nodejs] ++ buildDepDep; + fixupPhase = "true"; + doCheck = false; + doInstallCheck = false; + version = builtins.hashString "sha512" (lib.strings.concatStrings copyDeps); } + '' + echo 'unpack dependencies...' + mkdir -p $out/lib/node_modules + cd $out/lib + ${linkNodeModules { dependencies = builtins.attrValues isolateDeps; }} + ${copyNodeModules { + dependencies = copyDeps; + }} + ${copyNodeModules { + dependencies = builtins.attrValues dedupedDeps; + }} + chmod -R +rw node_modules + ${copyNodeModules { + dependencies = (lib.optionals (builtins.hasAttr "extraDependencies" drv) drv.extraDependencies); + }} + ${lib.optionalString ((builtins.length extraDeps) > 0) "echo 'resolving incoming transient deps of ${extraDepsStr}...'"} + ${lib.optionalString ((builtins.length extraDeps) > 0) (flattenScript extraDepsStr)} + ${lib.optionalString (builtins.hasAttr "nodeModulesUnpack" drv) drv.nodeModulesUnpack} + echo 'link nodejs bins to out-dir...' + ${linkBins} + ''; + in stdenv.mkDerivation (drv // { + passthru = { inherit nodeModules pkgJsonFile; }; + version = packageNix.version; + name = sanitizeName packageNix.name; + preUnpackBan_ = mkPhaseBan "preUnpack" drv; + unpackBan_ = mkPhaseBan "unpackPhase" drv; + postUnpackBan_ = mkPhaseBan "postUnpack" drv; + preConfigureBan_ = mkPhaseBan "preConfigure" drv; + configureBan_ = mkPhaseBan "configurePhase" drv; + postConfigureBan_ = mkPhaseBan "postConfigure" drv; + src = if (builtins.hasAttr "src" packageNix) then packageNix.src else gitignoreSource ./.; + packageName = packageNix.name; + doStrip = false; + doFixup = false; + doUnpack = true; + NODE_PATH = "./node_modules"; + buildInputs = [ nodejs jq ] ++ lib.optionals (builtins.hasAttr "buildInputs" drv) drv.buildInputs; + + configurePhase = '' + ln -s ${nodeModules}/lib/node_modules node_modules + cat ${pkgJsonFile} > package.json + ''; + buildPhase = '' + runHook preBuild + ${lib.optionalString (builtins.hasAttr "buildPhase" drv) drv.buildPhase} + runHook postBuild + ''; + installPhase = '' + runHook preInstall + mkdir -p $out/lib/node_modules/${packageNix.name} + cp -rfT ./ $out/lib/node_modules/${packageNix.name} + runHook postInstall + ''; + }); + toPackageJson = { jsnixDeps ? {}, extraDeps ? [] }: + let + main = if (builtins.hasAttr "main" packageNix) then packageNix else throw "package.nix is missing main attribute"; + pkgName = if (builtins.hasAttr "packageName" packageNix) + then packageNix.packageName else packageNix.name; + packageNixDeps = if (builtins.hasAttr "dependencies" packageNix) + then packageNix.dependencies + else {}; + extraDeps_ = lib.lists.foldr (dep: acc: { "${dep.packageName}" = dep; } // acc) {} extraDeps; + allDeps = extraDeps_ // packageNixDeps; + prodDeps = lib.lists.foldr + (depName: acc: acc // { + "${depName}" = (if ((builtins.typeOf allDeps."${depName}") == "string") + then allDeps."${depName}" + else + if (((builtins.typeOf allDeps."${depName}") == "set") && + ((builtins.typeOf allDeps."${depName}".version) == "string")) + then allDeps."${depName}".version + else "latest");}) {} (builtins.attrNames allDeps); + safePkgNix = lib.lists.foldr (key: acc: + if ((builtins.typeOf packageNix."${key}") != "lambda") + then (acc // { "${key}" = packageNix."${key}"; }) + else acc) + {} (builtins.attrNames packageNix); + in lib.strings.escapeNixString + (builtins.toJSON (safePkgNix // { dependencies = prodDeps; name = pkgName; })); + mkPhaseBan = phaseName: usrDrv: + if (builtins.hasAttr phaseName usrDrv) then + throw "jsnix error: using ${phaseName} isn't supported at this time" + else ""; + mkPhase = pkgs_: {phase, pkgName}: + lib.optionalString ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "${phase}" packageNix.dependencies."${pkgName}")) + (if builtins.typeOf packageNix.dependencies."${pkgName}"."${phase}" == "string" + then + packageNix.dependencies."${pkgName}"."${phase}" + else + (packageNix.dependencies."${pkgName}"."${phase}" (pkgs_ // { inherit getNodeDep; }))); + mkExtraBuildInputs = pkgs_: {pkgName}: + lib.optionals ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "extraBuildInputs" packageNix.dependencies."${pkgName}")) + (if builtins.typeOf packageNix.dependencies."${pkgName}"."extraBuildInputs" == "list" + then + packageNix.dependencies."${pkgName}"."extraBuildInputs" + else + (packageNix.dependencies."${pkgName}"."extraBuildInputs" (pkgs_ // { inherit getNodeDep; }))); + mkExtraDependencies = pkgs_: {pkgName}: + lib.optionals ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "extraDependencies" packageNix.dependencies."${pkgName}")) + (if builtins.typeOf packageNix.dependencies."${pkgName}"."extraDependencies" == "list" + then + packageNix.dependencies."${pkgName}"."extraDependencies" + else + (packageNix.dependencies."${pkgName}"."extraDependencies" (pkgs_ // { inherit getNodeDep; }))); + mkUnpackScript = { dependencies ? [], extraDependencies ? [], pkgName }: + let copyNodeDependencies = + if ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "copyNodeDependencies" packageNix.dependencies."${pkgName}") && + (builtins.typeOf packageNix.dependencies."${pkgName}"."copyNodeDependencies" == "bool") && + (packageNix.dependencies."${pkgName}"."copyNodeDependencies" == true)) + then true else false; + in '' + ${copyNodeModules { dependencies = dependencies ++ extraDependencies; }} + chmod -R +rw $(pwd) + ''; + mkBuildScript = { dependencies ? [], pkgName }: + let extraNpmFlags = + if ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "npmFlags" packageNix.dependencies."${pkgName}") && + (builtins.typeOf packageNix.dependencies."${pkgName}"."npmFlags" == "string")) + then packageNix.dependencies."${pkgName}"."npmFlags" else ""; + in '' + runHook preBuild + export HOME=$TMPDIR + npm --offline config set node_gyp ${nodejs}/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js + npm --offline config set omit dev + NODE_PATH="$(pwd)/node_modules:$NODE_PATH" \ + npm --offline --nodedir=${nodeSources} --location="$(pwd)" \ + ${extraNpmFlags} "--production" "--preserve-symlinks" \ + rebuild --build-from-source + runHook postBuild + ''; + mkInstallScript = { pkgName }: '' + runHook preInstall + export packageDir="$(pwd)" + mkdir -p $out/lib/node_modules/${pkgName} + cd $out/lib/node_modules/${pkgName} + cp -rfT "$packageDir" "$(pwd)" + if [[ -d "$out/lib/node_modules/${pkgName}/bin" ]] + then + mkdir -p $out/bin + ln -s "$out/lib/node_modules/${pkgName}/bin"/* $out/bin + fi + cd $out/lib/node_modules/${pkgName} + runHook postInstall + ''; + goBinLink = pkgs.buildGoModule { + pname = "bin-link"; + version = "0.0.0"; + vendorSha256 = null; + buildInputs = [ pkgs.nodejs ]; + src = pkgs.fetchFromGitHub { + owner = "hlolli"; + repo = "jsnix"; + rev = "a66cf91ad49833ef3d84064c1037d942c97838bb"; + sha256 = "AvDZXUSxuJa5lZ7zRdXWIDYTYfbH2VfpuHbvZBrT9f0="; + }; + preBuild = '' + cd go/bin-link + ''; +}; + goFlatten = pkgs.buildGoModule { + pname = "flatten"; + version = "0.0.0"; + vendorSha256 = null; + buildInputs = [ pkgs.nodejs ]; + src = pkgs.fetchFromGitHub { + owner = "hlolli"; + repo = "jsnix"; + rev = "a66cf91ad49833ef3d84064c1037d942c97838bb"; + sha256 = "AvDZXUSxuJa5lZ7zRdXWIDYTYfbH2VfpuHbvZBrT9f0="; + }; + preBuild = '' + cd go/flatten + ''; +}; + sources = rec { + "@sindresorhus/is-4.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_sindresorhus_slash_is"; + packageName = "@sindresorhus/is"; + version = "4.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@sindresorhus/is"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@sindresorhus/is"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz"; + sha512 = "VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw=="; + }; + }; + "@szmarczak/http-timer-5.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_szmarczak_slash_http-timer"; + packageName = "@szmarczak/http-timer"; + version = "5.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@szmarczak/http-timer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@szmarczak/http-timer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz"; + sha512 = "+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="; + }; + }; + "@types/cacheable-request-6.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_cacheable-request"; + packageName = "@types/cacheable-request"; + version = "6.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/cacheable-request"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/cacheable-request"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz"; + sha512 = "B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA=="; + }; + }; + "@types/http-cache-semantics-4.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_http-cache-semantics"; + packageName = "@types/http-cache-semantics"; + version = "4.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/http-cache-semantics"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/http-cache-semantics"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz"; + sha512 = "SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="; + }; + }; + "@types/keyv-3.1.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_keyv"; + packageName = "@types/keyv"; + version = "3.1.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/keyv"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/keyv"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz"; + sha512 = "FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg=="; + }; + }; + "@types/node-16.11.12" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_node"; + packageName = "@types/node"; + version = "16.11.12"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/node"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/node"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz"; + sha512 = "+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw=="; + }; + }; + "@types/responselike-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_responselike"; + packageName = "@types/responselike"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/responselike"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/responselike"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz"; + sha512 = "85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA=="; + }; + }; + "base64-js-1.5.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "base64-js"; + packageName = "base64-js"; + version = "1.5.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "base64-js"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "base64-js"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"; + sha512 = "AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="; + }; + }; + "buffer-4.9.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "buffer"; + packageName = "buffer"; + version = "4.9.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "buffer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "buffer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz"; + sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="; + }; + }; + "buffer-writer-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "buffer-writer"; + packageName = "buffer-writer"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "buffer-writer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "buffer-writer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz"; + sha512 = "a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="; + }; + }; + "cacheable-lookup-6.0.4" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "cacheable-lookup"; + packageName = "cacheable-lookup"; + version = "6.0.4"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "cacheable-lookup"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "cacheable-lookup"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz"; + sha512 = "mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="; + }; + }; + "cacheable-request-7.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "cacheable-request"; + packageName = "cacheable-request"; + version = "7.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "cacheable-request"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "cacheable-request"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz"; + sha512 = "pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew=="; + }; + }; + "clone-response-1.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "clone-response"; + packageName = "clone-response"; + version = "1.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "clone-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "clone-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"; + sha1 = "d1dc973920314df67fbeb94223b4ee350239e96b"; + }; + }; + "colorette-2.0.16" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "colorette"; + packageName = "colorette"; + version = "2.0.16"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "colorette"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "colorette"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz"; + sha512 = "hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="; + }; + }; + "commander-7.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "commander"; + packageName = "commander"; + version = "7.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "commander"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "commander"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"; + sha512 = "QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="; + }; + }; + "debug-4.3.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "debug"; + packageName = "debug"; + version = "4.3.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "debug"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "debug"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz"; + sha512 = "mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw=="; + }; + }; + "decompress-response-6.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "decompress-response"; + packageName = "decompress-response"; + version = "6.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "decompress-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "decompress-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz"; + sha512 = "aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="; + }; + }; + "defer-to-connect-2.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "defer-to-connect"; + packageName = "defer-to-connect"; + version = "2.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "defer-to-connect"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "defer-to-connect"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz"; + sha512 = "4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="; + }; + }; + "end-of-stream-1.4.4" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "end-of-stream"; + packageName = "end-of-stream"; + version = "1.4.4"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "end-of-stream"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "end-of-stream"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"; + sha512 = "+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="; + }; + }; + "escalade-3.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "escalade"; + packageName = "escalade"; + version = "3.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "escalade"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "escalade"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"; + sha512 = "k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="; + }; + }; + "esm-3.2.25" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "esm"; + packageName = "esm"; + version = "3.2.25"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "esm"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "esm"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz"; + sha512 = "U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="; + }; + }; + "events-1.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "events"; + packageName = "events"; + version = "1.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "events"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "events"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/events/-/events-1.1.1.tgz"; + sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"; + }; + }; + "form-data-encoder-1.7.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "form-data-encoder"; + packageName = "form-data-encoder"; + version = "1.7.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "form-data-encoder"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "form-data-encoder"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz"; + sha512 = "EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg=="; + }; + }; + "function-bind-1.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "function-bind"; + packageName = "function-bind"; + version = "1.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "function-bind"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "function-bind"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"; + sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="; + }; + }; + "get-stream-5.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "get-stream"; + packageName = "get-stream"; + version = "5.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "get-stream"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "get-stream"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"; + sha512 = "nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="; + }; + }; + "get-stream-6.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "get-stream"; + packageName = "get-stream"; + version = "6.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "get-stream"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "get-stream"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"; + sha512 = "ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="; + }; + }; + "getopts-2.2.5" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "getopts"; + packageName = "getopts"; + version = "2.2.5"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "getopts"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "getopts"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz"; + sha512 = "9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="; + }; + }; + "has-1.0.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "has"; + packageName = "has"; + version = "1.0.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "has"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "has"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz"; + sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="; + }; + }; + "http-cache-semantics-4.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "http-cache-semantics"; + packageName = "http-cache-semantics"; + version = "4.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "http-cache-semantics"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "http-cache-semantics"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"; + sha512 = "carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="; + }; + }; + "http2-wrapper-2.1.10" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "http2-wrapper"; + packageName = "http2-wrapper"; + version = "2.1.10"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "http2-wrapper"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "http2-wrapper"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.10.tgz"; + sha512 = "QHgsdYkieKp+6JbXP25P+tepqiHYd+FVnDwXpxi/BlUcoIB0nsmTOymTNvETuTO+pDuwcSklPE72VR3DqV+Haw=="; + }; + }; + "ieee754-1.1.13" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "ieee754"; + packageName = "ieee754"; + version = "1.1.13"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "ieee754"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "ieee754"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"; + sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="; + }; + }; + "interpret-2.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "interpret"; + packageName = "interpret"; + version = "2.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "interpret"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "interpret"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz"; + sha512 = "Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="; + }; + }; + "is-core-module-2.8.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "is-core-module"; + packageName = "is-core-module"; + version = "2.8.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "is-core-module"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "is-core-module"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz"; + sha512 = "vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw=="; + }; + }; + "isarray-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "isarray"; + packageName = "isarray"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "isarray"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "isarray"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"; + sha1 = "bb935d48582cba168c06834957a54a3e07124f11"; + }; + }; + "jmespath-0.15.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "jmespath"; + packageName = "jmespath"; + version = "0.15.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "jmespath"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "jmespath"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz"; + sha1 = "a3f222a9aae9f966f5d27c796510e28091764217"; + }; + }; + "json-buffer-3.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "json-buffer"; + packageName = "json-buffer"; + version = "3.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "json-buffer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "json-buffer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"; + sha512 = "4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="; + }; + }; + "keyv-4.0.4" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "keyv"; + packageName = "keyv"; + version = "4.0.4"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "keyv"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "keyv"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz"; + sha512 = "vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg=="; + }; + }; + "lodash-4.17.21" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "lodash"; + packageName = "lodash"; + version = "4.17.21"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "lodash"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "lodash"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"; + sha512 = "v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="; + }; + }; + "lowercase-keys-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "lowercase-keys"; + packageName = "lowercase-keys"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "lowercase-keys"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "lowercase-keys"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"; + sha512 = "tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="; + }; + }; + "lowercase-keys-3.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "lowercase-keys"; + packageName = "lowercase-keys"; + version = "3.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "lowercase-keys"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "lowercase-keys"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz"; + sha512 = "ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="; + }; + }; + "mimic-response-1.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "mimic-response"; + packageName = "mimic-response"; + version = "1.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "mimic-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "mimic-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"; + sha512 = "j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="; + }; + }; + "mimic-response-3.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "mimic-response"; + packageName = "mimic-response"; + version = "3.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "mimic-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "mimic-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"; + sha512 = "z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="; + }; + }; + "ms-2.1.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "ms"; + packageName = "ms"; + version = "2.1.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "ms"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "ms"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"; + sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="; + }; + }; + "normalize-url-6.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "normalize-url"; + packageName = "normalize-url"; + version = "6.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "normalize-url"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "normalize-url"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"; + sha512 = "DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="; + }; + }; + "once-1.4.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "once"; + packageName = "once"; + version = "1.4.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "once"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "once"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz"; + sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1"; + }; + }; + "p-cancelable-3.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "p-cancelable"; + packageName = "p-cancelable"; + version = "3.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "p-cancelable"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "p-cancelable"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz"; + sha512 = "mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="; + }; + }; + "p-timeout-5.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "p-timeout"; + packageName = "p-timeout"; + version = "5.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "p-timeout"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "p-timeout"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/p-timeout/-/p-timeout-5.0.2.tgz"; + sha512 = "sEmji9Yaq+Tw+STwsGAE56hf7gMy9p0tQfJojIAamB7WHJYJKf1qlsg9jqBWG8q9VCxKPhZaP/AcXwEoBcYQhQ=="; + }; + }; + "packet-reader-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "packet-reader"; + packageName = "packet-reader"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "packet-reader"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "packet-reader"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz"; + sha512 = "HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="; + }; + }; + "path-parse-1.0.7" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "path-parse"; + packageName = "path-parse"; + version = "1.0.7"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "path-parse"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "path-parse"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"; + sha512 = "LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="; + }; + }; + "pg-connection-string-2.5.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-connection-string"; + packageName = "pg-connection-string"; + version = "2.5.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-connection-string"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-connection-string"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz"; + sha512 = "r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="; + }; + }; + "pg-int8-1.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-int8"; + packageName = "pg-int8"; + version = "1.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-int8"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-int8"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz"; + sha512 = "WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="; + }; + }; + "pg-pool-3.4.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-pool"; + packageName = "pg-pool"; + version = "3.4.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-pool"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-pool"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz"; + sha512 = "TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ=="; + }; + }; + "pg-protocol-1.5.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-protocol"; + packageName = "pg-protocol"; + version = "1.5.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-protocol"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-protocol"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz"; + sha512 = "muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="; + }; + }; + "pg-types-2.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-types"; + packageName = "pg-types"; + version = "2.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-types"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-types"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz"; + sha512 = "qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="; + }; + }; + "pgpass-1.0.5" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pgpass"; + packageName = "pgpass"; + version = "1.0.5"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pgpass"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pgpass"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz"; + sha512 = "FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="; + }; + }; + "postgres-array-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-array"; + packageName = "postgres-array"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-array"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-array"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz"; + sha512 = "VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="; + }; + }; + "postgres-bytea-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-bytea"; + packageName = "postgres-bytea"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-bytea"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-bytea"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz"; + sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35"; + }; + }; + "postgres-date-1.0.7" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-date"; + packageName = "postgres-date"; + version = "1.0.7"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-date"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-date"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz"; + sha512 = "suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="; + }; + }; + "postgres-interval-1.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-interval"; + packageName = "postgres-interval"; + version = "1.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-interval"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-interval"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz"; + sha512 = "9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="; + }; + }; + "pump-3.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pump"; + packageName = "pump"; + version = "3.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pump"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pump"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"; + sha512 = "LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="; + }; + }; + "punycode-1.3.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "punycode"; + packageName = "punycode"; + version = "1.3.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "punycode"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "punycode"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"; + sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d"; + }; + }; + "querystring-0.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "querystring"; + packageName = "querystring"; + version = "0.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "querystring"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "querystring"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"; + sha1 = "b209849203bb25df820da756e747005878521620"; + }; + }; + "quick-lru-5.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "quick-lru"; + packageName = "quick-lru"; + version = "5.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "quick-lru"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "quick-lru"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"; + sha512 = "WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="; + }; + }; + "rechoir-0.7.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "rechoir"; + packageName = "rechoir"; + version = "0.7.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "rechoir"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "rechoir"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz"; + sha512 = "ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q=="; + }; + }; + "resolve-1.20.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "resolve"; + packageName = "resolve"; + version = "1.20.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "resolve"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "resolve"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"; + sha512 = "wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A=="; + }; + }; + "resolve-alpn-1.2.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "resolve-alpn"; + packageName = "resolve-alpn"; + version = "1.2.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "resolve-alpn"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "resolve-alpn"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz"; + sha512 = "0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="; + }; + }; + "resolve-from-5.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "resolve-from"; + packageName = "resolve-from"; + version = "5.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "resolve-from"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "resolve-from"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"; + sha512 = "qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="; + }; + }; + "responselike-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "responselike"; + packageName = "responselike"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "responselike"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "responselike"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz"; + sha512 = "xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw=="; + }; + }; + "retry-0.13.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "retry"; + packageName = "retry"; + version = "0.13.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "retry"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "retry"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz"; + sha512 = "XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="; + }; + }; + "sax-1.2.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "sax"; + packageName = "sax"; + version = "1.2.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "sax"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "sax"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz"; + sha1 = "7b8e656190b228e81a66aea748480d828cd2d37a"; + }; + }; + "split2-4.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "split2"; + packageName = "split2"; + version = "4.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "split2"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "split2"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz"; + sha512 = "VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="; + }; + }; + "tarn-3.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "tarn"; + packageName = "tarn"; + version = "3.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "tarn"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "tarn"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz"; + sha512 = "51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="; + }; + }; + "tildify-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "tildify"; + packageName = "tildify"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "tildify"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "tildify"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz"; + sha512 = "Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="; + }; + }; + "url-0.10.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "url"; + packageName = "url"; + version = "0.10.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "url"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "url"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/url/-/url-0.10.3.tgz"; + sha1 = "021e4d9c7705f21bbf37d03ceb58767402774c64"; + }; + }; + "uuid-3.3.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "uuid"; + packageName = "uuid"; + version = "3.3.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "uuid"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "uuid"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz"; + sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="; + }; + }; + "wrappy-1.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "wrappy"; + packageName = "wrappy"; + version = "1.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "wrappy"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "wrappy"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"; + sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"; + }; + }; + "xml2js-0.4.19" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "xml2js"; + packageName = "xml2js"; + version = "0.4.19"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "xml2js"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "xml2js"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz"; + sha512 = "esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q=="; + }; + }; + "xmlbuilder-9.0.7" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "xmlbuilder"; + packageName = "xmlbuilder"; + version = "9.0.7"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "xmlbuilder"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "xmlbuilder"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz"; + sha1 = "132ee63d2ec5565c557e20f4c22df9aca686b10d"; + }; + }; + "xtend-4.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "xtend"; + packageName = "xtend"; + version = "4.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "xtend"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "xtend"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"; + sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="; + }; + }; + "yocto-queue-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "yocto-queue"; + packageName = "yocto-queue"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "yocto-queue"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "yocto-queue"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz"; + sha512 = "9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g=="; + }; + }; + "yoctodelay-1.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "yoctodelay"; + packageName = "yoctodelay"; + version = "1.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "yoctodelay"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "yoctodelay"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/yoctodelay/-/yoctodelay-1.2.0.tgz"; + sha512 = "12y/P9MSig9/5BEhBgylss+fkHiCRZCvYR81eH35NW9uw801cvJt31EAV+WOLcwZRZbLiIQl/hxcdXXXFmGvXg=="; + }; + }; + }; + jsnixDeps = { + async-retry = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "async-retry"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "async-retry"; + packageName = "async-retry"; + version = "1.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz"; + sha512 = "wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "async-retry"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "async-retry"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "async-retry"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "async-retry"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "async-retry"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "async-retry"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "async-retry"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "async-retry"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "async-retry"; }); + meta = { + description = "Retrying made simple, easy and async"; + license = "MIT"; + homepage = "https://github.com/vercel/async-retry#readme"; + }; + }; + aws-sdk = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "aws-sdk"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "aws-sdk"; + packageName = "aws-sdk"; + version = "2.1046.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1046.0.tgz"; + sha512 = "ocwHclMXdIA+NWocUyvp9Ild3/zy2vr5mHp3mTyodf0WU5lzBE8PocCVLSWhMAXLxyia83xv2y5f5AzAcetbqA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "aws-sdk"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "aws-sdk"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "aws-sdk"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "aws-sdk"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "aws-sdk"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "aws-sdk"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "aws-sdk"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "aws-sdk"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "aws-sdk"; }); + meta = { + description = "AWS SDK for JavaScript"; + license = "Apache-2.0"; + homepage = "https://github.com/aws/aws-sdk-js"; + }; + }; + dotenv = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "dotenv"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "dotenv"; + packageName = "dotenv"; + version = "10.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz"; + sha512 = "rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "dotenv"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "dotenv"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "dotenv"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "dotenv"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "dotenv"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "dotenv"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "dotenv"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "dotenv"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "dotenv"; }); + meta = { + description = "Loads environment variables from .env file"; + license = "BSD-2-Clause"; + homepage = "https://github.com/motdotla/dotenv#readme"; + }; + }; + exit-hook = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "exit-hook"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "exit-hook"; + packageName = "exit-hook"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/exit-hook/-/exit-hook-3.0.0.tgz"; + sha512 = "ElRvnoj3dvOc5WjnQx0CF66rS0xehV6eZdcmqZX17uOLPy3me43frl8UD73Frkx5Aq5kgziMDECjDJR2X1oBFQ=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "exit-hook"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "exit-hook"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "exit-hook"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "exit-hook"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "exit-hook"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "exit-hook"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "exit-hook"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "exit-hook"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "exit-hook"; }); + meta = { + description = "Run some code when the process exits"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/exit-hook#readme"; + }; + }; + got = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "got"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "got"; + packageName = "got"; + version = "12.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/got/-/got-12.0.0.tgz"; + sha512 = "gNNNghQ1yw0hyzie1FLK6gY90BQlXU9zSByyRygnbomHPruKQ6hAKKbpO1RfNZp8b+qNzNipGeRG3tUelKcVsA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "got"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "got"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "got"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "got"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "got"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "got"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "got"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "got"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "got"; }); + meta = { + description = "Human-friendly and powerful HTTP request library for Node.js"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/got#readme"; + }; + }; + knex = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "knex"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "knex"; + packageName = "knex"; + version = "0.95.14"; + src = fetchurl { + url = "https://registry.npmjs.org/knex/-/knex-0.95.14.tgz"; + sha512 = "j4qLjWySrC/JRRVtOpoR2LcS1yBOsd7Krc6mEukPvmTDX/w11pD52Pq9FYR56/kLXGeAV8jFdWBjsZFi1mscWg=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "knex"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "knex"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "knex"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "knex"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "knex"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "knex"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "knex"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "knex"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "knex"; }); + meta = { + description = "A batteries-included SQL query & schema builder for PostgresSQL, MySQL, CockroachDB, MSSQL and SQLite3"; + license = "MIT"; + homepage = "https://knexjs.org"; + }; + }; + moment = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "moment"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "moment"; + packageName = "moment"; + version = "2.29.1"; + src = fetchurl { + url = "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"; + sha512 = "kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "moment"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "moment"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "moment"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "moment"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "moment"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "moment"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "moment"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "moment"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "moment"; }); + meta = { + description = "Parse, validate, manipulate, and display dates"; + license = "MIT"; + homepage = "https://momentjs.com"; + }; + }; + p-limit = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-limit"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-limit"; + packageName = "p-limit"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz"; + sha512 = "5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-limit"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-limit"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-limit"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-limit"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-limit"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-limit"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-limit"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-limit"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-limit"; }); + meta = { + description = "Run multiple promise-returning & async functions with limited concurrency"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-limit#readme"; + }; + }; + p-min-delay = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-min-delay"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-min-delay"; + packageName = "p-min-delay"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/p-min-delay/-/p-min-delay-4.0.1.tgz"; + sha512 = "Tgkn+fy2VYNWw9bLy4BwiF+1ZMIgTDBIpaIChi1HC3N4nwRpandJnG1jAEXiYCcrTZKYQJdBWzLJauAeYDXsBg=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-min-delay"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-min-delay"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-min-delay"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-min-delay"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-min-delay"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-min-delay"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-min-delay"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-min-delay"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-min-delay"; }); + meta = { + description = "Delay a promise a minimum amount of time"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-min-delay#readme"; + }; + }; + p-wait-for = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-wait-for"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-wait-for"; + packageName = "p-wait-for"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz"; + sha512 = "i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-wait-for"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-wait-for"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-wait-for"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-wait-for"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-wait-for"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-wait-for"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-wait-for"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-wait-for"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-wait-for"; }); + meta = { + description = "Wait for a condition to be true"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-wait-for#readme"; + }; + }; + p-whilst = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-whilst"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-whilst"; + packageName = "p-whilst"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-whilst/-/p-whilst-3.0.0.tgz"; + sha512 = "vaiNNmeIUGtMzf121RTb3CCC0Nl4WNeHjbmPjRcwPo6vQiHEJRpHbeOcyLBZspuyz2yG+G2xwzVIiULd1Mk6MA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-whilst"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-whilst"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-whilst"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-whilst"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-whilst"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-whilst"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-whilst"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-whilst"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-whilst"; }); + meta = { + description = "While a condition returns true, calls a function repeatedly, and then resolves the promise"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-whilst#readme"; + }; + }; + pg = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "pg"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "pg"; + packageName = "pg"; + version = "8.7.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz"; + sha512 = "7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "pg"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "pg"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "pg"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "pg"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "pg"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "pg"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "pg"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "pg"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "pg"; }); + meta = { + description = "PostgreSQL client - pure javascript & libpq with the same API"; + license = "MIT"; + homepage = "https://github.com/brianc/node-postgres"; + }; + }; + ramda = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "ramda"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "ramda"; + packageName = "ramda"; + version = "0.27.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz"; + sha512 = "PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "ramda"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "ramda"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "ramda"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "ramda"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "ramda"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "ramda"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "ramda"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "ramda"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "ramda"; }); + meta = { + description = "A practical functional library for JavaScript programmers."; + license = "MIT"; + homepage = "https://ramdajs.com/"; + }; + }; + }; + dedupedDeps = { + retry = sources."retry-0.13.1" { + dependencies = []; + }; + base64-js = sources."base64-js-1.5.1" { + dependencies = []; + }; + buffer = sources."buffer-4.9.2" { + dependencies = []; + }; + events = sources."events-1.1.1" { + dependencies = []; + }; + ieee754 = sources."ieee754-1.1.13" { + dependencies = []; + }; + isarray = sources."isarray-1.0.0" { + dependencies = []; + }; + jmespath = sources."jmespath-0.15.0" { + dependencies = []; + }; + punycode = sources."punycode-1.3.2" { + dependencies = []; + }; + querystring = sources."querystring-0.2.0" { + dependencies = []; + }; + sax = sources."sax-1.2.1" { + dependencies = []; + }; + url = sources."url-0.10.3" { + dependencies = []; + }; + uuid = sources."uuid-3.3.2" { + dependencies = []; + }; + xml2js = sources."xml2js-0.4.19" { + dependencies = []; + }; + xmlbuilder = sources."xmlbuilder-9.0.7" { + dependencies = []; + }; + "@sindresorhus/is" = sources."@sindresorhus/is-4.2.0" { + dependencies = []; + }; + "@szmarczak/http-timer" = sources."@szmarczak/http-timer-5.0.1" { + dependencies = []; + }; + "@types/cacheable-request" = sources."@types/cacheable-request-6.0.2" { + dependencies = []; + }; + "@types/http-cache-semantics" = sources."@types/http-cache-semantics-4.0.1" { + dependencies = []; + }; + "@types/keyv" = sources."@types/keyv-3.1.3" { + dependencies = []; + }; + "@types/node" = sources."@types/node-16.11.12" { + dependencies = []; + }; + "@types/responselike" = sources."@types/responselike-1.0.0" { + dependencies = []; + }; + cacheable-lookup = sources."cacheable-lookup-6.0.4" { + dependencies = []; + }; + cacheable-request = sources."cacheable-request-7.0.2" { + dependencies = [ + (sources."get-stream-5.2.0" { + dependencies = []; + }) + (sources."lowercase-keys-2.0.0" { + dependencies = []; + }) + ]; + }; + clone-response = sources."clone-response-1.0.2" { + dependencies = []; + }; + decompress-response = sources."decompress-response-6.0.0" { + dependencies = [ + (sources."mimic-response-3.1.0" { + dependencies = []; + }) + ]; + }; + defer-to-connect = sources."defer-to-connect-2.0.1" { + dependencies = []; + }; + end-of-stream = sources."end-of-stream-1.4.4" { + dependencies = []; + }; + form-data-encoder = sources."form-data-encoder-1.7.1" { + dependencies = []; + }; + get-stream = sources."get-stream-6.0.1" { + dependencies = []; + }; + http-cache-semantics = sources."http-cache-semantics-4.1.0" { + dependencies = []; + }; + http2-wrapper = sources."http2-wrapper-2.1.10" { + dependencies = []; + }; + json-buffer = sources."json-buffer-3.0.1" { + dependencies = []; + }; + keyv = sources."keyv-4.0.4" { + dependencies = []; + }; + lowercase-keys = sources."lowercase-keys-3.0.0" { + dependencies = []; + }; + mimic-response = sources."mimic-response-1.0.1" { + dependencies = []; + }; + normalize-url = sources."normalize-url-6.1.0" { + dependencies = []; + }; + once = sources."once-1.4.0" { + dependencies = []; + }; + p-cancelable = sources."p-cancelable-3.0.0" { + dependencies = []; + }; + pump = sources."pump-3.0.0" { + dependencies = []; + }; + quick-lru = sources."quick-lru-5.1.1" { + dependencies = []; + }; + resolve-alpn = sources."resolve-alpn-1.2.1" { + dependencies = []; + }; + responselike = sources."responselike-2.0.0" { + dependencies = [ + (sources."lowercase-keys-2.0.0" { + dependencies = []; + }) + ]; + }; + wrappy = sources."wrappy-1.0.2" { + dependencies = []; + }; + colorette = sources."colorette-2.0.16" { + dependencies = []; + }; + commander = sources."commander-7.2.0" { + dependencies = []; + }; + debug = sources."debug-4.3.2" { + dependencies = []; + }; + escalade = sources."escalade-3.1.1" { + dependencies = []; + }; + esm = sources."esm-3.2.25" { + dependencies = []; + }; + function-bind = sources."function-bind-1.1.1" { + dependencies = []; + }; + getopts = sources."getopts-2.2.5" { + dependencies = []; + }; + has = sources."has-1.0.3" { + dependencies = []; + }; + interpret = sources."interpret-2.2.0" { + dependencies = []; + }; + is-core-module = sources."is-core-module-2.8.0" { + dependencies = []; + }; + lodash = sources."lodash-4.17.21" { + dependencies = []; + }; + ms = sources."ms-2.1.2" { + dependencies = []; + }; + path-parse = sources."path-parse-1.0.7" { + dependencies = []; + }; + pg-connection-string = sources."pg-connection-string-2.5.0" { + dependencies = []; + }; + rechoir = sources."rechoir-0.7.0" { + dependencies = []; + }; + resolve = sources."resolve-1.20.0" { + dependencies = []; + }; + resolve-from = sources."resolve-from-5.0.0" { + dependencies = []; + }; + tarn = sources."tarn-3.0.2" { + dependencies = []; + }; + tildify = sources."tildify-2.0.0" { + dependencies = []; + }; + yocto-queue = sources."yocto-queue-1.0.0" { + dependencies = []; + }; + yoctodelay = sources."yoctodelay-1.2.0" { + dependencies = []; + }; + p-timeout = sources."p-timeout-5.0.2" { + dependencies = []; + }; + buffer-writer = sources."buffer-writer-2.0.0" { + dependencies = []; + }; + packet-reader = sources."packet-reader-1.0.0" { + dependencies = []; + }; + pg-int8 = sources."pg-int8-1.0.1" { + dependencies = []; + }; + pg-pool = sources."pg-pool-3.4.1" { + dependencies = []; + }; + pg-protocol = sources."pg-protocol-1.5.0" { + dependencies = []; + }; + pg-types = sources."pg-types-2.2.0" { + dependencies = []; + }; + pgpass = sources."pgpass-1.0.5" { + dependencies = []; + }; + postgres-array = sources."postgres-array-2.0.0" { + dependencies = []; + }; + postgres-bytea = sources."postgres-bytea-1.0.0" { + dependencies = []; + }; + postgres-date = sources."postgres-date-1.0.7" { + dependencies = []; + }; + postgres-interval = sources."postgres-interval-1.2.0" { + dependencies = []; + }; + split2 = sources."split2-4.1.0" { + dependencies = []; + }; + xtend = sources."xtend-4.0.2" { + dependencies = []; + }; + }; + isolateDeps = {}; +in +jsnixDeps // (if builtins.hasAttr "packageDerivation" packageNix then { + "${packageNix.name}" = jsnixDrvOverrides { + inherit dedupedDeps jsnixDeps isolateDeps; + drv_ = packageNix.packageDerivation; + }; +} else {}) \ No newline at end of file diff --git a/ec2/import-blocks/package.nix b/ec2/import-blocks/package.nix new file mode 100644 index 0000000..82737aa --- /dev/null +++ b/ec2/import-blocks/package.nix @@ -0,0 +1,43 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +{ + name = "@ar.io/import-blocks"; + version = "1.0.0"; + main = "src/index.mjs"; + + dependencies = { + async-retry = "^1.3.3"; + aws-sdk = "^2.1046.0"; + dotenv = "^10.0.0"; + exit-hook = "^3.0.0"; + got = "^12.0.0"; + knex = "^0.95.14"; + moment = "latest"; + pg = "^8.7.1"; + p-limit = "^4.0.0"; + p-wait-for = "^4.1.0"; + p-whilst = "^3.0.0"; + p-min-delay = "^4.0.1"; + ramda = "^0.27.1"; + }; + packageDerivation = { jsnixDeps, ... }@pkgs: { + buildInputs = [ ]; + # buildPhase = "tsc --build tsconfig.json"; + }; +} diff --git a/ec2/import-blocks/src/block-db.mjs b/ec2/import-blocks/src/block-db.mjs new file mode 100644 index 0000000..ebbfa59 --- /dev/null +++ b/ec2/import-blocks/src/block-db.mjs @@ -0,0 +1,192 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import R from "ramda"; +import pLimit from "p-limit"; +import moment from "moment"; +import { enqueue } from "./sqs.mjs"; + +// The pg driver and knex don't know the destination column types, +// and they don't correctly serialize json fields, so this needs +// to be done manually. +const serialize = (row) => { + return R.reduce((result, key) => { + const value = row[key]; + result[key] = + value && typeof value == "object" ? JSON.stringify(value) : value; + return result; + }, {})(Object.keys(row)); +}; + +const upsert = async ( + connection, + { table, conflictKeys, rows, transaction } +) => { + const updateFields = Object.keys(rows[0]) + .filter((field) => !conflictKeys.includes(field)) + .map((field) => `${field} = excluded.${field}`) + .join(","); + + const query = connection.insert(rows).into(table); + + if (transaction) { + query.transacting(transaction); + } + + const { sql, bindings } = query.toSQL(); + + const upsertSql = sql.concat( + ` ON CONFLICT (${conflictKeys + .map((key) => `"${key}"`) + .join(",")}) DO UPDATE SET ${updateFields};` + ); + + return await connection.raw(upsertSql, bindings); +}; + +const txImportQueueUrl = process.env.ARWEAVE_SQS_IMPORT_TXS_URL; + +const enqueueTxImports = async (queueUrl, txIds) => { + const parallelize = pLimit(10); + console.log(`[import-blocks] queuing block txs`); + await Promise.all( + txIds.map((txid) => { + return parallelize(() => { + return enqueue(queueUrl, { id: txid, message: { id: txid } }); + }); + }) + ); +}; + +export const saveBlocks = async (connection, blocks) => { + const blockTxMappings = blocks.reduce((map, block) => { + return map.concat({ + block, + txs: block.txs.map((tx_id) => { + return { height: block.height, id: tx_id }; + }), + }); + }, []); + + console.log(`[block-db] inserting block headers into blocks table`); + + for (const map of R.reverse(blockTxMappings)) { + const { block, txs } = map; + await connection.transaction(async (knexTransaction) => { + console.log(`[block-db] saving block`, { + height: block.height, + id: block.id, + }); + + await upsert(knexTransaction, { + table: "blocks", + conflictKeys: ["height"], + rows: [serialize(block)], + transaction: knexTransaction, + }); + + const parallelize = pLimit(10); + console.log(`[block-db] setting tx block heights`); + await Promise.all( + txs.map((item) => { + return parallelize(() => { + return upsert(knexTransaction, { + table: "transactions", + conflictKeys: ["id"], + rows: [item], + transaction: knexTransaction, + }); + }); + }) + ); + }); + + console.log(`[block-db] enqueue-ing tx-imports`); + + // requeue *all* transactions involved in blocks that have forked. + // Some of them may have been imported already and purged, so we + // reimport everything to make sure there are no gaps. + await enqueueTxImports(txImportQueueUrl, block.txs); + } +}; + +const blockFields = [ + "id", + "height", + "mined_at", + "previous_block", + "txs", + "extended", +]; + +const extendedFields = [ + "diff", + "hash", + "reward_addr", + "last_retarget", + "tx_root", + "tx_tree", + "reward_pool", + "weave_size", + "block_size", + "cumulative_diff", + "hash_list_merkle", + "tags", +]; + +export const getHighestBlock = async (connection) => { + const block = await connection + .select(blockFields) + .from("blocks") + .orderBy("height", "desc") + .first(); + + if (block) { + return block; + } else { + console.error( + "Failed to get latest block from the block database, assuming 0" + ); + return { + id: "7wIU7KolICAjClMlcZ38LZzshhI7xGkm2tDCJR7Wvhe3ESUo2-Z4-y0x1uaglRJE", + height: 0, + }; + } +}; + +export const getRecentBlocks = async (connection) => { + return connection + .select(blockFields) + .from("blocks") + .orderBy("height", "desc") + .limit(400); +}; + +/** + * Format a full block into a stripped down version for storage in the postgres DB. + */ +export const fullBlockToDbBlock = (block) => { + return { + id: block.indep_hash, + height: block.height, + previous_block: block.previous_block, + txs: block.txs, + mined_at: moment(block.timestamp * 1000).format(), + extended: R.pick(extendedFields)(block), + }; +}; diff --git a/ec2/import-blocks/src/env.mjs b/ec2/import-blocks/src/env.mjs new file mode 100644 index 0000000..cbed791 --- /dev/null +++ b/ec2/import-blocks/src/env.mjs @@ -0,0 +1,28 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import dotenv from "dotenv"; + +if (process.env.ARWEAVE_DOTENV_PATH) { + dotenv.config({ + silent: true, + path: process.env.ARWEAVE_DOTENV_PATH, + }); +} else { + dotenv.config({ silent: true }); +} diff --git a/ec2/import-blocks/src/index.mjs b/ec2/import-blocks/src/index.mjs new file mode 100644 index 0000000..a0911d3 --- /dev/null +++ b/ec2/import-blocks/src/index.mjs @@ -0,0 +1,244 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import "./env.mjs"; +import R from "ramda"; +import retry from "async-retry"; +import pWaitFor from "p-wait-for"; +import pMinDelay from "p-min-delay"; +import pWhilst from "p-whilst"; +import exitHook from "exit-hook"; +import got from "got"; +import { createDbClient } from "./postgres.mjs"; +import { shuffle } from "./utils.mjs"; +import { + fullBlockToDbBlock, + getHighestBlock, + getRecentBlocks, + saveBlocks, +} from "./block-db.mjs"; + +let exitSignaled = false; + +exitHook(() => { + exitSignaled = true; +}); + +const nodes = new Set(); + +async function refreshNodes() { + let jsonResponse; + try { + await retry( + async () => { + jsonResponse = await got("https://arweave.net/health").json(); + }, + { + retries: 5, + } + ); + } catch (error) { + console.error(error); + } + + if (typeof jsonResponse === "object" && Array.isArray(jsonResponse.origins)) { + for (const origin of jsonResponse.origins) { + if (origin.status === 200) { + nodes.add(origin.endpoint); + } else { + nodes.remove(origin.endpoint); + } + } + } +} + +let latestBlock; +let lastBlock; + +export const getNewestBlock = async () => { + for (const node of nodes.values()) { + let response; + try { + response = await got(node + "/block/current").json(); + // const response = await got(node + "/block/height/705101").json(); + } catch {} + if (typeof response === "object" && typeof response.height === "number") { + return response; + } + } +}; + +export const getSpecificBlock = async (hash) => { + let block; + for (const node of nodes.values()) { + try { + const response = await got(node + "/block/hash/" + hash).json(); + + if (typeof response === "object" && response.indep_hash === hash) { + block = response; + } + } catch (error) { + console.error(error); + } + if (block) { + return block; + } + } + return block; +}; + +export const getSpecificBlockHeight = async (height) => { + let block; + for (const node of nodes.values()) { + try { + const response = await got(node + "/block/height/" + height).json(); + + if (typeof response === "object") { + block = response; + } + } catch (error) { + console.error(error); + } + if (block) { + return block; + } + } + return block; +}; + +(async () => { + console.log("starting import-blocks..."); + console.log(process.env); + await refreshNodes(); + + const dbRead = await createDbClient({ + user: "read", + }); + const dbWrite = await createDbClient({ + user: "write", + }); + + lastBlock = await getHighestBlock(dbRead); + latestBlock = await getNewestBlock(); + + pWhilst( + () => !exitSignaled, + async () => { + console.log("Polling for new block..."); + try { + // await pMinDelay(getNewestBlock(), 5 * 1000); + await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); + latestBlock = await getNewestBlock(); + // mega-gap scenario + // dont import more than 100 block in single go + // due do crazy memory needed to do so. + if ( + lastBlock && + latestBlock && + latestBlock.height - lastBlock.height > 100 + ) { + console.log("far behind: resolving next 100 blocks"); + latestBlock = await getSpecificBlockHeight(lastBlock.height + 100); + } + + console.log("Comparing", lastBlock.height, latestBlock.height); + if (lastBlock && latestBlock && latestBlock.height > lastBlock.height) { + console.log("New block detected: ", latestBlock.height); + if ( + typeof latestBlock === "object" && + (latestBlock.height === 0 || + latestBlock.previous_block === lastBlock.id) + ) { + console.log("current block matches new block's previous block"); + await saveBlocks(dbWrite, [fullBlockToDbBlock(latestBlock)]); + console.log("[import-blocks] saveBlock completed!"); + lastBlock = latestBlock; + } else { + console.log("gap detected..."); + const gapDiff_ = await resolveGap( + (await getRecentBlocks(dbRead)).map((block) => block.id), + [latestBlock], + { + maxDepth: 3000, + } + ); + const gapDiff = gapDiff_.map(fullBlockToDbBlock); + + console.log(`[import-blocks] resolved fork/gap`, { + length: gapDiff.length, + }); + + await saveBlocks(dbWrite, gapDiff); + console.log("[import-blocks] saveBlocks completed!"); + lastBlock = latestBlock; + } + } + } catch (error) { + console.error(error); + } + } + ); +})(); + +/** + * Try and find the branch point between the chain in our database and the chain + * belonging to the new block we've just received. If we find a branch point, + * We'll return the diff as a sorted array containing all the missing blocks. + */ +export const resolveGap = async ( + mainChainIds, + fork, + { currentDepth = 0, maxDepth = 10 } +) => { + // Grab the last known block from the forked chain (blocks are appended, newest -> oldest). + const block = fork[fork.length - 1]; + + // genesis fix + if (!block || block.height === 0) return fork; + + console.log(`[import-blocks] resolving fork/gap`, { + id: block.indep_hash, + height: block.height, + }); + + // If this block has a previous_block value that intersects with the the main chain ids, + // then it means we've resolved the fork. The fork array now contains the block + // diff between the two chains, sorted by height descending. + if (mainChainIds.includes(block.previous_block)) { + console.log(`[import-blocks] resolved fork`, { + id: block.indep_hash, + height: block.height, + }); + + return fork; + } + + if (currentDepth >= maxDepth) { + throw new Error(`Couldn't resolve fork within maxDepth of ${maxDepth}`); + } + + const previousBlock = await getSpecificBlock(block.previous_block); + + // If we didn't intersect the mainChainIds array then we're still working backwards + // through the forked chain and haven't found the branch point yet. + // We'll add this previous block block to the end of the fork and try again. + return resolveGap(mainChainIds, [...fork, previousBlock], { + currentDepth: currentDepth + 1, + maxDepth, + }); +}; diff --git a/ec2/import-blocks/src/postgres.mjs b/ec2/import-blocks/src/postgres.mjs new file mode 100644 index 0000000..e0ee341 --- /dev/null +++ b/ec2/import-blocks/src/postgres.mjs @@ -0,0 +1,109 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import "./env.mjs"; +import AWS from "aws-sdk"; +import knex from "knex"; + +const rds = new AWS.RDS(); + +const awsSM = new AWS.SecretsManager({ + region: process.env.AWS_REGION, +}); + +function getSecretValue(secretName) { + return new Promise((resolve, reject) => { + awsSM.getSecretValue({ SecretId: secretName }, function (err, data) { + if (err) { + if (err.code === "DecryptionFailureException") + // Secrets Manager can't decrypt the protected secret text using the provided KMS key. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "InternalServiceErrorException") + // An error occurred on the server side. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "InvalidParameterException") + // You provided an invalid value for a parameter. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "InvalidRequestException") + // You provided a parameter value that is not valid for the current state of the resource. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "ResourceNotFoundException") + // We can't find the resource that you asked for. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else reject(err); + } else { + resolve(data.SecretString); + } + }); + }); +} + +export async function createDbClient({ user }) { + const rdsReadRoleSecret = { + username: "", + password: "", + url: process.env.ARWEAVE_DB_READ_HOST, + }; + const rdsWriteRoleSecret = { + username: "", + password: "", + url: process.env.ARWEAVE_DB_WRITE_HOST, + }; + + try { + const rdsProxySecretRead = JSON.parse(await getSecretValue("read")); + rdsReadRoleSecret.username = rdsProxySecretRead.username; + rdsReadRoleSecret.password = rdsProxySecretRead.password; + } catch (error) { + console.error(error); + } + + try { + const rdsProxySecretWrite = JSON.parse(await getSecretValue("write")); + rdsWriteRoleSecret.username = rdsProxySecretWrite.username; + rdsWriteRoleSecret.password = rdsProxySecretWrite.password; + } catch (error) { + console.error(error); + } + + const roleSecret = user === "read" ? rdsReadRoleSecret : rdsWriteRoleSecret; + + return await knex({ + client: "pg", + pool: { + min: 1, + max: 2, + acquireTimeoutMillis: 20000, + idleTimeoutMillis: 30000, + reapIntervalMillis: 40000, + }, + connection: { + host: roleSecret.url, + user: roleSecret.username, + database: "arweave", + ssl: false, + password: roleSecret.password, + expirationChecker: () => true, + }, + }); +} diff --git a/ec2/import-blocks/src/sqs.mjs b/ec2/import-blocks/src/sqs.mjs new file mode 100644 index 0000000..ac6a5ef --- /dev/null +++ b/ec2/import-blocks/src/sqs.mjs @@ -0,0 +1,64 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import AWS from "aws-sdk"; + +const sqs = new AWS.SQS({ + maxRetries: 3, + httpOptions: { timeout: 5000, connectTimeout: 5000 }, +}); + +function* chunk(arr, n) { + for (let i = 0; i < arr.length; i += n) { + yield arr.slice(i, i + n); + } +} + +export const enqueue = async (queueUrl, message, options) => { + if (!queueUrl) { + throw new Error(`Queue URL undefined`); + } + + await sqs + .sendMessage({ + QueueUrl: queueUrl, + MessageBody: JSON.stringify(message), + MessageGroupId: options && options.messagegroup, + MessageDeduplicationId: options && options.deduplicationId, + DelaySeconds: options && options.delaySeconds, + }) + .promise(); +}; + +export const enqueueBatch = async (queueUrl, messages) => { + for (const messageChnk of chunk(messages, 10)) { + await sqs + .sendMessageBatch({ + QueueUrl: queueUrl, + Entries: messageChnk.map((message) => { + return { + Id: message.id, + MessageBody: JSON.stringify(message), + MessageGroupId: message.messagegroup, + MessageDeduplicationId: message.deduplicationId, + }; + }), + }) + .promise(); + } +}; diff --git a/ec2/import-blocks/src/utils.mjs b/ec2/import-blocks/src/utils.mjs new file mode 100644 index 0000000..eb7ec8f --- /dev/null +++ b/ec2/import-blocks/src/utils.mjs @@ -0,0 +1,34 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import R from "ramda"; + +const shuffler = R.curry(function (random, list) { + var idx = -1; + var len = list.length; + var position; + var result = []; + while (++idx < len) { + position = Math.floor((idx + 1) * random()); + result[idx] = result[position]; + result[position] = list[idx]; + } + return result; +}); + +export const shuffle = shuffler(Math.random); diff --git a/ecs/README.md b/ecs/README.md new file mode 100644 index 0000000..39e3e1b --- /dev/null +++ b/ecs/README.md @@ -0,0 +1,8 @@ +## osx develop + +When building docker image locally on osx (rarely necessary), you'll need a remote nix builder. +Build the docker image from osx with this command + +```console +sudo nix -L build .#packages.x86_64-linux.import-bundles -j0 +``` diff --git a/ecs/flake.lock b/ecs/flake.lock new file mode 100644 index 0000000..49c2500 --- /dev/null +++ b/ecs/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1643524588, + "narHash": "sha256-Qh5AazxdOQRORbGkkvpKoovDl6ej/4PhDabFsqnueqw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "efeefb2af1469a5d1f0ae7ca8f0dfd9bb87d5cfb", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/ecs/flake.nix b/ecs/flake.nix new file mode 100644 index 0000000..59cb39f --- /dev/null +++ b/ecs/flake.nix @@ -0,0 +1,39 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +{ + inputs = { + nixpkgs.url = "nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs, ... }: + + let + system = "x86_64-linux"; + pkgs = (import nixpkgs { + inherit overlays system; + config = { allowUnfree = true; }; + }); + overlays = [ (import ./import-bundles/overlay.nix) ]; + + in { + packages.x86_64-linux = { + import-bundles = pkgs.importBundlesDocker; + }; + }; +} diff --git a/ecs/import-bundles/overlay.nix b/ecs/import-bundles/overlay.nix new file mode 100644 index 0000000..fa5e897 --- /dev/null +++ b/ecs/import-bundles/overlay.nix @@ -0,0 +1,20 @@ +final: prev: + +let packageLock = (import ./package-lock.nix prev); +in { + inherit (packageLock) "@arweave/import-bundles"; + + importBundlesDocker = prev.dockerTools.buildLayeredImage { + name = "import-bundles"; + tag = "latest"; + created = "now"; + extraCommands = "mkdir -m 0777 tmp"; + config = { + User = "1000:1000"; + Cmd = [ "${final."@arweave/import-bundles"}/bin/import-bundles-start" ]; + ExposedPorts = { + "3000" = {}; + }; + }; + }; +} diff --git a/ecs/import-bundles/package-lock.nix b/ecs/import-bundles/package-lock.nix new file mode 100644 index 0000000..25c3939 --- /dev/null +++ b/ecs/import-bundles/package-lock.nix @@ -0,0 +1,3963 @@ +{pkgs, stdenv, lib, nodejs, fetchurl, fetchgit, fetchFromGitHub, jq, makeWrapper, python3, runCommand, runCommandCC, xcodebuild, ... }: + +let + packageNix = import ./package.nix; + copyNodeModules = {dependencies ? [] }: + (lib.lists.foldr (dep: acc: + let pkgName = if (builtins.hasAttr "packageName" dep) + then dep.packageName else dep.name; + in + acc + '' + if [[ ! -f "node_modules/${pkgName}" && \ + ! -d "node_modules/${pkgName}" && \ + ! -L "node_modules/${pkgName}" && \ + ! -e "node_modules/${pkgName}" ]] + then + mkdir -p "node_modules/${pkgName}" + cp -rLT "${dep}/lib/node_modules/${pkgName}" "node_modules/${pkgName}" + chmod -R +rw "node_modules/${pkgName}" + fi + '') + "" dependencies); + linkNodeModules = {dependencies ? [], extraDependencies ? []}: + (lib.lists.foldr (dep: acc: + let pkgName = if (builtins.hasAttr "packageName" dep) + then dep.packageName else dep.name; + in (acc + (lib.optionalString + ((lib.findSingle (px: px.packageName == dep.packageName) "none" "found" extraDependencies) == "none") + '' + if [[ ! -f "node_modules/${pkgName}" && \ + ! -d "node_modules/${pkgName}" && \ + ! -L "node_modules/${pkgName}" && \ + ! -e "node_modules/${pkgName}" ]] + then + mkdir -p "node_modules/${pkgName}" + ln -s "${dep}/lib/node_modules/${pkgName}"/* "node_modules/${pkgName}" + ${lib.optionalString (builtins.hasAttr "dependencies" dep) + '' + rm -rf "node_modules/${pkgName}/node_modules" + (cd node_modules/${dep.packageName}; ${linkNodeModules { inherit (dep) dependencies; inherit extraDependencies;}}) + ''} + fi + ''))) + "" dependencies); + gitignoreSource = + (import (fetchFromGitHub { + owner = "hercules-ci"; + repo = "gitignore.nix"; + rev = "5b9e0ff9d3b551234b4f3eb3983744fa354b17f1"; + sha256 = "o/BdVjNwcB6jOmzZjOH703BesSkkS5O7ej3xhyO8hAY="; + }) { inherit lib; }).gitignoreSource; + transitiveDepInstallPhase = {dependencies ? [], pkgName}: '' + export packageDir="$(pwd)" + mkdir -p $out/lib/node_modules/${pkgName} + cd $out/lib/node_modules/${pkgName} + cp -rfT "$packageDir" "$(pwd)" + ${copyNodeModules { inherit dependencies; }} ''; + transitiveDepUnpackPhase = {dependencies ? [], pkgName}: '' + unpackFile "$src"; + # not ideal, but some perms are fubar + chmod -R +777 . || true + packageDir="$(find . -maxdepth 1 -type d | tail -1)" + cd "$packageDir" + ''; + getNodeDep = packageName: dependencies: + (let depList = if ((builtins.typeOf dependencies) == "set") + then (builtins.attrValues dependencies) + else dependencies; + in (builtins.head + (builtins.filter (p: p.packageName == packageName) depList))); + nodeSources = runCommand "node-sources" {} '' + tar --no-same-owner --no-same-permissions -xf ${nodejs.src} + mv node-* $out + ''; + linkBins = '' + ${goBinLink}/bin/bin-link +''; + flattenScript = args: '' ${goFlatten}/bin/flatten ${args}''; + sanitizeName = nm: lib.strings.sanitizeDerivationName + (builtins.replaceStrings [ "@" "/" ] [ "_at_" "_" ] nm); + jsnixDrvOverrides = { drv_, jsnixDeps, dedupedDeps, isolateDeps }: + let drv = drv_ (pkgs // { inherit nodejs copyNodeModules gitignoreSource jsnixDeps nodeModules getNodeDep; }); + skipUnpackFor = if (builtins.hasAttr "skipUnpackFor" drv) + then drv.skipUnpackFor else []; + copyUnpackFor = if (builtins.hasAttr "copyUnpackFor" drv) + then drv.copyUnpackFor else []; + pkgJsonFile = runCommand "package.json" { buildInputs = [jq]; } '' + echo ${toPackageJson { inherit jsnixDeps; extraDeps = (if (builtins.hasAttr "extraDependencies" drv) then drv.extraDependencies else []); }} > $out + cat <<< $(cat $out | jq) > $out + ''; + copyDeps = builtins.attrValues jsnixDeps; + copyDepsStr = builtins.concatStringsSep " " (builtins.map (dep: if (builtins.hasAttr "packageName" dep) then dep.packageName else dep.name) copyDeps); + extraDeps = (builtins.map (dep: if (builtins.hasAttr "packageName" dep) then dep.packageName else dep.name) + (lib.optionals (builtins.hasAttr "extraDependencies" drv) drv.extraDependencies)); + extraDepsStr = builtins.concatStringsSep " " extraDeps; + buildDepDep = lib.lists.unique (lib.lists.concatMap (d: d.buildInputs) + (copyDeps ++ (lib.optionals (builtins.hasAttr "extraDependencies" drv) drv.extraDependencies))); + nodeModules = runCommandCC "${sanitizeName packageNix.name}_node_modules" + { buildInputs = [nodejs] ++ buildDepDep; + fixupPhase = "true"; + doCheck = false; + doInstallCheck = false; + version = builtins.hashString "sha512" (lib.strings.concatStrings copyDeps); } + '' + echo 'unpack dependencies...' + mkdir -p $out/lib/node_modules + cd $out/lib + ${linkNodeModules { dependencies = builtins.attrValues isolateDeps; }} + ${copyNodeModules { + dependencies = copyDeps; + }} + ${copyNodeModules { + dependencies = builtins.attrValues dedupedDeps; + }} + chmod -R +rw node_modules + ${copyNodeModules { + dependencies = (lib.optionals (builtins.hasAttr "extraDependencies" drv) drv.extraDependencies); + }} + ${lib.optionalString ((builtins.length extraDeps) > 0) "echo 'resolving incoming transient deps of ${extraDepsStr}...'"} + ${lib.optionalString ((builtins.length extraDeps) > 0) (flattenScript extraDepsStr)} + ${lib.optionalString (builtins.hasAttr "nodeModulesUnpack" drv) drv.nodeModulesUnpack} + echo 'link nodejs bins to out-dir...' + ${linkBins} + ''; + in stdenv.mkDerivation (drv // { + passthru = { inherit nodeModules pkgJsonFile; }; + version = packageNix.version; + name = sanitizeName packageNix.name; + preUnpackBan_ = mkPhaseBan "preUnpack" drv; + unpackBan_ = mkPhaseBan "unpackPhase" drv; + postUnpackBan_ = mkPhaseBan "postUnpack" drv; + preConfigureBan_ = mkPhaseBan "preConfigure" drv; + configureBan_ = mkPhaseBan "configurePhase" drv; + postConfigureBan_ = mkPhaseBan "postConfigure" drv; + src = if (builtins.hasAttr "src" packageNix) then packageNix.src else gitignoreSource ./.; + packageName = packageNix.name; + doStrip = false; + doFixup = false; + doUnpack = true; + NODE_PATH = "./node_modules"; + buildInputs = [ nodejs jq ] ++ lib.optionals (builtins.hasAttr "buildInputs" drv) drv.buildInputs; + + configurePhase = '' + ln -s ${nodeModules}/lib/node_modules node_modules + cat ${pkgJsonFile} > package.json + ''; + buildPhase = '' + runHook preBuild + ${lib.optionalString (builtins.hasAttr "buildPhase" drv) drv.buildPhase} + runHook postBuild + ''; + installPhase = '' + runHook preInstall + mkdir -p $out/lib/node_modules/${packageNix.name} + cp -rfT ./ $out/lib/node_modules/${packageNix.name} + runHook postInstall + ''; + }); + toPackageJson = { jsnixDeps ? {}, extraDeps ? [] }: + let + main = if (builtins.hasAttr "main" packageNix) then packageNix else throw "package.nix is missing main attribute"; + pkgName = if (builtins.hasAttr "packageName" packageNix) + then packageNix.packageName else packageNix.name; + packageNixDeps = if (builtins.hasAttr "dependencies" packageNix) + then packageNix.dependencies + else {}; + extraDeps_ = lib.lists.foldr (dep: acc: { "${dep.packageName}" = dep; } // acc) {} extraDeps; + allDeps = extraDeps_ // packageNixDeps; + prodDeps = lib.lists.foldr + (depName: acc: acc // { + "${depName}" = (if ((builtins.typeOf allDeps."${depName}") == "string") + then allDeps."${depName}" + else + if (((builtins.typeOf allDeps."${depName}") == "set") && + ((builtins.typeOf allDeps."${depName}".version) == "string")) + then allDeps."${depName}".version + else "latest");}) {} (builtins.attrNames allDeps); + safePkgNix = lib.lists.foldr (key: acc: + if ((builtins.typeOf packageNix."${key}") != "lambda") + then (acc // { "${key}" = packageNix."${key}"; }) + else acc) + {} (builtins.attrNames packageNix); + in lib.strings.escapeNixString + (builtins.toJSON (safePkgNix // { dependencies = prodDeps; name = pkgName; })); + mkPhaseBan = phaseName: usrDrv: + if (builtins.hasAttr phaseName usrDrv) then + throw "jsnix error: using ${phaseName} isn't supported at this time" + else ""; + mkPhase = pkgs_: {phase, pkgName}: + lib.optionalString ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "${phase}" packageNix.dependencies."${pkgName}")) + (if builtins.typeOf packageNix.dependencies."${pkgName}"."${phase}" == "string" + then + packageNix.dependencies."${pkgName}"."${phase}" + else + (packageNix.dependencies."${pkgName}"."${phase}" (pkgs_ // { inherit getNodeDep; }))); + mkExtraBuildInputs = pkgs_: {pkgName}: + lib.optionals ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "extraBuildInputs" packageNix.dependencies."${pkgName}")) + (if builtins.typeOf packageNix.dependencies."${pkgName}"."extraBuildInputs" == "list" + then + packageNix.dependencies."${pkgName}"."extraBuildInputs" + else + (packageNix.dependencies."${pkgName}"."extraBuildInputs" (pkgs_ // { inherit getNodeDep; }))); + mkExtraDependencies = pkgs_: {pkgName}: + lib.optionals ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "extraDependencies" packageNix.dependencies."${pkgName}")) + (if builtins.typeOf packageNix.dependencies."${pkgName}"."extraDependencies" == "list" + then + packageNix.dependencies."${pkgName}"."extraDependencies" + else + (packageNix.dependencies."${pkgName}"."extraDependencies" (pkgs_ // { inherit getNodeDep; }))); + mkUnpackScript = { dependencies ? [], extraDependencies ? [], pkgName }: + let copyNodeDependencies = + if ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "copyNodeDependencies" packageNix.dependencies."${pkgName}") && + (builtins.typeOf packageNix.dependencies."${pkgName}"."copyNodeDependencies" == "bool") && + (packageNix.dependencies."${pkgName}"."copyNodeDependencies" == true)) + then true else false; + in '' + ${copyNodeModules { dependencies = dependencies ++ extraDependencies; }} + chmod -R +rw $(pwd) + ''; + mkBuildScript = { dependencies ? [], pkgName }: + let extraNpmFlags = + if ((builtins.hasAttr "${pkgName}" packageNix.dependencies) && + (builtins.typeOf packageNix.dependencies."${pkgName}" == "set") && + (builtins.hasAttr "npmFlags" packageNix.dependencies."${pkgName}") && + (builtins.typeOf packageNix.dependencies."${pkgName}"."npmFlags" == "string")) + then packageNix.dependencies."${pkgName}"."npmFlags" else ""; + in '' + runHook preBuild + export HOME=$TMPDIR + npm --offline config set node_gyp ${nodejs}/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js + npm --offline config set omit dev + NODE_PATH="$(pwd)/node_modules:$NODE_PATH" \ + npm --offline --nodedir=${nodeSources} --location="$(pwd)" \ + ${extraNpmFlags} "--production" "--preserve-symlinks" \ + rebuild --build-from-source + runHook postBuild + ''; + mkInstallScript = { pkgName }: '' + runHook preInstall + export packageDir="$(pwd)" + mkdir -p $out/lib/node_modules/${pkgName} + cd $out/lib/node_modules/${pkgName} + cp -rfT "$packageDir" "$(pwd)" + if [[ -d "$out/lib/node_modules/${pkgName}/bin" ]] + then + mkdir -p $out/bin + ln -s "$out/lib/node_modules/${pkgName}/bin"/* $out/bin + fi + cd $out/lib/node_modules/${pkgName} + runHook postInstall + ''; + goBinLink = pkgs.buildGoModule { + pname = "bin-link"; + version = "0.0.0"; + vendorSha256 = null; + buildInputs = [ pkgs.nodejs ]; + src = pkgs.fetchFromGitHub { + owner = "hlolli"; + repo = "jsnix"; + rev = "a66cf91ad49833ef3d84064c1037d942c97838bb"; + sha256 = "AvDZXUSxuJa5lZ7zRdXWIDYTYfbH2VfpuHbvZBrT9f0="; + }; + preBuild = '' + cd go/bin-link + ''; +}; + goFlatten = pkgs.buildGoModule { + pname = "flatten"; + version = "0.0.0"; + vendorSha256 = null; + buildInputs = [ pkgs.nodejs ]; + src = pkgs.fetchFromGitHub { + owner = "hlolli"; + repo = "jsnix"; + rev = "a66cf91ad49833ef3d84064c1037d942c97838bb"; + sha256 = "AvDZXUSxuJa5lZ7zRdXWIDYTYfbH2VfpuHbvZBrT9f0="; + }; + preBuild = '' + cd go/flatten + ''; +}; + sources = rec { + "@sindresorhus/is-4.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_sindresorhus_slash_is"; + packageName = "@sindresorhus/is"; + version = "4.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@sindresorhus/is"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@sindresorhus/is"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz"; + sha512 = "VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw=="; + }; + }; + "@szmarczak/http-timer-5.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_szmarczak_slash_http-timer"; + packageName = "@szmarczak/http-timer"; + version = "5.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@szmarczak/http-timer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@szmarczak/http-timer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz"; + sha512 = "+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="; + }; + }; + "@types/cacheable-request-6.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_cacheable-request"; + packageName = "@types/cacheable-request"; + version = "6.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/cacheable-request"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/cacheable-request"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz"; + sha512 = "B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA=="; + }; + }; + "@types/http-cache-semantics-4.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_http-cache-semantics"; + packageName = "@types/http-cache-semantics"; + version = "4.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/http-cache-semantics"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/http-cache-semantics"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz"; + sha512 = "SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="; + }; + }; + "@types/keyv-3.1.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_keyv"; + packageName = "@types/keyv"; + version = "3.1.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/keyv"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/keyv"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz"; + sha512 = "FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg=="; + }; + }; + "@types/node-17.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_node"; + packageName = "@types/node"; + version = "17.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/node"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/node"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-17.0.2.tgz"; + sha512 = "JepeIUPFDARgIs0zD/SKPgFsJEAF0X5/qO80llx59gOxFTboS9Amv3S+QfB7lqBId5sFXJ99BN0J6zFRvL9dDA=="; + }; + }; + "@types/responselike-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "_at_types_slash_responselike"; + packageName = "@types/responselike"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "@types/responselike"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "@types/responselike"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz"; + sha512 = "85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA=="; + }; + }; + "base64-js-1.5.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "base64-js"; + packageName = "base64-js"; + version = "1.5.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "base64-js"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "base64-js"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"; + sha512 = "AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="; + }; + }; + "buffer-4.9.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "buffer"; + packageName = "buffer"; + version = "4.9.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "buffer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "buffer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz"; + sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="; + }; + }; + "buffer-writer-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "buffer-writer"; + packageName = "buffer-writer"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "buffer-writer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "buffer-writer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz"; + sha512 = "a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="; + }; + }; + "cacheable-lookup-6.0.4" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "cacheable-lookup"; + packageName = "cacheable-lookup"; + version = "6.0.4"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "cacheable-lookup"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "cacheable-lookup"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz"; + sha512 = "mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="; + }; + }; + "cacheable-request-7.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "cacheable-request"; + packageName = "cacheable-request"; + version = "7.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "cacheable-request"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "cacheable-request"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz"; + sha512 = "pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew=="; + }; + }; + "clone-response-1.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "clone-response"; + packageName = "clone-response"; + version = "1.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "clone-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "clone-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"; + sha1 = "d1dc973920314df67fbeb94223b4ee350239e96b"; + }; + }; + "colorette-2.0.16" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "colorette"; + packageName = "colorette"; + version = "2.0.16"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "colorette"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "colorette"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz"; + sha512 = "hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="; + }; + }; + "commander-7.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "commander"; + packageName = "commander"; + version = "7.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "commander"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "commander"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"; + sha512 = "QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="; + }; + }; + "debug-4.3.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "debug"; + packageName = "debug"; + version = "4.3.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "debug"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "debug"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz"; + sha512 = "mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw=="; + }; + }; + "debug-4.3.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "debug"; + packageName = "debug"; + version = "4.3.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "debug"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "debug"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz"; + sha512 = "/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="; + }; + }; + "decompress-response-6.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "decompress-response"; + packageName = "decompress-response"; + version = "6.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "decompress-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "decompress-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz"; + sha512 = "aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="; + }; + }; + "defer-to-connect-2.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "defer-to-connect"; + packageName = "defer-to-connect"; + version = "2.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "defer-to-connect"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "defer-to-connect"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz"; + sha512 = "4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="; + }; + }; + "end-of-stream-1.4.4" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "end-of-stream"; + packageName = "end-of-stream"; + version = "1.4.4"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "end-of-stream"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "end-of-stream"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"; + sha512 = "+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="; + }; + }; + "escalade-3.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "escalade"; + packageName = "escalade"; + version = "3.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "escalade"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "escalade"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"; + sha512 = "k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="; + }; + }; + "esm-3.2.25" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "esm"; + packageName = "esm"; + version = "3.2.25"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "esm"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "esm"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz"; + sha512 = "U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="; + }; + }; + "events-1.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "events"; + packageName = "events"; + version = "1.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "events"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "events"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/events/-/events-1.1.1.tgz"; + sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"; + }; + }; + "form-data-encoder-1.7.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "form-data-encoder"; + packageName = "form-data-encoder"; + version = "1.7.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "form-data-encoder"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "form-data-encoder"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz"; + sha512 = "EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg=="; + }; + }; + "function-bind-1.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "function-bind"; + packageName = "function-bind"; + version = "1.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "function-bind"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "function-bind"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"; + sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="; + }; + }; + "get-stream-5.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "get-stream"; + packageName = "get-stream"; + version = "5.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "get-stream"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "get-stream"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"; + sha512 = "nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="; + }; + }; + "get-stream-6.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "get-stream"; + packageName = "get-stream"; + version = "6.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "get-stream"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "get-stream"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"; + sha512 = "ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="; + }; + }; + "getopts-2.2.5" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "getopts"; + packageName = "getopts"; + version = "2.2.5"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "getopts"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "getopts"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz"; + sha512 = "9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="; + }; + }; + "has-1.0.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "has"; + packageName = "has"; + version = "1.0.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "has"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "has"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz"; + sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="; + }; + }; + "http-cache-semantics-4.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "http-cache-semantics"; + packageName = "http-cache-semantics"; + version = "4.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "http-cache-semantics"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "http-cache-semantics"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"; + sha512 = "carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="; + }; + }; + "http2-wrapper-2.1.10" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "http2-wrapper"; + packageName = "http2-wrapper"; + version = "2.1.10"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "http2-wrapper"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "http2-wrapper"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.10.tgz"; + sha512 = "QHgsdYkieKp+6JbXP25P+tepqiHYd+FVnDwXpxi/BlUcoIB0nsmTOymTNvETuTO+pDuwcSklPE72VR3DqV+Haw=="; + }; + }; + "ieee754-1.1.13" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "ieee754"; + packageName = "ieee754"; + version = "1.1.13"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "ieee754"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "ieee754"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"; + sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="; + }; + }; + "interpret-2.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "interpret"; + packageName = "interpret"; + version = "2.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "interpret"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "interpret"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz"; + sha512 = "Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="; + }; + }; + "is-core-module-2.8.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "is-core-module"; + packageName = "is-core-module"; + version = "2.8.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "is-core-module"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "is-core-module"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz"; + sha512 = "vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw=="; + }; + }; + "isarray-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "isarray"; + packageName = "isarray"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "isarray"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "isarray"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"; + sha1 = "bb935d48582cba168c06834957a54a3e07124f11"; + }; + }; + "jmespath-0.15.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "jmespath"; + packageName = "jmespath"; + version = "0.15.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "jmespath"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "jmespath"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz"; + sha1 = "a3f222a9aae9f966f5d27c796510e28091764217"; + }; + }; + "json-buffer-3.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "json-buffer"; + packageName = "json-buffer"; + version = "3.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "json-buffer"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "json-buffer"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"; + sha512 = "4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="; + }; + }; + "keyv-4.0.4" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "keyv"; + packageName = "keyv"; + version = "4.0.4"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "keyv"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "keyv"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz"; + sha512 = "vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg=="; + }; + }; + "lodash-4.17.21" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "lodash"; + packageName = "lodash"; + version = "4.17.21"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "lodash"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "lodash"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"; + sha512 = "v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="; + }; + }; + "lowercase-keys-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "lowercase-keys"; + packageName = "lowercase-keys"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "lowercase-keys"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "lowercase-keys"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"; + sha512 = "tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="; + }; + }; + "lowercase-keys-3.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "lowercase-keys"; + packageName = "lowercase-keys"; + version = "3.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "lowercase-keys"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "lowercase-keys"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz"; + sha512 = "ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="; + }; + }; + "mimic-response-1.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "mimic-response"; + packageName = "mimic-response"; + version = "1.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "mimic-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "mimic-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"; + sha512 = "j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="; + }; + }; + "mimic-response-3.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "mimic-response"; + packageName = "mimic-response"; + version = "3.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "mimic-response"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "mimic-response"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"; + sha512 = "z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="; + }; + }; + "ms-2.1.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "ms"; + packageName = "ms"; + version = "2.1.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "ms"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "ms"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"; + sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="; + }; + }; + "normalize-url-6.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "normalize-url"; + packageName = "normalize-url"; + version = "6.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "normalize-url"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "normalize-url"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"; + sha512 = "DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="; + }; + }; + "once-1.4.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "once"; + packageName = "once"; + version = "1.4.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "once"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "once"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz"; + sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1"; + }; + }; + "p-cancelable-3.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "p-cancelable"; + packageName = "p-cancelable"; + version = "3.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "p-cancelable"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "p-cancelable"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz"; + sha512 = "mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="; + }; + }; + "p-timeout-5.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "p-timeout"; + packageName = "p-timeout"; + version = "5.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "p-timeout"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "p-timeout"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/p-timeout/-/p-timeout-5.0.2.tgz"; + sha512 = "sEmji9Yaq+Tw+STwsGAE56hf7gMy9p0tQfJojIAamB7WHJYJKf1qlsg9jqBWG8q9VCxKPhZaP/AcXwEoBcYQhQ=="; + }; + }; + "packet-reader-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "packet-reader"; + packageName = "packet-reader"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "packet-reader"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "packet-reader"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz"; + sha512 = "HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="; + }; + }; + "path-parse-1.0.7" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "path-parse"; + packageName = "path-parse"; + version = "1.0.7"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "path-parse"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "path-parse"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"; + sha512 = "LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="; + }; + }; + "pg-connection-string-2.5.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-connection-string"; + packageName = "pg-connection-string"; + version = "2.5.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-connection-string"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-connection-string"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz"; + sha512 = "r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="; + }; + }; + "pg-int8-1.0.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-int8"; + packageName = "pg-int8"; + version = "1.0.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-int8"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-int8"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz"; + sha512 = "WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="; + }; + }; + "pg-pool-3.4.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-pool"; + packageName = "pg-pool"; + version = "3.4.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-pool"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-pool"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz"; + sha512 = "TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ=="; + }; + }; + "pg-protocol-1.5.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-protocol"; + packageName = "pg-protocol"; + version = "1.5.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-protocol"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-protocol"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz"; + sha512 = "muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="; + }; + }; + "pg-types-2.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pg-types"; + packageName = "pg-types"; + version = "2.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pg-types"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pg-types"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz"; + sha512 = "qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="; + }; + }; + "pgpass-1.0.5" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pgpass"; + packageName = "pgpass"; + version = "1.0.5"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pgpass"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pgpass"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz"; + sha512 = "FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="; + }; + }; + "postgres-array-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-array"; + packageName = "postgres-array"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-array"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-array"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz"; + sha512 = "VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="; + }; + }; + "postgres-bytea-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-bytea"; + packageName = "postgres-bytea"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-bytea"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-bytea"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz"; + sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35"; + }; + }; + "postgres-date-1.0.7" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-date"; + packageName = "postgres-date"; + version = "1.0.7"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-date"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-date"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz"; + sha512 = "suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="; + }; + }; + "postgres-interval-1.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "postgres-interval"; + packageName = "postgres-interval"; + version = "1.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "postgres-interval"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "postgres-interval"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz"; + sha512 = "9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="; + }; + }; + "pump-3.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "pump"; + packageName = "pump"; + version = "3.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "pump"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "pump"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"; + sha512 = "LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="; + }; + }; + "punycode-1.3.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "punycode"; + packageName = "punycode"; + version = "1.3.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "punycode"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "punycode"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"; + sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d"; + }; + }; + "querystring-0.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "querystring"; + packageName = "querystring"; + version = "0.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "querystring"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "querystring"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"; + sha1 = "b209849203bb25df820da756e747005878521620"; + }; + }; + "quick-lru-5.1.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "quick-lru"; + packageName = "quick-lru"; + version = "5.1.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "quick-lru"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "quick-lru"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"; + sha512 = "WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="; + }; + }; + "rechoir-0.7.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "rechoir"; + packageName = "rechoir"; + version = "0.7.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "rechoir"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "rechoir"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz"; + sha512 = "ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q=="; + }; + }; + "resolve-1.20.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "resolve"; + packageName = "resolve"; + version = "1.20.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "resolve"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "resolve"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"; + sha512 = "wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A=="; + }; + }; + "resolve-alpn-1.2.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "resolve-alpn"; + packageName = "resolve-alpn"; + version = "1.2.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "resolve-alpn"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "resolve-alpn"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz"; + sha512 = "0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="; + }; + }; + "resolve-from-5.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "resolve-from"; + packageName = "resolve-from"; + version = "5.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "resolve-from"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "resolve-from"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"; + sha512 = "qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="; + }; + }; + "responselike-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "responselike"; + packageName = "responselike"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "responselike"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "responselike"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz"; + sha512 = "xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw=="; + }; + }; + "retry-0.13.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "retry"; + packageName = "retry"; + version = "0.13.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "retry"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "retry"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz"; + sha512 = "XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="; + }; + }; + "sax-1.2.1" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "sax"; + packageName = "sax"; + version = "1.2.1"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "sax"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "sax"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz"; + sha1 = "7b8e656190b228e81a66aea748480d828cd2d37a"; + }; + }; + "split2-4.1.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "split2"; + packageName = "split2"; + version = "4.1.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "split2"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "split2"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz"; + sha512 = "VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="; + }; + }; + "tarn-3.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "tarn"; + packageName = "tarn"; + version = "3.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "tarn"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "tarn"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz"; + sha512 = "51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="; + }; + }; + "tildify-2.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "tildify"; + packageName = "tildify"; + version = "2.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "tildify"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "tildify"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz"; + sha512 = "Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="; + }; + }; + "url-0.10.3" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "url"; + packageName = "url"; + version = "0.10.3"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "url"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "url"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/url/-/url-0.10.3.tgz"; + sha1 = "021e4d9c7705f21bbf37d03ceb58767402774c64"; + }; + }; + "uuid-3.3.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "uuid"; + packageName = "uuid"; + version = "3.3.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "uuid"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "uuid"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz"; + sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="; + }; + }; + "wrappy-1.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "wrappy"; + packageName = "wrappy"; + version = "1.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "wrappy"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "wrappy"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"; + sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"; + }; + }; + "xml2js-0.4.19" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "xml2js"; + packageName = "xml2js"; + version = "0.4.19"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "xml2js"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "xml2js"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz"; + sha512 = "esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q=="; + }; + }; + "xmlbuilder-9.0.7" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "xmlbuilder"; + packageName = "xmlbuilder"; + version = "9.0.7"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "xmlbuilder"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "xmlbuilder"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz"; + sha1 = "132ee63d2ec5565c557e20f4c22df9aca686b10d"; + }; + }; + "xtend-4.0.2" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "xtend"; + packageName = "xtend"; + version = "4.0.2"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "xtend"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "xtend"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"; + sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="; + }; + }; + "yocto-queue-1.0.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "yocto-queue"; + packageName = "yocto-queue"; + version = "1.0.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "yocto-queue"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "yocto-queue"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz"; + sha512 = "9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g=="; + }; + }; + "yoctodelay-1.2.0" = {dependencies ? []}: + + stdenv.mkDerivation { + name = "yoctodelay"; + packageName = "yoctodelay"; + version = "1.2.0"; + extraDependencies = []; + buildInputs = [ + jq + nodejs + ]; + NODE_OPTIONS = "--preserve-symlinks"; + unpackPhase = transitiveDepUnpackPhase { inherit dependencies; pkgName = "yoctodelay"; } + ''''; + patchPhase = '' + if [ -f "package.json" ]; then + cat <<< $(jq 'del(.scripts)' package.json) > package.json + fi + + ''; + configurePhase = "true"; + buildPhase = "true"; + fixupPhase = "true"; + installPhase = transitiveDepInstallPhase { inherit dependencies; pkgName = "yoctodelay"; }; + doCheck = false; + doInstallCheck = false; + src = fetchurl { + url = "https://registry.npmjs.org/yoctodelay/-/yoctodelay-1.2.0.tgz"; + sha512 = "12y/P9MSig9/5BEhBgylss+fkHiCRZCvYR81eH35NW9uw801cvJt31EAV+WOLcwZRZbLiIQl/hxcdXXXFmGvXg=="; + }; + }; + }; + jsnixDeps = { + async-retry = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "async-retry"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "async-retry"; + packageName = "async-retry"; + version = "1.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz"; + sha512 = "wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "async-retry"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "async-retry"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "async-retry"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "async-retry"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "async-retry"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "async-retry"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "async-retry"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "async-retry"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "async-retry"; }); + meta = { + description = "Retrying made simple, easy and async"; + license = "MIT"; + homepage = "https://github.com/vercel/async-retry#readme"; + }; + }; + aws-sdk = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "aws-sdk"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "aws-sdk"; + packageName = "aws-sdk"; + version = "2.1047.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1047.0.tgz"; + sha512 = "aZg6HzcwgRpXLi8HnpwBwK+NTXlWPjLSChvdeJ+/IE9912aoAKyaV+Ydo+9h6XH0cQhkvZ2u3pFINWZVbwo+TA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "aws-sdk"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "aws-sdk"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "aws-sdk"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "aws-sdk"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "aws-sdk"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "aws-sdk"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "aws-sdk"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "aws-sdk"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "aws-sdk"; }); + meta = { + description = "AWS SDK for JavaScript"; + license = "Apache-2.0"; + homepage = "https://github.com/aws/aws-sdk-js"; + }; + }; + dotenv = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "dotenv"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "dotenv"; + packageName = "dotenv"; + version = "10.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz"; + sha512 = "rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "dotenv"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "dotenv"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "dotenv"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "dotenv"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "dotenv"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "dotenv"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "dotenv"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "dotenv"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "dotenv"; }); + meta = { + description = "Loads environment variables from .env file"; + license = "BSD-2-Clause"; + homepage = "https://github.com/motdotla/dotenv#readme"; + }; + }; + exit-hook = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "exit-hook"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "exit-hook"; + packageName = "exit-hook"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/exit-hook/-/exit-hook-3.0.0.tgz"; + sha512 = "ElRvnoj3dvOc5WjnQx0CF66rS0xehV6eZdcmqZX17uOLPy3me43frl8UD73Frkx5Aq5kgziMDECjDJR2X1oBFQ=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "exit-hook"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "exit-hook"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "exit-hook"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "exit-hook"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "exit-hook"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "exit-hook"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "exit-hook"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "exit-hook"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "exit-hook"; }); + meta = { + description = "Run some code when the process exits"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/exit-hook#readme"; + }; + }; + got = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "got"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "got"; + packageName = "got"; + version = "12.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/got/-/got-12.0.0.tgz"; + sha512 = "gNNNghQ1yw0hyzie1FLK6gY90BQlXU9zSByyRygnbomHPruKQ6hAKKbpO1RfNZp8b+qNzNipGeRG3tUelKcVsA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "got"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "got"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "got"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "got"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "got"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "got"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "got"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "got"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "got"; }); + meta = { + description = "Human-friendly and powerful HTTP request library for Node.js"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/got#readme"; + }; + }; + knex = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "knex"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "knex"; + packageName = "knex"; + version = "0.95.15"; + src = fetchurl { + url = "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz"; + sha512 = "Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "knex"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "knex"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "knex"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "knex"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "knex"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "knex"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "knex"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "knex"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "knex"; }); + meta = { + description = "A batteries-included SQL query & schema builder for PostgresSQL, MySQL, CockroachDB, MSSQL and SQLite3"; + license = "MIT"; + homepage = "https://knexjs.org"; + }; + }; + moment = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "moment"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "moment"; + packageName = "moment"; + version = "2.29.1"; + src = fetchurl { + url = "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"; + sha512 = "kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "moment"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "moment"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "moment"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "moment"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "moment"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "moment"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "moment"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "moment"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "moment"; }); + meta = { + description = "Parse, validate, manipulate, and display dates"; + license = "MIT"; + homepage = "https://momentjs.com"; + }; + }; + p-limit = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-limit"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-limit"; + packageName = "p-limit"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz"; + sha512 = "5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-limit"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-limit"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-limit"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-limit"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-limit"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-limit"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-limit"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-limit"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-limit"; }); + meta = { + description = "Run multiple promise-returning & async functions with limited concurrency"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-limit#readme"; + }; + }; + p-min-delay = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-min-delay"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-min-delay"; + packageName = "p-min-delay"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/p-min-delay/-/p-min-delay-4.0.1.tgz"; + sha512 = "Tgkn+fy2VYNWw9bLy4BwiF+1ZMIgTDBIpaIChi1HC3N4nwRpandJnG1jAEXiYCcrTZKYQJdBWzLJauAeYDXsBg=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-min-delay"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-min-delay"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-min-delay"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-min-delay"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-min-delay"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-min-delay"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-min-delay"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-min-delay"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-min-delay"; }); + meta = { + description = "Delay a promise a minimum amount of time"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-min-delay#readme"; + }; + }; + p-wait-for = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-wait-for"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-wait-for"; + packageName = "p-wait-for"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz"; + sha512 = "i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-wait-for"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-wait-for"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-wait-for"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-wait-for"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-wait-for"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-wait-for"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-wait-for"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-wait-for"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-wait-for"; }); + meta = { + description = "Wait for a condition to be true"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-wait-for#readme"; + }; + }; + p-whilst = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "p-whilst"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "p-whilst"; + packageName = "p-whilst"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-whilst/-/p-whilst-3.0.0.tgz"; + sha512 = "vaiNNmeIUGtMzf121RTb3CCC0Nl4WNeHjbmPjRcwPo6vQiHEJRpHbeOcyLBZspuyz2yG+G2xwzVIiULd1Mk6MA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "p-whilst"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "p-whilst"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "p-whilst"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "p-whilst"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "p-whilst"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "p-whilst"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "p-whilst"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "p-whilst"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "p-whilst"; }); + meta = { + description = "While a condition returns true, calls a function repeatedly, and then resolves the promise"; + license = "MIT"; + homepage = "https://github.com/sindresorhus/p-whilst#readme"; + }; + }; + pg = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "pg"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "pg"; + packageName = "pg"; + version = "8.7.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz"; + sha512 = "7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "pg"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "pg"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "pg"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "pg"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "pg"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "pg"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "pg"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "pg"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "pg"; }); + meta = { + description = "PostgreSQL client - pure javascript & libpq with the same API"; + license = "MIT"; + homepage = "https://github.com/brianc/node-postgres"; + }; + }; + ramda = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "ramda"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "ramda"; + packageName = "ramda"; + version = "0.27.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz"; + sha512 = "PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "ramda"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "ramda"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "ramda"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "ramda"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "ramda"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "ramda"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "ramda"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "ramda"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "ramda"; }); + meta = { + description = "A practical functional library for JavaScript programmers."; + license = "MIT"; + homepage = "https://ramdajs.com/"; + }; + }; + sqs-consumer = let + dependencies = []; + extraDependencies = [] ++ + mkExtraDependencies + (pkgs // { inherit jsnixDeps dependencies; }) + { pkgName = "sqs-consumer"; }; + in + stdenv.mkDerivation { + inherit dependencies extraDependencies; + name = "sqs-consumer"; + packageName = "sqs-consumer"; + version = "5.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/sqs-consumer/-/sqs-consumer-5.6.0.tgz"; + sha512 = "p+K3UV8GwF1//Nfq7swbm/Un137IwxewzxapfTyyEVpdmzPKEDYrAzuGJvP87YWVSWzbkvxQ0By0vhamouGdxg=="; + }; + buildInputs = [ nodejs python3 makeWrapper jq ] ++ + (pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.xcodebuild ]) ++ + (mkExtraBuildInputs (pkgs // { inherit jsnixDeps dependencies; }) { pkgName = "sqs-consumer"; }); + doFixup = false; + doStrip = false; + NODE_OPTIONS = "--preserve-symlinks"; + passAsFile = [ "unpackScript" "buildScript" "installScript" ]; + unpackScript = mkUnpackScript { dependencies = dependencies ++ extraDependencies; + pkgName = "sqs-consumer"; }; + buildScript = mkBuildScript { inherit dependencies; pkgName = "sqs-consumer"; }; + buildPhase = '' + source $unpackScriptPath + runHook preBuild + if [ -z "$preBuild" ]; then + runHook preInstall + fi + source $buildScriptPath + if [ -z "$postBuild" ]; then + runHook postBuild + fi + ''; + patchPhase = '' + if [ -z "$prePatch" ]; then + runHook prePatch + fi + + if [ -z "$postPatch" ]; then + runHook postPatch + fi + ''; + installScript = mkInstallScript { pkgName = "sqs-consumer"; }; + installPhase = '' + if [ -z "$preInstall" ]; then + runHook preInstall + fi + source $installScriptPath + if [ -z "$postInstall" ]; then + runHook postInstall + fi + ''; + preInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preInstall"; pkgName = "sqs-consumer"; }); + postInstall = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postInstall"; pkgName = "sqs-consumer"; }); + preBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "preBuild"; pkgName = "sqs-consumer"; }); + postBuild = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "postBuild"; pkgName = "sqs-consumer"; }); + fixupPhase = "true"; + installCheckPhase = (mkPhase (pkgs // { inherit jsnixDeps nodejs dependencies; }) { phase = "installCheckPhase"; pkgName = "sqs-consumer"; }); + meta = { + description = "Build SQS-based Node applications without the boilerplate"; + license = "Apache-2.0"; + homepage = "https://github.com/BBC/sqs-consumer"; + }; + }; + }; + dedupedDeps = { + retry = sources."retry-0.13.1" { + dependencies = []; + }; + base64-js = sources."base64-js-1.5.1" { + dependencies = []; + }; + buffer = sources."buffer-4.9.2" { + dependencies = []; + }; + events = sources."events-1.1.1" { + dependencies = []; + }; + ieee754 = sources."ieee754-1.1.13" { + dependencies = []; + }; + isarray = sources."isarray-1.0.0" { + dependencies = []; + }; + jmespath = sources."jmespath-0.15.0" { + dependencies = []; + }; + punycode = sources."punycode-1.3.2" { + dependencies = []; + }; + querystring = sources."querystring-0.2.0" { + dependencies = []; + }; + sax = sources."sax-1.2.1" { + dependencies = []; + }; + url = sources."url-0.10.3" { + dependencies = []; + }; + uuid = sources."uuid-3.3.2" { + dependencies = []; + }; + xml2js = sources."xml2js-0.4.19" { + dependencies = []; + }; + xmlbuilder = sources."xmlbuilder-9.0.7" { + dependencies = []; + }; + "@sindresorhus/is" = sources."@sindresorhus/is-4.2.0" { + dependencies = []; + }; + "@szmarczak/http-timer" = sources."@szmarczak/http-timer-5.0.1" { + dependencies = []; + }; + "@types/cacheable-request" = sources."@types/cacheable-request-6.0.2" { + dependencies = []; + }; + "@types/http-cache-semantics" = sources."@types/http-cache-semantics-4.0.1" { + dependencies = []; + }; + "@types/keyv" = sources."@types/keyv-3.1.3" { + dependencies = []; + }; + "@types/node" = sources."@types/node-17.0.2" { + dependencies = []; + }; + "@types/responselike" = sources."@types/responselike-1.0.0" { + dependencies = []; + }; + cacheable-lookup = sources."cacheable-lookup-6.0.4" { + dependencies = []; + }; + cacheable-request = sources."cacheable-request-7.0.2" { + dependencies = [ + (sources."get-stream-5.2.0" { + dependencies = []; + }) + (sources."lowercase-keys-2.0.0" { + dependencies = []; + }) + ]; + }; + clone-response = sources."clone-response-1.0.2" { + dependencies = []; + }; + decompress-response = sources."decompress-response-6.0.0" { + dependencies = [ + (sources."mimic-response-3.1.0" { + dependencies = []; + }) + ]; + }; + defer-to-connect = sources."defer-to-connect-2.0.1" { + dependencies = []; + }; + end-of-stream = sources."end-of-stream-1.4.4" { + dependencies = []; + }; + form-data-encoder = sources."form-data-encoder-1.7.1" { + dependencies = []; + }; + get-stream = sources."get-stream-6.0.1" { + dependencies = []; + }; + http-cache-semantics = sources."http-cache-semantics-4.1.0" { + dependencies = []; + }; + http2-wrapper = sources."http2-wrapper-2.1.10" { + dependencies = []; + }; + json-buffer = sources."json-buffer-3.0.1" { + dependencies = []; + }; + keyv = sources."keyv-4.0.4" { + dependencies = []; + }; + lowercase-keys = sources."lowercase-keys-3.0.0" { + dependencies = []; + }; + mimic-response = sources."mimic-response-1.0.1" { + dependencies = []; + }; + normalize-url = sources."normalize-url-6.1.0" { + dependencies = []; + }; + once = sources."once-1.4.0" { + dependencies = []; + }; + p-cancelable = sources."p-cancelable-3.0.0" { + dependencies = []; + }; + pump = sources."pump-3.0.0" { + dependencies = []; + }; + quick-lru = sources."quick-lru-5.1.1" { + dependencies = []; + }; + resolve-alpn = sources."resolve-alpn-1.2.1" { + dependencies = []; + }; + responselike = sources."responselike-2.0.0" { + dependencies = [ + (sources."lowercase-keys-2.0.0" { + dependencies = []; + }) + ]; + }; + wrappy = sources."wrappy-1.0.2" { + dependencies = []; + }; + colorette = sources."colorette-2.0.16" { + dependencies = []; + }; + commander = sources."commander-7.2.0" { + dependencies = []; + }; + debug = sources."debug-4.3.2" { + dependencies = []; + }; + escalade = sources."escalade-3.1.1" { + dependencies = []; + }; + esm = sources."esm-3.2.25" { + dependencies = []; + }; + function-bind = sources."function-bind-1.1.1" { + dependencies = []; + }; + getopts = sources."getopts-2.2.5" { + dependencies = []; + }; + has = sources."has-1.0.3" { + dependencies = []; + }; + interpret = sources."interpret-2.2.0" { + dependencies = []; + }; + is-core-module = sources."is-core-module-2.8.0" { + dependencies = []; + }; + lodash = sources."lodash-4.17.21" { + dependencies = []; + }; + ms = sources."ms-2.1.2" { + dependencies = []; + }; + path-parse = sources."path-parse-1.0.7" { + dependencies = []; + }; + pg-connection-string = sources."pg-connection-string-2.5.0" { + dependencies = []; + }; + rechoir = sources."rechoir-0.7.0" { + dependencies = []; + }; + resolve = sources."resolve-1.20.0" { + dependencies = []; + }; + resolve-from = sources."resolve-from-5.0.0" { + dependencies = []; + }; + tarn = sources."tarn-3.0.2" { + dependencies = []; + }; + tildify = sources."tildify-2.0.0" { + dependencies = []; + }; + yocto-queue = sources."yocto-queue-1.0.0" { + dependencies = []; + }; + yoctodelay = sources."yoctodelay-1.2.0" { + dependencies = []; + }; + p-timeout = sources."p-timeout-5.0.2" { + dependencies = []; + }; + buffer-writer = sources."buffer-writer-2.0.0" { + dependencies = []; + }; + packet-reader = sources."packet-reader-1.0.0" { + dependencies = []; + }; + pg-int8 = sources."pg-int8-1.0.1" { + dependencies = []; + }; + pg-pool = sources."pg-pool-3.4.1" { + dependencies = []; + }; + pg-protocol = sources."pg-protocol-1.5.0" { + dependencies = []; + }; + pg-types = sources."pg-types-2.2.0" { + dependencies = []; + }; + pgpass = sources."pgpass-1.0.5" { + dependencies = []; + }; + postgres-array = sources."postgres-array-2.0.0" { + dependencies = []; + }; + postgres-bytea = sources."postgres-bytea-1.0.0" { + dependencies = []; + }; + postgres-date = sources."postgres-date-1.0.7" { + dependencies = []; + }; + postgres-interval = sources."postgres-interval-1.2.0" { + dependencies = []; + }; + split2 = sources."split2-4.1.0" { + dependencies = []; + }; + xtend = sources."xtend-4.0.2" { + dependencies = []; + }; + }; + isolateDeps = {}; +in +jsnixDeps // (if builtins.hasAttr "packageDerivation" packageNix then { + "${packageNix.name}" = jsnixDrvOverrides { + inherit dedupedDeps jsnixDeps isolateDeps; + drv_ = packageNix.packageDerivation; + }; +} else {}) \ No newline at end of file diff --git a/ecs/import-bundles/package.nix b/ecs/import-bundles/package.nix new file mode 100644 index 0000000..73d5e70 --- /dev/null +++ b/ecs/import-bundles/package.nix @@ -0,0 +1,59 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +{ + name = "@ar.io/import-bundles"; + version = "1.0.0"; + main = "src/index.mjs"; + + dependencies = { + arbundles = "^0.6.13"; + async-retry = "^1.3.3"; + aws-sdk = "^2.1046.0"; + dotenv = "^10.0.0"; + exit-hook = "^3.0.0"; + got = "^12.0.0"; + knex = "^0.95.14"; + moment = "latest"; + pg = "^8.7.1"; + p-limit = "^4.0.0"; + p-wait-for = "^4.1.0"; + p-whilst = "^3.0.0"; + p-min-delay = "^4.0.1"; + ramda = "^0.27.1"; + sqs-consumer = "^5.6.0"; + }; + + packageDerivation = { jsnixDeps, ... }@pkgs: { + buildInputs = [ + pkgs.openssl + pkgs.makeWrapper + ]; + + postInstall = '' + mkdir -p $out/bin + mkdir -p $out/lib/node_modules/@arweave/import-bundles + + cp -rT $(pwd) $out/lib/node_modules/@arweave/import-bundles + makeWrapper ${pkgs.nodejs_latest}/bin/node $out/bin/import-bundles-start \ + --run "cd $out/lib/node_modules/@arweave/import-bundles" \ + --prefix NODE_ENV : production \ + --prefix NODE_PATH : "./node_modules" + ''; + }; +} diff --git a/ecs/import-bundles/src/bundle.mjs b/ecs/import-bundles/src/bundle.mjs new file mode 100644 index 0000000..c270616 --- /dev/null +++ b/ecs/import-bundles/src/bundle.mjs @@ -0,0 +1,26 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { getTagValue } from "./utils.mjs"; + +export const isTxAns104 = (tx) => { + return ( + getTagValue(tx.tags, "bundle-format") == "binary" && + getTagValue(tx.tags, "bundle-version") == "2.0.0" + ); +}; diff --git a/ecs/import-bundles/src/index.mjs b/ecs/import-bundles/src/index.mjs new file mode 100644 index 0000000..2c9b2f4 --- /dev/null +++ b/ecs/import-bundles/src/index.mjs @@ -0,0 +1,134 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import AWS from "aws-sdk"; +import R from "ramda"; +import { Consumer } from "sqs-consumer"; +import verifyAndIndexStream from "arbundles/stream"; +import { Bundle, DataItem } from "arbundles"; +import exitHook from "exit-hook"; +import got from "got"; +import { createDbClient } from "./postgres.mjs"; +import { shuffle } from "./utils.mjs"; + +let exitSignaled = false; + +exitHook(() => { + exitSignaled = true; +}); + +const nodes = new Set(); + +async function refreshNodes() { + let jsonResponse; + try { + await retry( + async () => { + jsonResponse = await got("https://arweave.net/health").json(); + }, + { + retries: 5, + } + ); + } catch (error) { + console.error(error); + } + + if (typeof jsonResponse === "object" && Array.isArray(jsonResponse.origins)) { + for (const origin of jsonResponse.origins) { + if (origin.status === 200) { + nodes.add(origin.endpoint); + } else { + nodes.remove(origin.endpoint); + } + } + } +} + +const getSpecificTxHeader = async (id) => { + let tx; + for (const node of nodes.values()) { + try { + const response = await got(node + "/tx/" + id).json(); + + if (typeof response === "object" && response.id === id) { + tx = response; + } + } catch (error) { + console.error(error); + } + if (tx) { + return tx; + } + } + return tx; +}; + +let dbRead; +let dbWrite; + +const app = Consumer.create({ + queueUrl: process.env.ARWEAVE_SQS_IMPORT_BUNDLES_URL, + handleMessage: async (message) => { + console.log("MESSAGE", message); + // do some work with `message` + const tx = getSpecificTxHeader(message.tx_id); + const txDataSize = parseInt(tx["data_size"]); + + const maybeStream = await getData(tx.id || "", { log }); + }, + sqs: new AWS.SQS({ + httpOptions: { + agent: new https.Agent({ + keepAlive: true, + }), + }, + }), +}); + +app.on("error", (err) => { + console.error("[SQS] ERROR", err.message); +}); + +app.on("processing_error", (err) => { + console.error("[SQS] PROCESSING ERROR", err.message); +}); + +(async () => { + console.log("Starting import-bundles job.."); + await refreshNodes(); + + setInterval(async () => { + try { + await refreshNodes(); + } catch (error) { + console.error("Failed to refresh nodes", error); + } + }, 1000 * 60 * 60); + + console.log("opening new dbWrite connection"); + dbWrite = await createDbClient({ + user: "write", + }); + console.log("opening new dbRead connection"); + dbRead = await createDbClient({ + user: "read", + }); + console.log("start polling sqs messages..."); + app.start(); +})(); diff --git a/ecs/import-bundles/src/postgres.mjs b/ecs/import-bundles/src/postgres.mjs new file mode 100644 index 0000000..fab34ed --- /dev/null +++ b/ecs/import-bundles/src/postgres.mjs @@ -0,0 +1,147 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import "./env.mjs"; +import AWS from "aws-sdk"; +import knex from "knex"; + +const rds = new AWS.RDS(); + +const awsSM = new AWS.SecretsManager({ + region: process.env.AWS_REGION, +}); + +function getSecretValue(secretName) { + return new Promise((resolve, reject) => { + awsSM.getSecretValue({ SecretId: secretName }, function (err, data) { + if (err) { + if (err.code === "DecryptionFailureException") + // Secrets Manager can't decrypt the protected secret text using the provided KMS key. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "InternalServiceErrorException") + // An error occurred on the server side. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "InvalidParameterException") + // You provided an invalid value for a parameter. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "InvalidRequestException") + // You provided a parameter value that is not valid for the current state of the resource. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else if (err.code === "ResourceNotFoundException") + // We can't find the resource that you asked for. + // Deal with the exception here, and/or rethrow at your discretion. + reject(err); + else reject(err); + } else { + resolve(data.SecretString); + } + }); + }); +} + +export async function createDbClient({ user }) { + const rdsReadRoleSecret = { + username: "", + password: "", + url: process.env.ARWEAVE_DB_READ_HOST, + }; + const rdsWriteRoleSecret = { + username: "", + password: "", + url: process.env.ARWEAVE_DB_WRITE_HOST, + }; + + try { + const rdsProxySecretRead = JSON.parse(await getSecretValue("read")); + rdsReadRoleSecret.username = rdsProxySecretRead.username; + rdsReadRoleSecret.password = rdsProxySecretRead.password; + } catch (error) { + console.error(error); + } + + try { + const rdsProxySecretWrite = JSON.parse(await getSecretValue("write")); + rdsWriteRoleSecret.username = rdsProxySecretWrite.username; + rdsWriteRoleSecret.password = rdsProxySecretWrite.password; + } catch (error) { + console.error(error); + } + + const roleSecret = user === "read" ? rdsReadRoleSecret : rdsWriteRoleSecret; + + return await knex({ + client: "pg", + pool: { + min: 1, + max: 2, + acquireTimeoutMillis: 20000, + idleTimeoutMillis: 30000, + reapIntervalMillis: 40000, + }, + connection: { + host: roleSecret.url, + user: roleSecret.username, + database: "arweave", + ssl: false, + password: roleSecret.password, + expirationChecker: () => true, + }, + }); +} + +// The pg driver and knex don't know the destination column types, +// and they don't correctly serialize json fields, so this needs +// to be done manually. +const serialize = (row) => { + return R.reduce((result, key) => { + const value = row[key]; + result[key] = + value && typeof value == "object" ? JSON.stringify(value) : value; + return result; + }, {})(Object.keys(row)); +}; + +const upsert = async ( + connection, + { table, conflictKeys, rows, transaction } +) => { + const updateFields = Object.keys(rows[0]) + .filter((field) => !conflictKeys.includes(field)) + .map((field) => `${field} = excluded.${field}`) + .join(","); + + const query = connection.insert(rows).into(table); + + if (transaction) { + query.transacting(transaction); + } + + const { sql, bindings } = query.toSQL(); + + const upsertSql = sql.concat( + ` ON CONFLICT (${conflictKeys + .map((key) => `"${key}"`) + .join(",")}) DO UPDATE SET ${updateFields};` + ); + + return await connection.raw(upsertSql, bindings); +}; diff --git a/ecs/import-bundles/src/sqs.mjs b/ecs/import-bundles/src/sqs.mjs new file mode 100644 index 0000000..ac6a5ef --- /dev/null +++ b/ecs/import-bundles/src/sqs.mjs @@ -0,0 +1,64 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import AWS from "aws-sdk"; + +const sqs = new AWS.SQS({ + maxRetries: 3, + httpOptions: { timeout: 5000, connectTimeout: 5000 }, +}); + +function* chunk(arr, n) { + for (let i = 0; i < arr.length; i += n) { + yield arr.slice(i, i + n); + } +} + +export const enqueue = async (queueUrl, message, options) => { + if (!queueUrl) { + throw new Error(`Queue URL undefined`); + } + + await sqs + .sendMessage({ + QueueUrl: queueUrl, + MessageBody: JSON.stringify(message), + MessageGroupId: options && options.messagegroup, + MessageDeduplicationId: options && options.deduplicationId, + DelaySeconds: options && options.delaySeconds, + }) + .promise(); +}; + +export const enqueueBatch = async (queueUrl, messages) => { + for (const messageChnk of chunk(messages, 10)) { + await sqs + .sendMessageBatch({ + QueueUrl: queueUrl, + Entries: messageChnk.map((message) => { + return { + Id: message.id, + MessageBody: JSON.stringify(message), + MessageGroupId: message.messagegroup, + MessageDeduplicationId: message.deduplicationId, + }; + }), + }) + .promise(); + } +}; diff --git a/ecs/import-bundles/src/utils.mjs b/ecs/import-bundles/src/utils.mjs new file mode 100644 index 0000000..acd1032 --- /dev/null +++ b/ecs/import-bundles/src/utils.mjs @@ -0,0 +1,64 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import R from "ramda"; + +const shuffler = R.curry(function (random, list) { + var idx = -1; + var len = list.length; + var position; + var result = []; + while (++idx < len) { + position = Math.floor((idx + 1) * random()); + result[idx] = result[position]; + result[position] = list[idx]; + } + return result; +}); + +export const shuffle = shuffler(Math.random); + +export function fromB64Url(input) { + const paddingLength = input.length % 4 == 0 ? 0 : 4 - (input.length % 4); + + const base64 = input + .replace(/\-/g, "+") + .replace(/\_/g, "/") + .concat("=".repeat(paddingLength)); + + return Buffer.from(base64, "base64"); +} + +export const getTagValue = (tags, name) => { + const contentTypeTag = tags.find((tag) => { + try { + return ( + fromB64Url(tag.name).toString().toLowerCase() == name.toLowerCase() + ); + } catch (error) { + return undefined; + } + }); + try { + return contentTypeTag + ? fromB64Url(contentTypeTag.value).toString() + : undefined; + } catch (error) { + return undefined; + } +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..f55b70b --- /dev/null +++ b/package.json @@ -0,0 +1,119 @@ +{ + "name": "@ar.io/arweave-gateway", + "version": "1.0.0", + "description": "The code and infra for arweave.net", + "main": "dist/gateway/app.js", + "module": true, + "scripts": { + "build": "rimraf ./dist; tsc && cp ./src/gateway/routes/graphql-v2/schema/types.graphql ./dist/gateway/routes/graphql-v2/schema/types.graphql", + "build:lambda": "yarn run build && yarn run bundle:jobs", + "bundle:jobs": "npm run bundle:dispatch-txs && npm run bundle:export-chunks && npm run bundle:import-bundles && npm run bundle:import-txs && npm run bundle:import-chunks", + "bundle:dispatch-txs": "cross-env NODE_PATH=./node_modules node --max-old-space-size=4096 ./scripts/bundle-jobs.cjs ./dist/jobs/dispatch-txs.js", + "bundle:export-chunks": "cross-env NODE_PATH=./node_modules node --max-old-space-size=4096 ./scripts/bundle-jobs.cjs ./dist/jobs/export-chunks.js", + "bundle:import-bundles": "cross-env NODE_PATH=./node_modules node --max-old-space-size=4096 ./scripts/bundle-jobs.cjs ./dist/jobs/import-bundles.js", + "bundle:import-txs": "cross-env NODE_PATH=./node_modules node --max-old-space-size=4096 ./scripts/bundle-jobs.cjs ./dist/jobs/import-txs.js", + "bundle:import-chunks": "cross-env NODE_PATH=./node_modules node --max-old-space-size=4096 ./scripts/bundle-jobs.cjs ./dist/jobs/import-chunks.js", + "graphql-types": "graphql-codegen --config codegen.yml", + "postinstall": "patch-package" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ar-io/arweave-gateway.git" + }, + "keywords": [], + "author": "ArweaveTeam", + "license": "GPL-3.0", + "bugs": { + "url": "https://github.com/ar-io/arweave-gateway/issues" + }, + "homepage": "https://github.com/ar-io/arweave-gateway#readme", + "resolutions": { + "**/ethers": "^5.5.4", + "**/lodash": "4.17.21", + "**/uuid": "7.x", + "**/@szmarczak/http-timer": "4.x" + }, + "dependencies": { + "@hapi/joi": "^17.1.1", + "@types/node-cron": "^3.0.1", + "abort-controller": "^3.0.0", + "apollo-server-express": "^3.6.2", + "arbundles": "^0.6.13", + "arweave": "^1.10.23", + "asn1.js": "^5.4.1", + "async-retry": "^1.3.3", + "aws-sdk": "^2.1063.0", + "base64url": "^3.0.1", + "body-parser": "^1.19.1", + "browserify": "^17.0.0", + "bufferutil": "^4.0.6", + "cloneable-readable": "^2.1.0", + "crypto-js": "^4.1.1", + "crypto-random-string": "^4.0.0", + "dotenv": "^14.3.2", + "encoding": "^0.1.13", + "express": "^4.17.2", + "express-async-errors": "^3.1.1", + "express-async-handler": "^1.2.0", + "express-promise-router": "^4.1.1", + "express-validator": "^6.14.0", + "got": "11.x", + "graphql": "^16.2.0", + "graphql-fields": "^2.0.3", + "graphql-tools": "^8.2.0", + "helmet": "^5.0.2", + "http-errors": "^2.0.0", + "js-sha256": "^0.9.0", + "knex": "^1.0.1", + "lodash": "^4.17.21", + "mime": "^3.0.0", + "moment": "^2.29.1", + "morgan": "^1.10.0", + "node-cron": "^3.0.0", + "node-fetch": "2.x", + "patch-package": "^6.4.7", + "path": "^0.12.7", + "pg": "^8.7.1", + "pg-query-stream": "^4.2.1", + "postinstall-postinstall": "^2.1.0", + "pump": "^3.0.0", + "ramda": "^0.28.0", + "rfc4648": "^1.5.1", + "sha256": "^0.2.0", + "shortid": "^2.2.16", + "tar": "^6.1.11", + "utf-8-validate": "^5.0.8", + "webidl-conversions": "^7.0.0", + "winston": "^3.4.0" + }, + "devDependencies": { + "@graphql-codegen/cli": "2.4.0", + "@graphql-codegen/typescript": "2.4.2", + "@graphql-codegen/typescript-resolvers": "2.4.3", + "@types/async-retry": "^1.4.3", + "@types/aws-lambda": "^8.10.92", + "@types/chai": "^4.3.0", + "@types/express": "^4.17.13", + "@types/express-validator": "^3.0.0", + "@types/graphql-fields": "^1.3.4", + "@types/hapi__joi": "^17.1.8", + "@types/helmet": "4.0.0", + "@types/http-errors": "^1.8.2", + "@types/mocha": "^9.1.0", + "@types/node": "^17.0.12", + "@types/node-fetch": "^3.0.3", + "@types/pg": "^8.6.4", + "@types/pump": "^1.1.1", + "@types/shortid": "0.0.29", + "chai": "^4.3.6", + "cross-env": "^7.0.3", + "esmify": "^2.1.1", + "mocha": "^9.2.0", + "nanoid": "^3.2.0", + "rimraf": "^3.0.2", + "semver": "*", + "ts-node": "^10.4.0", + "ts-node-dev": "^1.1.8", + "typescript": "4.x" + } +} diff --git a/patches/@szmarczak+http-timer+4.0.6.patch b/patches/@szmarczak+http-timer+4.0.6.patch new file mode 100644 index 0000000..5dac369 --- /dev/null +++ b/patches/@szmarczak+http-timer+4.0.6.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@szmarczak/http-timer/dist/source/index.js b/node_modules/@szmarczak/http-timer/dist/source/index.js +index 6f07245..1fe63a9 100644 +--- a/node_modules/@szmarczak/http-timer/dist/source/index.js ++++ b/node_modules/@szmarczak/http-timer/dist/source/index.js +@@ -2,7 +2,7 @@ + Object.defineProperty(exports, "__esModule", { value: true }); + const defer_to_connect_1 = require("defer-to-connect"); + const util_1 = require("util"); +-const nodejsMajorVersion = Number(process.versions.node.split('.')[0]); ++const nodejsMajorVersion = 16; + const timer = (request) => { + if (request.timings) { + return request.timings; diff --git a/patches/knex+1.0.1.patch b/patches/knex+1.0.1.patch new file mode 100644 index 0000000..08e356f --- /dev/null +++ b/patches/knex+1.0.1.patch @@ -0,0 +1,39 @@ +diff --git a/node_modules/knex/lib/knex-builder/internal/config-resolver.js b/node_modules/knex/lib/knex-builder/internal/config-resolver.js +index dc2f322..8c9c380 100644 +--- a/node_modules/knex/lib/knex-builder/internal/config-resolver.js ++++ b/node_modules/knex/lib/knex-builder/internal/config-resolver.js +@@ -1,3 +1,4 @@ ++const Dialect = require('../../dialects/postgres/index.js'); + const Client = require('../../client'); + const { SUPPORTED_CLIENTS } = require('../../constants'); + +@@ -5,8 +6,6 @@ const parseConnection = require('./parse-connection'); + const { resolveClientNameWithAliases } = require('../../util/helpers'); + + function resolveConfig(config) { +- let Dialect; +- let resolvedConfig; + + // If config is a string, try to parse it + const parsedConfig = +@@ -19,11 +18,9 @@ function resolveConfig(config) { + arguments.length === 0 || + (!parsedConfig.client && !parsedConfig.dialect) + ) { +- Dialect = Client; + } + // If user provided Client constructor as a parameter, use it + else if (typeof parsedConfig.client === 'function') { +- Dialect = parsedConfig.client; + } + // If neither applies, let's assume user specified name of a client or dialect as a string + else { +@@ -34,8 +31,6 @@ function resolveConfig(config) { + ); + } + +- const resolvedClientName = resolveClientNameWithAliases(clientName); +- Dialect = require(`../../dialects/${resolvedClientName}/index.js`); + } + + // If config connection parameter is passed as string, try to parse it diff --git a/scripts/bundle-jobs.cjs b/scripts/bundle-jobs.cjs new file mode 100644 index 0000000..51b63db --- /dev/null +++ b/scripts/bundle-jobs.cjs @@ -0,0 +1,47 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +const fs = require("fs"); +const path = require("path"); +const browserify = require("browserify"); + +const jobJs = process.argv[2]; + +const b = browserify([process.cwd() + "/dist/jobs/" + path.basename(jobJs)], { + bare: true, + node: true, + noBuiltins: true, + standalone: "global", +}); + +console.log(process.cwd() + "/dist/jobs/" + path.basename(jobJs)); + +const stream = fs.createWriteStream( + path.resolve(process.cwd(), "./dist/jobs/") + + "/" + + path.basename(jobJs, ".js") + + "-min.js" +); + +const p = new Promise((r) => { + stream.on("end", r); +}); + +b.exclude("pg-native"); + +b.bundle().pipe(stream); diff --git a/sql/gateway-schema.sql b/sql/gateway-schema.sql new file mode 100644 index 0000000..49306d0 --- /dev/null +++ b/sql/gateway-schema.sql @@ -0,0 +1,421 @@ + -- Arweave Gateway + -- Copyright (C) 2022 Permanent Data Solutions, Inc + + -- This program is free software: you can redistribute it and/or modify + -- it under the terms of the GNU General Public License as published by + -- the Free Software Foundation, either version 3 of the License, or + -- (at your option) any later version. + + -- This program is distributed in the hope that it will be useful, + -- but WITHOUT ANY WARRANTY; without even the implied warranty of + -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + -- GNU General Public License for more details. + + -- You should have received a copy of the GNU General Public License + -- along with this program. If not, see . + + +-- +-- Name: blocks; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.blocks ( + id character(64) NOT NULL, + height integer NOT NULL, + mined_at timestamp without time zone NOT NULL, + txs jsonb NOT NULL, + created_at timestamp without time zone DEFAULT now() NOT NULL, + extended jsonb, + previous_block character varying NOT NULL +); + + +ALTER TABLE public.blocks OWNER TO root; + +-- +-- Name: blocks_tx_map; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.blocks_tx_map ( + tx_id character(43) NOT NULL, + block_id character(64) +); + + +ALTER TABLE public.blocks_tx_map OWNER TO root; + +-- +-- Name: bundle_status; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.bundle_status ( + id character(43) NOT NULL, + created_at timestamp without time zone DEFAULT now() NOT NULL, + updated_at timestamp without time zone, + attempts smallint DEFAULT 0 NOT NULL, + status character varying, + error character varying, + bundle_meta text +); + + +ALTER TABLE public.bundle_status OWNER TO root; + +-- +-- Name: chunks; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.chunks ( + data_root character varying NOT NULL, + data_size bigint NOT NULL, + "offset" bigint NOT NULL, + data_path character varying NOT NULL, + chunk_size integer NOT NULL, + exported_started_at timestamp without time zone, + exported_completed_at timestamp without time zone, + created_at timestamp without time zone DEFAULT now() NOT NULL +); + + +ALTER TABLE public.chunks OWNER TO root; + +-- +-- Name: hash_list; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.hash_list ( + indep_hash character varying +); + + +ALTER TABLE public.hash_list OWNER TO root; + +-- +-- Name: tags; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.tags ( + tx_id character(43) NOT NULL, + index integer NOT NULL, + name character varying NOT NULL, + value character varying NOT NULL, + created_at timestamp without time zone DEFAULT now() NOT NULL +); + + +ALTER TABLE public.tags OWNER TO root; + +-- +-- Name: tags_grouped; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.tags_grouped ( + tx_id character(43) NOT NULL, + tags jsonb +); + + +ALTER TABLE public.tags_grouped OWNER TO root; + +-- +-- Name: transactions; Type: TABLE; Schema: public; Owner: root +-- + +CREATE TABLE public.transactions ( + id character(43) NOT NULL, + owner character varying, + tags jsonb, + target character(43), + quantity character varying, + reward character varying, + signature character varying, + last_tx character varying, + data_size bigint, + content_type character varying, + format smallint, + created_at timestamp without time zone DEFAULT now() NOT NULL, + deleted_at timestamp without time zone, + height integer, + owner_address character(43), + data_root character(43), + parent character(43) +); + + +ALTER TABLE public.transactions OWNER TO root; + +-- +-- Name: blocks blocks_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.blocks + ADD CONSTRAINT blocks_pkey PRIMARY KEY (id); + + +-- +-- Name: blocks_tx_map blocks_tx_map_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.blocks_tx_map + ADD CONSTRAINT blocks_tx_map_pkey PRIMARY KEY (tx_id); + + +-- +-- Name: bundle_status bundle_status_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.bundle_status + ADD CONSTRAINT bundle_status_pkey PRIMARY KEY (id); + + +-- +-- Name: chunks chunks_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.chunks + ADD CONSTRAINT chunks_pkey PRIMARY KEY (data_root, data_size, "offset"); + + +-- +-- Name: tags_grouped tags_grouped_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.tags_grouped + ADD CONSTRAINT tags_grouped_pkey PRIMARY KEY (tx_id); + + +-- +-- Name: tags tags_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.tags + ADD CONSTRAINT tags_pkey PRIMARY KEY (tx_id, index); + + +-- +-- Name: transactions transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_pkey PRIMARY KEY (id); + + +-- +-- Name: blocks_created_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX blocks_created_at ON public.blocks USING btree (created_at); + + +-- +-- Name: blocks_height; Type: INDEX; Schema: public; Owner: root +-- + +CREATE UNIQUE INDEX blocks_height ON public.blocks USING btree (height); + + +-- +-- Name: blocks_height_sorted; Type: INDEX; Schema: public; Owner: root +-- + +CREATE UNIQUE INDEX blocks_height_sorted ON public.blocks USING btree (height DESC); + + +-- +-- Name: blocks_id_hash; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX blocks_id_hash ON public.blocks USING hash (id); + + +-- +-- Name: blocks_tx_block_id_hash; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX blocks_tx_block_id_hash ON public.blocks_tx_map USING hash (block_id); + + +-- +-- Name: chunks_created_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX chunks_created_at ON public.chunks USING btree (created_at); + + +-- +-- Name: chunks_data_root; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX chunks_data_root ON public.chunks USING hash (data_root); + + +-- +-- Name: chunks_data_root_data_size; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX chunks_data_root_data_size ON public.chunks USING btree (data_root, data_size); + + +-- +-- Name: chunks_exported_completed_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX chunks_exported_completed_at ON public.chunks USING btree (exported_completed_at); + + +-- +-- Name: chunks_exported_started_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX chunks_exported_started_at ON public.chunks USING btree (exported_started_at); + + +-- +-- Name: index_created_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX index_created_at ON public.bundle_status USING btree (created_at); + + +-- +-- Name: index_updated_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX index_updated_at ON public.bundle_status USING btree (updated_at); + + +-- +-- Name: tags_name; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX tags_name ON public.tags USING hash (name); + + +-- +-- Name: tags_name_txid; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX tags_name_txid ON public.tags USING btree (name, tx_id); + + +-- +-- Name: tags_name_value; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX tags_name_value ON public.tags USING btree (name, value); + + +-- +-- Name: tags_tx_id; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX tags_tx_id ON public.tags USING hash (tx_id); + + +-- +-- Name: tags_value; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX tags_value ON public.tags USING hash (value); + + +-- +-- Name: transactions_created_at; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_created_at ON public.transactions USING btree (created_at DESC); + + +-- +-- Name: transactions_height; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_height ON public.transactions USING btree (height); + + +-- +-- Name: transactions_height_id_sorted; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_height_id_sorted ON public.transactions USING btree (height DESC, id); + + +-- +-- Name: transactions_height_sorted; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_height_sorted ON public.transactions USING btree (height DESC); + + +-- +-- Name: transactions_owner_address_hash; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_owner_address_hash ON public.transactions USING hash (owner_address); + + +-- +-- Name: transactions_owner_hash; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_owner_hash ON public.transactions USING hash (id); + + +-- +-- Name: transactions_parent; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_parent ON public.transactions USING hash (parent); + + +-- +-- Name: transactions_target; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX transactions_target ON public.transactions USING hash (target); + + +-- +-- Name: tx_id_hash; Type: INDEX; Schema: public; Owner: root +-- + +CREATE INDEX tx_id_hash ON public.blocks_tx_map USING hash (tx_id); + +-- +-- Name: tags tags_tx_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.tags + ADD CONSTRAINT tags_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- Name: transactions transactions_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_height_fkey FOREIGN KEY (height) REFERENCES public.blocks(height) ON UPDATE SET NULL ON DELETE SET NULL DEFERRABLE; + + +-- +-- Name: blocks_tx_map transactions_map_block_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.blocks_tx_map + ADD CONSTRAINT transactions_map_block_id_fkey FOREIGN KEY (block_id) REFERENCES public.blocks(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- Name: transactions transactions_parent_fkey; Type: FK CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_parent_fkey FOREIGN KEY (parent) REFERENCES public.transactions(id); + + +-- +-- Name: transactions transactions_parent_fkey1; Type: FK CONSTRAINT; Schema: public; Owner: root +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_parent_fkey1 FOREIGN KEY (parent) REFERENCES public.transactions(id); diff --git a/src/cli/queue.ts b/src/cli/queue.ts new file mode 100644 index 0000000..c2d34b5 --- /dev/null +++ b/src/cli/queue.ts @@ -0,0 +1,100 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { SQS } from "aws-sdk"; +import { readFileSync } from "fs"; +import { sequentialBatch } from "../lib/helpers"; +import { enqueueBatch } from "../lib/queues"; +import { ImportTx } from "../interfaces/messages"; + +handler(); + +export async function handler(): Promise { + const args = process.argv.slice(2); + const csvPath = args[0]; + const queueUrl = args[1]; + + const rows = readFileSync(csvPath, "utf8").split("\n"); + + let count = 0; + let total = rows.length; + + console.log(`queueUrl: ${queueUrl}\ninputData: ${total} rows`); + + await sequentialBatch(rows, 50, async (batch: string[]) => { + await Promise.all([ + enqueueBatch( + queueUrl, + batch.slice(0, 10).map((id) => { + return { + id, + message: { id }, + }; + }) + ), + enqueueBatch( + queueUrl, + batch.slice(10, 20).map((id) => { + return { + id, + message: { id }, + }; + }) + ), + enqueueBatch( + queueUrl, + batch.slice(20, 30).map((id) => { + return { + id, + message: { id }, + }; + }) + ), + enqueueBatch( + queueUrl, + batch.slice(30, 40).map((id) => { + return { + id, + message: { id }, + }; + }) + ), + enqueueBatch( + queueUrl, + batch.slice(40, 50).map((id) => { + return { + id, + message: { id }, + }; + }) + ), + ]); + + // console.log( + // batch.map((id) => { + // return { + // id, + // message: { id }, + // }; + // }) + // ); + + count = count + batch.length; + console.log(`${count}/${total}`); + }); +} diff --git a/src/data/transactions.ts b/src/data/transactions.ts new file mode 100644 index 0000000..32a54e9 --- /dev/null +++ b/src/data/transactions.ts @@ -0,0 +1,243 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { Logger } from "winston"; +import fetch from "node-fetch"; +import got from "got"; +import { + fetchTransactionData, + getTagValue, + Tag, + DataBundleWrapper, +} from "../lib/arweave"; +import { Readable } from "stream"; +import { getStream, putStream, put, get, objectHeader } from "../lib/buckets"; +import { query as queryChunks } from "../database/chunk-db"; +import { query as transactionsQuery } from "../database/transaction-db"; +import { getConnectionPool } from "../database/postgres"; +import { NotFound } from "http-errors"; +import Knex from "knex"; +import { streamToJson, bufferToStream, fromB64Url } from "../lib/encoding"; +import { b64UrlDecode } from "arweave/node/lib/utils"; + +interface DataStream { + status?: number | undefined; + stream?: Readable; + contentType?: string; + contentLength?: number; + cached?: boolean; + tags?: Tag[]; +} + +export const getData = async ( + txid: string, + { log }: { log: Logger } +): Promise => { + log.info("[get-data] searching for tx: s3 tx cache", { txid }); + const s3CacheResponse = await streamCachedData({ txid, log }); + + if (s3CacheResponse) { + return s3CacheResponse; + } + + const connection = getConnectionPool("read"); + + const [txHeader] = await transactionsQuery(connection, { + id: txid, + limit: 1, + select: ["data_root", "data_size", "content_type", "parent"], + }); + + try { + if (txHeader && txHeader.data_size > 0 && txHeader.parent) { + log.info(`[get-data] item is data bundle item, searching for parent tx`, { + txid, + bundlerDataPath, + parent: txHeader.parent, + }); + const parent = await getData(txHeader.parent, { log }); + if (parent.stream) { + log.info(`[get-data] item is data bundle item, found parent tx`, { + txid, + parent: txHeader.parent, + }); + const parentData = await streamToJson(parent.stream); + const item = parentData.items.find((item) => { + return item.id == txid; + }); + + if (item) { + const data = fromB64Url(item.data); + return { + stream: bufferToStream(data), + contentType: getTagValue(item.tags, "content-type"), + contentLength: data.byteLength, + status: parent.status, + }; + } + } + } + + log.info("[get-data] searching for tx: s3 chunk cache", { txid }); + + if (txHeader && txHeader.data_root && txHeader.data_size > 0) { + const contentType = txHeader.content_type || undefined; + const contentLength = parseInt(txHeader.data_size); + + const chunks = (await queryChunks(connection, { + select: ["offset", "chunk_size"], + order: "asc", + }).where({ data_root: txHeader.data_root })) as { + offset: number; + chunk_size: number; + }[]; + + const cachedChunksSum = chunks.reduce( + (carry, { chunk_size }) => carry + (chunk_size || 0), + 0 + ); + + const hasAllChunks = cachedChunksSum == contentLength; + + log.warn(`[get-data] cached chunks do not equal tx data_size`, { + txid, + cachedChunksSum, + contentLength, + hasAllChunks, + }); + + if (hasAllChunks) { + const { stream } = await streamCachedChunks({ + offsets: chunks.map((chunk) => chunk.offset), + root: txHeader.data_root, + }); + + if (stream) { + return { + stream, + contentType, + contentLength, + }; + } + } + } + } catch (error) { + log.error(error); + } + + try { + log.info("[get-data] searching for tx: arweave nodes", { txid }); + const { stream, contentType, contentLength, tags } = + await fetchTransactionData(txid); + + if (stream) { + return { + contentType, + contentLength, + stream, + tags, + }; + } + } catch (error) { + log.error(error); + } + + throw new NotFound(); +}; + +export const streamCachedData = async ({ + txid, + log, +}: { + log?: Logger; + txid: string; +}): Promise => { + if (log) { + log.info(`[get-data] begin streamCachedData`, { txid }); + } + try { + const maybeStream = await getStream("tx-data", `tx/${txid}`); + + if (maybeStream) { + const { stream, contentType, contentLength, tags } = maybeStream; + return { + stream, + contentType, + contentLength, + tags, + cached: true, + }; + } + } catch (error: any) { + if (error.code != "NotFound") { + if (log) { + log.info("[get-data] error in streamCachedData", error || ""); + } else { + console.error("[get-data] error in streamCachedData", error || ""); + } + + throw new NotFound(); + } + } +}; + +export const streamCachedChunks = async ({ + root, + offsets, +}: { + root: string; + offsets: number[]; +}): Promise<{ + stream: Readable; +}> => { + let index = 0; + + // will throw an error if the first chunk doesn't exist + await objectHeader("tx-data", `chunks/${root}/${offsets[0]}`); + + const stream = new Readable({ + autoDestroy: true, + read: async function () { + try { + const offset = offsets[index]; + + if (!offset) { + this.push(null); + return; + } + + const { Body } = await get("tx-data", `chunks/${root}/${offset}`); + + if (Body) { + index = index + 1; + this.push(Body); + return; + } + + throw new NotFound(); + } catch (error) { + this.emit("error", error); + this.destroy(); + } + }, + }); + + return { + stream, + }; +}; diff --git a/src/database/block-db.ts b/src/database/block-db.ts new file mode 100644 index 0000000..4ec02bb --- /dev/null +++ b/src/database/block-db.ts @@ -0,0 +1,282 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import * as R from "ramda"; +import { Knex } from "knex"; +import { ImportTx } from "../interfaces/messages"; +import { Block } from "../lib/arweave"; +import { upsert, DBConnection } from "./postgres"; +import moment from "moment"; +import { pick, transform } from "lodash"; +import { sequentialBatch } from "../lib/helpers"; +import log from "../lib/log"; +import { ISO8601DateTimeString } from "../lib/encoding"; +import { enqueueBatch, getQueueUrl } from "../lib/queues"; + +export interface DatabaseBlock { + id: string; + previous_block: string; + mined_at: string; + height: number; + txs: string[]; + extended: object; +} + +export interface DatabaseBlockTxMap { + block_id: string; + tx_id: string; +} + +const blockFields = [ + "id", + "height", + "mined_at", + "previous_block", + "txs", + "extended", +]; + +const extendedFields = [ + "diff", + "hash", + "reward_addr", + "last_retarget", + "tx_root", + "tx_tree", + "reward_pool", + "weave_size", + "block_size", + "cumulative_diff", + "hash_list_merkle", + "tags", +]; + +export const getLatestBlock = async ( + connection: Knex +): Promise => { + const block = await connection + .select(blockFields) + .from("blocks") + .orderBy("height", "desc") + .first(); + + if (block) { + return block; + } + + throw new Error("Failed to get latest block from the block database"); +}; + +export const getBlock = async ( + connection: Knex, + predicate: { height: number } | { id: string } +): Promise => { + return connection.select(blockFields).from("blocks").where(predicate).first(); +}; + +export const getRecentBlocks = async ( + connection: Knex +): Promise => { + return connection + .select(blockFields) + .from("blocks") + .orderBy("height", "desc") + .limit(400); +}; + +type ITxMapping = { txs: TxBlockHeight[]; block: DatabaseBlock }; + +const enqueueTxImports = async (queueUrl: string, txIds: string[]) => { + await sequentialBatch(txIds, 10, async (ids: string[]) => { + log.info(`[import-blocks] queuing block txs`, { + ids, + }); + await enqueueBatch( + queueUrl, + ids.map((id) => { + return { + id: id, + message: { + id, + }, + }; + }) + ); + }); +}; + +export const saveBlocks = async ( + connection: DBConnection, + blocks: DatabaseBlock[] +) => { + const txImportQueueUrl = await getQueueUrl("import-txs"); + const blockTxMappings: ITxMapping[] = blocks.reduce((map, block) => { + return map.concat({ + block, + txs: block.txs.map((tx_id: string) => { + return { height: block.height, id: tx_id }; + }), + }); + }, [] as ITxMapping[]); + + for (const map of R.reverse(blockTxMappings)) { + const { block, txs } = map; + await connection.transaction(async (knexTransaction) => { + log.info(`[block-db] saving block`, { + height: block.height, + id: block.id, + }); + + await upsert(knexTransaction, { + table: "blocks", + conflictKeys: ["height"], + rows: [serialize(block)], + transaction: knexTransaction, + }); + + await sequentialBatch(txs, 10, async (batch: TxBlockHeight[]) => { + log.info(`[block-db] setting tx block heights`, { + txs: batch.map((item) => { + return { id: item.id, height: item.height }; + }), + }); + + await upsert(knexTransaction, { + table: "transactions", + conflictKeys: ["id"], + rows: batch, + transaction: knexTransaction, + }); + }); + }); + // log.info(`[block-db] setting bundle data item heights`); + + // for (const items_ of R.splitEvery(10, txs)) { + // await Promise.all( + // items_.map((item: TxBlockHeight) => + // connection.raw( + // `UPDATE transactions SET height = ? WHERE parent = ? AND height IS NULL`, + // [item.height, item.id] + // ) + // ) + // ); + // } + + log.info(`[block-db] enqueue-ing tx-imports`); + + // requeue *all* transactions involved in blocks that have forked. + // Some of them may have been imported already and purged, so we + // reimport everything to make sure there are no gaps. + await enqueueTxImports(txImportQueueUrl, block.txs); + } +}; + +interface TxBlockHeight { + id: string; + height: number; +} + +export const fullBlocksToDbBlocks = (blocks: Block[]): DatabaseBlock[] => { + return blocks.map(fullBlockToDbBlock); +}; +/** + * Format a full block into a stripped down version for storage in the postgres DB. + */ +export const fullBlockToDbBlock = (block: Block): DatabaseBlock => { + return { + id: block.indep_hash, + height: block.height, + previous_block: block.previous_block, + txs: block.txs, + mined_at: moment(block.timestamp * 1000).format(), + extended: pick(block, extendedFields), + }; +}; + +// The pg driver and knex don't know the destination column types, +// and they don't correctly serialize json fields, so this needs +// to be done manually. +const serialize = (row: DatabaseBlock): object => { + return transform(row, (result: any, value: any, key: string) => { + result[key] = + value && typeof value == "object" ? JSON.stringify(value) : value; + }); +}; + +type BlockSortOrder = "HEIGHT_ASC" | "HEIGHT_DESC"; + +const orderByClauses: { [key in BlockSortOrder]: string } = { + HEIGHT_ASC: "blocks.height ASC NULLS LAST, id ASC", + HEIGHT_DESC: "blocks.height DESC NULLS FIRST, id ASC", +}; +interface BlockQuery { + id?: string; + ids?: string[]; + limit?: number; + offset?: number; + select?: any; + before?: ISO8601DateTimeString; + sortOrder?: BlockSortOrder; + minHeight?: number; + maxHeight?: number; +} + +export const queryBlocks = ( + connection: Knex, + { + limit = 100000, + select, + offset = 0, + before, + id, + ids, + sortOrder = "HEIGHT_DESC", + minHeight = -1, + maxHeight = -1, + }: BlockQuery +): Knex.QueryInterface => { + const query = connection.queryBuilder().select(select).from("blocks"); + + if (id) { + query.where("blocks.id", id); + } + + if (ids) { + query.whereIn("blocks.id", ids); + } + + if (before) { + query.where("blocks.created_at", "<", before); + } + + if (minHeight >= 0) { + query.where("blocks.height", ">=", minHeight); + } + + if (maxHeight >= 0) { + query.where("blocks.height", "<=", maxHeight); + } + + query.limit(limit).offset(offset); + + if (Object.keys(orderByClauses).includes(sortOrder)) { + query.orderByRaw(orderByClauses[sortOrder]); + } + + return query; +}; diff --git a/src/database/bundle-import-db.ts b/src/database/bundle-import-db.ts new file mode 100644 index 0000000..3354da6 --- /dev/null +++ b/src/database/bundle-import-db.ts @@ -0,0 +1,66 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { upsert } from "./postgres"; +import { Knex } from "knex"; +import { String } from "aws-sdk/clients/acm"; + +export interface DataBundleStatus { + id: string; + status: "pending" | "complete" | "error" | "invalid"; + attempts: number; + error: string | null; + bundle_meta?: string; +} + +const table = "bundle_status"; + +const fields = ["id", "status", "attempts", "error"]; + +export const saveBundleStatus = async ( + connection: Knex, + rows: Partial[] +) => { + return upsert(connection, { + table, + conflictKeys: ["id"], + rows, + }); +}; + +export const getBundleImport = async ( + connection: Knex, + id: string +): Promise> => { + const result = await connection + .select(fields) + .from("bundle_status") + .where({ id }) + .first(); + + if (result) { + return { + id: result.id, + status: result.status, + attempts: result.attempts, + error: result.error, + }; + } + + return {}; +}; diff --git a/src/database/chunk-db.ts b/src/database/chunk-db.ts new file mode 100644 index 0000000..f9038cf --- /dev/null +++ b/src/database/chunk-db.ts @@ -0,0 +1,147 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { upsert } from "./postgres"; +import { Knex } from "knex"; +import moment from "moment"; +export interface DatabaseChunk { + data_root: string; + data_size: number; + data_path: string; + offset: number; + chunk_size: number; +} + +const chunkFields = [ + "data_root", + "data_size", + "data_path", + "offset", + "chunk_size", +]; + +export const saveChunk = async (connection: Knex, chunk: DatabaseChunk) => { + await upsert(connection, { + table: "chunks", + conflictKeys: ["data_root", "data_size", "offset"], + rows: [chunk], + }); +}; + +interface ChunkQuery { + limit?: number; + offset?: number; + root?: string; + select?: (keyof DatabaseChunk)[]; + order?: "asc" | "desc"; +} + +export const query = ( + connection: Knex, + { select, order = "asc", root }: ChunkQuery +): Knex.QueryBuilder[]> => { + const query = connection + .queryBuilder() + .select(select || "*") + .from("chunks"); + + query.orderBy("offset", order); + + return query; +}; + +export const getPendingExports = async ( + connection: Knex, + { limit = 100 }: { limit: number } +): Promise => { + // select * from chunks where data_root in + // (select data_root from chunks group by data_root, data_size having sum(chunk_size) = data_size) + // and exported_started_at is null order by created_at asc + const query = connection + .select(chunkFields) + .from("chunks") + .whereIn("data_root", (query) => { + query + .select("data_root") + .from("chunks") + .groupBy(["data_root", "data_size"]) + .havingRaw("sum(chunk_size) = data_size"); + }) + .whereNull("exported_started_at") + .orderBy("created_at", "asc"); + + if (limit) { + query.limit(limit); + } + + return query; +}; + +export const startedExport = async ( + connection: Knex, + chunk: { + data_root: string; + data_size: number; + offset: number; + } +) => { + const query = connection + .update({ + exported_started_at: moment().format(), + }) + .from("chunks") + .where(chunk); + + await query; +}; + +export const completedExport = async ( + connection: Knex, + chunk: { + data_root: string; + data_size: number; + offset: number; + } +) => { + await connection + .update({ + exported_completed_at: moment().format(), + }) + .from("chunks") + .where(chunk); +}; + +export const queryRecentChunks = async ( + connection: Knex, + { + root, + size, + }: { + root: string; + size: number; + } +) => { + return connection + .select(["data_root", "data_size", "offset"]) + .from("chunks") + .where({ + data_root: root, + data_size: size, + }) + .orderBy("offset", "asc"); +}; diff --git a/src/database/postgres.ts b/src/database/postgres.ts new file mode 100644 index 0000000..511be16 --- /dev/null +++ b/src/database/postgres.ts @@ -0,0 +1,155 @@ +import AWS from "aws-sdk"; +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import knex, { Knex } from "knex"; +import log from "../lib/log"; +import { wait } from "../lib/helpers"; + +export type ConnectionMode = "read" | "write"; + +export type DBConnection = Knex | Knex.Transaction; + +let poolCache: { + read: null | Knex; + write: null | Knex; +} = { + read: null, + write: null, +}; + +export const initConnectionPool = ( + mode: ConnectionMode, + config?: PoolConfig +) => { + if (!poolCache[mode]) { + log.info(`[postgres] creating connection: ${mode}`); + poolCache[mode] = createConnectionPool(mode, config); + } +}; + +export const getConnectionPool = (mode: ConnectionMode): Knex => { + log.info(`[postgres] reusing connection: ${mode}`); + return poolCache[mode]!; +}; + +export const releaseConnectionPool = async ( + mode?: ConnectionMode +): Promise => { + if (mode) { + if (poolCache[mode]) { + log.info(`[postgres] destroying connection: ${mode}`); + await poolCache[mode]!.destroy(); + poolCache[mode] = null; + } + } else { + await Promise.all([ + releaseConnectionPool("read"), + releaseConnectionPool("write"), + ]); + await wait(200); + } +}; + +interface PoolConfig { + min: number; + max: number; +} + +export const createConnectionPool = ( + mode: ConnectionMode = "write", + { min, max }: PoolConfig = { min: 1, max: 10 } +): Knex => { + // newline + const host = { + read: process.env.ARWEAVE_DB_READ_HOST, + write: process.env.ARWEAVE_DB_WRITE_HOST, + }[mode]; + + const password = { + read: process.env.PSQL_READ_PASSWORD, + write: process.env.PSQL_WRITE_PASSWORD, + }[mode]; + + const hostDisplayName = `${process.env.AWS_REGION} ${mode}@${host}:${5432}`; + + log.info(`[postgres] connecting to db: ${hostDisplayName}`); + + const client = knex({ + acquireConnectionTimeout: 120000, + client: "pg", + pool: { + min, + max, + acquireTimeoutMillis: 120000, + idleTimeoutMillis: 30000, + reapIntervalMillis: 40000, + }, + connection: { + host, + user: mode, + database: "arweave", + ssl: { + rejectUnauthorized: false, + }, + password, + expirationChecker: () => true, + connectTimeout: 90000, + }, + }); + + return client; +}; + +interface UpsertOptions { + table: string; + conflictKeys: string[]; + rows: T; + transaction?: Knex.Transaction; +} + +/** + * Generate a postgres upsert statement. This manually appends a raw section to the query. + * + * INSERT (col, col, col) VALUES (val, val, val) ON CONFLICT (id,index) SO UPDATE SET x = excluded.x... + */ +export const upsert = ( + connection: DBConnection, + { table, conflictKeys, rows, transaction }: UpsertOptions +) => { + const updateFields = Object.keys(rows[0]) + .filter((field) => !conflictKeys.includes(field)) + .map((field) => `${field} = excluded.${field}`) + .join(","); + + const query = connection.insert(rows).into(table); + + if (transaction) { + query.transacting(transaction); + } + + const { sql, bindings } = query.toSQL(); + + const upsertSql = sql.concat( + ` ON CONFLICT (${conflictKeys + .map((key) => `"${key}"`) + .join(",")}) DO UPDATE SET ${updateFields};` + ); + + return connection.raw(upsertSql, bindings); +}; diff --git a/src/database/transaction-db.ts b/src/database/transaction-db.ts new file mode 100644 index 0000000..2a213ec --- /dev/null +++ b/src/database/transaction-db.ts @@ -0,0 +1,429 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { upsert } from "./postgres"; +import log from "../lib/log"; +import { Knex } from "knex"; +import { + TransactionHeader, + getTagValue, + Tag, + utf8DecodeTag, + DataBundleItem, +} from "../lib/arweave"; +import { + fromB64Url, + sha256B64Url, + ISO8601DateTimeString, +} from "../lib/encoding"; +import { pick, uniqBy } from "lodash"; +import moment from "moment"; +import { TagFilter } from "../gateway/routes/graphql-v2/schema/types"; +import { sequentialBatch } from "../lib/helpers"; +import { DataItem } from "arbundles"; + +interface DatabaseTag { + tx_id: string; + index: number; + name: string | undefined; + value: string | undefined; + // value_numeric: string | undefined; +} + +const txFields = [ + "format", + "id", + "signature", + "owner", + "owner_address", + "target", + "reward", + "last_tx", + "tags", + "quantity", + "quantity", + "content_type", + "data_size", + "data_root", +]; + +export const getTxIds = async ( + connection: Knex, + predicates: object +): Promise => { + return await connection.pluck("id").from("transactions").where(predicates); +}; + +export const getTx = async ( + connection: Knex, + predicates: object +): Promise => { + return connection.select().from("transactions").where(predicates).first(); +}; + +type TxSortOrder = "HEIGHT_ASC" | "HEIGHT_DESC"; + +const orderByClauses: { [key in TxSortOrder]: string } = { + HEIGHT_ASC: "transactions.height ASC NULLS LAST, id ASC", + HEIGHT_DESC: "transactions.height DESC NULLS FIRST, id ASC", +}; + +interface TxQuery { + to?: string[]; + from?: string[]; + id?: string; + ids?: string[]; + tags?: TagFilter[]; + parents?: string[]; + limit?: number; + offset?: number; + select?: any; + blocks?: boolean; + before?: ISO8601DateTimeString; + sortOrder?: TxSortOrder; + status?: "any" | "confirmed" | "pending"; + pendingMinutes?: number; + minHeight?: number; + maxHeight?: number; +} + +export const query = ( + connection: Knex, + { + to, + from, + tags, + parents, + limit = 100000, + offset = 0, + id, + ids, + status, + select, + before, + blocks = false, + sortOrder = "HEIGHT_DESC", + pendingMinutes = 60, + minHeight = -1, + maxHeight = -1, + }: TxQuery +): Knex.QueryBuilder => { + const query = connection + .queryBuilder() + .select( + select || { + id: "transactions.id", + height: "transactions.height", + tags: "transactions.tags", + } + ) + .from("transactions"); + + if (blocks) { + query.leftJoin("blocks", "transactions.height", "blocks.height"); + } + + if (pendingMinutes >= 0) { + query.where((query) => { + // Include recent pending transactions up to pendingMinutes old. + // After this threshold they will be considered orphaned so not included in results. + query.whereNotNull("transactions.height"); + + query.orWhere( + "transactions.created_at", + ">", + moment().subtract(pendingMinutes, "minutes").toISOString() + ); + }); + } + + if (status == "confirmed") { + query.whereNotNull("transactions.height"); + } + + if (before) { + query.where("transactions.created_at", "<", before); + } + + if (id) { + query.where("transactions.id", id); + } + + if (ids) { + query.whereIn("transactions.id", ids); + } + + if (parents) { + query.whereIn("transactions.parent", parents); + } + + if (to) { + query.whereIn("transactions.target", to); + } + + if (from) { + query.whereIn("transactions.owner_address", from); + } + + if (tags) { + tags.forEach((tag, index) => { + const tagAlias = `${index}_${index}`; + + query.join(`tags as ${tagAlias}`, (join) => { + join.on("transactions.id", `${tagAlias}.tx_id`); + + join.andOnIn(`${tagAlias}.name`, [tag.name]); + + if (tag.op == "EQ") { + join.andOnIn(`${tagAlias}.value`, tag.values); + } + + if (tag.op == "NEQ") { + join.andOnNotIn(`${tagAlias}.value`, tag.values); + } + }); + }); + } + + if (minHeight >= 0) { + query.where("transactions.height", ">=", minHeight); + } + + if (maxHeight >= 0) { + query.where("transactions.height", "<=", maxHeight); + } + + query.limit(limit).offset(offset); + + if (Object.keys(orderByClauses).includes(sortOrder)) { + query.orderByRaw(orderByClauses[sortOrder]); + } + + log.info("[grqphql/v2/104] RAW", { queryRaw: query.toString() }); + return query; +}; + +export const hasTx = async (connection: Knex, id: string): Promise => { + const result = await connection + .first("id") + .from("transactions") + .where({ id }) + .whereNotNull("owner"); + + return !!(result && result.id); +}; + +export const hasTxs = async ( + connection: Knex, + ids: string[] +): Promise => { + return await connection.pluck("id").from("transactions").whereIn("id", ids); +}; + +export const saveTx = async (connection: Knex, tx: TransactionHeader) => { + return await connection.transaction(async (knexTransaction) => { + await upsert(knexTransaction, { + table: "transactions", + conflictKeys: ["id"], + rows: [ + txToRow({ + tx, + }), + ], + }); + + if (tx.tags.length > 0) { + await upsert(knexTransaction, { + table: "tags", + conflictKeys: ["tx_id", "index"], + rows: txTagsToRows(tx.id, tx.tags), + }); + } + }); +}; + +export const saveBundleDataItem = async ( + connection: Knex, + tx: DataBundleItem, + { parent }: { parent: string } +) => { + const maybeHeight = await connection + .select("height") + .from("transactions") + .where({ id: parent }); + + return await connection.transaction(async (knexTransaction: any) => { + await upsert(knexTransaction, { + table: "transactions", + conflictKeys: ["id"], + rows: [ + { + parent, + format: 1, + id: tx.id, + signature: tx.signature, + owner: tx.owner, + owner_address: sha256B64Url(fromB64Url(tx.owner)), + target: tx.target, + reward: 0, + last_tx: tx.nonce, + tags: JSON.stringify(tx.tags), + quantity: 0, + data_size: tx.dataSize || fromB64Url((tx as any).data).byteLength, + ...(maybeHeight && maybeHeight.length > 0 + ? maybeHeight[0] + : undefined), + }, + ], + }); + + if (tx.tags.length > 0) { + await upsert(knexTransaction, { + table: "tags", + conflictKeys: ["tx_id", "index"], + rows: txTagsToRows(tx.id, tx.tags), + }); + } + }); +}; + +export const saveBundleDataItems = async ( + connection: Knex, + bundleId: string, + items: DataBundleItem[] +) => { + const maybeHeight = await connection + .select("height") + .from("transactions") + .where({ id: bundleId }); + + return await connection.transaction(async (knexTransaction: any) => { + log.info(`[import-bundles] importing tx bundle items to gql db`, { + bundle: bundleId, + batchSize: items.length, + }); + + const tags: DatabaseTag[] = []; + + const rows = uniqBy(items, "id").map((item) => { + console.error({ item }); + if (item.tags.length > 0) { + tags.push(...txTagsToRows(item.id, item.tags)); + } + + log.info(`[import-bundles] importing tx bundle item to gql db`, { + parent: bundleId, + format: 1, + id: item.id, + signature: item.signature, + owner: item.owner, + owner_address: sha256B64Url(fromB64Url(item.owner)), + target: item.target || "", + reward: 0, + // @ts-ignore + last_tx: item.nonce || item.anchor || "", + tags: JSON.stringify(item.tags || []), + quantity: 0, + data_size: item.dataSize ?? fromB64Url((item as any).data).byteLength, + ...(maybeHeight && maybeHeight.length > 0 ? maybeHeight[0] : undefined), + }); + + return { + parent: bundleId, + format: 1, + id: item.id, + signature: item.signature, + owner: item.owner, + owner_address: sha256B64Url(fromB64Url(item.owner)), + target: item.target || "", + reward: 0, + // @ts-ignore + last_tx: item.nonce || item.anchor || "", + tags: JSON.stringify(item.tags || []), + quantity: 0, + data_size: item.dataSize ?? fromB64Url((item as any).data).byteLength, + ...(maybeHeight && maybeHeight.length > 0 ? maybeHeight[0] : undefined), + }; + }); + + await upsert(knexTransaction, { + table: "transactions", + conflictKeys: ["id"], + rows: rows, + }); + + if (tags.length > 0) { + await sequentialBatch(tags, 500, async (items: DatabaseTag[]) => { + log.info(`[import-bundles] importing tx bundle tags to gql db`, { + bundle: bundleId, + batchSize: items.length, + }); + + log.info( + `[import-bundles] importing tx bundle item tags to gql db`, + tags + ); + + await upsert(knexTransaction, { + table: "tags", + conflictKeys: ["tx_id", "index"], + rows: tags, + }); + }); + } + }); +}; + +const txToRow = ({ tx }: { tx: TransactionHeader | DataBundleItem }) => { + return pick( + { + ...tx, + content_type: getTagValue(tx.tags, "content-type"), + format: (tx as any).format || 0, + data_size: + (tx as any).data_size || + ((tx as any).data + ? fromB64Url((tx as any).data).byteLength + : undefined), + tags: JSON.stringify(tx.tags), + owner_address: sha256B64Url(fromB64Url(tx.owner)), + }, + txFields + ); +}; + +const txTagsToRows = (tx_id: string, tags: Tag[]): DatabaseTag[] => { + return ( + tags + .map((tag, index) => { + const { name, value } = utf8DecodeTag(tag); + + return { + tx_id, + index, + name, + value, + }; + }) + // The name and values columns are indexed, so ignore any values that are too large. + // Postgres will throw an error otherwise: index row size 5088 exceeds maximum 2712 for index "tags_name_value" + .filter( + ({ name, value }) => (name?.length || 0) + (value?.length || 0) < 2712 + ) + ); +}; diff --git a/src/gateway/app.ts b/src/gateway/app.ts new file mode 100644 index 0000000..155d980 --- /dev/null +++ b/src/gateway/app.ts @@ -0,0 +1,138 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import "./env"; +import express from "express"; +import helmet from "helmet"; +import { + initConnectionPool, + releaseConnectionPool, +} from "../database/postgres"; +import log from "../lib/log"; +import { handler as corsMiddleware } from "./middleware/cors"; +import { handler as jsonBodyMiddleware } from "./middleware/json-body"; +import { + configureRequestLogging, + handler as requestLoggingMiddleware, +} from "./middleware/request-log"; +import { handler as sandboxMiddleware } from "./middleware/sandbox"; +import { handler as arqlHandler } from "./routes/arql"; +import { handler as dataHandler } from "./routes/data"; +import { apolloServer } from "./routes/graphql"; +import { apolloServer as apolloServerV2 } from "./routes/graphql-v2"; +import { handler as healthHandler } from "./routes/health"; +import { handler as newTxHandler } from "./routes/new-tx"; +import { handler as newChunkHandler } from "./routes/new-chunk"; +import { handler as proxyHandler } from "./routes/proxy"; +import { handler as webhookHandler } from "./routes/webhooks"; + +import { logMiddleware } from "./middleware/log.middleware"; + +require("express-async-errors"); + +initConnectionPool("read", { min: 1, max: 100 }); + +const app = express(); + +const dataPathRegex = + /^\/?([a-zA-Z0-9-_]{43})\/?$|^\/?([a-zA-Z0-9-_]{43})\/(.*)$/i; + +const port = process.env.APP_PORT; + +app.set("trust proxy", 1); + +// Global middleware + +app.use(configureRequestLogging); + +// app.use(requestLoggingMiddleware); + +app.use(helmet.hidePoweredBy()); + +app.use(corsMiddleware); + +app.use(sandboxMiddleware); +app.use(logMiddleware); + +app.get("/favicon.ico", (req, res) => { + res.status(204).end(); +}); + +app.options("/tx", (req, res) => { + res.send("OK").end(); +}); + +app.post("/tx", jsonBodyMiddleware, newTxHandler); + +app.post("/chunk", jsonBodyMiddleware, newChunkHandler); + +app.options("/chunk", (req, res) => { + res.send("OK").end(); +}); + +app.post("/webhook", jsonBodyMiddleware, webhookHandler); + +app.post("/arql", jsonBodyMiddleware, arqlHandler); + +app.get("/health", healthHandler); + +app.get(dataPathRegex, dataHandler); + +const apolloServerInstanceArql = apolloServer(); + +const apolloServerInstanceGql = apolloServerV2({ introspection: true }); + +Promise.all([ + apolloServerInstanceArql.start(), + apolloServerInstanceGql.start(), +]).then(() => { + apolloServerInstanceArql.applyMiddleware({ app, path: "/arql" }); + apolloServerInstanceGql.applyMiddleware({ + app, + path: "/graphql", + }); + log.info(`[app] Started on http://localhost:${port}`); + const server = app.listen(port, () => { + try { + log.info( + `[${new Date().toLocaleString()}] Using version `, + require("../../package.json").version + ); + } catch (e) { + log.info(`'Unable to retrieve the package version.'`); + } + + // The apollo middleare *must* be applied after the standard arql handler + // as arql is the default behaviour. If the graphql handler + // is invoked first it will emit an error if it received an arql request. + }); + + server.keepAliveTimeout = 120 * 1000; + server.headersTimeout = 120 * 1000; + app.get("*", proxyHandler); +}); + +// console.log([server.headersTimeout]); + +process.on("SIGINT", function () { + log.info("\nGracefully shutting down from SIGINT"); + releaseConnectionPool().then(() => { + log.info("[app] DB connections closed"); + process.exit(1); + }); +}); diff --git a/src/gateway/env.ts b/src/gateway/env.ts new file mode 100644 index 0000000..5eae13b --- /dev/null +++ b/src/gateway/env.ts @@ -0,0 +1,22 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { config as dotenvConfig } from "dotenv"; +dotenvConfig({ + silent: true, +} as any); diff --git a/src/gateway/express.d.ts b/src/gateway/express.d.ts new file mode 100644 index 0000000..6a16464 --- /dev/null +++ b/src/gateway/express.d.ts @@ -0,0 +1,28 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +declare global { + declare module "express-serve-static-core" { + export interface Request { + id: string; + log: import("winston").Logger; + } + + export interface Response {} + } +} diff --git a/src/gateway/middleware/cors.ts b/src/gateway/middleware/cors.ts new file mode 100644 index 0000000..498ea79 --- /dev/null +++ b/src/gateway/middleware/cors.ts @@ -0,0 +1,26 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { RequestHandler } from "express"; + +export const handler: RequestHandler = (req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", req.method); + res.header("Access-Control-Allow-Headers", "Content-Type"); + next(); +}; diff --git a/src/gateway/middleware/json-body.ts b/src/gateway/middleware/json-body.ts new file mode 100644 index 0000000..32f1ca0 --- /dev/null +++ b/src/gateway/middleware/json-body.ts @@ -0,0 +1,21 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { json } from "body-parser"; + +export const handler = json({ limit: "15mb", type: () => true }); diff --git a/src/gateway/middleware/log.middleware.ts b/src/gateway/middleware/log.middleware.ts new file mode 100644 index 0000000..9859028 --- /dev/null +++ b/src/gateway/middleware/log.middleware.ts @@ -0,0 +1,39 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import morgan from "morgan"; +import id from "shortid"; +import { Request, Response, NextFunction } from "express"; + +export function logConfigurationMiddleware( + req: Request, + res: Response, + next: NextFunction +) { + const trace = id.generate(); + req.id = trace; + res.header("X-Trace", trace); + return next(); +} +morgan.token("trace", (req: Request) => { + return req.id || "UNKNOWN"; +}); + +export const logMiddleware = morgan( + '[http] :remote-addr - :remote-user [:date] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms ":referrer" ":user-agent" [trace=:trace]' +); diff --git a/src/gateway/middleware/request-log.ts b/src/gateway/middleware/request-log.ts new file mode 100644 index 0000000..cf7a742 --- /dev/null +++ b/src/gateway/middleware/request-log.ts @@ -0,0 +1,55 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import morgan, { token as morganToken } from "morgan"; +import { RequestHandler, Request } from "express"; +import shortId from "shortid"; +import log from "../../lib/log"; +import { createLogger, transports, format } from "winston"; + +export const configureRequestLogging: RequestHandler = (req, res, next) => { + const traceId = shortId.generate(); + req.id = traceId; + res.header("X-Trace", traceId); + req.log = log.child({ + trace: traceId, + }); + next(); +}; + +morganToken("trace", (req) => { + return getTraceId(req); +}); + +morganToken("aws_trace", (req) => { + return getAwsTraceId(req); +}); + +export const handler = morgan({ + stream: { write: (str: string) => log.log("info", str) }, +}); + +const getTraceId = (req: any): string => { + return req.id || ""; +}; + +const getAwsTraceId = (req: any): string => { + return req.headers["x-amzn-trace-id"] + ? (req.headers["x-amzn-trace-id"] as string) + : ""; +}; diff --git a/src/gateway/middleware/sandbox.ts b/src/gateway/middleware/sandbox.ts new file mode 100644 index 0000000..81131c3 --- /dev/null +++ b/src/gateway/middleware/sandbox.ts @@ -0,0 +1,75 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { fromB64Url, toB32 } from "../../lib/encoding"; +import { RequestHandler, Request } from "express"; +import querystring from "querystring"; + +const getTxIdFromPath = (path: string): string | undefined => { + const matches = path.match(/^\/?([a-z0-9-_]{43})/i) || []; + return matches[1]; +}; + +export const handler: RequestHandler = (req, res, next) => { + const txid = getTxIdFromPath(req.path); + + if (txid && !req.headers["x-amz-cf-id"]) { + const currentSandbox = getRequestSandbox(req); + const expectedSandbox = expectedTxSandbox(txid); + let queryString = ""; + + if ( + req && + typeof req === "object" && + req.path && + typeof req.query === "object" && + Object.keys(req.query).length > 0 + ) { + try { + queryString = ( + ((req.path || "").endsWith("/") ? "?" : "/?") + + querystring.stringify(req.query as any) + ).replace(/\/\//i, "/"); // fix double slash + } catch (error) { + req.log.info("[sandbox] error making queryString", error as any); + queryString = ""; + } + } + + if (currentSandbox !== expectedSandbox) { + return res.redirect( + 302, + `${process.env.SANDBOX_PROTOCOL}://${expectedSandbox}.` + + `${process.env.SANDBOX_HOST}${req.path}${queryString || ""}`.replace( + /\/\//i, + "/" + ) + ); + } + } + + next(); +}; + +const expectedTxSandbox = (id: string): string => { + return toB32(fromB64Url(id)); +}; + +const getRequestSandbox = (req: Request) => { + return req.headers.host!.split(".")[0].toLowerCase(); +}; diff --git a/src/gateway/middleware/validate-body.ts b/src/gateway/middleware/validate-body.ts new file mode 100644 index 0000000..42c796d --- /dev/null +++ b/src/gateway/middleware/validate-body.ts @@ -0,0 +1,43 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import Joi, { Schema, ValidationError } from "@hapi/joi"; +import { BadRequest } from "http-errors"; + +export const parseInput = ( + schema: Schema, + payload: any, + options: { transform?: (validatedPayload: any) => T } = {} +): T => { + const { transform } = options; + try { + const validatedPayload = Joi.attempt(payload, schema, { + abortEarly: false, + }); + return transform ? transform(validatedPayload) : validatedPayload; + } catch (error: any) { + const report: ValidationError = error as ValidationError; + throw new BadRequest({ + // We only want to expose the message and path, so ignore the other fields + validation: report.details.map(({ message, path }) => ({ + message, + path, + })), + } as any); + } +}; diff --git a/src/gateway/routes/arql/index.ts b/src/gateway/routes/arql/index.ts new file mode 100644 index 0000000..1200deb --- /dev/null +++ b/src/gateway/routes/arql/index.ts @@ -0,0 +1,199 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { getConnectionPool } from "../../../database/postgres"; +import knex, { Knex } from "knex"; +import { query as txQuery } from "../../../database/transaction-db"; +import { RequestHandler } from "express"; +import createError from "http-errors"; +import { Logger } from "winston"; + +type ArqlQuery = ArqlBooleanQuery | ArqlTagMatch; + +interface ArqlTagMatch { + op: "equals"; + expr1: string; + expr2: string; +} + +interface ArqlTagCompare { + op: "compare"; + expr1: string; + expr2: { + type: ArqlTagMatchQueryType; + op: ArqlTagMatchQueryOp; + value: number | string; + }; +} + +type ArqlTagMatchQueryType = "string" | "numeric"; +type ArqlTagMatchQueryOp = "eq" | "gt" | "lt" | "gte" | "lte"; + +interface ArqlTagMatchQuery { + type: ArqlTagMatchQueryType; + op: ArqlTagMatchQueryOp; +} +interface ArqlBooleanQuery { + op: "and" | "or"; + expr1: ArqlQuery; + expr2: ArqlQuery; +} + +type ArqlResultSet = string[]; + +export const defaultMaxResults = 5000; + +export const handler: RequestHandler = async (req, res, next: Function) => { + if (req.body && req.body.query) { + req.log.info(`[graphql] resolving arql using graphql`); + return next(); + } + + const pool = getConnectionPool("read"); + + try { + validateQuery(req.body); + } catch (error) { + req.log.info(`[arql] invalid query`, { query: req.body }); + throw error; + } + + const limit = Math.min( + Number.isInteger(parseInt(req.query.limit! as string)) + ? parseInt(req.query.limit! as string) + : defaultMaxResults, + defaultMaxResults + ); + + req.log.info(`[arql] valid query`, { query: req.body, limit }); + + const results = await executeQuery(pool, req.body, { limit }); + + req.log.info(`[arql] results: ${results.length}`); + + res.send(results); + + res.end(); +}; + +const executeQuery = async ( + connection: Knex, + arqlQuery: ArqlQuery, + { + limit = defaultMaxResults, + offset = 0, + log = undefined, + }: { limit?: number; offset?: number; log?: Logger } +): Promise => { + const sqlQuery = arqlToSqlQuery(txQuery(connection, {}), arqlQuery) + .limit(limit) + .offset(offset); + + if (log) { + log.info(`[arql] execute sql`, { + sql: sqlQuery.toSQL(), + }); + } + + return await sqlQuery.pluck("transactions.id"); +}; + +const validateQuery = (arqlQuery: ArqlQuery): boolean => { + try { + if (arqlQuery.op == "equals") { + if (typeof arqlQuery.expr1 != "string") { + throw new createError.BadRequest( + `Invalid value supplied for expr1: '${ + arqlQuery.expr1 + }', expected string got ${typeof arqlQuery.expr1}` + ); + } + + if (typeof arqlQuery.expr2 != "string") { + throw new createError.BadRequest( + `Invalid value supplied for expr2: '${ + arqlQuery.expr2 + }', expected string got ${typeof arqlQuery.expr2}` + ); + } + // + return true; + } + if (["and", "or"].includes(arqlQuery.op)) { + return validateQuery(arqlQuery.expr1) && validateQuery(arqlQuery.expr2); + } + + throw new createError.BadRequest( + `Invalid value supplied for op: '${arqlQuery.op}', expected 'equals', 'and', 'or'.` + ); + } catch (error) { + if (error instanceof createError.BadRequest) { + throw error; + } + throw new createError.BadRequest(`Failed to parse arql query`); + } +}; + +const arqlToSqlQuery = ( + sqlQuery: Knex.QueryInterface, + arqlQuery: ArqlQuery +): Knex.QueryInterface => { + switch (arqlQuery.op) { + case "equals": + return sqlQuery.where((sqlQuery) => { + switch (arqlQuery.expr1) { + case "to": + sqlQuery.whereIn("transactions.target", [arqlQuery.expr2]); + break; + case "from": + sqlQuery.whereIn("transactions.owner_address", [arqlQuery.expr2]); + break; + default: + sqlQuery.whereIn("transactions.id", (query: any) => { + query.select("tx_id").from("tags"); + if (arqlQuery.expr2.includes("%")) { + query + .where("tags.name", "=", arqlQuery.expr1) + .where("tags.value", "LIKE", arqlQuery.expr2); + } else { + query.where({ + "tags.name": arqlQuery.expr1, + "tags.value": arqlQuery.expr2, + }); + } + }); + break; + } + }); + + case "and": + return arqlToSqlQuery(sqlQuery, arqlQuery.expr1).andWhere( + (sqlQuery: any) => { + arqlToSqlQuery(sqlQuery, arqlQuery.expr2); + } + ); + case "or": + return arqlToSqlQuery(sqlQuery, arqlQuery.expr1).orWhere( + (sqlQuery: any) => { + arqlToSqlQuery(sqlQuery, arqlQuery.expr2); + } + ); + default: + throw new createError.BadRequest(); + } +}; diff --git a/src/gateway/routes/data/index.ts b/src/gateway/routes/data/index.ts new file mode 100644 index 0000000..bc69dad --- /dev/null +++ b/src/gateway/routes/data/index.ts @@ -0,0 +1,329 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import fetch from "node-fetch"; +import { fetchTransactionData, getTagValue, Tag } from "../../../lib/arweave"; +import { + resolveManifestPath, + PathManifest, +} from "../../../lib/arweave-path-manifest"; +import { getStream, putStream, put, get } from "../../../lib/buckets"; +import { RequestHandler, Request, Response } from "express"; +import { streamToJson, jsonToBuffer, fromB64Url } from "../../../lib/encoding"; +import { Readable } from "stream"; +import { NotFound } from "http-errors"; +import { query } from "../../../database/transaction-db"; +import { StreamTap } from "../../../lib/stream-tap"; +import pump from "pump"; +import { getData } from "../../../data/transactions"; +import { concat } from "lodash"; +import { arweaveNodesGet } from "../../../lib/hosts"; + +const DEFAULT_TYPE = "text/html"; + +interface Bundle { + items: { id: string; data: string; tags: Tag[] }[]; +} + +export const handler: RequestHandler = async (req, res) => { + const index: number = Math.floor(Math.random() * arweaveNodesGet.length); + const host: string = arweaveNodesGet[index]; + const txid = getTxIdFromPath(req.path); + + if (txid) { + const { stream, contentType, contentLength, tags, cached, status } = + await getData(txid, req); + + req.log.info("tx stream", { + stream: stream && stream?.readable, + contentType, + contentLength, + cached, + tags, + }); + + if (status) { + res.status(status); + } + + if (contentLength == 0) { + setDataHeaders({ contentType, etag: txid, res }); + + res.end(); + } + + const blacklistHosts = arweaveNodesGet; + + let blhost; + if (blacklistHosts && blacklistHosts.length > 0) { + try { + blhost = + blacklistHosts[Math.floor(Math.random() * blacklistHosts.length)]; + } catch (error) { + req.log.info(`[is_tx_blacklisted] ERROR getting the list of nodes`, { + error, + }); + } + } else { + req.log.info("[is_tx_blacklisted] No hosts available, skipping."); + } + + let response; + if (blhost) { + try { + req.log.info(`[is_tx_blacklisted] checking if ${txid} is blacklisted`, { + host: blhost, + txid, + link: `${blhost}/is_tx_blacklisted/${txid}`, + }); + response = await fetch(`${blhost}/is_tx_blacklisted/${txid}`); + } catch (error) { + req.log.info( + `[is_tx_blacklisted] no/failed response host ${blhost} for ${txid} `, + { error } + ); + } + + if (response) { + if (response.status !== 200) { + req.log.info( + `[is_tx_blacklisted] failed on host ${blhost} for ${txid}` + ); + } + + if ((await response.text()) === "true") { + res.status(451).send("Transaction blacklisted."); + return; + } + } + } + + if (stream && contentLength) { + if (contentType == "application/x.arweave-manifest+json") { + req.log.info("[get-data] manifest content-type detected", { txid }); + + const manifest = await streamToJson(stream); + + let cacheRequest: any = null; + + if (!cached) { + cacheRequest = put("tx-data", `tx/${txid}`, jsonToBuffer(manifest), { + contentType, + tags, + }); + } + + return await Promise.all([ + cacheRequest, + handleManifest(req, res, manifest, txid), + ]); + } + + setDataHeaders({ contentType, contentLength, etag: txid, res }); + + if (cached) { + stream.pipe(res); + } else { + await sendAndCache({ + txid, + req, + res, + stream, + contentType, + contentLength, + tags, + }); + } + } + } +}; + +const getTxIdFromPath = (path: string): string | undefined => { + const matches = path.match(/^\/?([a-z0-9-_]{43})/i) || []; + return matches[1]; +}; + +const setDataHeaders = ({ + res, + etag, + contentType, + contentLength, +}: { + res: Response; + etag: string; + contentType?: string; + contentLength?: number; +}) => { + res.header("Etag", etag); + if (contentType) { + res.type(contentType || DEFAULT_TYPE); + } + if (contentLength) { + res.header("Content-Length", contentLength.toString()); + } +}; + +const sendAndCache = async ({ + txid, + contentType, + contentLength, + tags, + stream, + res, + req, +}: { + txid: string; + contentType?: string; + contentLength: number; + tags?: Tag[]; + stream: Readable; + req: Request; + res: Response; +}) => { + await new Promise(async (resolve, reject) => { + req.log.info("[get-data] streaming chunks from s3 cache", { + txid, + }); + + const { upload, stream: cacheStream } = await putStream( + "tx-data", + `tx/${txid}`, + { + contentType, + contentLength, + tags, + } + ); + + const copyToResponse = new StreamTap(res); + + cacheStream.on("end", (error: any) => { + req.log.info("[get-data] cach stream ended", { txid, error }); + + if (copyToResponse.getBytesProcessed() != contentLength) { + req.log.warn( + `[get-data] cached content doesn't match expected data_size`, + { contentLength, processedBytes: copyToResponse.getBytesProcessed } + ); + } + + upload.send((err, data) => { + req.log.info("[get-data] s3 upload done", { data }); + if (err) { + upload.abort(); + reject(err); + } + resolve(data); + }); + }); + + res.flushHeaders(); + + pump(stream, copyToResponse, cacheStream, async (err) => { + if (err) { + req.log.error("pump error", { err }); + upload.abort(); + res.end(); + cacheStream.end(); + stream.destroy(); + console.log("rejecting..."); + reject(err); + } + res.end(); + }); + }); + req.log.info("[get-data] streaming handler complete"); +}; + +const handleManifest = async ( + req: Request, + res: Response, + manifest: PathManifest, + txid: string +) => { + let safePath = req.path.replace(/\/\?.*/i, ""); + + // not risking "/" (index) paths + if (safePath.length > 1) { + safePath = safePath.replace(/\/$/i, ""); + } + + let subpath = unescape(getManifestSubpath(safePath) || ""); + + // not risking "/" (index) paths + if (subpath.length > 1) { + subpath = subpath.replace(/\/$/i, ""); + } + + if (req.path == `/${txid}`) { + return res.redirect(301, `${req.path}/`); + } + + const resolvedTx = resolveManifestPath(manifest, subpath); + + req.log.info("[get-data] resolved manifest path content", { + subpath, + resolvedTx, + }); + + if (resolvedTx) { + const { stream, contentType, contentLength, cached } = await getData( + resolvedTx, + req + ); + + setDataHeaders({ contentType, contentLength, etag: txid, res }); + + if (stream && contentLength && contentLength > 0) { + if (cached) { + return stream.pipe(res); + } else { + return sendAndCache({ + txid: resolvedTx, + req, + res, + stream, + contentType, + contentLength, + }); + } + } else { + req.log.info( + "[get-data] NotFound contentType, contentLength or stream went missing", + { + resolvedTx, + stream: typeof stream, + contentType, + contentLength, + } + ); + } + } + + throw new NotFound(); +}; + +//@deprecated +const getManifestSubpath = (requestPath: string): string | undefined => { + return getTransactionSubpath(requestPath); +}; + +const getTransactionSubpath = (requestPath: string): string | undefined => { + const subpath = requestPath.match(/^\/?[a-zA-Z0-9-_]{43}\/(.*)$/i); + return (subpath && subpath[1]) || undefined; +}; diff --git a/src/gateway/routes/graphql-v2/index.ts b/src/gateway/routes/graphql-v2/index.ts new file mode 100644 index 0000000..1c24e12 --- /dev/null +++ b/src/gateway/routes/graphql-v2/index.ts @@ -0,0 +1,53 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { + ApolloServer, + ApolloServerExpressConfig, + gql, +} from "apollo-server-express"; +import { + ApolloServerPluginLandingPageDisabled, + ApolloServerPluginLandingPageGraphQLPlayground, +} from "apollo-server-core"; +import { getConnectionPool } from "../../../database/postgres"; +import { resolvers } from "./resolvers"; +import { readFileSync } from "fs"; + +const typeDefs = gql(readFileSync(__dirname + "/schema/types.graphql", "utf8")); + +const apolloServer = (opts: ApolloServerExpressConfig = {}) => { + return new ApolloServer({ + typeDefs, + resolvers, + debug: false, + plugins: [ + ApolloServerPluginLandingPageDisabled(), + ApolloServerPluginLandingPageGraphQLPlayground(), + ], + context: ({ req }) => { + return { + req, + connection: getConnectionPool("read"), + }; + }, + ...opts, + }); +}; + +export { apolloServer }; diff --git a/src/gateway/routes/graphql-v2/resolvers.ts b/src/gateway/routes/graphql-v2/resolvers.ts new file mode 100644 index 0000000..e1cf2c6 --- /dev/null +++ b/src/gateway/routes/graphql-v2/resolvers.ts @@ -0,0 +1,302 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { TransactionHeader, utf8DecodeTag } from "../../../lib/arweave"; +import { IResolvers } from "@graphql-tools/utils"; +import { query } from "../../../database/transaction-db"; +import moment from "moment"; +import { ISO8601DateTimeString, winstonToAr } from "../../../lib/encoding"; +import { BadRequest } from "http-errors"; +import graphqlFields from "graphql-fields"; +import { QueryTransactionsArgs } from "./schema/types"; +import { DatabaseBlock, queryBlocks } from "../../../database/block-db"; + +type Resolvers = IResolvers; + +const DEFAULT_PAGE_SIZE = 10; +const MAX_PAGE_SIZE = 100; + +const txFieldMap = { + id: "transactions.id", + anchor: "transactions.last_tx", + recipient: "transactions.target", + tags: "transactions.tags", + fee: "transactions.reward", + quantity: "transactions.quantity", + data_size: "transactions.data_size", + data_type: "transactions.content_type", + parent: "transactions.parent", + owner: "transactions.owner", + owner_address: "transactions.owner_address", + signature: "transactions.signature", + block_id: "blocks.id", + block_timestamp: "blocks.mined_at", + block_height: "blocks.height", + block_previous: "blocks.previous_block", + block_extended: "blocks.extended", +}; + +const blockFieldMap = { + id: "blocks.id", + timestamp: "blocks.mined_at", + height: "blocks.height", + previous: "blocks.previous_block", + extended: "blocks.extended", +}; + +export const resolvers: Resolvers = { + Query: { + transaction: async (parent, queryParams, { req, connection }) => { + req.log.info("[grqphql/v2] transaction/request", queryParams); + const sqlQuery = query(connection, { + id: queryParams.id, + blocks: true, + select: txFieldMap, + limit: 2, + }).first(); + + return (await sqlQuery) as TransactionHeader; + }, + transactions: async ( + parent, + queryParams: QueryTransactionsArgs, + { req, connection }, + info + ) => { + req.log.info("[grqphql/v2] transactions/request", { + queryParams, + fields: graphqlFields(info as any), + }); + + const { timestamp, offset } = parseCursor( + queryParams.after || newCursor() + ); + + const pageSize = Math.min( + queryParams.first || DEFAULT_PAGE_SIZE, + MAX_PAGE_SIZE + ); + + const results = await query(connection, { + // Add one to the limit, we'll remove this result but it tells + // us if there's another page of data to fetch. + limit: pageSize + 1, + offset: offset, + ids: queryParams.ids || undefined, + to: queryParams.recipients || undefined, + from: queryParams.owners || undefined, + tags: queryParams.tags || undefined, + parents: queryParams.bundledIn || undefined, + blocks: true, + before: timestamp, + select: txFieldMap, + minHeight: queryParams.block?.min || undefined, + maxHeight: queryParams.block?.max || undefined, + sortOrder: queryParams.sort || undefined, + }); + + req.log.info("[grqphql/v2] transactions/response", { + queryParams, + results: results.length, + pageSize, + offset, + }); + + const hasNextPage = results.length > pageSize; + + return { + pageInfo: { + hasNextPage, + }, + edges: Array.isArray(results) + ? results.slice(0, pageSize).map((node: any, index) => { + return { + cursor: encodeCursor({ timestamp, offset: offset + index + 1 }), + node, + }; + }) + : [], + }; + }, + block: async (parent, queryParams, { req, connection }) => { + req.log.info("[grqphql/v2] transaction/request", queryParams); + const sqlQuery = queryBlocks(connection, { + select: blockFieldMap, + id: queryParams.id, + }).first(); + + return (await sqlQuery) as any; + }, + blocks: async (parent, queryParams, { req, connection }) => { + req.log.info("[grqphql/v2] blocks/request", queryParams); + + const { timestamp, offset } = parseCursor( + queryParams.after || newCursor() + ); + + const pageSize = Math.min( + queryParams.first || DEFAULT_PAGE_SIZE, + MAX_PAGE_SIZE + ); + + const results: any = await queryBlocks(connection, { + ids: queryParams.ids, + select: blockFieldMap, + minHeight: queryParams.height?.min, + maxHeight: queryParams.height?.max, + sortOrder: queryParams.sort, + // +1 so we know if there is another page of results, + // this last result can be array.sliced off the response. + limit: pageSize + 1, + offset: offset, + before: timestamp, + }); + + req.log.info("[grqphql/v2] blocks/response", { + queryParams, + results: results.length, + pageSize, + offset, + }); + + const hasNextPage = results.length > pageSize; + + return { + pageInfo: { + hasNextPage, + }, + edges: async () => { + return results + .slice(0, pageSize) + .map((result: any, index: number) => { + return { + cursor: encodeCursor({ timestamp, offset: offset + index + 1 }), + node: result, + }; + }); + }, + }; + }, + }, + Transaction: { + block: (parent) => { + return parent?.block_id + ? { + id: parent?.block_id, + timestamp: parent?.block_timestamp, + height: parent?.block_height, + previous: parent?.block_previous, + extended: parent?.block_extended, + } + : null; + }, + tags: (parent) => { + return Array.isArray(parent.tags) ? parent.tags.map(utf8DecodeTag) : []; + }, + recipient: (parent) => { + if (parent && parent.recipient && typeof parent.recipient === "string") { + return parent.recipient.trim(); + } else { + return ""; + } + }, + data: (parent) => { + return { + size: parent.data_size || 0, + type: parent.data_type, + }; + }, + quantity: (parent) => { + return { + ar: winstonToAr(parent.quantity || 0), + winston: parent.quantity || 0, + }; + }, + fee: (parent) => { + return { + ar: winstonToAr(parent.fee || 0), + winston: parent.fee || 0, + }; + }, + owner: (parent) => { + return { + address: parent && parent.owner_address ? parent.owner_address : "", + key: parent && parent.owner ? parent.owner : "", + }; + }, + parent: (parent) => { + if (parent.parent) { + return { + id: parent.parent, + }; + } + }, + bundledIn: (parent) => { + if (parent.parent) { + return { + id: parent.parent, + }; + } + }, + }, + Block: { + // Not fully supported for old blocks yet + // reward: (parent) => { + // return { + // address: parent.extended.reward_addr, + // pool: parent.extended.reward_pool, + // }; + // }, + // size: (parent) => { + // return parent.extended?.block_size; + // }, + timestamp: (parent) => { + return moment(parent?.timestamp).unix(); + }, + }, +}; + +const newCursor = (): string => { + return encodeCursor({ timestamp: moment().toISOString(), offset: 0 }); +}; + +const encodeCursor = ({ + timestamp, + offset, +}: { + timestamp: ISO8601DateTimeString; + offset: number; +}): string => { + const string = JSON.stringify([timestamp, offset]); + return Buffer.from(string).toString("base64"); +}; + +const parseCursor = ( + cursor: string +): { timestamp: ISO8601DateTimeString; offset: number } => { + try { + const [timestamp, offset] = JSON.parse( + Buffer.from(cursor, "base64").toString() + ) as [ISO8601DateTimeString, number]; + + return { timestamp, offset }; + } catch (error) { + console.error(error); + throw new BadRequest("invalid cursor"); + } +}; diff --git a/src/gateway/routes/graphql-v2/schema/types.graphql b/src/gateway/routes/graphql-v2/schema/types.graphql new file mode 100644 index 0000000..2fff8cc --- /dev/null +++ b/src/gateway/routes/graphql-v2/schema/types.graphql @@ -0,0 +1,373 @@ +""" +Arweave Gateway +Copyright (C) 2022 Permanent Data Solutions, Inc + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" +type Query { + """ + Get a transaction by its id + """ + transaction(id: ID!): Transaction + """ + Get a paginated set of matching transactions using filters. + """ + transactions( + """ + Find transactions from a list of ids. + """ + ids: [ID!] + """ + Find transactions from a list of owner wallet addresses, or wallet owner public keys. + """ + owners: [String!] + """ + Find transactions from a list of recipient wallet addresses. + """ + recipients: [String!] + """ + Find transactions using tags. + """ + tags: [TagFilter!] + """ + Find data items from the given data bundles. + See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md + """ + bundledIn: [ID!] + """ + Find transactions within a given block height range. + """ + block: BlockFilter + """ + Result page size (max: 100) + """ + first: Int = 10 + """ + A pagination cursor value, for fetching subsequent pages from a result set. + """ + after: String + """ + Optionally specify the result sort order. + """ + sort: SortOrder = HEIGHT_DESC + """ + @deprecated Don't use, kept for backwards compatability only! + """ + parent: [ID!] @deprecated(reason: "Use `bundledIn`") + ): TransactionConnection! + + block(id: String): Block + + blocks( + """ + Find blocks from a list of ids. + """ + ids: [ID!] + + """ + Find blocks within a given block height range. + """ + height: BlockFilter + + """ + Result page size (max: 100) + """ + first: Int = 10 + """ + A pagination cursor value, for fetching subsequent pages from a result set. + """ + after: String + """ + Optionally specify the result sort order. + """ + sort: SortOrder = HEIGHT_DESC + ): BlockConnection! +} +""" +Optionally reverse the result sort order from `HEIGHT_DESC` (default) to `HEIGHT_ASC`. +""" +enum SortOrder { + """ + Results are sorted by the transaction block height in ascending order, with the oldest transactions appearing first, and the most recent and pending/unconfirmed appearing last. + """ + HEIGHT_ASC + """ + Results are sorted by the transaction block height in descending order, with the most recent and unconfirmed/pending transactions appearing first. + """ + HEIGHT_DESC +} + +""" +Find transactions with the folowing tag name and value +""" +input TagFilter { + """ + The tag name + """ + name: String! + """ + An array of values to match against. If multiple values are passed then transactions with _any_ matching tag value from the set will be returned. + + e.g. + + \`{name: "app-name", values: ["app-1"]}\` + + Returns all transactions where the \`app-name\` tag has a value of \`app-1\`. + + \`{name: "app-name", values: ["app-1", "app-2", "app-3"]}\` + + Returns all transactions where the \`app-name\` tag has a value of either \`app-1\` _or_ \`app-2\` _or_ \`app-3\`. + """ + values: [String!]! + + """ + The operator to apply to to the tag filter. Defaults to EQ (equal). + """ + op: TagOperator = EQ +} + +""" +Find blocks within a given range +""" +input BlockFilter { + """ + Minimum block height to filter from + """ + min: Int + """ + Maximum block height to filter to + """ + max: Int +} + +""" +Paginated result set using the GraphQL cursor spec, +see: https://relay.dev/graphql/connections.htm. +""" +type BlockConnection { + pageInfo: PageInfo! + edges: [BlockEdge!]! +} + +""" +Paginated result set using the GraphQL cursor spec. +""" +type BlockEdge { + """ + The cursor value for fetching the next page. + + Pass this to the \`after\` parameter in \`blocks(after: $cursor)\`, the next page will start from the next item after this. + """ + cursor: String! + """ + A block object. + """ + node: Block! +} + +""" +Paginated result set using the GraphQL cursor spec, +see: https://relay.dev/graphql/connections.htm. +""" +type TransactionConnection { + pageInfo: PageInfo! + edges: [TransactionEdge!]! +} + +""" +Paginated result set using the GraphQL cursor spec. +""" +type TransactionEdge { + """ + The cursor value for fetching the next page. + + Pass this to the \`after\` parameter in \`transactions(after: $cursor)\`, the next page will start from the next item after this. + """ + cursor: String! + """ + A transaction object. + """ + node: Transaction! +} + +""" +Paginated page info using the GraphQL cursor spec. +""" +type PageInfo { + hasNextPage: Boolean! +} + +type Transaction { + id: ID! + + anchor: String! + signature: String! + recipient: String! + + owner: Owner! + fee: Amount! + quantity: Amount! + data: MetaData! + tags: [Tag!]! + """ + Transactions with a null block are recent and unconfirmed, if they aren't mined into a block within 60 minutes they will be removed from results. + """ + block: Block + """ + @deprecated Don't use, kept for backwards compatability only! + """ + parent: Parent @deprecated(reason: "Use `bundledIn`") + """ + For bundled data items this references the containing bundle ID. + See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md + """ + bundledIn: Bundle +} + +""" +The parent transaction for bundled transactions, +see: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-102.md. +""" +type Parent { + id: ID! +} + +""" +The data bundle containing the current data item. +See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md. +""" +type Bundle { + """ + ID of the containing data bundle. + """ + id: ID! +} + +type Block { + """ + The block ID. + """ + id: ID! + """ + The block timestamp (UTC). + """ + timestamp: Int! + """ + The block height. + """ + height: Int! + """ + The previous block ID. + """ + previous: ID! + # """ + # The block size (sum of all transaction data contained in this block). + # """ + # size: String! + # """ + # The reward address and current reward pool size. + # """ + # reward: BlockReward! +} + +# type BlockReward { +# """ +# Miner address. +# """ +# address: String! +# """ +# Size of the reward pool. +# """ +# pool: String! +# } + +""" +Basic metadata about the transaction data payload. +""" +type MetaData { + """ + Size of the associated data in bytes. + """ + size: String! + """ + Type is derrived from the \`content-type\` tag on a transaction. + """ + type: String +} +""" +Representation of a value transfer between wallets, in both winson and ar. +""" +type Amount { + """ + Amount as a winston string e.g. \`"1000000000000"\`. + """ + winston: String! + """ + Amount as an AR string e.g. \`"0.000000000001"\`. + """ + ar: String! +} + +""" +Representation of a transaction owner. +""" +type Owner { + """ + The owner's wallet address. + """ + address: String! + """ + The owner's public key as a base64url encoded string. + """ + key: String! +} + +type Tag { + """ + UTF-8 tag name + """ + name: String! + """ + UTF-8 tag value + """ + value: String! +} + +""" +The operator to apply to a tag value. +""" +enum TagOperator { + """ + Equal + """ + EQ + """ + Not equal + """ + NEQ +} + +# """ +# Transaction statuses +# """ +# enum Status { +# """ +# Transaction is included in a block +# """ +# CONFIRMED +# """ +# Transaction is not yet included in a block +# """ +# PENDING +# } diff --git a/src/gateway/routes/graphql-v2/schema/types.ts b/src/gateway/routes/graphql-v2/schema/types.ts new file mode 100644 index 0000000..7ce1695 --- /dev/null +++ b/src/gateway/routes/graphql-v2/schema/types.ts @@ -0,0 +1,625 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { GraphQLResolveInfo } from "graphql"; +export type Maybe = T | null; +export type Exact = { + [K in keyof T]: T[K]; +}; +export type RequireFields = { + [X in Exclude]?: T[X]; +} & { [P in K]-?: NonNullable }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; +}; + +/** Representation of a value transfer between wallets, in both winson and ar. */ +export type Amount = { + __typename?: "Amount"; + /** Amount as a winston string e.g. \`"1000000000000"\`. */ + winston: Scalars["String"]; + /** Amount as an AR string e.g. \`"0.000000000001"\`. */ + ar: Scalars["String"]; +}; + +export type Block = { + __typename?: "Block"; + /** The block ID. */ + id: Scalars["ID"]; + /** The block timestamp (UTC). */ + timestamp: Scalars["Int"]; + /** The block height. */ + height: Scalars["Int"]; + /** The previous block ID. */ + previous: Scalars["ID"]; +}; + +/** + * Paginated result set using the GraphQL cursor spec, + * see: https://relay.dev/graphql/connections.htm. + */ +export type BlockConnection = { + __typename?: "BlockConnection"; + pageInfo: PageInfo; + edges: Array; +}; + +/** Paginated result set using the GraphQL cursor spec. */ +export type BlockEdge = { + __typename?: "BlockEdge"; + /** + * The cursor value for fetching the next page. + * + * Pass this to the \`after\` parameter in \`blocks(after: $cursor)\`, the next + * page will start from the next item after this. + */ + cursor: Scalars["String"]; + /** A block object. */ + node: Block; +}; + +/** Find blocks within a given range */ +export type BlockHeightFilter = { + /** Minimum block height to filter from */ + min?: Maybe; + /** Maximum block height to filter to */ + max?: Maybe; +}; + +/** + * The data bundle containing the current data item. + * See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-102.md. + */ +export type Bundle = { + __typename?: "Bundle"; + /** ID of the containing data bundle. */ + id: Scalars["ID"]; +}; + +/** Basic metadata about the transaction data payload. */ +export type MetaData = { + __typename?: "MetaData"; + /** Size of the associated data in bytes. */ + size: Scalars["String"]; + /** Type is derrived from the \`content-type\` tag on a transaction. */ + type?: Maybe; +}; + +/** Representation of a transaction owner. */ +export type Owner = { + __typename?: "Owner"; + /** The owner's wallet address. */ + address: Scalars["String"]; + /** The owner's public key as a base64url encoded string. */ + key: Scalars["String"]; +}; + +/** Paginated page info using the GraphQL cursor spec. */ +export type PageInfo = { + __typename?: "PageInfo"; + hasNextPage: Scalars["Boolean"]; +}; + +/** + * The parent transaction for bundled transactions, + * see: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-102.md. + */ +export type Parent = { + __typename?: "Parent"; + id: Scalars["ID"]; +}; + +export type Query = { + __typename?: "Query"; + /** Get a transaction by its id */ + transaction?: Maybe; + /** Get a paginated set of matching transactions using filters. */ + transactions: TransactionConnection; + block?: Maybe; + blocks: BlockConnection; +}; + +export type QueryTransactionArgs = { + id: Scalars["ID"]; +}; + +export type QueryTransactionsArgs = { + ids?: Maybe>; + owners?: Maybe>; + recipients?: Maybe>; + tags?: Maybe>; + bundledIn?: Maybe>; + block?: Maybe; + first?: Maybe; + after?: Maybe; + sort?: Maybe; +}; + +export type QueryBlockArgs = { + id?: Maybe; +}; + +export type QueryBlocksArgs = { + ids?: Maybe>; + height?: Maybe; + first?: Maybe; + after?: Maybe; + sort?: Maybe; +}; + +/** Optionally reverse the result sort order from `HEIGHT_DESC` (default) to `HEIGHT_ASC`. */ +export enum SortOrder { + /** + * Results are sorted by the transaction block height in ascending order, with + * the oldest transactions appearing first, and the most recent and + * pending/unconfirmed appearing last. + */ + HeightAsc = "HEIGHT_ASC", + /** + * Results are sorted by the transaction block height in descending order, with + * the most recent and unconfirmed/pending transactions appearing first. + */ + HeightDesc = "HEIGHT_DESC", +} + +export type Tag = { + __typename?: "Tag"; + /** UTF-8 tag name */ + name: Scalars["String"]; + /** UTF-8 tag value */ + value: Scalars["String"]; +}; + +/** Find transactions with the folowing tag name and value */ +export type TagFilter = { + /** The tag name */ + name: Scalars["String"]; + /** + * An array of values to match against. If multiple values are passed then + * transactions with _any_ matching tag value from the set will be returned. + * + * e.g. + * + * \`{name: "app-name", values: ["app-1"]}\` + * + * Returns all transactions where the \`app-name\` tag has a value of \`app-1\`. + * + * \`{name: "app-name", values: ["app-1", "app-2", "app-3"]}\` + * + * Returns all transactions where the \`app-name\` tag has a value of either \`app-1\` _or_ \`app-2\` _or_ \`app-3\`. + */ + values: Array; + /** The operator to apply to to the tag filter. Defaults to EQ (equal). */ + op?: Maybe; +}; + +/** The operator to apply to a tag value. */ +export enum TagOperator { + /** Equal */ + Eq = "EQ", + /** Not equal */ + Neq = "NEQ", +} + +export type Transaction = { + __typename?: "Transaction"; + id: Scalars["ID"]; + anchor: Scalars["String"]; + signature: Scalars["String"]; + recipient: Scalars["String"]; + owner: Owner; + fee: Amount; + quantity: Amount; + data: MetaData; + tags: Array; + /** + * Transactions with a null block are recent and unconfirmed, if they aren't + * mined into a block within 60 minutes they will be removed from results. + */ + block?: Maybe; + /** + * Transactions with parent are Bundled Data Items as defined in the ANS-102 data spec. + * https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-102.md + * @deprecated Use `bundledIn` + */ + parent?: Maybe; + /** + * For bundled data items this references the containing bundle ID. + * See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-102.md + */ + bundledIn?: Maybe; +}; + +/** + * Paginated result set using the GraphQL cursor spec, + * see: https://relay.dev/graphql/connections.htm. + */ +export type TransactionConnection = { + __typename?: "TransactionConnection"; + pageInfo: PageInfo; + edges: Array; +}; + +/** Paginated result set using the GraphQL cursor spec. */ +export type TransactionEdge = { + __typename?: "TransactionEdge"; + /** + * The cursor value for fetching the next page. + * + * Pass this to the \`after\` parameter in \`transactions(after: $cursor)\`, the + * next page will start from the next item after this. + */ + cursor: Scalars["String"]; + /** A transaction object. */ + node: Transaction; +}; + +export type ResolverTypeWrapper = Promise | T; + +export type LegacyStitchingResolver = { + fragment: string; + resolve: ResolverFn; +}; + +export type NewStitchingResolver = { + selectionSet: string; + resolve: ResolverFn; +}; +export type StitchingResolver = + | LegacyStitchingResolver + | NewStitchingResolver; +export type Resolver = + | ResolverFn + | StitchingResolver; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterator | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject< + TResult, + TKey extends string, + TParent, + TContext, + TArgs +> { + subscribe: SubscriptionSubscribeFn< + { [key in TKey]: TResult }, + TParent, + TContext, + TArgs + >; + resolve?: SubscriptionResolveFn< + TResult, + { [key in TKey]: TResult }, + TContext, + TArgs + >; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject< + TResult, + TKey extends string, + TParent, + TContext, + TArgs +> = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver< + TResult, + TKey extends string, + TParent = {}, + TContext = {}, + TArgs = {} +> = + | (( + ...args: any[] + ) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = ( + obj: T, + info: GraphQLResolveInfo +) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn< + TResult = {}, + TParent = {}, + TContext = {}, + TArgs = {} +> = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + Query: ResolverTypeWrapper<{}>; + ID: ResolverTypeWrapper; + Transaction: ResolverTypeWrapper; + String: ResolverTypeWrapper; + Owner: ResolverTypeWrapper; + Amount: ResolverTypeWrapper; + MetaData: ResolverTypeWrapper; + Tag: ResolverTypeWrapper; + Block: ResolverTypeWrapper; + Int: ResolverTypeWrapper; + Parent: ResolverTypeWrapper; + Bundle: ResolverTypeWrapper; + TagFilter: TagFilter; + TagOperator: TagOperator; + BlockHeightFilter: BlockHeightFilter; + SortOrder: SortOrder; + TransactionConnection: ResolverTypeWrapper; + PageInfo: ResolverTypeWrapper; + Boolean: ResolverTypeWrapper; + TransactionEdge: ResolverTypeWrapper; + BlockConnection: ResolverTypeWrapper; + BlockEdge: ResolverTypeWrapper; +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + Query: {}; + ID: Scalars["ID"]; + Transaction: Transaction; + String: Scalars["String"]; + Owner: Owner; + Amount: Amount; + MetaData: MetaData; + Tag: Tag; + Block: Block; + Int: Scalars["Int"]; + Parent: Parent; + Bundle: Bundle; + TagFilter: TagFilter; + BlockHeightFilter: BlockHeightFilter; + TransactionConnection: TransactionConnection; + PageInfo: PageInfo; + Boolean: Scalars["Boolean"]; + TransactionEdge: TransactionEdge; + BlockConnection: BlockConnection; + BlockEdge: BlockEdge; +}; + +export type AmountResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Amount"] = ResolversParentTypes["Amount"] +> = { + winston?: Resolver; + ar?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BlockResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Block"] = ResolversParentTypes["Block"] +> = { + id?: Resolver; + timestamp?: Resolver; + height?: Resolver; + previous?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BlockConnectionResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["BlockConnection"] = ResolversParentTypes["BlockConnection"] +> = { + pageInfo?: Resolver; + edges?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BlockEdgeResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["BlockEdge"] = ResolversParentTypes["BlockEdge"] +> = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BundleResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Bundle"] = ResolversParentTypes["Bundle"] +> = { + id?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MetaDataResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["MetaData"] = ResolversParentTypes["MetaData"] +> = { + size?: Resolver; + type?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OwnerResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Owner"] = ResolversParentTypes["Owner"] +> = { + address?: Resolver; + key?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PageInfoResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["PageInfo"] = ResolversParentTypes["PageInfo"] +> = { + hasNextPage?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ParentResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Parent"] = ResolversParentTypes["Parent"] +> = { + id?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Query"] = ResolversParentTypes["Query"] +> = { + transaction?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + transactions?: Resolver< + ResolversTypes["TransactionConnection"], + ParentType, + ContextType, + RequireFields + >; + block?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + blocks?: Resolver< + ResolversTypes["BlockConnection"], + ParentType, + ContextType, + RequireFields + >; +}; + +export type TagResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Tag"] = ResolversParentTypes["Tag"] +> = { + name?: Resolver; + value?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransactionResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["Transaction"] = ResolversParentTypes["Transaction"] +> = { + id?: Resolver; + anchor?: Resolver; + signature?: Resolver; + recipient?: Resolver; + owner?: Resolver; + fee?: Resolver; + quantity?: Resolver; + data?: Resolver; + tags?: Resolver, ParentType, ContextType>; + block?: Resolver, ParentType, ContextType>; + parent?: Resolver, ParentType, ContextType>; + bundledIn?: Resolver< + Maybe, + ParentType, + ContextType + >; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransactionConnectionResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["TransactionConnection"] = ResolversParentTypes["TransactionConnection"] +> = { + pageInfo?: Resolver; + edges?: Resolver< + Array, + ParentType, + ContextType + >; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransactionEdgeResolvers< + ContextType = any, + ParentType extends ResolversParentTypes["TransactionEdge"] = ResolversParentTypes["TransactionEdge"] +> = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type Resolvers = { + Amount?: AmountResolvers; + Block?: BlockResolvers; + BlockConnection?: BlockConnectionResolvers; + BlockEdge?: BlockEdgeResolvers; + Bundle?: BundleResolvers; + MetaData?: MetaDataResolvers; + Owner?: OwnerResolvers; + PageInfo?: PageInfoResolvers; + Parent?: ParentResolvers; + Query?: QueryResolvers; + Tag?: TagResolvers; + Transaction?: TransactionResolvers; + TransactionConnection?: TransactionConnectionResolvers; + TransactionEdge?: TransactionEdgeResolvers; +}; + +/** + * @deprecated + * Use "Resolvers" root object instead. If you wish to get "IResolvers", add "typesPrefix: I" to your config. + */ +export type IResolvers = Resolvers; diff --git a/src/gateway/routes/graphql/index.ts b/src/gateway/routes/graphql/index.ts new file mode 100644 index 0000000..24b92a0 --- /dev/null +++ b/src/gateway/routes/graphql/index.ts @@ -0,0 +1,41 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { ApolloServer, ApolloServerExpressConfig } from "apollo-server-express"; +import { ApolloServerPluginLandingPageDisabled } from "apollo-server-core"; +import { getConnectionPool } from "../../../database/postgres"; +import { resolvers } from "./resolvers"; +import { typeDefs } from "./schema"; + +const apolloServer = (opts: ApolloServerExpressConfig = {}) => { + return new ApolloServer({ + typeDefs, + resolvers, + debug: false, + plugins: [ApolloServerPluginLandingPageDisabled()], + context: () => { + console.log("context..."); + return { + connection: getConnectionPool("read"), + }; + }, + ...opts, + }); +}; + +export { apolloServer }; diff --git a/src/gateway/routes/graphql/resolvers.ts b/src/gateway/routes/graphql/resolvers.ts new file mode 100644 index 0000000..04fae57 --- /dev/null +++ b/src/gateway/routes/graphql/resolvers.ts @@ -0,0 +1,119 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { TransactionHeader, utf8DecodeTag, Tag } from "../../../lib/arweave"; +import { query } from "../../../database/transaction-db"; + +type Resolvers = any; + +type ResolverFn = (parent: any, args: any, ctx: any) => Promise; +interface ResolverMap { + [field: string]: ResolverFn; +} + +export const defaultMaxResults = 5000; + +export const resolvers: Resolvers = { + Query: { + transaction: async ( + parent: any, + { id }: Record, + context: any + ) => { + return query(context.connection, { + id, + }); + }, + transactions: async ( + parent: any, + { to, from, tags }: Record, + context: any + ) => { + const sqlQuery = query(context.connection, { + limit: defaultMaxResults, + to, + from, + tags: (tags || []).map((tag: Tag) => { + return { + name: tag.name, + values: [tag.value], + }; + }), + }); + + // console.log(sqlQuery.toSQL()); + + const results = (await sqlQuery) as TransactionHeader[]; + + return results.map(({ id, tags = [] }: Partial) => { + return { + id, + tags: tags.map(utf8DecodeTag), + }; + }); + }, + }, + Transaction: { + linkedFromTransactions: async ( + parent: any, + { byForeignTag, to, from, tags }: Record, + context: any + ) => { + const sqlQuery = query(context.connection, { + limit: defaultMaxResults, + to, + from, + tags: ((tags as any[]) || []).concat({ + name: byForeignTag, + values: [parent.id], + }), + }); + + // console.log(sqlQuery.toSQL()); + + const results = (await sqlQuery) as TransactionHeader[]; + + return results.map(({ id, tags = [] }: Partial) => { + return { + id, + tags: tags.map(utf8DecodeTag), + }; + }); + }, + countLinkedFromTransactions: async ( + parent: any, + { byForeignTag, to, from, tags }: Record, + context: any + ) => { + const sqlQuery = query(context.connection, { + limit: defaultMaxResults, + to, + from, + tags: ((tags as any[]) || []).concat({ + name: byForeignTag, + values: [parent.id], + }), + select: [], + }).count(); + + // console.log(sqlQuery.toSQL()); + + return (await sqlQuery.first()).count; + }, + }, +}; diff --git a/src/gateway/routes/graphql/schema.ts b/src/gateway/routes/graphql/schema.ts new file mode 100644 index 0000000..16b3365 --- /dev/null +++ b/src/gateway/routes/graphql/schema.ts @@ -0,0 +1,60 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { gql } from "apollo-server-express"; + +export const typeDefs = gql` + type Query { + transaction(id: ID!): Transaction + transactions( + from: [String!] + to: [String!] + tags: [TagInput!] + ): [Transaction!]! + countTransactions(from: [String!], to: [String!], tags: [TagInput!]): Int! + } + + type Transaction { + id: ID! + tags: [Tag!]! + tagValue(tagName: String!): String + linkedToTransaction(byOwnTag: String!): Transaction + linkedFromTransactions( + byForeignTag: String! + from: [String!] + to: [String!] + tags: [TagInput!] + ): [Transaction!]! + countLinkedFromTransactions( + byForeignTag: String! + from: [String!] + to: [String!] + tags: [TagInput!] + ): Int! + } + + type Tag { + name: String! + value: String! + } + + input TagInput { + name: String! + value: String! + } +`; diff --git a/src/gateway/routes/health/index.ts b/src/gateway/routes/health/index.ts new file mode 100644 index 0000000..1f3547a --- /dev/null +++ b/src/gateway/routes/health/index.ts @@ -0,0 +1,73 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import fetch from "node-fetch"; +import { RequestHandler } from "express"; +import { getLatestBlock } from "../../../database/block-db"; +import { getConnectionPool } from "../../../database/postgres"; +import log from "../../../lib/log"; + +const origins = JSON.parse(process.env.ARWEAVE_NODES_GET || "") as string[]; + +if (!Array.isArray(origins)) { + throw new Error( + `error.config: Invalid env var, process.env.ARWEAVE_NODES_GET: ${process.env.ARWEAVE_NODES_GET}` + ); +} + +export const handler: RequestHandler = async (req, res) => { + const healthStatus = { + region: process.env.AWS_REGION, + origins: await originHealth(), + database: await databaseHealth(), + }; + res.send(healthStatus).end(); +}; + +const originHealth = async () => { + try { + return await Promise.all( + origins.map(async (originUrl) => { + try { + const response = await fetch(`${originUrl}/info`); + return { + endpoint: originUrl, + status: response.status, + info: await response.json(), + }; + } catch (error) { + console.error(error); + return error; + } + }) + ); + } catch (error) { + log.error(`[health-check] database error`, { error }); + return false; + } +}; + +const databaseHealth = async () => { + try { + const pool = getConnectionPool("read"); + return { block: await getLatestBlock(pool) }; + } catch (error) { + log.error(`[health-check] database error`, { error }); + return false; + } +}; diff --git a/src/gateway/routes/new-chunk/index.ts b/src/gateway/routes/new-chunk/index.ts new file mode 100644 index 0000000..2bb4174 --- /dev/null +++ b/src/gateway/routes/new-chunk/index.ts @@ -0,0 +1,124 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { fromB64Url } from "../../../lib/encoding"; +import { Chunk } from "../../../lib/arweave"; +import { enqueue, getQueueUrl } from "../../../lib/queues"; +import { pick } from "lodash"; +import { ImportChunk, ExportChunk } from "../../../interfaces/messages"; +import { RequestHandler } from "express"; +import { put } from "../../../lib/buckets"; +import NodeCryptoDriver from "arweave/node/lib/crypto/node-driver"; +import Arweave from "arweave/node"; +Arweave.crypto = new NodeCryptoDriver(); + +import { validatePath } from "arweave/node/lib/merkle"; +import { BadRequest } from "http-errors"; +import Joi, { Schema, ValidationError } from "@hapi/joi"; +import { parseInput } from "../../middleware/validate-body"; + +// the API defintion uses numeric string instead of numbers, +// Joi.number will accept either number or string and coerce it. +export const chunkSchema: Schema = Joi.object({ + chunk: Joi.string().required(), + data_root: Joi.string().required(), + data_size: Joi.string() + .required() + .regex(/[0-9]*/), // After validation this must be transformed to a numeric type + offset: Joi.string() + .required() + .regex(/[0-9]*/), // After validation this must be transformed to a numeric type + data_path: Joi.string().required(), +}); + +export const handler: RequestHandler = async (req, res) => { + const chunk = parseInput(chunkSchema, req.body, { + transform: (validatedPayload) => { + return { + ...validatedPayload, + data_size: parseInt(validatedPayload.data_size), + offset: parseInt(validatedPayload.offset), + }; + }, + }); + + req.log.info(`[new-chunk] received new chunk`, { + ...chunk, + chunk: chunk.chunk && chunk.chunk.substr(0, 100) + "...", + }); + + const chunkData = parseB64UrlOrThrow(chunk.chunk, "chunk"); + + const dataPath = parseB64UrlOrThrow(chunk.data_path, "data_path"); + + const root = parseB64UrlOrThrow(chunk.data_root, "data_root"); + + const isValid = await validateChunk( + root, + chunk.offset, + chunk.data_size, + dataPath + ); + + req.log.warn("[new-chunk] validate chunk", { + isValid, + }); + + if (!isValid) { + throw new BadRequest("Chunk validation failed"); + } + + req.log.warn("[new-chunk] cached successfully"); + + const queueItem = { + size: chunkData.byteLength, + header: pick(chunk, ["data_root", "data_size", "data_path", "offset"]), + }; + + await Promise.all([ + put("tx-data", `chunks/${chunk.data_root}/${chunk.offset}`, chunkData, { + contentType: "application/octet-stream", + }), + enqueue(getQueueUrl("import-chunks"), queueItem), + enqueue(getQueueUrl("export-chunks"), queueItem), + ]); + + res.sendStatus(200).end(); +}; + +const parseB64UrlOrThrow = (b64urlString: string, fieldName: string) => { + try { + return fromB64Url(b64urlString); + } catch (error) { + throw new BadRequest(`missing field: ${fieldName}`); + } +}; + +const validateChunk = async ( + root: Buffer, + offset: number, + size: number, + proof: Buffer +) => { + try { + return (await validatePath(root, offset, 0, size, proof)) !== false; + } catch (error) { + console.warn(error); + return false; + } +}; diff --git a/src/gateway/routes/new-tx/index.ts b/src/gateway/routes/new-tx/index.ts new file mode 100644 index 0000000..8ce4b9e --- /dev/null +++ b/src/gateway/routes/new-tx/index.ts @@ -0,0 +1,204 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { put } from "../../../lib/buckets"; +import { fromB64Url } from "../../../lib/encoding"; +import { Transaction, getTagValue } from "../../../lib/arweave"; +import { enqueue, getQueueUrl } from "../../../lib/queues"; +import { pick } from "lodash"; +import { + ImportTx, + DispatchTx, + DataFormatVersion, +} from "../../../interfaces/messages"; +import { RequestHandler } from "express"; +import { BadRequest } from "http-errors"; +import { attemptFallbackNodes } from "../../../lib/broadcast"; + +import Joi, { Schema } from "@hapi/joi"; +import { parseInput } from "../../middleware/validate-body"; + +export const txSchema: Schema = Joi.object({ + id: Joi.string() + .required() + .regex(/^[a-zA-Z0-9_-]{43}$/), + owner: Joi.string().required(), + signature: Joi.string().required(), + reward: Joi.string() + .regex(/[0-9]*/) + .required(), + last_tx: Joi.string().optional().allow("").default(""), + target: Joi.string().optional().allow("").default(""), + quantity: Joi.string() + .regex(/[0-9]*/) + .optional() + .allow("") + .default(""), + data: Joi.string().optional().allow("").default(""), + tags: Joi.array() + .optional() + .items( + Joi.object({ + name: Joi.string().required().allow("").default(""), + value: Joi.string().required().allow("").default(""), + }) + ) + .default([]), + format: Joi.number().optional().default(1), + data_root: Joi.string().optional().allow("").default(""), + data_size: Joi.string() + .regex(/[0-9]*/) + .optional() + .default(""), + data_tree: Joi.array().items(Joi.string()).optional().default([]), +}); + +const dispatchQueueUrl = getQueueUrl("dispatch-txs"); +const importQueueUrl = getQueueUrl("import-txs"); + +export const handler: RequestHandler<{}, {}, Transaction> = async ( + req, + res +) => { + const tx = parseInput(txSchema, req.body); + const { data, ...senzaData } = tx; + + // some clients are sending fractional values in reward, the + // nodes ALWAYS reject these, so let's make less suffering for the user + if ( + typeof senzaData === "object" && + typeof senzaData["reward"] === "string" && + senzaData["reward"].length > 0 && + senzaData["reward"].includes(".") + ) { + res + .status(400) + .send( + `Bad reward field, expected string-integer but got ${senzaData["reward"]}` + ); + return; + } + + req.log.info(`[new-tx] Submit right away`, senzaData); + + try { + await attemptFallbackNodes(tx); + } catch (error) { + req.log.info( + "[new-tx] something went wrong sending new tx to fallback nodes", + error + ); + } + + req.log.info(`[new-tx]`, { + ...tx, + data: tx.data && tx.data.substr(0, 100) + "...", + }); + + const dataSize = getDataSize(tx); + + req.log.info(`[new-tx] data_size: ${dataSize}`); + + if (dataSize > 0) { + const dataBuffer = fromB64Url(tx.data); + + if (dataBuffer.byteLength > 0) { + await put("tx-data", `tx/${tx.id}`, dataBuffer, { + contentType: getTagValue(tx.tags, "content-type"), + }); + } + } + + req.log.info(`[new-tx] queuing for dispatch to network`, { + id: tx.id, + queue: dispatchQueueUrl, + }); + + await enqueue(dispatchQueueUrl, { + data_format: getPayloadFormat(tx), + data_size: dataSize, + tx: pick(tx, [ + "format", + "id", + "signature", + "owner", + "target", + "reward", + "last_tx", + "tags", + "quantity", + "data_size", + "data_tree", + "data_root", + ]), + }); + + req.log.info(`[new-tx] queuing for import`, { + id: tx.id, + queue: importQueueUrl, + }); + + await enqueue(importQueueUrl, { + tx: pick(tx, [ + "format", + "id", + "signature", + "owner", + "target", + "reward", + "last_tx", + "tags", + "quantity", + "data_size", + "data_tree", + "data_root", + ]), + }); + + res.sendStatus(200).end(); +}; + +const getDataSize = (tx: Transaction): number => { + if (tx.data_size) { + return parseInt(tx.data_size); + } + if (tx.data == "") { + return 0; + } + + try { + return fromB64Url(tx.data).byteLength; + } catch (error) { + console.error(error); + throw new BadRequest(); + } +}; + +const getPayloadFormat = (tx: Transaction): DataFormatVersion => { + if (tx.format == 1) { + return 1; + } + + if (tx.format == 2) { + return tx.data && typeof tx.data == "string" && tx.data.length > 0 + ? 2.0 + : 2.1; + } + + return 1; +}; diff --git a/src/gateway/routes/proxy/index.ts b/src/gateway/routes/proxy/index.ts new file mode 100644 index 0000000..3d0d8b5 --- /dev/null +++ b/src/gateway/routes/proxy/index.ts @@ -0,0 +1,85 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { fetchRequest } from "../../../lib/arweave"; +import { RequestHandler } from "express"; +import { BadGateway, NotFound, HttpError } from "http-errors"; +import { streamToString } from "../../../lib/encoding"; +import { Logger } from "winston"; + +interface CachedResponse { + status: number; + contentType?: string; + contentLength?: number; + body?: string; +} + +export const handler: RequestHandler = async (req, res) => { + const { log, method, path } = req; + + req.log.info(`[proxy] request`, { method, path }); + + const { status, contentType, contentLength, body } = await proxyAndCache( + method, + // Remove slash prefix for node.net/info rather than node.net//info + path.replace(/^\//, ""), + log + ); + + if (contentType) { + res.type(contentType); + } + + res.status(status); + + return res.send(body).end(); +}; + +const proxyAndCache = async ( + method: string, + path: string, + log: Logger +): Promise => { + let nodeStatuses: number[] = []; + + const response = await fetchRequest(path); + + if (response && response.body) { + const { statusCode: status, headers, body } = response; + const streamedBody = body; + const contentType = + (headers as any)["content-type"] || + (headers as any)["Content-Type"] || + undefined; + const contentLength = Buffer.byteLength(streamedBody, "utf8"); + + return { + body: streamedBody, + status, + contentType, + contentLength, + }; + } else { + throw new NotFound(); + } +}; + +const exposeError = (error: HttpError): HttpError => { + error.expose = true; + return error; +}; diff --git a/src/gateway/routes/webhooks/index.ts b/src/gateway/routes/webhooks/index.ts new file mode 100644 index 0000000..2eb3c03 --- /dev/null +++ b/src/gateway/routes/webhooks/index.ts @@ -0,0 +1,125 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { TransactionHeader, Block } from "../../../lib/arweave"; +import { enqueue, getQueueUrl } from "../../../lib/queues"; +import { pick } from "lodash"; +import { ImportTx, ImportBlock } from "../../../interfaces/messages"; +import { RequestHandler } from "express"; +import { NotFound, BadRequest } from "http-errors"; + +export const handler: RequestHandler = async (req, res, next) => { + if ( + process.env.WEBHOOK_TOKEN && + process.env.WEBHOOK_TOKEN != req.query.token + ) { + req.log.info(`[webhook] invalid webhook token provided ${req.query.token}`); + throw new NotFound(); + } + + const { + transaction, + block, + }: { transaction: TransactionHeader; block: Block } = req.body; + + if (!transaction && !block) { + throw new BadRequest(); + } + + if (transaction) { + req.log.info(`[webhook] importing transaction header`, { + id: transaction.id, + }); + await importTx(transaction); + return res.sendStatus(200).end(); + } + + if (block) { + req.log.info(`[webhook] importing block`, { id: block.indep_hash }); + await importBlock({ + block, + source: req.headers["x-forwarded-for"] + ? req.headers["x-forwarded-for"][0] + : "0.0.0.0", + }); + return res.sendStatus(200).end(); + } + req.log.info(`[webhook] no valid payload provided`); + throw new BadRequest(); +}; + +const importTx = async (tx: TransactionHeader): Promise => { + let dataSize = parseInt(tx.data_size || "0"); + return enqueue(getQueueUrl("import-txs"), { + tx: pick( + { + ...(tx as any), + data_size: dataSize, + data_tree: tx.data_tree || [], + data_root: tx.data_root || "", + format: tx.format || 1, + }, + [ + "format", + "id", + "signature", + "owner", + "target", + "reward", + "last_tx", + "tags", + "quantity", + "data_size", + "data_tree", + "data_root", + ] + ), + }); +}; + +const importBlock = async ({ source, block }: ImportBlock): Promise => { + await enqueue( + getQueueUrl("import-blocks"), + { + source: source, + block: pick(block, [ + "nonce", + "previous_block", + "timestamp", + "last_retarget", + "diff", + "height", + "hash", + "indep_hash", + "txs", + "tx_root", + "wallet_list", + "reward_addr", + "reward_pool", + "weave_size", + "block_size", + "cumulative_diff", + "hash_list_merkle", + ]), + }, + { + messagegroup: `source:${source}`, + deduplicationId: `source:${source}/${Date.now()}`, + } + ); +}; diff --git a/src/interfaces/messages.ts b/src/interfaces/messages.ts new file mode 100644 index 0000000..11502ab --- /dev/null +++ b/src/interfaces/messages.ts @@ -0,0 +1,51 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { TransactionHeader, Block, ChunkHeader } from "../lib/arweave"; + +export type DataFormatVersion = 1.0 | 2.0 | 2.1; +export interface DispatchTx { + tx: TransactionHeader; + data_size: number; + data_format: DataFormatVersion; +} + +export interface ImportChunk { + header: ChunkHeader; + size: number; +} + +export interface ExportChunk { + header: ChunkHeader; + size: number; +} + +export interface ImportTx { + id?: string; + tx?: TransactionHeader; +} + +export interface ImportBlock { + source: string; + block: Block; +} + +export interface ImportBundle { + id?: string; + header?: TransactionHeader; +} diff --git a/src/jobs/dispatch-txs.ts b/src/jobs/dispatch-txs.ts new file mode 100644 index 0000000..9db4ee8 --- /dev/null +++ b/src/jobs/dispatch-txs.ts @@ -0,0 +1,62 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { getQueueUrl, createQueueHandler } from "../lib/queues"; +import { publish } from "../lib/pub-sub"; +import { get } from "../lib/buckets"; +import { broadcastTx } from "../lib/broadcast"; +import { ImportTx, DispatchTx } from "../interfaces/messages"; +import { toB64url } from "../lib/encoding"; +import { Transaction } from "../lib/arweave"; + +export const handler = createQueueHandler( + getQueueUrl("dispatch-txs"), + async (message) => { + console.log(message); + const { tx, data_size: dataSize, data_format } = message; + + console.log(`data_size: ${dataSize}, tx: ${tx.id}`); + + console.log(`broadcasting: ${tx.id}`); + + const fullTx: Transaction = { + ...tx, + data: + (!data_format || data_format < 2.1) && dataSize > 0 + ? await getEncodedData(tx.id) + : "", + }; + + await broadcastTx(fullTx); + + console.log(`publishing: ${tx.id}`); + + await publish(message); + } +); + +const getEncodedData = async (txid: string): Promise => { + try { + const data = await get("tx-data", `tx/${txid}`); + return toB64url(data.Body as Buffer); + } catch (error) { + return ""; + } +}; + +export default handler; diff --git a/src/jobs/export-chunks.ts b/src/jobs/export-chunks.ts new file mode 100644 index 0000000..f06dbac --- /dev/null +++ b/src/jobs/export-chunks.ts @@ -0,0 +1,75 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { getQueueUrl, createQueueHandler } from "../lib/queues"; +import { get } from "../lib/buckets"; +import { broadcastChunk } from "../lib/broadcast"; +import { ExportChunk } from "../interfaces/messages"; +import { toB64url } from "../lib/encoding"; +import { completedExport } from "../database/chunk-db"; +import { + getConnectionPool, + releaseConnectionPool, + initConnectionPool, +} from "../database/postgres"; +import { wait } from "../lib/helpers"; +import log from "../lib/log"; + +export const handler = createQueueHandler( + getQueueUrl("export-chunks"), + async (message) => { + const { header } = message; + + log.info(`[export-chunks] exporting chunk`, { + data_root: header.data_root, + offset: header.offset, + }); + + const fullChunk = { + ...header, + chunk: toB64url( + (await get("tx-data", `chunks/${header.data_root}/${header.offset}`)) + .Body as Buffer + ), + }; + + await broadcastChunk(fullChunk); + + const pool = getConnectionPool("write"); + + await completedExport(pool, { + data_size: header.data_size, + data_root: header.data_root, + offset: header.offset, + }); + }, + { + before: async () => { + log.info(`[export-chunks] handler:before database connection init`); + initConnectionPool("write"); + await wait(100); + }, + after: async () => { + log.info(`[export-chunks] handler:after database connection cleanup`); + await releaseConnectionPool("write"); + await wait(100); + }, + } +); + +export default handler; diff --git a/src/jobs/import-bundles.ts b/src/jobs/import-bundles.ts new file mode 100644 index 0000000..3e1a10d --- /dev/null +++ b/src/jobs/import-bundles.ts @@ -0,0 +1,477 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { Knex } from "knex"; +import { + TransactionHeader, + fetchTransactionData, + DataBundleWrapper, + getTagValue, + DataBundleItem, + fetchRequest, + fetchTransactionHeader, +} from "../lib/arweave"; +import { getData, streamCachedChunks } from "../data/transactions"; +import log from "../lib/log"; +import { + saveBundleStatus, + getBundleImport, +} from "../database/bundle-import-db"; +import { createQueueHandler, getQueueUrl, enqueue } from "../lib/queues"; +import { ImportBundle } from "../interfaces/messages"; +import { + getConnectionPool, + initConnectionPool, + releaseConnectionPool, +} from "../database/postgres"; +import { streamToJson, fromB64Url, streamToBuffer } from "../lib/encoding"; +import { sequentialBatch } from "../lib/helpers"; +import { getTx, saveBundleDataItems } from "../database/transaction-db"; +import { buckets, put } from "../lib/buckets"; +import verifyAndIndexStream from "arbundles/stream"; +import { Bundle, DataItem } from "arbundles"; +import { base64 } from "rfc4648"; +import base64url from "base64url"; +import { head } from "lodash"; +import * as fs from "fs"; +import * as path from "path"; +import * as os from "os"; +import { s3 } from "../lib/buckets"; +import { PassThrough } from "stream"; + +type PartialBy = Omit & Partial>; + +const MAX_RETRY = 9; +const RETRY_BACKOFF_SECONDS = 60; +const MAX_BACKOFF_SECONDS = 150; + +export const isTxAns104 = (tx: TransactionHeader): boolean => { + return ( + // getTagValue(tx.tags, "content-type") == "application/json" && + getTagValue(tx.tags, "bundle-format") == "binary" && + getTagValue(tx.tags, "bundle-version") == "2.0.0" + ); +}; + +async function calculateBackoffWaitTime( + retryNum: number, + numBytes: number, + reward: number +): Promise { + log.info("[import-bundles] calculating backoff value"); + let basePrice: number = -1; + try { + const response = await fetchRequest(`price/${numBytes}`); + basePrice = + response && response.body + ? parseInt(await streamToJson(response.body)) + : 0; + } catch (error) { + throw new Error( + "[import-bundles] getting basePrice from nodes failed, " + error + ); + } + if (basePrice === -1) { + // most likely redundant, but better safe than sorry + throw new Error( + `[import-bundles] something went wrong parsing basePrice from /price/${numBytes}` + ); + } + const rewardMultiplier = reward / basePrice; + + const waitMultiplier = + retryNum * RETRY_BACKOFF_SECONDS * (1 / rewardMultiplier); + + const returnedBackoffTime = Math.max(MAX_BACKOFF_SECONDS, waitMultiplier); + log.info( + `[import-bundles] setting retry backoff time to ${returnedBackoffTime}`, + { rewardMultiplier, waitMultiplier, basePrice, retryNum, reward } + ); + return returnedBackoffTime; +} + +export const handler = createQueueHandler( + getQueueUrl("import-bundles"), + async ({ header, id }) => { + log.info("[import-bundles] importing tx bundle", { + bundle: { + id, + tx: header?.id, + }, + }); + + const pool = getConnectionPool("write"); + + const tx = header ? header : await fetchTransactionHeader(id || ""); + + const txDataSize = parseInt(tx["data_size"]); + + const { attempts = 0 } = await getBundleImport(pool, tx.id); + + log.info("[import-bundles] importing tx bundle status", { + bundle: { + id: tx.id, + attempts, + }, + }); + + const incrementedAttempts = attempts + 1; + + let stream; + + try { + if (tx && typeof tx.id === "string" && tx.id.length > 0) { + const maybeStream = await getData(tx.id || "", { log }); + stream = maybeStream ? maybeStream.stream : undefined; + } + } catch (error) { + log.error("[import-bundles] error getting stream via getData", error); + } + + const Bucket = buckets["tx-data"]; + + if (stream) { + const is104 = isTxAns104(tx); + const headTxObj = await s3 + .headObject({ + Key: `tx/${tx.id}`, + Bucket, + }) + .promise() + .then((r) => r.ContentLength === txDataSize) + .catch((_) => false); + + if (!headTxObj) { + let isSuccessful = false; + try { + await s3 + .upload({ + Key: `tx/${tx.id}`, + Bucket, + Body: stream, + }) + .promise(); + isSuccessful = true; + } catch (error) { + log.error( + "[import-bundles] error streaming from nodes direct to s3 bucket", + error + ); + } + if (!isSuccessful) { + log.error( + "Data not available, neither in cache nor nodes, requeuing" + ); + await retry(pool, tx, { + attempts: incrementedAttempts, + error: "Data not yet available", + }); + + throw new Error("Data not yet available, neither in cache nor nodes"); + } + + stream = s3 + .getObject({ Key: `tx/${tx.id}`, Bucket }) + .createReadStream(); + } + + log.info(`[import-bundles] is ANS-104: ${is104}`); + log.info("[import-bundles] streaming to buffer/json..."); + + const bundleImport = await getBundleImport(pool, tx.id); + + let data: { items: DataBundleItem[] } | undefined; + + if ( + bundleImport.bundle_meta && + typeof bundleImport.bundle_meta === "string" && + bundleImport.bundle_meta.length > 0 + ) { + data = JSON.parse(bundleImport.bundle_meta); + } else { + try { + if (is104) { + data = { items: (await verifyAndIndexStream(stream)) as any }; + } + } catch (error) { + log.error( + `[import-bundles] validation call error in ${tx.id}\n\t`, + error + ); + await invalid(pool, tx.id, { + attempts: incrementedAttempts, + error: (error as any).message, + }); + return; + } + + try { + if (!is104) { + data = (await streamToJson(stream)) as any; + } + + data = typeof data !== "undefined" ? data : undefined; + + log.info("[import-bundles] finished streaming to buffer/json"); + + if (!is104) validateAns102(data as any); + + if (data) { + await updateBundle(pool, tx.id, data.items); + } else { + throw new Error("Data is null"); + } + } catch (error: any) { + log.error("error", { id: tx.id, error }); + await invalid(pool, tx.id, { + attempts: incrementedAttempts, + error: error.message, + }); + } + } + + log.info( + `[import-bundles] bundle: ${tx.id} is valid, moving on to indexing...` + ); + + // @ts-ignore + if (!data) throw new Error("Data is null"); + + // If data is ANS-104 + if (is104) { + data.items.forEach( + (i) => + (i.tags = i.tags.map((tag) => ({ + name: base64url(tag.name), + value: base64url(tag.value), + }))) + ); + } + + try { + await Promise.all([ + sequentialBatch( + data.items, + 200, + async (items: PartialBy[]) => { + await Promise.all( + items.map(async (item) => { + const contentType = getTagValue(item.tags, "content-type"); + console.log( + `bytes=${item.dataOffset}-${ + item.dataOffset + item.dataSize - 1 + }` + ); + const bundleData = !is104 + ? item && fromB64Url(item.data || "") + : // TODO: Get data by offset (item.offset) + s3 + .getObject({ + Key: `tx/${tx.id}`, + Bucket, + Range: `bytes=${item.dataOffset}-${ + item.dataOffset + item.dataSize - 1 + }`, + }) + .createReadStream(); + + log.info(`[import-bundles] putting data item: ${item.id}`); + + await put("tx-data", `tx/${item.id}`, bundleData, { + contentType: contentType || "application/octet-stream", + }); + }) + ); + } + ), + sequentialBatch(data.items, 100, async (items: DataBundleItem[]) => { + await saveBundleDataItems(pool, tx.id, items); + }), + ]); + await complete(pool, tx.id, { attempts: incrementedAttempts }); + } catch (error: any) { + log.error("error", error); + await retry(pool, tx, { + attempts: incrementedAttempts, + error: error.message + error.stack || "", + }); + } + } else { + log.error("Data not available, requeuing"); + await retry(pool, tx, { + attempts: incrementedAttempts, + error: "Data not yet available", + }); + } + }, + { + before: async () => { + log.info(`[import-bundles] handler:before database connection init`); + initConnectionPool("read"); + initConnectionPool("write"); + }, + after: async () => { + log.info(`[import-bundles] handler:after database connection cleanup`); + await releaseConnectionPool("read"); + await releaseConnectionPool("write"); + }, + } +); + +const retry = async ( + connection: Knex, + header: TransactionHeader, + { attempts, error }: { attempts: number; error?: any } +) => { + if (attempts && attempts >= MAX_RETRY + 1) { + return saveBundleStatus(connection, [ + { + id: header.id, + status: "error", + attempts, + error, + }, + ]); + } + + let numBytes: number = -1; + let reward: number = -1; + + try { + numBytes = + typeof header.data_size === "number" + ? header.data_size + : parseInt(header.data_size); + } catch (error) { + log.error( + `[import-bundles] unable to get data_size out of ${header.data_size}`, + error + ); + } + + try { + reward = + typeof header.reward === "number" + ? header.reward + : parseInt(header.reward); + } catch (error) { + log.error( + `[import-bundles] unable to get reward out of ${header.reward}`, + error + ); + } + + if (numBytes === -1 || reward === -1) { + throw new Error( + `[import-bundles] something went wrong parsing the tx-headers (there should be an error message above)` + ); + } + + return calculateBackoffWaitTime(attempts, numBytes, reward).then((delay) => { + return Promise.all([ + saveBundleStatus(connection, [ + { + id: header.id, + status: "pending", + attempts, + error: error || null, + }, + ]), + enqueue( + getQueueUrl("import-bundles"), + { header }, + { delaySeconds: delay } + ), + ]); + }); +}; + +const complete = async ( + connection: Knex, + id: string, + { attempts }: { attempts: number } +) => { + // TODO: Add column + await saveBundleStatus(connection, [ + { + id, + status: "complete", + attempts, + error: null, + }, + ]); +}; + +const invalid = async ( + connection: Knex, + id: string, + { attempts, error }: { attempts: number; error?: string } +) => { + await saveBundleStatus(connection, [ + { + id, + status: "invalid", + attempts, + error: error || null, + }, + ]); +}; + +const updateBundle = async ( + connection: Knex, + id: string, + items: any[] +) => { + await saveBundleStatus(connection, [ + { + id, + status: "invalid", + bundle_meta: JSON.stringify(items), + }, + ]); +}; + +const validateAns102 = (bundle: { items: DataBundleItem[] }) => { + bundle.items.forEach((item) => { + const fields = Object.keys(item); + const requiredFields = ["id", "owner", "signature", "data"]; + requiredFields.forEach((requiredField) => { + if (!fields.includes(requiredField)) { + throw new Error( + `Invalid bundle detected, missing required field: ${requiredField}` + ); + } + }); + }); +}; + +const validateAns104 = async (bundle: Bundle) => { + if (!(await bundle.verify())) { + throw new Error("Invalid ANS-104 bundle detected"); + } +}; + +async function collectAsyncGenerator(g: AsyncGenerator): Promise { + const arr: any[] = []; + for await (const item of g) { + arr.push(item); + } + return arr; +} + +export default handler; diff --git a/src/jobs/import-chunks.ts b/src/jobs/import-chunks.ts new file mode 100644 index 0000000..26c7eab --- /dev/null +++ b/src/jobs/import-chunks.ts @@ -0,0 +1,57 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { getQueueUrl, createQueueHandler } from "../lib/queues"; +import { ImportChunk } from "../interfaces/messages"; +import { saveChunk } from "../database/chunk-db"; +import { + getConnectionPool, + initConnectionPool, + releaseConnectionPool, +} from "../database/postgres"; +import log from "../lib/log"; +import { wait } from "../lib/helpers"; + +export const handler = createQueueHandler( + getQueueUrl("import-chunks"), + async ({ header, size }) => { + const pool = getConnectionPool("write"); + log.info(`[import-chunks] importing chunk`, { + root: header.data_root, + size: size, + }); + await saveChunk(pool, { + ...header, + chunk_size: size, + }); + }, + { + before: async () => { + log.info(`[import-chunks] handler:before database connection init`); + initConnectionPool("write"); + await wait(500); + }, + after: async () => { + log.info(`[import-chunks] handler:after database connection cleanup`); + await releaseConnectionPool("write"); + await wait(500); + }, + } +); + +export default handler; diff --git a/src/jobs/import-txs.ts b/src/jobs/import-txs.ts new file mode 100644 index 0000000..9391783 --- /dev/null +++ b/src/jobs/import-txs.ts @@ -0,0 +1,102 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { Knex } from "knex"; +import { + getConnectionPool, + initConnectionPool, + releaseConnectionPool, +} from "../database/postgres"; +import { getTx, saveTx } from "../database/transaction-db"; +import { ImportTx, ImportBundle } from "../interfaces/messages"; +import { + fetchTransactionHeader, + getTagValue, + TransactionHeader, +} from "../lib/arweave"; +import { isTxAns102, isTxAns104, wait } from "../lib/helpers"; +import log from "../lib/log"; +import { createQueueHandler, getQueueUrl, enqueue } from "../lib/queues"; +import { MIN_BINARY_SIZE } from "arbundles"; + +export const handler = createQueueHandler( + getQueueUrl("import-txs"), + async ({ id, tx }) => { + const pool = getConnectionPool("write"); + + const header = tx || (await fetchTransactionHeader(id || "")); + + if (tx) { + log.info(`[import-txs] importing tx header`, { id }); + await save(pool, tx); + } + + if (id) { + await save(pool, await fetchTransactionHeader(id)); + } + + await handleBundle(pool, header); + }, + { + before: async () => { + log.info(`[import-txs] handler:before database connection init`); + initConnectionPool("write"); + }, + after: async () => { + log.info(`[import-txs] handler:after database connection cleanup`); + await releaseConnectionPool("write"); + await wait(500); + }, + } +); + +const save = async (connection: Knex, tx: TransactionHeader) => { + log.info(`[import-txs] saving tx header`, { id: tx.id }); + + await saveTx(connection, tx); + + log.info(`[import-txs] successfully saved tx header`, { id: tx.id }); +}; + +const handleBundle = async (connection: Knex, tx: TransactionHeader) => { + const dataSize = parseInt(tx?.data_size || "0"); + if ( + (dataSize > 0 && isTxAns102(tx)) || + (dataSize > MIN_BINARY_SIZE && isTxAns104(tx)) + ) { + log.info(`[import-txs] detected data bundle tx`, { id: tx.id }); + + // A single bundle import will trigger the importing of all the contained txs, + // This process will queue all the txs and a consumer will keep polling until the + // bundle data is available and mined. + // + // Ideally we don't want to overdo this as it's quite spammy. + // + // For now, we'll only import bundled txs if it's the first time we've seen it, + // or if it's been seen before but failed to import for whatever reason. + // + // When we get tx sync download webhoooks this can be improved. + log.info(`[import-txs] queuing bundle for import`, { id: tx.id }); + + await enqueue(getQueueUrl("import-bundles"), { id: tx.id }); + + log.info(`[import-txs] successfully queued bundle for import`, { + id: tx.id, + }); + } +}; diff --git a/src/lib/arweave-path-manifest.ts b/src/lib/arweave-path-manifest.ts new file mode 100644 index 0000000..7554677 --- /dev/null +++ b/src/lib/arweave-path-manifest.ts @@ -0,0 +1,49 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +export const resolveManifestPath = ( + { index, paths }: PathManifest, + subpath: string | undefined +): string | undefined => { + if (subpath && paths[subpath]) { + return paths[subpath] ? paths[subpath].id : undefined; + } + + if ( + !subpath && + index && + index.path && + paths[index.path] && + paths[index.path].id + ) { + return paths[index.path].id; + } +}; + +export interface PathManifest { + manifest: "arweave/paths"; + version: string; + paths: { + [key: string]: { + id: string; + }; + }; + index?: { + path: string; + }; +} diff --git a/src/lib/arweave.ts b/src/lib/arweave.ts new file mode 100644 index 0000000..2c37776 --- /dev/null +++ b/src/lib/arweave.ts @@ -0,0 +1,382 @@ +import AbortController from "abort-controller"; +import { NotFound } from "http-errors"; +import { shuffle } from "lodash"; +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import got, { GotReturn, Response } from "got/dist/source/index.js"; +import { Readable } from "stream"; +import log from "../lib/log"; +import { + Base64UrlEncodedString, + bufferToStream, + fromB64Url, + isValidUTF8, + streamToBuffer, + streamToJson, + WinstonString, +} from "./encoding"; +import { arweaveNodesGet as origins } from "./hosts"; +import { DataItem } from "arbundles"; + +interface ArFetchOptions { + stream?: boolean; + json?: boolean; + noStatusFilter?: boolean; +} + +export type TransactionHeader = Omit; + +export type TransactionData = { + data: Buffer; + contentType: string | undefined; +}; + +export interface Transaction { + format: number; + id: string; + signature: string; + owner: string; + target: string; + data: Base64UrlEncodedString; + reward: WinstonString; + last_tx: string; + tags: Tag[]; + quantity: WinstonString; + data_size: string; + data_root: string; + data_tree: string[]; +} + +export interface DataBundleWrapper { + items: (DataBundleItem | DataItem)[]; +} + +export interface DataBundleItem { + owner: string; + target: string; + nonce: string; + tags: Tag[]; + data: Base64UrlEncodedString; + signature: string; + id: string; + dataOffset: number; + dataSize: number; +} + +export interface Chunk { + data_root: string; + data_size: number; + data_path: string; + chunk: string; + offset: number; +} + +export type ChunkHeader = Omit; + +export interface Tag { + name: Base64UrlEncodedString; + value: Base64UrlEncodedString; +} + +export interface Block { + nonce: string; + previous_block: string; + timestamp: number; + last_retarget: number; + diff: string; + height: number; + hash: string; + indep_hash: string; + txs: string[]; + tx_root: string; + wallet_list: string; + reward_addr: string; + reward_pool: number; + weave_size: number; + block_size: number; + cumulative_diff: string; + hash_list_merkle: string; +} + +export interface DataResponse { + stream?: Readable; + contentLength: number; + contentType?: string; + tags?: Tag[]; +} + +export const fetchBlock = async (id: string): Promise => { + const endpoints = origins.map((host) => `${host}/block/hash/${id}`); + + const response = await getFirstResponse(endpoints); + + if (response && response.body) { + const block = await streamToJson(response.body as any); + + //For now we don't care about the poa and it's takes up too much + // space when logged, so just remove it for now. + //@ts-ignore + delete block.poa; + + return block as Block; + } + + throw new Error(`Failed to fetch block: ${id}`); +}; + +export const fetchBlockByHeight = async (height: string): Promise => { + log.info(`[arweave] fetching block by height`, { height }); + + const endpoints = origins.map((host) => `${host}/block/height/${height}`); + + const response = await getFirstResponse(endpoints); + + if (response && response.body) { + const block = await streamToJson(response.body as any); + + //For now we don't care about the poa and it's takes up too much + // space when logged, so just remove it for now. + //@ts-ignore + delete block.poa; + + return block as Block; + } + + throw new Error(`Failed to fetch block: ${height}`); +}; + +export const fetchTransactionHeader = async ( + txid: string +): Promise => { + log.info(`[arweave] fetching transaction header`, { txid }); + const endpoints = origins.map((host) => `${host}/tx/${txid}`); + + const response = await getFirstResponse(endpoints); + + if (response && response.body) { + return (await streamToJson(response.body as any)) as TransactionHeader; + } + + throw new NotFound(); +}; + +const getContentLength = (headers: any): number => { + return parseInt(headers.get("content-length")); +}; + +export const fetchTransactionData = async ( + txid: string +): Promise => { + log.info(`[arweave] fetching data and tags`, { txid }); + + try { + const [tagsResponse, dataResponse] = await Promise.all([ + fetchRequest(`tx/${txid}/tags`), + fetchRequest(`tx/${txid}/data`), + ]); + + const tags = + tagsResponse && tagsResponse.body && tagsResponse.statusCode == 200 + ? ((await streamToJson(tagsResponse.body)) as Tag[]) + : []; + + const contentType = getTagValue(tags, "content-type"); + + if (dataResponse && dataResponse.body) { + if (dataResponse.statusCode == 200) { + const content = fromB64Url(dataResponse.body.toString()); + + return { + tags, + contentType, + contentLength: content.byteLength, + stream: bufferToStream(content), + }; + } + + if (dataResponse && dataResponse.statusCode == 400) { + const { error } = await streamToJson<{ error: string }>( + dataResponse.body + ); + + if (error == "tx_data_too_big") { + const offsetResponse = await fetchRequest(`tx/${txid}/offset`); + + if (offsetResponse && offsetResponse.body) { + const { size, offset } = await streamToJson(offsetResponse.body); + return { + tags, + contentType, + contentLength: parseInt(size), + stream: await streamChunks({ + size: parseInt(size), + offset: parseInt(offset), + }), + }; + } + } + } + } + + log.info(`[arweave] failed to find tx`, { txid }); + } catch (error: any) { + log.error(`[arweave] error finding tx`, { txid, error: error.message }); + } + + return { contentLength: 0 }; +}; + +export const streamChunks = function ({ + offset, + size, +}: { + offset: number; + size: number; +}): Readable { + let bytesReceived = 0; + let initialOffset = offset - size + 1; + + const stream = new Readable({ + autoDestroy: true, + read: async function () { + let next = initialOffset + bytesReceived; + + try { + if (bytesReceived >= size) { + this.push(null); + return; + } + + const response = await fetchRequest(`chunk/${next}`); + + if (response && response.body) { + const data = fromB64Url((await streamToJson(response.body)).chunk); + + if (stream.destroyed) { + return; + } + + this.push(data); + + bytesReceived += data.byteLength; + } + } catch (error: any) { + console.error("stream error", error); + stream.emit("error", error); + } + }, + }); + + return stream; +}; + +export const fetchRequest = async (endpoint: string): Promise => { + const endpoints = origins.map((host) => `${host}/${endpoint}`); + + return await getFirstResponse(endpoints); +}; + +export const streamRequest = async ( + endpoint: string, + filter?: FilterFunction +): Promise => { + const endpoints = origins.map( + // Replace any starting slashes + (host) => `${host}/${endpoint.replace(/^\//, "")}` + ); + + for (const url of shuffle(endpoints)) { + let response; + try { + response = await got.stream(url); + } catch (error: any) { + log.warn(`[arweave] request error`, { + message: error.message, + url, + }); + } + return response; + } +}; + +export const getTagValue = (tags: Tag[], name: string): string | undefined => { + const contentTypeTag = tags.find((tag) => { + try { + return ( + fromB64Url(tag.name).toString().toLowerCase() == name.toLowerCase() + ); + } catch (error: any) { + return undefined; + } + }); + try { + return contentTypeTag + ? fromB64Url(contentTypeTag.value).toString() + : undefined; + } catch (error) { + return undefined; + } +}; + +export const utf8DecodeTag = (tag: Tag): { name: string; value: string } => { + let name = ""; + let value = ""; + try { + const nameBuffer = fromB64Url(tag.name) || ""; + if (isValidUTF8(nameBuffer)) { + name = nameBuffer.toString("utf8"); + } + const valueBuffer = fromB64Url(tag.value) || ""; + if (isValidUTF8(valueBuffer)) { + value = valueBuffer.toString("utf8"); + } + } catch (error) {} + return { + name, + value, + }; +}; + +type FilterFunction = (status: number) => boolean; + +const defaultFilter: FilterFunction = (status) => + [200, 201, 202, 208].includes(status); + +const getFirstResponse = async ( + urls: string[] +): Promise => { + for (const url of shuffle(urls)) { + let response; + try { + response = await got.get(url, { + timeout: { + request: 5000, + }, + }); + } catch (error: any) { + log.warn(`[arweave] request error`, { + message: error.message, + url, + }); + } + if (response && defaultFilter(response.statusCode)) { + return response; + } + } +}; diff --git a/src/lib/base64url-stream.ts b/src/lib/base64url-stream.ts new file mode 100644 index 0000000..771fe20 --- /dev/null +++ b/src/lib/base64url-stream.ts @@ -0,0 +1,61 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { Transform } from "stream"; + +export class Base64DUrlecode extends Transform { + protected extra: string; + protected bytesProcessed: number; + + constructor() { + super({ decodeStrings: false, objectMode: false }); + this.extra = ""; + this.bytesProcessed = 0; + } + + _transform(chunk: Buffer, encoding: any, cb: Function) { + let conbinedChunk = + this.extra + + chunk + .toString("base64") + .replace(/\-/g, "+") + .replace(/\_/g, "/") + .replace(/(\r\n|\n|\r)/gm, ""); + + this.bytesProcessed += chunk.byteLength; + + const remaining = chunk.length % 4; + + this.extra = conbinedChunk.slice(chunk.length - remaining); + + const buf = Buffer.from( + conbinedChunk.slice(0, chunk.length - remaining), + "base64" + ); + this.push(buf); + cb(); + } + + _flush(cb: Function) { + if (this.extra.length) { + this.push(Buffer.from(this.extra, "base64")); + } + + cb(); + } +} diff --git a/src/lib/broadcast.ts b/src/lib/broadcast.ts new file mode 100644 index 0000000..1894490 --- /dev/null +++ b/src/lib/broadcast.ts @@ -0,0 +1,202 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import fetch from "node-fetch"; +import { shuffle } from "lodash"; +import log from "./log"; +import { Chunk, Transaction } from "./arweave"; +import { arweaveNodesPut as arweaveNodes, arweaveFallbackNodes } from "./hosts"; + +let ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT: number; + +try { + ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT = parseInt( + process.env.ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT as string + ); +} catch (error) { + log.info( + "ERROR: ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT was not defined or was not a number!" + ); + ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT = 2; +} + +export async function attemptFallbackNodes(tx: Transaction) { + log.info(`[broadcast-tx] broadcasting new tx to fallback nodes`, { + id: tx.id, + arweaveNodes, + }); + for (const fallbackNode of arweaveFallbackNodes) { + try { + await fetch(`${fallbackNode}/tx`, { + method: "POST", + body: JSON.stringify(tx), + headers: { "Content-Type": "application/json" }, + }); + } catch (error: any) { + log.error( + `[broadcast-tx] attempting a fallback node "${fallbackNode}" failed`, + error + ); + } + } +} + +export async function broadcastTx(tx: Transaction) { + log.info(`[broadcast-tx] broadcasting new tx`, { id: tx.id, arweaveNodes }); + + let submitted = 0; + + let retry = -1; + const retries = arweaveNodes.length * 2; + const shuffledArweaveNodes = shuffle(arweaveNodes); + + while ( + submitted < ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT && + retries > retry + ) { + retry += 1; + await wait(100); + + const index = retry % arweaveNodes.length; + let host: string = shuffledArweaveNodes[index]; + + log.info(`[broadcast-tx] sending`, { host, id: tx.id }); + try { + const { status: existingStatus, ok: isReceived } = await fetch( + `${host}/tx/${tx.id}/id` + ); + + if (isReceived) { + log.info(`[broadcast-tx] already received`, { + host, + id: tx.id, + existingStatus, + }); + submitted++; + break; + } + + const { + status: postStatus, + ok: postOk, + text: bodyText, + } = await fetch(`${host}/tx`, { + method: "POST", + body: JSON.stringify(tx), + headers: { "Content-Type": "application/json" }, + }); + + log.info(`[broadcast-tx] sent`, { + host, + id: tx.id, + postStatus, + }); + + if ([400, 410].includes(postStatus)) { + log.error(`[broadcast-tx] failed`, { + id: tx.id, + host, + error: postStatus, + body: await bodyText(), + }); + } else { + submitted++; + } + } catch (e: any) { + log.error(`[broadcast-tx] failed`, { + id: tx.id, + host, + error: e.message, + }); + return false; + } + } + + return submitted >= ARWEAVE_DISPATCH_TX_CONFIRMATION_REQUIREMENT; +} + +export async function broadcastChunk(chunk: Chunk) { + log.info(`[broadcast-chunk] broadcasting new chunk`, { + chunk: chunk.data_root, + }); + + let submitted = 0; + + for (const host of arweaveNodes) { + await wait(50); + + log.info(`[broadcast-chunk] sending`, { host, chunk: chunk.data_root }); + try { + const response = await fetch(`${host}/chunk`, { + method: "POST", + body: JSON.stringify({ + ...chunk, + data_size: chunk.data_size.toString(), + offset: chunk.offset.toString(), + }), + headers: { + "Content-Type": "application/json", + "arweave-data-root": chunk.data_root, + "arweave-data-size": chunk.data_size.toString(), + }, + }); + + log.info(`[broadcast-chunk] sent`, { + host, + status: response.status, + }); + + if (!response.ok) { + log.warn(`[broadcast-chunk] response`, { + host, + chunk: chunk.data_root, + status: response.status, + body: await response.text(), + }); + } + + if ([400, 410].includes(response.status)) { + log.error(`[broadcast-chunk] failed or waiting for tx`, { + host, + error: response.status, + chunk: chunk.data_root, + }); + } else { + submitted++; + } + } catch (error: any) { + log.warn(`[broadcast-chunk] failed to broadcast: ${host}`, { + error: error.message, + chunk: chunk.data_root, + }); + } + } + + if (submitted < 2) { + throw new Error(`Failed to successfully broadcast to 2 nodes`); + return false; + } else { + log.log(`[broadcast-chunk] complete`, { + submitted, + }); + return true; + } +} + +const wait = async (timeout: number) => + new Promise((resolve) => setTimeout(resolve, timeout)); diff --git a/src/lib/buckets.ts b/src/lib/buckets.ts new file mode 100644 index 0000000..09c2ef9 --- /dev/null +++ b/src/lib/buckets.ts @@ -0,0 +1,188 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { S3 } from "aws-sdk"; +import log from "../lib/log"; +import { Readable, PassThrough } from "stream"; +import { ManagedUpload, Metadata } from "aws-sdk/clients/s3"; +import { Tag } from "./arweave"; +import fetch from "node-fetch"; + +export const buckets: { [key in BucketType]: string } = { + "tx-data": process.env.ARWEAVE_S3_TX_DATA_BUCKET!, +}; + +type BucketType = "tx-data"; + +export type BucketObject = S3.GetObjectOutput; + +export const s3 = new S3({ + httpOptions: { timeout: 30000, connectTimeout: 5000 }, + logger: console, +}); + +export const put = async ( + bucketType: BucketType, + key: string, + body: Buffer | Readable, + { contentType, tags }: { contentType?: string; tags?: Tag[] } +) => { + const bucket = buckets[bucketType]; + + log.info(`[s3] uploading to bucket`, { + bucket, + key, + type: contentType, + }); + + await s3 + .upload({ + Key: key, + Bucket: bucket, + Body: body, + ContentType: contentType, + }) + .promise(); +}; + +export const putStream = async ( + bucketType: BucketType, + key: string, + { + contentType, + contentLength, + tags, + }: { contentType?: string; contentLength?: number; tags?: Tag[] } +): Promise<{ upload: ManagedUpload; stream: PassThrough }> => { + const bucket = buckets[bucketType]; + + log.info(`[s3] uploading to bucket`, { + bucket, + key, + type: contentType, + }); + + const cacheStream = new PassThrough({ + objectMode: false, + autoDestroy: true, + highWaterMark: 512 * 1024, + writableHighWaterMark: 512 * 1024, + }); + + const upload = await s3.upload( + { + Key: key, + Bucket: bucket, + Body: cacheStream, + ContentType: contentType, + ContentLength: contentLength, + }, + { partSize: 10 * 1024 * 1024, queueSize: 2 }, + () => undefined + ); + + return { stream: cacheStream, upload }; +}; + +export const get = async ( + bucketType: BucketType, + key: string +): Promise => { + const bucket = buckets[bucketType]; + log.info(`[s3] getting data from bucket`, { bucket, key }); + return s3 + .getObject({ + Key: key, + Bucket: bucket, + }) + .promise(); +}; + +export const getStream = async ( + bucketType: BucketType, + key: string +): Promise< + | { + contentType?: string; + contentLength: number; + stream: Readable; + tags?: Tag[]; + } + | undefined +> => { + log.info(`[s3] getting stream from bucket`, { key }); + + const s3Response: any = await s3 + .headObject({ + Key: key, + Bucket: buckets[bucketType], + }) + .promise(); + + const { ContentType, ContentLength } = s3Response; + + return { + contentLength: ContentLength || 0, + contentType: ContentType, + tags: [], + stream: s3 + .getObject({ + Key: key, + Bucket: buckets[bucketType], + }) + .createReadStream(), + }; +}; + +export const objectHeader = async ( + bucketType: BucketType, + key: string +): Promise<{ + contentType?: string; + contentLength: number; + tags?: Tag[]; +}> => { + const bucket = buckets[bucketType]; + + const { ContentType, ContentLength, Metadata } = await s3 + .headObject({ + Key: key, + Bucket: bucket, + }) + .promise(); + + return { + contentLength: ContentLength || 0, + contentType: ContentType, + tags: parseMetadataTags(Metadata || {}), + }; +}; + +const parseMetadataTags = (metadata: Metadata): Tag[] => { + const rawTags = metadata["x-arweave-tags"]; + + if (rawTags) { + try { + return JSON.parse(rawTags) as Tag[]; + } catch (error) { + log.info(`[s3] error parsing tags`, { metadata, rawTags }); + } + } + + return []; +}; diff --git a/src/lib/encoding.ts b/src/lib/encoding.ts new file mode 100644 index 0000000..53b77fe --- /dev/null +++ b/src/lib/encoding.ts @@ -0,0 +1,134 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { base32 } from "rfc4648"; +import { createHash } from "crypto"; +import { Readable, PassThrough } from "stream"; +import { Base64DUrlecode } from "./base64url-stream"; +import Ar from "arweave/node/ar"; + +const ar = new Ar(); + +export type Base64EncodedString = string; +export type Base64UrlEncodedString = string; +export type WinstonString = string; +export type ArString = string; +export type ISO8601DateTimeString = string; + +export const sha256 = (buffer: Buffer): Buffer => { + return createHash("sha256").update(buffer).digest(); +}; + +export function toB64url(buffer: Buffer): Base64UrlEncodedString { + return buffer + .toString("base64") + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/\=/g, ""); +} + +export function fromB64Url(input: Base64UrlEncodedString): Buffer { + const paddingLength = input.length % 4 == 0 ? 0 : 4 - (input.length % 4); + + const base64 = input + .replace(/\-/g, "+") + .replace(/\_/g, "/") + .concat("=".repeat(paddingLength)); + + return Buffer.from(base64, "base64"); +} + +export function fromB32(input: string): Buffer { + return Buffer.from( + base32.parse(input, { + loose: true, + }) + ); +} + +export function toB32(input: Buffer): string { + return base32.stringify(input, { pad: false }).toLowerCase(); +} + +export function sha256B64Url(input: Buffer): string { + return toB64url(createHash("sha256").update(input).digest()); +} + +export const streamToBuffer = async (stream: Readable): Promise => { + let buffer = Buffer.alloc(0); + return new Promise((resolve, reject) => { + stream.on("data", (chunk: Buffer) => { + buffer = Buffer.concat([buffer, chunk]); + }); + + stream.on("end", () => { + resolve(buffer); + }); + }); +}; + +export const streamToString = async (stream: Readable): Promise => { + return (await streamToBuffer(stream)).toString("utf-8"); +}; + +export const bufferToJson = (input: Buffer): T => { + return JSON.parse(input.toString("utf8")); +}; + +export const jsonToBuffer = (input: object): Buffer => { + return Buffer.from(JSON.stringify(input)); +}; + +export const streamToJson = async ( + input: Readable | string +): Promise => { + return typeof input === "string" + ? JSON.parse(input) + : bufferToJson(await streamToBuffer(input)); +}; + +export const isValidUTF8 = function (buffer: Buffer) { + return Buffer.compare(Buffer.from(buffer.toString(), "utf8"), buffer) === 0; +}; + +export const streamDecoderb64url = (readable: Readable): Readable => { + const outputStream = new PassThrough({ objectMode: false }); + + const decoder = new Base64DUrlecode(); + + readable.pipe(decoder).pipe(outputStream); + + return outputStream; +}; +export const bufferToStream = (buffer: Buffer) => { + return new Readable({ + objectMode: false, + read() { + this.push(buffer); + this.push(null); + }, + }); +}; + +export const winstonToAr = (amount: string) => { + return ar.winstonToAr(amount); +}; + +export const arToWinston = (amount: string) => { + return ar.arToWinston(amount); +}; diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts new file mode 100644 index 0000000..d9129cc --- /dev/null +++ b/src/lib/helpers.ts @@ -0,0 +1,62 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { chunk } from "lodash"; +import { getTagValue, TransactionHeader } from "../lib/arweave"; + +/** + * Split a large array into batches and process each batch sequentially, + * using an awaited async function. + * @param items + * @param batchSize + * @param func + */ +export const sequentialBatch = async ( + items: any[], + batchSize = 10, + func: Function +) => { + const batches = chunk(items, batchSize); + + for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) { + const batch = batches[batchIndex]; + await func(batch); + } +}; + +export const wait = async (ms: number) => { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +}; + +export const isTxAns102 = (tx: TransactionHeader): boolean => { + return ( + // getTagValue(tx.tags, "content-type") == "application/json" && + getTagValue(tx.tags, "bundle-format") == "json" && + getTagValue(tx.tags, "bundle-version") == "1.0.0" + ); +}; + +export const isTxAns104 = (tx: TransactionHeader): boolean => { + return ( + // getTagValue(tx.tags, "content-type") == "application/json" && + getTagValue(tx.tags, "bundle-format") == "binary" && + getTagValue(tx.tags, "bundle-version") == "2.0.0" + ); +}; diff --git a/src/lib/hosts.ts b/src/lib/hosts.ts new file mode 100644 index 0000000..d8255e1 --- /dev/null +++ b/src/lib/hosts.ts @@ -0,0 +1,29 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +export const arweaveNodesGet: string[] = JSON.parse( + process.env.ARWEAVE_NODES_GET || process.env.ARWEAVE_NODES || "[]" +) as string[]; + +export const arweaveNodesPut: string[] = JSON.parse( + process.env.ARWEAVE_NODES_PUT || process.env.ARWEAVE_NODES || "[]" +) as string[]; + +export const arweaveFallbackNodes: string[] = JSON.parse( + process.env.ARWEAVE_NODES_FALLBACK || "[]" +) as string[]; diff --git a/src/lib/log.ts b/src/lib/log.ts new file mode 100644 index 0000000..ecec3ed --- /dev/null +++ b/src/lib/log.ts @@ -0,0 +1,26 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { createLogger, transports, format } from "winston"; + +export default createLogger({ + level: "info", + transports: new transports.Console({ + format: format.simple(), + }), +}); diff --git a/src/lib/pub-sub.ts b/src/lib/pub-sub.ts new file mode 100644 index 0000000..1653bac --- /dev/null +++ b/src/lib/pub-sub.ts @@ -0,0 +1,31 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { SNS } from "aws-sdk"; + +const topicArn = process.env.ARWEAVE_SNS_EVENTS_ARN!; +const sns = new SNS(); + +export const publish = async (message: T) => { + await sns + .publish({ + TopicArn: topicArn, + Message: JSON.stringify(message), + }) + .promise(); +}; diff --git a/src/lib/queues.ts b/src/lib/queues.ts new file mode 100644 index 0000000..d76ff64 --- /dev/null +++ b/src/lib/queues.ts @@ -0,0 +1,207 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { SQS } from "aws-sdk"; +import { SQSEvent, SQSHandler, SQSRecord } from "aws-lambda"; +import log from "../lib/log"; + +type QueueType = + | "dispatch-txs" + | "import-txs" + | "import-blocks" + | "import-bundles" + | "import-chunks" + | "export-chunks"; +type SQSQueueUrl = string; +type MessageGroup = string; +type MessageDeduplicationId = string; +type DelaySeconds = number; +interface HandlerContext { + sqsMessage?: SQSRecord; +} + +const queues: { [key in QueueType]: SQSQueueUrl } = { + "dispatch-txs": process.env.ARWEAVE_SQS_DISPATCH_TXS_URL!, + "import-chunks": process.env.ARWEAVE_SQS_IMPORT_CHUNKS_URL!, + "export-chunks": process.env.ARWEAVE_SQS_EXPORT_CHUNKS_URL!, + "import-txs": process.env.ARWEAVE_SQS_IMPORT_TXS_URL!, + "import-blocks": process.env.ARWEAVE_SQS_IMPORT_BLOCKS_URL!, + "import-bundles": process.env.ARWEAVE_SQS_IMPORT_BUNDLES_URL!, +}; + +const sqs = new SQS({ + maxRetries: 3, + httpOptions: { timeout: 5000, connectTimeout: 5000 }, +}); + +export const getQueueUrl = (type: QueueType): SQSQueueUrl => { + return queues[type]; +}; + +function* chunks(arr: any[], n: number) { + for (let i = 0; i < arr.length; i += n) { + yield arr.slice(i, i + n); + } +} + +export const enqueue = async ( + queueUrl: SQSQueueUrl, + message: MessageType, + options?: + | { + messagegroup?: MessageGroup; + deduplicationId?: MessageDeduplicationId; + delaySeconds?: DelaySeconds; + } + | undefined +) => { + if (!queueUrl) { + throw new Error(`Queue URL undefined`); + } + + await sqs + .sendMessage({ + QueueUrl: queueUrl, + MessageBody: JSON.stringify(message), + MessageGroupId: options && options.messagegroup, + MessageDeduplicationId: options && options.deduplicationId, + DelaySeconds: options && options.delaySeconds, + }) + .promise(); +}; + +export const enqueueBatch = async ( + queueUrl: SQSQueueUrl, + messages: { + id: string; + message: MessageType; + messagegroup?: MessageGroup; + deduplicationId?: MessageDeduplicationId; + }[] +) => { + for (const messageChnk of chunks(messages, 10)) { + await sqs + .sendMessageBatch({ + QueueUrl: queueUrl, + Entries: messageChnk.map((message) => { + return { + Id: message.id, + MessageBody: JSON.stringify(message), + MessageGroupId: message.messagegroup, + MessageDeduplicationId: message.deduplicationId, + }; + }), + }) + .promise(); + } +}; + +const deleteMessages = async ( + queueUrl: SQSQueueUrl, + receipts: { Id: string; ReceiptHandle: string }[] +) => { + if (!receipts.length) { + return; + } + for (const receiptChnk of chunks(receipts, 10)) { + await sqs + .deleteMessageBatch({ + QueueUrl: queueUrl, + Entries: receiptChnk, + }) + .promise(); + } +}; + +export const createQueueHandler = ( + queueUrl: SQSQueueUrl, + handler: (message: MessageType, sqsMessage: SQSRecord) => Promise, + hooks?: { + before?: () => Promise; + after?: () => Promise; + } +): SQSHandler => { + return async (event: SQSEvent) => { + if (hooks && hooks.before) { + await hooks.before(); + } + try { + if (!event) { + log.info(`[sqs-handler] invalid SQS messages received`, { event }); + throw new Error("Queue handler: invalid SQS messages received"); + } + + log.info(`[sqs-handler] received messages`, { + count: event.Records.length, + source: event.Records[0].eventSourceARN, + }); + + const receipts: { Id: string; ReceiptHandle: string }[] = []; + + const errors: Error[] = []; + + await Promise.all( + event.Records.map(async (sqsMessage) => { + log.info(`[sqs-handler] processing message`, { sqsMessage }); + try { + await handler( + JSON.parse(sqsMessage.body) as MessageType, + sqsMessage + ); + receipts.push({ + Id: sqsMessage.messageId, + ReceiptHandle: sqsMessage.receiptHandle, + }); + } catch (error: any) { + log.error(`[sqs-handler] error processing message`, { + event, + error, + }); + errors.push(error); + } + }) + ); + + log.info(`[sqs-handler] queue handler complete`, { + successful: receipts.length, + failed: event.Records.length - receipts.length, + }); + + await deleteMessages(queueUrl, receipts); + + if (receipts.length !== event.Records.length) { + log.warn( + `Failed to process ${event.Records.length - receipts.length} messages` + ); + + // If all the errors are the same then fail the whole queue with a more specific error mesage + if (errors.every((error) => error.message == errors[0].message)) { + throw new Error( + `Failed to process SQS messages: ${errors[0].message}` + ); + } + + throw new Error(`Failed to process SQS messages`); + } + } finally { + if (hooks && hooks.after) { + await hooks.after(); + } + } + }; +}; diff --git a/src/lib/stream-tap.ts b/src/lib/stream-tap.ts new file mode 100644 index 0000000..9f8bb83 --- /dev/null +++ b/src/lib/stream-tap.ts @@ -0,0 +1,40 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { Transform, Writable } from "stream"; + +export class StreamTap extends Transform { + protected outputStream: Writable; + protected bytesProcessed: number = 0; + + constructor(outputStream: Writable) { + super({ objectMode: false }); + this.outputStream = outputStream; + } + + _transform(chunk: Buffer, encoding: any, callback: Function) { + this.outputStream.write(chunk); + this.bytesProcessed += chunk.byteLength; + this.push(chunk); + callback(); + } + + getBytesProcessed() { + return this.bytesProcessed; + } +} diff --git a/src/modules.d.ts b/src/modules.d.ts new file mode 100644 index 0000000..e8f17e9 --- /dev/null +++ b/src/modules.d.ts @@ -0,0 +1,29 @@ +/** + * Arweave Gateway + * Copyright (C) 2022 Permanent Data Solutions, Inc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +declare module "got"; +declare module "ramda"; +declare module "morgan"; +declare module "node-fetch"; + +declare namespace Express { + export interface Request { + log: any; + id: string | undefined; + } +} diff --git a/terraform/.gitignore b/terraform/.gitignore new file mode 100644 index 0000000..12696d1 --- /dev/null +++ b/terraform/.gitignore @@ -0,0 +1,3 @@ +.terraform +secret.tfvars +.terragrunt-cache diff --git a/terraform/src/buckets.tf b/terraform/src/buckets.tf new file mode 100644 index 0000000..23e664c --- /dev/null +++ b/terraform/src/buckets.tf @@ -0,0 +1,11 @@ +module "s3-bucket" { + source = "terraform-aws-modules/s3-bucket/aws" + version = "2.11.1" + bucket = "arweave-gateway-legacy-${var.environment}-tx-data" + + acl = "private" + + versioning = { + enabled = false + } +} diff --git a/terraform/src/dns.tf b/terraform/src/dns.tf new file mode 100644 index 0000000..fcd1e1b --- /dev/null +++ b/terraform/src/dns.tf @@ -0,0 +1,68 @@ +resource "aws_route53_zone" "default" { + name = var.domain_name + + tags = { + Environment = var.environment + } +} + + +resource "aws_route53_record" "ar_prod_base_a_record" { + count = var.environment == "prod" ? 1 : 0 + + zone_id = aws_route53_zone.default.id + + name = "ar-prod.io" + type = "A" + + alias { + name = aws_lb.gateway_legacy_alb.dns_name + zone_id = aws_lb.gateway_legacy_alb.zone_id + evaluate_target_health = true + } +} + +resource "aws_route53_record" "ar_prod_base_aaaa_record" { + count = var.environment == "prod" ? 1 : 0 + + zone_id = aws_route53_zone.default.id + + name = "ar-prod.io" + type = "AAAA" + + alias { + name = aws_lb.gateway_legacy_alb.dns_name + zone_id = aws_lb.gateway_legacy_alb.zone_id + evaluate_target_health = true + } +} + +resource "aws_route53_record" "ar_prod_a_www_record" { + count = var.environment == "prod" ? 1 : 0 + + zone_id = aws_route53_zone.default.id + + name = "www.ar-prod.io" + type = "A" + + alias { + name = aws_lb.gateway_legacy_alb.dns_name + zone_id = aws_lb.gateway_legacy_alb.zone_id + evaluate_target_health = true + } +} + +resource "aws_route53_record" "ar_prod_aaaa_www_record" { + count = var.environment == "prod" ? 1 : 0 + + zone_id = aws_route53_zone.default.id + + name = "www.ar-prod.io" + type = "AAAA" + + alias { + name = aws_lb.gateway_legacy_alb.dns_name + zone_id = aws_lb.gateway_legacy_alb.zone_id + evaluate_target_health = true + } +} diff --git a/terraform/src/ec2.tf b/terraform/src/ec2.tf new file mode 100644 index 0000000..ee4eb65 --- /dev/null +++ b/terraform/src/ec2.tf @@ -0,0 +1,138 @@ +resource "aws_s3_bucket" "amis" { + bucket = "gateway-legacy-${var.environment}-amis" +} + +module "vmimport" { + source = "github.com/StratusGrid/terraform-aws-iam-role-vmimport" + image_bucket_name = "gateway-legacy-${var.environment}-amis" +} + + +resource "aws_security_group" "gateway_legacy_ec2_import_blocks_security_group" { + name = "EC2 Gateway Legacy import-blocks Security Group" + description = "ECS Gateway Legacy import-blocks Security Group" + vpc_id = aws_vpc.default.id + + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = concat(aws_subnet.private[*].cidr_block, aws_subnet.public[*].cidr_block) + } + + egress { + from_port = 1984 + to_port = 1984 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + } + + egress { + from_port = 5432 + to_port = 5432 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + } + + egress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + } + + egress { + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + } +} + + +resource "aws_iam_instance_profile" "import_blocks_instance_profile" { + name = "import_blocks_instance_profile" + role = aws_iam_role.import_blocks_instance_role.name +} + +resource "aws_iam_role" "import_blocks_instance_role" { + name = "import_blocks_instance_role" + path = "/" + + assume_role_policy = <> /var/dotenv + echo AWS_DEFAULT_REGION=${var.region} >> /var/dotenv + echo ARWEAVE_DB_READ_HOST=${module.rds_proxy.db_proxy_endpoints.read_only.endpoint} >> /var/dotenv + echo ARWEAVE_DB_WRITE_HOST=${module.rds_proxy.db_proxy_endpoints.read_write.endpoint} >> /var/dotenv + echo ARWEAVE_SQS_IMPORT_TXS_URL=${aws_sqs_queue.import_txs.url} >> /var/dotenv + chmod 755 /var/dotenv + EOT + + associate_public_ip_address = true + + monitoring = true + vpc_security_group_ids = aws_security_group.gateway_legacy_ec2_import_blocks_security_group[*].id + subnet_id = aws_subnet.private[0].id + + tags = { + Terraform = "true" + } +} diff --git a/terraform/src/ecr.tf b/terraform/src/ecr.tf new file mode 100644 index 0000000..2332a67 --- /dev/null +++ b/terraform/src/ecr.tf @@ -0,0 +1,62 @@ +resource "aws_ecr_repository" "gateway_legacy_ecr" { + name = "gateway-legacy-${var.environment}-ecr" + image_tag_mutability = "MUTABLE" +} + +resource "aws_ecr_repository_policy" "gateway_legacy_ecr_policy" { + repository = aws_ecr_repository.gateway_legacy_ecr.name + policy = < + */ + + tags = { + Name = "tailscale-relay" + } +} diff --git a/terraform/src/variables.tf b/terraform/src/variables.tf new file mode 100644 index 0000000..4732d84 --- /dev/null +++ b/terraform/src/variables.tf @@ -0,0 +1,77 @@ +variable "environment" { + type = string + description = "deployment environment (ex. test, dev, prod)" +} + +variable "domain_name" { + type = string + description = "Domain name for a given target" +} + +variable "region" { + type = string + description = "aws-region" +} + +variable "cidr" { + type = string + description = "CIDR block for the VPC" +} + +variable "azs" { + type = list + description = "List of availability zones" +} + +variable "public_subnets" { + type = list + description = "List of public subnet CIDR blocks" +} + +variable "private_subnets" { + type = list + description = "List of public subnet CIDR blocks" +} + +variable "account_id" { + description = "The account-id of given environment" + type = string +} + +variable "deployment_role" { + description = "The role which handles deployments" + type = string +} + +variable "arweave_account" { + description = "The arn of the old arweave's gateway aws account" + type = string +} + +variable "default_kms_id" { + description = "The default created kms key called default" + type = string +} + +# resources + +variable "rds_instance_type" { + description = "The resource type for rds+postgres ex: db.t4g.2xlarge" + type = string +} + +variable "ami_ubuntu_latest" { + description = "Region specific AMI image identifier for latest ubuntu image" + type = string +} + + +variable "ec2_import_blocks_resource" { + description = "The resource type for the ec2 instance responsible for importing blocks" + type = string +} + +variable import_blocks_ami { + description = "The AMI id of the privately deployed ami image" + type = string +} diff --git a/terraform/src/vpc.tf b/terraform/src/vpc.tf new file mode 100644 index 0000000..f840ae4 --- /dev/null +++ b/terraform/src/vpc.tf @@ -0,0 +1,119 @@ +resource "aws_vpc" "default" { + cidr_block = var.cidr + enable_dns_support = true + enable_dns_hostnames = true + tags = { + Name = "Default VPC" + } +} + +resource "aws_internet_gateway" "default" { + vpc_id = aws_vpc.default.id +} + +resource "aws_route_table" "private" { + count = length(var.private_subnets) + vpc_id = aws_vpc.default.id +} + +resource "aws_route" "private" { + count = length(var.private_subnets) + route_table_id = aws_route_table.private[count.index].id + destination_cidr_block = "0.0.0.0/0" + nat_gateway_id = aws_nat_gateway.default[count.index].id +} + +resource "aws_route_table" "public" { + vpc_id = aws_vpc.default.id +} + +resource "aws_route" "public" { + route_table_id = aws_route_table.public.id + destination_cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.default.id +} + +resource "aws_subnet" "private" { + count = length(var.private_subnets) + vpc_id = aws_vpc.default.id + cidr_block = var.private_subnets[count.index] + availability_zone = var.azs[count.index] +} + +resource "aws_subnet" "public" { + count = length(var.public_subnets) + vpc_id = aws_vpc.default.id + cidr_block = var.public_subnets[count.index] + availability_zone = var.azs[count.index] + map_public_ip_on_launch = true +} + +resource "aws_route_table_association" "private" { + count = length(var.private_subnets) + + subnet_id = aws_subnet.private[count.index].id + route_table_id = aws_route_table.private[count.index].id +} + +resource "aws_route_table_association" "public" { + count = length(var.public_subnets) + + subnet_id = aws_subnet.public[count.index].id + route_table_id = aws_route_table.public.id +} + + +# NAT resources: This will create 2 NAT gateways in 2 Public Subnets for 2 different Private Subnets. + +resource "aws_eip" "nat" { + count = length(var.public_subnets) + vpc = true +} + +resource "aws_nat_gateway" "default" { + count = length(var.public_subnets) + allocation_id = aws_eip.nat[count.index].id + subnet_id = aws_subnet.public[count.index].id +} + + +resource "aws_security_group" "web" { + name = "default-alb-web-security-group" + description = "The ALB web security group." + vpc_id = aws_vpc.default.id + + ingress { + description = "Allow all secure web traffic" + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + description = "Allow all non-secure web traffic temporarily" + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + description = "Allow SSH from local network." + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = [aws_vpc.default.cidr_block] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + tags = { + Name = "default-alb-web-security-group" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6bca7b5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "strict": true, + "target": "es2020", + "moduleResolution": "node", + "inlineSourceMap": false, + "inlineSources": false, + "module": "commonjs", + "outDir": "./dist", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": false, + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..45fa3c7 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7731 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0": + version "3.4.17" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.17.tgz#4972e19a49809e16d17c5adc67f45623a6dac135" + integrity sha512-MDt2rwMX1GqodiVEKJqmDmAz8xr0qJmq5PdWeIt0yDaT4GOkKYWZiWkyfhfv3raTk8PyJvbsNG9q2CqmUrlGfg== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.3" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.9.0" + tslib "^2.3.0" + zen-observable-ts "~1.1.0" + +"@apollo/protobufjs@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" + integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollographql/apollo-tools@^0.5.1": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz#01750a655731a198c3634ee819c463254a7c7767" + integrity sha512-KxZiw0Us3k1d0YkJDhOpVH5rJ+mBfjXcgoRoCcslbgirjgLotKMzOcx4PZ7YTEvvEROmvG7X3Aon41GvMmyGsw== + +"@apollographql/graphql-playground-html@1.6.29": + version "1.6.29" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" + integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== + dependencies: + xss "^1.0.8" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.16.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@^7.14.0", "@babel/core@^7.2.2": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.14.0", "@babel/generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== + dependencies: + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" + integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.0", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" + integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" + integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-flow" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + +"@dabh/diagnostics@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" + integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" + integrity sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA== + dependencies: + lodash.get "^4" + make-error "^1" + ts-node "^9" + tslib "^2" + +"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" + integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== + dependencies: + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" + integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/networks" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/web" "^5.5.0" + +"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" + integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== + dependencies: + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + +"@ethersproject/address@5.5.0", "@ethersproject/address@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" + integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + +"@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" + integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + +"@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" + integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + +"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" + integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + bn.js "^4.11.9" + +"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/constants@5.5.0", "@ethersproject/constants@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" + integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + +"@ethersproject/contracts@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" + integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== + dependencies: + "@ethersproject/abi" "^5.5.0" + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + +"@ethersproject/hash@5.5.0", "@ethersproject/hash@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" + integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" + integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/basex" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/pbkdf2" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/wordlists" "^5.5.0" + +"@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" + integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/hdnode" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/pbkdf2" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/random" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" + integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.5.0", "@ethersproject/logger@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/networks@5.5.2", "@ethersproject/networks@^5.5.0": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.2.tgz#784c8b1283cd2a931114ab428dae1bd00c07630b" + integrity sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" + integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + +"@ethersproject/properties@5.5.0", "@ethersproject/properties@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" + integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/providers@5.5.3": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.3.tgz#56c2b070542ac44eb5de2ed3cf6784acd60a3130" + integrity sha512-ZHXxXXXWHuwCQKrgdpIkbzMNJMvs+9YWemanwp1fA7XZEv7QlilseysPvQe0D7Q7DlkJX/w/bGA1MdgK2TbGvA== + dependencies: + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/basex" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/networks" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/random" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/web" "^5.5.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.5.1", "@ethersproject/random@^5.5.0": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.1.tgz#7cdf38ea93dc0b1ed1d8e480ccdaf3535c555415" + integrity sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" + integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" + integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" + integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/strings@5.5.0", "@ethersproject/strings@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" + integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" + integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== + dependencies: + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + +"@ethersproject/units@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" + integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/wallet@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" + integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== + dependencies: + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/hdnode" "^5.5.0" + "@ethersproject/json-wallets" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/random" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/wordlists" "^5.5.0" + +"@ethersproject/web@5.5.1", "@ethersproject/web@^5.5.0": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" + integrity sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg== + dependencies: + "@ethersproject/base64" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" + integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@graphql-codegen/cli@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-2.4.0.tgz#7df3ee2bdd5b88a5904ee6f52eafeb370ef70e51" + integrity sha512-4iiHH2AxBE17lX5cFdFg6+kh7I6uKQLYG0IZRalRbW/grKL7kuVp/RDUjmVB2GNJTJEhjxYLMJFJZocUmAUBlw== + dependencies: + "@graphql-codegen/core" "2.4.0" + "@graphql-codegen/plugin-helpers" "^2.3.2" + "@graphql-tools/apollo-engine-loader" "^7.0.5" + "@graphql-tools/code-file-loader" "^7.0.6" + "@graphql-tools/git-loader" "^7.0.5" + "@graphql-tools/github-loader" "^7.0.5" + "@graphql-tools/graphql-file-loader" "^7.0.5" + "@graphql-tools/json-file-loader" "^7.1.2" + "@graphql-tools/load" "^7.3.0" + "@graphql-tools/prisma-loader" "^7.0.6" + "@graphql-tools/url-loader" "^7.0.11" + "@graphql-tools/utils" "^8.1.1" + ansi-escapes "^4.3.1" + chalk "^4.1.0" + change-case-all "1.0.14" + chokidar "^3.5.2" + common-tags "^1.8.0" + cosmiconfig "^7.0.0" + debounce "^1.2.0" + dependency-graph "^0.11.0" + detect-indent "^6.0.0" + glob "^7.1.6" + globby "^11.0.4" + graphql-config "^4.1.0" + inquirer "^8.0.0" + is-glob "^4.0.1" + json-to-pretty-yaml "^1.2.2" + latest-version "5.1.0" + listr "^0.14.3" + listr-update-renderer "^0.5.0" + log-symbols "^4.0.0" + minimatch "^3.0.4" + mkdirp "^1.0.4" + string-env-interpolation "^1.0.1" + ts-log "^2.2.3" + tslib "~2.3.0" + valid-url "^1.0.9" + wrap-ansi "^7.0.0" + yaml "^1.10.0" + yargs "^17.0.0" + +"@graphql-codegen/core@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-2.4.0.tgz#d94dcc088b5e117c847ce5b10c4fe1eb7325e180" + integrity sha512-5RiYE1+07jayp/3w/bkyaCXtfKNeKmRabpPP4aRi369WeH2cH37l2K8NbhkIU+zhpnhoqMID61TO56x2fKldZQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.3.2" + "@graphql-tools/schema" "^8.1.2" + "@graphql-tools/utils" "^8.1.1" + tslib "~2.3.0" + +"@graphql-codegen/plugin-helpers@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.3.2.tgz#3f9ba625791901d19be733db1dfc9a3dbd0dac44" + integrity sha512-19qFA5XMAWaAY64sBljjDPYfHjE+QMk/+oalCyY13WjSlcLDvYPfmFlCNgFSsydArDELlHR8T1GMbA7C42M8TA== + dependencies: + "@graphql-tools/utils" "^8.5.2" + change-case-all "1.0.14" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.3.0" + +"@graphql-codegen/schema-ast@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-2.4.1.tgz#ad742b53e32f7a2fbff8ea8a91ba7e617e6ef236" + integrity sha512-bIWlKk/ShoVJfghA4Rt1OWnd34/dQmZM/vAe6fu6QKyOh44aAdqPtYQ2dbTyFXoknmu504etKJGEDllYNUJRfg== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.3.2" + "@graphql-tools/utils" "^8.1.1" + tslib "~2.3.0" + +"@graphql-codegen/typescript-resolvers@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.4.3.tgz#556dbaf23eac0ff9c321d3ce7126d96a839f793f" + integrity sha512-4m3E0zKLSXjGirZcYHHaZ0bxjy/gxvuumShFCKFmYTkHwTfqBaeh/pMhWqLkwC9wimrH6mQoPIYSQHLaF6Eqng== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.3.2" + "@graphql-codegen/typescript" "^2.4.2" + "@graphql-codegen/visitor-plugin-common" "2.5.2" + "@graphql-tools/utils" "^8.1.1" + auto-bind "~4.0.0" + tslib "~2.3.0" + +"@graphql-codegen/typescript@2.4.2", "@graphql-codegen/typescript@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-2.4.2.tgz#a239d5fd8f11140d5d4c81cfae7ff02054b724dc" + integrity sha512-8ajWidiFqF1KNAywtb/692SjwTyjzrDHo1sf2Q7Z+rh9qDEIrh83VHB8naT/1CefOvxj3MS6GbcsvJMizaE/AQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.3.2" + "@graphql-codegen/schema-ast" "^2.4.1" + "@graphql-codegen/visitor-plugin-common" "2.5.2" + auto-bind "~4.0.0" + tslib "~2.3.0" + +"@graphql-codegen/visitor-plugin-common@2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.5.2.tgz#90aa4add41e17bca83f1c7c8ad674f2a06065efd" + integrity sha512-qDMraPmumG+vEGAz42/asRkdgIRmQWH5HTc320UX+I6CY6eE/Ey85cgzoqeQGLV8gu4sj3UkNx/3/r79eX4u+Q== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.3.2" + "@graphql-tools/optimize" "^1.0.1" + "@graphql-tools/relay-operation-optimizer" "^6.3.7" + "@graphql-tools/utils" "^8.3.0" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.3.0" + +"@graphql-tools/apollo-engine-loader@^7.0.5": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.2.2.tgz#1463f5d2d95b5ca2b602b35b4922b38935013860" + integrity sha512-jrtA1IvgbaHzla9nyBngNyvajudTcQAVE3//mgrK+DoN7UpUhtoXfxTOOq2tzZN67o4a6Bv/RJsxB3rSI3NLzg== + dependencies: + "@graphql-tools/utils" "^8.5.1" + cross-undici-fetch "^0.1.19" + sync-fetch "0.3.1" + tslib "~2.3.0" + +"@graphql-tools/batch-execute@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.3.1.tgz#0b74c54db5ac1c5b9a273baefc034c2343ebbb74" + integrity sha512-63kHY8ZdoO5FoeDXYHnAak1R3ysMViMPwWC2XUblFckuVLMUPmB2ONje8rjr2CvzWBHAW8c1Zsex+U3xhKtGIA== + dependencies: + "@graphql-tools/utils" "^8.5.1" + dataloader "2.0.0" + tslib "~2.3.0" + value-or-promise "1.0.11" + +"@graphql-tools/code-file-loader@^7.0.6": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.2.3.tgz#b53e8809528da07911423c3a511e5fccf9121a12" + integrity sha512-aNVG3/VG5cUpS389rpCum+z7RY98qvPwOzd+J4LVr+f5hWQbDREnSFM+5RVTDfULujrsi7edKaGxGKp68pGmAA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^7.1.3" + "@graphql-tools/utils" "^8.5.1" + globby "^11.0.3" + tslib "~2.3.0" + unixify "^1.0.0" + +"@graphql-tools/delegate@^8.4.1", "@graphql-tools/delegate@^8.4.2": + version "8.4.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-8.4.3.tgz#ad73ed7cc3b4cad9242c6d4835a5ae0b640f7164" + integrity sha512-hKTJdJXJnKL0+2vpU+Kt7OHQTIXZ9mBmNBwHsYiG5WNArz/vNI7910r6TC2XMf/e7zhyyK+mXxMDBmDQkkJagA== + dependencies: + "@graphql-tools/batch-execute" "^8.3.1" + "@graphql-tools/schema" "^8.3.1" + "@graphql-tools/utils" "^8.5.4" + dataloader "2.0.0" + tslib "~2.3.0" + value-or-promise "1.0.11" + +"@graphql-tools/git-loader@^7.0.5": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-7.1.2.tgz#7a7b5fc366bcc9e2e14e0463ff73f1a19aafabbd" + integrity sha512-vIMrISQPKQgHS893b8K/pEE1InPV+7etzFhHoyQRhYkVHXP2RBkfI64Wq9bNPezF8Ss/dwIjI/keLaPp9EQDmA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^7.1.3" + "@graphql-tools/utils" "^8.5.1" + is-glob "4.0.3" + micromatch "^4.0.4" + tslib "~2.3.0" + unixify "^1.0.0" + +"@graphql-tools/github-loader@^7.0.5": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-7.2.2.tgz#632351eac56cbbda25e38ff7ea7bcb256f30a277" + integrity sha512-prk7fWkPQdkOIGv/tFxNFAmxrBbWwc/ztOk2m5tAfmdiVM0HR3MC5Ckx3kLpODVG7lpxKRamMsPCIqmjhrCLWQ== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^7.1.3" + "@graphql-tools/utils" "^8.5.1" + cross-undici-fetch "^0.1.19" + sync-fetch "0.3.1" + tslib "~2.3.0" + +"@graphql-tools/graphql-file-loader@^7.0.5", "@graphql-tools/graphql-file-loader@^7.3.2": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.3.3.tgz#7cee2f84f08dc13fa756820b510248b857583d36" + integrity sha512-6kUJZiNpYKVhum9E5wfl5PyLLupEDYdH7c8l6oMrk6c7EPEVs6iSUyB7yQoWrtJccJLULBW2CRQ5IHp5JYK0mA== + dependencies: + "@graphql-tools/import" "^6.5.7" + "@graphql-tools/utils" "^8.5.1" + globby "^11.0.3" + tslib "~2.3.0" + unixify "^1.0.0" + +"@graphql-tools/graphql-tag-pluck@^7.1.3": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.1.5.tgz#229ed40f38430cdea750f112cbfad89fbc29129c" + integrity sha512-NKbFcjlg7cbK+scLXc6eVxXIhX4k8QL6lZ/y5Ju7yrpIN18k2vA78dI6W3Qb5qdftxbDNuC+kDmScZfzzxVPjQ== + dependencies: + "@babel/parser" "^7.16.8" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@graphql-tools/utils" "^8.5.1" + tslib "~2.3.0" + +"@graphql-tools/import@^6.5.7": + version "6.6.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.6.5.tgz#e1ec593960288ceda7d5c56c0073c702b1bdcfa0" + integrity sha512-w0/cYuhrr2apn+iGoTToCqt65x2NN2iHQyqRNk/Zw1NJ+e8/C3eKVw0jmW4pYQvSocuPxL4UCSI56SdKO7m3+Q== + dependencies: + "@graphql-tools/utils" "8.6.1" + resolve-from "5.0.0" + tslib "~2.3.0" + +"@graphql-tools/json-file-loader@^7.1.2", "@graphql-tools/json-file-loader@^7.3.2": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.3.3.tgz#45cfde77b9dc4ab6c21575305ae537d2814d237f" + integrity sha512-CN2Qk9rt+Gepa3rb3X/mpxYA5MIYLwZBPj2Njw6lbZ6AaxG+O1ArDCL5ACoiWiBimn1FCOM778uhRM9znd0b3Q== + dependencies: + "@graphql-tools/utils" "^8.5.1" + globby "^11.0.3" + tslib "~2.3.0" + unixify "^1.0.0" + +"@graphql-tools/load@^7.3.0", "@graphql-tools/load@^7.4.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.5.1.tgz#8c7f846d2185ddc1d44fdfbf1ed9cb678f69e40b" + integrity sha512-j9XcLYZPZdl/TzzqA83qveJmwcCxgGizt5L1+C1/Z68brTEmQHLdQCOR3Ma3ewESJt6DU05kSTu2raKaunkjRg== + dependencies: + "@graphql-tools/schema" "8.3.1" + "@graphql-tools/utils" "^8.6.0" + p-limit "3.1.0" + tslib "~2.3.0" + +"@graphql-tools/merge@^8.2.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.2.1.tgz#bf83aa06a0cfc6a839e52a58057a84498d0d51ff" + integrity sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA== + dependencies: + "@graphql-tools/utils" "^8.5.1" + tslib "~2.3.0" + +"@graphql-tools/mock@^8.1.2": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.5.1.tgz#379d18eafdcb65486beb8f9247b33b7b693c53aa" + integrity sha512-cwwqGs9Rofev1JdMheAseqM/rw1uw4CYb35vv3Kcv2bbyiPF+490xdlHqFeIazceotMFxC60LlQztwb64rsEnw== + dependencies: + "@graphql-tools/schema" "^8.3.1" + "@graphql-tools/utils" "^8.6.0" + fast-json-stable-stringify "^2.1.0" + tslib "~2.3.0" + +"@graphql-tools/optimize@^1.0.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.1.1.tgz#dcd59ba1ee34431e5e9b086b57fe0bdb1a176669" + integrity sha512-y0TEfPyGmJaQjnsTRs/UP7/ZHaB3i68VAsXW4H2doUFKY6rIOUz+ruME/uWsfy/VeTWBNqGX8/m/X7YFEi5OJQ== + dependencies: + tslib "~2.3.0" + +"@graphql-tools/prisma-loader@^7.0.6": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.1.1.tgz#2a769919c97a3f7f7807668d3155c47999b0965c" + integrity sha512-9hVpG3BNsXAYMLPlZhSHubk6qBmiHLo/UlU0ldL100sMpqI46iBaHNhTNXZCSdd81hT+4HNqaDXNFqyKJ22OGQ== + dependencies: + "@graphql-tools/url-loader" "^7.4.2" + "@graphql-tools/utils" "^8.5.1" + "@types/js-yaml" "^4.0.0" + "@types/json-stable-stringify" "^1.0.32" + "@types/jsonwebtoken" "^8.5.0" + chalk "^4.1.0" + debug "^4.3.1" + dotenv "^10.0.0" + graphql-request "^3.3.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + isomorphic-fetch "^3.0.0" + js-yaml "^4.0.0" + json-stable-stringify "^1.0.1" + jsonwebtoken "^8.5.1" + lodash "^4.17.20" + replaceall "^0.1.6" + scuid "^1.1.0" + tslib "~2.3.0" + yaml-ast-parser "^0.0.43" + +"@graphql-tools/relay-operation-optimizer@^6.3.7": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.4.1.tgz#28572444e2c00850c889a84472f3cc7405dc1ad8" + integrity sha512-2b9D5L+31sIBnvmcmIW5tfvNUV+nJFtbHpUyarTRDmFT6EZ2cXo4WZMm9XJcHQD/Z5qvMXfPHxzQ3/JUs4xI+w== + dependencies: + "@graphql-tools/utils" "^8.5.1" + relay-compiler "12.0.0" + tslib "~2.3.0" + +"@graphql-tools/schema@8.3.1", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.2.0", "@graphql-tools/schema@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.1.tgz#1ee9da494d2da457643b3c93502b94c3c4b68c74" + integrity sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ== + dependencies: + "@graphql-tools/merge" "^8.2.1" + "@graphql-tools/utils" "^8.5.1" + tslib "~2.3.0" + value-or-promise "1.0.11" + +"@graphql-tools/url-loader@^7.0.11", "@graphql-tools/url-loader@^7.4.2": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.7.1.tgz#2faabdc1d2c47edc8edc9cc938eee2767189869f" + integrity sha512-K/5amdeHtKYI976HVd/AXdSNvLL7vx5QVjMlwN0OHeYyxSgC+UOH+KkS7cshYgL13SekGu0Mxbg9ABfgQ34ECA== + dependencies: + "@graphql-tools/delegate" "^8.4.1" + "@graphql-tools/utils" "^8.5.1" + "@graphql-tools/wrap" "^8.3.1" + "@n1ru4l/graphql-live-query" "^0.9.0" + "@types/websocket" "^1.0.4" + "@types/ws" "^8.0.0" + cross-undici-fetch "^0.1.19" + dset "^3.1.0" + extract-files "^11.0.0" + graphql-sse "^1.0.1" + graphql-ws "^5.4.1" + isomorphic-ws "^4.0.1" + meros "^1.1.4" + subscriptions-transport-ws "^0.11.0" + sync-fetch "^0.3.1" + tslib "^2.3.0" + valid-url "^1.0.9" + value-or-promise "^1.0.11" + ws "^8.3.0" + +"@graphql-tools/utils@8.6.1", "@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.5.2", "@graphql-tools/utils@^8.5.3", "@graphql-tools/utils@^8.5.4", "@graphql-tools/utils@^8.6.0": + version "8.6.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.6.1.tgz#52c7eb108f2ca2fd01bdba8eef85077ead1bf882" + integrity sha512-uxcfHCocp4ENoIiovPxUWZEHOnbXqj3ekWc0rm7fUhW93a1xheARNHcNKhwMTR+UKXVJbTFQdGI1Rl5XdyvDBg== + dependencies: + tslib "~2.3.0" + +"@graphql-tools/wrap@^8.3.1": + version "8.3.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-8.3.3.tgz#014aa04a6cf671ffe477516255d1134777da056a" + integrity sha512-TpXN1S4Cv+oMA1Zsg9Nu4N9yrFxLuJkX+CTtSRrrdfETGHIxqfyDkm5slPDCckxP+RILA00g8ny2jzsYyNvX1w== + dependencies: + "@graphql-tools/delegate" "^8.4.2" + "@graphql-tools/schema" "^8.3.1" + "@graphql-tools/utils" "^8.5.3" + tslib "~2.3.0" + value-or-promise "1.0.11" + +"@graphql-typed-document-node/core@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + +"@hapi/address@^4.0.1": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d" + integrity sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@hapi/formula@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128" + integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A== + +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + +"@hapi/joi@^17.1.1": + version "17.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-17.1.1.tgz#9cc8d7e2c2213d1e46708c6260184b447c661350" + integrity sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg== + dependencies: + "@hapi/address" "^4.0.1" + "@hapi/formula" "^2.0.0" + "@hapi/hoek" "^9.0.0" + "@hapi/pinpoint" "^2.0.0" + "@hapi/topo" "^5.0.0" + +"@hapi/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.0.tgz#805b40d4dbec04fc116a73089494e00f073de8df" + integrity sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + +"@josephg/resolvable@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" + integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== + +"@n1ru4l/graphql-live-query@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@n1ru4l/graphql-live-query/-/graphql-live-query-0.9.0.tgz#defaebdd31f625bee49e6745934f36312532b2bc" + integrity sha512-BTpWy1e+FxN82RnLz4x1+JcEewVdfmUhV1C6/XYD5AjS7PQp9QFF7K8bCD6gzPTr2l+prvqOyVueQhFJxB1vfg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" + integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== + dependencies: + any-observable "^0.3.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^4.0.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.4.0.tgz#e277e5bdbdf7cb1e20d320f02f5e2ed113cd3185" + integrity sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ== + +"@solana/buffer-layout@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" + integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== + dependencies: + buffer "~6.0.3" + +"@solana/wallet-adapter-base@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.2.tgz#917584e701a7764afd59a54865ba60ef1ad62926" + integrity sha512-lHMHE506oKIJM8Tm/yBUpwR2tOdBADQqKhES/U64oAoACprulLBSGx0A+v7NP3rlcTmBMSh7qSQnf5Iic6jexQ== + dependencies: + "@solana/web3.js" "^1.20.0" + eventemitter3 "^4.0.0" + +"@solana/web3.js@^1.20.0": + version "1.32.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.32.0.tgz#b9821de52d0e773c363516c3dcef9be701295d82" + integrity sha512-jquZ/VBvM3zXAaTJvdWd9mlP0WiZaZqjji0vw5UAsb5IKIossrLhHtyUqMfo41Qkdwu1aVwf7YWG748i4XIJnw== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + cross-fetch "^3.1.4" + jayson "^3.4.4" + js-sha3 "^0.8.0" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + +"@szmarczak/http-timer@4.x", "@szmarczak/http-timer@^1.1.2", "@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/async-retry@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.4.3.tgz#8b78f6ce88d97e568961732cdd9e5325cdc8c246" + integrity sha512-B3C9QmmNULVPL2uSJQ088eGWTNPIeUk35hca6CV8rRDJ8GXuQJP5CCVWA1ZUCrb9xYP7Js/RkLqnNNwKhe+Zsw== + dependencies: + "@types/retry" "*" + +"@types/aws-lambda@^8.10.92": + version "8.10.92" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.92.tgz#645f769ff88b8eba1acd35542695ac322c7757c4" + integrity sha512-dB14TltT1SNq73z3MaZfKyyBZ37NAgAFl8jze59bisR4fJ6pB6AYGxItHFkooZbN7UcVJX/cFudM4p8wp1W4rA== + +"@types/axios@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@types/axios/-/axios-0.14.0.tgz#ec2300fbe7d7dddd7eb9d3abf87999964cafce46" + integrity sha1-7CMA++fX3d1+udOr+HmZlkyvzkY= + dependencies: + axios "*" + +"@types/bn.js@^4.11.5": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/body-parser@*", "@types/body-parser@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bs58@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37" + integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== + dependencies: + base-x "^3.0.6" + +"@types/cacheable-request@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + +"@types/chai@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" + integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== + +"@types/connect@*", "@types/connect@^3.4.33": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cors@2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/express-serve-static-core@4.17.28", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.9": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express-validator@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/express-validator/-/express-validator-3.0.0.tgz#e6f3cab842e5ae376a1cfa11295202ec380b68d1" + integrity sha512-LusnB0YhTXpBT25PXyGPQlK7leE1e41Vezq1hHEUwjfkopM1Pkv2X2Ppxqh9c+w/HZ6Udzki8AJotKNjDTGdkQ== + dependencies: + express-validator "*" + +"@types/express@4.17.13", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graphql-fields@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/graphql-fields/-/graphql-fields-1.3.4.tgz#868ffe444ba8027ea1eccb0909f9c331d1bd620a" + integrity sha512-McLJaAaqY7lk9d9y7E61iQrj0AwcEjSb8uHlPh7KgYV+XX1MSLlSt/alhd5k2BPRE8gy/f4lnkLGb5ke3iG66Q== + dependencies: + graphql "^15.3.0" + +"@types/hapi__joi@^17.1.8": + version "17.1.8" + resolved "https://registry.yarnpkg.com/@types/hapi__joi/-/hapi__joi-17.1.8.tgz#78b3d22c4c9e62709894abd8c664508051f29e6b" + integrity sha512-omVytnOAiAfzGUOQArujJr3heWxPrDHW7MF1ieqix1ngoGdhtJmSSDFVM+ZAOa7UmhlGJtltdgUAT03mfDu6kg== + +"@types/helmet@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/helmet/-/helmet-4.0.0.tgz#af7af46de26abe368b85360769ae9938bfb2318a" + integrity sha512-ONIn/nSNQA57yRge3oaMQESef/6QhoeX7llWeDli0UZIfz8TQMkfNPTXA8VnnyeA1WUjG2pGqdjEIueYonMdfQ== + dependencies: + helmet "*" + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + +"@types/http-errors@^1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" + integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== + +"@types/js-yaml@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" + integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + +"@types/json-stable-stringify@^1.0.32": + version "1.0.33" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz#099b0712d824d15e2660c20e1c16e6a8381f308c" + integrity sha512-qEWiQff6q2tA5gcJGWwzplQcXdJtm+0oy6IHGHzlOf3eFAkGE/FIPXZK9ofWgNSHVp8AFFI33PJJshS0ei3Gvw== + +"@types/jsonwebtoken@^8.5.0": + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" + integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== + dependencies: + "@types/node" "*" + +"@types/keyv@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" + integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.159": + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== + +"@types/long@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/mocha@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" + integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== + +"@types/multistream@^2.1.1": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/multistream/-/multistream-2.1.2.tgz#c168a7765cc33926cd93e895bd7d461c5235eca7" + integrity sha512-Q0LINZC7Q2HE+M7uMh2QZp54F/4wz+8Vs6IEXCmeboxb3EScvqczARXPmGjP8GrEbLf68haIUjfWuQw9/kB63w== + dependencies: + "@types/node" "*" + +"@types/node-cron@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.1.tgz#e01a874d4c2aa1a02ebc64cfd1cd8ebdbad7a996" + integrity sha512-BkMHHonDT8NJUE/pQ3kr5v2GLDKm5or9btLBoBx4F2MB2cuqYC748LYMDC55VlrLI5qZZv+Qgc3m4P3dBPcmeg== + +"@types/node-fetch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-3.0.3.tgz#9d969c9a748e841554a40ee435d26e53fa3ee899" + integrity sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g== + dependencies: + node-fetch "*" + +"@types/node@*", "@types/node@^17.0.12": + version "17.0.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.12.tgz#f7aa331b27f08244888c47b7df126184bc2339c5" + integrity sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA== + +"@types/node@^10.1.0": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/node@^12.12.54": + version "12.20.42" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.42.tgz#2f021733232c2130c26f9eabbdd3bfd881774733" + integrity sha512-aI3/oo5DzyiI5R/xAhxxRzfZlWlsbbqdgxfTPkqu/Zt+23GXiJvMCyPJT4+xKSXOnLqoL8jJYMLTwvK2M3a5hw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/pg@^8.6.4": + version "8.6.4" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.4.tgz#da1ae9d2f53f2dbfdd2b37e0eb478bf60d517f60" + integrity sha512-uYA7UMVzDFpJobCrqwW/iWkFmvizy6knIUgr0Quaw7K1Le3ZnF7hI3bKqFoxPZ+fju1Sc7zdTvOl9YfFZPcmeA== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + +"@types/pump@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/pump/-/pump-1.1.1.tgz#edb3475e2bad0f4552bdaa91c6c43b82e08ff15e" + integrity sha512-wpRerjHDxFBQ4r8XNv3xHJZeuqrBBoeQ/fhgkooV2F7KsPIYRROb/+f9ODgZfOEyO5/w2ej4YQdpPPXipT8DAA== + dependencies: + "@types/node" "*" + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/retry@*": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/secp256k1@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/shortid@0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-0.0.29.tgz#8093ee0416a6e2bf2aa6338109114b3fbffa0e9b" + integrity sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps= + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/websocket@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8" + integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA== + dependencies: + "@types/node" "*" + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@types/ws@^8.0.0": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" + integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== + dependencies: + "@types/node" "*" + +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@wry/context@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" + integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" + integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139" + integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== + dependencies: + tslib "^2.3.0" + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +JSONStream@^1.0.3, JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@^1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.4.1: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-datasource@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.1.tgz#a1168dd68371930de3ed4245ad12fa8600efe2cc" + integrity sha512-Z3a8rEUXVPIZ1p8xrFL8bcNhWmhOmovgDArvwIwmJOBnh093ZpRfO+ESJEDAN4KswmyzCLDAwjsW4zQOONdRUw== + dependencies: + apollo-server-caching "^3.3.0" + apollo-server-env "^4.2.1" + +apollo-reporting-protobuf@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.0.tgz#2fc0f7508e488851eda8a6e7c8cc3b5a156ab44b" + integrity sha512-51Jwrg0NvHJfKz7TIGU8+Os3rUAqWtXeKRsRtKYtTeMSBPNhzz8UoGjAB3XyVmUXRE3IRmLtDPDRFL7qbxMI/w== + dependencies: + "@apollo/protobufjs" "1.2.2" + +apollo-server-caching@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz#f501cbeb820a4201d98c2b768c085f22848d9dc5" + integrity sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ== + dependencies: + lru-cache "^6.0.0" + +apollo-server-core@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.6.2.tgz#d9cbc3d0ba928d86a24640a485f4601b89b485fd" + integrity sha512-GNx41BnpH/yvGv7nTt4bQXuH5BDVs9CBQawfOcgtVdoVoWkazv1Dwy1muqPa7WDt2rk9oY+P6QymtJpBAtmzhg== + dependencies: + "@apollographql/apollo-tools" "^0.5.1" + "@apollographql/graphql-playground-html" "1.6.29" + "@graphql-tools/mock" "^8.1.2" + "@graphql-tools/schema" "^8.0.0" + "@josephg/resolvable" "^1.0.0" + apollo-datasource "^3.3.1" + apollo-reporting-protobuf "^3.3.0" + apollo-server-caching "^3.3.0" + apollo-server-env "^4.2.1" + apollo-server-errors "^3.3.1" + apollo-server-plugin-base "^3.5.1" + apollo-server-types "^3.5.1" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.1.0" + graphql-tag "^2.11.0" + lodash.sortby "^4.7.0" + loglevel "^1.6.8" + lru-cache "^6.0.0" + sha.js "^2.4.11" + uuid "^8.0.0" + +apollo-server-env@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" + integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== + dependencies: + node-fetch "^2.6.7" + +apollo-server-errors@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" + integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== + +apollo-server-express@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.6.2.tgz#859022b95247e1329e1ed96425c10143598b8fd7" + integrity sha512-C/guyWmewY/7rjI1Y2Fdpvq0TgF3F/7kTWcGzQhRe/h31ehvFFCeulrmxJ0MEpnIPB3eX7WHS2DZnyuJplsHKQ== + dependencies: + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.19.2" + "@types/cors" "2.8.12" + "@types/express" "4.17.13" + "@types/express-serve-static-core" "4.17.28" + accepts "^1.3.5" + apollo-server-core "^3.6.2" + apollo-server-types "^3.5.1" + body-parser "^1.19.0" + cors "^2.8.5" + parseurl "^1.3.3" + +apollo-server-plugin-base@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.5.1.tgz#73fc1591522e36e32eff3d033975333e30cf1a7c" + integrity sha512-wgDHz3lLrCqpecDky3z6AOQ0vik0qs0Cya/Ti6n3ESYXJ9MdK3jE/QunATIrOYYJaa+NKl9V7YwU+/bojNfFuQ== + dependencies: + apollo-server-types "^3.5.1" + +apollo-server-types@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.5.1.tgz#73fc8aa82b3175fde3906fa3d6786ee4d3e8c982" + integrity sha512-zG7xLl4mmHuZMAYOfjWKHY/IC/GgIkJ3HnYuR7FRrnPpRA9Yt5Kf1M1rjm1Esuqzpb/dt8pM7cX40QaIQObCYQ== + dependencies: + apollo-reporting-protobuf "^3.3.0" + apollo-server-caching "^3.3.0" + apollo-server-env "^4.2.1" + +arbundles@^0.6.13: + version "0.6.13" + resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.6.13.tgz#d70a9940812e1982995509464effbbe8ac740927" + integrity sha512-jJdUOYFzSu4H7Fv9XjSIIV7rBbrijjryw6eHZgSvZydWbuqQCE9gGfjPi0Igw4j7shydp3VzhlbRYwGVGpGEuQ== + dependencies: + "@solana/wallet-adapter-base" "^0.9.2" + "@types/axios" "^0.14.0" + "@types/bs58" "^4.0.1" + "@types/multistream" "^2.1.1" + "@types/secp256k1" "^4.0.3" + arweave "^1.10.18" + arweave-stream-tx "^1.1.0" + avro-js "^1.11.0" + axios "^0.21.3" + base64url "^3.0.1" + bs58 "^4.0.1" + ethers "^5.5.1" + keccak256 "^1.0.3" + multistream "^4.1.0" + noble-ed25519 "^1.2.6" + process "^0.11.10" + secp256k1 "^4.0.2" + tmp-promise "^3.0.2" + tslib "^2.3.0" + +arconnect@^0.2.8: + version "0.2.9" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.2.9.tgz#be07d2281f20d864a91cdcb44e3eed7fccb97f12" + integrity sha512-Us49eN/+8l6BrkAPdXnJVPwWlxxUPR7QaBjA0j3OBAcioIFRpwTdoPN9FxtwDGN91lgM6ebOudTXJToRiNizoA== + dependencies: + arweave "^1.10.13" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arweave-stream-tx@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.1.0.tgz#288fbaee30f6aa5cadb0b7cd2efd5b34147e867f" + integrity sha512-1BEYGFSP+FP1ACfclTjSjSTWx5PV/7a+0TwGZu+MlkmnnZTQ3hCOr5Md2Pi/T6dc69Fj+BRezSckiIhKFwTc3g== + dependencies: + exponential-backoff "^3.1.0" + stream-chunker "^1.2.8" + +arweave@^1.10.13, arweave@^1.10.18, arweave@^1.10.23: + version "1.10.23" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.10.23.tgz#6edc056026d6c11ec47d817bb2c4f6d8fb8c65e5" + integrity sha512-lAeCopS9iNGhmJkUovWqb7R+JEF83LP8f51rG+H98JPI9KQVRJYtM5NmMMU8auDtOzvBPTZ7me1pYn/CfS3VTg== + dependencies: + arconnect "^0.2.8" + asn1.js "^5.4.1" + axios "^0.22.0" + base64-js "^1.3.1" + bignumber.js "^9.0.1" + util "^0.12.4" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0, asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async-retry@^1.2.1, async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +avro-js@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/avro-js/-/avro-js-1.11.0.tgz#fb4613f05e4df5b88c8b631ec400fbb82ea65ec5" + integrity sha512-ndeGph6lECwNvIcpA4YfRxMaZNMR/Eiw+QX77ibxouYm+jC51Ha2aAIxYD6eg1EABlQU5yErprtA+N2YP3G2BQ== + dependencies: + underscore "^1.12.0" + +aws-sdk@^2.1063.0: + version "2.1063.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1063.0.tgz#ab5e7f69955358a48be345ee3d76667a68f61dd6" + integrity sha512-UonfKdsDChKEmAkFuDOQ8zeilvR5v7d5dEcWDy+fnKBs+6HGjDThMf7EofhOiKxOXWnFhrAsFKCsKDcfeA6NBg== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + uuid "3.3.2" + xml2js "0.4.19" + +axios@*: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axios@^0.21.3: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25" + integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w== + dependencies: + follow-redirects "^1.14.4" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-import-to-require@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-import-to-require/-/babel-plugin-import-to-require-1.0.0.tgz#432b9ee7fe9d77de03e849247c78a6e51fb18009" + integrity sha512-dc843CwrFivjO8AVgxcHvxl0cb7J7Ed8ZGFP8+PjH3X1CnyzYtAU1WL1349m9Wc/+oqk4ETx2+cIEO2jlp3XyQ== + dependencies: + babel-template "^6.26.0" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2, base-x@^3.0.6: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bignumber.js@^9.0.1: + version "9.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" + integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.19.1, body-parser@^1.19.0, body-parser@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== + dependencies: + bytes "3.1.1" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" + +borsh@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" + integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== + dependencies: + "@types/bn.js" "^4.11.5" + bn.js "^5.0.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserify@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" + integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.1" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^3.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.2.1" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "^1.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum-object "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^3.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.12.0" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserslist@^4.17.5: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal-constant-time@1.0.1: + 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-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@^5.5.0, buffer@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +bufferutil@^4.0.1, bufferutil@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" + integrity sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001286: + version "1.0.30001302" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001302.tgz#da57ce61c51177ef3661eeed7faef392d3790aaa" + integrity sha512-YYTMO+tfwvgUN+1ZnRViE53Ma1S/oETg+J2lISsqi/ZTNThj3ZYBOKP2rHwJc37oCsPqAzJ3w2puZHn0xlLPPw== + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +chai@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case-all@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" + integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.5.3, chokidar@^3.5.1, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +cloneable-readable@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-2.1.0.tgz#865742bfdcd3782e5fdd98d659aa06b575938c09" + integrity sha512-GP0FuTTREdvgNQwJzvLVcPCrHwsryC/KSrDlrWM3nyXpvskmAwT55G8LwQpjS5VHrZfaeqABwSOdYBuuqUzRfQ== + dependencies: + inherits "^2.0.1" + readable-stream "^3.3.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-tags@1.8.2, common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@^1.6.2, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-hex@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/convert-hex/-/convert-hex-0.1.0.tgz#08c04568922c27776b8a2e81a95d393362ea0b65" + integrity sha1-CMBFaJIsJ3drii6BqV05M2LqC2U= + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= + +convert-string@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/convert-string/-/convert-string-0.1.0.tgz#79ce41a9bb0d03bcf72cdc6a8f3c56fbbc64410a" + integrity sha1-ec5BqbsNA7z3LNxqjzxW+7xkQQo= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig-toml-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-toml-loader/-/cosmiconfig-toml-loader-1.0.0.tgz#0681383651cceff918177debe9084c0d3769509b" + integrity sha512-H/2gurFWVi7xXvCyvsWRLCMekl4tITJcX0QEsDMpzxtuxDyM59xLatYNg4s/k9AA/HdtCYfj2su8mgA0GSDLDA== + dependencies: + "@iarna/toml" "^2.2.5" + +cosmiconfig@7.0.1, cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-undici-fetch@^0.1.19: + version "0.1.19" + resolved "https://registry.yarnpkg.com/cross-undici-fetch/-/cross-undici-fetch-0.1.19.tgz#1bef41652c33ec812b51cd3b4e1295114cd62d4c" + integrity sha512-bNBuesVn09Iy15mAM/hpt97fLWSexblVYpUYa5FjbtLHA7om9w3g1uRGGwrEnmVxy3wouNvZyJwQzAPHXgOrxQ== + dependencies: + abort-controller "^3.0.0" + form-data-encoder "^1.7.1" + formdata-node "^4.3.1" + node-fetch "^2.6.7" + undici "^4.9.3" + web-streams-polyfill "^3.2.0" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= + +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + +data-uri-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== + +dataloader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f" + integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ== + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.3, debug@^4.1.0, debug@^4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +deps-sort@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== + dependencies: + JSONStream "^1.0.3" + shasum-object "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +dotenv@^14.3.2: + version "14.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.3.2.tgz#7c30b3a5f777c79a3429cb2db358eef6751e8369" + integrity sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ== + +dset@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.1.tgz#07de5af7a8d03eab337ad1a8ba77fe17bba61a8c" + integrity sha512-hYf+jZNNqJBD2GiMYb+5mqOIX4R4RRHXU3qWMWYN+rqcR2/YpRL2bUHr8C8fU+5DNvqYjJ8YvMGSLuVPWU1cNg== + +duplexer2@^0.1.2, duplexer2@^0.1.4, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" + integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= + dependencies: + xtend "^4.0.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.4.17: + version "1.4.53" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.53.tgz#5d80a91c399b44952ef485857fb5b9d4387d2e60" + integrity sha512-rFveSKQczlcav+H3zkKqykU6ANseFwXwkl855jOIap5/0gnEcuIhv2ecz6aoTrXavF6I/CEBeRnBnkB51k06ew== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +elliptic@6.5.4, elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + 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== + dependencies: + once "^1.4.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.5: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +esmify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/esmify/-/esmify-2.1.1.tgz#bb788a8b347739d003c873d9eddf9724bbf032b3" + integrity sha512-GyOVgjG7sNyYB5Mbo15Ll4aGrcXZzZ3LI22rbLOjCI7L/wYelzQpBHRZkZkqbPNZ/QIRilcaHqzgNCLcEsi1lQ== + dependencies: + "@babel/core" "^7.2.2" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + babel-plugin-import-to-require "^1.0.0" + cached-path-relative "^1.0.2" + concat-stream "^1.6.2" + duplexer2 "^0.1.4" + through2 "^2.0.5" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +ethers@^5.5.1, ethers@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.4.tgz#e1155b73376a2f5da448e4a33351b57a885f4352" + integrity sha512-N9IAXsF8iKhgHIC6pquzRgPBJEzc9auw3JoRkaKe+y4Wl/LFBtDDunNe7YmdomontECAcC5APaAgWZBiu1kirw== + dependencies: + "@ethersproject/abi" "5.5.0" + "@ethersproject/abstract-provider" "5.5.1" + "@ethersproject/abstract-signer" "5.5.0" + "@ethersproject/address" "5.5.0" + "@ethersproject/base64" "5.5.0" + "@ethersproject/basex" "5.5.0" + "@ethersproject/bignumber" "5.5.0" + "@ethersproject/bytes" "5.5.0" + "@ethersproject/constants" "5.5.0" + "@ethersproject/contracts" "5.5.0" + "@ethersproject/hash" "5.5.0" + "@ethersproject/hdnode" "5.5.0" + "@ethersproject/json-wallets" "5.5.0" + "@ethersproject/keccak256" "5.5.0" + "@ethersproject/logger" "5.5.0" + "@ethersproject/networks" "5.5.2" + "@ethersproject/pbkdf2" "5.5.0" + "@ethersproject/properties" "5.5.0" + "@ethersproject/providers" "5.5.3" + "@ethersproject/random" "5.5.1" + "@ethersproject/rlp" "5.5.0" + "@ethersproject/sha2" "5.5.0" + "@ethersproject/signing-key" "5.5.0" + "@ethersproject/solidity" "5.5.0" + "@ethersproject/strings" "5.5.0" + "@ethersproject/transactions" "5.5.0" + "@ethersproject/units" "5.5.0" + "@ethersproject/wallet" "5.5.0" + "@ethersproject/web" "5.5.1" + "@ethersproject/wordlists" "5.5.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +eventemitter3@^4.0.0, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exponential-backoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.0.tgz#9409c7e579131f8bd4b32d7d8094a911040f2e68" + integrity sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA== + +express-async-errors@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/express-async-errors/-/express-async-errors-3.1.1.tgz#6053236d61d21ddef4892d6bd1d736889fc9da41" + integrity sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng== + +express-async-handler@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/express-async-handler/-/express-async-handler-1.2.0.tgz#ffc9896061d90f8d2e71a2d2b8668db5b0934391" + integrity sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w== + +express-promise-router@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/express-promise-router/-/express-promise-router-4.1.1.tgz#8fac102060b9bcc868f84d34fbb12fd8fa494291" + integrity sha512-Lkvcy/ZGrBhzkl3y7uYBHLMtLI4D6XQ2kiFg9dq7fbktBch5gjqJ0+KovX0cvCAvTJw92raWunRLM/OM+5l4fA== + dependencies: + is-promise "^4.0.0" + lodash.flattendeep "^4.0.0" + methods "^1.0.0" + +express-validator@*, express-validator@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-6.14.0.tgz#8ee7a32bf1ffcf2573db5f17c9cad279698e5d41" + integrity sha512-ZWHJfnRgePp3FKRSKMtnZVnD1s8ZchWD+jSl7UMseGIqhweCo1Z9916/xXBbJAa6PrA3pUZfkOvIsHZG4ZtIMw== + dependencies: + lodash "^4.17.21" + validator "^13.7.0" + +express@^4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.4.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.9.6" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-files@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" + integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== + +extract-files@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" + integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.2.tgz#dfae08a85c66a58372993ce2caf30863f569ff94" + integrity sha512-qv+boqYndjElAJHNN3NoM8XuwQZ1j2m3kEvTgdle8IDjr6oUbkEpvABWtj/rQl3vq4ew7dnElBxL4YJAwTVqQQ== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +fecha@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" + integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q== + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.4.tgz#e8c6567f80ad7fc22fd302e7dcb72bafde9c1717" + integrity sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.14.0, follow-redirects@^1.14.4, follow-redirects@^1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +form-data-encoder@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formdata-node@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.3.2.tgz#0262e94931e36db7239c2b08bdb6aaf18ec47d21" + integrity sha512-k7lYJyzDOSL6h917favP8j1L0/wNyylzU+x+1w4p5haGVHNlP58dbpdJhiCUsDbWsa9HwEtLp89obQgXl2e0qg== + dependencies: + node-domexception "1.0.0" + web-streams-polyfill "4.0.0-beta.1" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +getopts@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" + integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0, glob@^7.1.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@^11.0.3, globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +got@11.x: + version "11.8.3" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" + integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +graphql-config@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-4.1.0.tgz#a3b28d3fb537952ebeb69c75e4430605a10695e3" + integrity sha512-Myqay6pmdcmX3KqoH+bMbeKZ1cTODpHS2CxF1ZzNnfTE+YUpGTcp01bOw6LpzamRb0T/WTYtGFbZeXGo9Hab2Q== + dependencies: + "@endemolshinegroup/cosmiconfig-typescript-loader" "3.0.2" + "@graphql-tools/graphql-file-loader" "^7.3.2" + "@graphql-tools/json-file-loader" "^7.3.2" + "@graphql-tools/load" "^7.4.1" + "@graphql-tools/merge" "^8.2.1" + "@graphql-tools/url-loader" "^7.4.2" + "@graphql-tools/utils" "^8.5.1" + cosmiconfig "7.0.1" + cosmiconfig-toml-loader "1.0.0" + minimatch "3.0.4" + string-env-interpolation "1.0.1" + +graphql-fields@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/graphql-fields/-/graphql-fields-2.0.3.tgz#5e68dff7afbb202be4f4f40623e983b22c96ab8f" + integrity sha512-x3VE5lUcR4XCOxPIqaO4CE+bTK8u6gVouOdpQX9+EKHr+scqtK5Pp/l8nIGqIpN1TUlkKE6jDCCycm/WtLRAwA== + +graphql-request@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.7.0.tgz#c7406e537084f8b9788541e3e6704340ca13055b" + integrity sha512-dw5PxHCgBneN2DDNqpWu8QkbbJ07oOziy8z+bK/TAXufsOLaETuVO4GkXrbs0WjhdKhBMN3BkpN/RIvUHkmNUQ== + dependencies: + cross-fetch "^3.0.6" + extract-files "^9.0.0" + form-data "^3.0.0" + +graphql-sse@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/graphql-sse/-/graphql-sse-1.0.6.tgz#4f98e0a06f2020542ed054399116108491263224" + integrity sha512-y2mVBN2KwNrzxX2KBncQ6kzc6JWvecxuBernrl0j65hsr6MAS3+Yn8PTFSOgRmtolxugepxveyZVQEuaNEbw3w== + +graphql-tag@^2.11.0, graphql-tag@^2.12.3: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql-tools@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-8.2.0.tgz#493edc2760469f39d8334c6f20aa75ae91a7ab86" + integrity sha512-9axT/0exEzVCk+vMPykOPannlrA4VQNo6nuWgh25IJ5arPf92OKxvjSHAbm7dQIFmcWxE0hVvyD2rWHjDqZCgQ== + dependencies: + "@graphql-tools/schema" "^8.2.0" + tslib "~2.3.0" + optionalDependencies: + "@apollo/client" "~3.2.5 || ~3.3.0 || ~3.4.0" + +graphql-ws@^5.4.1: + version "5.5.5" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.5.tgz#f375486d3f196e2a2527b503644693ae3a8670a9" + integrity sha512-hvyIS71vs4Tu/yUYHPvGXsTgo0t3arU820+lT5VjZS2go0ewp2LqyCgxEN56CzOG7Iys52eRhHBiD1gGRdiQtw== + +graphql@^15.3.0: + version "15.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + +graphql@^16.2.0: + version "16.3.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.3.0.tgz#a91e24d10babf9e60c706919bb182b53ccdffc05" + integrity sha512-xm+ANmA16BzCT5pLjuXySbQVFwH3oJctUVdy81w1sV0vBU0KgDdBGtxQOUd5zqOBk/JayAFeG8Dlmeq74rjm/A== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + +helmet@*, helmet@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-5.0.2.tgz#3264ec6bab96c82deaf65e3403c369424cb2366c" + integrity sha512-QWlwUZZ8BtlvwYVTSDTBChGf8EOcQ2LkGMnQJxSzD1mUu8CCjXJZq/BXP8eWw4kikRnzlhtYo3lCk0ucmYA3Vg== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks= + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= + dependencies: + source-map "~0.5.3" + +inquirer@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" + integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.2.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +insert-module-globals@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" + integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@4.0.3, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +iterall@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +jayson@^3.4.4: + version "3.6.6" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" + integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/express-serve-static-core" "^4.17.9" + "@types/lodash" "^4.14.159" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^8.3.2" + ws "^7.4.5" + +jmespath@0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" + integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@4.1.0, js-yaml@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json-to-pretty-yaml@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" + integrity sha1-9M0L0KXo/h3yWq9boRiwmf2ZLVs= + dependencies: + remedial "^1.0.7" + remove-trailing-spaces "^1.0.6" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + 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" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + 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 sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keccak256@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.6.tgz#dd32fb771558fed51ce4e45a035ae7515573da58" + integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw== + dependencies: + bn.js "^5.2.0" + buffer "^6.0.3" + keccak "^3.0.2" + +keccak@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.5.tgz#bb12b467aba372fab2a44d4420c00d3c4ebd484c" + integrity sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA== + dependencies: + json-buffer "3.0.1" + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +knex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/knex/-/knex-1.0.1.tgz#0916dc2b79375cd15bfbf0d70bf3c5ef5f411a33" + integrity sha512-pusgMo74lEbUxmri+YfWV8x/LJacP/2KcemTCKH7WnXFYz5RoMi+8WM4OJ05b0glfF+aWB4nkFsxsXxJ8qioLQ== + dependencies: + colorette "2.0.16" + commander "^8.3.0" + debug "4.3.3" + escalade "^3.1.1" + esm "^3.2.25" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.5.0" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +labeled-stream-splicer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== + dependencies: + inherits "^2.0.1" + stream-splicer "^2.0.0" + +latest-version@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.flattendeep@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.get@^4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +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@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= + +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" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +logform@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.3.2.tgz#68babe6a74ab09a1fd15a9b1e6cbc7713d41cb5b" + integrity sha512-V6JiPThZzTsbVRspNO6TmHkR99oqYTs8fivMBYQkjZj6rxW92KxtDCPE6IkAk1DNBnYKNkjm4jYBm6JDUcyhOA== + dependencies: + colors "1.4.0" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^1.1.0" + triple-beam "^1.3.0" + +loglevel@^1.6.8: + version "1.8.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.0.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.1.tgz#a2e1192c9f452e4e85089766da10ac8288383947" + integrity sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA== + dependencies: + get-func-name "^2.0.0" + +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-error@^1, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +meros@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948" + integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ== + +methods@^1.0.0, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^3.0.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mocha@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.0.tgz#2bfba73d46e392901f877ab9a47b7c9c5d0275cc" + integrity sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.2.0" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +module-deps@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" + integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^2.0.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.2.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +moment-timezone@^0.5.31: + version "0.5.34" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" + integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0", moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@3.2.0, nanoid@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +nanoid@^2.1.0: + version "2.1.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" + integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +noble-ed25519@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/noble-ed25519/-/noble-ed25519-1.2.6.tgz#a55b75c61da000498abb43ffd81caaa370bfed22" + integrity sha512-zfnWqg9FVMp8CnzUpAjbt1nDXpDjCvxYiCXdnW1mY8zQHw/6twUlkFm14VPdojVzc0kcd+i9zT79+26GcNbsuQ== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-cron@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.0.tgz#b33252803e430f9cd8590cf85738efa1497a9522" + integrity sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA== + dependencies: + moment-timezone "^0.5.31" + +node-domexception@1.0.0, node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@*: + version "3.2.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.0.tgz#59390db4e489184fa35d4b74caf5510e8dfbaf3b" + integrity sha512-8xeimMwMItMw8hRrOl3C9/xzU49HV/yE6ORew/l+dxWimO5A4Ra8ld2rerlJvc/O7et5Z1zrWsPX43v1QBjCxw== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-fetch@2.6.7, node-fetch@2.x, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +optimism@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-limit@3.1.0, p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@^1.3.3, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +patch-package@^6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" + integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= + dependencies: + process "^0.11.1" + util "^0.10.3" + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pg-connection-string@2.5.0, pg-connection-string@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" + integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== + +pg-cursor@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/pg-cursor/-/pg-cursor-2.7.1.tgz#0c545b70006589537232986fa06c03a799d8f22b" + integrity sha512-dtxtyvx4BcSammddki27KPBVA0sZ8AguLabgs7++gqaefX7dlQ5zaRlk1Gi5mvyO25aCmHFAZyNq9zYtPDwFTA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" + integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== + +pg-protocol@*, pg-protocol@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0" + integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== + +pg-query-stream@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/pg-query-stream/-/pg-query-stream-4.2.1.tgz#e69d8c9a3cc5aa43d0943bdee63dfb2af9763c36" + integrity sha512-8rOjGPgerzYmfRnX/EYhWiI7OVI17BGM3PxsI8o/Ot8IDyFMy8cf2xG5S9XpVPgkAjBs8c47vSclKuJqlN2c9g== + dependencies: + pg-cursor "^2.7.1" + +pg-types@^2.1.0, pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" + integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.5.0" + pg-pool "^3.4.1" + pg-protocol "^1.5.0" + pg-types "^2.1.0" + pgpass "1.x" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.1, process@^0.11.10, process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +qs@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +ramda@^0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97" + integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== + dependencies: + bytes "3.1.1" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= + dependencies: + readable-stream "^2.0.2" + +readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.3.0, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +relay-compiler@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-12.0.0.tgz#9f292d483fb871976018704138423a96c8a45439" + integrity sha512-SWqeSQZ+AMU/Cr7iZsHi1e78Z7oh00I5SvR092iCJq79aupqJ6Ds+I1Pz/Vzo5uY5PY0jvC4rBJXzlIN5g9boQ== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +relay-runtime@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" + integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + invariant "^2.2.4" + +remedial@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" + integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +remove-trailing-spaces@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" + integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== + +replaceall@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" + integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.0.0, resolve@^1.1.4, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.4.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfc4648@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.5.1.tgz#b0b16756e33d9de8c0c7833e94b28e627ec372a4" + integrity sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw== + +rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rpc-websockets@^7.4.2: + version "7.4.16" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.16.tgz#eb701cdef577d4357ba5f526d50e25f370396fac" + integrity sha512-0b7OVhutzwRIaYAtJo5tqtaQTWKfwAsKnaThOSOy+VkhVdleNUgb8eZnWSdWITRZZEigV5uPEIDr5KZe4DBrdQ== + dependencies: + "@babel/runtime" "^7.11.2" + circular-json "^0.5.9" + eventemitter3 "^4.0.7" + uuid "^8.3.0" + ws "^7.4.5" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.3.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.2.0: + version "7.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b" + integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-stable-stringify@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +scuid@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" + integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== + +secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver@*: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha256@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sha256/-/sha256-0.2.0.tgz#73a0b418daab7035bff86e8491e363412fc2ab05" + integrity sha1-c6C0GNqrcDW/+G6EkeNjQS/CqwU= + dependencies: + convert-hex "~0.1.0" + convert-string "~0.1.0" + +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +shortid@^2.2.16: + version "2.2.16" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.16.tgz#b742b8f0cb96406fd391c76bfc18a67a57fe5608" + integrity sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g== + dependencies: + nanoid "^2.1.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo= + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.12, source-map-support@^0.5.17: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0, source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== + +sponge-case@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" + integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== + dependencies: + tslib "^2.0.3" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-chunker@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/stream-chunker/-/stream-chunker-1.2.8.tgz#eb3af2c8aee5256cde76f0a1fea86348336d04f7" + integrity sha1-6zryyK7lJWzedvCh/qhjSDNtBPc= + dependencies: + through2 "~2.0.0" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-http@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +string-env-interpolation@1.0.1, string-env-interpolation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" + integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + +subscriptions-transport-ws@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz#baf88f050cba51d52afe781de5e81b3c31f89883" + integrity sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0 || ^6.0.0 || ^7.0.0" + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +swap-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" + integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== + dependencies: + tslib "^2.0.3" + +symbol-observable@^1.0.4, symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +sync-fetch@0.3.1, sync-fetch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/sync-fetch/-/sync-fetch-0.3.1.tgz#62aa82c4b4d43afd6906bfd7b5f92056458509f0" + integrity sha512-xj5qiCDap/03kpci5a+qc5wSJjc8ZSixgG2EUmH1B8Ea2sfWclQA7eH40hiHPCtkCn6MCk4Wb+dqcXdCy2PP3g== + dependencies: + buffer "^5.7.0" + node-fetch "^2.6.1" + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + +tar@^6.1.11: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tarn@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" + integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +through2@^2.0.0, through2@^2.0.5, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +"through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= + dependencies: + process "~0.11.0" + +title-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== + dependencies: + tslib "^2.0.3" + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +triple-beam@^1.2.0, triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +ts-invariant@^0.9.0: + version "0.9.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.4.tgz#42ac6c791aade267dd9dc65276549df5c5d71cac" + integrity sha512-63jtX/ZSwnUNi/WhXjnK8kz4cHHpYS60AnmA6ixz17l7E12a5puCWFlNpkne5Rl0J8TBPVHpGjsj4fxs8ObVLQ== + dependencies: + tslib "^2.1.0" + +ts-log@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.4.tgz#d672cf904b33735eaba67a7395c93d45fba475b3" + integrity sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ== + +ts-node-dev@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066" + integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.5" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^9.0.0" + tsconfig "^7.0.0" + +ts-node@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" + integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + +ts-node@^9, ts-node@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tweetnacl@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@4.x: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +umd@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +undeclared-identifiers@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== + dependencies: + acorn-node "^1.3.0" + dash-ast "^1.0.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + +underscore@^1.12.0: + version "1.13.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881" + integrity sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g== + +undici@^4.9.3: + version "4.12.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-4.12.2.tgz#f2fc50ca77a774ed8c0e7067c9361ee18a2f422b" + integrity sha512-RZj6SbkQFs5O/pJCboGEo6l5DTCe3Zg4r/8Z/0/2qnIv08+s6zL4akohOPMYWKc3mzwv15WTvsfMWaafZcvYoQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA= + dependencies: + normalize-path "^2.1.1" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +utf-8-validate@^5.0.2, utf-8-validate@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" + integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== + dependencies: + node-gyp-build "^4.3.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.12.4, util@~0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@3.3.2, uuid@7.x, uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + +valid-url@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= + +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +value-or-promise@1.0.11, value-or-promise@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" + integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vm-browserify@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +web-streams-polyfill@4.0.0-beta.1: + version "4.0.0-beta.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95" + integrity sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ== + +web-streams-polyfill@^3.0.3, web-streams-polyfill@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" + integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +winston-transport@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.2.tgz#554efe3fce229d046df006e0e3c411d240652e51" + integrity sha512-9jmhltAr5ygt5usgUTQbEiw/7RYXpyUbEAFRCSicIacpUzPkrnQsQZSPGEI12aLK9Jth4zNcYJx3Cvznwrl8pw== + dependencies: + logform "^2.3.2" + readable-stream "^3.4.0" + triple-beam "^1.2.0" + +winston@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.4.0.tgz#7080f24b02a0684f8a37f9d5c6afb1ac23e95b84" + integrity sha512-FqilVj+5HKwCfIHQzMxrrd5tBIH10JTS3koFGbLVWBODjiIYq7zir08rFyBT4rrTYG/eaTqDcfSIbcjSM78YSw== + dependencies: + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.3.2" + one-time "^1.0.0" + readable-stream "^3.4.0" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.4.2" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.4.5: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +ws@^8.3.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" + integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xss@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.10.tgz#5cd63a9b147a755a14cb0455c7db8866120eb4d2" + integrity sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml-ast-parser@^0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^17.0.0: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zen-observable-ts@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==