diff options
| author | Max Audron <audron@cocaine.farm> | 2023-08-11 16:51:35 +0200 |
|---|---|---|
| committer | Max Audron <audron@cocaine.farm> | 2023-08-11 16:51:35 +0200 |
| commit | 5828af9fc19e18dc85e49fcc1a251a7eb25d909c (patch) | |
| tree | c70c3e52237c08d3fdcb2f1269c524c25e3feeb8 /modules | |
init
Diffstat (limited to 'modules')
30 files changed, 6863 insertions, 0 deletions
diff --git a/modules/bgp/default.nix b/modules/bgp/default.nix new file mode 100644 index 0000000..79187da --- /dev/null +++ b/modules/bgp/default.nix @@ -0,0 +1,19 @@ +{ config, lib, pkgs, ... }: + +{ + networking.interfaces.eth0.ipv4.addresses = [ + { + address = "217.163.29.14"; + prefixLength = 32; + } + { + address = "209.250.238.254"; + prefixLength = 32; + } + ]; + + networking.interfaces.eth0.ipv6.addresses = [{ + address = "2a0f:9400:8020::"; + prefixLength = 48; + }]; +} diff --git a/modules/cri-o/default.nix b/modules/cri-o/default.nix new file mode 100644 index 0000000..0a1860a --- /dev/null +++ b/modules/cri-o/default.nix @@ -0,0 +1,159 @@ +{ config, lib, pkgs, utils, ... }: + +with lib; +let + cfg = config.virtualisation.cri-o; + + crioPackage = (pkgs.cri-o.override { inherit (cfg) extraPackages; }); + + format = pkgs.formats.toml { }; + + cfgFile = format.generate "00-default.conf" cfg.settings; +in +{ + imports = [ + (mkRenamedOptionModule [ "virtualisation" "cri-o" "registries" ] [ "virtualisation" "containers" "registries" "search" ]) + ]; + + meta = { + maintainers = teams.podman.members; + }; + + options.virtualisation.cri-o = { + enable = mkEnableOption "Container Runtime Interface for OCI (CRI-O)"; + + storageDriver = mkOption { + type = types.enum [ "btrfs" "overlay" "vfs" "zfs" ]; + default = "overlay"; + description = "Storage driver to be used"; + }; + + logLevel = mkOption { + type = types.enum [ "trace" "debug" "info" "warn" "error" "fatal" ]; + default = "info"; + description = "Log level to be used"; + }; + + pauseImage = mkOption { + type = types.nullOr types.str; + default = null; + description = "Override the default pause image for pod sandboxes"; + example = "k8s.gcr.io/pause:3.2"; + }; + + pauseCommand = mkOption { + type = types.nullOr types.str; + default = null; + description = "Override the default pause command"; + example = "/pause"; + }; + + runtime = mkOption { + type = types.nullOr types.str; + default = null; + description = "Override the default runtime"; + example = "crun"; + }; + + extraPackages = mkOption { + type = with types; listOf package; + default = [ ]; + example = literalExpression '' + [ + pkgs.gvisor + ] + ''; + description = '' + Extra packages to be installed in the CRI-O wrapper. + ''; + }; + + package = mkOption { + type = types.package; + default = crioPackage; + internal = true; + description = '' + The final CRI-O package (including extra packages). + ''; + }; + + networkDir = mkOption { + type = types.nullOr types.path; + default = null; + description = "Override the network_dir option."; + internal = true; + }; + + settings = mkOption { + type = format.type; + default = { }; + description = '' + Configuration for cri-o, see + <link xlink:href="https://github.com/cri-o/cri-o/blob/master/docs/crio.conf.5.md"/>. + ''; + }; + }; + + config = mkIf cfg.enable { + environment.systemPackages = [ cfg.package pkgs.cri-tools ]; + + environment.etc."crictl.yaml".source = utils.copyFile "${pkgs.cri-o-unwrapped.src}/crictl.yaml"; + + virtualisation.cri-o.settings.crio = { + storage_driver = cfg.storageDriver; + + image = { + pause_image = mkIf (cfg.pauseImage != null) cfg.pauseImage; + pause_command = mkIf (cfg.pauseCommand != null) cfg.pauseCommand; + }; + + network = { + plugin_dirs = [ "${pkgs.cni-plugins}/bin" ]; + network_dir = mkIf (cfg.networkDir != null) cfg.networkDir; + }; + + runtime = { + cgroup_manager = "systemd"; + log_level = cfg.logLevel; + manage_ns_lifecycle = true; + pinns_path = "${cfg.package}/bin/pinns"; + hooks_dir = + optional (config.virtualisation.containers.ociSeccompBpfHook.enable) + config.boot.kernelPackages.oci-seccomp-bpf-hook; + + default_runtime = mkIf (cfg.runtime != null) cfg.runtime; + runtimes = mkIf (cfg.runtime != null) { + "${cfg.runtime}" = { }; + }; + }; + }; + + environment.etc."cni/net.d/10-crio-bridge.conf".source = utils.copyFile "${pkgs.cri-o-unwrapped.src}/contrib/cni/10-crio-bridge.conf"; + environment.etc."cni/net.d/99-loopback.conf".source = utils.copyFile "${pkgs.cri-o-unwrapped.src}/contrib/cni/99-loopback.conf"; + environment.etc."crio/crio.conf.d/00-default.conf".source = cfgFile; + + # Enable common /etc/containers configuration + virtualisation.containers.enable = true; + + systemd.services.crio = { + description = "Container Runtime Interface for OCI (CRI-O)"; + documentation = [ "https://github.com/cri-o/cri-o" ]; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + path = [ cfg.package ]; + serviceConfig = { + Type = "notify"; + ExecStart = "${cfg.package}/bin/crio"; + ExecReload = "/bin/kill -s HUP $MAINPID"; + TasksMax = "infinity"; + LimitNOFILE = "1048576"; + LimitNPROC = "1048576"; + LimitCORE = "infinity"; + OOMScoreAdjust = "-999"; + TimeoutStartSec = "0"; + Restart = "on-abnormal"; + }; + restartTriggers = [ cfgFile ]; + }; + }; +} diff --git a/modules/crypto/default.nix b/modules/crypto/default.nix new file mode 100644 index 0000000..578fc0c --- /dev/null +++ b/modules/crypto/default.nix @@ -0,0 +1,90 @@ +{ pkgs, config, lib, ... }: + +with lib; + +let + cfg = config.secrets; + + secret = types.submodule { + options = { + source = mkOption { + type = types.path; + description = "local secret path"; + }; + + dest = mkOption { + type = types.str; + description = "where to write the decrypted secret to"; + }; + + owner = mkOption { + default = "root"; + type = types.str; + description = "who should own the secret"; + }; + + group = mkOption { + default = "root"; + type = types.str; + description = "what group should own the secret"; + }; + + permissions = mkOption { + default = "0400"; + type = types.str; + description = "Permissions expressed as octal."; + }; + }; + }; + + # metadata = lib.importTOML ../../ops/metadata/hosts.toml; + + mkSecretOnDisk = name: + { source, ... }: + pkgs.stdenv.mkDerivation { + name = "${name}-secret"; + phases = "installPhase"; + buildInputs = [ pkgs.rage ]; + installPhase = '' + rage -a -r '${config.pubKey}' -o "$out" '${source}' + ''; + }; + + mkService = name: + { source, dest, owner, group, permissions, ... }: { + description = "decrypt secret for ${name}"; + wantedBy = [ "multi-user.target" ]; + + serviceConfig.Type = "oneshot"; + + script = with pkgs; '' + rm -rf ${dest} + mkdir -p ${dirOf dest} + "${rage}"/bin/rage -d -i /etc/ssh/ssh_host_ed25519_key -o '${dest}' '${ + mkSecretOnDisk name { inherit source; } + }' + chown '${owner}':'${group}' '${dest}' + chmod '${permissions}' '${dest}' + ''; + }; +in { + options = { + pubKey = mkOption { + type = types.str; + description = "host public key used for encrypting secrets"; + }; + + secrets = mkOption { + type = types.attrsOf secret; + description = "secret configuration"; + default = { }; + }; + }; + + config.systemd.services = let + units = mapAttrs' (name: info: { + name = "${name}-key"; + value = (mkService name info); + }) cfg; + in units; +} diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 0000000..7f71fab --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,50 @@ +{ config, nixpkgs, pkgs, lib, ... }: + +{ + imports = [ + ./users + ./crypto + ./wireguard + ./nix-settings.nix + ]; + + # Time and Locale + time.timeZone = "UTC"; + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + }; + + # Default Packages Set + environment.systemPackages = with pkgs; [ vim htop wget nftables wireguard-tools ]; + + # Wireguard + wireguard = { + enable = lib.mkDefault false; + v4 = { network = lib.mkDefault "10.10.0.0"; }; + v6 = { + ula = lib.mkDefault "fd15:3d8c:d429:beef"; + gua = lib.mkDefault "2a0f:9400:8020:beef"; + }; + }; + + # Security + networking.firewall.enable = false; + security.sudo.wheelNeedsPassword = false; + services.openssh = { + enable = true; + passwordAuthentication = false; + permitRootLogin = "no"; + }; + + # CPU + powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand"; + hardware.cpu.amd.updateMicrocode = + lib.mkDefault config.hardware.enableRedistributableFirmware; + hardware.cpu.intel.updateMicrocode = + lib.mkDefault config.hardware.enableRedistributableFirmware; + + # System state version + system.stateVersion = lib.mkDefault "23.05"; +} diff --git a/modules/hetzner/default.nix b/modules/hetzner/default.nix new file mode 100644 index 0000000..692ee20 --- /dev/null +++ b/modules/hetzner/default.nix @@ -0,0 +1,24 @@ +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; + + boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi" ]; + boot.initrd.kernelModules = [ "nvme" ]; + boot.loader.grub.device = "/dev/sda"; + + fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; }; + + networking = { + domain = "vapor.systems"; + usePredictableInterfaceNames = false; + enableIPv6 = true; + tempAddresses = "disabled"; + interfaces.eth0.useDHCP = true; + nameservers = [ "1.1.1.1" "8.8.8.8" ]; + + dhcpcd.extraConfig = '' + nohook resolv.conf + ''; + }; +} diff --git a/modules/image/default.nix b/modules/image/default.nix new file mode 100644 index 0000000..5903db3 --- /dev/null +++ b/modules/image/default.nix @@ -0,0 +1,12 @@ +{ config, lib, pkgs, ... }: + +{ + config = { + system.build.image = import <nixpkgs/nixos/lib/make-disk-image.nix> { + name = "vapor-systems-image"; + format = "raw"; + diskSize = "auto"; + inherit config lib pkgs; + }; + }; +} diff --git a/modules/k3s/default.nix b/modules/k3s/default.nix new file mode 100644 index 0000000..e2aa335 --- /dev/null +++ b/modules/k3s/default.nix @@ -0,0 +1,128 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.services.k3s; +in +{ + # interface + options.services.k3s = { + enable = mkEnableOption "k3s"; + + package = mkOption { + type = types.package; + default = pkgs.k3s; + defaultText = literalExpression "pkgs.k3s"; + description = "Package that should be used for k3s"; + }; + + role = mkOption { + description = '' + Whether k3s should run as a server or agent. + Note that the server, by default, also runs as an agent. + ''; + default = "server"; + type = types.enum [ "server" "agent" ]; + }; + + serverAddr = mkOption { + type = types.str; + description = "The k3s server to connect to. This option only makes sense for an agent."; + example = "https://10.0.0.10:6443"; + default = ""; + }; + + token = mkOption { + type = types.str; + description = '' + The k3s token to use when connecting to the server. This option only makes sense for an agent. + WARNING: This option will expose store your token unencrypted world-readable in the nix store. + If this is undesired use the tokenFile option instead. + ''; + default = ""; + }; + + tokenFile = mkOption { + type = types.nullOr types.path; + description = "File path containing k3s token to use when connecting to the server. This option only makes sense for an agent."; + default = null; + }; + + docker = mkOption { + type = types.bool; + default = false; + description = "Use docker to run containers rather than the built-in containerd."; + }; + + extraFlags = mkOption { + description = "Extra flags to pass to the k3s command."; + type = types.str; + default = ""; + example = "--no-deploy traefik --cluster-cidr 10.24.0.0/16"; + }; + + disableAgent = mkOption { + type = types.bool; + default = false; + description = "Only run the server. This option only makes sense for a server."; + }; + + configPath = mkOption { + type = types.nullOr types.path; + default = null; + description = "File path containing the k3s YAML config. This is useful when the config is generated (for example on boot)."; + }; + }; + + # implementation + + config = mkIf cfg.enable { + assertions = [ + { + assertion = cfg.role == "agent" -> (cfg.configPath != null || cfg.serverAddr != ""); + message = "serverAddr or configPath (with 'server' key) should be set if role is 'agent'"; + } + { + assertion = cfg.role == "agent" -> cfg.configPath != null || cfg.tokenFile != null || cfg.token != ""; + message = "token or tokenFile or configPath (with 'token' or 'token-file' keys) should be set if role is 'agent'"; + } + ]; + + virtualisation.docker = mkIf cfg.docker { + enable = mkDefault true; + }; + + environment.systemPackages = [ config.services.k3s.package ]; + + systemd.services.k3s = { + description = "k3s service"; + after = [ "network.service" "firewall.service" ] ++ (optional cfg.docker "docker.service"); + wants = [ "network.service" "firewall.service" ]; + wantedBy = [ "multi-user.target" ]; + path = optional config.boot.zfs.enabled config.boot.zfs.package; + serviceConfig = { + # See: https://github.com/rancher/k3s/blob/dddbd16305284ae4bd14c0aade892412310d7edc/install.sh#L197 + Type = if cfg.role == "agent" then "exec" else "notify"; + KillMode = "process"; + Delegate = "yes"; + Restart = "always"; + RestartSec = "5s"; + LimitNOFILE = 1048576; + LimitNPROC = "infinity"; + LimitCORE = "infinity"; + TasksMax = "infinity"; + ExecStart = concatStringsSep " \\\n " ( + [ + "${cfg.package}/bin/k3s ${cfg.role}" + ] ++ (optional cfg.docker "--docker") + ++ (optional cfg.disableAgent "--disable-agent") + ++ (optional (cfg.serverAddr != "") "--server ${cfg.serverAddr}") + ++ (optional (cfg.token != "") "--token ${cfg.token}") + ++ (optional (cfg.tokenFile != null) "--token-file ${cfg.tokenFile}") + ++ (optional (cfg.configPath != null) "--config ${cfg.configPath}") + ++ [ cfg.extraFlags ] + ); + }; + }; + }; +} diff --git a/modules/kubernetes/default.nix b/modules/kubernetes/default.nix new file mode 100644 index 0000000..0e6e522 --- /dev/null +++ b/modules/kubernetes/default.nix @@ -0,0 +1,160 @@ +{ config, lib, pkgs, nixpkgs, ... }: + +with lib; +let + cfg = config.kubernetes; + + clusterDomain = "kube.vapor.systems"; + + externalIP = { + v4 = if cfg.externalIP.v4 != "" then + cfg.externalIP.v4 + else + (lib.elemAt config.networking.interfaces.eth0.ipv4.addresses 0).address; + v6 = if cfg.externalIP.v6 != "" then + cfg.externalIP.v6 + else + (lib.elemAt config.networking.interfaces.eth0.ipv6.addresses 0).address; + }; + internalIP = { + v4 = config.wireguard.v4.address; + v6 = "${config.wireguard.v6.ula}::${config.wireguard.v6.address}"; + }; +in { + disabledModules = + [ "virtualisation/cri-o.nix" "services/cluster/k3s/default.nix" ]; + imports = [ ../cri-o ../k3s ]; + + options = { + kubernetes = { + role = mkOption { + type = types.enum [ "server" "agent" ]; + description = "Act as control plane or worker node"; + }; + + labels = mkOption { + type = types.attrs; + description = "Address the k8s api is advertised on"; + default = { }; + }; + taints = mkOption { + type = types.attrs; + description = "Address the k8s api is advertised on"; + default = { }; + }; + + advertiseAddress = mkOption { + type = types.str; + description = "Address the k8s api is advertised on"; + }; + + externalIP = { + v4 = mkOption { + type = types.str; + description = "External Node IP Address"; + default = ""; + }; + v6 = mkOption { + type = types.str; + description = "External Node IP Address"; + default = ""; + }; + }; + }; + }; + + config = { + nixpkgs.overlays = [ + (self: super: { + cri-o = super.callPackage ../../pkgs/cri-o { }; + k3s = super.callPackage ../../pkgs/k3s { }; + }) + ]; + + networking.extraHosts = '' + 10.10.0.1 ${clusterDomain} + fd15:3d8c:d429:beef::1 ${clusterDomain} + ''; + + environment.etc = { + "k3s/config.yaml" = { + text = generators.toJSON { } ({ + # cluster-init = true; + token = "YPoyiPeBpQpB7oK8"; + + container-runtime-endpoint = "/run/crio/crio.sock"; + + node-ip = "${internalIP.v4},${internalIP.v6}"; + node-external-ip = "${internalIP.v4},${internalIP.v6}"; + + node-label = + attrValues (mapAttrs (n: v: "${n}=${toString v}") cfg.labels); + node-taint = + attrValues (mapAttrs (n: v: "${n}=${toString v}") cfg.taints); + + kubelet-arg = "cgroup-driver=systemd"; + + no-flannel = true; + } // (if cfg.role == "server" then { + advertise-address = "${internalIP.v4}"; + + kube-controller-manager-arg = "node-cidr-mask-size-ipv6=72"; + + cluster-cidr = "10.102.0.0/16,fd15:3d8c:d429:0102::/64"; + service-cidr = "10.101.0.0/16,fd15:3d8c:d429:0101::/108"; + cluster-dns = "10.101.0.10"; + cluster-domain = clusterDomain; + + disable = [ "servicelb" "traefik" "local-storage" ]; + disable-kube-proxy = true; + disable-network-policy = true; + + flannel-backend = "none"; + } else + { })); + }; + }; + + services.k3s = { + enable = true; + role = cfg.role; + serverAddr = "https://10.10.0.1:6443"; + configPath = "/etc/k3s/config.yaml"; + }; + + virtualisation.cri-o = { + enable = true; + settings = { + crio = { + network.plugin_dir = "/opt/cni/bin"; + default_runtime = "crun"; + runtime = { + allowed_devices = [ "/dev/fuse" ]; + default_sysctls = [ + "net.ipv4.ping_group_range=0 2147483647" + ]; + workloads = { + gitlab = { + activation_annotation = "io.kubernetes.cri-o.workload/gitlab"; + allowed_annotations = [ + "io.kubernetes.cri-o.userns-mode" + "io.kubernetes.cri-o.Devices" + "io.kubernetes.cri-o.ShmSize" + ]; + }; + }; + runtimes.crun = { + runtime_type = "oci"; + runtime_root = "/run/crun"; + allowed_annotations = [ + "io.kubernetes.cri-o.userns-mode" + "io.kubernetes.cri-o.Devices" + "io.kubernetes.cri-o.ShmSize" + ]; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/matrix/conduit.nix b/modules/matrix/conduit.nix new file mode 100644 index 0000000..10612b9 --- /dev/null +++ b/modules/matrix/conduit.nix @@ -0,0 +1,142 @@ +{ config, lib, pkgs, ... }: + + +let + cfg = config.services.matrix; + + # Build a dervation that stores the content of `${server_name}/.well-known/matrix/server` + well_known_server = pkgs.writeText "well-known-matrix-server" '' + { + "m.server": "${cfg.matrix_hostname}" + } + ''; + + # Build a dervation that stores the content of `${server_name}/.well-known/matrix/client` + well_known_client = pkgs.writeText "well-known-matrix-client" '' + { + "m.homeserver": { + "base_url": "https://${cfg.matrix_hostname}" + } + } + ''; +in +{ + # Configure Conduit itself + services.matrix-conduit = { + enable = true; + + # This causes NixOS to use the flake defined in this repository instead of + # the build of Conduit built into nixpkgs. + package = pkgs.unstable.matrix-conduit; + + settings.global = { + inherit (cfg) server_name; + + allow_registration = true; + allow_federation = true; + trusted_servers = [ "matrix.org" ]; + enable_lightning_bolt = false; + }; + }; + + security.acme = { + acceptTerms = true; + defaults = { + email = cfg.admin_email; + }; + }; + + # ACME data must be readable by the NGINX user + users.users.nginx.extraGroups = [ + "acme" + ]; + + # Configure NGINX as a reverse proxy + services.nginx = { + enable = true; + recommendedProxySettings = true; + + virtualHosts = { + "${cfg.matrix_hostname}" = { + forceSSL = true; + enableACME = true; + + listen = [ + { + addr = "0.0.0.0"; + port = 443; + ssl = true; + } + { + addr = "0.0.0.0"; + port = 8448; + ssl = true; + } + { + addr = "[::0]"; + port = 443; + ssl = true; + } + { + addr = "[::0]"; + port = 8448; + ssl = true; + } + ]; + + locations."/_matrix/" = { + proxyPass = "http://backend_conduit$request_uri"; + proxyWebsockets = true; + extraConfig = '' + proxy_set_header Host $host; + proxy_buffering off; + ''; + }; + + extraConfig = '' + merge_slashes off; + ''; + }; + + "${cfg.server_name}" = { + forceSSL = true; + enableACME = true; + + locations."=/.well-known/matrix/server" = { + # Use the contents of the derivation built previously + alias = "${well_known_server}"; + + extraConfig = '' + # Set the header since by default NGINX thinks it's just bytes + default_type application/json; + ''; + }; + + locations."=/.well-known/matrix/client" = { + # Use the contents of the derivation built previously + alias = "${well_known_client}"; + + extraConfig = '' + # Set the header since by default NGINX thinks it's just bytes + default_type application/json; + + # https://matrix.org/docs/spec/client_server/r0.4.0#web-browser-clients + add_header Access-Control-Allow-Origin "*"; + ''; + }; + }; + }; + + upstreams = { + "backend_conduit" = { + servers = { + "localhost:${toString config.services.matrix-conduit.settings.global.port}" = { }; + }; + }; + }; + }; + + # Open firewall ports for HTTP, HTTPS, and Matrix federation + networking.firewall.allowedTCPPorts = [ 80 443 8448 ]; + networking.firewall.allowedUDPPorts = [ 80 443 8448 ]; +} diff --git a/modules/matrix/default.nix b/modules/matrix/default.nix new file mode 100644 index 0000000..7964f9b --- /dev/null +++ b/modules/matrix/default.nix @@ -0,0 +1,73 @@ +{ config, lib, pkgs, secrets, ... }: + + +let cfg = config.services.matrix; +in +{ + imports = [ + ./options.nix + ./conduit.nix + ./mautrix-slack.nix + ]; + + services.matrix = { + server_name = "vapor.systems"; + admin_email = "info@cocaine.farm"; + }; + + services.heisenbridge = { + enable = true; + owner = "@audron:vapor.systems"; + homeserver = "https://${cfg.matrix_hostname}"; + # extraArgs = [ "--generate-compat" ]; + # + package = pkgs.heisenbridge.overrideAttrs (prev: rec { + version = "1.14.2"; + + src = pkgs.fetchFromGitHub { + owner = "hifi"; + repo = prev.pname; + rev = "refs/tags/v${version}"; + sha256 = "sha256-qp0LVcmWf5lZ52h0V58S6FoIM8RLOd6Y3FRb85j7KRg="; + }; + + patches = [ + ./patches/heisenbridge_channel_name.patch + ./patches/heisenbridge_private_name.patch + ./patches/heisenbridge_user_presence.patch + ]; + }); + + identd.enable = true; + }; + + + services.mautrix-slack = { + enable = true; + environmentFile = "/var/lib/mautrix-slack/secrets.env"; + settings = { + homeserver = { + address = "https://${cfg.matrix_hostname}"; + domain = cfg.server_name; + }; + + appservice = + let s = builtins.fromJSON (builtins.readFile "${secrets}/matrix/mautrix-slack.json"); + in + { + as_token = s.as_token; + hs_token = s.hs_token; + }; + + bridge = { + permissions = { + "*" = "relay"; + "vapor.systems" = "user"; + "@audron:vapor.systems" = "admin"; + }; + }; + }; + + configurePostgresql = true; + }; +} diff --git a/modules/matrix/mautrix-slack.nix b/modules/matrix/mautrix-slack.nix new file mode 100644 index 0000000..d0324a1 --- /dev/null +++ b/modules/matrix/mautrix-slack.nix @@ -0,0 +1,194 @@ +{ config, pkgs, lib, ... }: + +with lib; + +let + cfg = config.services.mautrix-slack; + dataDir = "/var/lib/mautrix-slack"; + registrationFile = "${dataDir}/slack-registration.yaml"; + settingsFormat = pkgs.formats.json { }; + settingsFile = settingsFormat.generate "mautrix-slack-config.json" cfg.settings; +in +{ + options = { + services.mautrix-slack = { + enable = mkEnableOption (lib.mdDoc "Mautrix-Slack, a Matrix-Slack hybrid puppeting/relaybot bridge"); + + package = mkOption { + type = types.package; + default = pkgs.callPackage ./pkgs/mautrix-slack.nix { }; + defaultText = "pkgs.mautrix-slack"; + example = "pkgs.mautrix-slack.override { … = …; }"; + description = lib.mdDoc '' + Package of the application to run, exposed for overriding purposes. + ''; + }; + + settings = mkOption rec { + apply = recursiveUpdate default; + type = settingsFormat.type; + default = { + homeserver = { + software = "standard"; + }; + + appservice = rec { + address = "http://${hostname}:${toString port}"; + hostname = "localhost"; + port = 29319; + + database = { + type = "postgres"; + uri = "postgres:///mautrix-slack?host=/run/postgresql&sslmode=disable"; + }; + + id = "slack"; + bot = { + username = "slackbot"; + }; + + # backfill = { + # enable = false; + # conversations_count = 200; + # unread_hours_threshold = 720; + # immediate_messages = 10; + # incremental = { + # messages_per_batch = 100; + # post_batch_delay = 20; + # max_messages = { + # channel = -1; + # group_dm = -1; + # dm = -1; + # }; + # }; + # }; + + # encryption = { + # allow = false; + # default = false; + # appservice = false; + # require = false; + # allow_key_sharing = false; + # verification_levels = { + # receive = "unverified"; + # send = "unverified"; + # share = "cross-signed-tofu"; + # }; + # rotation = { + # enable_custom = false; + # milliseconds = 604800000; + # messages = 100; + # }; + # }; + + # provisioning = { + # prefix = "/_matrix/provision"; + # shared_secret = "generate"; + # }; + }; + + logging = { + directory = "/var/log/mautrix"; + file_name_format = "slack-{{.Date}}-{{.Index}}.log"; + file_date_format = "2006-01-02"; + file_mode = 384; + timestamp_format = "Jan _2, 2006 15:04:05"; + print_level = "debug"; + print_json = false; + file_json = false; + }; + }; + }; + + environmentFile = mkOption { + type = types.nullOr types.path; + default = null; + description = lib.mdDoc '' + File containing environment variables to be passed to the mautrix-slack service. + Any config variable can be overridden by setting `MAUTRIX_SLACK_SOME_KEY` to override the `some.key` variable. + ''; + }; + + configurePostgresql = mkOption { + type = types.bool; + default = true; + description = lib.mdDoc '' + Enable PostgreSQL and create a user and database for mautrix-slack. The default `settings` reference this database, if you disable this option you must provide a database URL. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + users.groups.mautrix-slack = { }; + + users.users.mautrix-slack = { + group = "mautrix-slack"; + isSystemUser = true; + }; + + services.postgresql = mkIf cfg.configurePostgresql { + enable = true; + ensureDatabases = [ "mautrix-slack" ]; + ensureUsers = [{ + name = "mautrix-slack"; + ensurePermissions = { + "DATABASE \"mautrix-slack\"" = "ALL PRIVILEGES"; + }; + }]; + }; + + systemd.services.mautrix-slack = rec { + wantedBy = [ "multi-user.target" ]; + wants = [ + "network-online.target" + ] ++ optional config.services.matrix-synapse.enable "matrix-synapse.service" + ++ optional cfg.configurePostgresql "postgresql.service"; + after = wants; + + preStart = '' + # generate the appservice's registration file if absent + if [ ! -f '${registrationFile}' ]; then + ${cfg.package}/bin/mautrix-slack -g -c ${settingsFile} \ + -r ${registrationFile} + fi + ''; + + serviceConfig = { + Type = "simple"; + Restart = "always"; + + User = "mautrix-slack"; + + NoNewPrivileges = true; + MemoryDenyWriteExecute = true; + PrivateDevices = true; + PrivateTmp = true; + ProtectHome = true; + ProtectSystem = "strict"; + ProtectControlGroups = true; + RestrictSUIDSGID = true; + RestrictRealtime = true; + LockPersonality = true; + ProtectKernelLogs = true; + ProtectKernelTunables = true; + ProtectHostname = true; + ProtectKernelModules = true; + PrivateUsers = true; + ProtectClock = true; + SystemCallArchitectures = "native"; + SystemCallErrorNumber = "EPERM"; + SystemCallFilter = "@system-service"; + + StateDirectory = baseNameOf dataDir; + LogsDirectory = "mautrix"; + LogsDirectoryMode = "0750"; + EnvironmentFile = cfg.environmentFile; + + ExecStart = '' + ${cfg.package}/bin/mautrix-slack --no-update --config=${settingsFile} --registration=${registrationFile} + ''; + }; + }; + }; +} diff --git a/modules/matrix/mx-puppet-slack.nix b/modules/matrix/mx-puppet-slack.nix new file mode 100644 index 0000000..5737319 --- /dev/null +++ b/modules/matrix/mx-puppet-slack.nix @@ -0,0 +1,132 @@ +{ config, pkgs, lib, ... }: + +with lib; + +let + dataDir = "/var/lib/mx-puppet-slack"; + registrationFile = "${dataDir}/slack-registration.yaml"; + cfg = config.services.mx-puppet-slack; + settingsFormat = pkgs.formats.json {}; + settingsFile = settingsFormat.generate "mx-puppet-slack-config.json" cfg.settings; + +in { + options = { + services.mx-puppet-slack = { + enable = mkEnableOption (lib.mdDoc '' + mx-puppet-slack is a slack puppeting bridge for matrix. + It handles bridging private and group DMs + ''); + + package = mkOption { + type = types.package; + default = pkgs.callPackage ./pkgs/mx-puppet-slack.nix {}; + defaultText = "pkgs.mx-puppet-slack"; + example = "pkgs.mx-puppet-slack.override { … = …; }"; + description = lib.mdDoc '' + Package of the application to run, exposed for overriding purposes. + ''; + }; + + settings = mkOption rec { + apply = recursiveUpdate default; + inherit (settingsFormat) type; + default = { + bridge = { + port = 8432; + }; + presence = { + enabled = true; + interval = 500; + }; + provisioning.whitelist = [ ]; + + # variables are preceded by a colon. + namePatterns = { + user = ":name"; + room = ":name[:team? - :team,]"; + group = ":name"; + }; + + #defaults to sqlite but can be configured to use postgresql with + #connstring + database.filename = "${dataDir}/database.db"; + logging = { + console = "info"; + lineDateFormat = "MMM-D HH:mm:ss.SSS"; + }; + }; + example = literalExpression '' + { + bridge = { + bindAddress = "localhost"; + domain = "example.com"; + homeserverUrl = "https://example.com"; + }; + provisioning.whitelist = [ "@admin:example.com" ]; + relay.whitelist = [ "@.*:example.com" ]; + } + ''; + description = lib.mdDoc '' + {file}`config.yaml` configuration as a Nix attribute set. + Configuration options should match those described in + [ + sample.config.yaml](https://github.com/matrix-slack/mx-puppet-slack/blob/master/sample.config.yaml). + ''; + }; + serviceDependencies = mkOption { + type = with types; listOf str; + default = optional config.services.matrix-synapse.enable "matrix-synapse.service"; + defaultText = literalExpression '' + optional config.services.matrix-synapse.enable "matrix-synapse.service" + ''; + description = lib.mdDoc '' + List of Systemd services to require and wait for when starting the application service. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + systemd.services.mx-puppet-slack = { + description = "Matrix to Slack puppeting bridge"; + + wantedBy = [ "multi-user.target" ]; + wants = [ "network-online.target" ] ++ cfg.serviceDependencies; + after = [ "network-online.target" ] ++ cfg.serviceDependencies; + + preStart = '' + # generate the appservice's registration file if absent + if [ ! -f '${registrationFile}' ]; then + ${cfg.package}/bin/mx-puppet-slack -r -c ${settingsFile} \ + -f ${registrationFile} + fi + ''; + + serviceConfig = { + Type = "simple"; + Restart = "always"; + + ProtectSystem = "strict"; + ProtectHome = true; + ProtectKernelTunables = true; + ProtectKernelModules = true; + ProtectControlGroups = true; + + DynamicUser = true; + PrivateTmp = true; + WorkingDirectory = cfg.package; + StateDirectory = baseNameOf dataDir; + + UMask = "0027"; + + ExecStart = '' + ${cfg.package}/bin/mx-puppet-slack \ + -c ${settingsFile} \ + -f ${registrationFile} + ''; + }; + }; + }; + + meta.maintainers = with maintainers; [ govanify ]; +} diff --git a/modules/matrix/options.nix b/modules/matrix/options.nix new file mode 100644 index 0000000..61a9201 --- /dev/null +++ b/modules/matrix/options.nix @@ -0,0 +1,38 @@ +{ config, lib, pkgs, ... }: + +with lib; +{ + options = { + services.matrix = { + server_name = mkOption { + type = types.str; + example = "example.com"; + description = lib.mdDoc '' + The hostname that will appear in your user and room IDs + ''; + }; + + matrix_hostname = mkOption { + type = types.str; + default = "matrix.${config.services.matrix.server_name}"; + example = "matrix.example.com"; + description = lib.mdDoc '' + The hostname that Conduit actually runs on + + This can be the same as `server_name` if you want. This is only necessary + when Conduit is running on a different machine than the one hosting your + root domain. This configuration also assumes this is all running on a single + machine, some tweaks will need to be made if this is not the case. + ''; + }; + + admin_email = mkOption { + type = types.str; + example = "admin@example.com"; + description = lib.mdDoc '' + An admin email for TLS certificate notifications + ''; + }; + }; + }; +} diff --git a/modules/matrix/patches/heisenbridge_channel_name.patch b/modules/matrix/patches/heisenbridge_channel_name.patch new file mode 100644 index 0000000..130f96b --- /dev/null +++ b/modules/matrix/patches/heisenbridge_channel_name.patch @@ -0,0 +1,13 @@ +diff --git i/heisenbridge/channel_room.py w/heisenbridge/channel_room.py +index 119dad0..f1a17f6 100644 +--- i/heisenbridge/channel_room.py ++++ w/heisenbridge/channel_room.py +@@ -207,7 +207,7 @@ class ChannelRoom(PrivateRoom): + self.hidden_room_id = self.serv.hidden_room.id + + self.id = await self.network.serv.create_room( +- f"{visible_name} ({self.network.name})", ++ f"{visible_name}", + "", + [self.network.user_id], + self.hidden_room_id, diff --git a/modules/matrix/patches/heisenbridge_private_name.patch b/modules/matrix/patches/heisenbridge_private_name.patch new file mode 100644 index 0000000..6cff153 --- /dev/null +++ b/modules/matrix/patches/heisenbridge_private_name.patch @@ -0,0 +1,13 @@ +diff --git i/heisenbridge/private_room.py w/heisenbridge/private_room.py +index d8118e8..6d33a3e 100644 +--- i/heisenbridge/private_room.py ++++ w/heisenbridge/private_room.py +@@ -466,7 +466,7 @@ class PrivateRoom(Room): + if self.id is None: + irc_user_id = await self.network.serv.ensure_irc_user_id(self.network.name, displayname, update_cache=False) + self.id = await self.network.serv.create_room( +- "{} ({})".format(displayname, self.network.name), ++ "{}".format(displayname), + "Private chat with {} on {}".format(displayname, self.network.name), + [self.network.user_id, irc_user_id], + ) diff --git a/modules/matrix/patches/heisenbridge_user_presence.patch b/modules/matrix/patches/heisenbridge_user_presence.patch new file mode 100644 index 0000000..a5fc96d --- /dev/null +++ b/modules/matrix/patches/heisenbridge_user_presence.patch @@ -0,0 +1,103 @@ +diff --git i/heisenbridge/__main__.py w/heisenbridge/__main__.py +index d59febd..4898955 100644 +--- i/heisenbridge/__main__.py ++++ w/heisenbridge/__main__.py +@@ -28,6 +28,7 @@ from mautrix.errors import MUserInUse + from mautrix.types import EventType + from mautrix.types import JoinRule + from mautrix.types import Membership ++from mautrix.types import PresenceState + from mautrix.util.bridge_state import BridgeState + from mautrix.util.bridge_state import BridgeStateEvent + from mautrix.util.config import yaml +@@ -192,6 +193,19 @@ class BridgeAppService(AppService): + + return ret + ++ def set_user_state(self, user_id, away, status=None): ++ if user_id not in self._users: ++ return ++ ++ presence = PresenceState.ONLINE ++ if away: ++ presence = PresenceState.UNAVAILABLE ++ ++ async def later(): ++ await self.az.intent.user(user_id).set_presence(presence=presence, status=status) ++ ++ asyncio.ensure_future(later()) ++ + async def cache_user(self, user_id, displayname): + # start by caching that the user_id exists without a displayname + if user_id not in self._users: +diff --git i/heisenbridge/channel_room.py w/heisenbridge/channel_room.py +index 119dad0..3e0651d 100644 +--- i/heisenbridge/channel_room.py ++++ w/heisenbridge/channel_room.py +@@ -478,6 +478,9 @@ class ChannelRoom(PrivateRoom): + + asyncio.ensure_future(autocmd(self)) + ++ # Run a WHO on the channel to get initial away status ++ self.network.conn.who(target=event.target) ++ + return + + # ensure, append, invite and join +diff --git i/heisenbridge/network_room.py w/heisenbridge/network_room.py +index 3c20654..2758462 100644 +--- i/heisenbridge/network_room.py ++++ w/heisenbridge/network_room.py +@@ -139,7 +139,7 @@ class NetworkRoom(Room): + self.tls_cert = None + self.rejoin_invite = True + self.rejoin_kick = False +- self.caps = ["message-tags", "chghost", "znc.in/self-message"] ++ self.caps = ["message-tags", "chghost", "znc.in/self-message", "away-notify"] + self.forward = False + self.backoff = 0 + self.backoff_task = None +@@ -1378,6 +1378,7 @@ class NetworkRoom(Room): + self.conn.add_global_handler("338", self.on_whoisrealhost) # is actually using host + self.conn.add_global_handler("away", self.on_away) + self.conn.add_global_handler("endofwhois", self.on_endofwhois) ++ self.conn.add_global_handler("whoreply", self.on_whoreply) + + # tags + self.conn.add_global_handler("tagmsg", self.on_pass_or_ignore) +@@ -1936,9 +1937,34 @@ class NetworkRoom(Room): + data = self.whois_data[event.arguments[0].lower()] + data["realhost"] = event.arguments[1] + ++ def on_whoreply(self, conn, event) -> None: ++ data = self.whois_data[event.arguments[4].lower()] ++ data["nick"] = event.arguments[4] ++ data["user"] = event.arguments[1] ++ data["host"] = event.arguments[2] ++ if "G" in event.arguments[5]: ++ data["away"] = True ++ elif "H" in event.arguments[5]: ++ data["away"] = False ++ # data["realname"] = event.arguments[4] ++ ++ nick, mode = self.serv.strip_nick(data["nick"]) ++ irc_user_id = self.serv.irc_user_id(self.name, data["nick"]) ++ self.serv.set_user_state(irc_user_id, data["away"]) ++ + def on_away(self, conn, event) -> None: ++ nick, mode = self.serv.strip_nick(event.arguments[0]) ++ irc_user_id = self.serv.irc_user_id(self.name, event.arguments[0]) ++ + if event.arguments[0].lower() in self.whois_data: +- self.whois_data[event.arguments[0].lower()]["away"] = event.arguments[1] ++ if len(event.arguments) > 1: ++ self.whois_data[event.arguments[0].lower()]["away"] = True ++ self.whois_data[event.arguments[0].lower()]["awaymsg"] = event.arguments[1] ++ self.serv.set_user_state(irc_user_id, True, event.arguments[1]) ++ else: ++ self.whois_data[event.arguments[0].lower()]["away"] = False ++ self.whois_data[event.arguments[0].lower()]["awaymsg"] = "" ++ self.serv.set_user_state(irc_user_id, False) + else: + self.send_notice(f"{event.arguments[0]} is away: {event.arguments[1]}") + diff --git a/modules/matrix/pkgs/generate.sh b/modules/matrix/pkgs/generate.sh new file mode 100755 index 0000000..1192e12 --- /dev/null +++ b/modules/matrix/pkgs/generate.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env nix-shell +#! nix-shell -i bash -p nodePackages.node2nix + +tag="v0.1.2" +u="https://gitlab.com/mx-puppet/slack/mx-puppet-slack/-/raw/$tag" +# Download package.json and patch in @slackjs/opus optional dependency +curl $u/package.json | + sed 's|"typescript":.*|"typescript": "^4.8.3",|' >package.json + +node2nix \ + --nodejs-14 \ + --input package.json \ + --strip-optional-dependencies \ + --output node-packages.nix \ + --composition node-composition.nix \ + --registry https://registry.npmjs.org \ + --registry https://gitlab.com/api/v4/packages/npm \ + --registry-scope '@mx-puppet' + +rm -f package.json diff --git a/modules/matrix/pkgs/mautrix-slack.nix b/modules/matrix/pkgs/mautrix-slack.nix new file mode 100644 index 0000000..4310e7b --- /dev/null +++ b/modules/matrix/pkgs/mautrix-slack.nix @@ -0,0 +1,26 @@ +{ lib, buildGoModule, fetchFromGitHub, olm }: + +buildGoModule rec { + pname = "mautrix-slack"; + version = "20230316"; + + src = fetchFromGitHub { + owner = "mautrix"; + repo = "slack"; + rev = "main"; + sha256 = "sha256-kA2IzYkvWoh/LxykuSzOLif76ZDbj7hKRjdIGDHY1W0="; + }; + + buildInputs = [ olm ]; + + vendorSha256 = "sha256-kYaeVXxrfA8WuL10+2DC6c2cYJ2li4/3ulKxcy/KviQ="; + + doCheck = false; + + meta = with lib; { + homepage = "https://github.com/mautrix/slack"; + description = "Matrix <-> Slack hybrid puppeting/relaybot bridge"; + license = licenses.agpl3Plus; + maintainers = with maintainers; [ ]; + }; +} diff --git a/modules/matrix/pkgs/mx-puppet-slack.nix b/modules/matrix/pkgs/mx-puppet-slack.nix new file mode 100644 index 0000000..110cdca --- /dev/null +++ b/modules/matrix/pkgs/mx-puppet-slack.nix @@ -0,0 +1,49 @@ +{ stdenv, fetchFromGitLab, pkgs, lib, nodejs-14_x, pkg-config +, libjpeg, pixman, cairo, pango, which, postgresql }: + +let + nodejs = nodejs-14_x; + + version = "0.1.2"; + + src = fetchFromGitLab { + owner = "cocainefarm"; + repo = "mx-puppet-slack"; + rev = "e4b51ed"; + hash = "sha256-y2q3m5E6FuYSwn691SfFlwoFqkVolXl4esgiuVYHNOA="; + }; + + myNodePackages = import ./node-composition.nix { + inherit pkgs nodejs; + inherit (stdenv.hostPlatform) system; + }; + +in myNodePackages.package.override { + inherit version src; + + nativeBuildInputs = [ nodejs.pkgs.node-pre-gyp nodejs.pkgs.node-gyp-build pkg-config which ]; + buildInputs = [ libjpeg pixman cairo pango postgresql ]; + + postRebuild = '' + # Build typescript stuff + npm run build + ''; + + postInstall = '' + # Make an executable to run the server + mkdir -p $out/bin + cat <<EOF > $out/bin/mx-puppet-slack + #!/bin/sh + exec ${nodejs}/bin/node $out/lib/node_modules/@mx-puppet/mx-puppet-slack/build/index.js "\$@" + EOF + chmod +x $out/bin/mx-puppet-slack + ''; + + meta = with lib; { + description = "A slack puppeting bridge for matrix"; + license = licenses.asl20; + homepage = "https://gitlab.com/mx-puppet/slack/mx-puppet-slack"; + maintainers = with maintainers; [ ]; + platforms = platforms.unix; + }; +} diff --git a/modules/matrix/pkgs/node-composition.nix b/modules/matrix/pkgs/node-composition.nix new file mode 100644 index 0000000..08f947e --- /dev/null +++ b/modules/matrix/pkgs/node-composition.nix @@ -0,0 +1,17 @@ +# This file has been generated by node2nix 1.11.1. Do not edit! + +{pkgs ? import <nixpkgs> { + inherit system; + }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-14_x"}: + +let + nodeEnv = import ./node-env.nix { + inherit (pkgs) stdenv lib python2 runCommand writeTextFile writeShellScript; + inherit pkgs nodejs; + libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null; + }; +in +import ./node-packages.nix { + inherit (pkgs) fetchurl nix-gitignore stdenv lib fetchgit; + inherit nodeEnv; +} diff --git a/modules/matrix/pkgs/node-env.nix b/modules/matrix/pkgs/node-env.nix new file mode 100644 index 0000000..bc1e366 --- /dev/null +++ b/modules/matrix/pkgs/node-env.nix @@ -0,0 +1,689 @@ +# This file originates from node2nix + +{lib, stdenv, nodejs, python2, pkgs, libtool, runCommand, writeTextFile, writeShellScript}: + +let + # Workaround to cope with utillinux in Nixpkgs 20.09 and util-linux in Nixpkgs master + utillinux = if pkgs ? utillinux then pkgs.utillinux else pkgs.util-linux; + + python = if nodejs ? python then nodejs.python else python2; + + # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise + tarWrapper = runCommand "tarWrapper" {} '' + mkdir -p $out/bin + + cat > $out/bin/tar <<EOF + #! ${stdenv.shell} -e + $(type -p tar) "\$@" --warning=no-unknown-keyword --delay-directory-restore + EOF + + chmod +x $out/bin/tar + ''; + + # Function that generates a TGZ file from a NPM project + buildNodeSourceDist = + { name, version, src, ... }: + + stdenv.mkDerivation { + name = "node-tarball-${name}-${version}"; + inherit src; + buildInputs = [ nodejs ]; + buildPhase = '' + export HOME=$TMPDIR + tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts) + ''; + installPhase = '' + mkdir -p $out/tarballs + mv $tgzFile $out/tarballs + mkdir -p $out/nix-support + echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products + ''; + }; + + # Common shell logic + installPackage = writeShellScript "install-package" '' + installPackage() { + local packageName=$1 src=$2 + + local strippedName + + local DIR=$PWD + cd $TMPDIR + + unpackFile $src + + # Make the base dir in which the target dependency resides first + mkdir -p "$(dirname "$DIR/$packageName")" + + if [ -f "$src" ] + then + # Figure out what directory has been unpacked + packageDir="$(find . -maxdepth 1 -type d | tail -1)" + + # Restore write permissions to make building work + find "$packageDir" -type d -exec chmod u+x {} \; + chmod -R u+w "$packageDir" + + # Move the extracted tarball into the output folder + mv "$packageDir" "$DIR/$packageName" + elif [ -d "$src" ] + then + # Get a stripped name (without hash) of the source directory. + # On old nixpkgs it's already set internally. + if [ -z "$strippedName" ] + then + strippedName="$(stripHash $src)" + fi + + # Restore write permissions to make building work + chmod -R u+w "$strippedName" + + # Move the extracted directory into the output folder + mv "$strippedName" "$DIR/$packageName" + fi + + # Change to the package directory to install dependencies + cd "$DIR/$packageName" + } + ''; + + # Bundle the dependencies of the package + # + # Only include dependencies if they don't exist. They may also be bundled in the package. + includeDependencies = {dependencies}: + lib.optionalString (dependencies != []) ( + '' + mkdir -p node_modules + cd node_modules + '' + + (lib.concatMapStrings (dependency: + '' + if [ ! -e "${dependency.packageName}" ]; then + ${composePackage dependency} + fi + '' + ) dependencies) + + '' + cd .. + '' + ); + + # Recursively composes the dependencies of a package + composePackage = { name, packageName, src, dependencies ? [], ... }@args: + builtins.addErrorContext "while evaluating node package '${packageName}'" '' + installPackage "${packageName}" "${src}" + ${includeDependencies { inherit dependencies; }} + cd .. + ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} + ''; + + pinpointDependencies = {dependencies, production}: + let + pinpointDependenciesFromPackageJSON = writeTextFile { + name = "pinpointDependencies.js"; + text = '' + var fs = require('fs'); + var path = require('path'); + + function resolveDependencyVersion(location, name) { + if(location == process.env['NIX_STORE']) { + return null; + } else { + var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json"); + + if(fs.existsSync(dependencyPackageJSON)) { + var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON)); + + if(dependencyPackageObj.name == name) { + return dependencyPackageObj.version; + } + } else { + return resolveDependencyVersion(path.resolve(location, ".."), name); + } + } + } + + function replaceDependencies(dependencies) { + if(typeof dependencies == "object" && dependencies !== null) { + for(var dependency in dependencies) { + var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency); + + if(resolvedVersion === null) { + process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n"); + } else { + dependencies[dependency] = resolvedVersion; + } + } + } + } + + /* Read the package.json configuration */ + var packageObj = JSON.parse(fs.readFileSync('./package.json')); + + /* Pinpoint all dependencies */ + replaceDependencies(packageObj.dependencies); + if(process.argv[2] == "development") { + replaceDependencies(packageObj.devDependencies); + } + else { + packageObj.devDependencies = {}; + } + replaceDependencies(packageObj.optionalDependencies); + replaceDependencies(packageObj.peerDependencies); + + /* Write the fixed package.json file */ + fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2)); + ''; + }; + in + '' + node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"} + + ${lib.optionalString (dependencies != []) + '' + if [ -d node_modules ] + then + cd node_modules + ${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies} + cd .. + fi + ''} + ''; + + # Recursively traverses all dependencies of a package and pinpoints all + # dependencies in the package.json file to the versions that are actually + # being used. + + pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args: + '' + if [ -d "${packageName}" ] + then + cd "${packageName}" + ${pinpointDependencies { inherit dependencies production; }} + cd .. + ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} + fi + ''; + + # Extract the Node.js source code which is used to compile packages with + # native bindings + nodeSources = runCommand "node-sources" {} '' + tar --no-same-owner --no-same-permissions -xf ${nodejs.src} + mv node-* $out + ''; + + # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty) + addIntegrityFieldsScript = writeTextFile { + name = "addintegrityfields.js"; + text = '' + var fs = require('fs'); + var path = require('path'); + + function augmentDependencies(baseDir, dependencies) { + for(var dependencyName in dependencies) { + var dependency = dependencies[dependencyName]; + + // Open package.json and augment metadata fields + var packageJSONDir = path.join(baseDir, "node_modules", dependencyName); + var packageJSONPath = path.join(packageJSONDir, "package.json"); + + if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored + console.log("Adding metadata fields to: "+packageJSONPath); + var packageObj = JSON.parse(fs.readFileSync(packageJSONPath)); + + if(dependency.integrity) { + packageObj["_integrity"] = dependency.integrity; + } else { + packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads. + } + + if(dependency.resolved) { + packageObj["_resolved"] = dependency.resolved; // Adopt the resolved property if one has been provided + } else { + packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories. + } + + if(dependency.from !== undefined) { // Adopt from property if one has been provided + packageObj["_from"] = dependency.from; + } + + fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2)); + } + + // Augment transitive dependencies + if(dependency.dependencies !== undefined) { + augmentDependencies(packageJSONDir, dependency.dependencies); + } + } + } + + if(fs.existsSync("./package-lock.json")) { + var packageLock = JSON.parse(fs.readFileSync("./package-lock.json")); + + if(![1, 2].includes(packageLock.lockfileVersion)) { + process.stderr.write("Sorry, I only understand lock file versions 1 and 2!\n"); + process.exit(1); + } + + if(packageLock.dependencies !== undefined) { + augmentDependencies(".", packageLock.dependencies); + } + } + ''; + }; + + # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes + reconstructPackageLock = writeTextFile { + name = "reconstructpackagelock.js"; + text = '' + var fs = require('fs'); + var path = require('path'); + + var packageObj = JSON.parse(fs.readFileSync("package.json")); + + var lockObj = { + name: packageObj.name, + version: packageObj.version, + lockfileVersion: 2, + requires: true, + packages: { + "": { + name: packageObj.name, + version: packageObj.version, + license: packageObj.license, + bin: packageObj.bin, + dependencies: packageObj.dependencies, + engines: packageObj.engines, + optionalDependencies: packageObj.optionalDependencies + } + }, + dependencies: {} + }; + + function augmentPackageJSON(filePath, packages, dependencies) { + var packageJSON = path.join(filePath, "package.json"); + if(fs.existsSync(packageJSON)) { + var packageObj = JSON.parse(fs.readFileSync(packageJSON)); + packages[filePath] = { + version: packageObj.version, + integrity: "sha1-000000000000000000000000000=", + dependencies: packageObj.dependencies, + engines: packageObj.engines, + optionalDependencies: packageObj.optionalDependencies + }; + dependencies[packageObj.name] = { + version: packageObj.version, + integrity: "sha1-000000000000000000000000000=", + dependencies: {} + }; + processDependencies(path.join(filePath, "node_modules"), packages, dependencies[packageObj.name].dependencies); + } + } + + function processDependencies(dir, packages, dependencies) { + if(fs.existsSync(dir)) { + var files = fs.readdirSync(dir); + + files.forEach(function(entry) { + var filePath = path.join(dir, entry); + var stats = fs.statSync(filePath); + + if(stats.isDirectory()) { + if(entry.substr(0, 1) == "@") { + // When we encounter a namespace folder, augment all packages belonging to the scope + var pkgFiles = fs.readdirSync(filePath); + + pkgFiles.forEach(function(entry) { + if(stats.isDirectory()) { + var pkgFilePath = path.join(filePath, entry); + augmentPackageJSON(pkgFilePath, packages, dependencies); + } + }); + } else { + augmentPackageJSON(filePath, packages, dependencies); + } + } + }); + } + } + + processDependencies("node_modules", lockObj.packages, lockObj.dependencies); + + fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2)); + ''; + }; + + # Script that links bins defined in package.json to the node_modules bin directory + # NPM does not do this for top-level packages itself anymore as of v7 + linkBinsScript = writeTextFile { + name = "linkbins.js"; + text = '' + var fs = require('fs'); + var path = require('path'); + + var packageObj = JSON.parse(fs.readFileSync("package.json")); + + var nodeModules = Array(packageObj.name.split("/").length).fill("..").join(path.sep); + + if(packageObj.bin !== undefined) { + fs.mkdirSync(path.join(nodeModules, ".bin")) + + if(typeof packageObj.bin == "object") { + Object.keys(packageObj.bin).forEach(function(exe) { + if(fs.existsSync(packageObj.bin[exe])) { + console.log("linking bin '" + exe + "'"); + fs.symlinkSync( + path.join("..", packageObj.name, packageObj.bin[exe]), + path.join(nodeModules, ".bin", exe) + ); + } + else { + console.log("skipping non-existent bin '" + exe + "'"); + } + }) + } + else { + if(fs.existsSync(packageObj.bin)) { + console.log("linking bin '" + packageObj.bin + "'"); + fs.symlinkSync( + path.join("..", packageObj.name, packageObj.bin), + path.join(nodeModules, ".bin", packageObj.name.split("/").pop()) + ); + } + else { + console.log("skipping non-existent bin '" + packageObj.bin + "'"); + } + } + } + else if(packageObj.directories !== undefined && packageObj.directories.bin !== undefined) { + fs.mkdirSync(path.join(nodeModules, ".bin")) + + fs.readdirSync(packageObj.directories.bin).forEach(function(exe) { + if(fs.existsSync(path.join(packageObj.directories.bin, exe))) { + console.log("linking bin '" + exe + "'"); + fs.symlinkSync( + path.join("..", packageObj.name, packageObj.directories.bin, exe), + path.join(nodeModules, ".bin", exe) + ); + } + else { + console.log("skipping non-existent bin '" + exe + "'"); + } + }) + } + ''; + }; + + prepareAndInvokeNPM = {packageName, bypassCache, reconstructLock, npmFlags, production}: + let + forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com"; + in + '' + # Pinpoint the versions of all dependencies to the ones that are actually being used + echo "pinpointing versions of dependencies..." + source $pinpointDependenciesScriptPath + + # Patch the shebangs of the bundled modules to prevent them from + # calling executables outside the Nix store as much as possible + patchShebangs . + + # Deploy the Node.js package by running npm install. Since the + # dependencies have been provided already by ourselves, it should not + # attempt to install them again, which is good, because we want to make + # it Nix's responsibility. If it needs to install any dependencies + # anyway (e.g. because the dependency parameters are + # incomplete/incorrect), it fails. + # + # The other responsibilities of NPM are kept -- version checks, build + # steps, postprocessing etc. + + export HOME=$TMPDIR + cd "${packageName}" + runHook preRebuild + + ${lib.optionalString bypassCache '' + ${lib.optionalString reconstructLock '' + if [ -f package-lock.json ] + then + echo "WARNING: Reconstruct lock option enabled, but a lock file already exists!" + echo "This will most likely result in version mismatches! We will remove the lock file and regenerate it!" + rm package-lock.json + else + echo "No package-lock.json file found, reconstructing..." + fi + + node ${reconstructPackageLock} + ''} + + node ${addIntegrityFieldsScript} + ''} + + npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild + + runHook postRebuild + + if [ "''${dontNpmInstall-}" != "1" ] + then + # NPM tries to download packages even when they already exist if npm-shrinkwrap is used. + rm -f npm-shrinkwrap.json + + npm ${forceOfflineFlag} --nodedir=${nodeSources} --no-bin-links --ignore-scripts ${npmFlags} ${lib.optionalString production "--production"} install + fi + + # Link executables defined in package.json + node ${linkBinsScript} + ''; + + # Builds and composes an NPM package including all its dependencies + buildNodePackage = + { name + , packageName + , version ? null + , dependencies ? [] + , buildInputs ? [] + , production ? true + , npmFlags ? "" + , dontNpmInstall ? false + , bypassCache ? false + , reconstructLock ? false + , preRebuild ? "" + , dontStrip ? true + , unpackPhase ? "true" + , buildPhase ? "true" + , meta ? {} + , ... }@args: + + let + extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" "meta" ]; + in + stdenv.mkDerivation ({ + name = "${name}${if version == null then "" else "-${version}"}"; + buildInputs = [ tarWrapper python nodejs ] + ++ lib.optional (stdenv.isLinux) utillinux + ++ lib.optional (stdenv.isDarwin) libtool + ++ buildInputs; + + inherit nodejs; + + inherit dontStrip; # Stripping may fail a build for some package deployments + inherit dontNpmInstall preRebuild unpackPhase buildPhase; + + compositionScript = composePackage args; + pinpointDependenciesScript = pinpointDependenciesOfPackage args; + + passAsFile = [ "compositionScript" "pinpointDependenciesScript" ]; + + installPhase = '' + source ${installPackage} + + # Create and enter a root node_modules/ folder + mkdir -p $out/lib/node_modules + cd $out/lib/node_modules + + # Compose the package and all its dependencies + source $compositionScriptPath + + ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} + + # Create symlink to the deployed executable folder, if applicable + if [ -d "$out/lib/node_modules/.bin" ] + then + ln -s $out/lib/node_modules/.bin $out/bin + + # Fixup all executables + ls $out/bin/* | while read i + do + file="$(readlink -f "$i")" + chmod u+rwx "$file" + if isScript "$file" + then + sed -i 's/\r$//' "$file" # convert crlf to lf + fi + done + fi + + # Create symlinks to the deployed manual page folders, if applicable + if [ -d "$out/lib/node_modules/${packageName}/man" ] + then + mkdir -p $out/share + for dir in "$out/lib/node_modules/${packageName}/man/"* + do + mkdir -p $out/share/man/$(basename "$dir") + for page in "$dir"/* + do + ln -s $page $out/share/man/$(basename "$dir") + done + done + fi + + # Run post install hook, if provided + runHook postInstall + ''; + + meta = { + # default to Node.js' platforms + platforms = nodejs.meta.platforms; + } // meta; + } // extraArgs); + + # Builds a node environment (a node_modules folder and a set of binaries) + buildNodeDependencies = + { name + , packageName + , version ? null + , src + , dependencies ? [] + , buildInputs ? [] + , production ? true + , npmFlags ? "" + , dontNpmInstall ? false + , bypassCache ? false + , reconstructLock ? false + , dontStrip ? true + , unpackPhase ? "true" + , buildPhase ? "true" + , ... }@args: + + let + extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ]; + in + stdenv.mkDerivation ({ + name = "node-dependencies-${name}${if version == null then "" else "-${version}"}"; + + buildInputs = [ tarWrapper python nodejs ] + ++ lib.optional (stdenv.isLinux) utillinux + ++ lib.optional (stdenv.isDarwin) libtool + ++ buildInputs; + + inherit dontStrip; # Stripping may fail a build for some package deployments + inherit dontNpmInstall unpackPhase buildPhase; + + includeScript = includeDependencies { inherit dependencies; }; + pinpointDependenciesScript = pinpointDependenciesOfPackage args; + + passAsFile = [ "includeScript" "pinpointDependenciesScript" ]; + + installPhase = '' + source ${installPackage} + + mkdir -p $out/${packageName} + cd $out/${packageName} + + source $includeScriptPath + + # Create fake package.json to make the npm commands work properly + cp ${src}/package.json . + chmod 644 package.json + ${lib.optionalString bypassCache '' + if [ -f ${src}/package-lock.json ] + then + cp ${src}/package-lock.json . + chmod 644 package-lock.json + fi + ''} + + # Go to the parent folder to make sure that all packages are pinpointed + cd .. + ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} + + ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} + + # Expose the executables that were installed + cd .. + ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} + + mv ${packageName} lib + ln -s $out/lib/node_modules/.bin $out/bin + ''; + } // extraArgs); + + # Builds a development shell + buildNodeShell = + { name + , packageName + , version ? null + , src + , dependencies ? [] + , buildInputs ? [] + , production ? true + , npmFlags ? "" + , dontNpmInstall ? false + , bypassCache ? false + , reconstructLock ? false + , dontStrip ? true + , unpackPhase ? "true" + , buildPhase ? "true" + , ... }@args: + + let + nodeDependencies = buildNodeDependencies args; + extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "unpackPhase" "buildPhase" ]; + in + stdenv.mkDerivation ({ + name = "node-shell-${name}${if version == null then "" else "-${version}"}"; + + buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs; + buildCommand = '' + mkdir -p $out/bin + cat > $out/bin/shell <<EOF + #! ${stdenv.shell} -e + $shellHook + exec ${stdenv.shell} + EOF + chmod +x $out/bin/shell + ''; + + # Provide the dependencies in a development shell through the NODE_PATH environment variable + inherit nodeDependencies; + shellHook = lib.optionalString (dependencies != []) '' + export NODE_PATH=${nodeDependencies}/lib/node_modules + export PATH="${nodeDependencies}/bin:$PATH" + ''; + } // extraArgs); +in +{ + buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist; + buildNodePackage = lib.makeOverridable buildNodePackage; + buildNodeDependencies = lib.makeOverridable buildNodeDependencies; + buildNodeShell = lib.makeOverridable buildNodeShell; +} diff --git a/modules/matrix/pkgs/node-packages.nix b/modules/matrix/pkgs/node-packages.nix new file mode 100644 index 0000000..abbf66b --- /dev/null +++ b/modules/matrix/pkgs/node-packages.nix @@ -0,0 +1,4275 @@ +# This file has been generated by node2nix 1.11.1. Do not edit! + +{nodeEnv, fetchurl, fetchgit, nix-gitignore, stdenv, lib, globalBuildInputs ? []}: + +let + sources = { + "@babel/code-frame-7.18.6" = { + name = "_at_babel_slash_code-frame"; + packageName = "@babel/code-frame"; + version = "7.18.6"; + src = fetchurl { + url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz"; + sha512 = "TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="; + }; + }; + "@babel/helper-validator-identifier-7.19.1" = { + name = "_at_babel_slash_helper-validator-identifier"; + packageName = "@babel/helper-validator-identifier"; + version = "7.19.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz"; + sha512 = "awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="; + }; + }; + "@babel/highlight-7.18.6" = { + name = "_at_babel_slash_highlight"; + packageName = "@babel/highlight"; + version = "7.18.6"; + src = fetchurl { + url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz"; + sha512 = "u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="; + }; + }; + "@colors/colors-1.5.0" = { + name = "_at_colors_slash_colors"; + packageName = "@colors/colors"; + version = "1.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz"; + sha512 = "ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="; + }; + }; + "@dabh/diagnostics-2.0.3" = { + name = "_at_dabh_slash_diagnostics"; + packageName = "@dabh/diagnostics"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz"; + sha512 = "hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="; + }; + }; + "@mapbox/node-pre-gyp-1.0.10" = { + name = "_at_mapbox_slash_node-pre-gyp"; + packageName = "@mapbox/node-pre-gyp"; + version = "1.0.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz"; + sha512 = "4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA=="; + }; + }; + "@mx-puppet/bridge-0.1.8" = { + name = "_at_mx-puppet_slash_bridge"; + packageName = "@mx-puppet/bridge"; + version = "0.1.8"; + src = fetchurl { + url = "https://gitlab.com/api/v4/projects/35712047/packages/npm/@mx-puppet/bridge/-/@mx-puppet/bridge-0.1.8.tgz"; + sha1 = "68018cab4f59834b3fef2e59fbfd52938403e001"; + }; + }; + "@mx-puppet/matrix-slack-parser-0.1.10" = { + name = "_at_mx-puppet_slash_matrix-slack-parser"; + packageName = "@mx-puppet/matrix-slack-parser"; + version = "0.1.10"; + src = fetchurl { + url = "https://gitlab.com/api/v4/projects/35067728/packages/npm/@mx-puppet/matrix-slack-parser/-/@mx-puppet/matrix-slack-parser-0.1.10.tgz"; + sha1 = "be97ade2be85c69d0bab1c33b911e44a7eee87b9"; + }; + }; + "@sindresorhus/is-2.1.1" = { + name = "_at_sindresorhus_slash_is"; + packageName = "@sindresorhus/is"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz"; + sha512 = "/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg=="; + }; + }; + "@sindresorhus/is-4.6.0" = { + name = "_at_sindresorhus_slash_is"; + packageName = "@sindresorhus/is"; + version = "4.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz"; + sha512 = "t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="; + }; + }; + "@slack/events-api-2.3.4" = { + name = "_at_slack_slash_events-api"; + packageName = "@slack/events-api"; + version = "2.3.4"; + src = fetchurl { + url = "https://registry.npmjs.org/@slack/events-api/-/events-api-2.3.4.tgz"; + sha512 = "4H+/op+GwIJ5aqpN7K1WcLuyqvpjCw48HYS4Xaw35tN84T0MDfOvQIA6Sacor9OpwCxKaY60Mwo73FT5Q+VvKg=="; + }; + }; + "@slack/logger-2.0.0" = { + name = "_at_slack_slash_logger"; + packageName = "@slack/logger"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@slack/logger/-/logger-2.0.0.tgz"; + sha512 = "OkIJpiU2fz6HOJujhlhfIGrc8hB4ibqtf7nnbJQDerG0BqwZCfmgtK5sWzZ0TkXVRBKD5MpLrTmCYyMxoMCgPw=="; + }; + }; + "@slack/rtm-api-5.0.5" = { + name = "_at_slack_slash_rtm-api"; + packageName = "@slack/rtm-api"; + version = "5.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/@slack/rtm-api/-/rtm-api-5.0.5.tgz"; + sha512 = "x2B4hyoxjg62cxf4M5QRomx+xYp2XoajPKdd24SM2Sl4m+IrzwKzmcrysQuYmF6BMsm3IoTKymW5BBGckHGTIw=="; + }; + }; + "@slack/types-1.10.0" = { + name = "_at_slack_slash_types"; + packageName = "@slack/types"; + version = "1.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz"; + sha512 = "tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg=="; + }; + }; + "@slack/web-api-5.15.0" = { + name = "_at_slack_slash_web-api"; + packageName = "@slack/web-api"; + version = "5.15.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@slack/web-api/-/web-api-5.15.0.tgz"; + sha512 = "tjQ8Zqv/Fmj9SOL9yIEd7IpTiKfKHi9DKAkfRVeotoX0clMr3SqQtBqO+KZMX27gm7dmgJsQaDKlILyzdCO+IA=="; + }; + }; + "@sorunome/matrix-bot-sdk-0.5.13" = { + name = "_at_sorunome_slash_matrix-bot-sdk"; + packageName = "@sorunome/matrix-bot-sdk"; + version = "0.5.13"; + src = fetchurl { + url = "https://registry.npmjs.org/@sorunome/matrix-bot-sdk/-/matrix-bot-sdk-0.5.13.tgz"; + sha512 = "WEeuei8/QS9FO76n71nT17TBZ3tRW2POjOpN7YIvsy5tA0WD0tMUKWZDcTo1A+xKOvzgjRTy9v88rKSLIr4wHA=="; + }; + }; + "@szmarczak/http-timer-4.0.6" = { + name = "_at_szmarczak_slash_http-timer"; + packageName = "@szmarczak/http-timer"; + version = "4.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz"; + sha512 = "4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="; + }; + }; + "@types/body-parser-1.19.2" = { + name = "_at_types_slash_body-parser"; + packageName = "@types/body-parser"; + version = "1.19.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz"; + sha512 = "ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g=="; + }; + }; + "@types/cacheable-request-6.0.3" = { + name = "_at_types_slash_cacheable-request"; + packageName = "@types/cacheable-request"; + version = "6.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz"; + sha512 = "IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="; + }; + }; + "@types/connect-3.4.35" = { + name = "_at_types_slash_connect"; + packageName = "@types/connect"; + version = "3.4.35"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz"; + sha512 = "cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ=="; + }; + }; + "@types/debug-4.1.7" = { + name = "_at_types_slash_debug"; + packageName = "@types/debug"; + version = "4.1.7"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz"; + sha512 = "9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg=="; + }; + }; + "@types/express-4.17.17" = { + name = "_at_types_slash_express"; + packageName = "@types/express"; + version = "4.17.17"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz"; + sha512 = "Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q=="; + }; + }; + "@types/express-serve-static-core-4.17.33" = { + name = "_at_types_slash_express-serve-static-core"; + packageName = "@types/express-serve-static-core"; + version = "4.17.33"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz"; + sha512 = "TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA=="; + }; + }; + "@types/http-cache-semantics-4.0.1" = { + name = "_at_types_slash_http-cache-semantics"; + packageName = "@types/http-cache-semantics"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz"; + sha512 = "SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="; + }; + }; + "@types/is-stream-1.1.0" = { + name = "_at_types_slash_is-stream"; + packageName = "@types/is-stream"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz"; + sha512 = "jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg=="; + }; + }; + "@types/keyv-3.1.4" = { + name = "_at_types_slash_keyv"; + packageName = "@types/keyv"; + version = "3.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz"; + sha512 = "BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="; + }; + }; + "@types/lodash-4.14.191" = { + name = "_at_types_slash_lodash"; + packageName = "@types/lodash"; + version = "4.14.191"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz"; + sha512 = "BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="; + }; + }; + "@types/lodash.isstring-4.0.7" = { + name = "_at_types_slash_lodash.isstring"; + packageName = "@types/lodash.isstring"; + version = "4.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/lodash.isstring/-/lodash.isstring-4.0.7.tgz"; + sha512 = "gt4q4n1Who4JxLeFR/kduS2Tia+biQk/zdbIkOfMvAldXHJdcC5SsvZREchkwa4CwKK+DqhIm3wfigFYzNKS8Q=="; + }; + }; + "@types/mime-3.0.1" = { + name = "_at_types_slash_mime"; + packageName = "@types/mime"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz"; + sha512 = "Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="; + }; + }; + "@types/ms-0.7.31" = { + name = "_at_types_slash_ms"; + packageName = "@types/ms"; + version = "0.7.31"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz"; + sha512 = "iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="; + }; + }; + "@types/node-12.20.55" = { + name = "_at_types_slash_node"; + packageName = "@types/node"; + version = "12.20.55"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz"; + sha512 = "J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="; + }; + }; + "@types/node-18.15.3" = { + name = "_at_types_slash_node"; + packageName = "@types/node"; + version = "18.15.3"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz"; + sha512 = "p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw=="; + }; + }; + "@types/p-queue-2.3.2" = { + name = "_at_types_slash_p-queue"; + packageName = "@types/p-queue"; + version = "2.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz"; + sha512 = "eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ=="; + }; + }; + "@types/prop-types-15.7.5" = { + name = "_at_types_slash_prop-types"; + packageName = "@types/prop-types"; + version = "15.7.5"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz"; + sha512 = "JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="; + }; + }; + "@types/qs-6.9.7" = { + name = "_at_types_slash_qs"; + packageName = "@types/qs"; + version = "6.9.7"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz"; + sha512 = "FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="; + }; + }; + "@types/range-parser-1.2.4" = { + name = "_at_types_slash_range-parser"; + packageName = "@types/range-parser"; + version = "1.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz"; + sha512 = "EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="; + }; + }; + "@types/react-18.0.28" = { + name = "_at_types_slash_react"; + packageName = "@types/react"; + version = "18.0.28"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz"; + sha512 = "RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew=="; + }; + }; + "@types/responselike-1.0.0" = { + name = "_at_types_slash_responselike"; + packageName = "@types/responselike"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz"; + sha512 = "85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA=="; + }; + }; + "@types/retry-0.12.0" = { + name = "_at_types_slash_retry"; + packageName = "@types/retry"; + version = "0.12.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz"; + sha512 = "wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="; + }; + }; + "@types/scheduler-0.16.2" = { + name = "_at_types_slash_scheduler"; + packageName = "@types/scheduler"; + version = "0.16.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz"; + sha512 = "hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="; + }; + }; + "@types/serve-static-1.15.1" = { + name = "_at_types_slash_serve-static"; + packageName = "@types/serve-static"; + version = "1.15.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz"; + sha512 = "NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ=="; + }; + }; + "@types/triple-beam-1.3.2" = { + name = "_at_types_slash_triple-beam"; + packageName = "@types/triple-beam"; + version = "1.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz"; + sha512 = "txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g=="; + }; + }; + "@types/ws-7.4.7" = { + name = "_at_types_slash_ws"; + packageName = "@types/ws"; + version = "7.4.7"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz"; + sha512 = "JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="; + }; + }; + "@types/yargs-15.0.15" = { + name = "_at_types_slash_yargs"; + packageName = "@types/yargs"; + version = "15.0.15"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz"; + sha512 = "IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg=="; + }; + }; + "@types/yargs-parser-21.0.0" = { + name = "_at_types_slash_yargs-parser"; + packageName = "@types/yargs-parser"; + version = "21.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz"; + sha512 = "iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="; + }; + }; + "abbrev-1.1.1" = { + name = "abbrev"; + packageName = "abbrev"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"; + sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="; + }; + }; + "accepts-1.3.8" = { + name = "accepts"; + packageName = "accepts"; + version = "1.3.8"; + src = fetchurl { + url = "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"; + sha512 = "PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="; + }; + }; + "agent-base-6.0.2" = { + name = "agent-base"; + packageName = "agent-base"; + version = "6.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"; + sha512 = "RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="; + }; + }; + "ansi-regex-5.0.1" = { + name = "ansi-regex"; + packageName = "ansi-regex"; + version = "5.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"; + sha512 = "quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="; + }; + }; + "ansi-styles-3.2.1" = { + name = "ansi-styles"; + packageName = "ansi-styles"; + version = "3.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"; + sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="; + }; + }; + "ansi-styles-4.3.0" = { + name = "ansi-styles"; + packageName = "ansi-styles"; + version = "4.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"; + sha512 = "zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="; + }; + }; + "aproba-2.0.0" = { + name = "aproba"; + packageName = "aproba"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz"; + sha512 = "lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="; + }; + }; + "are-we-there-yet-2.0.0" = { + name = "are-we-there-yet"; + packageName = "are-we-there-yet"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz"; + sha512 = "Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw=="; + }; + }; + "argparse-1.0.10" = { + name = "argparse"; + packageName = "argparse"; + version = "1.0.10"; + src = fetchurl { + url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"; + sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="; + }; + }; + "array-back-2.0.0" = { + name = "array-back"; + packageName = "array-back"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz"; + sha512 = "eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw=="; + }; + }; + "array-back-3.1.0" = { + name = "array-back"; + packageName = "array-back"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz"; + sha512 = "TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="; + }; + }; + "array-flatten-1.1.1" = { + name = "array-flatten"; + packageName = "array-flatten"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"; + sha512 = "PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="; + }; + }; + "assert-options-0.8.0" = { + name = "assert-options"; + packageName = "assert-options"; + version = "0.8.0"; + src = fetchurl { + url = "https://registry.npmjs.org/assert-options/-/assert-options-0.8.0.tgz"; + sha512 = "qSELrEaEz4sGwTs4Qh+swQkjiHAysC4rot21+jzXU86dJzNG+FDqBzyS3ohSoTRf4ZLA3FSwxQdiuNl5NXUtvA=="; + }; + }; + "async-3.2.4" = { + name = "async"; + packageName = "async"; + version = "3.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/async/-/async-3.2.4.tgz"; + sha512 = "iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="; + }; + }; + "async-limiter-1.0.1" = { + name = "async-limiter"; + packageName = "async-limiter"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz"; + sha512 = "csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="; + }; + }; + "asynckit-0.4.0" = { + name = "asynckit"; + packageName = "asynckit"; + version = "0.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"; + sha512 = "Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="; + }; + }; + "axios-0.21.4" = { + name = "axios"; + packageName = "axios"; + version = "0.21.4"; + src = fetchurl { + url = "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz"; + sha512 = "ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="; + }; + }; + "balanced-match-1.0.2" = { + name = "balanced-match"; + packageName = "balanced-match"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"; + sha512 = "3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="; + }; + }; + "base64-js-1.5.1" = { + name = "base64-js"; + packageName = "base64-js"; + version = "1.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"; + sha512 = "AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="; + }; + }; + "basic-auth-2.0.1" = { + name = "basic-auth"; + packageName = "basic-auth"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz"; + sha512 = "NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="; + }; + }; + "better-sqlite3-7.6.2" = { + name = "better-sqlite3"; + packageName = "better-sqlite3"; + version = "7.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz"; + sha512 = "S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg=="; + }; + }; + "bindings-1.5.0" = { + name = "bindings"; + packageName = "bindings"; + version = "1.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz"; + sha512 = "p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="; + }; + }; + "bintrees-1.0.2" = { + name = "bintrees"; + packageName = "bintrees"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz"; + sha512 = "VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="; + }; + }; + "bl-4.1.0" = { + name = "bl"; + packageName = "bl"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz"; + sha512 = "1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="; + }; + }; + "blurhash-1.1.5" = { + name = "blurhash"; + packageName = "blurhash"; + version = "1.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/blurhash/-/blurhash-1.1.5.tgz"; + sha512 = "a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg=="; + }; + }; + "body-parser-1.20.1" = { + name = "body-parser"; + packageName = "body-parser"; + version = "1.20.1"; + src = fetchurl { + url = "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz"; + sha512 = "jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw=="; + }; + }; + "brace-expansion-1.1.11" = { + name = "brace-expansion"; + packageName = "brace-expansion"; + version = "1.1.11"; + src = fetchurl { + url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"; + sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="; + }; + }; + "buffer-5.7.1" = { + name = "buffer"; + packageName = "buffer"; + version = "5.7.1"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz"; + sha512 = "EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="; + }; + }; + "buffer-writer-2.0.0" = { + name = "buffer-writer"; + packageName = "buffer-writer"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz"; + sha512 = "a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="; + }; + }; + "builtin-modules-1.1.1" = { + name = "builtin-modules"; + packageName = "builtin-modules"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz"; + sha512 = "wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ=="; + }; + }; + "bytes-3.1.2" = { + name = "bytes"; + packageName = "bytes"; + version = "3.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"; + sha512 = "/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="; + }; + }; + "cacheable-lookup-2.0.1" = { + name = "cacheable-lookup"; + packageName = "cacheable-lookup"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz"; + sha512 = "EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg=="; + }; + }; + "cacheable-lookup-5.0.4" = { + name = "cacheable-lookup"; + packageName = "cacheable-lookup"; + version = "5.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz"; + sha512 = "2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="; + }; + }; + "cacheable-request-7.0.2" = { + name = "cacheable-request"; + packageName = "cacheable-request"; + version = "7.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz"; + sha512 = "pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew=="; + }; + }; + "call-bind-1.0.2" = { + name = "call-bind"; + packageName = "call-bind"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"; + sha512 = "7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="; + }; + }; + "camelcase-5.3.1" = { + name = "camelcase"; + packageName = "camelcase"; + version = "5.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"; + sha512 = "L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="; + }; + }; + "canvas-2.11.0" = { + name = "canvas"; + packageName = "canvas"; + version = "2.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/canvas/-/canvas-2.11.0.tgz"; + sha512 = "bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g=="; + }; + }; + "chalk-2.4.2" = { + name = "chalk"; + packageName = "chalk"; + version = "2.4.2"; + src = fetchurl { + url = "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"; + sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="; + }; + }; + "chalk-4.1.2" = { + name = "chalk"; + packageName = "chalk"; + version = "4.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"; + sha512 = "oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="; + }; + }; + "chownr-1.1.4" = { + name = "chownr"; + packageName = "chownr"; + version = "1.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz"; + sha512 = "jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="; + }; + }; + "chownr-2.0.0" = { + name = "chownr"; + packageName = "chownr"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz"; + sha512 = "bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="; + }; + }; + "cliui-6.0.0" = { + name = "cliui"; + packageName = "cliui"; + version = "6.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz"; + sha512 = "t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="; + }; + }; + "clone-response-1.0.3" = { + name = "clone-response"; + packageName = "clone-response"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz"; + sha512 = "ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="; + }; + }; + "color-3.2.1" = { + name = "color"; + packageName = "color"; + version = "3.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/color/-/color-3.2.1.tgz"; + sha512 = "aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="; + }; + }; + "color-convert-1.9.3" = { + name = "color-convert"; + packageName = "color-convert"; + version = "1.9.3"; + src = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"; + sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="; + }; + }; + "color-convert-2.0.1" = { + name = "color-convert"; + packageName = "color-convert"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"; + sha512 = "RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="; + }; + }; + "color-name-1.1.3" = { + name = "color-name"; + packageName = "color-name"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"; + sha512 = "72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="; + }; + }; + "color-name-1.1.4" = { + name = "color-name"; + packageName = "color-name"; + version = "1.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"; + sha512 = "dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="; + }; + }; + "color-string-1.9.1" = { + name = "color-string"; + packageName = "color-string"; + version = "1.9.1"; + src = fetchurl { + url = "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"; + sha512 = "shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="; + }; + }; + "color-support-1.1.3" = { + name = "color-support"; + packageName = "color-support"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz"; + sha512 = "qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="; + }; + }; + "colors-1.4.0" = { + name = "colors"; + packageName = "colors"; + version = "1.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz"; + sha512 = "a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="; + }; + }; + "colorspace-1.1.4" = { + name = "colorspace"; + packageName = "colorspace"; + version = "1.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz"; + sha512 = "BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w=="; + }; + }; + "combined-stream-1.0.8" = { + name = "combined-stream"; + packageName = "combined-stream"; + version = "1.0.8"; + src = fetchurl { + url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"; + sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="; + }; + }; + "command-line-args-5.2.1" = { + name = "command-line-args"; + packageName = "command-line-args"; + version = "5.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz"; + sha512 = "H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="; + }; + }; + "command-line-usage-5.0.5" = { + name = "command-line-usage"; + packageName = "command-line-usage"; + version = "5.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz"; + sha512 = "d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA=="; + }; + }; + "commander-2.20.3" = { + name = "commander"; + packageName = "commander"; + version = "2.20.3"; + src = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"; + sha512 = "GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="; + }; + }; + "concat-map-0.0.1" = { + name = "concat-map"; + packageName = "concat-map"; + version = "0.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"; + sha512 = "/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="; + }; + }; + "console-control-strings-1.1.0" = { + name = "console-control-strings"; + packageName = "console-control-strings"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"; + sha512 = "ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="; + }; + }; + "content-disposition-0.5.4" = { + name = "content-disposition"; + packageName = "content-disposition"; + version = "0.5.4"; + src = fetchurl { + url = "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz"; + sha512 = "FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="; + }; + }; + "content-type-1.0.5" = { + name = "content-type"; + packageName = "content-type"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"; + sha512 = "nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="; + }; + }; + "cookie-0.5.0" = { + name = "cookie"; + packageName = "cookie"; + version = "0.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz"; + sha512 = "YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="; + }; + }; + "cookie-signature-1.0.6" = { + name = "cookie-signature"; + packageName = "cookie-signature"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"; + sha512 = "QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="; + }; + }; + "csstype-3.1.1" = { + name = "csstype"; + packageName = "csstype"; + version = "3.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz"; + sha512 = "DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="; + }; + }; + "cycle-1.0.3" = { + name = "cycle"; + packageName = "cycle"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz"; + sha512 = "TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA=="; + }; + }; + "dateformat-3.0.3" = { + name = "dateformat"; + packageName = "dateformat"; + version = "3.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz"; + sha512 = "jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="; + }; + }; + "debug-2.6.9" = { + name = "debug"; + packageName = "debug"; + version = "2.6.9"; + src = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"; + sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="; + }; + }; + "debug-4.3.4" = { + name = "debug"; + packageName = "debug"; + version = "4.3.4"; + src = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"; + sha512 = "PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="; + }; + }; + "decamelize-1.2.0" = { + name = "decamelize"; + packageName = "decamelize"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"; + sha512 = "z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="; + }; + }; + "decompress-response-4.2.1" = { + name = "decompress-response"; + packageName = "decompress-response"; + version = "4.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz"; + sha512 = "jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw=="; + }; + }; + "decompress-response-5.0.0" = { + name = "decompress-response"; + packageName = "decompress-response"; + version = "5.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz"; + sha512 = "TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw=="; + }; + }; + "decompress-response-6.0.0" = { + name = "decompress-response"; + packageName = "decompress-response"; + version = "6.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz"; + sha512 = "aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="; + }; + }; + "deep-extend-0.6.0" = { + name = "deep-extend"; + packageName = "deep-extend"; + version = "0.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"; + sha512 = "LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="; + }; + }; + "deepmerge-4.3.1" = { + name = "deepmerge"; + packageName = "deepmerge"; + version = "4.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"; + sha512 = "3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="; + }; + }; + "defer-to-connect-2.0.1" = { + name = "defer-to-connect"; + packageName = "defer-to-connect"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz"; + sha512 = "4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="; + }; + }; + "delayed-stream-1.0.0" = { + name = "delayed-stream"; + packageName = "delayed-stream"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"; + sha512 = "ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="; + }; + }; + "delegates-1.0.0" = { + name = "delegates"; + packageName = "delegates"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"; + sha512 = "bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="; + }; + }; + "depd-2.0.0" = { + name = "depd"; + packageName = "depd"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"; + sha512 = "g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="; + }; + }; + "destroy-1.2.0" = { + name = "destroy"; + packageName = "destroy"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"; + sha512 = "2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="; + }; + }; + "detect-libc-2.0.1" = { + name = "detect-libc"; + packageName = "detect-libc"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz"; + sha512 = "463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="; + }; + }; + "diff-4.0.2" = { + name = "diff"; + packageName = "diff"; + version = "4.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"; + sha512 = "58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="; + }; + }; + "dom-serializer-1.4.1" = { + name = "dom-serializer"; + packageName = "dom-serializer"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"; + sha512 = "VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="; + }; + }; + "dom-serializer-2.0.0" = { + name = "dom-serializer"; + packageName = "dom-serializer"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz"; + sha512 = "wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="; + }; + }; + "domelementtype-2.3.0" = { + name = "domelementtype"; + packageName = "domelementtype"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"; + sha512 = "OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="; + }; + }; + "domhandler-3.3.0" = { + name = "domhandler"; + packageName = "domhandler"; + version = "3.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz"; + sha512 = "J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA=="; + }; + }; + "domhandler-4.3.1" = { + name = "domhandler"; + packageName = "domhandler"; + version = "4.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz"; + sha512 = "GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="; + }; + }; + "domhandler-5.0.3" = { + name = "domhandler"; + packageName = "domhandler"; + version = "5.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz"; + sha512 = "cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="; + }; + }; + "domutils-2.8.0" = { + name = "domutils"; + packageName = "domutils"; + version = "2.8.0"; + src = fetchurl { + url = "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz"; + sha512 = "w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="; + }; + }; + "domutils-3.0.1" = { + name = "domutils"; + packageName = "domutils"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz"; + sha512 = "z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q=="; + }; + }; + "duplexer3-0.1.5" = { + name = "duplexer3"; + packageName = "duplexer3"; + version = "0.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz"; + sha512 = "1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="; + }; + }; + "ee-first-1.1.1" = { + name = "ee-first"; + packageName = "ee-first"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"; + sha512 = "WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="; + }; + }; + "emoji-regex-8.0.0" = { + name = "emoji-regex"; + packageName = "emoji-regex"; + version = "8.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"; + sha512 = "MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="; + }; + }; + "enabled-2.0.0" = { + name = "enabled"; + packageName = "enabled"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz"; + sha512 = "AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="; + }; + }; + "encodeurl-1.0.2" = { + name = "encodeurl"; + packageName = "encodeurl"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"; + sha512 = "TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="; + }; + }; + "end-of-stream-1.4.4" = { + name = "end-of-stream"; + packageName = "end-of-stream"; + version = "1.4.4"; + src = fetchurl { + url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"; + sha512 = "+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="; + }; + }; + "entities-1.1.2" = { + name = "entities"; + packageName = "entities"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz"; + sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="; + }; + }; + "entities-2.2.0" = { + name = "entities"; + packageName = "entities"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"; + sha512 = "p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="; + }; + }; + "entities-4.4.0" = { + name = "entities"; + packageName = "entities"; + version = "4.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz"; + sha512 = "oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="; + }; + }; + "escape-html-1.0.3" = { + name = "escape-html"; + packageName = "escape-html"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"; + sha512 = "NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="; + }; + }; + "escape-string-regexp-1.0.5" = { + name = "escape-string-regexp"; + packageName = "escape-string-regexp"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"; + sha512 = "vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="; + }; + }; + "escape-string-regexp-4.0.0" = { + name = "escape-string-regexp"; + packageName = "escape-string-regexp"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"; + sha512 = "TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="; + }; + }; + "esprima-4.0.1" = { + name = "esprima"; + packageName = "esprima"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"; + sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="; + }; + }; + "etag-1.8.1" = { + name = "etag"; + packageName = "etag"; + version = "1.8.1"; + src = fetchurl { + url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"; + sha512 = "aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="; + }; + }; + "eventemitter3-3.1.2" = { + name = "eventemitter3"; + packageName = "eventemitter3"; + version = "3.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz"; + sha512 = "tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="; + }; + }; + "eventemitter3-4.0.7" = { + name = "eventemitter3"; + packageName = "eventemitter3"; + version = "4.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz"; + sha512 = "8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="; + }; + }; + "events-3.3.0" = { + name = "events"; + packageName = "events"; + version = "3.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/events/-/events-3.3.0.tgz"; + sha512 = "mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="; + }; + }; + "expand-template-2.0.3" = { + name = "expand-template"; + packageName = "expand-template"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz"; + sha512 = "XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="; + }; + }; + "expire-set-1.0.0" = { + name = "expire-set"; + packageName = "expire-set"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/expire-set/-/expire-set-1.0.0.tgz"; + sha512 = "wOQlqatf2sJtOabNk3gEPbGvo/C8tIUhzT3rz08+i7X+u1NV+UNY4p3Lzq8DxrW57mBML1Fp5qNeYt70Qnndpg=="; + }; + }; + "express-4.18.2" = { + name = "express"; + packageName = "express"; + version = "4.18.2"; + src = fetchurl { + url = "https://registry.npmjs.org/express/-/express-4.18.2.tgz"; + sha512 = "5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ=="; + }; + }; + "extend-shallow-2.0.1" = { + name = "extend-shallow"; + packageName = "extend-shallow"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"; + sha512 = "zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="; + }; + }; + "fast-safe-stringify-2.1.1" = { + name = "fast-safe-stringify"; + packageName = "fast-safe-stringify"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz"; + sha512 = "W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="; + }; + }; + "fecha-2.3.3" = { + name = "fecha"; + packageName = "fecha"; + version = "2.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz"; + sha512 = "lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="; + }; + }; + "fecha-4.2.3" = { + name = "fecha"; + packageName = "fecha"; + version = "4.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz"; + sha512 = "OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="; + }; + }; + "file-stream-rotator-0.4.1" = { + name = "file-stream-rotator"; + packageName = "file-stream-rotator"; + version = "0.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz"; + sha512 = "W3aa3QJEc8BS2MmdVpQiYLKHj3ijpto1gMDlsgCRSKfIUe6MwkcpODGPQ3vZfb0XvCeCqlu9CBQTN7oQri2TZQ=="; + }; + }; + "file-type-12.4.2" = { + name = "file-type"; + packageName = "file-type"; + version = "12.4.2"; + src = fetchurl { + url = "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz"; + sha512 = "UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg=="; + }; + }; + "file-uri-to-path-1.0.0" = { + name = "file-uri-to-path"; + packageName = "file-uri-to-path"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"; + sha512 = "0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="; + }; + }; + "finalhandler-1.2.0" = { + name = "finalhandler"; + packageName = "finalhandler"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz"; + sha512 = "5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg=="; + }; + }; + "find-replace-3.0.0" = { + name = "find-replace"; + packageName = "find-replace"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz"; + sha512 = "6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="; + }; + }; + "find-up-4.1.0" = { + name = "find-up"; + packageName = "find-up"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"; + sha512 = "PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="; + }; + }; + "finity-0.5.4" = { + name = "finity"; + packageName = "finity"; + version = "0.5.4"; + src = fetchurl { + url = "https://registry.npmjs.org/finity/-/finity-0.5.4.tgz"; + sha512 = "3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA=="; + }; + }; + "fn.name-1.1.0" = { + name = "fn.name"; + packageName = "fn.name"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz"; + sha512 = "GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="; + }; + }; + "follow-redirects-1.15.2" = { + name = "follow-redirects"; + packageName = "follow-redirects"; + version = "1.15.2"; + src = fetchurl { + url = "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"; + sha512 = "VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="; + }; + }; + "form-data-2.5.1" = { + name = "form-data"; + packageName = "form-data"; + version = "2.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz"; + sha512 = "m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA=="; + }; + }; + "forwarded-0.2.0" = { + name = "forwarded"; + packageName = "forwarded"; + version = "0.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"; + sha512 = "buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="; + }; + }; + "fresh-0.5.2" = { + name = "fresh"; + packageName = "fresh"; + version = "0.5.2"; + src = fetchurl { + url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"; + sha512 = "zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="; + }; + }; + "fs-constants-1.0.0" = { + name = "fs-constants"; + packageName = "fs-constants"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz"; + sha512 = "y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="; + }; + }; + "fs-minipass-2.1.0" = { + name = "fs-minipass"; + packageName = "fs-minipass"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"; + sha512 = "V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="; + }; + }; + "fs.realpath-1.0.0" = { + name = "fs.realpath"; + packageName = "fs.realpath"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"; + sha512 = "OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="; + }; + }; + "function-bind-1.1.1" = { + name = "function-bind"; + packageName = "function-bind"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"; + sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="; + }; + }; + "gauge-3.0.2" = { + name = "gauge"; + packageName = "gauge"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz"; + sha512 = "+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q=="; + }; + }; + "get-caller-file-2.0.5" = { + name = "get-caller-file"; + packageName = "get-caller-file"; + version = "2.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"; + sha512 = "DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="; + }; + }; + "get-intrinsic-1.2.0" = { + name = "get-intrinsic"; + packageName = "get-intrinsic"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz"; + sha512 = "L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q=="; + }; + }; + "get-stream-5.2.0" = { + name = "get-stream"; + packageName = "get-stream"; + version = "5.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"; + sha512 = "nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="; + }; + }; + "github-from-package-0.0.0" = { + name = "github-from-package"; + packageName = "github-from-package"; + version = "0.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz"; + sha512 = "SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="; + }; + }; + "glob-7.2.3" = { + name = "glob"; + packageName = "glob"; + version = "7.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"; + sha512 = "nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="; + }; + }; + "glob-to-regexp-0.4.1" = { + name = "glob-to-regexp"; + packageName = "glob-to-regexp"; + version = "0.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"; + sha512 = "lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="; + }; + }; + "got-10.7.0" = { + name = "got"; + packageName = "got"; + version = "10.7.0"; + src = fetchurl { + url = "https://registry.npmjs.org/got/-/got-10.7.0.tgz"; + sha512 = "aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg=="; + }; + }; + "got-11.8.6" = { + name = "got"; + packageName = "got"; + version = "11.8.6"; + src = fetchurl { + url = "https://registry.npmjs.org/got/-/got-11.8.6.tgz"; + sha512 = "6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="; + }; + }; + "graceful-fs-4.2.11" = { + name = "graceful-fs"; + packageName = "graceful-fs"; + version = "4.2.11"; + src = fetchurl { + url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"; + sha512 = "RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="; + }; + }; + "has-1.0.3" = { + name = "has"; + packageName = "has"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz"; + sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="; + }; + }; + "has-flag-3.0.0" = { + name = "has-flag"; + packageName = "has-flag"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"; + sha512 = "sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="; + }; + }; + "has-flag-4.0.0" = { + name = "has-flag"; + packageName = "has-flag"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"; + sha512 = "EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="; + }; + }; + "has-symbols-1.0.3" = { + name = "has-symbols"; + packageName = "has-symbols"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"; + sha512 = "l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="; + }; + }; + "has-unicode-2.0.1" = { + name = "has-unicode"; + packageName = "has-unicode"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"; + sha512 = "8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="; + }; + }; + "hash.js-1.1.7" = { + name = "hash.js"; + packageName = "hash.js"; + version = "1.1.7"; + src = fetchurl { + url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"; + sha512 = "taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="; + }; + }; + "hasha-5.2.2" = { + name = "hasha"; + packageName = "hasha"; + version = "5.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz"; + sha512 = "Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ=="; + }; + }; + "he-1.2.0" = { + name = "he"; + packageName = "he"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/he/-/he-1.2.0.tgz"; + sha512 = "F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="; + }; + }; + "html-to-text-6.0.0" = { + name = "html-to-text"; + packageName = "html-to-text"; + version = "6.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/html-to-text/-/html-to-text-6.0.0.tgz"; + sha512 = "r0KNC5aqCAItsjlgtirW6RW25c92Ee3ybQj8z//4Sl4suE3HIPqM4deGpYCUJULLjtVPEP1+Ma+1ZeX1iMsCiA=="; + }; + }; + "htmlencode-0.0.4" = { + name = "htmlencode"; + packageName = "htmlencode"; + version = "0.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/htmlencode/-/htmlencode-0.0.4.tgz"; + sha512 = "0uDvNVpzj/E2TfvLLyyXhKBRvF1y84aZsyRxRXFsQobnHaL4pcaXk+Y9cnFlvnxrBLeXDNq/VJBD+ngdBgQG1w=="; + }; + }; + "htmlparser2-4.1.0" = { + name = "htmlparser2"; + packageName = "htmlparser2"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz"; + sha512 = "4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q=="; + }; + }; + "htmlparser2-8.0.1" = { + name = "htmlparser2"; + packageName = "htmlparser2"; + version = "8.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz"; + sha512 = "4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA=="; + }; + }; + "http-cache-semantics-4.1.1" = { + name = "http-cache-semantics"; + packageName = "http-cache-semantics"; + version = "4.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz"; + sha512 = "er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="; + }; + }; + "http-errors-2.0.0" = { + name = "http-errors"; + packageName = "http-errors"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"; + sha512 = "FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="; + }; + }; + "http2-wrapper-1.0.3" = { + name = "http2-wrapper"; + packageName = "http2-wrapper"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz"; + sha512 = "V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="; + }; + }; + "https-proxy-agent-5.0.1" = { + name = "https-proxy-agent"; + packageName = "https-proxy-agent"; + version = "5.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz"; + sha512 = "dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="; + }; + }; + "iconv-lite-0.4.24" = { + name = "iconv-lite"; + packageName = "iconv-lite"; + version = "0.4.24"; + src = fetchurl { + url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"; + sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="; + }; + }; + "ieee754-1.2.1" = { + name = "ieee754"; + packageName = "ieee754"; + version = "1.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"; + sha512 = "dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="; + }; + }; + "inflight-1.0.6" = { + name = "inflight"; + packageName = "inflight"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"; + sha512 = "k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="; + }; + }; + "inherits-2.0.4" = { + name = "inherits"; + packageName = "inherits"; + version = "2.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"; + sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="; + }; + }; + "ini-1.3.8" = { + name = "ini"; + packageName = "ini"; + version = "1.3.8"; + src = fetchurl { + url = "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"; + sha512 = "JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="; + }; + }; + "ipaddr.js-1.9.1" = { + name = "ipaddr.js"; + packageName = "ipaddr.js"; + version = "1.9.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"; + sha512 = "0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="; + }; + }; + "is-arrayish-0.3.2" = { + name = "is-arrayish"; + packageName = "is-arrayish"; + version = "0.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz"; + sha512 = "eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="; + }; + }; + "is-core-module-2.11.0" = { + name = "is-core-module"; + packageName = "is-core-module"; + version = "2.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz"; + sha512 = "RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw=="; + }; + }; + "is-extendable-0.1.1" = { + name = "is-extendable"; + packageName = "is-extendable"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"; + sha512 = "5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="; + }; + }; + "is-fullwidth-code-point-3.0.0" = { + name = "is-fullwidth-code-point"; + packageName = "is-fullwidth-code-point"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"; + sha512 = "zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="; + }; + }; + "is-plain-object-5.0.0" = { + name = "is-plain-object"; + packageName = "is-plain-object"; + version = "5.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz"; + sha512 = "VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="; + }; + }; + "is-promise-2.2.2" = { + name = "is-promise"; + packageName = "is-promise"; + version = "2.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz"; + sha512 = "+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="; + }; + }; + "is-stream-1.1.0" = { + name = "is-stream"; + packageName = "is-stream"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"; + sha512 = "uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="; + }; + }; + "is-stream-2.0.1" = { + name = "is-stream"; + packageName = "is-stream"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"; + sha512 = "hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="; + }; + }; + "js-tokens-4.0.0" = { + name = "js-tokens"; + packageName = "js-tokens"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"; + sha512 = "RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="; + }; + }; + "js-yaml-3.14.1" = { + name = "js-yaml"; + packageName = "js-yaml"; + version = "3.14.1"; + src = fetchurl { + url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"; + sha512 = "okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="; + }; + }; + "json-buffer-3.0.1" = { + name = "json-buffer"; + packageName = "json-buffer"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"; + sha512 = "4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="; + }; + }; + "keyv-4.5.2" = { + name = "keyv"; + packageName = "keyv"; + version = "4.5.2"; + src = fetchurl { + url = "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz"; + sha512 = "5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g=="; + }; + }; + "kuler-2.0.0" = { + name = "kuler"; + packageName = "kuler"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz"; + sha512 = "Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="; + }; + }; + "linkify-it-2.2.0" = { + name = "linkify-it"; + packageName = "linkify-it"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz"; + sha512 = "GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw=="; + }; + }; + "locate-path-5.0.0" = { + name = "locate-path"; + packageName = "locate-path"; + version = "5.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"; + sha512 = "t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="; + }; + }; + "lodash-4.17.21" = { + name = "lodash"; + packageName = "lodash"; + version = "4.17.21"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"; + sha512 = "v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="; + }; + }; + "lodash.camelcase-4.3.0" = { + name = "lodash.camelcase"; + packageName = "lodash.camelcase"; + version = "4.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"; + sha512 = "TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="; + }; + }; + "lodash.isstring-4.0.1" = { + name = "lodash.isstring"; + packageName = "lodash.isstring"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz"; + sha512 = "0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="; + }; + }; + "lodash.padend-4.6.1" = { + name = "lodash.padend"; + packageName = "lodash.padend"; + version = "4.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz"; + sha512 = "sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw=="; + }; + }; + "logform-1.10.0" = { + name = "logform"; + packageName = "logform"; + version = "1.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz"; + sha512 = "em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg=="; + }; + }; + "logform-2.5.1" = { + name = "logform"; + packageName = "logform"; + version = "2.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz"; + sha512 = "9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg=="; + }; + }; + "lowdb-1.0.0" = { + name = "lowdb"; + packageName = "lowdb"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz"; + sha512 = "2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ=="; + }; + }; + "lowercase-keys-2.0.0" = { + name = "lowercase-keys"; + packageName = "lowercase-keys"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"; + sha512 = "tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="; + }; + }; + "lru-cache-6.0.0" = { + name = "lru-cache"; + packageName = "lru-cache"; + version = "6.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"; + sha512 = "Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="; + }; + }; + "make-dir-3.1.0" = { + name = "make-dir"; + packageName = "make-dir"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz"; + sha512 = "g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="; + }; + }; + "markdown-it-9.1.0" = { + name = "markdown-it"; + packageName = "markdown-it"; + version = "9.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/markdown-it/-/markdown-it-9.1.0.tgz"; + sha512 = "xHKG4C8iPriyfu/jc2hsCC045fKrMQ0VexX2F1FGYiRxDxqMB2aAhF8WauJ3fltn2kb90moGBkiiEdooGIg55w=="; + }; + }; + "mdurl-1.0.1" = { + name = "mdurl"; + packageName = "mdurl"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz"; + sha512 = "/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="; + }; + }; + "media-typer-0.3.0" = { + name = "media-typer"; + packageName = "media-typer"; + version = "0.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"; + sha512 = "dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="; + }; + }; + "merge-descriptors-1.0.1" = { + name = "merge-descriptors"; + packageName = "merge-descriptors"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"; + sha512 = "cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="; + }; + }; + "methods-1.1.2" = { + name = "methods"; + packageName = "methods"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"; + sha512 = "iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="; + }; + }; + "mime-1.6.0" = { + name = "mime"; + packageName = "mime"; + version = "1.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"; + sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="; + }; + }; + "mime-db-1.52.0" = { + name = "mime-db"; + packageName = "mime-db"; + version = "1.52.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"; + sha512 = "sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="; + }; + }; + "mime-types-2.1.35" = { + name = "mime-types"; + packageName = "mime-types"; + version = "2.1.35"; + src = fetchurl { + url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"; + sha512 = "ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="; + }; + }; + "mimic-response-1.0.1" = { + name = "mimic-response"; + packageName = "mimic-response"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"; + sha512 = "j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="; + }; + }; + "mimic-response-2.1.0" = { + name = "mimic-response"; + packageName = "mimic-response"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz"; + sha512 = "wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="; + }; + }; + "mimic-response-3.1.0" = { + name = "mimic-response"; + packageName = "mimic-response"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"; + sha512 = "z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="; + }; + }; + "minimalistic-assert-1.0.1" = { + name = "minimalistic-assert"; + packageName = "minimalistic-assert"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"; + sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="; + }; + }; + "minimatch-3.1.2" = { + name = "minimatch"; + packageName = "minimatch"; + version = "3.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"; + sha512 = "J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="; + }; + }; + "minimist-1.2.8" = { + name = "minimist"; + packageName = "minimist"; + version = "1.2.8"; + src = fetchurl { + url = "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"; + sha512 = "2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="; + }; + }; + "minipass-3.3.6" = { + name = "minipass"; + packageName = "minipass"; + version = "3.3.6"; + src = fetchurl { + url = "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz"; + sha512 = "DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="; + }; + }; + "minipass-4.2.5" = { + name = "minipass"; + packageName = "minipass"; + version = "4.2.5"; + src = fetchurl { + url = "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz"; + sha512 = "+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q=="; + }; + }; + "minizlib-2.1.2" = { + name = "minizlib"; + packageName = "minizlib"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz"; + sha512 = "bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="; + }; + }; + "mkdirp-0.5.6" = { + name = "mkdirp"; + packageName = "mkdirp"; + version = "0.5.6"; + src = fetchurl { + url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz"; + sha512 = "FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="; + }; + }; + "mkdirp-1.0.4" = { + name = "mkdirp"; + packageName = "mkdirp"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"; + sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="; + }; + }; + "mkdirp-classic-0.5.3" = { + name = "mkdirp-classic"; + packageName = "mkdirp-classic"; + version = "0.5.3"; + src = fetchurl { + url = "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz"; + sha512 = "gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="; + }; + }; + "moment-2.29.4" = { + name = "moment"; + packageName = "moment"; + version = "2.29.4"; + src = fetchurl { + url = "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz"; + sha512 = "5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="; + }; + }; + "morgan-1.10.0" = { + name = "morgan"; + packageName = "morgan"; + version = "1.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz"; + sha512 = "AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ=="; + }; + }; + "ms-2.0.0" = { + name = "ms"; + packageName = "ms"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"; + sha512 = "Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="; + }; + }; + "ms-2.1.2" = { + name = "ms"; + packageName = "ms"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"; + sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="; + }; + }; + "ms-2.1.3" = { + name = "ms"; + packageName = "ms"; + version = "2.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"; + sha512 = "6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="; + }; + }; + "nan-2.17.0" = { + name = "nan"; + packageName = "nan"; + version = "2.17.0"; + src = fetchurl { + url = "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz"; + sha512 = "2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ=="; + }; + }; + "nanoid-3.3.4" = { + name = "nanoid"; + packageName = "nanoid"; + version = "3.3.4"; + src = fetchurl { + url = "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"; + sha512 = "MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="; + }; + }; + "napi-build-utils-1.0.2" = { + name = "napi-build-utils"; + packageName = "napi-build-utils"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz"; + sha512 = "ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="; + }; + }; + "negotiator-0.6.3" = { + name = "negotiator"; + packageName = "negotiator"; + version = "0.6.3"; + src = fetchurl { + url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"; + sha512 = "+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="; + }; + }; + "node-abi-3.33.0" = { + name = "node-abi"; + packageName = "node-abi"; + version = "3.33.0"; + src = fetchurl { + url = "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz"; + sha512 = "7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog=="; + }; + }; + "node-emoji-1.11.0" = { + name = "node-emoji"; + packageName = "node-emoji"; + version = "1.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz"; + sha512 = "wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A=="; + }; + }; + "node-fetch-2.6.9" = { + name = "node-fetch"; + packageName = "node-fetch"; + version = "2.6.9"; + src = fetchurl { + url = "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz"; + sha512 = "DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg=="; + }; + }; + "node-html-parser-1.4.9" = { + name = "node-html-parser"; + packageName = "node-html-parser"; + version = "1.4.9"; + src = fetchurl { + url = "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz"; + sha512 = "UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw=="; + }; + }; + "nopt-5.0.0" = { + name = "nopt"; + packageName = "nopt"; + version = "5.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz"; + sha512 = "Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="; + }; + }; + "normalize-url-6.1.0" = { + name = "normalize-url"; + packageName = "normalize-url"; + version = "6.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"; + sha512 = "DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="; + }; + }; + "normalize-version-1.0.5" = { + name = "normalize-version"; + packageName = "normalize-version"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-version/-/normalize-version-1.0.5.tgz"; + sha512 = "gnPd21y/zdWO76ye7gP2eFO1tEUczd5DC6syABM25OLtS5MgsS3ZRB/vaaHz2Ir4x6SMzIrP0QZUpxs3VYPzKA=="; + }; + }; + "npmlog-5.0.1" = { + name = "npmlog"; + packageName = "npmlog"; + version = "5.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz"; + sha512 = "AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw=="; + }; + }; + "object-assign-4.1.1" = { + name = "object-assign"; + packageName = "object-assign"; + version = "4.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"; + sha512 = "rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="; + }; + }; + "object-hash-1.3.1" = { + name = "object-hash"; + packageName = "object-hash"; + version = "1.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz"; + sha512 = "OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA=="; + }; + }; + "object-inspect-1.12.3" = { + name = "object-inspect"; + packageName = "object-inspect"; + version = "1.12.3"; + src = fetchurl { + url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz"; + sha512 = "geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="; + }; + }; + "on-finished-2.3.0" = { + name = "on-finished"; + packageName = "on-finished"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"; + sha512 = "ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="; + }; + }; + "on-finished-2.4.1" = { + name = "on-finished"; + packageName = "on-finished"; + version = "2.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"; + sha512 = "oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="; + }; + }; + "on-headers-1.0.2" = { + name = "on-headers"; + packageName = "on-headers"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"; + sha512 = "pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="; + }; + }; + "once-1.4.0" = { + name = "once"; + packageName = "once"; + version = "1.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz"; + sha512 = "lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="; + }; + }; + "one-time-1.0.0" = { + name = "one-time"; + packageName = "one-time"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz"; + sha512 = "5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="; + }; + }; + "p-cancelable-1.1.0" = { + name = "p-cancelable"; + packageName = "p-cancelable"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz"; + sha512 = "s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="; + }; + }; + "p-cancelable-2.1.1" = { + name = "p-cancelable"; + packageName = "p-cancelable"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz"; + sha512 = "BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="; + }; + }; + "p-event-4.2.0" = { + name = "p-event"; + packageName = "p-event"; + version = "4.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz"; + sha512 = "KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ=="; + }; + }; + "p-finally-1.0.0" = { + name = "p-finally"; + packageName = "p-finally"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"; + sha512 = "LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="; + }; + }; + "p-limit-2.3.0" = { + name = "p-limit"; + packageName = "p-limit"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"; + sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="; + }; + }; + "p-locate-4.1.0" = { + name = "p-locate"; + packageName = "p-locate"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"; + sha512 = "R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="; + }; + }; + "p-queue-2.4.2" = { + name = "p-queue"; + packageName = "p-queue"; + version = "2.4.2"; + src = fetchurl { + url = "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz"; + sha512 = "n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng=="; + }; + }; + "p-queue-6.6.2" = { + name = "p-queue"; + packageName = "p-queue"; + version = "6.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz"; + sha512 = "RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="; + }; + }; + "p-retry-4.6.2" = { + name = "p-retry"; + packageName = "p-retry"; + version = "4.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz"; + sha512 = "312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="; + }; + }; + "p-timeout-3.2.0" = { + name = "p-timeout"; + packageName = "p-timeout"; + version = "3.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz"; + sha512 = "rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="; + }; + }; + "p-try-2.2.0" = { + name = "p-try"; + packageName = "p-try"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"; + sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="; + }; + }; + "packet-reader-1.0.0" = { + name = "packet-reader"; + packageName = "packet-reader"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz"; + sha512 = "HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="; + }; + }; + "parse-srcset-1.0.2" = { + name = "parse-srcset"; + packageName = "parse-srcset"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz"; + sha512 = "/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="; + }; + }; + "parseurl-1.3.3" = { + name = "parseurl"; + packageName = "parseurl"; + version = "1.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"; + sha512 = "CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="; + }; + }; + "path-exists-4.0.0" = { + name = "path-exists"; + packageName = "path-exists"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"; + sha512 = "ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="; + }; + }; + "path-is-absolute-1.0.1" = { + name = "path-is-absolute"; + packageName = "path-is-absolute"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"; + sha512 = "AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="; + }; + }; + "path-parse-1.0.7" = { + name = "path-parse"; + packageName = "path-parse"; + version = "1.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"; + sha512 = "LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="; + }; + }; + "path-to-regexp-0.1.7" = { + name = "path-to-regexp"; + packageName = "path-to-regexp"; + version = "0.1.7"; + src = fetchurl { + url = "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"; + sha512 = "5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="; + }; + }; + "pg-8.8.0" = { + name = "pg"; + packageName = "pg"; + version = "8.8.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz"; + sha512 = "UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw=="; + }; + }; + "pg-connection-string-2.5.0" = { + name = "pg-connection-string"; + packageName = "pg-connection-string"; + version = "2.5.0"; + 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" = { + name = "pg-int8"; + packageName = "pg-int8"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz"; + sha512 = "WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="; + }; + }; + "pg-minify-1.6.2" = { + name = "pg-minify"; + packageName = "pg-minify"; + version = "1.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.2.tgz"; + sha512 = "1KdmFGGTP6jplJoI8MfvRlfvMiyBivMRP7/ffh4a11RUFJ7kC2J0ZHlipoKiH/1hz+DVgceon9U2qbaHpPeyPg=="; + }; + }; + "pg-pool-3.6.0" = { + name = "pg-pool"; + packageName = "pg-pool"; + version = "3.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz"; + sha512 = "clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ=="; + }; + }; + "pg-promise-10.15.4" = { + name = "pg-promise"; + packageName = "pg-promise"; + version = "10.15.4"; + src = fetchurl { + url = "https://registry.npmjs.org/pg-promise/-/pg-promise-10.15.4.tgz"; + sha512 = "BKlHCMCdNUmF6gagVbehRWSEiVcZzPVltEx14OJExR9Iz9/1R6KETDWLLGv2l6yRqYFnEZZy1VDjRhArzeIGrw=="; + }; + }; + "pg-protocol-1.6.0" = { + name = "pg-protocol"; + packageName = "pg-protocol"; + version = "1.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz"; + sha512 = "M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="; + }; + }; + "pg-types-2.2.0" = { + name = "pg-types"; + packageName = "pg-types"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz"; + sha512 = "qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="; + }; + }; + "pgpass-1.0.5" = { + name = "pgpass"; + packageName = "pgpass"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz"; + sha512 = "FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="; + }; + }; + "picocolors-1.0.0" = { + name = "picocolors"; + packageName = "picocolors"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"; + sha512 = "1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="; + }; + }; + "pify-3.0.0" = { + name = "pify"; + packageName = "pify"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"; + sha512 = "C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="; + }; + }; + "postcss-8.4.21" = { + name = "postcss"; + packageName = "postcss"; + version = "8.4.21"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz"; + sha512 = "tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg=="; + }; + }; + "postgres-array-2.0.0" = { + name = "postgres-array"; + packageName = "postgres-array"; + version = "2.0.0"; + 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" = { + name = "postgres-bytea"; + packageName = "postgres-bytea"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz"; + sha512 = "xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="; + }; + }; + "postgres-date-1.0.7" = { + name = "postgres-date"; + packageName = "postgres-date"; + version = "1.0.7"; + 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" = { + name = "postgres-interval"; + packageName = "postgres-interval"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz"; + sha512 = "9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="; + }; + }; + "prebuild-install-7.1.1" = { + name = "prebuild-install"; + packageName = "prebuild-install"; + version = "7.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz"; + sha512 = "jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw=="; + }; + }; + "prom-client-13.2.0" = { + name = "prom-client"; + packageName = "prom-client"; + version = "13.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/prom-client/-/prom-client-13.2.0.tgz"; + sha512 = "wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ=="; + }; + }; + "proxy-addr-2.0.7" = { + name = "proxy-addr"; + packageName = "proxy-addr"; + version = "2.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"; + sha512 = "llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="; + }; + }; + "pump-3.0.0" = { + name = "pump"; + packageName = "pump"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"; + sha512 = "LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="; + }; + }; + "qs-6.11.0" = { + name = "qs"; + packageName = "qs"; + version = "6.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz"; + sha512 = "MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q=="; + }; + }; + "quick-lru-5.1.1" = { + name = "quick-lru"; + packageName = "quick-lru"; + version = "5.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"; + sha512 = "WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="; + }; + }; + "range-parser-1.2.1" = { + name = "range-parser"; + packageName = "range-parser"; + version = "1.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"; + sha512 = "Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="; + }; + }; + "raw-body-2.5.1" = { + name = "raw-body"; + packageName = "raw-body"; + version = "2.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz"; + sha512 = "qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig=="; + }; + }; + "rc-1.2.8" = { + name = "rc"; + packageName = "rc"; + version = "1.2.8"; + src = fetchurl { + url = "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"; + sha512 = "y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="; + }; + }; + "readable-stream-3.6.2" = { + name = "readable-stream"; + packageName = "readable-stream"; + version = "3.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"; + sha512 = "9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="; + }; + }; + "reduce-flatten-1.0.1" = { + name = "reduce-flatten"; + packageName = "reduce-flatten"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz"; + sha512 = "j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ=="; + }; + }; + "require-directory-2.1.1" = { + name = "require-directory"; + packageName = "require-directory"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"; + sha512 = "fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="; + }; + }; + "require-main-filename-2.0.0" = { + name = "require-main-filename"; + packageName = "require-main-filename"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz"; + sha512 = "NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="; + }; + }; + "resolve-1.22.1" = { + name = "resolve"; + packageName = "resolve"; + version = "1.22.1"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"; + sha512 = "nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw=="; + }; + }; + "resolve-alpn-1.2.1" = { + name = "resolve-alpn"; + packageName = "resolve-alpn"; + version = "1.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz"; + sha512 = "0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="; + }; + }; + "responselike-2.0.1" = { + name = "responselike"; + packageName = "responselike"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz"; + sha512 = "4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="; + }; + }; + "retry-0.13.1" = { + name = "retry"; + packageName = "retry"; + version = "0.13.1"; + src = fetchurl { + url = "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz"; + sha512 = "XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="; + }; + }; + "rimraf-3.0.2" = { + name = "rimraf"; + packageName = "rimraf"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"; + sha512 = "JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="; + }; + }; + "safe-buffer-5.1.2" = { + name = "safe-buffer"; + packageName = "safe-buffer"; + version = "5.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"; + sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="; + }; + }; + "safe-buffer-5.2.1" = { + name = "safe-buffer"; + packageName = "safe-buffer"; + version = "5.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"; + sha512 = "rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="; + }; + }; + "safe-stable-stringify-2.4.2" = { + name = "safe-stable-stringify"; + packageName = "safe-stable-stringify"; + version = "2.4.2"; + src = fetchurl { + url = "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz"; + sha512 = "gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA=="; + }; + }; + "safer-buffer-2.1.2" = { + name = "safer-buffer"; + packageName = "safer-buffer"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"; + sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="; + }; + }; + "sanitize-html-2.10.0" = { + name = "sanitize-html"; + packageName = "sanitize-html"; + version = "2.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz"; + sha512 = "JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ=="; + }; + }; + "semver-5.7.1" = { + name = "semver"; + packageName = "semver"; + version = "5.7.1"; + src = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"; + sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="; + }; + }; + "semver-6.3.0" = { + name = "semver"; + packageName = "semver"; + version = "6.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"; + sha512 = "b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="; + }; + }; + "semver-7.3.8" = { + name = "semver"; + packageName = "semver"; + version = "7.3.8"; + src = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz"; + sha512 = "NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A=="; + }; + }; + "semver-closest-0.1.2" = { + name = "semver-closest"; + packageName = "semver-closest"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/semver-closest/-/semver-closest-0.1.2.tgz"; + sha512 = "Q6qk0bPNlK5zG62mWFC8L0Qc6OJX76XRWxiPgZyrh98IZTL3HPErgUlPfCyrAPsHVpU+YP4lf5Mz+LzpId91Og=="; + }; + }; + "send-0.18.0" = { + name = "send"; + packageName = "send"; + version = "0.18.0"; + src = fetchurl { + url = "https://registry.npmjs.org/send/-/send-0.18.0.tgz"; + sha512 = "qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg=="; + }; + }; + "serve-static-1.15.0" = { + name = "serve-static"; + packageName = "serve-static"; + version = "1.15.0"; + src = fetchurl { + url = "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz"; + sha512 = "XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g=="; + }; + }; + "set-blocking-2.0.0" = { + name = "set-blocking"; + packageName = "set-blocking"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"; + sha512 = "KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="; + }; + }; + "setprototypeof-1.2.0" = { + name = "setprototypeof"; + packageName = "setprototypeof"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"; + sha512 = "E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="; + }; + }; + "side-channel-1.0.4" = { + name = "side-channel"; + packageName = "side-channel"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"; + sha512 = "q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="; + }; + }; + "signal-exit-3.0.7" = { + name = "signal-exit"; + packageName = "signal-exit"; + version = "3.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"; + sha512 = "wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="; + }; + }; + "simple-concat-1.0.1" = { + name = "simple-concat"; + packageName = "simple-concat"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz"; + sha512 = "cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="; + }; + }; + "simple-get-3.1.1" = { + name = "simple-get"; + packageName = "simple-get"; + version = "3.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz"; + sha512 = "CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA=="; + }; + }; + "simple-get-4.0.1" = { + name = "simple-get"; + packageName = "simple-get"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz"; + sha512 = "brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="; + }; + }; + "simple-markdown-0.7.3" = { + name = "simple-markdown"; + packageName = "simple-markdown"; + version = "0.7.3"; + src = fetchurl { + url = "https://registry.npmjs.org/simple-markdown/-/simple-markdown-0.7.3.tgz"; + sha512 = "uGXIc13NGpqfPeFJIt/7SHHxd6HekEJYtsdoCM06mEBPL9fQH/pSD7LRM6PZ7CKchpSvxKL4tvwMamqAaNDAyg=="; + }; + }; + "simple-swizzle-0.2.2" = { + name = "simple-swizzle"; + packageName = "simple-swizzle"; + version = "0.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz"; + sha512 = "JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="; + }; + }; + "slack-markdown-0.1.1" = { + name = "slack-markdown"; + packageName = "slack-markdown"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/slack-markdown/-/slack-markdown-0.1.1.tgz"; + sha512 = "DKRu8Yr3SSsYtnKAZFF1ODhzetHBRXF7duuJVi3FSfHqEHQsrLNG2mUSLqwv1nMaDBpD/es85UdAjQYR/RIyzw=="; + }; + }; + "soru-slack-client-0.1.2" = { + name = "soru-slack-client"; + packageName = "soru-slack-client"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/soru-slack-client/-/soru-slack-client-0.1.2.tgz"; + sha512 = "Rh8ruthZPpgNmilLBktm8x53NwlHjgXLMx8lOaphOio4EF8u3yTIyvuKp5QN7ibR3WSGNJYG60T4fn71c8q06A=="; + }; + }; + "source-map-js-1.0.2" = { + name = "source-map-js"; + packageName = "source-map-js"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"; + sha512 = "R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="; + }; + }; + "spex-3.2.0" = { + name = "spex"; + packageName = "spex"; + version = "3.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz"; + sha512 = "9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg=="; + }; + }; + "split2-4.1.0" = { + name = "split2"; + packageName = "split2"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz"; + sha512 = "VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="; + }; + }; + "sprintf-js-1.0.3" = { + name = "sprintf-js"; + packageName = "sprintf-js"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"; + sha512 = "D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="; + }; + }; + "stack-trace-0.0.10" = { + name = "stack-trace"; + packageName = "stack-trace"; + version = "0.0.10"; + src = fetchurl { + url = "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz"; + sha512 = "KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="; + }; + }; + "statuses-2.0.1" = { + name = "statuses"; + packageName = "statuses"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"; + sha512 = "RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="; + }; + }; + "steno-0.4.4" = { + name = "steno"; + packageName = "steno"; + version = "0.4.4"; + src = fetchurl { + url = "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz"; + sha512 = "EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w=="; + }; + }; + "string-width-4.2.3" = { + name = "string-width"; + packageName = "string-width"; + version = "4.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"; + sha512 = "wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="; + }; + }; + "string_decoder-1.3.0" = { + name = "string_decoder"; + packageName = "string_decoder"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"; + sha512 = "hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="; + }; + }; + "strip-ansi-6.0.1" = { + name = "strip-ansi"; + packageName = "strip-ansi"; + version = "6.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"; + sha512 = "Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="; + }; + }; + "strip-json-comments-2.0.1" = { + name = "strip-json-comments"; + packageName = "strip-json-comments"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"; + sha512 = "4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="; + }; + }; + "supports-color-5.5.0" = { + name = "supports-color"; + packageName = "supports-color"; + version = "5.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"; + sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="; + }; + }; + "supports-color-7.2.0" = { + name = "supports-color"; + packageName = "supports-color"; + version = "7.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"; + sha512 = "qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="; + }; + }; + "supports-preserve-symlinks-flag-1.0.0" = { + name = "supports-preserve-symlinks-flag"; + packageName = "supports-preserve-symlinks-flag"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"; + sha512 = "ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="; + }; + }; + "table-layout-0.4.5" = { + name = "table-layout"; + packageName = "table-layout"; + version = "0.4.5"; + src = fetchurl { + url = "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz"; + sha512 = "zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw=="; + }; + }; + "tar-6.1.13" = { + name = "tar"; + packageName = "tar"; + version = "6.1.13"; + src = fetchurl { + url = "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz"; + sha512 = "jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw=="; + }; + }; + "tar-fs-2.1.1" = { + name = "tar-fs"; + packageName = "tar-fs"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz"; + sha512 = "V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng=="; + }; + }; + "tar-stream-2.2.0" = { + name = "tar-stream"; + packageName = "tar-stream"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz"; + sha512 = "ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="; + }; + }; + "tdigest-0.1.2" = { + name = "tdigest"; + packageName = "tdigest"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz"; + sha512 = "+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA=="; + }; + }; + "text-hex-1.0.0" = { + name = "text-hex"; + packageName = "text-hex"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz"; + sha512 = "uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="; + }; + }; + "to-readable-stream-2.1.0" = { + name = "to-readable-stream"; + packageName = "to-readable-stream"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz"; + sha512 = "o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w=="; + }; + }; + "toidentifier-1.0.1" = { + name = "toidentifier"; + packageName = "toidentifier"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"; + sha512 = "o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="; + }; + }; + "tr46-0.0.3" = { + name = "tr46"; + packageName = "tr46"; + version = "0.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"; + sha512 = "N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="; + }; + }; + "triple-beam-1.3.0" = { + name = "triple-beam"; + packageName = "triple-beam"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz"; + sha512 = "XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="; + }; + }; + "tslib-1.14.1" = { + name = "tslib"; + packageName = "tslib"; + version = "1.14.1"; + src = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"; + sha512 = "Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="; + }; + }; + "tslint-5.20.1" = { + name = "tslint"; + packageName = "tslint"; + version = "5.20.1"; + src = fetchurl { + url = "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz"; + sha512 = "EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg=="; + }; + }; + "tsscmp-1.0.6" = { + name = "tsscmp"; + packageName = "tsscmp"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz"; + sha512 = "LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="; + }; + }; + "tsutils-2.29.0" = { + name = "tsutils"; + packageName = "tsutils"; + version = "2.29.0"; + src = fetchurl { + url = "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz"; + sha512 = "g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA=="; + }; + }; + "tunnel-agent-0.6.0" = { + name = "tunnel-agent"; + packageName = "tunnel-agent"; + version = "0.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"; + sha512 = "McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="; + }; + }; + "type-fest-0.10.0" = { + name = "type-fest"; + packageName = "type-fest"; + version = "0.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz"; + sha512 = "EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw=="; + }; + }; + "type-fest-0.8.1" = { + name = "type-fest"; + packageName = "type-fest"; + version = "0.8.1"; + src = fetchurl { + url = "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz"; + sha512 = "4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="; + }; + }; + "type-is-1.6.18" = { + name = "type-is"; + packageName = "type-is"; + version = "1.6.18"; + src = fetchurl { + url = "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"; + sha512 = "TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="; + }; + }; + "typescript-4.9.5" = { + name = "typescript"; + packageName = "typescript"; + version = "4.9.5"; + src = fetchurl { + url = "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"; + sha512 = "1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="; + }; + }; + "typical-2.6.1" = { + name = "typical"; + packageName = "typical"; + version = "2.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz"; + sha512 = "ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg=="; + }; + }; + "typical-4.0.0" = { + name = "typical"; + packageName = "typical"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz"; + sha512 = "VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="; + }; + }; + "uc.micro-1.0.6" = { + name = "uc.micro"; + packageName = "uc.micro"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz"; + sha512 = "8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="; + }; + }; + "unescape-1.0.1" = { + name = "unescape"; + packageName = "unescape"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz"; + sha512 = "O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ=="; + }; + }; + "unescape-html-1.1.0" = { + name = "unescape-html"; + packageName = "unescape-html"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/unescape-html/-/unescape-html-1.1.0.tgz"; + sha512 = "O9/yBNqIkArjS597iHez5hAaAdn7b8/230SX8IncgXAX5tWI9XlEQYaz6Qbou0Sloa9n6lx9G5s6hg5qhJyzGg=="; + }; + }; + "unpipe-1.0.0" = { + name = "unpipe"; + packageName = "unpipe"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"; + sha512 = "pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="; + }; + }; + "useragent-generator-1.1.1-amkt-22079-finish.1" = { + name = "useragent-generator"; + packageName = "useragent-generator"; + version = "1.1.1-amkt-22079-finish.1"; + src = fetchurl { + url = "https://registry.npmjs.org/useragent-generator/-/useragent-generator-1.1.1-amkt-22079-finish.1.tgz"; + sha512 = "8yK1EH5FW6uffEI1n76+7oY3Vhkge9vhFxVTWalzKTYstS4bnbP2vytlYSB31fs8XjGGJ58IFLvy59R97zfDoQ=="; + }; + }; + "util-deprecate-1.0.2" = { + name = "util-deprecate"; + packageName = "util-deprecate"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"; + sha512 = "EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="; + }; + }; + "utils-merge-1.0.1" = { + name = "utils-merge"; + packageName = "utils-merge"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"; + sha512 = "pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="; + }; + }; + "uuid-3.4.0" = { + name = "uuid"; + packageName = "uuid"; + version = "3.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"; + sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="; + }; + }; + "vary-1.1.2" = { + name = "vary"; + packageName = "vary"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"; + sha512 = "BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="; + }; + }; + "webidl-conversions-3.0.1" = { + name = "webidl-conversions"; + packageName = "webidl-conversions"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"; + sha512 = "2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="; + }; + }; + "whatwg-url-5.0.0" = { + name = "whatwg-url"; + packageName = "whatwg-url"; + version = "5.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"; + sha512 = "saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="; + }; + }; + "which-module-2.0.0" = { + name = "which-module"; + packageName = "which-module"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"; + sha512 = "B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="; + }; + }; + "wide-align-1.1.5" = { + name = "wide-align"; + packageName = "wide-align"; + version = "1.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz"; + sha512 = "eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="; + }; + }; + "winston-3.8.2" = { + name = "winston"; + packageName = "winston"; + version = "3.8.2"; + src = fetchurl { + url = "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz"; + sha512 = "MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew=="; + }; + }; + "winston-compat-0.1.5" = { + name = "winston-compat"; + packageName = "winston-compat"; + version = "0.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.5.tgz"; + sha512 = "EPvPcHT604AV3Ji6d3+vX8ENKIml9VSxMRnPQ+cuK/FX6f3hvPP2hxyoeeCOCFvDrJEujalfcKWlWPvAnFyS9g=="; + }; + }; + "winston-daily-rotate-file-3.10.0" = { + name = "winston-daily-rotate-file"; + packageName = "winston-daily-rotate-file"; + version = "3.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.10.0.tgz"; + sha512 = "KO8CfbI2CvdR3PaFApEH02GPXiwJ+vbkF1mCkTlvRIoXFI8EFlf1ACcuaahXTEiDEKCii6cNe95gsL4ZkbnphA=="; + }; + }; + "winston-transport-4.5.0" = { + name = "winston-transport"; + packageName = "winston-transport"; + version = "4.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz"; + sha512 = "YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q=="; + }; + }; + "wordwrapjs-3.0.0" = { + name = "wordwrapjs"; + packageName = "wordwrapjs"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz"; + sha512 = "mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw=="; + }; + }; + "wrap-ansi-6.2.0" = { + name = "wrap-ansi"; + packageName = "wrap-ansi"; + version = "6.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"; + sha512 = "r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="; + }; + }; + "wrappy-1.0.2" = { + name = "wrappy"; + packageName = "wrappy"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"; + sha512 = "l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="; + }; + }; + "ws-5.2.3" = { + name = "ws"; + packageName = "ws"; + version = "5.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz"; + sha512 = "jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA=="; + }; + }; + "xtend-4.0.2" = { + name = "xtend"; + packageName = "xtend"; + version = "4.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"; + sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="; + }; + }; + "y18n-4.0.3" = { + name = "y18n"; + packageName = "y18n"; + version = "4.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz"; + sha512 = "JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="; + }; + }; + "yallist-4.0.0" = { + name = "yallist"; + packageName = "yallist"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"; + sha512 = "3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="; + }; + }; + "yargs-15.4.1" = { + name = "yargs"; + packageName = "yargs"; + version = "15.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz"; + sha512 = "aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="; + }; + }; + "yargs-parser-18.1.3" = { + name = "yargs-parser"; + packageName = "yargs-parser"; + version = "18.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz"; + sha512 = "o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="; + }; + }; + }; + args = { + name = "_at_mx-puppet_slash_mx-puppet-slack"; + packageName = "@mx-puppet/mx-puppet-slack"; + version = "0.0.0"; + src = ./.; + dependencies = [ + sources."@babel/code-frame-7.18.6" + sources."@babel/helper-validator-identifier-7.19.1" + (sources."@babel/highlight-7.18.6" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.2" + sources."escape-string-regexp-1.0.5" + sources."has-flag-3.0.0" + sources."supports-color-5.5.0" + ]; + }) + sources."@colors/colors-1.5.0" + sources."@dabh/diagnostics-2.0.3" + sources."@mapbox/node-pre-gyp-1.0.10" + sources."@mx-puppet/bridge-0.1.8" + sources."@mx-puppet/matrix-slack-parser-0.1.10" + sources."@sindresorhus/is-4.6.0" + (sources."@slack/events-api-2.3.4" // { + dependencies = [ + sources."@types/node-12.20.55" + sources."debug-2.6.9" + sources."ms-2.0.0" + ]; + }) + sources."@slack/logger-2.0.0" + (sources."@slack/rtm-api-5.0.5" // { + dependencies = [ + sources."p-cancelable-1.1.0" + sources."p-queue-2.4.2" + ]; + }) + sources."@slack/types-1.10.0" + (sources."@slack/web-api-5.15.0" // { + dependencies = [ + sources."is-stream-1.1.0" + ]; + }) + sources."@sorunome/matrix-bot-sdk-0.5.13" + sources."@szmarczak/http-timer-4.0.6" + sources."@types/body-parser-1.19.2" + sources."@types/cacheable-request-6.0.3" + sources."@types/connect-3.4.35" + sources."@types/debug-4.1.7" + sources."@types/express-4.17.17" + sources."@types/express-serve-static-core-4.17.33" + sources."@types/http-cache-semantics-4.0.1" + sources."@types/is-stream-1.1.0" + sources."@types/keyv-3.1.4" + sources."@types/lodash-4.14.191" + sources."@types/lodash.isstring-4.0.7" + sources."@types/mime-3.0.1" + sources."@types/ms-0.7.31" + sources."@types/node-18.15.3" + sources."@types/p-queue-2.3.2" + sources."@types/prop-types-15.7.5" + sources."@types/qs-6.9.7" + sources."@types/range-parser-1.2.4" + sources."@types/react-18.0.28" + sources."@types/responselike-1.0.0" + sources."@types/retry-0.12.0" + sources."@types/scheduler-0.16.2" + sources."@types/serve-static-1.15.1" + sources."@types/triple-beam-1.3.2" + sources."@types/ws-7.4.7" + sources."@types/yargs-15.0.15" + sources."@types/yargs-parser-21.0.0" + sources."abbrev-1.1.1" + sources."accepts-1.3.8" + sources."agent-base-6.0.2" + sources."ansi-regex-5.0.1" + (sources."ansi-styles-4.3.0" // { + dependencies = [ + sources."color-convert-2.0.1" + sources."color-name-1.1.4" + ]; + }) + sources."aproba-2.0.0" + sources."are-we-there-yet-2.0.0" + sources."argparse-1.0.10" + sources."array-back-3.1.0" + sources."array-flatten-1.1.1" + sources."assert-options-0.8.0" + sources."async-3.2.4" + sources."async-limiter-1.0.1" + sources."asynckit-0.4.0" + sources."axios-0.21.4" + sources."balanced-match-1.0.2" + sources."base64-js-1.5.1" + (sources."basic-auth-2.0.1" // { + dependencies = [ + sources."safe-buffer-5.1.2" + ]; + }) + sources."better-sqlite3-7.6.2" + sources."bindings-1.5.0" + sources."bintrees-1.0.2" + sources."bl-4.1.0" + sources."blurhash-1.1.5" + (sources."body-parser-1.20.1" // { + dependencies = [ + sources."debug-2.6.9" + sources."ms-2.0.0" + ]; + }) + sources."brace-expansion-1.1.11" + sources."buffer-5.7.1" + sources."buffer-writer-2.0.0" + sources."builtin-modules-1.1.1" + sources."bytes-3.1.2" + sources."cacheable-lookup-5.0.4" + sources."cacheable-request-7.0.2" + sources."call-bind-1.0.2" + sources."camelcase-5.3.1" + sources."canvas-2.11.0" + sources."chalk-4.1.2" + sources."chownr-2.0.0" + sources."cliui-6.0.0" + (sources."clone-response-1.0.3" // { + dependencies = [ + sources."mimic-response-1.0.1" + ]; + }) + sources."color-3.2.1" + sources."color-convert-1.9.3" + sources."color-name-1.1.3" + sources."color-string-1.9.1" + sources."color-support-1.1.3" + sources."colors-1.4.0" + sources."colorspace-1.1.4" + sources."combined-stream-1.0.8" + sources."command-line-args-5.2.1" + (sources."command-line-usage-5.0.5" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."array-back-2.0.0" + sources."chalk-2.4.2" + sources."escape-string-regexp-1.0.5" + sources."has-flag-3.0.0" + sources."supports-color-5.5.0" + sources."typical-2.6.1" + ]; + }) + sources."commander-2.20.3" + sources."concat-map-0.0.1" + sources."console-control-strings-1.1.0" + sources."content-disposition-0.5.4" + sources."content-type-1.0.5" + sources."cookie-0.5.0" + sources."cookie-signature-1.0.6" + sources."csstype-3.1.1" + sources."cycle-1.0.3" + sources."dateformat-3.0.3" + (sources."debug-4.3.4" // { + dependencies = [ + sources."ms-2.1.2" + ]; + }) + sources."decamelize-1.2.0" + sources."decompress-response-4.2.1" + sources."deep-extend-0.6.0" + sources."deepmerge-4.3.1" + sources."defer-to-connect-2.0.1" + sources."delayed-stream-1.0.0" + sources."delegates-1.0.0" + sources."depd-2.0.0" + sources."destroy-1.2.0" + sources."detect-libc-2.0.1" + sources."diff-4.0.2" + (sources."dom-serializer-1.4.1" // { + dependencies = [ + sources."domhandler-4.3.1" + sources."entities-2.2.0" + ]; + }) + sources."domelementtype-2.3.0" + sources."domhandler-3.3.0" + (sources."domutils-2.8.0" // { + dependencies = [ + sources."domhandler-4.3.1" + ]; + }) + sources."duplexer3-0.1.5" + sources."ee-first-1.1.1" + sources."emoji-regex-8.0.0" + sources."enabled-2.0.0" + sources."encodeurl-1.0.2" + sources."end-of-stream-1.4.4" + sources."entities-1.1.2" + sources."escape-html-1.0.3" + sources."escape-string-regexp-4.0.0" + sources."esprima-4.0.1" + sources."etag-1.8.1" + sources."eventemitter3-3.1.2" + sources."events-3.3.0" + sources."expand-template-2.0.3" + sources."expire-set-1.0.0" + (sources."express-4.18.2" // { + dependencies = [ + sources."debug-2.6.9" + sources."ms-2.0.0" + ]; + }) + sources."extend-shallow-2.0.1" + sources."fast-safe-stringify-2.1.1" + sources."fecha-4.2.3" + sources."file-stream-rotator-0.4.1" + sources."file-type-12.4.2" + sources."file-uri-to-path-1.0.0" + (sources."finalhandler-1.2.0" // { + dependencies = [ + sources."debug-2.6.9" + sources."ms-2.0.0" + ]; + }) + sources."find-replace-3.0.0" + sources."find-up-4.1.0" + sources."finity-0.5.4" + sources."fn.name-1.1.0" + sources."follow-redirects-1.15.2" + sources."form-data-2.5.1" + sources."forwarded-0.2.0" + sources."fresh-0.5.2" + sources."fs-constants-1.0.0" + (sources."fs-minipass-2.1.0" // { + dependencies = [ + sources."minipass-3.3.6" + ]; + }) + sources."fs.realpath-1.0.0" + sources."function-bind-1.1.1" + sources."gauge-3.0.2" + sources."get-caller-file-2.0.5" + sources."get-intrinsic-1.2.0" + sources."get-stream-5.2.0" + sources."github-from-package-0.0.0" + sources."glob-7.2.3" + sources."glob-to-regexp-0.4.1" + (sources."got-11.8.6" // { + dependencies = [ + sources."decompress-response-6.0.0" + sources."mimic-response-3.1.0" + ]; + }) + sources."graceful-fs-4.2.11" + sources."has-1.0.3" + sources."has-flag-4.0.0" + sources."has-symbols-1.0.3" + sources."has-unicode-2.0.1" + sources."hash.js-1.1.7" + sources."hasha-5.2.2" + sources."he-1.2.0" + sources."html-to-text-6.0.0" + sources."htmlencode-0.0.4" + (sources."htmlparser2-4.1.0" // { + dependencies = [ + sources."entities-2.2.0" + ]; + }) + sources."http-cache-semantics-4.1.1" + sources."http-errors-2.0.0" + sources."http2-wrapper-1.0.3" + sources."https-proxy-agent-5.0.1" + sources."iconv-lite-0.4.24" + sources."ieee754-1.2.1" + sources."inflight-1.0.6" + sources."inherits-2.0.4" + sources."ini-1.3.8" + sources."ipaddr.js-1.9.1" + sources."is-arrayish-0.3.2" + sources."is-core-module-2.11.0" + sources."is-extendable-0.1.1" + sources."is-fullwidth-code-point-3.0.0" + sources."is-plain-object-5.0.0" + sources."is-promise-2.2.2" + sources."is-stream-2.0.1" + sources."js-tokens-4.0.0" + sources."js-yaml-3.14.1" + sources."json-buffer-3.0.1" + sources."keyv-4.5.2" + sources."kuler-2.0.0" + sources."linkify-it-2.2.0" + sources."locate-path-5.0.0" + sources."lodash-4.17.21" + sources."lodash.camelcase-4.3.0" + sources."lodash.isstring-4.0.1" + sources."lodash.padend-4.6.1" + sources."logform-2.5.1" + sources."lowdb-1.0.0" + sources."lowercase-keys-2.0.0" + sources."lru-cache-6.0.0" + (sources."make-dir-3.1.0" // { + dependencies = [ + sources."semver-6.3.0" + ]; + }) + sources."markdown-it-9.1.0" + sources."mdurl-1.0.1" + sources."media-typer-0.3.0" + sources."merge-descriptors-1.0.1" + sources."methods-1.1.2" + sources."mime-1.6.0" + sources."mime-db-1.52.0" + sources."mime-types-2.1.35" + sources."mimic-response-2.1.0" + sources."minimalistic-assert-1.0.1" + sources."minimatch-3.1.2" + sources."minimist-1.2.8" + sources."minipass-4.2.5" + (sources."minizlib-2.1.2" // { + dependencies = [ + sources."minipass-3.3.6" + ]; + }) + sources."mkdirp-1.0.4" + sources."mkdirp-classic-0.5.3" + sources."moment-2.29.4" + (sources."morgan-1.10.0" // { + dependencies = [ + sources."debug-2.6.9" + sources."ms-2.0.0" + sources."on-finished-2.3.0" + ]; + }) + sources."ms-2.1.3" + sources."nan-2.17.0" + sources."nanoid-3.3.4" + sources."napi-build-utils-1.0.2" + sources."negotiator-0.6.3" + sources."node-abi-3.33.0" + sources."node-emoji-1.11.0" + sources."node-fetch-2.6.9" + sources."node-html-parser-1.4.9" + sources."nopt-5.0.0" + sources."normalize-url-6.1.0" + sources."normalize-version-1.0.5" + sources."npmlog-5.0.1" + sources."object-assign-4.1.1" + sources."object-hash-1.3.1" + sources."object-inspect-1.12.3" + sources."on-finished-2.4.1" + sources."on-headers-1.0.2" + sources."once-1.4.0" + sources."one-time-1.0.0" + sources."p-cancelable-2.1.1" + sources."p-event-4.2.0" + sources."p-finally-1.0.0" + sources."p-limit-2.3.0" + sources."p-locate-4.1.0" + (sources."p-queue-6.6.2" // { + dependencies = [ + sources."eventemitter3-4.0.7" + ]; + }) + sources."p-retry-4.6.2" + sources."p-timeout-3.2.0" + sources."p-try-2.2.0" + sources."packet-reader-1.0.0" + sources."parse-srcset-1.0.2" + sources."parseurl-1.3.3" + sources."path-exists-4.0.0" + sources."path-is-absolute-1.0.1" + sources."path-parse-1.0.7" + sources."path-to-regexp-0.1.7" + sources."pg-8.8.0" + sources."pg-connection-string-2.5.0" + sources."pg-int8-1.0.1" + sources."pg-minify-1.6.2" + sources."pg-pool-3.6.0" + sources."pg-promise-10.15.4" + sources."pg-protocol-1.6.0" + sources."pg-types-2.2.0" + sources."pgpass-1.0.5" + sources."picocolors-1.0.0" + sources."pify-3.0.0" + sources."postcss-8.4.21" + sources."postgres-array-2.0.0" + sources."postgres-bytea-1.0.0" + sources."postgres-date-1.0.7" + sources."postgres-interval-1.2.0" + (sources."prebuild-install-7.1.1" // { + dependencies = [ + sources."decompress-response-6.0.0" + sources."mimic-response-3.1.0" + sources."simple-get-4.0.1" + ]; + }) + sources."prom-client-13.2.0" + sources."proxy-addr-2.0.7" + sources."pump-3.0.0" + sources."qs-6.11.0" + sources."quick-lru-5.1.1" + sources."range-parser-1.2.1" + sources."raw-body-2.5.1" + sources."rc-1.2.8" + sources."readable-stream-3.6.2" + sources."reduce-flatten-1.0.1" + sources."require-directory-2.1.1" + sources."require-main-filename-2.0.0" + sources."resolve-1.22.1" + sources."resolve-alpn-1.2.1" + sources."responselike-2.0.1" + sources."retry-0.13.1" + sources."rimraf-3.0.2" + sources."safe-buffer-5.2.1" + sources."safe-stable-stringify-2.4.2" + sources."safer-buffer-2.1.2" + (sources."sanitize-html-2.10.0" // { + dependencies = [ + sources."dom-serializer-2.0.0" + sources."domhandler-5.0.3" + sources."domutils-3.0.1" + sources."entities-4.4.0" + sources."htmlparser2-8.0.1" + ]; + }) + sources."semver-7.3.8" + (sources."semver-closest-0.1.2" // { + dependencies = [ + sources."semver-5.7.1" + ]; + }) + (sources."send-0.18.0" // { + dependencies = [ + (sources."debug-2.6.9" // { + dependencies = [ + sources."ms-2.0.0" + ]; + }) + ]; + }) + sources."serve-static-1.15.0" + sources."set-blocking-2.0.0" + sources."setprototypeof-1.2.0" + sources."side-channel-1.0.4" + sources."signal-exit-3.0.7" + sources."simple-concat-1.0.1" + sources."simple-get-3.1.1" + sources."simple-markdown-0.7.3" + sources."simple-swizzle-0.2.2" + sources."slack-markdown-0.1.1" + (sources."soru-slack-client-0.1.2" // { + dependencies = [ + sources."@sindresorhus/is-2.1.1" + sources."cacheable-lookup-2.0.1" + sources."decompress-response-5.0.0" + sources."got-10.7.0" + sources."type-fest-0.10.0" + ]; + }) + sources."source-map-js-1.0.2" + sources."spex-3.2.0" + sources."split2-4.1.0" + sources."sprintf-js-1.0.3" + sources."stack-trace-0.0.10" + sources."statuses-2.0.1" + sources."steno-0.4.4" + sources."string-width-4.2.3" + sources."string_decoder-1.3.0" + sources."strip-ansi-6.0.1" + sources."strip-json-comments-2.0.1" + sources."supports-color-7.2.0" + sources."supports-preserve-symlinks-flag-1.0.0" + (sources."table-layout-0.4.5" // { + dependencies = [ + sources."array-back-2.0.0" + sources."typical-2.6.1" + ]; + }) + sources."tar-6.1.13" + (sources."tar-fs-2.1.1" // { + dependencies = [ + sources."chownr-1.1.4" + ]; + }) + sources."tar-stream-2.2.0" + sources."tdigest-0.1.2" + sources."text-hex-1.0.0" + sources."to-readable-stream-2.1.0" + sources."toidentifier-1.0.1" + sources."tr46-0.0.3" + sources."triple-beam-1.3.0" + sources."tslib-1.14.1" + (sources."tslint-5.20.1" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.2" + sources."escape-string-regexp-1.0.5" + sources."has-flag-3.0.0" + sources."mkdirp-0.5.6" + sources."semver-5.7.1" + sources."supports-color-5.5.0" + ]; + }) + sources."tsscmp-1.0.6" + sources."tsutils-2.29.0" + sources."tunnel-agent-0.6.0" + sources."type-fest-0.8.1" + sources."type-is-1.6.18" + sources."typescript-4.9.5" + sources."typical-4.0.0" + sources."uc.micro-1.0.6" + sources."unescape-1.0.1" + sources."unescape-html-1.1.0" + sources."unpipe-1.0.0" + (sources."useragent-generator-1.1.1-amkt-22079-finish.1" // { + dependencies = [ + sources."semver-5.7.1" + ]; + }) + sources."util-deprecate-1.0.2" + sources."utils-merge-1.0.1" + sources."uuid-3.4.0" + sources."vary-1.1.2" + sources."webidl-conversions-3.0.1" + sources."whatwg-url-5.0.0" + sources."which-module-2.0.0" + sources."wide-align-1.1.5" + sources."winston-3.8.2" + (sources."winston-compat-0.1.5" // { + dependencies = [ + sources."fecha-2.3.3" + sources."logform-1.10.0" + ]; + }) + (sources."winston-daily-rotate-file-3.10.0" // { + dependencies = [ + sources."semver-6.3.0" + ]; + }) + sources."winston-transport-4.5.0" + (sources."wordwrapjs-3.0.0" // { + dependencies = [ + sources."typical-2.6.1" + ]; + }) + sources."wrap-ansi-6.2.0" + sources."wrappy-1.0.2" + sources."ws-5.2.3" + sources."xtend-4.0.2" + sources."y18n-4.0.3" + sources."yallist-4.0.0" + sources."yargs-15.4.1" + sources."yargs-parser-18.1.3" + ]; + buildInputs = globalBuildInputs; + meta = { + description = ""; + }; + production = true; + bypassCache = true; + reconstructLock = true; + }; +in +{ + args = args; + sources = sources; + tarball = nodeEnv.buildNodeSourceDist args; + package = nodeEnv.buildNodePackage args; + shell = nodeEnv.buildNodeShell args; + nodeDependencies = nodeEnv.buildNodeDependencies (lib.overrideExisting args { + src = stdenv.mkDerivation { + name = args.name + "-package-json"; + src = nix-gitignore.gitignoreSourcePure [ + "*" + "!package.json" + "!package-lock.json" + ] args.src; + dontBuild = true; + installPhase = "mkdir -p $out; cp -r ./* $out;"; + }; + }); +} diff --git a/modules/matrix/pkgs/slack_presence.patch b/modules/matrix/pkgs/slack_presence.patch new file mode 100644 index 0000000..c134dae --- /dev/null +++ b/modules/matrix/pkgs/slack_presence.patch @@ -0,0 +1,21 @@ +diff --git i/src/slack.ts w/src/slack.ts +index c38234f..a74e0a5 100644 +--- i/src/slack.ts ++++ w/src/slack.ts +@@ -11,6 +11,7 @@ import { + IRetList, + IStringFormatterVars, + MessageDeduplicator, ++ MatrixPresence, + ISendingUser, + IPresenceEvent, + } from "@mx-puppet/bridge"; +@@ -304,7 +305,7 @@ export class App { + await this.puppet.setUserPresence({ + userId: user.fullId, + puppetId, +- }, matrixPresence); ++ }, matrixPresence as MatrixPresence); + }); + client.on("reactionAdded", async (reaction: Slack.Reaction) => { + log.verbose("Received new reaction"); diff --git a/modules/nix-settings.nix b/modules/nix-settings.nix new file mode 100644 index 0000000..5219a67 --- /dev/null +++ b/modules/nix-settings.nix @@ -0,0 +1,38 @@ +{ config, lib, pkgs, ... }: + +{ + environment.etc = { + "nix/channels/nixpkgs".source = nixpkgs.outPath; + }; + + nix = { + extraOptions = '' + keep-outputs = true + keep-derivations = true + experimental-features = nix-command flakes + ''; + + registry = { + nixpkgs.flake = nixpkgs; + }; + + nixPath = [ + "nixpkgs=/etc/nix/channels/nixpkgs" + ]; + + settings = { + trusted-users = [ "@wheel" ]; + auto-optimise-store = true; + + substituters = [ + "https://cache.nixos.org/" + "https://nix-community.cachix.org" + ]; + + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + }; +} diff --git a/modules/users/default.nix b/modules/users/default.nix new file mode 100644 index 0000000..13f1fc8 --- /dev/null +++ b/modules/users/default.nix @@ -0,0 +1,20 @@ +{ config, lib, pkgs, ... }: + +{ + users.users = { + audron = { + isNormalUser = true; + extraGroups = [ "wheel" "docker" ]; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO2eIUtbt7RM75ThjKfUjm24QkzkzCSj7hs+GLaaxMeH cardno:15 505 339" + ]; + }; + d3fus = { + isNormalUser = true; + extraGroups = [ "wheel" "docker" ]; + openssh.authorizedKeys.keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDa+AtVF5PuUOi30it7EuI79mfYvAWyqkoJQ/RS3LpXBGLqXt2VrpTmYnfonDhn2/nBlwnV5p/65l8g0lIZJ8TQOdMCxOMSsIPlC24q4xY2ov1ljboznmtmdxlPWRMoWqMKCp6kjCkVfEQ5pznnbOH+unvX5nLc4eG3QVfpKeaiz3JV6EZen1+jr/iLQP3KpdUylbnEO2ziHayUgZTdP6u5i6OvrcWS7lRA7yWIQyor92Rl6P/eby2jKVl9KMG0R5wCkUOAtgGRAT2XINmw0OZTj39hxxRToCXpilwjXkRUjPeD2SLmLOjhufJg1upbiGekqe5aOltg+3VoLtsIet6Im0RzjHuPHF4QAfBOv6ZfxREVbm5ODFkKP+2HdlIbYZhD5Rp16dgJTDGVPNiSRo7de2j/8RKG3gHAw1sPWhhTGONrL0t+7a0L3ijAn6NxjyyxA15JocVImPu/WtwcIfRsqxdtOYiaUXC8j+R6HK/q9PPDJyKGHYk6mU7V2KQ53ZR20Kl5YH9uLVHX0sSRXVWU0fZGDIGFpmy8uxccOS2zZYkSpQWmpWZdR0mg1zwOd6/rpTZ5mEJI/PYwi9Xuhfev3S3PD2StbFLzyFTVqzUdZ59nAmgh+jco8ylfzZTcMaTkYpznm9v59EnNmCBqTCde7MWTU4swhWal41EHMODJJQ== cardno:14 237 808" + ]; + }; + }; +} diff --git a/modules/vultr/default.nix b/modules/vultr/default.nix new file mode 100644 index 0000000..765c03d --- /dev/null +++ b/modules/vultr/default.nix @@ -0,0 +1,45 @@ +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/profiles/qemu-guest.nix") + ]; + + users.users."root".initialHashedPassword = "$6$R6JH.y368Bn6V$q710R4zQDK8vH7.L8JRAmFZwQW2H.3A00DPtKXFJb0nem87JlgYmD6UJbJ4vhP.f9UmvmqAgur8qMWEsBsErI/"; + users.users."root".hashedPassword = config.users.users."root".initialHashedPassword; + + boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + boot.loader.grub.devices = [ "/dev/vda" ]; + + fileSystems = { + "/" = { + device = "/dev/vda1"; + autoResize = true; + fsType = "ext4"; + }; + }; + + # kubernetes = { + # role = "agent"; + # taints = { + # role = "ns:NoSchedule"; + # }; + # }; + + networking = { + domain = "ns.vapor.systems"; + usePredictableInterfaceNames = false; + enableIPv6 = true; + tempAddresses = "disabled"; + interfaces.eth0.useDHCP = true; + nameservers = [ "1.1.1.1" "8.8.8.8" ]; + + dhcpcd.extraConfig = '' + nohook resolv.conf + ''; + }; +} diff --git a/modules/wireguard/default.nix b/modules/wireguard/default.nix new file mode 100644 index 0000000..c9fc063 --- /dev/null +++ b/modules/wireguard/default.nix @@ -0,0 +1,67 @@ +{ config, lib, pkgs, nodes, builtins, ... }: + +with lib; { + imports = [ ./options.nix ./roaming.nix ]; + + config = mkIf config.wireguard.enable (let + cfg = config.wireguard; + + peers = let + attrPeers = mapAttrs (n: node: + let peer = node.config.wireguard; + in { + endpoint = + "${node.config.deployment.targetHost}:${toString peer.port}"; + publicKey = peer.publicKey; + persistentKeepalive = 25; + allowedIPs = [ + "${peer.v4.address}/32" + "${peer.v6.ula}::${peer.v6.address}/128" + "${peer.v6.gua}::${peer.v6.address}/128" + ] ++ peer.allowedIPs; + }) (filterAttrs (n: node: node.config.wireguard.enable) nodes); + peers = attrValues attrPeers; + in peers; + in { + secrets = mkIf config.wireguard.enable { + wireguard = { + source = ../../secrets + + ("/" + "${config.networking.hostName}.privkey"); + dest = "/root/wireguard/privkey"; + }; + }; + + networking.wireguard.interfaces = mkIf config.wireguard.enable { + wg0 = with { ifname = "wg0"; }; { + ips = [ + "${cfg.v4.address}/${toString cfg.v4.prefixLength}" + "${cfg.v6.ula}::${cfg.v6.address}/128" + "${cfg.v6.gua}::${cfg.v6.address}/128" + ]; + listenPort = cfg.port; + postSetup = '' + ${pkgs.nftables}/bin/nft add table ${ifname} + ${pkgs.nftables}/bin/nft 'add chain ${ifname} prerouting { type nat hook prerouting priority 0 ; }' + ${pkgs.nftables}/bin/nft 'add chain ${ifname} postrouting { type nat hook postrouting priority 100 ; }' + ${pkgs.nftables}/bin/nft add rule ${ifname} postrouting ip saddr ${cfg.v4.network}/${ + toString cfg.v4.prefixLength + } oif ${cfg.natInterface} masquerade + + ${pkgs.iproute2}/bin/ip link set ${ifname} multicast on + ''; + postShutdown = '' + ${pkgs.nftables}/bin/nft flush table ${ifname} + ${pkgs.nftables}/bin/nft delete table ${ifname} + ''; + privateKeyFile = "/root/wireguard/privkey"; + peers = peers; + }; + }; + + boot.kernel.sysctl = { + "net.ipv4.ip_forward" = lib.mkDefault true; + "net.ipv6.conf.all.forwarding" = true; + "net.netfilter.nf_conntrack_tcp_be_liberal" = true; + }; + }); +} diff --git a/modules/wireguard/options.nix b/modules/wireguard/options.nix new file mode 100644 index 0000000..903716e --- /dev/null +++ b/modules/wireguard/options.nix @@ -0,0 +1,71 @@ +{ config, lib, pkgs, nodes, builtins, ... }: + +with lib; { + options = { + wireguard = { + enable = mkOption { + type = types.bool; + description = "Enable wireguard"; + }; + roaming = mkOption { + type = types.bool; + description = "Deploy roaming peers to this host"; + default = false; + }; + port = mkOption { + type = types.int; + description = "Port of the wireguard interface (51820)"; + default = 51820; + }; + publicKey = mkOption { + type = types.str; + description = "Public key of the wireguard interface"; + }; + natInterface = mkOption { + type = types.str; + description = "Interface to use for outgoing NAT connections"; + default = "eth0"; + }; + v4 = { + address = mkOption { + type = types.str; + description = "IP of the wireguard interface (10.10.0.1)"; + }; + network = mkOption { + type = types.str; + description = "The Network CIDR of the wireguard network (10.10.0.0)"; + }; + prefixLength = mkOption { + type = types.int; + description = "Prefix Length of the wireguard interface IP (24)"; + default = 24; + }; + }; + v6 = { + address = mkOption { + type = types.str; + description = "IP of the wireguard interface ()"; + }; + prefixLength = mkOption { + type = types.int; + description = "Prefix Length of the wireguard interface IP (24)"; + default = 64; + }; + ula = mkOption { + type = types.str; + description = "Unique Local Alloctation for IPv6 net"; + }; + gua = mkOption { + type = types.str; + description = + "Global Unique Allocation for IPv6 net, used as base for hosts"; + }; + }; + allowedIPs = mkOption { + type = types.listOf types.str; + description = "Extra allowedIPs"; + default = [ ]; + }; + }; + }; +} diff --git a/modules/wireguard/roaming.nix b/modules/wireguard/roaming.nix new file mode 100644 index 0000000..a89ce5d --- /dev/null +++ b/modules/wireguard/roaming.nix @@ -0,0 +1,64 @@ +{ config, pkgs, lib, ... }: + +{ + config = lib.mkIf config.wireguard.enable { + networking.wireguard.interfaces.wg0.peers = lib.mkIf config.wireguard.roaming [ + { # audron computer + publicKey = "okZQ5cMSu4+M3IKp1yIBuknmAKEzJLKe8tpVeY46phU="; + allowedIPs = [ + "10.10.0.10/32" + "2a0f:9400:8020:beef::10/128" + "fd15:3d8c:d429:beef::10/128" + ]; + } + { # audron homeassistant + publicKey = "afIZuhegBlyTmmzjikqtJ6lqYF2clfxtE4ZzQ9oijCg="; + allowedIPs = [ + "10.10.0.14/32" + "2a0f:9400:8020:beef::14/128" + "fd15:3d8c:d429:beef::14/128" + ]; + } + { # audron phone + publicKey = "LDzzGWlBmy9FQ/+bNAaLM2TmS8OR291uVTntwmb/gmM="; + allowedIPs = [ + "10.10.0.15/32" + "2a0f:9400:8020:beef::15/128" + "fd15:3d8c:d429:beef::15/128" + ]; + } + { # d3fus computer + publicKey = "CoMGgzL31yb0ozA17OuF0IDpkV2dnJ7j74itaQb0k1U="; + allowedIPs = [ + "10.10.0.20/32" + "2a0f:9400:8020:beef::20/128" + "fd15:3d8c:d429:beef::20/128" + ]; + } + { # d3fus streamer + publicKey = "byHXbaIVKARj3RBqyRuEUAsU5qeh/bmp/OLn6Y9qJV8="; + allowedIPs = [ + "10.10.0.21/32" + "2a0f:9400:8020:beef::21/128" + "fd15:3d8c:d429:beef::21/128" + ]; + } + { # d3fus phone + publicKey = "OEi+MTdy8oMWhkyC5NKHl6ztk92o4gYkgCTt5EMN5i4="; + allowedIPs = [ + "10.10.0.22/32" + "2a0f:9400:8020:beef::22/128" + "fd15:3d8c:d429:beef::22/128" + ]; + } + { # d3fus mac + publicKey = "dWWragU6AwsJeX6EhtybtT1VmjPdaSDKqmU/yxZQuxo="; + allowedIPs = [ + "10.10.0.23/32" + "2a0f:9400:8020:beef::23/128" + "fd15:3d8c:d429:beef::23/128" + ]; + } + ]; + }; +} diff --git a/modules/zfs/default.nix b/modules/zfs/default.nix new file mode 100644 index 0000000..4e863fc --- /dev/null +++ b/modules/zfs/default.nix @@ -0,0 +1,111 @@ +{ config, lib, pkgs, ... }: + +{ + boot = { + initrd.kernelModules = [ "zfs" ]; + kernelModules = [ "zfs" ]; + supportedFilesystems = [ "zfs" ]; + zfs.devNodes = "/dev/"; + loader.grub.zfsSupport = true; + }; + + + services.zfs = { + trim.enable = true; + autoScrub.enable = true; + autoScrub.pools = [ "rpool" ]; + }; + + virtualisation.containers.storage.settings.storage = { + driver = "zfs"; + graphroot = "/var/lib/containers/storage"; + runroot = "/run/containers/storage"; + options.zfs.fsname = "rpool/data/containers"; + options.zfs.mountopt = "nodev"; + }; + + virtualisation.cri-o = { + storageDriver = "zfs"; + extraPackages = [ pkgs.zfs ]; + }; + + fileSystems = { + "/" = { + device = "rpool/root"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/nix" = { + device = "rpool/root/nix"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/etc" = { + device = "rpool/root/etc"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/home" = { + device = "rpool/root/home"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/srv" = { + device = "rpool/root/srv"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var" = { + device = "rpool/root/var"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/lib" = { + device = "rpool/root/var/lib"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/lib/rancher" = { + device = "rpool/root/var/lib/rancher"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/lib/docker" = { + device = "rpool/root/var/lib/docker"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/lib/containers" = { + device = "rpool/root/var/lib/containers"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/lib/etcd" = { + device = "rpool/root/var/lib/etcd"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/log" = { + device = "rpool/root/var/log"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + + "/var/spool" = { + device = "rpool/root/var/spool"; + fsType = "zfs"; + options = [ "zfsutil" ]; + }; + }; +} |
