]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Flake webapps
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Mon, 28 Mar 2022 23:07:12 +0000 (01:07 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 9 Apr 2023 15:16:20 +0000 (17:16 +0200)
132 files changed:
flakes/diaspora/default.nix [moved from pkgs/webapps/diaspora/default.nix with 50% similarity]
flakes/diaspora/flake.lock [new file with mode: 0644]
flakes/diaspora/flake.nix [new file with mode: 0644]
flakes/diaspora/gemset.nix [moved from pkgs/webapps/diaspora/gemset.nix with 100% similarity]
flakes/diaspora/gemset_ldap.nix [moved from pkgs/webapps/diaspora/gemset_ldap.nix with 100% similarity]
flakes/diaspora/ldap.patch [moved from pkgs/webapps/diaspora/ldap.patch with 100% similarity]
flakes/etherpad-lite/default.nix [new file with mode: 0644]
flakes/etherpad-lite/etherpad-lite.json [new file with mode: 0644]
flakes/etherpad-lite/flake.lock [new file with mode: 0644]
flakes/etherpad-lite/flake.nix [new file with mode: 0644]
flakes/etherpad-lite/libreoffice_patch.diff [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_adminpads/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_align/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_align/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_bookmark/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_colors/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_colors/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_comments_page/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_embedmedia/fix.patch [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_font_family/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_font_family/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_font_size/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_font_size/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_headings2/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_headings2/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_immae_buttons/ep.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_immae_buttons/package.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_line_height/fix.patch [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_line_height/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_line_height/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_markdown/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_markdown/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_mypads/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_mypads/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_page_view/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_page_view/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_previewimages/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_private_pad/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_ruler/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_ruler/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_scrollto/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json [new file with mode: 0644]
flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix [new file with mode: 0644]
flakes/etherpad-lite/node-packages.nix [new file with mode: 0644]
flakes/grocy/default.nix [moved from pkgs/webapps/grocy/default.nix with 83% similarity]
flakes/grocy/flake.lock [new file with mode: 0644]
flakes/grocy/flake.nix [new file with mode: 0644]
flakes/grocy/php-packages.nix [moved from pkgs/webapps/grocy/php-packages.nix with 100% similarity]
flakes/grocy/yarn-packages.nix [moved from pkgs/webapps/grocy/yarn-packages.nix with 100% similarity]
flakes/grocy/yarn.patch [moved from pkgs/webapps/grocy/yarn.patch with 100% similarity]
flakes/lib/flake.lock
flakes/lib/flake.nix
flakes/mastodon/default.nix [moved from pkgs/webapps/mastodon/default.nix with 82% similarity]
flakes/mastodon/flake.lock [new file with mode: 0644]
flakes/mastodon/flake.nix [new file with mode: 0644]
flakes/mastodon/gemset.nix [moved from pkgs/webapps/mastodon/gemset.nix with 100% similarity]
flakes/mastodon/yarn-packages.nix [moved from pkgs/webapps/mastodon/yarn-packages.nix with 100% similarity]
flakes/mediagoblin/bower-packages.nix [new file with mode: 0644]
flakes/mediagoblin/default.nix [new file with mode: 0644]
flakes/mediagoblin/flake.lock [new file with mode: 0644]
flakes/mediagoblin/flake.nix [new file with mode: 0644]
flakes/mediagoblin/ldap_fix.py [new file with mode: 0644]
flakes/mediagoblin/plugins/basicsearch/default.nix [new file with mode: 0644]
flakes/private/buildbot/buildslist/bower.nix [moved from pkgs/python-packages/buildbot/plugins/buildslist/bower.nix with 100% similarity]
flakes/private/buildbot/buildslist/default.nix [moved from pkgs/python-packages/buildbot/plugins/buildslist/default.nix with 88% similarity]
flakes/private/buildbot/buildslist/yarn-packages.nix [moved from pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix with 100% similarity]
flakes/private/buildbot/flake.lock [new file with mode: 0644]
flakes/private/buildbot/flake.nix [new file with mode: 0644]
flakes/surfer/default.nix [moved from pkgs/webapps/surfer/default.nix with 71% similarity]
flakes/surfer/flake.lock [new file with mode: 0644]
flakes/surfer/flake.nix [new file with mode: 0644]
flakes/surfer/node-packages.nix [moved from pkgs/webapps/surfer/node-packages.nix with 100% similarity]
flakes/taskwarrior-web/Gemfile.lock [moved from pkgs/webapps/taskwarrior-web/Gemfile.lock with 100% similarity]
flakes/taskwarrior-web/default.nix [moved from pkgs/webapps/taskwarrior-web/default.nix with 75% similarity]
flakes/taskwarrior-web/fixes.patch [moved from pkgs/webapps/taskwarrior-web/fixes.patch with 56% similarity]
flakes/taskwarrior-web/flake.lock [new file with mode: 0644]
flakes/taskwarrior-web/flake.nix [new file with mode: 0644]
flakes/taskwarrior-web/gemset.nix [moved from pkgs/webapps/taskwarrior-web/gemset.nix with 100% similarity]
flakes/taskwarrior-web/thin.patch [moved from pkgs/webapps/taskwarrior-web/thin.patch with 100% similarity]
lib/flake-compat-patched.nix
modules/default.nix
modules/private/buildbot/default.nix
modules/private/environment.nix
modules/private/mail/postfix.nix
modules/private/websites/tools/diaspora/default.nix
modules/private/websites/tools/mastodon/default.nix
modules/webapps/diaspora.nix [deleted file]
modules/webapps/etherpad-lite.nix [deleted file]
modules/webapps/mastodon.nix [deleted file]
modules/webapps/mediagoblin.nix [deleted file]
nix/sources.json
overlays/default.nix
overlays/python-packages/buildbot.nix [deleted file]
overlays/python-packages/default.nix
pkgs/python-packages/buildbot/plugins/default.nix [deleted file]
pkgs/python-packages/default.nix
pkgs/python-packages/wokkel.nix [deleted file]
pkgs/webapps/default.nix
pkgs/webapps/diaspora/diaspora.json [deleted file]
pkgs/webapps/grocy/grocy.json [deleted file]
pkgs/webapps/mastodon/mastodon.json [deleted file]
pkgs/webapps/taskwarrior-web/taskwarrior-web.json [deleted file]

similarity index 50%
rename from pkgs/webapps/diaspora/default.nix
rename to flakes/diaspora/default.nix
index b435347ac2e473542879ad9ec8da1bf4553b8323..619c55078dfb69045ac1174f07d8126a117450c6 100644 (file)
@@ -1,8 +1,11 @@
 { ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora",
-  mylibs, stdenv, bundlerEnv, writeText,
+  src, stdenv, bundlerEnv, writeText,
   cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }:
 let
-  diaspora_src = stdenv.mkDerivation (mylibs.fetchedGithub ./diaspora.json // rec {
+  diaspora_src = stdenv.mkDerivation {
+    inherit (src) version;
+    pname = "diaspora";
+    inherit src;
     buildPhase = ''
       ${if ldap then "patch -p1 < ${./ldap.patch}" else ""}
       # FIXME: bundlerEnv below doesn't take postgresql group for some
@@ -12,7 +15,7 @@ let
     installPhase = ''
       cp -a . $out
     '';
-  });
+  };
   gems = bundlerEnv {
     name = "diaspora-env";
     gemfile = "${diaspora_src}/Gemfile";
@@ -40,30 +43,31 @@ let
   dummy_token = writeText "secret_token.rb" ''
     Diaspora::Application.config.secret_key_base = 'dummy'
   '';
+  diaspora = stdenv.mkDerivation {
+    name = "diaspora";
+    inherit diaspora_src;
+    builder = writeText "build_diaspora" ''
+      source $stdenv/setup
+      cp -a $diaspora_src $out
+      cd $out
+      chmod -R u+rwX .
+      tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
+      ln -s database.yml.example config/database.yml
+      ln -s ${build_config} config/diaspora.yml
+      ln -s ${dummy_token} config/initializers/secret_token.rb
+      ln -sf ${varDir}/schedule.yml config/schedule.yml
+      ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
+      ln -sf ${varDir}/uploads public/uploads
+      RAILS_ENV=production ${gems}/bin/rake assets:precompile
+      ln -sf ${config_dir}/database.yml config/database.yml
+      ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
+      ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
+      rm -rf tmp log
+      ln -sf ${varDir}/tmp tmp
+      ln -sf ${varDir}/log log
+      '';
+    propagatedBuildInputs = [ gems nodejs which git ];
+    passthru = { inherit gems varDir; };
+  };
 in
-stdenv.mkDerivation {
-  name = "diaspora";
-  inherit diaspora_src;
-  builder = writeText "build_diaspora" ''
-    source $stdenv/setup
-    cp -a $diaspora_src $out
-    cd $out
-    chmod -R u+rwX .
-    tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
-    ln -s database.yml.example config/database.yml
-    ln -s ${build_config} config/diaspora.yml
-    ln -s ${dummy_token} config/initializers/secret_token.rb
-    ln -sf ${varDir}/schedule.yml config/schedule.yml
-    ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
-    ln -sf ${varDir}/uploads public/uploads
-    RAILS_ENV=production ${gems}/bin/rake assets:precompile
-    ln -sf ${config_dir}/database.yml config/database.yml
-    ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
-    ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
-    rm -rf tmp log
-    ln -sf ${varDir}/tmp tmp
-    ln -sf ${varDir}/log log
-    '';
-  propagatedBuildInputs = [ gems nodejs which git ];
-  passthru = { inherit gems varDir; };
-}
+  diaspora
diff --git a/flakes/diaspora/flake.lock b/flakes/diaspora/flake.lock
new file mode 100644 (file)
index 0000000..29abb28
--- /dev/null
@@ -0,0 +1,80 @@
+{
+  "nodes": {
+    "diaspora": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "dir": "flakes/myuids",
+        "lastModified": 1636390024,
+        "narHash": "sha256-6T3re6sKcnla66im7UgG14UNa/Vvj6d/98JAOHbDpjQ=",
+        "ref": "master",
+        "rev": "fa25ffd4583cc362075cd5e1b4130f33306103f0",
+        "revCount": 901,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+      },
+      "original": {
+        "dir": "flakes/myuids",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "diaspora": "diaspora",
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/diaspora/flake.nix b/flakes/diaspora/flake.nix
new file mode 100644 (file)
index 0000000..e28ce97
--- /dev/null
@@ -0,0 +1,216 @@
+{
+  description = "A privacy-aware, distributed, open source social network.";
+  inputs.myuids = {
+    url = "https://git.immae.eu/perso/Immae/Config/Nix.git";
+    type = "git";
+    dir = "flakes/myuids";
+  };
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.diaspora = {
+    url = "github:diaspora/diaspora/v0.7.10.0";
+    flake = false;
+  };
+
+  outputs = { self, myuids, nixpkgs, diaspora, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.diaspora.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.diaspora = callPackage ./. { src = diaspora // { inherit version; }; };
+      defaultPackage = packages.diaspora;
+      legacyPackages.diaspora = packages.diaspora;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      diaspora = final: prev: {
+        diaspora = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.diaspora;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "diaspora";
+        cfg = config.services.diaspora;
+
+        uid = config.ids.uids.diaspora;
+        gid = config.ids.gids.diaspora;
+      in
+        {
+          options.services.diaspora = {
+            enable = lib.mkEnableOption "Enable Diaspora’s service";
+            user = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "User account under which Diaspora runs";
+            };
+            group = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "Group under which Diaspora runs";
+            };
+            adminEmail = lib.mkOption {
+              type = lib.types.str;
+              example = "admin@example.com";
+              description = "Admin e-mail for Diaspora";
+            };
+            dataDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/var/lib/${name}";
+              description = ''
+                The directory where Diaspora stores its data.
+              '';
+            };
+            socketsDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/run/${name}";
+              description = ''
+                The directory where Diaspora puts runtime files and sockets.
+                '';
+            };
+            configDir = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The configuration path for Diaspora.
+                '';
+            };
+            package = lib.mkOption {
+              type = lib.types.package;
+              default = pkgs.diaspora;
+              description = ''
+                Diaspora package to use.
+                '';
+            };
+            withLdap = lib.mkEnableOption "Add ldap patch";
+            # Output variables
+            systemdStateDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if varDir is outside of /var/lib
+              default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+                lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+              description = ''
+              Adjusted Diaspora data directory for systemd
+              '';
+              readOnly = true;
+            };
+            systemdRuntimeDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if socketsDir is outside of /run
+              default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+                lib.strings.removePrefix "/run/" cfg.socketsDir;
+              description = ''
+              Adjusted Diaspora sockets directory for systemd
+              '';
+              readOnly = true;
+            };
+            workdir = lib.mkOption {
+              type = lib.types.package;
+              default = cfg.package.override {
+                varDir = cfg.dataDir;
+                podmin_email = cfg.adminEmail;
+                config_dir = cfg.configDir;
+                ldap = cfg.withLdap;
+              };
+              description = ''
+                Adjusted diaspora package with overriden values
+                '';
+              readOnly = true;
+            };
+            sockets = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                rails = "${cfg.socketsDir}/diaspora.sock";
+                eye   = "${cfg.socketsDir}/eye.sock";
+              };
+              readOnly = true;
+              description = ''
+                Diaspora sockets
+                '';
+            };
+            pids = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                eye   = "${cfg.socketsDir}/eye.pid";
+              };
+              readOnly = true;
+              description = ''
+                Diaspora pids
+                '';
+            };
+          };
+
+          config = lib.mkIf cfg.enable {
+            nixpkgs.overlays = [ self.overlay ];
+            users.users = lib.optionalAttrs (cfg.user == name) {
+              "${name}" = {
+                uid = myuids.lib.uids.diaspora;
+                group = cfg.group;
+                description = "Diaspora user";
+                home = cfg.dataDir;
+                packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ];
+                useDefaultShell = true;
+              };
+            };
+            users.groups = lib.optionalAttrs (cfg.group == name) {
+              "${name}" = {
+                gid = myuids.lib.gids.diaspora;
+              };
+            };
+
+            systemd.services.diaspora = {
+              description = "Diaspora";
+              wantedBy = [ "multi-user.target" ];
+              after = [
+                "network.target" "redis.service" "postgresql.service"
+              ];
+              wants = [
+                "redis.service" "postgresql.service"
+              ];
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.EYE_SOCK = cfg.sockets.eye;
+              environment.EYE_PID = cfg.pids.eye;
+
+              path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ];
+
+              preStart = ''
+                install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log
+                install -m 0700 -d ${cfg.dataDir}/tmp/pids
+                if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
+                  echo "{}" > ${cfg.dataDir}/schedule.yml
+                fi
+                ./bin/bundle exec rails db:migrate
+              '';
+
+              script = ''
+                exec ${cfg.workdir}/script/server
+              '';
+
+              serviceConfig = {
+                User = cfg.user;
+                PrivateTmp = true;
+                Restart = "always";
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                StandardInput = "null";
+                KillMode = "control-group";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+          };
+        };
+  };
+}
+
diff --git a/flakes/etherpad-lite/default.nix b/flakes/etherpad-lite/default.nix
new file mode 100644 (file)
index 0000000..21bce28
--- /dev/null
@@ -0,0 +1,66 @@
+{ varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too!
+, stdenv, callPackage, src, lib, nodejs }:
+let
+  nodeEnv = callPackage ../../lib/node-env.nix {};
+  moduleNames = [
+    "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
+    "ep_clear_formatting" "ep_colors" "ep_comments_page"
+    "ep_copy_paste_select_all" "ep_cursortrace" "ep_delete_empty_pads"
+    "ep_embedmedia" "ep_font_family" "ep_font_size" "ep_headings2"
+    "ep_immae_buttons" "ep_ldapauth" "ep_line_height" "ep_markdown"
+    "ep_mypads" "ep_page_view" "ep_previewimages" "ep_ruler"
+    "ep_scrollto" "ep_set_title_on_pad" "ep_subscript_and_superscript"
+    "ep_timesliderdiff"
+  ];
+  # nix files are built using node2nix -i node-packages.json
+  allModules = lib.attrsets.genAttrs moduleNames
+    (name: (callPackage (./modules + "/${name}/node-packages.nix") { inherit nodeEnv; }).${name});
+  toPassthru = pkg: {
+    inherit varDir allModules nodejs;
+    withModules = withModules pkg;
+  };
+  withModules = pkg: toModules:
+    let
+      modules = toModules allModules;
+      toInstallModule = n: ''
+        cp -a ${n}/lib/node_modules/${n.packageName} $out/node_modules
+        if [ ! -f $out/node_modules/${n.packageName}/.ep_initialized ]; then
+          chmod u+w $out/node_modules/${n.packageName}/
+          ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized
+        fi
+      '';
+      newEtherpad = pkg.overrideAttrs(old: {
+        installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallModule modules);
+        passthru = toPassthru newEtherpad;
+      });
+    in newEtherpad;
+  # built using node2nix -l package-lock.json
+  # and changing "./." to "src"
+  node-environment = (callPackage ./node-packages.nix {
+    inherit nodeEnv;
+    src = stdenv.mkDerivation {
+      pname = "etherpad-lite";
+      version = src.version;
+      inherit src;
+      patches = [ ./libreoffice_patch.diff ];
+      buildPhase = ''
+        touch src/.ep_initialized
+        '';
+      installPhase = ''
+        cp -a src/ $out
+        '';
+    };
+  }).package;
+  package = stdenv.mkDerivation rec {
+    name = "etherpad-lite-${src.version}";
+    src = node-environment;
+    installPhase = ''
+      mkdir -p $out
+      mkdir $out/node_modules
+      cp -a lib/node_modules/ep_etherpad-lite $out/src
+      chmod u+w $out/src/static/js/
+      ln -s ../src $out/node_modules/ep_etherpad-lite
+      '';
+    passthru = toPassthru package;
+  };
+in package
diff --git a/flakes/etherpad-lite/etherpad-lite.json b/flakes/etherpad-lite/etherpad-lite.json
new file mode 100644 (file)
index 0000000..0d68df1
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "tag": "1.8.3",
+  "meta": {
+    "name": "etherpad-lite",
+    "url": "https://github.com/ether/etherpad-lite",
+    "branch": "refs/tags/1.8.3"
+  },
+  "github": {
+    "owner": "ether",
+    "repo": "etherpad-lite",
+    "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+    "sha256": "1d726qldw3bil4x7j39aqk7m71kyjvxklai5238rrd5v82z28c1y",
+    "fetchSubmodules": true
+  }
+}
diff --git a/flakes/etherpad-lite/flake.lock b/flakes/etherpad-lite/flake.lock
new file mode 100644 (file)
index 0000000..9790caf
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "nodes": {
+    "etherpad-lite": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/etherpad-lite/flake.nix b/flakes/etherpad-lite/flake.nix
new file mode 100644 (file)
index 0000000..87e4cae
--- /dev/null
@@ -0,0 +1,196 @@
+{
+  description = "Your self-hosted, globally interconnected microblogging community";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.etherpad-lite = {
+    url = "github:ether/etherpad-lite/1.8.3";
+    flake = false;
+  };
+
+  outputs = { self, nixpkgs, etherpad-lite, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.etherpad-lite.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.etherpad-lite = callPackage ./. { src = etherpad-lite // { inherit version; }; };
+      defaultPackage = packages.etherpad-lite;
+      legacyPackages.etherpad-lite = packages.etherpad-lite;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      etherpad-lite = final: prev: {
+        etherpad-lite = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.etherpad-lite;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "etherpad-lite";
+        cfg = config.services.etherpad-lite;
+      in
+        {
+          options.services.etherpad-lite = {
+            enable = lib.mkEnableOption "Enable Etherpad lite’s service";
+            user = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "User account under which Etherpad lite runs";
+            };
+            group = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "Group under which Etherpad lite runs";
+            };
+            dataDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/var/lib/${name}";
+              description = ''
+                The directory where Etherpad lite stores its data.
+              '';
+            };
+            socketsDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/run/${name}";
+              description = ''
+                The directory where Etherpad lite stores its sockets.
+              '';
+            };
+            configFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The config file path for Etherpad lite.
+                '';
+            };
+            sessionKeyFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The Session key file path for Etherpad lite.
+                '';
+            };
+            apiKeyFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The API key file path for Etherpad lite.
+                '';
+            };
+            package = lib.mkOption {
+              type = lib.types.package;
+              default = pkgs.etherpad-lite;
+              description = ''
+                Etherpad lite package to use.
+                '';
+              example = lib.literalExample ''
+                pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
+              '';
+            };
+            modules = lib.mkOption {
+              type = lib.types.listOf lib.types.package;
+              default = [];
+              description = ''
+                Etherpad lite modules to use.
+                DEPRECATED: use package directly
+                '';
+            };
+            # Output variables
+            workdir = lib.mkOption {
+              type = lib.types.package;
+              default = cfg.package.withModules (_: cfg.modules);
+              description = ''
+              Adjusted Etherpad lite package with plugins
+              '';
+              readOnly = true;
+            };
+            systemdStateDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if varDir is outside of /var/lib
+              default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+                lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+              description = ''
+              Adjusted Etherpad lite data directory for systemd
+              '';
+              readOnly = true;
+            };
+            systemdRuntimeDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if socketsDir is outside of /run
+              default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+                lib.strings.removePrefix "/run/" cfg.socketsDir;
+              description = ''
+              Adjusted Etherpad lite sockets directory for systemd
+              '';
+              readOnly = true;
+            };
+            sockets = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                node  = "${cfg.socketsDir}/etherpad-lite.sock";
+              };
+              readOnly = true;
+              description = ''
+                Etherpad lite sockets
+                '';
+            };
+          };
+
+          config = lib.mkIf cfg.enable {
+            nixpkgs.overlays = [ self.overlay ];
+            systemd.services.etherpad-lite = {
+              description = "Etherpad-lite";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" "postgresql.service" ];
+              wants = [ "postgresql.service" ];
+
+              environment.NODE_ENV = "production";
+              environment.HOME = cfg.workdir;
+
+              path = [ cfg.workdir.nodejs ];
+
+              script = ''
+                exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
+                  --sessionkey ${cfg.sessionKeyFile} \
+                  --apikey ${cfg.apiKeyFile} \
+                  --settings ${cfg.configFile}
+              '';
+
+              postStart = ''
+                while [ ! -S ${cfg.sockets.node} ]; do
+                  sleep 0.5
+                done
+                chmod a+w ${cfg.sockets.node}
+                '';
+              serviceConfig = {
+                DynamicUser = true;
+                User = cfg.user;
+                Group = cfg.group;
+                WorkingDirectory = cfg.workdir;
+                PrivateTmp = true;
+                NoNewPrivileges = true;
+                PrivateDevices = true;
+                ProtectHome = true;
+                ProtectControlGroups = true;
+                ProtectKernelModules = true;
+                Restart = "always";
+                Type = "simple";
+                TimeoutSec = 60;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                StateDirectory= cfg.systemdStateDirectory;
+                ExecStartPre = [
+                  "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized"
+                  "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
+                ];
+              };
+            };
+
+          };
+        };
+      };
+}
+
+
diff --git a/flakes/etherpad-lite/libreoffice_patch.diff b/flakes/etherpad-lite/libreoffice_patch.diff
new file mode 100644 (file)
index 0000000..86fac15
--- /dev/null
@@ -0,0 +1,12 @@
+diff --git a/src/node/utils/LibreOffice.js b/src/node/utils/LibreOffice.js
+index 267f7a0c..10518577 100644
+--- a/src/node/utils/LibreOffice.js
++++ b/src/node/utils/LibreOffice.js
+@@ -78,6 +78,7 @@ function doConvertTask(task, callback) {
+         '--invisible',
+         '--nologo',
+         '--nolockcheck',
++        '-env:UserInstallation=file:///tmp/',
+         '--writer',
+         '--convert-to', task.type,
+         task.srcFile,
diff --git a/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json
new file mode 100644 (file)
index 0000000..9b0f681
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_aa_file_menu_toolbar" ]
diff --git a/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix
new file mode 100644 (file)
index 0000000..8a2fb1b
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_aa_file_menu_toolbar = nodeEnv.buildNodePackage {
+    name = "ep_aa_file_menu_toolbar";
+    packageName = "ep_aa_file_menu_toolbar";
+    version = "0.1.6";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_aa_file_menu_toolbar/-/ep_aa_file_menu_toolbar-0.1.6.tgz";
+      sha1 = "aaa374d9429c9b2382311fab69e0ff819b53b7b0";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "File / Menu style toolbar";
+      homepage = https://github.com/JohnMcLear/ep_file_menu_toolbar;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_adminpads/node-packages.json b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.json
new file mode 100644 (file)
index 0000000..7643607
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_adminpads" ]
diff --git a/flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix
new file mode 100644 (file)
index 0000000..2f62257
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_adminpads = nodeEnv.buildNodePackage {
+    name = "ep_adminpads";
+    packageName = "ep_adminpads";
+    version = "0.0.12";
+    src = fetchurl {
+      url = "https://github.com/spcsser/ep_adminpads/archive/master.tar.gz";
+      sha1 = "49ypihbwxmd97g813aq2rjwh7pq1y08a";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Gives the ability to list and administrate all pads on admin page";
+      homepage = "https://github.com/spcsser/ep_adminpads#readme";
+      license = "MIT";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_align/node-packages.json b/flakes/etherpad-lite/modules/ep_align/node-packages.json
new file mode 100644 (file)
index 0000000..9405dd2
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_align" ]
diff --git a/flakes/etherpad-lite/modules/ep_align/node-packages.nix b/flakes/etherpad-lite/modules/ep_align/node-packages.nix
new file mode 100644 (file)
index 0000000..1a57a9c
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_align = nodeEnv.buildNodePackage {
+    name = "ep_align";
+    packageName = "ep_align";
+    version = "0.2.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_align/-/ep_align-0.2.0.tgz";
+      sha512 = "bMrwsieCfz3LkxuIXiNu7UKkUQ7b+ceI09XRd1cCMskDwuJow3N3hB4/gecqfF+v4lS0qmDEa7bJvSTrhHiXBQ==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add Left/Center/Right/Justify to lines of text in a pad";
+      homepage = "https://github.com/johnmclear/ep_align#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_bookmark/node-packages.json b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.json
new file mode 100644 (file)
index 0000000..80745ca
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_bookmark" ]
diff --git a/flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix
new file mode 100644 (file)
index 0000000..3975044
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_bookmark = nodeEnv.buildNodePackage {
+    name = "ep_bookmark";
+    packageName = "ep_bookmark";
+    version = "1.2.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_bookmark/-/ep_bookmark-1.2.0.tgz";
+      sha512 = "sHTXIKui1l+PxeBtzlwSvRg8TZ8w9PE5aaxTg5b/siwNmprXeoiL6ZUiOTGmp18yLXs1ltJ2BzSqJX57pjGVWg==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Etherpad plugin for users to save a list of bookmarks of their visited pads locally in the browser's local storage";
+      homepage = "https://github.com/Gared/ep_bookmark#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json
new file mode 100644 (file)
index 0000000..07c0662
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_clear_formatting" ]
diff --git a/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix
new file mode 100644 (file)
index 0000000..adb22f1
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_clear_formatting = nodeEnv.buildNodePackage {
+    name = "ep_clear_formatting";
+    packageName = "ep_clear_formatting";
+    version = "0.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_clear_formatting/-/ep_clear_formatting-0.0.2.tgz";
+      sha1 = "b16970b9c6be01246d23cb5a81777aa220d06fc4";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Clear formatting on a selection, this plugin requires the file menu";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_colors/node-packages.json b/flakes/etherpad-lite/modules/ep_colors/node-packages.json
new file mode 100644 (file)
index 0000000..b513f5c
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_colors" ]
diff --git a/flakes/etherpad-lite/modules/ep_colors/node-packages.nix b/flakes/etherpad-lite/modules/ep_colors/node-packages.nix
new file mode 100644 (file)
index 0000000..f2f8201
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_colors = nodeEnv.buildNodePackage {
+    name = "ep_colors";
+    packageName = "ep_colors";
+    version = "0.0.3";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_colors/-/ep_colors-0.0.3.tgz";
+      sha1 = "aa95e1b12e009ed6b05d0ccb188ca4829e799780";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "add colors to the etherpad";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_comments_page/node-packages.json b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.json
new file mode 100644 (file)
index 0000000..ae32884
--- /dev/null
@@ -0,0 +1 @@
+["ep_comments_page"]
diff --git a/flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix
new file mode 100644 (file)
index 0000000..8d7c85a
--- /dev/null
@@ -0,0 +1,342 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "after-0.8.2" = {
+      name = "after";
+      packageName = "after";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/after/-/after-0.8.2.tgz";
+        sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+      };
+    };
+    "arraybuffer.slice-0.0.7" = {
+      name = "arraybuffer.slice";
+      packageName = "arraybuffer.slice";
+      version = "0.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz";
+        sha512 = "wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==";
+      };
+    };
+    "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==";
+      };
+    };
+    "backo2-1.0.2" = {
+      name = "backo2";
+      packageName = "backo2";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz";
+        sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+      };
+    };
+    "base64-arraybuffer-0.1.5" = {
+      name = "base64-arraybuffer";
+      packageName = "base64-arraybuffer";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
+        sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
+      };
+    };
+    "better-assert-1.0.2" = {
+      name = "better-assert";
+      packageName = "better-assert";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz";
+        sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
+      };
+    };
+    "blob-0.0.5" = {
+      name = "blob";
+      packageName = "blob";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz";
+        sha512 = "gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==";
+      };
+    };
+    "callsite-1.0.0" = {
+      name = "callsite";
+      packageName = "callsite";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz";
+        sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
+      };
+    };
+    "component-bind-1.0.0" = {
+      name = "component-bind";
+      packageName = "component-bind";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz";
+        sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
+      };
+    };
+    "component-emitter-1.2.1" = {
+      name = "component-emitter";
+      packageName = "component-emitter";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    };
+    "component-inherit-0.0.3" = {
+      name = "component-inherit";
+      packageName = "component-inherit";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz";
+        sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
+      };
+    };
+    "debug-3.1.0" = {
+      name = "debug";
+      packageName = "debug";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz";
+        sha512 = "OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==";
+      };
+    };
+    "debug-4.1.1" = {
+      name = "debug";
+      packageName = "debug";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";
+        sha512 = "pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==";
+      };
+    };
+    "engine.io-client-3.4.1" = {
+      name = "engine.io-client";
+      packageName = "engine.io-client";
+      version = "3.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz";
+        sha512 = "RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==";
+      };
+    };
+    "engine.io-parser-2.2.0" = {
+      name = "engine.io-parser";
+      packageName = "engine.io-parser";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz";
+        sha512 = "6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==";
+      };
+    };
+    "formidable-1.2.2" = {
+      name = "formidable";
+      packageName = "formidable";
+      version = "1.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz";
+        sha512 = "V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==";
+      };
+    };
+    "has-binary2-1.0.3" = {
+      name = "has-binary2";
+      packageName = "has-binary2";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz";
+        sha512 = "G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==";
+      };
+    };
+    "has-cors-1.1.0" = {
+      name = "has-cors";
+      packageName = "has-cors";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz";
+        sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
+      };
+    };
+    "indexof-0.0.1" = {
+      name = "indexof";
+      packageName = "indexof";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    };
+    "isarray-2.0.1" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz";
+        sha1 = "a37d94ed9cda2d59865c9f76fe596ee1f338741e";
+      };
+    };
+    "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";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "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==";
+      };
+    };
+    "object-component-0.0.3" = {
+      name = "object-component";
+      packageName = "object-component";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz";
+        sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
+      };
+    };
+    "parseqs-0.0.5" = {
+      name = "parseqs";
+      packageName = "parseqs";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz";
+        sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
+      };
+    };
+    "parseuri-0.0.5" = {
+      name = "parseuri";
+      packageName = "parseuri";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz";
+        sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
+      };
+    };
+    "socket.io-client-2.3.0" = {
+      name = "socket.io-client";
+      packageName = "socket.io-client";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz";
+        sha512 = "cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==";
+      };
+    };
+    "socket.io-parser-3.3.0" = {
+      name = "socket.io-parser";
+      packageName = "socket.io-parser";
+      version = "3.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz";
+        sha512 = "hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==";
+      };
+    };
+    "to-array-0.1.4" = {
+      name = "to-array";
+      packageName = "to-array";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz";
+        sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
+      };
+    };
+    "ws-6.1.4" = {
+      name = "ws";
+      packageName = "ws";
+      version = "6.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz";
+        sha512 = "eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==";
+      };
+    };
+    "xmlhttprequest-ssl-1.5.5" = {
+      name = "xmlhttprequest-ssl";
+      packageName = "xmlhttprequest-ssl";
+      version = "1.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz";
+        sha1 = "c2876b06168aadc40e57d97e81191ac8f4398b3e";
+      };
+    };
+    "yeast-0.1.2" = {
+      name = "yeast";
+      packageName = "yeast";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz";
+        sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
+      };
+    };
+  };
+in
+{
+  ep_comments_page = nodeEnv.buildNodePackage {
+    name = "ep_comments_page";
+    packageName = "ep_comments_page";
+    version = "0.1.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_comments_page/-/ep_comments_page-0.1.0.tgz";
+      sha512 = "aHUfyR3HZ677wgL1hJEeaa1yIabW3PjaFXHhWnlEXdIDXL3WmgkGQ4Y1ccHp057EmquCwNb595HADQO+QUK/lw==";
+    };
+    dependencies = [
+      sources."after-0.8.2"
+      sources."arraybuffer.slice-0.0.7"
+      sources."async-limiter-1.0.1"
+      sources."backo2-1.0.2"
+      sources."base64-arraybuffer-0.1.5"
+      sources."better-assert-1.0.2"
+      sources."blob-0.0.5"
+      sources."callsite-1.0.0"
+      sources."component-bind-1.0.0"
+      sources."component-emitter-1.2.1"
+      sources."component-inherit-0.0.3"
+      sources."debug-4.1.1"
+      sources."engine.io-client-3.4.1"
+      sources."engine.io-parser-2.2.0"
+      sources."formidable-1.2.2"
+      sources."has-binary2-1.0.3"
+      sources."has-cors-1.1.0"
+      sources."indexof-0.0.1"
+      sources."isarray-2.0.1"
+      sources."ms-2.1.2"
+      sources."object-component-0.0.3"
+      sources."parseqs-0.0.5"
+      sources."parseuri-0.0.5"
+      sources."socket.io-client-2.3.0"
+      (sources."socket.io-parser-3.3.0" // {
+        dependencies = [
+          sources."debug-3.1.0"
+          sources."ms-2.0.0"
+        ];
+      })
+      sources."to-array-0.1.4"
+      sources."ws-6.1.4"
+      sources."xmlhttprequest-ssl-1.5.5"
+      sources."yeast-0.1.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Adds comments on sidebar and link it to the text.  Support for Page View, requires ep_page_view";
+      homepage = "https://github.com/ether/ep_comments#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json
new file mode 100644 (file)
index 0000000..f6da8df
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_copy_paste_select_all" ]
diff --git a/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix
new file mode 100644 (file)
index 0000000..504bee2
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_copy_paste_select_all = nodeEnv.buildNodePackage {
+    name = "ep_copy_paste_select_all";
+    packageName = "ep_copy_paste_select_all";
+    version = "0.0.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_copy_paste_select_all/-/ep_copy_paste_select_all-0.0.4.tgz";
+      sha1 = "41b89ece9da8e549a7ca4b11cdfa0a27344f21c8";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support to do Copy, Paste, Select All and Find and Replace, this plugin requires the file menu";
+      homepage = https://github.com/ether/ep_copy_paste_select_all;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json
new file mode 100644 (file)
index 0000000..b409581
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_cursortrace" ]
diff --git a/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix
new file mode 100644 (file)
index 0000000..d8c1480
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_cursortrace = nodeEnv.buildNodePackage {
+    name = "ep_cursortrace";
+    packageName = "ep_cursortrace";
+    version = "2.0.15";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_cursortrace/-/ep_cursortrace-2.0.15.tgz";
+      sha1 = "fa374f2d4be2708af998fbb407633c55d9031326";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Show cursor/caret movements of other users in real time";
+      homepage = https://github.com/redhog/ep_cursortrace;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json
new file mode 100644 (file)
index 0000000..8688afc
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_delete_empty_pads" ]
diff --git a/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix
new file mode 100644 (file)
index 0000000..8f3e9c0
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_delete_empty_pads = nodeEnv.buildNodePackage {
+    name = "ep_delete_empty_pads";
+    packageName = "ep_delete_empty_pads";
+    version = "0.0.6";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_delete_empty_pads/-/ep_delete_empty_pads-0.0.6.tgz";
+      sha512 = "ZpVKhWYUBAz5jWXT4Ldjraa5oAmOmOiSaNUSVOdVEG7DLeoNaTrjSQx0KZl4EjF1Qp/oUQwX69ryjY0assmdrw==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Delete pads which were never edited";
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_embedmedia/fix.patch b/flakes/etherpad-lite/modules/ep_embedmedia/fix.patch
new file mode 100644 (file)
index 0000000..162f1b0
--- /dev/null
@@ -0,0 +1,85 @@
+diff --git a/ep.json b/ep.json
+index 083d484..6803475 100644
+--- a/ep.json
++++ b/ep.json
+@@ -5,6 +5,7 @@
+       "hooks": {
+       "eejsBlock_editbarMenuLeft": "ep_embedmedia/hooks:eejsBlock_editbarMenuLeft",
+       "eejsBlock_scripts": "ep_embedmedia/hooks:eejsBlock_scripts",
++      "eejsBlock_timesliderBody": "ep_embedmedia/hooks:eejsBlock_scripts",
+       "eejsBlock_styles": "ep_embedmedia/hooks:eejsBlock_styles",
+       "eejsBlock_body": "ep_embedmedia/hooks:eejsBlock_body"
+       },
+diff --git a/static/css/main.css b/static/css/main.css
+index 72a460f..3b66d8e 100644
+--- a/static/css/main.css
++++ b/static/css/main.css
+@@ -6,10 +6,18 @@
+   z-index:999999;
+ }
++#embedMediaSrc {
++  max-width: 100%;
++}
++
+ .embedMediaButton {
+   padding:10px;
+ }
++#doEmbedMedia{
++  color:blue;
++} 
++
+ #cancelEmbedMedia{
+   color:red;
+ } 
+@@ -19,6 +27,6 @@
+ }
+ .buttonicon-embed-media:before{
+-  content:"\e80b";
++  content:"\e83b";
+   top: 2px !important;
+ }
+diff --git a/static/js/main.js b/static/js/main.js
+index 8c94767..19415d5 100644
+--- a/static/js/main.js
++++ b/static/js/main.js
+@@ -10,22 +10,25 @@ $(document).ready(function () {
+     } else {
+       module.slideDown("fast");
+     }
++    module.toggleClass("popup-show");
+   });
+   $("#doEmbedMedia").click(function () {
+     var padeditor = require('ep_etherpad-lite/static/js/pad_editor').padeditor;
+     $("#embedMediaModal").slideUp("fast");
++    $("#embedMediaModal").removeClass("popup-show");
+     return padeditor.ace.callWithAce(function (ace) {
+-      rep = ace.ace_getRep();
++      var rep = ace.ace_getRep();
+       ace.ace_replaceRange(rep.selStart, rep.selEnd, "E");
+       ace.ace_performSelectionChange([rep.selStart[0],rep.selStart[1]-1], rep.selStart, false);
+-        ace.ace_performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, [["embedMedia", escape($("#embedMediaSrc")[0].value)]]);
++      ace.ace_performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, [["embedMedia", escape($("#embedMediaSrc")[0].value)]]);
+     }, "embedMedia");
+   });
+   $("#cancelEmbedMedia").click(function () {
+     $("#embedMediaModal").slideUp("fast");
++    $("#embedMediaModal").removeClass("popup-show");
+   });
+ });
+diff --git a/templates/modals.ejs b/templates/modals.ejs
+index 9340698..8915a3b 100644
+--- a/templates/modals.ejs
++++ b/templates/modals.ejs
+@@ -1,4 +1,4 @@
+-<div id="embedMediaModal" class="popup">
++<div id="embedMediaModal" class="popup popup-content">
+     <% e.begin_block("embedMediaPopup"); %>
+         <h1>Embed media into this pad</h1>
+         <p>Paste a link or "embed code" here:</p>
diff --git a/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json
new file mode 100644 (file)
index 0000000..e4961d3
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_embedmedia" ]
diff --git a/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix
new file mode 100644 (file)
index 0000000..80ba484
--- /dev/null
@@ -0,0 +1,29 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_embedmedia = nodeEnv.buildNodePackage {
+    name = "ep_embedmedia";
+    packageName = "ep_embedmedia";
+    version = "0.0.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_embedmedia/-/ep_embedmedia-0.0.4.tgz";
+      sha1 = "b24bf0fe9702d21aa73079890e93183efc6a0975";
+    };
+    buildInputs = globalBuildInputs;
+    preRebuild = ''
+      patch -p1 < ${./fix.patch}
+    '';
+    meta = {
+      description = "Embed media (youtube, vimeo etc)";
+      homepage = https://github.com/JohnMcLear/ep_embedmedia;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_font_family/node-packages.json b/flakes/etherpad-lite/modules/ep_font_family/node-packages.json
new file mode 100644 (file)
index 0000000..a719a45
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_font_family" ]
diff --git a/flakes/etherpad-lite/modules/ep_font_family/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_family/node-packages.nix
new file mode 100644 (file)
index 0000000..c64f0cb
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_font_family = nodeEnv.buildNodePackage {
+    name = "ep_font_family";
+    packageName = "ep_font_family";
+    version = "0.2.7";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_font_family/-/ep_font_family-0.2.7.tgz";
+      sha1 = "a31c06b1684c7fd65c1d5bf96bcf99b6faa79893";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support for different Fonts";
+      homepage = https://github.com/JohnMcLear/ep_font_family;
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_font_size/node-packages.json b/flakes/etherpad-lite/modules/ep_font_size/node-packages.json
new file mode 100644 (file)
index 0000000..472df3b
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_font_size" ]
diff --git a/flakes/etherpad-lite/modules/ep_font_size/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_size/node-packages.nix
new file mode 100644 (file)
index 0000000..06b69f9
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_font_size = nodeEnv.buildNodePackage {
+    name = "ep_font_size";
+    packageName = "ep_font_size";
+    version = "0.2.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_font_size/-/ep_font_size-0.2.0.tgz";
+      sha512 = "63D+PoWgXY/DpqS3NGunFanIzCTF5js7rKD8R979b1daPRc/vI6To8HD69iknb5F3APC/G64g9BiRJIYNnIYmA==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support for Font Sizes";
+      homepage = "https://github.com/JohnMcLear/ep_font_size#readme";
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_headings2/node-packages.json b/flakes/etherpad-lite/modules/ep_headings2/node-packages.json
new file mode 100644 (file)
index 0000000..adbc268
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_headings2" ]
diff --git a/flakes/etherpad-lite/modules/ep_headings2/node-packages.nix b/flakes/etherpad-lite/modules/ep_headings2/node-packages.nix
new file mode 100644 (file)
index 0000000..ba6392c
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_headings2 = nodeEnv.buildNodePackage {
+    name = "ep_headings2";
+    packageName = "ep_headings2";
+    version = "0.1.1";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_headings2/-/ep_headings2-0.1.1.tgz";
+      sha512 = "DcHRUMzTsTFbTNH4wY43HI7LJ1Xk85J4Lv54fI5pVTXjqkfOC3p5CHoTWwmrCP288i4aMOcDP9Xru5qv/41vqQ==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Adds heading support to Etherpad Lite.  Includes improved suppot for export, i18n etc.";
+      homepage = https://github.com/johnmclear/ep_headings2;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_immae_buttons/ep.json b/flakes/etherpad-lite/modules/ep_immae_buttons/ep.json
new file mode 100644 (file)
index 0000000..10db4ef
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "parts": [
+    {
+      "name": "immae_buttons",
+      "hooks": {
+        "eejsBlock_editbarMenuLeft": "ep_immae_buttons/hooks:eejsBlock_editbarMenuLeft"
+      },
+      "client_hooks": {
+        "postAceInit": "ep_immae_buttons/static/js/main:postAceInit"
+      }
+    }
+  ]
+}
diff --git a/flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js b/flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js
new file mode 100644 (file)
index 0000000..dcf7782
--- /dev/null
@@ -0,0 +1,6 @@
+var eejs = require('ep_etherpad-lite/node/eejs/');
+
+exports.eejsBlock_editbarMenuLeft = function (hook_name, args, cb) {
+  args.content = args.content + eejs.require("ep_immae_buttons/templates/editbarButtons.ejs");
+  return cb();
+}
diff --git a/flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix b/flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix
new file mode 100644 (file)
index 0000000..d7045df
--- /dev/null
@@ -0,0 +1,22 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_immae_buttons = nodeEnv.buildNodePackage {
+    name = "ep_immae_buttons";
+    packageName = "ep_immae_buttons";
+    version = "0.1.0";
+    src = ./.;
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Additional buttons (replacing clear_formatting and copy_paste_select_all)";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_immae_buttons/package.json b/flakes/etherpad-lite/modules/ep_immae_buttons/package.json
new file mode 100644 (file)
index 0000000..39bb0a8
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "name": "ep_immae_buttons",
+  "description": "Additional buttons (replacing clear_formatting and copy_paste_select_all)",
+  "version": "0.1.0",
+  "author": "Immae",
+  "contributors": [],
+  "dependencies": { },
+  "repository" : { "type" : "git", "url"  : "" },
+  "engines": { "node": "*" }
+}
diff --git a/flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js b/flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js
new file mode 100644 (file)
index 0000000..07f7b9c
--- /dev/null
@@ -0,0 +1,67 @@
+exports.postAceInit = function(hook, context){
+  $(document).ready(function () {
+    $('.clearFormatting').click(function(){
+      context.ace.callWithAce(function(ace){
+
+        var rep = ace.ace_getRep(); // get the current user selection
+        var isSelection = (rep.selStart[0] !== rep.selEnd[0] || rep.selStart[1] !== rep.selEnd[1]);
+        if(!isSelection) return false; // No point proceeding if no selection..
+
+        var attrs = rep.apool.attribToNum; // get the attributes on this document
+        $.each(attrs, function(k, v){ // for each attribute
+          var attr = k.split(",")[0]; // get the name of the attribute
+          if(attr !== "author"){ // if its not an author attribute
+            ace.ace_setAttributeOnSelection(attr, false); // set the attribute to false
+          }
+        });
+      },'clearFormatting' , true);
+    });
+
+    $('.findAndReplace').click(function(){
+      var from = prompt("Search for...");
+      var to = prompt("Replace with...");
+      var HTMLLines = $('iframe[name="ace_outer"]').contents().find('iframe').contents().find("#innerdocbody").children("div");
+      $(HTMLLines).each(function(){ // For each line
+        findAndReplace(from, to, this);
+      });
+    });
+
+  });
+}
+
+function findAndReplace(searchText, replacement, searchNode) {
+  if (!searchText || typeof replacement === 'undefined') {
+    // Throw error here if you want...
+    return;
+  }
+  var regex = typeof searchText === 'string' ?
+    new RegExp(searchText, 'gi') : searchText,
+    childNodes = (searchNode || document.body).childNodes,
+    cnLength = childNodes.length,
+    excludes = ["html","head","style","title","meta","script","object","iframe","link"];
+
+  while (cnLength--) {
+    var currentNode = childNodes[cnLength];
+    if (currentNode.nodeType === 1){
+      if(excludes.indexOf(currentNode.nodeName.toLowerCase() === -1)){
+        arguments.callee(searchText, replacement, currentNode);
+      }
+    }
+    if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
+      continue;
+    }
+    var parent = currentNode.parentNode,
+    frag = (function(){
+      var html = currentNode.data.replace(regex, replacement),
+      wrap = document.createElement('div'),
+      frag = document.createDocumentFragment();
+      wrap.innerHTML = html;
+      while (wrap.firstChild) {
+        frag.appendChild(wrap.firstChild);
+      }
+      return frag;
+    })();
+    parent.insertBefore(frag, currentNode);
+    parent.removeChild(currentNode);
+  }
+}
diff --git a/flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs b/flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs
new file mode 100644 (file)
index 0000000..339ae3d
--- /dev/null
@@ -0,0 +1,12 @@
+<li class="separator"></li>
+<li class="clearFormatting">
+  <a title="Clear Formatting">
+    <span class="buttonicon buttonicon-clear-formatting">Clear</span>
+  </a>
+</li>
+<li class="separator"></li>
+<li class="findAndReplace">
+  <a title="Find and replace">
+    <span class="buttonicon buttonicon-find-replace">Find</span>
+  </a>
+</li>
diff --git a/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json
new file mode 100644 (file)
index 0000000..cacc12a
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_ldapauth" ]
diff --git a/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix
new file mode 100644 (file)
index 0000000..8140187
--- /dev/null
@@ -0,0 +1,392 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "asn1-0.2.3" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
+        sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
+      };
+    };
+    "assert-plus-0.1.5" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz";
+        sha1 = "ee74009413002d84cec7219c6ac811812e723160";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "async-stacktrace-0.0.2" = {
+      name = "async-stacktrace";
+      packageName = "async-stacktrace";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async-stacktrace/-/async-stacktrace-0.0.2.tgz";
+        sha1 = "8bbb9787e3b38c836c729a7e9d7c08630db5d1ef";
+      };
+    };
+    "backoff-2.5.0" = {
+      name = "backoff";
+      packageName = "backoff";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz";
+        sha1 = "f616eda9d3e4b66b8ca7fca79f695722c5f8e26f";
+      };
+    };
+    "balanced-match-1.0.0" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    };
+    "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==";
+      };
+    };
+    "bunyan-1.8.12" = {
+      name = "bunyan";
+      packageName = "bunyan";
+      version = "1.8.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz";
+        sha1 = "f150f0f6748abdd72aeae84f04403be2ef113797";
+      };
+    };
+    "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";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "dtrace-provider-0.7.1" = {
+      name = "dtrace-provider";
+      packageName = "dtrace-provider";
+      version = "0.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.7.1.tgz";
+        sha1 = "c06b308f2f10d5d5838aec9c571e5d588dc71d04";
+      };
+    };
+    "dtrace-provider-0.8.8" = {
+      name = "dtrace-provider";
+      packageName = "dtrace-provider";
+      version = "0.8.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz";
+        sha512 = "b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==";
+      };
+    };
+    "extsprintf-1.2.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz";
+        sha1 = "5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529";
+      };
+    };
+    "glob-6.0.4" = {
+      name = "glob";
+      packageName = "glob";
+      version = "6.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz";
+        sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
+      };
+    };
+    "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";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    };
+    "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==";
+      };
+    };
+    "ldap-filter-0.2.2" = {
+      name = "ldap-filter";
+      packageName = "ldap-filter";
+      version = "0.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz";
+        sha1 = "f2b842be0b86da3352798505b31ebcae590d77d0";
+      };
+    };
+    "ldapjs-1.0.1" = {
+      name = "ldapjs";
+      packageName = "ldapjs";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.1.tgz";
+        sha1 = "352b812ae74b0a8e96549a4b896060eee1b9a546";
+      };
+    };
+    "minimatch-3.0.4" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
+        sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
+      };
+    };
+    "minimist-1.2.5" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
+        sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
+      };
+    };
+    "mkdirp-0.5.5" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
+        sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
+      };
+    };
+    "moment-2.24.0" = {
+      name = "moment";
+      packageName = "moment";
+      version = "2.24.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz";
+        sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==";
+      };
+    };
+    "mv-2.1.1" = {
+      name = "mv";
+      packageName = "mv";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz";
+        sha1 = "ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2";
+      };
+    };
+    "nan-2.14.1" = {
+      name = "nan";
+      packageName = "nan";
+      version = "2.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz";
+        sha512 = "isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==";
+      };
+    };
+    "ncp-2.0.0" = {
+      name = "ncp";
+      packageName = "ncp";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz";
+        sha1 = "195a21d6c46e361d2fb1281ba38b91e9df7bdbb3";
+      };
+    };
+    "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";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    };
+    "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";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    };
+    "precond-0.2.3" = {
+      name = "precond";
+      packageName = "precond";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz";
+        sha1 = "aa9591bcaa24923f1e0f4849d240f47efc1075ac";
+      };
+    };
+    "rimraf-2.4.5" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.4.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz";
+        sha1 = "ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da";
+      };
+    };
+    "safe-json-stringify-1.2.0" = {
+      name = "safe-json-stringify";
+      packageName = "safe-json-stringify";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz";
+        sha512 = "gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==";
+      };
+    };
+    "vasync-1.6.4" = {
+      name = "vasync";
+      packageName = "vasync";
+      version = "1.6.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz";
+        sha1 = "dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "verror-1.6.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz";
+        sha1 = "7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5";
+      };
+    };
+    "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";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    };
+  };
+in
+{
+  ep_ldapauth = nodeEnv.buildNodePackage {
+    name = "ep_ldapauth";
+    packageName = "ep_ldapauth";
+    version = "0.3.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_ldapauth/-/ep_ldapauth-0.3.0.tgz";
+      sha1 = "8b34ea34b20ae97d53d753cc7d1f6f191800e3b0";
+    };
+    preRebuild = ''
+      sed -i -e 's/context.message.data.type == "USERINFO_UPDATE"/context.message.data.type == "USERINFO_UPDATE" \&\& context.req \&\& context.req.session \&\& typeof(context.req.session.user) !== "undefined"/g' ep_ldapauth.js
+    '';
+    dependencies = [
+      sources."asn1-0.2.3"
+      sources."assert-plus-1.0.0"
+      sources."async-stacktrace-0.0.2"
+      sources."backoff-2.5.0"
+      sources."balanced-match-1.0.0"
+      sources."brace-expansion-1.1.11"
+      (sources."bunyan-1.8.12" // {
+        dependencies = [
+          sources."dtrace-provider-0.8.8"
+        ];
+      })
+      sources."concat-map-0.0.1"
+      sources."core-util-is-1.0.2"
+      sources."dashdash-1.14.1"
+      sources."dtrace-provider-0.7.1"
+      sources."extsprintf-1.2.0"
+      sources."glob-6.0.4"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.4"
+      (sources."ldap-filter-0.2.2" // {
+        dependencies = [
+          sources."assert-plus-0.1.5"
+        ];
+      })
+      sources."ldapjs-1.0.1"
+      sources."minimatch-3.0.4"
+      sources."minimist-1.2.5"
+      sources."mkdirp-0.5.5"
+      sources."moment-2.24.0"
+      sources."mv-2.1.1"
+      sources."nan-2.14.1"
+      sources."ncp-2.0.0"
+      sources."once-1.4.0"
+      sources."path-is-absolute-1.0.1"
+      sources."precond-0.2.3"
+      sources."rimraf-2.4.5"
+      sources."safe-json-stringify-1.2.0"
+      (sources."vasync-1.6.4" // {
+        dependencies = [
+          sources."verror-1.6.0"
+        ];
+      })
+      sources."verror-1.10.0"
+      sources."wrappy-1.0.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Hooks into etherpad lite auth to provide LDAP authentication.";
+      homepage = "https://github.com/tykeal/ep_ldapauth#readme";
+      license = "GPL-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_line_height/fix.patch b/flakes/etherpad-lite/modules/ep_line_height/fix.patch
new file mode 100644 (file)
index 0000000..ffd65f1
--- /dev/null
@@ -0,0 +1,30 @@
+diff --git a/static/js/index.js b/static/js/index.js
+index 1884571..c0490bf 100644
+--- a/static/js/index.js
++++ b/static/js/index.js
+@@ -23,9 +23,6 @@ var postAceInit = function(hook, context){
+   $('.line-height-menu').hover(function(){
+     $('.submenu > .height-selection').attr('size', 4);
+   });
+-  $('.line-height').click(function(){
+-    $('.line-height-select').toggle();
+-  });
+ };
+ exports.aceGetFilterStack = function(name, context){
+diff --git a/templates/editbarButtons.ejs b/templates/editbarButtons.ejs
+index 89a8aaa..8af258b 100644
+--- a/templates/editbarButtons.ejs
++++ b/templates/editbarButtons.ejs
+@@ -1,10 +1,5 @@
+ <li class="separator acl-write"></li>
+-<li class="acl-write line-height">
+-  <a title="line height">
+-    <span class="buttonicon" style="background-image:url('../static/plugins/ep_line_height/static/img/icon.png');"></span>
+-  </a>
+-</li>
+-<li class="line-height-select" class="acl-write" style="display:none;">
++<li class="line-height-select" class="acl-write">
+     <select class="height-selection">
+         <option value="dummy" selected data-l10n-id="ep_line_height.height">Line Height</option>
+         <option value="1">1x</option>
diff --git a/flakes/etherpad-lite/modules/ep_line_height/node-packages.json b/flakes/etherpad-lite/modules/ep_line_height/node-packages.json
new file mode 100644 (file)
index 0000000..307c2e7
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_line_height" ]
diff --git a/flakes/etherpad-lite/modules/ep_line_height/node-packages.nix b/flakes/etherpad-lite/modules/ep_line_height/node-packages.nix
new file mode 100644 (file)
index 0000000..d5d5c21
--- /dev/null
@@ -0,0 +1,28 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_line_height = nodeEnv.buildNodePackage {
+    name = "ep_line_height";
+    packageName = "ep_line_height";
+    version = "0.0.4";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_line_height/-/ep_line_height-0.0.4.tgz";
+      sha1 = "8afbb441e6d65db97d2335887f9352b10b5d22d2";
+    };
+    buildInputs = globalBuildInputs;
+    preRebuild = ''
+      patch -p1 < ${./fix.patch}
+    '';
+    meta = {
+      description = "Change the line height";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_markdown/node-packages.json b/flakes/etherpad-lite/modules/ep_markdown/node-packages.json
new file mode 100644 (file)
index 0000000..1c5526c
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_markdown" ]
diff --git a/flakes/etherpad-lite/modules/ep_markdown/node-packages.nix b/flakes/etherpad-lite/modules/ep_markdown/node-packages.nix
new file mode 100644 (file)
index 0000000..eb7a43e
--- /dev/null
@@ -0,0 +1,300 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "ansi-regex-4.1.0" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "4.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz";
+        sha512 = "1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==";
+      };
+    };
+    "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==";
+      };
+    };
+    "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==";
+      };
+    };
+    "cliui-5.0.0" = {
+      name = "cliui";
+      packageName = "cliui";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz";
+        sha512 = "PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==";
+      };
+    };
+    "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-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";
+        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
+      };
+    };
+    "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";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    };
+    "emoji-regex-7.0.3" = {
+      name = "emoji-regex";
+      packageName = "emoji-regex";
+      version = "7.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz";
+        sha512 = "CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==";
+      };
+    };
+    "find-up-3.0.0" = {
+      name = "find-up";
+      packageName = "find-up";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";
+        sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==";
+      };
+    };
+    "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==";
+      };
+    };
+    "is-fullwidth-code-point-2.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    };
+    "locate-path-3.0.0" = {
+      name = "locate-path";
+      packageName = "locate-path";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";
+        sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==";
+      };
+    };
+    "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-3.0.0" = {
+      name = "p-locate";
+      packageName = "p-locate";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";
+        sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==";
+      };
+    };
+    "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==";
+      };
+    };
+    "path-exists-3.0.0" = {
+      name = "path-exists";
+      packageName = "path-exists";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";
+        sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
+      };
+    };
+    "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";
+        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
+      };
+    };
+    "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==";
+      };
+    };
+    "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";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    };
+    "showdown-1.9.1" = {
+      name = "showdown";
+      packageName = "showdown";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz";
+        sha512 = "9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==";
+      };
+    };
+    "string-width-3.1.0" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz";
+        sha512 = "vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==";
+      };
+    };
+    "strip-ansi-5.2.0" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "5.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz";
+        sha512 = "DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==";
+      };
+    };
+    "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";
+        sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
+      };
+    };
+    "wrap-ansi-5.1.0" = {
+      name = "wrap-ansi";
+      packageName = "wrap-ansi";
+      version = "5.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz";
+        sha512 = "QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==";
+      };
+    };
+    "y18n-4.0.0" = {
+      name = "y18n";
+      packageName = "y18n";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz";
+        sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==";
+      };
+    };
+    "yargs-14.2.3" = {
+      name = "yargs";
+      packageName = "yargs";
+      version = "14.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz";
+        sha512 = "ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==";
+      };
+    };
+    "yargs-parser-15.0.1" = {
+      name = "yargs-parser";
+      packageName = "yargs-parser";
+      version = "15.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz";
+        sha512 = "0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==";
+      };
+    };
+  };
+in
+{
+  ep_markdown = nodeEnv.buildNodePackage {
+    name = "ep_markdown";
+    packageName = "ep_markdown";
+    version = "0.1.7";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_markdown/-/ep_markdown-0.1.7.tgz";
+      sha512 = "PQMFqP9P1jUEMFpwwysWaHdYzzcQIQjT/JlDRmOgfh4mloJm8honOJHnofxbqx1mxApKAW3rnEQA2t0zH8wi2w==";
+    };
+    dependencies = [
+      sources."ansi-regex-4.1.0"
+      sources."ansi-styles-3.2.1"
+      sources."camelcase-5.3.1"
+      sources."cliui-5.0.0"
+      sources."color-convert-1.9.3"
+      sources."color-name-1.1.3"
+      sources."decamelize-1.2.0"
+      sources."emoji-regex-7.0.3"
+      sources."find-up-3.0.0"
+      sources."get-caller-file-2.0.5"
+      sources."is-fullwidth-code-point-2.0.0"
+      sources."locate-path-3.0.0"
+      sources."p-limit-2.3.0"
+      sources."p-locate-3.0.0"
+      sources."p-try-2.2.0"
+      sources."path-exists-3.0.0"
+      sources."require-directory-2.1.1"
+      sources."require-main-filename-2.0.0"
+      sources."set-blocking-2.0.0"
+      sources."showdown-1.9.1"
+      sources."string-width-3.1.0"
+      sources."strip-ansi-5.2.0"
+      sources."which-module-2.0.0"
+      sources."wrap-ansi-5.1.0"
+      sources."y18n-4.0.0"
+      sources."yargs-14.2.3"
+      sources."yargs-parser-15.0.1"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Edit and Export as Markdown in Etherpad";
+      homepage = "https://github.com/johnmclear/ep_markdown#readme";
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch b/flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch
new file mode 100644 (file)
index 0000000..6ade6cb
--- /dev/null
@@ -0,0 +1,59 @@
+diff --git a/auth.js b/auth.js
+index ce77ee4..235d8e6 100644
+--- a/auth.js
++++ b/auth.js
+@@ -91,6 +91,7 @@ var cuid        = require('cuid');
+ var common = require('./model/common.js');
+ var user   = require('./model/user.js');
+ var conf   = require('./configuration.js');
++var utils  = require('./utils.js');
+ var NOT_INTERNAL_AUTH_PWD = 'soooooo_useless';
+@@ -232,21 +233,21 @@ module.exports = (function () {
+               // We have to create the user in mypads database
+               ldapConf  = conf.get('authLdapSettings');
+               user.set({
+-                  login: ldapuser[props.login],
++                  login: utils.getSingleton(ldapuser[props.login]),
+                   password: NOT_INTERNAL_AUTH_PWD,
+-                  firstname: ldapuser[props.firstname],
+-                  lastname: ldapuser[props.lastname],
++                  firstname: utils.getSingleton(ldapuser[props.firstname]),
++                  lastname: utils.getSingleton(ldapuser[props.lastname]),
+                   email: mail,
+                   lang: ldapConf.defaultLang || 'en'
+                 }, callback);
+             } else if (u.email     !== mail                      ||
+-                       u.firstname !== ldapuser[props.firstname] ||
+-                       u.lastname  !== ldapuser[props.lastname]) {
++                       u.firstname !== utils.getSingleton(ldapuser[props.firstname]) ||
++                       u.lastname  !== utils.getSingleton(ldapuser[props.lastname])) {
+                 // Update database and cache informations if needed
+                 // (i.e. update from LDAP)
+                 u.email     = mail;
+-                u.firstname = ldapuser[props.firstname];
+-                u.lastname  = ldapuser[props.lastname];
++                u.firstname = utils.getSingleton(ldapuser[props.firstname]);
++                u.lastname  = utils.getSingleton(ldapuser[props.lastname]);
+                 u.password  = NOT_INTERNAL_AUTH_PWD;
+                 user.set(u, callback);
+             } else {
+diff --git a/utils.js b/utils.js
+index 32c2727..d381d06 100644
+--- a/utils.js
++++ b/utils.js
+@@ -14,3 +14,13 @@ exports.callbackify2 = function (fun) {
+     return wrapPromise(fun(arg1, arg2), cb);
+   };
+ };
++
++exports.getSingleton = function (stringOrArray) {
++  if (Array.isArray(stringOrArray)) {
++    if (stringOrArray.length > 0) {
++      return stringOrArray[0];
++    }
++  } else if (stringOrArray) {
++    return stringOrArray;
++  }
++}
diff --git a/flakes/etherpad-lite/modules/ep_mypads/node-packages.json b/flakes/etherpad-lite/modules/ep_mypads/node-packages.json
new file mode 100644 (file)
index 0000000..36b70bd
--- /dev/null
@@ -0,0 +1 @@
+["ep_mypads"]
diff --git a/flakes/etherpad-lite/modules/ep_mypads/node-packages.nix b/flakes/etherpad-lite/modules/ep_mypads/node-packages.nix
new file mode 100644 (file)
index 0000000..13b302c
--- /dev/null
@@ -0,0 +1,2156 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "@types/ldapjs-1.0.7" = {
+      name = "_at_types_slash_ldapjs";
+      packageName = "@types/ldapjs";
+      version = "1.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.7.tgz";
+        sha512 = "Cacc0pQ6fw8+J5Qwebbj2+YpYANOl09WEDjJsNyPHpNSza318mUIuAhgXDfC8kXDViymlEQIvgbvuPKovRIVEQ==";
+      };
+    };
+    "@types/node-13.13.4" = {
+      name = "_at_types_slash_node";
+      packageName = "@types/node";
+      version = "13.13.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz";
+        sha512 = "x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==";
+      };
+    };
+    "abstract-logging-1.0.0" = {
+      name = "abstract-logging";
+      packageName = "abstract-logging";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/abstract-logging/-/abstract-logging-1.0.0.tgz";
+        sha1 = "8b7deafd310559bc28f77724dd1bb30177278c1b";
+      };
+    };
+    "addressparser-0.2.1" = {
+      name = "addressparser";
+      packageName = "addressparser";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz";
+        sha1 = "d11a5b2eeda04cfefebdf3196c10ae13db6cd607";
+      };
+    };
+    "addressparser-0.3.2" = {
+      name = "addressparser";
+      packageName = "addressparser";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz";
+        sha1 = "59873f35e8fcf6c7361c10239261d76e15348bb2";
+      };
+    };
+    "ajv-6.12.2" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "6.12.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
+        sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    };
+    "ansi-regex-3.0.0" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
+        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
+      };
+    };
+    "ansi-styles-2.2.1" = {
+      name = "ansi-styles";
+      packageName = "ansi-styles";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    };
+    "asap-2.0.6" = {
+      name = "asap";
+      packageName = "asap";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz";
+        sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
+      };
+    };
+    "asn1-0.2.3" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
+        sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
+      };
+    };
+    "assert-plus-0.1.5" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz";
+        sha1 = "ee74009413002d84cec7219c6ac811812e723160";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "async-0.1.15" = {
+      name = "async";
+      packageName = "async";
+      version = "0.1.15";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-0.1.15.tgz";
+        sha1 = "2180eaca2cf2a6ca5280d41c0585bec9b3e49bd3";
+      };
+    };
+    "async-0.9.2" = {
+      name = "async";
+      packageName = "async";
+      version = "0.9.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-0.9.2.tgz";
+        sha1 = "aea74d5e61c1f899613bf64bda66d4c78f2fd17d";
+      };
+    };
+    "async-2.6.3" = {
+      name = "async";
+      packageName = "async";
+      version = "2.6.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-2.6.3.tgz";
+        sha512 = "zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==";
+      };
+    };
+    "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";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    };
+    "aws-sign2-0.7.0" = {
+      name = "aws-sign2";
+      packageName = "aws-sign2";
+      version = "0.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    };
+    "aws4-1.9.1" = {
+      name = "aws4";
+      packageName = "aws4";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
+        sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
+      };
+    };
+    "backoff-2.5.0" = {
+      name = "backoff";
+      packageName = "backoff";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz";
+        sha1 = "f616eda9d3e4b66b8ca7fca79f695722c5f8e26f";
+      };
+    };
+    "balanced-match-1.0.0" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    };
+    "bcrypt-pbkdf-1.0.2" = {
+      name = "bcrypt-pbkdf";
+      packageName = "bcrypt-pbkdf";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    };
+    "bcryptjs-2.4.3" = {
+      name = "bcryptjs";
+      packageName = "bcryptjs";
+      version = "2.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz";
+        sha1 = "9ab5627b93e60621ff7cdac5da9733027df1d0cb";
+      };
+    };
+    "bignumber.js-2.0.5" = {
+      name = "bignumber.js";
+      packageName = "bignumber.js";
+      version = "2.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.0.5.tgz";
+        sha1 = "e1d16f495454d4229a7a483ce8d3d774ddc50659";
+      };
+    };
+    "bluebird-2.11.0" = {
+      name = "bluebird";
+      packageName = "bluebird";
+      version = "2.11.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz";
+        sha1 = "534b9033c022c9579c56ba3b3e5a5caafbb650e1";
+      };
+    };
+    "body-parser-1.12.4" = {
+      name = "body-parser";
+      packageName = "body-parser";
+      version = "1.12.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/body-parser/-/body-parser-1.12.4.tgz";
+        sha1 = "090700c4ba28862a8520ef378395fdee5f61c229";
+      };
+    };
+    "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==";
+      };
+    };
+    "browser-fingerprint-0.0.1" = {
+      name = "browser-fingerprint";
+      packageName = "browser-fingerprint";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/browser-fingerprint/-/browser-fingerprint-0.0.1.tgz";
+        sha1 = "8df3cdca25bf7d5b3542d61545d730053fce604a";
+      };
+    };
+    "browser-request-0.3.3" = {
+      name = "browser-request";
+      packageName = "browser-request";
+      version = "0.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz";
+        sha1 = "9ece5b5aca89a29932242e18bf933def9876cc17";
+      };
+    };
+    "buffer-equal-constant-time-1.0.1" = {
+      name = "buffer-equal-constant-time";
+      packageName = "buffer-equal-constant-time";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz";
+        sha1 = "f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819";
+      };
+    };
+    "buffer-writer-1.0.1" = {
+      name = "buffer-writer";
+      packageName = "buffer-writer";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz";
+        sha1 = "22a936901e3029afcd7547eb4487ceb697a3bf08";
+      };
+    };
+    "bufferjs-1.1.0" = {
+      name = "bufferjs";
+      packageName = "bufferjs";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bufferjs/-/bufferjs-1.1.0.tgz";
+        sha1 = "095ffa39c5e6b40a2178a1169c9effc584a73201";
+      };
+    };
+    "bunyan-1.8.12" = {
+      name = "bunyan";
+      packageName = "bunyan";
+      version = "1.8.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz";
+        sha1 = "f150f0f6748abdd72aeae84f04403be2ef113797";
+      };
+    };
+    "bytes-1.0.0" = {
+      name = "bytes";
+      packageName = "bytes";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz";
+        sha1 = "3569ede8ba34315fab99c3e92cb04c7220de1fa8";
+      };
+    };
+    "bytes-2.1.0" = {
+      name = "bytes";
+      packageName = "bytes";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz";
+        sha1 = "ac93c410e2ffc9cc7cf4b464b38289067f5e47b4";
+      };
+    };
+    "caseless-0.12.0" = {
+      name = "caseless";
+      packageName = "caseless";
+      version = "0.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    };
+    "cassandra-driver-2.0.1" = {
+      name = "cassandra-driver";
+      packageName = "cassandra-driver";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-2.0.1.tgz";
+        sha1 = "072759ab837628dcbcb5bc678283dcc922c767e2";
+      };
+    };
+    "chalk-1.1.3" = {
+      name = "chalk";
+      packageName = "chalk";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    };
+    "channels-0.0.4" = {
+      name = "channels";
+      packageName = "channels";
+      version = "0.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/channels/-/channels-0.0.4.tgz";
+        sha1 = "1bee323edea152bb9ef04f41bc6e6b0f5948a941";
+      };
+    };
+    "cli-progress-2.1.1" = {
+      name = "cli-progress";
+      packageName = "cli-progress";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cli-progress/-/cli-progress-2.1.1.tgz";
+        sha512 = "TSJw3LY9ZRSis7yYzQ7flIdtQMbacd9oYoiFphJhI4SzgmqF0zErO+uNv0lbUjk1L4AGfHQJ4OVYYzW+JV66KA==";
+      };
+    };
+    "cloudant-follow-0.17.0" = {
+      name = "cloudant-follow";
+      packageName = "cloudant-follow";
+      version = "0.17.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cloudant-follow/-/cloudant-follow-0.17.0.tgz";
+        sha512 = "JQ1xvKAHh8rsnSVBjATLCjz/vQw1sWBGadxr2H69yFMwD7hShUGDwwEefdypaxroUJ/w6t1cSwilp/hRUxEW8w==";
+      };
+    };
+    "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==";
+      };
+    };
+    "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==";
+      };
+    };
+    "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";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    };
+    "content-type-1.0.4" = {
+      name = "content-type";
+      packageName = "content-type";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz";
+        sha512 = "hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==";
+      };
+    };
+    "cookie-0.1.2" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz";
+        sha1 = "72fec3d24e48a3432073d90c12642005061004b1";
+      };
+    };
+    "cookie-parser-1.3.4" = {
+      name = "cookie-parser";
+      packageName = "cookie-parser";
+      version = "1.3.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.4.tgz";
+        sha1 = "193035a5be97117a21709b3aa737f6132717bda6";
+      };
+    };
+    "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";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    };
+    "core-js-1.2.7" = {
+      name = "core-js";
+      packageName = "core-js";
+      version = "1.2.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz";
+        sha1 = "652294c14651db28fa93bd2d5ff2983a4f08c636";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "cuid-1.3.8" = {
+      name = "cuid";
+      packageName = "cuid";
+      version = "1.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cuid/-/cuid-1.3.8.tgz";
+        sha1 = "4b875e0969bad764f7ec0706cf44f5fb0831f6b7";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "debug-2.2.0" = {
+      name = "debug";
+      packageName = "debug";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz";
+        sha1 = "f87057e995b1a1f6ae6a4960664137bc56f039da";
+      };
+    };
+    "debug-3.2.6" = {
+      name = "debug";
+      packageName = "debug";
+      version = "3.2.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz";
+        sha512 = "mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==";
+      };
+    };
+    "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";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    };
+    "denque-1.4.1" = {
+      name = "denque";
+      packageName = "denque";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz";
+        sha512 = "OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==";
+      };
+    };
+    "depd-1.0.1" = {
+      name = "depd";
+      packageName = "depd";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz";
+        sha1 = "80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa";
+      };
+    };
+    "dirty-0.9.9" = {
+      name = "dirty";
+      packageName = "dirty";
+      version = "0.9.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dirty/-/dirty-0.9.9.tgz";
+        sha1 = "f785804c4cf7907220cb10fa576b22329feda545";
+      };
+    };
+    "dtrace-provider-0.8.8" = {
+      name = "dtrace-provider";
+      packageName = "dtrace-provider";
+      version = "0.8.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz";
+        sha512 = "b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==";
+      };
+    };
+    "ecc-jsbn-0.1.2" = {
+      name = "ecc-jsbn";
+      packageName = "ecc-jsbn";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    };
+    "ecdsa-sig-formatter-1.0.11" = {
+      name = "ecdsa-sig-formatter";
+      packageName = "ecdsa-sig-formatter";
+      version = "1.0.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz";
+        sha512 = "nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==";
+      };
+    };
+    "ee-first-1.1.0" = {
+      name = "ee-first";
+      packageName = "ee-first";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz";
+        sha1 = "6a0d7c6221e490feefd92ec3f441c9ce8cd097f4";
+      };
+    };
+    "elasticsearch-11.0.1" = {
+      name = "elasticsearch";
+      packageName = "elasticsearch";
+      version = "11.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/elasticsearch/-/elasticsearch-11.0.1.tgz";
+        sha1 = "d180684c6bde7ecfa0fa24e62fa1c872eeae08e7";
+      };
+    };
+    "emailjs-0.3.16" = {
+      name = "emailjs";
+      packageName = "emailjs";
+      version = "0.3.16";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/emailjs/-/emailjs-0.3.16.tgz";
+        sha1 = "f162735352ce7b6615a5d811714051f90f23331d";
+      };
+    };
+    "encoding-0.1.12" = {
+      name = "encoding";
+      packageName = "encoding";
+      version = "0.1.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz";
+        sha1 = "538b66f3ee62cd1ab51ec323829d1f9480c74beb";
+      };
+    };
+    "errs-0.3.2" = {
+      name = "errs";
+      packageName = "errs";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz";
+        sha1 = "798099b2dbd37ca2bc749e538a7c1307d0b50499";
+      };
+    };
+    "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";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    };
+    "extend-3.0.2" = {
+      name = "extend";
+      packageName = "extend";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
+        sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
+      };
+    };
+    "extsprintf-1.2.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz";
+        sha1 = "5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529";
+      };
+    };
+    "extsprintf-1.3.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    };
+    "fast-deep-equal-3.1.1" = {
+      name = "fast-deep-equal";
+      packageName = "fast-deep-equal";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
+        sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
+      };
+    };
+    "fast-json-stable-stringify-2.1.0" = {
+      name = "fast-json-stable-stringify";
+      packageName = "fast-json-stable-stringify";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
+        sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
+      };
+    };
+    "forever-agent-0.6.1" = {
+      name = "forever-agent";
+      packageName = "forever-agent";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    };
+    "form-data-2.3.3" = {
+      name = "form-data";
+      packageName = "form-data";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
+        sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
+      };
+    };
+    "generic-pool-2.4.3" = {
+      name = "generic-pool";
+      packageName = "generic-pool";
+      version = "2.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.3.tgz";
+        sha1 = "780c36f69dfad05a5a045dd37be7adca11a4f6ff";
+      };
+    };
+    "getpass-0.1.7" = {
+      name = "getpass";
+      packageName = "getpass";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    };
+    "glob-6.0.4" = {
+      name = "glob";
+      packageName = "glob";
+      version = "6.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz";
+        sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
+      };
+    };
+    "har-schema-2.0.0" = {
+      name = "har-schema";
+      packageName = "har-schema";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    };
+    "har-validator-5.1.3" = {
+      name = "har-validator";
+      packageName = "har-validator";
+      version = "5.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
+        sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
+      };
+    };
+    "has-ansi-2.0.0" = {
+      name = "has-ansi";
+      packageName = "has-ansi";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    };
+    "hoek-2.16.3" = {
+      name = "hoek";
+      packageName = "hoek";
+      version = "2.16.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz";
+        sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
+      };
+    };
+    "hoek-4.2.1" = {
+      name = "hoek";
+      packageName = "hoek";
+      version = "4.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz";
+        sha512 = "QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==";
+      };
+    };
+    "http-signature-1.2.0" = {
+      name = "http-signature";
+      packageName = "http-signature";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    };
+    "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==";
+      };
+    };
+    "iconv-lite-0.4.8" = {
+      name = "iconv-lite";
+      packageName = "iconv-lite";
+      version = "0.4.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz";
+        sha1 = "c6019a7595f2cefca702eab694a010bcd9298d20";
+      };
+    };
+    "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";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    };
+    "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==";
+      };
+    };
+    "is-fullwidth-code-point-2.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    };
+    "is-typedarray-1.0.0" = {
+      name = "is-typedarray";
+      packageName = "is-typedarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    };
+    "isarray-0.0.1" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    };
+    "isemail-1.2.0" = {
+      name = "isemail";
+      packageName = "isemail";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz";
+        sha1 = "be03df8cc3e29de4d2c5df6501263f1fa4595e9a";
+      };
+    };
+    "isemail-2.2.1" = {
+      name = "isemail";
+      packageName = "isemail";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz";
+        sha1 = "0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6";
+      };
+    };
+    "isstream-0.1.2" = {
+      name = "isstream";
+      packageName = "isstream";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    };
+    "items-2.1.2" = {
+      name = "items";
+      packageName = "items";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/items/-/items-2.1.2.tgz";
+        sha512 = "kezcEqgB97BGeZZYtX/MA8AG410ptURstvnz5RAgyFZ8wQFPMxHY8GpTq+/ZHKT3frSlIthUq7EvLt9xn3TvXg==";
+      };
+    };
+    "joi-10.6.0" = {
+      name = "joi";
+      packageName = "joi";
+      version = "10.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/joi/-/joi-10.6.0.tgz";
+        sha512 = "hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ==";
+      };
+    };
+    "joi-6.10.1" = {
+      name = "joi";
+      packageName = "joi";
+      version = "6.10.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz";
+        sha1 = "4d50c318079122000fe5f16af1ff8e1917b77e06";
+      };
+    };
+    "js-base64-2.1.9" = {
+      name = "js-base64";
+      packageName = "js-base64";
+      version = "2.1.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz";
+        sha1 = "f0e80ae039a4bd654b5f281fc93f04a914a7fcce";
+      };
+    };
+    "js-cookie-2.2.1" = {
+      name = "js-cookie";
+      packageName = "js-cookie";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz";
+        sha512 = "HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==";
+      };
+    };
+    "jsbn-0.1.1" = {
+      name = "jsbn";
+      packageName = "jsbn";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    };
+    "json-beautify-1.1.1" = {
+      name = "json-beautify";
+      packageName = "json-beautify";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-beautify/-/json-beautify-1.1.1.tgz";
+        sha512 = "17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==";
+      };
+    };
+    "json-schema-0.2.3" = {
+      name = "json-schema";
+      packageName = "json-schema";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    };
+    "json-schema-traverse-0.4.1" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
+      };
+    };
+    "json-stringify-safe-5.0.1" = {
+      name = "json-stringify-safe";
+      packageName = "json-stringify-safe";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    };
+    "jsonminify-0.4.1" = {
+      name = "jsonminify";
+      packageName = "jsonminify";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonminify/-/jsonminify-0.4.1.tgz";
+        sha1 = "805dafbb39395188cee9ab582c81ef959d7e710c";
+      };
+    };
+    "jsonwebtoken-5.0.5" = {
+      name = "jsonwebtoken";
+      packageName = "jsonwebtoken";
+      version = "5.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-5.0.5.tgz";
+        sha1 = "6592cc05ee03dd5ad9e03a910911a4da79afe0f8";
+      };
+    };
+    "jsonwebtoken-7.4.3" = {
+      name = "jsonwebtoken";
+      packageName = "jsonwebtoken";
+      version = "7.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz";
+        sha1 = "77f5021de058b605a1783fa1283e99812e645638";
+      };
+    };
+    "jsprim-1.4.1" = {
+      name = "jsprim";
+      packageName = "jsprim";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    };
+    "jwa-1.4.1" = {
+      name = "jwa";
+      packageName = "jwa";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz";
+        sha512 = "qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==";
+      };
+    };
+    "jws-3.2.2" = {
+      name = "jws";
+      packageName = "jws";
+      version = "3.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz";
+        sha512 = "YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==";
+      };
+    };
+    "ldap-filter-0.2.2" = {
+      name = "ldap-filter";
+      packageName = "ldap-filter";
+      version = "0.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz";
+        sha1 = "f2b842be0b86da3352798505b31ebcae590d77d0";
+      };
+    };
+    "ldapauth-fork-4.3.3" = {
+      name = "ldapauth-fork";
+      packageName = "ldapauth-fork";
+      version = "4.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.3.3.tgz";
+        sha512 = "x76VpQ5ZqkwAJmqwcD6KIwDiNEbgIGIPGwC/eA17e1dxWhlTx36w0DlLOFwjTuZ2iuaLTsZsUprlVqvSlwc/1Q==";
+      };
+    };
+    "ldapjs-1.0.2" = {
+      name = "ldapjs";
+      packageName = "ldapjs";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz";
+        sha1 = "544ff7032b7b83c68f0701328d9297aa694340f9";
+      };
+    };
+    "lodash-3.10.1" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "3.10.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";
+        sha1 = "5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
+      };
+    };
+    "lodash-4.17.15" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "4.17.15";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";
+        sha512 = "8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==";
+      };
+    };
+    "lodash-compat-3.10.2" = {
+      name = "lodash-compat";
+      packageName = "lodash-compat";
+      version = "3.10.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash-compat/-/lodash-compat-3.10.2.tgz";
+        sha1 = "c6940128a9d30f8e902cd2cf99fd0cba4ecfc183";
+      };
+    };
+    "lodash.isempty-4.4.0" = {
+      name = "lodash.isempty";
+      packageName = "lodash.isempty";
+      version = "4.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz";
+        sha1 = "6f86cbedd8be4ec987be9aaf33c9684db1b31e7e";
+      };
+    };
+    "lodash.once-4.1.1" = {
+      name = "lodash.once";
+      packageName = "lodash.once";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz";
+        sha1 = "0dd3971213c7c56df880977d504c88fb471a97ac";
+      };
+    };
+    "long-2.4.0" = {
+      name = "long";
+      packageName = "long";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/long/-/long-2.4.0.tgz";
+        sha1 = "9fa180bb1d9500cdc29c4156766a1995e1f4524f";
+      };
+    };
+    "lru-cache-5.1.1" = {
+      name = "lru-cache";
+      packageName = "lru-cache";
+      version = "5.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz";
+        sha512 = "KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==";
+      };
+    };
+    "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";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    };
+    "mime-db-1.44.0" = {
+      name = "mime-db";
+      packageName = "mime-db";
+      version = "1.44.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
+        sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
+      };
+    };
+    "mime-types-2.1.27" = {
+      name = "mime-types";
+      packageName = "mime-types";
+      version = "2.1.27";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
+        sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
+      };
+    };
+    "mimelib-0.2.14" = {
+      name = "mimelib";
+      packageName = "mimelib";
+      version = "0.2.14";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mimelib/-/mimelib-0.2.14.tgz";
+        sha1 = "2a1aa724bd190b85bd526e6317ab6106edfd6831";
+      };
+    };
+    "minimatch-3.0.4" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
+        sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
+      };
+    };
+    "minimist-1.2.5" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
+        sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
+      };
+    };
+    "mkdirp-0.5.5" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
+        sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
+      };
+    };
+    "moment-1.7.0" = {
+      name = "moment";
+      packageName = "moment";
+      version = "1.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/moment/-/moment-1.7.0.tgz";
+        sha1 = "6f3d73a446c6bd6af1b993801d0b8071efad5e28";
+      };
+    };
+    "moment-2.24.0" = {
+      name = "moment";
+      packageName = "moment";
+      version = "2.24.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz";
+        sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==";
+      };
+    };
+    "ms-0.7.1" = {
+      name = "ms";
+      packageName = "ms";
+      version = "0.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz";
+        sha1 = "9cd13c03adbff25b65effde7ce864ee952017098";
+      };
+    };
+    "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==";
+      };
+    };
+    "mv-2.1.1" = {
+      name = "mv";
+      packageName = "mv";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz";
+        sha1 = "ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2";
+      };
+    };
+    "mysql-2.6.1" = {
+      name = "mysql";
+      packageName = "mysql";
+      version = "2.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mysql/-/mysql-2.6.1.tgz";
+        sha1 = "71bf1fb20550cf2940b831664df33f3637b5504d";
+      };
+    };
+    "nan-2.14.1" = {
+      name = "nan";
+      packageName = "nan";
+      version = "2.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz";
+        sha512 = "isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==";
+      };
+    };
+    "nano-6.4.4" = {
+      name = "nano";
+      packageName = "nano";
+      version = "6.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nano/-/nano-6.4.4.tgz";
+        sha512 = "7sldMrZI1ZH8QE29PnzohxLfR67WNVzMKLa7EMl3x9Hr+0G+YpOUCq50qZ9G66APrjcb0Of2BTOZLNBCutZGag==";
+      };
+    };
+    "ncp-2.0.0" = {
+      name = "ncp";
+      packageName = "ncp";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz";
+        sha1 = "195a21d6c46e361d2fb1281ba38b91e9df7bdbb3";
+      };
+    };
+    "node-fingerprint-0.0.2" = {
+      name = "node-fingerprint";
+      packageName = "node-fingerprint";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-fingerprint/-/node-fingerprint-0.0.2.tgz";
+        sha1 = "31cbabeb71a67ae7dd5a7dc042e51c3c75868501";
+      };
+    };
+    "oauth-sign-0.9.0" = {
+      name = "oauth-sign";
+      packageName = "oauth-sign";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
+      };
+    };
+    "object-assign-4.1.0" = {
+      name = "object-assign";
+      packageName = "object-assign";
+      version = "4.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz";
+        sha1 = "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0";
+      };
+    };
+    "on-finished-2.2.1" = {
+      name = "on-finished";
+      packageName = "on-finished";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz";
+        sha1 = "5c85c1cc36299f78029653f667f27b6b99ebc029";
+      };
+    };
+    "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";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    };
+    "packet-reader-0.2.0" = {
+      name = "packet-reader";
+      packageName = "packet-reader";
+      version = "0.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/packet-reader/-/packet-reader-0.2.0.tgz";
+        sha1 = "819df4d010b82d5ea5671f8a1a3acf039bcd7700";
+      };
+    };
+    "passport-0.2.2" = {
+      name = "passport";
+      packageName = "passport";
+      version = "0.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/passport/-/passport-0.2.2.tgz";
+        sha1 = "9c38f17beb929f3d81af7b8838e8430db8703f2b";
+      };
+    };
+    "passport-jwt-3.0.1" = {
+      name = "passport-jwt";
+      packageName = "passport-jwt";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/passport-jwt/-/passport-jwt-3.0.1.tgz";
+        sha1 = "e4f7276dad8bd251d43c6fc38883130b963272f6";
+      };
+    };
+    "passport-strategy-1.0.0" = {
+      name = "passport-strategy";
+      packageName = "passport-strategy";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz";
+        sha1 = "b5539aa8fc225a3d1ad179476ddf236b440f52e4";
+      };
+    };
+    "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";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    };
+    "pause-0.0.1" = {
+      name = "pause";
+      packageName = "pause";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz";
+        sha1 = "1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d";
+      };
+    };
+    "performance-now-2.1.0" = {
+      name = "performance-now";
+      packageName = "performance-now";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    };
+    "pg-6.1.3" = {
+      name = "pg";
+      packageName = "pg";
+      version = "6.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg/-/pg-6.1.3.tgz";
+        sha1 = "8e5e497329c2b81dbfd563f1541c5803c7269de4";
+      };
+    };
+    "pg-connection-string-0.1.3" = {
+      name = "pg-connection-string";
+      packageName = "pg-connection-string";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz";
+        sha1 = "da1847b20940e42ee1492beaf65d49d91b245df7";
+      };
+    };
+    "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-pool-1.8.0" = {
+      name = "pg-pool";
+      packageName = "pg-pool";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-pool/-/pg-pool-1.8.0.tgz";
+        sha1 = "f7ec73824c37a03f076f51bfdf70e340147c4f37";
+      };
+    };
+    "pg-types-1.13.0" = {
+      name = "pg-types";
+      packageName = "pg-types";
+      version = "1.13.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-types/-/pg-types-1.13.0.tgz";
+        sha512 = "lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==";
+      };
+    };
+    "pgpass-1.0.2" = {
+      name = "pgpass";
+      packageName = "pgpass";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz";
+        sha1 = "2a7bb41b6065b67907e91da1b07c1847c877b306";
+      };
+    };
+    "postgres-array-1.0.3" = {
+      name = "postgres-array";
+      packageName = "postgres-array";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.3.tgz";
+        sha512 = "5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==";
+      };
+    };
+    "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";
+        sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35";
+      };
+    };
+    "postgres-date-1.0.5" = {
+      name = "postgres-date";
+      packageName = "postgres-date";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.5.tgz";
+        sha512 = "pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==";
+      };
+    };
+    "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==";
+      };
+    };
+    "precond-0.2.3" = {
+      name = "precond";
+      packageName = "precond";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz";
+        sha1 = "aa9591bcaa24923f1e0f4849d240f47efc1075ac";
+      };
+    };
+    "promise-7.3.1" = {
+      name = "promise";
+      packageName = "promise";
+      version = "7.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz";
+        sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
+      };
+    };
+    "psl-1.8.0" = {
+      name = "psl";
+      packageName = "psl";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
+        sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
+      };
+    };
+    "punycode-2.1.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
+        sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
+      };
+    };
+    "qs-2.4.2" = {
+      name = "qs";
+      packageName = "qs";
+      version = "2.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz";
+        sha1 = "f7ce788e5777df0b5010da7f7c4e73ba32470f5a";
+      };
+    };
+    "qs-6.5.2" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
+        sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
+      };
+    };
+    "raw-body-2.0.2" = {
+      name = "raw-body";
+      packageName = "raw-body";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/raw-body/-/raw-body-2.0.2.tgz";
+        sha1 = "a2c2f98c8531cee99c63d8d238b7de97bb659fca";
+      };
+    };
+    "readable-stream-1.1.14" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "1.1.14";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz";
+        sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
+      };
+    };
+    "redis-3.0.2" = {
+      name = "redis";
+      packageName = "redis";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz";
+        sha512 = "PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==";
+      };
+    };
+    "redis-commands-1.5.0" = {
+      name = "redis-commands";
+      packageName = "redis-commands";
+      version = "1.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz";
+        sha512 = "6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==";
+      };
+    };
+    "redis-errors-1.2.0" = {
+      name = "redis-errors";
+      packageName = "redis-errors";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz";
+        sha1 = "eb62d2adb15e4eaf4610c04afe1529384250abad";
+      };
+    };
+    "redis-parser-3.0.0" = {
+      name = "redis-parser";
+      packageName = "redis-parser";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz";
+        sha1 = "b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4";
+      };
+    };
+    "request-2.88.2" = {
+      name = "request";
+      packageName = "request";
+      version = "2.88.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
+        sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
+      };
+    };
+    "require-all-1.0.0" = {
+      name = "require-all";
+      packageName = "require-all";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/require-all/-/require-all-1.0.0.tgz";
+        sha1 = "8483708e7ce4c6dfad988b5080f97829b92d2227";
+      };
+    };
+    "rethinkdb-2.4.2" = {
+      name = "rethinkdb";
+      packageName = "rethinkdb";
+      version = "2.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.4.2.tgz";
+        sha512 = "6DzwqEpFc8cqesAdo07a845oBRxLiHvWzopTKBo/uY2ypGWIsJQFJk3wjRDtSEhczxJqLS0jnf37rwgzYAw8NQ==";
+      };
+    };
+    "rimraf-2.4.5" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.4.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz";
+        sha1 = "ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da";
+      };
+    };
+    "safe-buffer-5.2.0" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz";
+        sha512 = "fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==";
+      };
+    };
+    "safe-json-stringify-1.2.0" = {
+      name = "safe-json-stringify";
+      packageName = "safe-json-stringify";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz";
+        sha512 = "gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==";
+      };
+    };
+    "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==";
+      };
+    };
+    "sax-1.2.4" = {
+      name = "sax";
+      packageName = "sax";
+      version = "1.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
+        sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
+      };
+    };
+    "semver-4.3.2" = {
+      name = "semver";
+      packageName = "semver";
+      version = "4.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz";
+        sha1 = "c7a07158a80bedd052355b770d82d6640f803be7";
+      };
+    };
+    "simple-cas-interface-1.0.2" = {
+      name = "simple-cas-interface";
+      packageName = "simple-cas-interface";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/simple-cas-interface/-/simple-cas-interface-1.0.2.tgz";
+        sha1 = "e347b0a7955b5254dae9727984368dd534cde8ec";
+      };
+    };
+    "slugg-0.1.2" = {
+      name = "slugg";
+      packageName = "slugg";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/slugg/-/slugg-0.1.2.tgz";
+        sha1 = "3a2a65baaf24c0f62eaac8acf243740a379072b5";
+      };
+    };
+    "split-1.0.1" = {
+      name = "split";
+      packageName = "split";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/split/-/split-1.0.1.tgz";
+        sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
+      };
+    };
+    "sshpk-1.16.1" = {
+      name = "sshpk";
+      packageName = "sshpk";
+      version = "1.16.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
+        sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
+      };
+    };
+    "starttls-0.2.1" = {
+      name = "starttls";
+      packageName = "starttls";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/starttls/-/starttls-0.2.1.tgz";
+        sha1 = "b98d3e5e778d46f199c843a64f889f0347c6d19a";
+      };
+    };
+    "string-width-2.1.1" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";
+        sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
+      };
+    };
+    "string_decoder-0.10.31" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "0.10.31";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    };
+    "strip-ansi-4.0.0" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
+        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
+      };
+    };
+    "supports-color-2.0.0" = {
+      name = "supports-color";
+      packageName = "supports-color";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    };
+    "through-2.3.8" = {
+      name = "through";
+      packageName = "through";
+      version = "2.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    };
+    "topo-1.1.0" = {
+      name = "topo";
+      packageName = "topo";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz";
+        sha1 = "e9d751615d1bb87dc865db182fa1ca0a5ef536d5";
+      };
+    };
+    "topo-2.0.2" = {
+      name = "topo";
+      packageName = "topo";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz";
+        sha1 = "cd5615752539057c0dc0491a621c3bc6fbe1d182";
+      };
+    };
+    "tough-cookie-2.5.0" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
+        sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
+      };
+    };
+    "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";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    };
+    "tweetnacl-0.14.5" = {
+      name = "tweetnacl";
+      packageName = "tweetnacl";
+      version = "0.14.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    };
+    "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==";
+      };
+    };
+    "ueberdb2-0.3.8" = {
+      name = "ueberdb2";
+      packageName = "ueberdb2";
+      version = "0.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ueberdb2/-/ueberdb2-0.3.8.tgz";
+        sha512 = "eBjKyjQ3Ehk8phoC0ijnZD5RzJSE2wKg627hoEGowQrW+QcHwL5u2K/6pT+1wv6/PkC/VDth+b68ukG/VxrCTg==";
+      };
+    };
+    "uri-js-4.2.2" = {
+      name = "uri-js";
+      packageName = "uri-js";
+      version = "4.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
+        sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
+      };
+    };
+    "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==";
+      };
+    };
+    "vasync-1.6.4" = {
+      name = "vasync";
+      packageName = "vasync";
+      version = "1.6.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz";
+        sha1 = "dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "verror-1.6.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz";
+        sha1 = "7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5";
+      };
+    };
+    "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";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    };
+    "xml2js-0.4.23" = {
+      name = "xml2js";
+      packageName = "xml2js";
+      version = "0.4.23";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz";
+        sha512 = "ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==";
+      };
+    };
+    "xmlbuilder-11.0.1" = {
+      name = "xmlbuilder";
+      packageName = "xmlbuilder";
+      version = "11.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz";
+        sha512 = "fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==";
+      };
+    };
+    "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==";
+      };
+    };
+    "yallist-3.1.1" = {
+      name = "yallist";
+      packageName = "yallist";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz";
+        sha512 = "a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==";
+      };
+    };
+  };
+in
+{
+  ep_mypads = nodeEnv.buildNodePackage {
+    name = "ep_mypads";
+    packageName = "ep_mypads";
+    version = "1.7.16";
+    preRebuild = ''
+      patch -p1 < ${./fix_ldap.patch}
+    '';
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_mypads/-/ep_mypads-1.7.16.tgz";
+      sha512 = "9byCSgC6Jc/0c1t/Wd+3rwtMEhXKLSWui9hI3ZacZzIf5oSwr2hcr+6W7l6xJIzdPN6jQDnA5WGi1fnX9fSjsQ==";
+    };
+    dependencies = [
+      sources."@types/ldapjs-1.0.7"
+      sources."@types/node-13.13.4"
+      sources."abstract-logging-1.0.0"
+      sources."addressparser-0.3.2"
+      sources."ajv-6.12.2"
+      sources."ansi-regex-3.0.0"
+      sources."ansi-styles-2.2.1"
+      sources."asap-2.0.6"
+      sources."asn1-0.2.3"
+      sources."assert-plus-1.0.0"
+      (sources."async-2.6.3" // {
+        dependencies = [
+          sources."lodash-4.17.15"
+        ];
+      })
+      sources."asynckit-0.4.0"
+      sources."aws-sign2-0.7.0"
+      sources."aws4-1.9.1"
+      sources."backoff-2.5.0"
+      sources."balanced-match-1.0.0"
+      sources."bcrypt-pbkdf-1.0.2"
+      sources."bcryptjs-2.4.3"
+      sources."bignumber.js-2.0.5"
+      sources."bluebird-2.11.0"
+      sources."body-parser-1.12.4"
+      sources."brace-expansion-1.1.11"
+      sources."browser-fingerprint-0.0.1"
+      sources."browser-request-0.3.3"
+      sources."buffer-equal-constant-time-1.0.1"
+      sources."buffer-writer-1.0.1"
+      sources."bufferjs-1.1.0"
+      (sources."bunyan-1.8.12" // {
+        dependencies = [
+          sources."moment-2.24.0"
+        ];
+      })
+      sources."bytes-1.0.0"
+      sources."caseless-0.12.0"
+      (sources."cassandra-driver-2.0.1" // {
+        dependencies = [
+          sources."async-0.9.2"
+        ];
+      })
+      (sources."chalk-1.1.3" // {
+        dependencies = [
+          sources."ansi-regex-2.1.1"
+          sources."strip-ansi-3.0.1"
+        ];
+      })
+      sources."channels-0.0.4"
+      sources."cli-progress-2.1.1"
+      (sources."cloudant-follow-0.17.0" // {
+        dependencies = [
+          sources."debug-3.2.6"
+          sources."ms-2.1.2"
+        ];
+      })
+      sources."colors-1.4.0"
+      sources."combined-stream-1.0.8"
+      sources."commander-2.20.3"
+      sources."concat-map-0.0.1"
+      sources."content-type-1.0.4"
+      sources."cookie-0.1.2"
+      sources."cookie-parser-1.3.4"
+      sources."cookie-signature-1.0.6"
+      sources."core-js-1.2.7"
+      sources."core-util-is-1.0.2"
+      sources."cuid-1.3.8"
+      sources."dashdash-1.14.1"
+      sources."debug-2.2.0"
+      sources."delayed-stream-1.0.0"
+      sources."denque-1.4.1"
+      sources."depd-1.0.1"
+      sources."dirty-0.9.9"
+      sources."dtrace-provider-0.8.8"
+      sources."ecc-jsbn-0.1.2"
+      sources."ecdsa-sig-formatter-1.0.11"
+      sources."ee-first-1.1.0"
+      sources."elasticsearch-11.0.1"
+      sources."emailjs-0.3.16"
+      (sources."encoding-0.1.12" // {
+        dependencies = [
+          sources."iconv-lite-0.4.24"
+        ];
+      })
+      sources."errs-0.3.2"
+      sources."escape-string-regexp-1.0.5"
+      sources."extend-3.0.2"
+      sources."extsprintf-1.2.0"
+      sources."fast-deep-equal-3.1.1"
+      sources."fast-json-stable-stringify-2.1.0"
+      sources."forever-agent-0.6.1"
+      sources."form-data-2.3.3"
+      sources."generic-pool-2.4.3"
+      sources."getpass-0.1.7"
+      sources."glob-6.0.4"
+      sources."har-schema-2.0.0"
+      sources."har-validator-5.1.3"
+      (sources."has-ansi-2.0.0" // {
+        dependencies = [
+          sources."ansi-regex-2.1.1"
+        ];
+      })
+      sources."hoek-2.16.3"
+      sources."http-signature-1.2.0"
+      sources."iconv-lite-0.4.8"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.4"
+      sources."is-fullwidth-code-point-2.0.0"
+      sources."is-typedarray-1.0.0"
+      sources."isarray-0.0.1"
+      sources."isemail-1.2.0"
+      sources."isstream-0.1.2"
+      sources."items-2.1.2"
+      (sources."joi-6.10.1" // {
+        dependencies = [
+          sources."moment-2.24.0"
+        ];
+      })
+      sources."js-base64-2.1.9"
+      sources."js-cookie-2.2.1"
+      sources."jsbn-0.1.1"
+      sources."json-beautify-1.1.1"
+      sources."json-schema-0.2.3"
+      sources."json-schema-traverse-0.4.1"
+      sources."json-stringify-safe-5.0.1"
+      sources."jsonminify-0.4.1"
+      sources."jsonwebtoken-5.0.5"
+      (sources."jsprim-1.4.1" // {
+        dependencies = [
+          sources."extsprintf-1.3.0"
+        ];
+      })
+      sources."jwa-1.4.1"
+      sources."jws-3.2.2"
+      (sources."ldap-filter-0.2.2" // {
+        dependencies = [
+          sources."assert-plus-0.1.5"
+        ];
+      })
+      sources."ldapauth-fork-4.3.3"
+      sources."ldapjs-1.0.2"
+      sources."lodash-3.10.1"
+      sources."lodash-compat-3.10.2"
+      sources."lodash.isempty-4.4.0"
+      sources."lodash.once-4.1.1"
+      sources."long-2.4.0"
+      sources."lru-cache-5.1.1"
+      sources."media-typer-0.3.0"
+      sources."mime-db-1.44.0"
+      sources."mime-types-2.1.27"
+      (sources."mimelib-0.2.14" // {
+        dependencies = [
+          sources."addressparser-0.2.1"
+        ];
+      })
+      sources."minimatch-3.0.4"
+      sources."minimist-1.2.5"
+      sources."mkdirp-0.5.5"
+      sources."moment-1.7.0"
+      sources."ms-0.7.1"
+      sources."mv-2.1.1"
+      sources."mysql-2.6.1"
+      sources."nan-2.14.1"
+      sources."nano-6.4.4"
+      sources."ncp-2.0.0"
+      sources."node-fingerprint-0.0.2"
+      sources."oauth-sign-0.9.0"
+      sources."object-assign-4.1.0"
+      sources."on-finished-2.2.1"
+      sources."once-1.4.0"
+      sources."packet-reader-0.2.0"
+      sources."passport-0.2.2"
+      (sources."passport-jwt-3.0.1" // {
+        dependencies = [
+          sources."jsonwebtoken-7.4.3"
+          sources."ms-2.1.2"
+        ];
+      })
+      sources."passport-strategy-1.0.0"
+      sources."path-is-absolute-1.0.1"
+      sources."pause-0.0.1"
+      sources."performance-now-2.1.0"
+      sources."pg-6.1.3"
+      sources."pg-connection-string-0.1.3"
+      sources."pg-int8-1.0.1"
+      sources."pg-pool-1.8.0"
+      sources."pg-types-1.13.0"
+      sources."pgpass-1.0.2"
+      sources."postgres-array-1.0.3"
+      sources."postgres-bytea-1.0.0"
+      sources."postgres-date-1.0.5"
+      sources."postgres-interval-1.2.0"
+      sources."precond-0.2.3"
+      sources."promise-7.3.1"
+      sources."psl-1.8.0"
+      sources."punycode-2.1.1"
+      sources."qs-2.4.2"
+      (sources."raw-body-2.0.2" // {
+        dependencies = [
+          sources."bytes-2.1.0"
+        ];
+      })
+      sources."readable-stream-1.1.14"
+      sources."redis-3.0.2"
+      sources."redis-commands-1.5.0"
+      sources."redis-errors-1.2.0"
+      sources."redis-parser-3.0.0"
+      (sources."request-2.88.2" // {
+        dependencies = [
+          sources."qs-6.5.2"
+        ];
+      })
+      sources."require-all-1.0.0"
+      sources."rethinkdb-2.4.2"
+      sources."rimraf-2.4.5"
+      sources."safe-buffer-5.2.0"
+      sources."safe-json-stringify-1.2.0"
+      sources."safer-buffer-2.1.2"
+      sources."sax-1.2.4"
+      sources."semver-4.3.2"
+      (sources."simple-cas-interface-1.0.2" // {
+        dependencies = [
+          sources."hoek-4.2.1"
+          sources."isemail-2.2.1"
+          sources."joi-10.6.0"
+          sources."topo-2.0.2"
+        ];
+      })
+      sources."slugg-0.1.2"
+      sources."split-1.0.1"
+      sources."sshpk-1.16.1"
+      sources."starttls-0.2.1"
+      sources."string-width-2.1.1"
+      sources."string_decoder-0.10.31"
+      sources."strip-ansi-4.0.0"
+      sources."supports-color-2.0.0"
+      sources."through-2.3.8"
+      sources."topo-1.1.0"
+      sources."tough-cookie-2.5.0"
+      sources."tunnel-agent-0.6.0"
+      sources."tweetnacl-0.14.5"
+      sources."type-is-1.6.18"
+      (sources."ueberdb2-0.3.8" // {
+        dependencies = [
+          sources."async-0.1.15"
+        ];
+      })
+      sources."uri-js-4.2.2"
+      sources."uuid-3.4.0"
+      (sources."vasync-1.6.4" // {
+        dependencies = [
+          sources."verror-1.6.0"
+        ];
+      })
+      sources."verror-1.10.0"
+      sources."wrappy-1.0.2"
+      sources."xml2js-0.4.23"
+      sources."xmlbuilder-11.0.1"
+      sources."xtend-4.0.2"
+      sources."yallist-3.1.1"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Groups and private pads for etherpad";
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_page_view/node-packages.json b/flakes/etherpad-lite/modules/ep_page_view/node-packages.json
new file mode 100644 (file)
index 0000000..c5f4a7b
--- /dev/null
@@ -0,0 +1 @@
+["ep_page_view"]
diff --git a/flakes/etherpad-lite/modules/ep_page_view/node-packages.nix b/flakes/etherpad-lite/modules/ep_page_view/node-packages.nix
new file mode 100644 (file)
index 0000000..e6c6b65
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_page_view = nodeEnv.buildNodePackage {
+    name = "ep_page_view";
+    packageName = "ep_page_view";
+    version = "0.5.24";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_page_view/-/ep_page_view-0.5.24.tgz";
+      sha1 = "26437c23169678f5bd53545b621b492b5b6f2ce4";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support to do 'page view', with a toggle on/off option in Settings, also Page Breaks with Control Enter";
+      homepage = "https://github.com/ether/ep_page_view#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_previewimages/node-packages.json b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.json
new file mode 100644 (file)
index 0000000..cc14ec4
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_previewimages" ]
diff --git a/flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix
new file mode 100644 (file)
index 0000000..cd0972b
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_previewimages = nodeEnv.buildNodePackage {
+    name = "ep_previewimages";
+    packageName = "ep_previewimages";
+    version = "0.0.9";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_previewimages/-/ep_previewimages-0.0.9.tgz";
+      sha1 = "417d96249c50f8a59a1ef6c640e4ac98c26a106b";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Image previewer, paste the URL of an image or upload an image using ep_fileupload";
+      homepage = https://github.com/JohnMcLear/ep_previewimages;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_private_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.json
new file mode 100644 (file)
index 0000000..c25d8c9
--- /dev/null
@@ -0,0 +1 @@
+["ep_private_pad"]
diff --git a/flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix
new file mode 100644 (file)
index 0000000..1744f52
--- /dev/null
@@ -0,0 +1,2056 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "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.7" = {
+      name = "accepts";
+      packageName = "accepts";
+      version = "1.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz";
+        sha512 = "Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==";
+      };
+    };
+    "ajv-6.12.2" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "6.12.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
+        sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
+      };
+    };
+    "align-text-0.1.4" = {
+      name = "align-text";
+      packageName = "align-text";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz";
+        sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    };
+    "any-1.0.0" = {
+      name = "any";
+      packageName = "any";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/any/-/any-1.0.0.tgz";
+        sha1 = "0a7b348c589faf6ba708d4a2241069ea51628b5e";
+      };
+    };
+    "aproba-1.2.0" = {
+      name = "aproba";
+      packageName = "aproba";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
+        sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
+      };
+    };
+    "are-we-there-yet-1.1.5" = {
+      name = "are-we-there-yet";
+      packageName = "are-we-there-yet";
+      version = "1.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
+        sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
+      };
+    };
+    "arr-diff-1.1.0" = {
+      name = "arr-diff";
+      packageName = "arr-diff";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz";
+        sha1 = "687c32758163588fef7de7b36fabe495eb1a399a";
+      };
+    };
+    "arr-flatten-1.1.0" = {
+      name = "arr-flatten";
+      packageName = "arr-flatten";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
+      };
+    };
+    "arr-map-2.0.2" = {
+      name = "arr-map";
+      packageName = "arr-map";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz";
+        sha1 = "3a77345ffc1cf35e2a91825601f9e58f2e24cac4";
+      };
+    };
+    "arr-union-3.1.0" = {
+      name = "arr-union";
+      packageName = "arr-union";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    };
+    "array-each-0.1.1" = {
+      name = "array-each";
+      packageName = "array-each";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-each/-/array-each-0.1.1.tgz";
+        sha1 = "c5d52ba8225f36d728178ba7aec413acfaddd0f9";
+      };
+    };
+    "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";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    };
+    "array-slice-0.2.3" = {
+      name = "array-slice";
+      packageName = "array-slice";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz";
+        sha1 = "dd3cfb80ed7973a75117cdac69b0b99ec86186f5";
+      };
+    };
+    "array-unique-0.2.1" = {
+      name = "array-unique";
+      packageName = "array-unique";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz";
+        sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
+      };
+    };
+    "asn1-0.2.4" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
+        sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "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";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    };
+    "aws-sign2-0.7.0" = {
+      name = "aws-sign2";
+      packageName = "aws-sign2";
+      version = "0.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    };
+    "aws4-1.9.1" = {
+      name = "aws4";
+      packageName = "aws4";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
+        sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
+      };
+    };
+    "balanced-match-1.0.0" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
+        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
+      };
+    };
+    "bcrypt-pbkdf-1.0.2" = {
+      name = "bcrypt-pbkdf";
+      packageName = "bcrypt-pbkdf";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    };
+    "bignumber.js-9.0.0" = {
+      name = "bignumber.js";
+      packageName = "bignumber.js";
+      version = "9.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz";
+        sha512 = "t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==";
+      };
+    };
+    "block-stream-0.0.9" = {
+      name = "block-stream";
+      packageName = "block-stream";
+      version = "0.0.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz";
+        sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
+      };
+    };
+    "body-parser-1.19.0" = {
+      name = "body-parser";
+      packageName = "body-parser";
+      version = "1.19.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz";
+        sha512 = "dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==";
+      };
+    };
+    "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==";
+      };
+    };
+    "bytes-3.1.0" = {
+      name = "bytes";
+      packageName = "bytes";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz";
+        sha512 = "zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==";
+      };
+    };
+    "caseless-0.12.0" = {
+      name = "caseless";
+      packageName = "caseless";
+      version = "0.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    };
+    "center-align-0.1.3" = {
+      name = "center-align";
+      packageName = "center-align";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz";
+        sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
+      };
+    };
+    "client-sessions-0.8.0" = {
+      name = "client-sessions";
+      packageName = "client-sessions";
+      version = "0.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/client-sessions/-/client-sessions-0.8.0.tgz";
+        sha1 = "a7d8c5558ad5d56f2a199f3533eb654b5df893fd";
+      };
+    };
+    "code-point-at-1.1.0" = {
+      name = "code-point-at";
+      packageName = "code-point-at";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
+      };
+    };
+    "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==";
+      };
+    };
+    "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";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    };
+    "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";
+        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
+      };
+    };
+    "content-disposition-0.5.3" = {
+      name = "content-disposition";
+      packageName = "content-disposition";
+      version = "0.5.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz";
+        sha512 = "ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==";
+      };
+    };
+    "content-type-1.0.4" = {
+      name = "content-type";
+      packageName = "content-type";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz";
+        sha512 = "hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==";
+      };
+    };
+    "cookie-0.4.0" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz";
+        sha512 = "+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==";
+      };
+    };
+    "cookie-parser-1.4.5" = {
+      name = "cookie-parser";
+      packageName = "cookie-parser";
+      version = "1.4.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz";
+        sha512 = "f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==";
+      };
+    };
+    "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";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    };
+    "cookies-0.7.3" = {
+      name = "cookies";
+      packageName = "cookies";
+      version = "0.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz";
+        sha512 = "+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "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==";
+      };
+    };
+    "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";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    };
+    "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";
+        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
+      };
+    };
+    "depd-1.1.2" = {
+      name = "depd";
+      packageName = "depd";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    };
+    "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.0.4" = {
+      name = "destroy";
+      packageName = "destroy";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    };
+    "ecc-jsbn-0.1.2" = {
+      name = "ecc-jsbn";
+      packageName = "ecc-jsbn";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    };
+    "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";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    };
+    "eejs-1.0.0" = {
+      name = "eejs";
+      packageName = "eejs";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eejs/-/eejs-1.0.0.tgz";
+        sha1 = "9173f565da10c5d0a7943df7f76bed8381f5bb6b";
+      };
+    };
+    "ejs-1.0.0" = {
+      name = "ejs";
+      packageName = "ejs";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz";
+        sha1 = "c9c60a48a46ee452fb32a71c317b95e5aa1fcb3d";
+      };
+    };
+    "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";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    };
+    "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";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    };
+    "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";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    };
+    "etherpad-lite-client-0.8.0" = {
+      name = "etherpad-lite-client";
+      packageName = "etherpad-lite-client";
+      version = "0.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etherpad-lite-client/-/etherpad-lite-client-0.8.0.tgz";
+        sha1 = "c7db6240f5ca1b09d039b40eaecf3ca2f00a0979";
+      };
+    };
+    "export-dirs-0.2.4" = {
+      name = "export-dirs";
+      packageName = "export-dirs";
+      version = "0.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/export-dirs/-/export-dirs-0.2.4.tgz";
+        sha1 = "2e16b9b46ebc2c07acb657ccdfbe3845393fe742";
+      };
+    };
+    "export-files-2.1.1" = {
+      name = "export-files";
+      packageName = "export-files";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/export-files/-/export-files-2.1.1.tgz";
+        sha1 = "bbf64574053a09e4eb98e5f43501d572b2c3ce7f";
+      };
+    };
+    "express-4.17.1" = {
+      name = "express";
+      packageName = "express";
+      version = "4.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express/-/express-4.17.1.tgz";
+        sha512 = "mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==";
+      };
+    };
+    "express-session-1.17.1" = {
+      name = "express-session";
+      packageName = "express-session";
+      version = "1.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz";
+        sha512 = "UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==";
+      };
+    };
+    "extend-3.0.2" = {
+      name = "extend";
+      packageName = "extend";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
+        sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
+      };
+    };
+    "extsprintf-1.3.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    };
+    "fast-deep-equal-3.1.1" = {
+      name = "fast-deep-equal";
+      packageName = "fast-deep-equal";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
+        sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
+      };
+    };
+    "fast-json-stable-stringify-2.1.0" = {
+      name = "fast-json-stable-stringify";
+      packageName = "fast-json-stable-stringify";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
+        sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
+      };
+    };
+    "finalhandler-1.1.2" = {
+      name = "finalhandler";
+      packageName = "finalhandler";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz";
+        sha512 = "aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==";
+      };
+    };
+    "for-in-0.1.8" = {
+      name = "for-in";
+      packageName = "for-in";
+      version = "0.1.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz";
+        sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1";
+      };
+    };
+    "for-in-1.0.2" = {
+      name = "for-in";
+      packageName = "for-in";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    };
+    "for-own-0.1.5" = {
+      name = "for-own";
+      packageName = "for-own";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz";
+        sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
+      };
+    };
+    "forever-agent-0.6.1" = {
+      name = "forever-agent";
+      packageName = "forever-agent";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    };
+    "form-data-2.3.3" = {
+      name = "form-data";
+      packageName = "form-data";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
+        sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
+      };
+    };
+    "forwarded-0.1.2" = {
+      name = "forwarded";
+      packageName = "forwarded";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    };
+    "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";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    };
+    "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";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    };
+    "fstream-1.0.12" = {
+      name = "fstream";
+      packageName = "fstream";
+      version = "1.0.12";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz";
+        sha512 = "WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==";
+      };
+    };
+    "gauge-2.7.4" = {
+      name = "gauge";
+      packageName = "gauge";
+      version = "2.7.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
+        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
+      };
+    };
+    "getpass-0.1.7" = {
+      name = "getpass";
+      packageName = "getpass";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    };
+    "glob-7.1.6" = {
+      name = "glob";
+      packageName = "glob";
+      version = "7.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";
+        sha512 = "LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==";
+      };
+    };
+    "graceful-fs-4.2.4" = {
+      name = "graceful-fs";
+      packageName = "graceful-fs";
+      version = "4.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz";
+        sha512 = "WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==";
+      };
+    };
+    "har-schema-2.0.0" = {
+      name = "har-schema";
+      packageName = "har-schema";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    };
+    "har-validator-5.1.3" = {
+      name = "har-validator";
+      packageName = "har-validator";
+      version = "5.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
+        sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
+      };
+    };
+    "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";
+        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
+      };
+    };
+    "has-values-0.1.4" = {
+      name = "has-values";
+      packageName = "has-values";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    };
+    "http-errors-1.7.2" = {
+      name = "http-errors";
+      packageName = "http-errors";
+      version = "1.7.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz";
+        sha512 = "uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==";
+      };
+    };
+    "http-signature-1.2.0" = {
+      name = "http-signature";
+      packageName = "http-signature";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    };
+    "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==";
+      };
+    };
+    "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";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    };
+    "inherits-2.0.3" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    };
+    "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-buffer-1.1.6" = {
+      name = "is-buffer";
+      packageName = "is-buffer";
+      version = "1.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
+      };
+    };
+    "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";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    };
+    "is-fullwidth-code-point-1.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
+      };
+    };
+    "is-number-2.1.0" = {
+      name = "is-number";
+      packageName = "is-number";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz";
+        sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
+      };
+    };
+    "is-plain-object-2.0.4" = {
+      name = "is-plain-object";
+      packageName = "is-plain-object";
+      version = "2.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
+      };
+    };
+    "is-typedarray-1.0.0" = {
+      name = "is-typedarray";
+      packageName = "is-typedarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    };
+    "isexe-2.0.0" = {
+      name = "isexe";
+      packageName = "isexe";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    };
+    "isobject-1.0.2" = {
+      name = "isobject";
+      packageName = "isobject";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz";
+        sha1 = "f0f9b8ce92dd540fa0740882e3835a2e022ec78a";
+      };
+    };
+    "isobject-3.0.1" = {
+      name = "isobject";
+      packageName = "isobject";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    };
+    "isstream-0.1.2" = {
+      name = "isstream";
+      packageName = "isstream";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    };
+    "jsbn-0.1.1" = {
+      name = "jsbn";
+      packageName = "jsbn";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    };
+    "json-schema-0.2.3" = {
+      name = "json-schema";
+      packageName = "json-schema";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    };
+    "json-schema-traverse-0.4.1" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
+      };
+    };
+    "json-stringify-safe-5.0.1" = {
+      name = "json-stringify-safe";
+      packageName = "json-stringify-safe";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    };
+    "jsprim-1.4.1" = {
+      name = "jsprim";
+      packageName = "jsprim";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    };
+    "keygrip-1.0.3" = {
+      name = "keygrip";
+      packageName = "keygrip";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz";
+        sha512 = "/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==";
+      };
+    };
+    "kind-of-2.0.1" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz";
+        sha1 = "018ec7a4ce7e3a86cb9141be519d24c8faa981b5";
+      };
+    };
+    "kind-of-3.2.2" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "3.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    };
+    "kind-of-6.0.3" = {
+      name = "kind-of";
+      packageName = "kind-of";
+      version = "6.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
+        sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
+      };
+    };
+    "lazy-cache-1.0.4" = {
+      name = "lazy-cache";
+      packageName = "lazy-cache";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz";
+        sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
+      };
+    };
+    "longest-1.0.1" = {
+      name = "longest";
+      packageName = "longest";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz";
+        sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
+      };
+    };
+    "make-iterator-0.1.1" = {
+      name = "make-iterator";
+      packageName = "make-iterator";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-iterator/-/make-iterator-0.1.1.tgz";
+        sha1 = "873d27b8198a465a81483b6f5d16da4e863ecf5b";
+      };
+    };
+    "make-iterator-0.2.1" = {
+      name = "make-iterator";
+      packageName = "make-iterator";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-iterator/-/make-iterator-0.2.1.tgz";
+        sha1 = "a19c660132b54ae6d64f881ec14056c746dbe972";
+      };
+    };
+    "make-iterator-1.0.1" = {
+      name = "make-iterator";
+      packageName = "make-iterator";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz";
+        sha512 = "pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==";
+      };
+    };
+    "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";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    };
+    "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";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    };
+    "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";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    };
+    "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.44.0" = {
+      name = "mime-db";
+      packageName = "mime-db";
+      version = "1.44.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
+        sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
+      };
+    };
+    "mime-types-2.1.27" = {
+      name = "mime-types";
+      packageName = "mime-types";
+      version = "2.1.27";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
+        sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
+      };
+    };
+    "minimatch-3.0.4" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
+        sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
+      };
+    };
+    "minimist-1.2.5" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
+        sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
+      };
+    };
+    "mkdirp-0.5.5" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
+        sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
+      };
+    };
+    "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";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "ms-2.1.1" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
+        sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
+      };
+    };
+    "mysql-2.18.1" = {
+      name = "mysql";
+      packageName = "mysql";
+      version = "2.18.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz";
+        sha512 = "Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==";
+      };
+    };
+    "negotiator-0.6.2" = {
+      name = "negotiator";
+      packageName = "negotiator";
+      version = "0.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz";
+        sha512 = "hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==";
+      };
+    };
+    "node-gyp-3.8.0" = {
+      name = "node-gyp";
+      packageName = "node-gyp";
+      version = "3.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz";
+        sha512 = "3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==";
+      };
+    };
+    "nopt-3.0.6" = {
+      name = "nopt";
+      packageName = "nopt";
+      version = "3.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
+        sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
+      };
+    };
+    "npmlog-4.1.2" = {
+      name = "npmlog";
+      packageName = "npmlog";
+      version = "4.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
+        sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
+      };
+    };
+    "number-is-nan-1.0.1" = {
+      name = "number-is-nan";
+      packageName = "number-is-nan";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    };
+    "oauth-sign-0.9.0" = {
+      name = "oauth-sign";
+      packageName = "oauth-sign";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
+      };
+    };
+    "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";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    };
+    "object.defaults-0.3.0" = {
+      name = "object.defaults";
+      packageName = "object.defaults";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.defaults/-/object.defaults-0.3.0.tgz";
+        sha1 = "b1eb9cbc78c4c7bd56cac6cae3dead5a7113882a";
+      };
+    };
+    "object.filter-0.3.0" = {
+      name = "object.filter";
+      packageName = "object.filter";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.filter/-/object.filter-0.3.0.tgz";
+        sha1 = "1091c69394b44f96d9d6356dd08785028ad6bff9";
+      };
+    };
+    "object.omit-2.0.1" = {
+      name = "object.omit";
+      packageName = "object.omit";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz";
+        sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
+      };
+    };
+    "object.pick-1.3.0" = {
+      name = "object.pick";
+      packageName = "object.pick";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    };
+    "object.reduce-0.1.7" = {
+      name = "object.reduce";
+      packageName = "object.reduce";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object.reduce/-/object.reduce-0.1.7.tgz";
+        sha1 = "d180e84f72d218348af45352b55165246b95046d";
+      };
+    };
+    "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";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    };
+    "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";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    };
+    "os-homedir-1.0.2" = {
+      name = "os-homedir";
+      packageName = "os-homedir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    };
+    "os-tmpdir-1.0.2" = {
+      name = "os-tmpdir";
+      packageName = "os-tmpdir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    };
+    "osenv-0.1.5" = {
+      name = "osenv";
+      packageName = "osenv";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
+        sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
+      };
+    };
+    "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==";
+      };
+    };
+    "password-hash-1.2.2" = {
+      name = "password-hash";
+      packageName = "password-hash";
+      version = "1.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/password-hash/-/password-hash-1.2.2.tgz";
+        sha1 = "3b451f014de4b2e1ebfa0e5493b9517b1063af1d";
+      };
+    };
+    "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";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    };
+    "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";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    };
+    "performance-now-2.1.0" = {
+      name = "performance-now";
+      packageName = "performance-now";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    };
+    "process-nextick-args-2.0.1" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
+        sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
+      };
+    };
+    "proxy-addr-2.0.6" = {
+      name = "proxy-addr";
+      packageName = "proxy-addr";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz";
+        sha512 = "dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==";
+      };
+    };
+    "psl-1.8.0" = {
+      name = "psl";
+      packageName = "psl";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
+        sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
+      };
+    };
+    "punycode-2.1.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
+        sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
+      };
+    };
+    "qs-6.5.2" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
+        sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
+      };
+    };
+    "qs-6.7.0" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz";
+        sha512 = "VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==";
+      };
+    };
+    "random-bytes-1.0.0" = {
+      name = "random-bytes";
+      packageName = "random-bytes";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz";
+        sha1 = "4f68a1dc0ae58bd3fb95848c30324db75d64360b";
+      };
+    };
+    "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.4.0" = {
+      name = "raw-body";
+      packageName = "raw-body";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz";
+        sha512 = "4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==";
+      };
+    };
+    "readable-stream-2.3.7" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
+        sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
+      };
+    };
+    "repeat-string-1.6.1" = {
+      name = "repeat-string";
+      packageName = "repeat-string";
+      version = "1.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    };
+    "request-2.88.2" = {
+      name = "request";
+      packageName = "request";
+      version = "2.88.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
+        sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
+      };
+    };
+    "right-align-0.1.3" = {
+      name = "right-align";
+      packageName = "right-align";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz";
+        sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
+      };
+    };
+    "rimraf-2.7.1" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz";
+        sha512 = "uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==";
+      };
+    };
+    "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.0" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz";
+        sha512 = "fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==";
+      };
+    };
+    "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==";
+      };
+    };
+    "semver-5.3.0" = {
+      name = "semver";
+      packageName = "semver";
+      version = "5.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz";
+        sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+      };
+    };
+    "send-0.17.1" = {
+      name = "send";
+      packageName = "send";
+      version = "0.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/send/-/send-0.17.1.tgz";
+        sha512 = "BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==";
+      };
+    };
+    "serve-static-1.14.1" = {
+      name = "serve-static";
+      packageName = "serve-static";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz";
+        sha512 = "JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==";
+      };
+    };
+    "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";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    };
+    "setprototypeof-1.1.1" = {
+      name = "setprototypeof";
+      packageName = "setprototypeof";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz";
+        sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
+      };
+    };
+    "signal-exit-3.0.3" = {
+      name = "signal-exit";
+      packageName = "signal-exit";
+      version = "3.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
+        sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
+      };
+    };
+    "sqlstring-2.3.1" = {
+      name = "sqlstring";
+      packageName = "sqlstring";
+      version = "2.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz";
+        sha1 = "475393ff9e91479aea62dcaf0ca3d14983a7fb40";
+      };
+    };
+    "sshpk-1.16.1" = {
+      name = "sshpk";
+      packageName = "sshpk";
+      version = "1.16.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
+        sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
+      };
+    };
+    "statuses-1.5.0" = {
+      name = "statuses";
+      packageName = "statuses";
+      version = "1.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    };
+    "string-width-1.0.2" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
+        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
+      };
+    };
+    "string_decoder-1.1.1" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    };
+    "striptags-2.2.1" = {
+      name = "striptags";
+      packageName = "striptags";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/striptags/-/striptags-2.2.1.tgz";
+        sha1 = "4c450b708d41b8bf39cf24c49ff234fc6aabfd32";
+      };
+    };
+    "tar-2.2.2" = {
+      name = "tar";
+      packageName = "tar";
+      version = "2.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz";
+        sha512 = "FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==";
+      };
+    };
+    "toidentifier-1.0.0" = {
+      name = "toidentifier";
+      packageName = "toidentifier";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz";
+        sha512 = "yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==";
+      };
+    };
+    "tough-cookie-2.5.0" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
+        sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
+      };
+    };
+    "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";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    };
+    "tweetnacl-0.14.5" = {
+      name = "tweetnacl";
+      packageName = "tweetnacl";
+      version = "0.14.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    };
+    "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==";
+      };
+    };
+    "uid-safe-2.1.5" = {
+      name = "uid-safe";
+      packageName = "uid-safe";
+      version = "2.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz";
+        sha512 = "KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==";
+      };
+    };
+    "underscore-1.3.3" = {
+      name = "underscore";
+      packageName = "underscore";
+      version = "1.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz";
+        sha1 = "47ac53683daf832bfa952e1774417da47817ae42";
+      };
+    };
+    "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";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    };
+    "uri-js-4.2.2" = {
+      name = "uri-js";
+      packageName = "uri-js";
+      version = "4.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
+        sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
+      };
+    };
+    "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";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    };
+    "utils-0.3.1" = {
+      name = "utils";
+      packageName = "utils";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/utils/-/utils-0.3.1.tgz";
+        sha1 = "04efaeb4290a67037a4cddfd2ff56144cc3a4581";
+      };
+    };
+    "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";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    };
+    "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";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "which-1.3.1" = {
+      name = "which";
+      packageName = "which";
+      version = "1.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
+        sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
+      };
+    };
+    "wide-align-1.1.3" = {
+      name = "wide-align";
+      packageName = "wide-align";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
+        sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
+      };
+    };
+    "word-wrap-1.2.3" = {
+      name = "word-wrap";
+      packageName = "word-wrap";
+      version = "1.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
+        sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
+      };
+    };
+    "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";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    };
+  };
+in
+{
+  ep_private_pad = nodeEnv.buildNodePackage {
+    name = "ep_private_pad";
+    packageName = "ep_private_pad";
+    version = "1.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_private_pad/-/ep_private_pad-1.0.2.tgz";
+      sha512 = "3cw9br4cg5ctv+w0XoMCXxM0tjYZd0LifH6ci/1wnv3LEkVnkiT19CtKGleOpHBVcQKLDf0aegjP9VaTW3rtHg==";
+    };
+    dependencies = [
+      sources."abbrev-1.1.1"
+      sources."accepts-1.3.7"
+      sources."ajv-6.12.2"
+      (sources."align-text-0.1.4" // {
+        dependencies = [
+          sources."kind-of-3.2.2"
+        ];
+      })
+      sources."ansi-regex-2.1.1"
+      (sources."any-1.0.0" // {
+        dependencies = [
+          sources."make-iterator-0.1.1"
+        ];
+      })
+      sources."aproba-1.2.0"
+      sources."are-we-there-yet-1.1.5"
+      sources."arr-diff-1.1.0"
+      sources."arr-flatten-1.1.0"
+      (sources."arr-map-2.0.2" // {
+        dependencies = [
+          sources."kind-of-6.0.3"
+          sources."make-iterator-1.0.1"
+        ];
+      })
+      sources."arr-union-3.1.0"
+      sources."array-each-0.1.1"
+      sources."array-flatten-1.1.1"
+      sources."array-slice-0.2.3"
+      sources."array-unique-0.2.1"
+      sources."asn1-0.2.4"
+      sources."assert-plus-1.0.0"
+      sources."asynckit-0.4.0"
+      sources."aws-sign2-0.7.0"
+      sources."aws4-1.9.1"
+      sources."balanced-match-1.0.0"
+      sources."bcrypt-pbkdf-1.0.2"
+      sources."bignumber.js-9.0.0"
+      sources."block-stream-0.0.9"
+      sources."body-parser-1.19.0"
+      sources."brace-expansion-1.1.11"
+      sources."bytes-3.1.0"
+      sources."caseless-0.12.0"
+      sources."center-align-0.1.3"
+      sources."client-sessions-0.8.0"
+      sources."code-point-at-1.1.0"
+      sources."combined-stream-1.0.8"
+      sources."concat-map-0.0.1"
+      sources."console-control-strings-1.1.0"
+      sources."content-disposition-0.5.3"
+      sources."content-type-1.0.4"
+      sources."cookie-0.4.0"
+      sources."cookie-parser-1.4.5"
+      sources."cookie-signature-1.0.6"
+      sources."cookies-0.7.3"
+      sources."core-util-is-1.0.2"
+      sources."dashdash-1.14.1"
+      sources."debug-2.6.9"
+      sources."delayed-stream-1.0.0"
+      sources."delegates-1.0.0"
+      sources."depd-1.1.2"
+      sources."destroy-1.0.4"
+      sources."ecc-jsbn-0.1.2"
+      sources."ee-first-1.1.1"
+      sources."eejs-1.0.0"
+      sources."ejs-1.0.0"
+      sources."encodeurl-1.0.2"
+      sources."escape-html-1.0.3"
+      sources."etag-1.8.1"
+      sources."etherpad-lite-client-0.8.0"
+      sources."export-dirs-0.2.4"
+      sources."export-files-2.1.1"
+      sources."express-4.17.1"
+      (sources."express-session-1.17.1" // {
+        dependencies = [
+          sources."depd-2.0.0"
+          sources."safe-buffer-5.2.0"
+        ];
+      })
+      sources."extend-3.0.2"
+      sources."extsprintf-1.3.0"
+      sources."fast-deep-equal-3.1.1"
+      sources."fast-json-stable-stringify-2.1.0"
+      sources."finalhandler-1.1.2"
+      sources."for-in-0.1.8"
+      (sources."for-own-0.1.5" // {
+        dependencies = [
+          sources."for-in-1.0.2"
+        ];
+      })
+      sources."forever-agent-0.6.1"
+      sources."form-data-2.3.3"
+      sources."forwarded-0.1.2"
+      sources."fresh-0.5.2"
+      sources."fs.realpath-1.0.0"
+      sources."fstream-1.0.12"
+      sources."gauge-2.7.4"
+      sources."getpass-0.1.7"
+      sources."glob-7.1.6"
+      sources."graceful-fs-4.2.4"
+      sources."har-schema-2.0.0"
+      sources."har-validator-5.1.3"
+      sources."has-unicode-2.0.1"
+      sources."has-values-0.1.4"
+      sources."http-errors-1.7.2"
+      sources."http-signature-1.2.0"
+      sources."iconv-lite-0.4.24"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.3"
+      sources."ipaddr.js-1.9.1"
+      sources."is-buffer-1.1.6"
+      sources."is-extendable-0.1.1"
+      sources."is-fullwidth-code-point-1.0.0"
+      (sources."is-number-2.1.0" // {
+        dependencies = [
+          sources."kind-of-3.2.2"
+        ];
+      })
+      sources."is-plain-object-2.0.4"
+      sources."is-typedarray-1.0.0"
+      sources."isarray-1.0.0"
+      sources."isexe-2.0.0"
+      sources."isobject-3.0.1"
+      sources."isstream-0.1.2"
+      sources."jsbn-0.1.1"
+      sources."json-schema-0.2.3"
+      sources."json-schema-traverse-0.4.1"
+      sources."json-stringify-safe-5.0.1"
+      sources."jsprim-1.4.1"
+      sources."keygrip-1.0.3"
+      sources."kind-of-2.0.1"
+      sources."lazy-cache-1.0.4"
+      sources."longest-1.0.1"
+      (sources."make-iterator-0.2.1" // {
+        dependencies = [
+          sources."kind-of-3.2.2"
+        ];
+      })
+      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.44.0"
+      sources."mime-types-2.1.27"
+      sources."minimatch-3.0.4"
+      sources."minimist-1.2.5"
+      sources."mkdirp-0.5.5"
+      sources."ms-2.0.0"
+      sources."mysql-2.18.1"
+      sources."negotiator-0.6.2"
+      sources."node-gyp-3.8.0"
+      sources."nopt-3.0.6"
+      sources."npmlog-4.1.2"
+      sources."number-is-nan-1.0.1"
+      sources."oauth-sign-0.9.0"
+      sources."object-assign-4.1.1"
+      (sources."object.defaults-0.3.0" // {
+        dependencies = [
+          sources."isobject-1.0.2"
+        ];
+      })
+      (sources."object.filter-0.3.0" // {
+        dependencies = [
+          sources."make-iterator-0.1.1"
+        ];
+      })
+      sources."object.omit-2.0.1"
+      sources."object.pick-1.3.0"
+      sources."object.reduce-0.1.7"
+      sources."on-finished-2.3.0"
+      sources."on-headers-1.0.2"
+      sources."once-1.4.0"
+      sources."os-homedir-1.0.2"
+      sources."os-tmpdir-1.0.2"
+      sources."osenv-0.1.5"
+      sources."parseurl-1.3.3"
+      sources."password-hash-1.2.2"
+      sources."path-is-absolute-1.0.1"
+      sources."path-to-regexp-0.1.7"
+      sources."performance-now-2.1.0"
+      sources."process-nextick-args-2.0.1"
+      sources."proxy-addr-2.0.6"
+      sources."psl-1.8.0"
+      sources."punycode-2.1.1"
+      sources."qs-6.7.0"
+      sources."random-bytes-1.0.0"
+      sources."range-parser-1.2.1"
+      sources."raw-body-2.4.0"
+      sources."readable-stream-2.3.7"
+      sources."repeat-string-1.6.1"
+      (sources."request-2.88.2" // {
+        dependencies = [
+          sources."qs-6.5.2"
+        ];
+      })
+      sources."right-align-0.1.3"
+      sources."rimraf-2.7.1"
+      sources."safe-buffer-5.1.2"
+      sources."safer-buffer-2.1.2"
+      sources."semver-5.3.0"
+      (sources."send-0.17.1" // {
+        dependencies = [
+          sources."ms-2.1.1"
+        ];
+      })
+      sources."serve-static-1.14.1"
+      sources."set-blocking-2.0.0"
+      sources."setprototypeof-1.1.1"
+      sources."signal-exit-3.0.3"
+      sources."sqlstring-2.3.1"
+      sources."sshpk-1.16.1"
+      sources."statuses-1.5.0"
+      sources."string-width-1.0.2"
+      sources."string_decoder-1.1.1"
+      sources."strip-ansi-3.0.1"
+      sources."striptags-2.2.1"
+      sources."tar-2.2.2"
+      sources."toidentifier-1.0.0"
+      sources."tough-cookie-2.5.0"
+      sources."tunnel-agent-0.6.0"
+      sources."tweetnacl-0.14.5"
+      sources."type-is-1.6.18"
+      sources."uid-safe-2.1.5"
+      sources."underscore-1.3.3"
+      sources."unpipe-1.0.0"
+      sources."uri-js-4.2.2"
+      sources."util-deprecate-1.0.2"
+      sources."utils-0.3.1"
+      sources."utils-merge-1.0.1"
+      sources."uuid-3.4.0"
+      sources."vary-1.1.2"
+      sources."verror-1.10.0"
+      sources."which-1.3.1"
+      sources."wide-align-1.1.3"
+      sources."word-wrap-1.2.3"
+      sources."wrappy-1.0.2"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Signup and login to manage private pad, share your pad with other users, add roles to users for your pads.";
+      homepage = "https://github.com/angelopiccolella/ep_private_pad#readme";
+      license = "";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_ruler/node-packages.json b/flakes/etherpad-lite/modules/ep_ruler/node-packages.json
new file mode 100644 (file)
index 0000000..d31b236
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_ruler" ]
diff --git a/flakes/etherpad-lite/modules/ep_ruler/node-packages.nix b/flakes/etherpad-lite/modules/ep_ruler/node-packages.nix
new file mode 100644 (file)
index 0000000..c8697d4
--- /dev/null
@@ -0,0 +1,27 @@
+{stdenv, nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_ruler = nodeEnv.buildNodePackage {
+    name = "ep_ruler";
+    packageName = "ep_ruler";
+    version = "0.0.2";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_ruler/-/ep_ruler-0.0.2.tgz";
+      sha1 = "5af10dfe0b5f33459566ce649cc483c680ed7811";
+    };
+    preRebuild = ''
+      sed -i -e 's/"dependencies"/"peerDependencies"/' package.json
+      '';
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Adds a ruler to Etherpad lite";
+      homepage = https://github.com/iquidus/ep_ruler;
+    };
+    production = true;
+    bypassCache = false;
+  };
+}
+
diff --git a/flakes/etherpad-lite/modules/ep_scrollto/node-packages.json b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.json
new file mode 100644 (file)
index 0000000..6d068d0
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_scrollto" ]
diff --git a/flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix
new file mode 100644 (file)
index 0000000..8f7656f
--- /dev/null
@@ -0,0 +1,29 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_scrollto = nodeEnv.buildNodePackage {
+    name = "ep_scrollto";
+    packageName = "ep_scrollto";
+    version = "0.0.7";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_scrollto/-/ep_scrollto-0.0.7.tgz";
+      sha512 = "uUfpiUWO0xLhN2R89jMPUYD+vhyiPyH6b8QL7y+0bKiOYOqf9l/rgXwTLuf4iB3p0J1/oVXhgSkG0dlZ35bUWw==";
+    };
+    buildInputs = globalBuildInputs;
+    preRebuild = ''
+      sed -i -e "s/is_old_ie = browser.msie.*$/is_old_ie = false;/" static/js/postAceInit.js
+    '';
+    meta = {
+      description = "Scroll to a specific line number based on a parameter of lineNumber in the URL IE http://test.com/p/foo#lineNumber=10 -- Users can click on the line number to get a link";
+      homepage = "https://github.com/johnmclear/ep_scrollto#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json
new file mode 100644 (file)
index 0000000..8755cd2
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_set_title_on_pad" ]
diff --git a/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix
new file mode 100644 (file)
index 0000000..74f9612
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_set_title_on_pad = nodeEnv.buildNodePackage {
+    name = "ep_set_title_on_pad";
+    packageName = "ep_set_title_on_pad";
+    version = "0.2.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_set_title_on_pad/-/ep_set_title_on_pad-0.2.0.tgz";
+      sha512 = "qt7Z+xJscGUB6A5R/vHsYbdOhmN3XG56LLtIxOzg/x3/ppHpBCmAf/y4cMNYyrm+6+lgwjt77aa6CchVRyUF7Q==";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Set the title on a pad in Etherpad, also includes real time updates to the UI";
+      homepage = "https://github.com/JohnMcLear/ep_set_title_on_pad#readme";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch
new file mode 100644 (file)
index 0000000..474e823
--- /dev/null
@@ -0,0 +1,22 @@
+diff --git a/templates/editbarButtons.ejs b/templates/editbarButtons.ejs
+index 7511025..f71a491 100644
+--- a/templates/editbarButtons.ejs
++++ b/templates/editbarButtons.ejs
+@@ -20,7 +20,7 @@
+   }
+   .subscript .buttonicon:before{
+-    content:"\e81a";
++    content:"\e834";
+   }
+   .superscript{
+@@ -32,7 +32,7 @@
+   }
+   .superscript .buttonicon:before{
+-    content:"\e819";
++    content:"\e833";
+   }
+       
+ </style>
diff --git a/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json
new file mode 100644 (file)
index 0000000..aa1cf21
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_subscript_and_superscript" ]
diff --git a/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix
new file mode 100644 (file)
index 0000000..04065dd
--- /dev/null
@@ -0,0 +1,28 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_subscript_and_superscript = nodeEnv.buildNodePackage {
+    name = "ep_subscript_and_superscript";
+    packageName = "ep_subscript_and_superscript";
+    version = "0.0.3";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_subscript_and_superscript/-/ep_subscript_and_superscript-0.0.3.tgz";
+      sha1 = "47f74a242fe8be5911391943f718eab81c390620";
+    };
+    preRebuild = ''
+      patch -p1 < ${./font.patch}
+    '';
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Add support for Subscript and Superscript";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json
new file mode 100644 (file)
index 0000000..d50e856
--- /dev/null
@@ -0,0 +1 @@
+[ "ep_timesliderdiff" ]
diff --git a/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix
new file mode 100644 (file)
index 0000000..e3ddb1f
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {};
+in
+{
+  ep_timesliderdiff = nodeEnv.buildNodePackage {
+    name = "ep_timesliderdiff";
+    packageName = "ep_timesliderdiff";
+    version = "0.0.5";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/ep_timesliderdiff/-/ep_timesliderdiff-0.0.5.tgz";
+      sha1 = "f8e0543677f7ac643936a2afce9f370d08a43310";
+    };
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "See a diff view showing the changes between the latest pad and a revision";
+      homepage = https://github.com/JohnMcLear/ep_timesliderdiff;
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
\ No newline at end of file
diff --git a/flakes/etherpad-lite/node-packages.nix b/flakes/etherpad-lite/node-packages.nix
new file mode 100644 (file)
index 0000000..0058508
--- /dev/null
@@ -0,0 +1,2934 @@
+# This file has been generated by node2nix 1.8.0. Do not edit!
+
+{src, nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "@apidevtools/json-schema-ref-parser-8.0.0" = {
+      name = "_at_apidevtools_slash_json-schema-ref-parser";
+      packageName = "@apidevtools/json-schema-ref-parser";
+      version = "8.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz";
+        sha512 = "n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==";
+      };
+    };
+    "@apidevtools/openapi-schemas-2.0.3" = {
+      name = "_at_apidevtools_slash_openapi-schemas";
+      packageName = "@apidevtools/openapi-schemas";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.0.3.tgz";
+        sha512 = "QoPaxGXfgqgGpK1p21FJ400z56hV681a8DOcZt3J5z0WIHgFeaIZ4+6bX5ATqmOoCpRCsH4ITEwKaOyFMz7wOA==";
+      };
+    };
+    "@apidevtools/swagger-methods-3.0.1" = {
+      name = "_at_apidevtools_slash_swagger-methods";
+      packageName = "@apidevtools/swagger-methods";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.1.tgz";
+        sha512 = "1Vlm18XYW6Yg7uHunroXeunWz5FShPFAdxBbPy8H6niB2Elz9QQsCoYHMbcc11EL1pTxaIr9HXz2An/mHXlX1Q==";
+      };
+    };
+    "@apidevtools/swagger-parser-9.0.1" = {
+      name = "_at_apidevtools_slash_swagger-parser";
+      packageName = "@apidevtools/swagger-parser";
+      version = "9.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-9.0.1.tgz";
+        sha512 = "Irqybg4dQrcHhZcxJc/UM4vO7Ksoj1Id5e+K94XUOzllqX1n47HEA50EKiXTCQbykxuJ4cYGIivjx/MRSTC5OA==";
+      };
+    };
+    "@jsdevtools/ono-7.1.2" = {
+      name = "_at_jsdevtools_slash_ono";
+      packageName = "@jsdevtools/ono";
+      version = "7.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.2.tgz";
+        sha512 = "qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==";
+      };
+    };
+    "@types/caseless-0.12.2" = {
+      name = "_at_types_slash_caseless";
+      packageName = "@types/caseless";
+      version = "0.12.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz";
+        sha512 = "6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==";
+      };
+    };
+    "@types/long-4.0.1" = {
+      name = "_at_types_slash_long";
+      packageName = "@types/long";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz";
+        sha512 = "5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==";
+      };
+    };
+    "@types/node-13.13.4" = {
+      name = "_at_types_slash_node";
+      packageName = "@types/node";
+      version = "13.13.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz";
+        sha512 = "x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==";
+      };
+    };
+    "@types/request-2.48.4" = {
+      name = "_at_types_slash_request";
+      packageName = "@types/request";
+      version = "2.48.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz";
+        sha512 = "W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==";
+      };
+    };
+    "@types/tough-cookie-4.0.0" = {
+      name = "_at_types_slash_tough-cookie";
+      packageName = "@types/tough-cookie";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz";
+        sha512 = "I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==";
+      };
+    };
+    "accepts-1.3.7" = {
+      name = "accepts";
+      packageName = "accepts";
+      version = "1.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz";
+        sha512 = "Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==";
+      };
+    };
+    "adm-zip-0.4.14" = {
+      name = "adm-zip";
+      packageName = "adm-zip";
+      version = "0.4.14";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz";
+        sha512 = "/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==";
+      };
+    };
+    "after-0.8.2" = {
+      name = "after";
+      packageName = "after";
+      version = "0.8.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/after/-/after-0.8.2.tgz";
+        sha1 = "fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+      };
+    };
+    "agentkeepalive-3.5.2" = {
+      name = "agentkeepalive";
+      packageName = "agentkeepalive";
+      version = "3.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz";
+        sha512 = "e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==";
+      };
+    };
+    "ajv-6.12.2" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "6.12.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
+        sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    };
+    "ansi-styles-2.2.1" = {
+      name = "ansi-styles";
+      packageName = "ansi-styles";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    };
+    "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-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";
+        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
+      };
+    };
+    "arraybuffer.slice-0.0.7" = {
+      name = "arraybuffer.slice";
+      packageName = "arraybuffer.slice";
+      version = "0.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz";
+        sha512 = "wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==";
+      };
+    };
+    "asn1-0.2.4" = {
+      name = "asn1";
+      packageName = "asn1";
+      version = "0.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
+        sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
+      };
+    };
+    "assert-plus-1.0.0" = {
+      name = "assert-plus";
+      packageName = "assert-plus";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
+        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
+      };
+    };
+    "async-0.9.0" = {
+      name = "async";
+      packageName = "async";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-0.9.0.tgz";
+        sha1 = "ac3613b1da9bed1b47510bb4651b8931e47146c7";
+      };
+    };
+    "async-3.2.0" = {
+      name = "async";
+      packageName = "async";
+      version = "3.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async/-/async-3.2.0.tgz";
+        sha512 = "TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==";
+      };
+    };
+    "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==";
+      };
+    };
+    "async-stacktrace-0.0.2" = {
+      name = "async-stacktrace";
+      packageName = "async-stacktrace";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/async-stacktrace/-/async-stacktrace-0.0.2.tgz";
+        sha1 = "8bbb9787e3b38c836c729a7e9d7c08630db5d1ef";
+      };
+    };
+    "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";
+        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
+      };
+    };
+    "aws-sign2-0.7.0" = {
+      name = "aws-sign2";
+      packageName = "aws-sign2";
+      version = "0.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
+        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
+      };
+    };
+    "aws4-1.9.1" = {
+      name = "aws4";
+      packageName = "aws4";
+      version = "1.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
+        sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
+      };
+    };
+    "backo2-1.0.2" = {
+      name = "backo2";
+      packageName = "backo2";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz";
+        sha1 = "31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+      };
+    };
+    "base64-arraybuffer-0.1.5" = {
+      name = "base64-arraybuffer";
+      packageName = "base64-arraybuffer";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz";
+        sha1 = "73926771923b5a19747ad666aa5cd4bf9c6e9ce8";
+      };
+    };
+    "base64id-1.0.0" = {
+      name = "base64id";
+      packageName = "base64id";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz";
+        sha1 = "47688cb99bb6804f0e06d3e763b1c32e57d8e6b6";
+      };
+    };
+    "bath-es5-3.0.3" = {
+      name = "bath-es5";
+      packageName = "bath-es5";
+      version = "3.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz";
+        sha512 = "PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg==";
+      };
+    };
+    "bcrypt-pbkdf-1.0.2" = {
+      name = "bcrypt-pbkdf";
+      packageName = "bcrypt-pbkdf";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
+        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
+      };
+    };
+    "better-assert-1.0.2" = {
+      name = "better-assert";
+      packageName = "better-assert";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz";
+        sha1 = "40866b9e1b9e0b55b481894311e68faffaebc522";
+      };
+    };
+    "bignumber.js-9.0.0" = {
+      name = "bignumber.js";
+      packageName = "bignumber.js";
+      version = "9.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz";
+        sha512 = "t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==";
+      };
+    };
+    "binary-search-1.3.6" = {
+      name = "binary-search";
+      packageName = "binary-search";
+      version = "1.3.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz";
+        sha512 = "nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==";
+      };
+    };
+    "blob-0.0.5" = {
+      name = "blob";
+      packageName = "blob";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz";
+        sha512 = "gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==";
+      };
+    };
+    "bluebird-2.11.0" = {
+      name = "bluebird";
+      packageName = "bluebird";
+      version = "2.11.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz";
+        sha1 = "534b9033c022c9579c56ba3b3e5a5caafbb650e1";
+      };
+    };
+    "body-parser-1.19.0" = {
+      name = "body-parser";
+      packageName = "body-parser";
+      version = "1.19.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz";
+        sha512 = "dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==";
+      };
+    };
+    "boolbase-1.0.0" = {
+      name = "boolbase";
+      packageName = "boolbase";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
+        sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
+      };
+    };
+    "browser-request-0.3.3" = {
+      name = "browser-request";
+      packageName = "browser-request";
+      version = "0.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz";
+        sha1 = "9ece5b5aca89a29932242e18bf933def9876cc17";
+      };
+    };
+    "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==";
+      };
+    };
+    "bytes-3.1.0" = {
+      name = "bytes";
+      packageName = "bytes";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz";
+        sha512 = "zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==";
+      };
+    };
+    "call-me-maybe-1.0.1" = {
+      name = "call-me-maybe";
+      packageName = "call-me-maybe";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
+        sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
+      };
+    };
+    "callsite-1.0.0" = {
+      name = "callsite";
+      packageName = "callsite";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz";
+        sha1 = "280398e5d664bd74038b6f0905153e6e8af1bc20";
+      };
+    };
+    "caseless-0.12.0" = {
+      name = "caseless";
+      packageName = "caseless";
+      version = "0.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
+        sha1 = "1b681c21ff84033c826543090689420d187151dc";
+      };
+    };
+    "cassandra-driver-4.5.1" = {
+      name = "cassandra-driver";
+      packageName = "cassandra-driver";
+      version = "4.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-4.5.1.tgz";
+        sha512 = "N5pxCxi9jPJzHuhx7ObClJtePcby8xuSb3mQkik1EE57CWqI7dEAuZZUaM7Flboasbwf/uSmw9oTfuf6sZMq9A==";
+      };
+    };
+    "chalk-1.1.3" = {
+      name = "chalk";
+      packageName = "chalk";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    };
+    "channels-0.0.4" = {
+      name = "channels";
+      packageName = "channels";
+      version = "0.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/channels/-/channels-0.0.4.tgz";
+        sha1 = "1bee323edea152bb9ef04f41bc6e6b0f5948a941";
+      };
+    };
+    "cheerio-0.22.0" = {
+      name = "cheerio";
+      packageName = "cheerio";
+      version = "0.22.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz";
+        sha1 = "a9baa860a3f9b595a6b81b1a86873121ed3a269e";
+      };
+    };
+    "clean-css-4.2.3" = {
+      name = "clean-css";
+      packageName = "clean-css";
+      version = "4.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz";
+        sha512 = "VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==";
+      };
+    };
+    "cloudant-follow-0.18.2" = {
+      name = "cloudant-follow";
+      packageName = "cloudant-follow";
+      version = "0.18.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cloudant-follow/-/cloudant-follow-0.18.2.tgz";
+        sha512 = "qu/AmKxDqJds+UmT77+0NbM7Yab2K3w0qSeJRzsq5dRWJTEJdWeb+XpG4OpKuTE9RKOa/Awn2gR3TTnvNr3TeA==";
+      };
+    };
+    "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==";
+      };
+    };
+    "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==";
+      };
+    };
+    "component-bind-1.0.0" = {
+      name = "component-bind";
+      packageName = "component-bind";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz";
+        sha1 = "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1";
+      };
+    };
+    "component-emitter-1.2.1" = {
+      name = "component-emitter";
+      packageName = "component-emitter";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz";
+        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
+      };
+    };
+    "component-inherit-0.0.3" = {
+      name = "component-inherit";
+      packageName = "component-inherit";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz";
+        sha1 = "645fc4adf58b72b649d5cae65135619db26ff143";
+      };
+    };
+    "content-disposition-0.5.3" = {
+      name = "content-disposition";
+      packageName = "content-disposition";
+      version = "0.5.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz";
+        sha512 = "ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==";
+      };
+    };
+    "content-type-1.0.4" = {
+      name = "content-type";
+      packageName = "content-type";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz";
+        sha512 = "hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==";
+      };
+    };
+    "cookie-0.3.1" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz";
+        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+      };
+    };
+    "cookie-0.4.0" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz";
+        sha512 = "+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==";
+      };
+    };
+    "cookie-0.4.1" = {
+      name = "cookie";
+      packageName = "cookie";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz";
+        sha512 = "ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==";
+      };
+    };
+    "cookie-parser-1.4.4" = {
+      name = "cookie-parser";
+      packageName = "cookie-parser";
+      version = "1.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz";
+        sha512 = "lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==";
+      };
+    };
+    "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";
+        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
+      };
+    };
+    "core-util-is-1.0.2" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    };
+    "css-select-1.2.0" = {
+      name = "css-select";
+      packageName = "css-select";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz";
+        sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
+      };
+    };
+    "css-what-2.1.3" = {
+      name = "css-what";
+      packageName = "css-what";
+      version = "2.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz";
+        sha512 = "a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==";
+      };
+    };
+    "dashdash-1.14.1" = {
+      name = "dashdash";
+      packageName = "dashdash";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
+        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
+      };
+    };
+    "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-3.1.0" = {
+      name = "debug";
+      packageName = "debug";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz";
+        sha512 = "OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==";
+      };
+    };
+    "debug-4.1.1" = {
+      name = "debug";
+      packageName = "debug";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";
+        sha512 = "pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==";
+      };
+    };
+    "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";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+    };
+    "denque-1.4.1" = {
+      name = "denque";
+      packageName = "denque";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz";
+        sha512 = "OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==";
+      };
+    };
+    "depd-1.1.2" = {
+      name = "depd";
+      packageName = "depd";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
+        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
+      };
+    };
+    "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.0.4" = {
+      name = "destroy";
+      packageName = "destroy";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
+        sha1 = "978857442c44749e4206613e37946205826abd80";
+      };
+    };
+    "dirty-1.1.0" = {
+      name = "dirty";
+      packageName = "dirty";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dirty/-/dirty-1.1.0.tgz";
+        sha1 = "70edd2b999541dc9974fd3a8cbd0c670fe236078";
+      };
+    };
+    "dom-serializer-0.1.1" = {
+      name = "dom-serializer";
+      packageName = "dom-serializer";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz";
+        sha512 = "l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==";
+      };
+    };
+    "domelementtype-1.3.1" = {
+      name = "domelementtype";
+      packageName = "domelementtype";
+      version = "1.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz";
+        sha512 = "BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==";
+      };
+    };
+    "domhandler-2.4.2" = {
+      name = "domhandler";
+      packageName = "domhandler";
+      version = "2.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz";
+        sha512 = "JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==";
+      };
+    };
+    "domutils-1.5.1" = {
+      name = "domutils";
+      packageName = "domutils";
+      version = "1.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz";
+        sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
+      };
+    };
+    "ecc-jsbn-0.1.2" = {
+      name = "ecc-jsbn";
+      packageName = "ecc-jsbn";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
+        sha1 = "3a83a904e54353287874c564b7549386849a98c9";
+      };
+    };
+    "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";
+        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
+      };
+    };
+    "ejs-2.6.1" = {
+      name = "ejs";
+      packageName = "ejs";
+      version = "2.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz";
+        sha512 = "0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==";
+      };
+    };
+    "elasticsearch-16.7.1" = {
+      name = "elasticsearch";
+      packageName = "elasticsearch";
+      version = "16.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/elasticsearch/-/elasticsearch-16.7.1.tgz";
+        sha512 = "PL/BxB03VGbbghJwISYvVcrR9KbSSkuQ7OM//jHJg/End/uC2fvXg4QI7RXLvCGbhBuNQ8dPue7DOOPra73PCw==";
+      };
+    };
+    "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";
+        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
+      };
+    };
+    "engine.io-3.2.1" = {
+      name = "engine.io";
+      packageName = "engine.io";
+      version = "3.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz";
+        sha512 = "+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==";
+      };
+    };
+    "engine.io-client-3.2.1" = {
+      name = "engine.io-client";
+      packageName = "engine.io-client";
+      version = "3.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz";
+        sha512 = "y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==";
+      };
+    };
+    "engine.io-parser-2.1.3" = {
+      name = "engine.io-parser";
+      packageName = "engine.io-parser";
+      version = "2.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz";
+        sha512 = "6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==";
+      };
+    };
+    "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==";
+      };
+    };
+    "errs-0.3.2" = {
+      name = "errs";
+      packageName = "errs";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz";
+        sha1 = "798099b2dbd37ca2bc749e538a7c1307d0b50499";
+      };
+    };
+    "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";
+        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
+      };
+    };
+    "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";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    };
+    "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";
+        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
+      };
+    };
+    "etherpad-require-kernel-1.0.9" = {
+      name = "etherpad-require-kernel";
+      packageName = "etherpad-require-kernel";
+      version = "1.0.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etherpad-require-kernel/-/etherpad-require-kernel-1.0.9.tgz";
+        sha1 = "ed8f04e9fd2ccec3a0055bb6d2dfe9d99912e7e2";
+      };
+    };
+    "etherpad-yajsml-0.0.2" = {
+      name = "etherpad-yajsml";
+      packageName = "etherpad-yajsml";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/etherpad-yajsml/-/etherpad-yajsml-0.0.2.tgz";
+        sha1 = "1c24d268b09476e637d049cddb1c6df8c729b46e";
+      };
+    };
+    "express-4.17.1" = {
+      name = "express";
+      packageName = "express";
+      version = "4.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express/-/express-4.17.1.tgz";
+        sha512 = "mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==";
+      };
+    };
+    "express-rate-limit-5.1.1" = {
+      name = "express-rate-limit";
+      packageName = "express-rate-limit";
+      version = "5.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.1.1.tgz";
+        sha512 = "puA1zcCx/quwWUOU6pT6daCt6t7SweD9wKChKhb+KSgFMKRwS81C224hiSAUANw/gnSHiwEhgozM/2ezEBZPeA==";
+      };
+    };
+    "express-session-1.17.0" = {
+      name = "express-session";
+      packageName = "express-session";
+      version = "1.17.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz";
+        sha512 = "t4oX2z7uoSqATbMfsxWMbNjAL0T5zpvcJCk3Z9wnPPN7ibddhnmDZXHfEcoBMG2ojKXZoCyPMc5FbtK+G7SoDg==";
+      };
+    };
+    "extend-3.0.2" = {
+      name = "extend";
+      packageName = "extend";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
+        sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
+      };
+    };
+    "extsprintf-1.3.0" = {
+      name = "extsprintf";
+      packageName = "extsprintf";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
+        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
+      };
+    };
+    "fast-deep-equal-3.1.1" = {
+      name = "fast-deep-equal";
+      packageName = "fast-deep-equal";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
+        sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
+      };
+    };
+    "fast-json-stable-stringify-2.1.0" = {
+      name = "fast-json-stable-stringify";
+      packageName = "fast-json-stable-stringify";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
+        sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
+      };
+    };
+    "finalhandler-1.1.2" = {
+      name = "finalhandler";
+      packageName = "finalhandler";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz";
+        sha512 = "aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==";
+      };
+    };
+    "find-root-1.1.0" = {
+      name = "find-root";
+      packageName = "find-root";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz";
+        sha512 = "NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==";
+      };
+    };
+    "forever-agent-0.6.1" = {
+      name = "forever-agent";
+      packageName = "forever-agent";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+    };
+    "form-data-2.3.3" = {
+      name = "form-data";
+      packageName = "form-data";
+      version = "2.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
+        sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
+      };
+    };
+    "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==";
+      };
+    };
+    "formidable-1.2.1" = {
+      name = "formidable";
+      packageName = "formidable";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz";
+        sha512 = "Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==";
+      };
+    };
+    "forwarded-0.1.2" = {
+      name = "forwarded";
+      packageName = "forwarded";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz";
+        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
+      };
+    };
+    "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";
+        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
+      };
+    };
+    "getpass-0.1.7" = {
+      name = "getpass";
+      packageName = "getpass";
+      version = "0.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
+        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
+      };
+    };
+    "graceful-fs-4.2.2" = {
+      name = "graceful-fs";
+      packageName = "graceful-fs";
+      version = "4.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz";
+        sha512 = "IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==";
+      };
+    };
+    "har-schema-2.0.0" = {
+      name = "har-schema";
+      packageName = "har-schema";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
+        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
+      };
+    };
+    "har-validator-5.1.3" = {
+      name = "har-validator";
+      packageName = "har-validator";
+      version = "5.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
+        sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
+      };
+    };
+    "has-ansi-2.0.0" = {
+      name = "has-ansi";
+      packageName = "has-ansi";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    };
+    "has-binary2-1.0.3" = {
+      name = "has-binary2";
+      packageName = "has-binary2";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz";
+        sha512 = "G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==";
+      };
+    };
+    "has-cors-1.1.0" = {
+      name = "has-cors";
+      packageName = "has-cors";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz";
+        sha1 = "5e474793f7ea9843d1bb99c23eef49ff126fff39";
+      };
+    };
+    "htmlparser2-3.10.1" = {
+      name = "htmlparser2";
+      packageName = "htmlparser2";
+      version = "3.10.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz";
+        sha512 = "IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==";
+      };
+    };
+    "http-errors-1.7.2" = {
+      name = "http-errors";
+      packageName = "http-errors";
+      version = "1.7.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz";
+        sha512 = "uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==";
+      };
+    };
+    "http-errors-1.7.3" = {
+      name = "http-errors";
+      packageName = "http-errors";
+      version = "1.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz";
+        sha512 = "ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==";
+      };
+    };
+    "http-signature-1.2.0" = {
+      name = "http-signature";
+      packageName = "http-signature";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
+        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
+      };
+    };
+    "humanize-ms-1.2.1" = {
+      name = "humanize-ms";
+      packageName = "humanize-ms";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz";
+        sha1 = "c46e3159a293f6b896da29316d8b6fe8bb79bbed";
+      };
+    };
+    "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==";
+      };
+    };
+    "indexof-0.0.1" = {
+      name = "indexof";
+      packageName = "indexof";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz";
+        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
+      };
+    };
+    "inherits-2.0.3" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    };
+    "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==";
+      };
+    };
+    "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-promise-1.0.1" = {
+      name = "is-promise";
+      packageName = "is-promise";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz";
+        sha1 = "31573761c057e33c2e91aab9e96da08cefbe76e5";
+      };
+    };
+    "is-typedarray-1.0.0" = {
+      name = "is-typedarray";
+      packageName = "is-typedarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    };
+    "isarray-0.0.1" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    };
+    "isarray-2.0.1" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz";
+        sha1 = "a37d94ed9cda2d59865c9f76fe596ee1f338741e";
+      };
+    };
+    "isstream-0.1.2" = {
+      name = "isstream";
+      packageName = "isstream";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+    };
+    "js-yaml-3.13.1" = {
+      name = "js-yaml";
+      packageName = "js-yaml";
+      version = "3.13.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz";
+        sha512 = "YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==";
+      };
+    };
+    "jsbn-0.1.1" = {
+      name = "jsbn";
+      packageName = "jsbn";
+      version = "0.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
+        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+      };
+    };
+    "json-schema-0.2.3" = {
+      name = "json-schema";
+      packageName = "json-schema";
+      version = "0.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
+        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
+      };
+    };
+    "json-schema-traverse-0.4.1" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
+      };
+    };
+    "json-stringify-safe-5.0.1" = {
+      name = "json-stringify-safe";
+      packageName = "json-stringify-safe";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+    };
+    "jsonminify-0.4.1" = {
+      name = "jsonminify";
+      packageName = "jsonminify";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonminify/-/jsonminify-0.4.1.tgz";
+        sha1 = "805dafbb39395188cee9ab582c81ef959d7e710c";
+      };
+    };
+    "jsonschema-1.2.4" = {
+      name = "jsonschema";
+      packageName = "jsonschema";
+      version = "1.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz";
+        sha512 = "lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==";
+      };
+    };
+    "jsonschema-draft4-1.0.0" = {
+      name = "jsonschema-draft4";
+      packageName = "jsonschema-draft4";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz";
+        sha1 = "f0af2005054f0f0ade7ea2118614b69dc512d865";
+      };
+    };
+    "jsprim-1.4.1" = {
+      name = "jsprim";
+      packageName = "jsprim";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
+        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
+      };
+    };
+    "languages4translatewiki-0.1.3" = {
+      name = "languages4translatewiki";
+      packageName = "languages4translatewiki";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/languages4translatewiki/-/languages4translatewiki-0.1.3.tgz";
+        sha1 = "c436206e052d21490b11017a44d5118f9221e5db";
+      };
+    };
+    "lodash-4.17.15" = {
+      name = "lodash";
+      packageName = "lodash";
+      version = "4.17.15";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";
+        sha512 = "8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==";
+      };
+    };
+    "lodash.assignin-4.2.0" = {
+      name = "lodash.assignin";
+      packageName = "lodash.assignin";
+      version = "4.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz";
+        sha1 = "ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2";
+      };
+    };
+    "lodash.bind-4.2.1" = {
+      name = "lodash.bind";
+      packageName = "lodash.bind";
+      version = "4.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz";
+        sha1 = "7ae3017e939622ac31b7d7d7dcb1b34db1690d35";
+      };
+    };
+    "lodash.clonedeep-4.5.0" = {
+      name = "lodash.clonedeep";
+      packageName = "lodash.clonedeep";
+      version = "4.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
+        sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
+      };
+    };
+    "lodash.defaults-4.2.0" = {
+      name = "lodash.defaults";
+      packageName = "lodash.defaults";
+      version = "4.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
+        sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
+      };
+    };
+    "lodash.filter-4.6.0" = {
+      name = "lodash.filter";
+      packageName = "lodash.filter";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz";
+        sha1 = "668b1d4981603ae1cc5a6fa760143e480b4c4ace";
+      };
+    };
+    "lodash.flatten-4.4.0" = {
+      name = "lodash.flatten";
+      packageName = "lodash.flatten";
+      version = "4.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz";
+        sha1 = "f31c22225a9632d2bbf8e4addbef240aa765a61f";
+      };
+    };
+    "lodash.foreach-4.5.0" = {
+      name = "lodash.foreach";
+      packageName = "lodash.foreach";
+      version = "4.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz";
+        sha1 = "1a6a35eace401280c7f06dddec35165ab27e3e53";
+      };
+    };
+    "lodash.get-4.4.2" = {
+      name = "lodash.get";
+      packageName = "lodash.get";
+      version = "4.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz";
+        sha1 = "2d177f652fa31e939b4438d5341499dfa3825e99";
+      };
+    };
+    "lodash.isequal-4.5.0" = {
+      name = "lodash.isequal";
+      packageName = "lodash.isequal";
+      version = "4.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz";
+        sha1 = "415c4478f2bcc30120c22ce10ed3226f7d3e18e0";
+      };
+    };
+    "lodash.map-4.6.0" = {
+      name = "lodash.map";
+      packageName = "lodash.map";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz";
+        sha1 = "771ec7839e3473d9c4cde28b19394c3562f4f6d3";
+      };
+    };
+    "lodash.merge-4.6.2" = {
+      name = "lodash.merge";
+      packageName = "lodash.merge";
+      version = "4.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz";
+        sha512 = "0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==";
+      };
+    };
+    "lodash.pick-4.4.0" = {
+      name = "lodash.pick";
+      packageName = "lodash.pick";
+      version = "4.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz";
+        sha1 = "52f05610fff9ded422611441ed1fc123a03001b3";
+      };
+    };
+    "lodash.reduce-4.6.0" = {
+      name = "lodash.reduce";
+      packageName = "lodash.reduce";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz";
+        sha1 = "f1ab6b839299ad48f784abbf476596f03b914d3b";
+      };
+    };
+    "lodash.reject-4.6.0" = {
+      name = "lodash.reject";
+      packageName = "lodash.reject";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz";
+        sha1 = "80d6492dc1470864bbf583533b651f42a9f52415";
+      };
+    };
+    "lodash.some-4.6.0" = {
+      name = "lodash.some";
+      packageName = "lodash.some";
+      version = "4.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz";
+        sha1 = "1bb9f314ef6b8baded13b549169b2a945eb68e4d";
+      };
+    };
+    "log4js-0.6.35" = {
+      name = "log4js";
+      packageName = "log4js";
+      version = "0.6.35";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/log4js/-/log4js-0.6.35.tgz";
+        sha1 = "3ab1da7cb14823b74ed3865c48593acdf11f1b59";
+      };
+    };
+    "long-2.4.0" = {
+      name = "long";
+      packageName = "long";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/long/-/long-2.4.0.tgz";
+        sha1 = "9fa180bb1d9500cdc29c4156766a1995e1f4524f";
+      };
+    };
+    "measured-core-1.11.2" = {
+      name = "measured-core";
+      packageName = "measured-core";
+      version = "1.11.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/measured-core/-/measured-core-1.11.2.tgz";
+        sha1 = "9dbea6d20741b56f61abd866e496eb8b85e69349";
+      };
+    };
+    "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";
+        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
+      };
+    };
+    "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";
+        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
+      };
+    };
+    "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";
+        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
+      };
+    };
+    "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.44.0" = {
+      name = "mime-db";
+      packageName = "mime-db";
+      version = "1.44.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
+        sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
+      };
+    };
+    "mime-types-2.1.27" = {
+      name = "mime-types";
+      packageName = "mime-types";
+      version = "2.1.27";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
+        sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
+      };
+    };
+    "mock-json-schema-1.0.8" = {
+      name = "mock-json-schema";
+      packageName = "mock-json-schema";
+      version = "1.0.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mock-json-schema/-/mock-json-schema-1.0.8.tgz";
+        sha512 = "22yL+WggSo8HXqw0HkXgXXJjJMSBCfv54htfwN4BabaFdJ3808jL0CzE+VaBRlj8Nr0+pnSVE9YvsDG5Quu6hQ==";
+      };
+    };
+    "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";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    };
+    "ms-2.1.1" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
+        sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
+      };
+    };
+    "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==";
+      };
+    };
+    "mysql-2.18.1" = {
+      name = "mysql";
+      packageName = "mysql";
+      version = "2.18.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz";
+        sha512 = "Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==";
+      };
+    };
+    "nano-8.2.2" = {
+      name = "nano";
+      packageName = "nano";
+      version = "8.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nano/-/nano-8.2.2.tgz";
+        sha512 = "1/rAvpd1J0Os0SazgutWQBx2buAq3KwJpmdIylPDqOwy73iQeAhTSCq3uzbGzvcNNW16Vv/BLXkk+DYcdcH+aw==";
+      };
+    };
+    "negotiator-0.6.2" = {
+      name = "negotiator";
+      packageName = "negotiator";
+      version = "0.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz";
+        sha512 = "hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==";
+      };
+    };
+    "nodeify-1.0.1" = {
+      name = "nodeify";
+      packageName = "nodeify";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nodeify/-/nodeify-1.0.1.tgz";
+        sha1 = "64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d";
+      };
+    };
+    "npm-6.14.4" = {
+      name = "npm";
+      packageName = "npm";
+      version = "6.14.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npm/-/npm-6.14.4.tgz";
+        sha512 = "B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw==";
+      };
+    };
+    "nth-check-1.0.2" = {
+      name = "nth-check";
+      packageName = "nth-check";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
+        sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
+      };
+    };
+    "oauth-sign-0.9.0" = {
+      name = "oauth-sign";
+      packageName = "oauth-sign";
+      version = "0.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
+        sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
+      };
+    };
+    "object-component-0.0.3" = {
+      name = "object-component";
+      packageName = "object-component";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz";
+        sha1 = "f0c69aa50efc95b866c186f400a33769cb2f1291";
+      };
+    };
+    "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";
+        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
+      };
+    };
+    "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==";
+      };
+    };
+    "openapi-backend-2.4.1" = {
+      name = "openapi-backend";
+      packageName = "openapi-backend";
+      version = "2.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/openapi-backend/-/openapi-backend-2.4.1.tgz";
+        sha512 = "48j8QhDD9sfV6t7Zgn9JrfJtCpJ53bmoT2bzXYYig1HhG/Xn0Aa5fJhM0cQSZq9nq78/XbU7RDEa3e+IADNkmA==";
+      };
+    };
+    "openapi-schema-validation-0.4.2" = {
+      name = "openapi-schema-validation";
+      packageName = "openapi-schema-validation";
+      version = "0.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz";
+        sha512 = "K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==";
+      };
+    };
+    "openapi-types-1.3.5" = {
+      name = "openapi-types";
+      packageName = "openapi-types";
+      version = "1.3.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.5.tgz";
+        sha512 = "11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==";
+      };
+    };
+    "optional-js-2.1.1" = {
+      name = "optional-js";
+      packageName = "optional-js";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/optional-js/-/optional-js-2.1.1.tgz";
+        sha512 = "mUS4bDngcD5kKzzRUd1HVQkr9Lzzby3fSrrPR9wOHhQiyYo+hDS5NVli5YQzGjQRQ15k5Sno4xH9pfykJdeEUA==";
+      };
+    };
+    "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==";
+      };
+    };
+    "parseqs-0.0.5" = {
+      name = "parseqs";
+      packageName = "parseqs";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz";
+        sha1 = "d5208a3738e46766e291ba2ea173684921a8b89d";
+      };
+    };
+    "parseuri-0.0.5" = {
+      name = "parseuri";
+      packageName = "parseuri";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz";
+        sha1 = "80204a50d4dbb779bfdc6ebe2778d90e4bce320a";
+      };
+    };
+    "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-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";
+        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
+      };
+    };
+    "performance-now-2.1.0" = {
+      name = "performance-now";
+      packageName = "performance-now";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
+        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
+      };
+    };
+    "pg-7.18.2" = {
+      name = "pg";
+      packageName = "pg";
+      version = "7.18.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz";
+        sha512 = "Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==";
+      };
+    };
+    "pg-connection-string-0.1.3" = {
+      name = "pg-connection-string";
+      packageName = "pg-connection-string";
+      version = "0.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz";
+        sha1 = "da1847b20940e42ee1492beaf65d49d91b245df7";
+      };
+    };
+    "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-packet-stream-1.1.0" = {
+      name = "pg-packet-stream";
+      packageName = "pg-packet-stream";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz";
+        sha512 = "kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==";
+      };
+    };
+    "pg-pool-2.0.10" = {
+      name = "pg-pool";
+      packageName = "pg-pool";
+      version = "2.0.10";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz";
+        sha512 = "qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==";
+      };
+    };
+    "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.2" = {
+      name = "pgpass";
+      packageName = "pgpass";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz";
+        sha1 = "2a7bb41b6065b67907e91da1b07c1847c877b306";
+      };
+    };
+    "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";
+        sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35";
+      };
+    };
+    "postgres-date-1.0.5" = {
+      name = "postgres-date";
+      packageName = "postgres-date";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.5.tgz";
+        sha512 = "pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==";
+      };
+    };
+    "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==";
+      };
+    };
+    "process-nextick-args-2.0.1" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
+        sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
+      };
+    };
+    "promise-1.3.0" = {
+      name = "promise";
+      packageName = "promise";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/promise/-/promise-1.3.0.tgz";
+        sha1 = "e5cc9a4c8278e4664ffedc01c7da84842b040175";
+      };
+    };
+    "proxy-addr-2.0.6" = {
+      name = "proxy-addr";
+      packageName = "proxy-addr";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz";
+        sha512 = "dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==";
+      };
+    };
+    "psl-1.8.0" = {
+      name = "psl";
+      packageName = "psl";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
+        sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
+      };
+    };
+    "punycode-1.4.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    };
+    "punycode-2.1.1" = {
+      name = "punycode";
+      packageName = "punycode";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
+        sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
+      };
+    };
+    "qs-6.5.2" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
+        sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
+      };
+    };
+    "qs-6.7.0" = {
+      name = "qs";
+      packageName = "qs";
+      version = "6.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz";
+        sha512 = "VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==";
+      };
+    };
+    "random-bytes-1.0.0" = {
+      name = "random-bytes";
+      packageName = "random-bytes";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz";
+        sha1 = "4f68a1dc0ae58bd3fb95848c30324db75d64360b";
+      };
+    };
+    "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.4.0" = {
+      name = "raw-body";
+      packageName = "raw-body";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz";
+        sha512 = "4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==";
+      };
+    };
+    "readable-stream-1.0.34" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "1.0.34";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz";
+        sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
+      };
+    };
+    "readable-stream-2.3.7" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
+        sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
+      };
+    };
+    "readable-stream-3.6.0" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "3.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz";
+        sha512 = "BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==";
+      };
+    };
+    "redis-3.0.2" = {
+      name = "redis";
+      packageName = "redis";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz";
+        sha512 = "PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==";
+      };
+    };
+    "redis-commands-1.5.0" = {
+      name = "redis-commands";
+      packageName = "redis-commands";
+      version = "1.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz";
+        sha512 = "6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==";
+      };
+    };
+    "redis-errors-1.2.0" = {
+      name = "redis-errors";
+      packageName = "redis-errors";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz";
+        sha1 = "eb62d2adb15e4eaf4610c04afe1529384250abad";
+      };
+    };
+    "redis-parser-3.0.0" = {
+      name = "redis-parser";
+      packageName = "redis-parser";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz";
+        sha1 = "b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4";
+      };
+    };
+    "request-2.88.0" = {
+      name = "request";
+      packageName = "request";
+      version = "2.88.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/request/-/request-2.88.0.tgz";
+        sha512 = "NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==";
+      };
+    };
+    "resolve-1.1.7" = {
+      name = "resolve";
+      packageName = "resolve";
+      version = "1.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz";
+        sha1 = "203114d82ad2c5ed9e8e0411b3932875e889e97b";
+      };
+    };
+    "rethinkdb-2.4.2" = {
+      name = "rethinkdb";
+      packageName = "rethinkdb";
+      version = "2.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.4.2.tgz";
+        sha512 = "6DzwqEpFc8cqesAdo07a845oBRxLiHvWzopTKBo/uY2ypGWIsJQFJk3wjRDtSEhczxJqLS0jnf37rwgzYAw8NQ==";
+      };
+    };
+    "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.0" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz";
+        sha512 = "fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==";
+      };
+    };
+    "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==";
+      };
+    };
+    "security-1.0.0" = {
+      name = "security";
+      packageName = "security";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/security/-/security-1.0.0.tgz";
+        sha1 = "811c300313686133ef0007125e3b0ed700978815";
+      };
+    };
+    "semver-4.3.2" = {
+      name = "semver";
+      packageName = "semver";
+      version = "4.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz";
+        sha1 = "c7a07158a80bedd052355b770d82d6640f803be7";
+      };
+    };
+    "semver-4.3.6" = {
+      name = "semver";
+      packageName = "semver";
+      version = "4.3.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
+        sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
+      };
+    };
+    "semver-5.6.0" = {
+      name = "semver";
+      packageName = "semver";
+      version = "5.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz";
+        sha512 = "RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==";
+      };
+    };
+    "send-0.17.1" = {
+      name = "send";
+      packageName = "send";
+      version = "0.17.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/send/-/send-0.17.1.tgz";
+        sha512 = "BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==";
+      };
+    };
+    "serve-static-1.14.1" = {
+      name = "serve-static";
+      packageName = "serve-static";
+      version = "1.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz";
+        sha512 = "JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==";
+      };
+    };
+    "setprototypeof-1.1.1" = {
+      name = "setprototypeof";
+      packageName = "setprototypeof";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz";
+        sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
+      };
+    };
+    "slide-1.1.6" = {
+      name = "slide";
+      packageName = "slide";
+      version = "1.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
+        sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
+      };
+    };
+    "socket.io-2.1.1" = {
+      name = "socket.io";
+      packageName = "socket.io";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz";
+        sha512 = "rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==";
+      };
+    };
+    "socket.io-adapter-1.1.2" = {
+      name = "socket.io-adapter";
+      packageName = "socket.io-adapter";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz";
+        sha512 = "WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==";
+      };
+    };
+    "socket.io-client-2.1.1" = {
+      name = "socket.io-client";
+      packageName = "socket.io-client";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz";
+        sha512 = "jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==";
+      };
+    };
+    "socket.io-parser-3.2.0" = {
+      name = "socket.io-parser";
+      packageName = "socket.io-parser";
+      version = "3.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz";
+        sha512 = "FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==";
+      };
+    };
+    "source-map-0.6.1" = {
+      name = "source-map";
+      packageName = "source-map";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
+        sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
+      };
+    };
+    "split-1.0.1" = {
+      name = "split";
+      packageName = "split";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/split/-/split-1.0.1.tgz";
+        sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
+      };
+    };
+    "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";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    };
+    "sqlstring-2.3.1" = {
+      name = "sqlstring";
+      packageName = "sqlstring";
+      version = "2.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz";
+        sha1 = "475393ff9e91479aea62dcaf0ca3d14983a7fb40";
+      };
+    };
+    "sshpk-1.16.1" = {
+      name = "sshpk";
+      packageName = "sshpk";
+      version = "1.16.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
+        sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
+      };
+    };
+    "statuses-1.5.0" = {
+      name = "statuses";
+      packageName = "statuses";
+      version = "1.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz";
+        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
+      };
+    };
+    "string_decoder-0.10.31" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "0.10.31";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    };
+    "string_decoder-1.1.1" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
+      };
+    };
+    "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-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    };
+    "supports-color-2.0.0" = {
+      name = "supports-color";
+      packageName = "supports-color";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    };
+    "swagger-parser-9.0.1" = {
+      name = "swagger-parser";
+      packageName = "swagger-parser";
+      version = "9.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/swagger-parser/-/swagger-parser-9.0.1.tgz";
+        sha512 = "oxOHUaeNetO9ChhTJm2fD+48DbGbLD09ZEOwPOWEqcW8J6zmjWxutXtSuOiXsoRgDWvORYlImbwM21Pn+EiuvQ==";
+      };
+    };
+    "swagger-schema-official-2.0.0-bab6bed" = {
+      name = "swagger-schema-official";
+      packageName = "swagger-schema-official";
+      version = "2.0.0-bab6bed";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz";
+        sha1 = "70070468d6d2977ca5237b2e519ca7d06a2ea3fd";
+      };
+    };
+    "through-2.3.8" = {
+      name = "through";
+      packageName = "through";
+      version = "2.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
+        sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+      };
+    };
+    "tinycon-0.0.1" = {
+      name = "tinycon";
+      packageName = "tinycon";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tinycon/-/tinycon-0.0.1.tgz";
+        sha1 = "6de10cd5219a1f121d9a0a24b2c11b3fb24dffed";
+      };
+    };
+    "to-array-0.1.4" = {
+      name = "to-array";
+      packageName = "to-array";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz";
+        sha1 = "17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890";
+      };
+    };
+    "toidentifier-1.0.0" = {
+      name = "toidentifier";
+      packageName = "toidentifier";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz";
+        sha512 = "yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==";
+      };
+    };
+    "tough-cookie-2.4.3" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "2.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz";
+        sha512 = "Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==";
+      };
+    };
+    "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";
+        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
+      };
+    };
+    "tweetnacl-0.14.5" = {
+      name = "tweetnacl";
+      packageName = "tweetnacl";
+      version = "0.14.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
+        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
+      };
+    };
+    "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==";
+      };
+    };
+    "ueberdb2-0.4.5" = {
+      name = "ueberdb2";
+      packageName = "ueberdb2";
+      version = "0.4.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ueberdb2/-/ueberdb2-0.4.5.tgz";
+        sha512 = "D8TogZ6Dc4Ot909b0D0QQRSanVB3W4EtqA8smKEZS7H5eIbAWFOyBF74XADIB9f+NASSjdu8DU3EJeKe9Xdzjg==";
+      };
+    };
+    "uglify-js-3.8.1" = {
+      name = "uglify-js";
+      packageName = "uglify-js";
+      version = "3.8.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz";
+        sha512 = "W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==";
+      };
+    };
+    "uid-safe-2.1.5" = {
+      name = "uid-safe";
+      packageName = "uid-safe";
+      version = "2.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz";
+        sha512 = "KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==";
+      };
+    };
+    "ultron-1.1.1" = {
+      name = "ultron";
+      packageName = "ultron";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz";
+        sha512 = "UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==";
+      };
+    };
+    "underscore-1.8.3" = {
+      name = "underscore";
+      packageName = "underscore";
+      version = "1.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz";
+        sha1 = "4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022";
+      };
+    };
+    "unorm-1.4.1" = {
+      name = "unorm";
+      packageName = "unorm";
+      version = "1.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz";
+        sha1 = "364200d5f13646ca8bcd44490271335614792300";
+      };
+    };
+    "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";
+        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+      };
+    };
+    "uri-js-4.2.2" = {
+      name = "uri-js";
+      packageName = "uri-js";
+      version = "4.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
+        sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
+      };
+    };
+    "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";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    };
+    "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";
+        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
+      };
+    };
+    "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==";
+      };
+    };
+    "validator-12.2.0" = {
+      name = "validator";
+      packageName = "validator";
+      version = "12.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz";
+        sha512 = "jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==";
+      };
+    };
+    "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";
+        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
+      };
+    };
+    "verror-1.10.0" = {
+      name = "verror";
+      packageName = "verror";
+      version = "1.10.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
+        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
+      };
+    };
+    "ws-3.3.3" = {
+      name = "ws";
+      packageName = "ws";
+      version = "3.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz";
+        sha512 = "nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==";
+      };
+    };
+    "xmlhttprequest-ssl-1.5.5" = {
+      name = "xmlhttprequest-ssl";
+      packageName = "xmlhttprequest-ssl";
+      version = "1.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz";
+        sha1 = "c2876b06168aadc40e57d97e81191ac8f4398b3e";
+      };
+    };
+    "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==";
+      };
+    };
+    "yeast-0.1.2" = {
+      name = "yeast";
+      packageName = "yeast";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz";
+        sha1 = "008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
+      };
+    };
+    "z-schema-4.2.3" = {
+      name = "z-schema";
+      packageName = "z-schema";
+      version = "4.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz";
+        sha512 = "zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==";
+      };
+    };
+  };
+  args = {
+    name = "ep_etherpad-lite";
+    packageName = "ep_etherpad-lite";
+    version = "1.8.3";
+    inherit src;
+    dependencies = [
+      sources."@apidevtools/json-schema-ref-parser-8.0.0"
+      sources."@apidevtools/openapi-schemas-2.0.3"
+      sources."@apidevtools/swagger-methods-3.0.1"
+      sources."@apidevtools/swagger-parser-9.0.1"
+      sources."@jsdevtools/ono-7.1.2"
+      sources."@types/caseless-0.12.2"
+      sources."@types/long-4.0.1"
+      sources."@types/node-13.13.4"
+      (sources."@types/request-2.48.4" // {
+        dependencies = [
+          sources."form-data-2.5.1"
+        ];
+      })
+      sources."@types/tough-cookie-4.0.0"
+      sources."accepts-1.3.7"
+      sources."adm-zip-0.4.14"
+      sources."after-0.8.2"
+      sources."agentkeepalive-3.5.2"
+      sources."ajv-6.12.2"
+      sources."ansi-regex-2.1.1"
+      sources."ansi-styles-2.2.1"
+      sources."argparse-1.0.10"
+      sources."array-flatten-1.1.1"
+      sources."arraybuffer.slice-0.0.7"
+      sources."asn1-0.2.4"
+      sources."assert-plus-1.0.0"
+      sources."async-0.9.0"
+      sources."async-limiter-1.0.1"
+      sources."async-stacktrace-0.0.2"
+      sources."asynckit-0.4.0"
+      sources."aws-sign2-0.7.0"
+      sources."aws4-1.9.1"
+      sources."backo2-1.0.2"
+      sources."base64-arraybuffer-0.1.5"
+      sources."base64id-1.0.0"
+      sources."bath-es5-3.0.3"
+      sources."bcrypt-pbkdf-1.0.2"
+      sources."better-assert-1.0.2"
+      sources."bignumber.js-9.0.0"
+      sources."binary-search-1.3.6"
+      sources."blob-0.0.5"
+      sources."bluebird-2.11.0"
+      (sources."body-parser-1.19.0" // {
+        dependencies = [
+          sources."http-errors-1.7.2"
+          sources."inherits-2.0.3"
+        ];
+      })
+      sources."boolbase-1.0.0"
+      sources."browser-request-0.3.3"
+      sources."buffer-writer-2.0.0"
+      sources."bytes-3.1.0"
+      sources."call-me-maybe-1.0.1"
+      sources."callsite-1.0.0"
+      sources."caseless-0.12.0"
+      sources."cassandra-driver-4.5.1"
+      sources."chalk-1.1.3"
+      sources."channels-0.0.4"
+      sources."cheerio-0.22.0"
+      sources."clean-css-4.2.3"
+      (sources."cloudant-follow-0.18.2" // {
+        dependencies = [
+          sources."debug-4.1.1"
+          sources."ms-2.1.2"
+        ];
+      })
+      sources."combined-stream-1.0.8"
+      sources."commander-2.20.3"
+      sources."component-bind-1.0.0"
+      sources."component-emitter-1.2.1"
+      sources."component-inherit-0.0.3"
+      (sources."content-disposition-0.5.3" // {
+        dependencies = [
+          sources."safe-buffer-5.1.2"
+        ];
+      })
+      sources."content-type-1.0.4"
+      sources."cookie-0.3.1"
+      sources."cookie-parser-1.4.4"
+      sources."cookie-signature-1.0.6"
+      sources."core-util-is-1.0.2"
+      sources."css-select-1.2.0"
+      sources."css-what-2.1.3"
+      sources."dashdash-1.14.1"
+      sources."debug-2.6.9"
+      sources."delayed-stream-1.0.0"
+      sources."denque-1.4.1"
+      sources."depd-1.1.2"
+      sources."destroy-1.0.4"
+      sources."dirty-1.1.0"
+      sources."dom-serializer-0.1.1"
+      sources."domelementtype-1.3.1"
+      sources."domhandler-2.4.2"
+      sources."domutils-1.5.1"
+      sources."ecc-jsbn-0.1.2"
+      sources."ee-first-1.1.1"
+      sources."ejs-2.6.1"
+      sources."elasticsearch-16.7.1"
+      sources."encodeurl-1.0.2"
+      (sources."engine.io-3.2.1" // {
+        dependencies = [
+          sources."debug-3.1.0"
+        ];
+      })
+      (sources."engine.io-client-3.2.1" // {
+        dependencies = [
+          sources."debug-3.1.0"
+        ];
+      })
+      sources."engine.io-parser-2.1.3"
+      sources."entities-1.1.2"
+      sources."errs-0.3.2"
+      sources."escape-html-1.0.3"
+      sources."escape-string-regexp-1.0.5"
+      sources."esprima-4.0.1"
+      sources."etag-1.8.1"
+      sources."etherpad-require-kernel-1.0.9"
+      sources."etherpad-yajsml-0.0.2"
+      (sources."express-4.17.1" // {
+        dependencies = [
+          sources."cookie-0.4.0"
+          sources."safe-buffer-5.1.2"
+        ];
+      })
+      sources."express-rate-limit-5.1.1"
+      (sources."express-session-1.17.0" // {
+        dependencies = [
+          sources."cookie-0.4.0"
+          sources."depd-2.0.0"
+        ];
+      })
+      sources."extend-3.0.2"
+      sources."extsprintf-1.3.0"
+      sources."fast-deep-equal-3.1.1"
+      sources."fast-json-stable-stringify-2.1.0"
+      sources."finalhandler-1.1.2"
+      sources."find-root-1.1.0"
+      sources."forever-agent-0.6.1"
+      sources."form-data-2.3.3"
+      sources."formidable-1.2.1"
+      sources."forwarded-0.1.2"
+      sources."fresh-0.5.2"
+      sources."getpass-0.1.7"
+      sources."graceful-fs-4.2.2"
+      sources."har-schema-2.0.0"
+      sources."har-validator-5.1.3"
+      sources."has-ansi-2.0.0"
+      (sources."has-binary2-1.0.3" // {
+        dependencies = [
+          sources."isarray-2.0.1"
+        ];
+      })
+      sources."has-cors-1.1.0"
+      sources."htmlparser2-3.10.1"
+      sources."http-errors-1.7.3"
+      sources."http-signature-1.2.0"
+      sources."humanize-ms-1.2.1"
+      sources."iconv-lite-0.4.24"
+      sources."indexof-0.0.1"
+      sources."inherits-2.0.4"
+      sources."ipaddr.js-1.9.1"
+      sources."is-promise-1.0.1"
+      sources."is-typedarray-1.0.0"
+      sources."isarray-0.0.1"
+      sources."isstream-0.1.2"
+      sources."js-yaml-3.13.1"
+      sources."jsbn-0.1.1"
+      sources."json-schema-0.2.3"
+      sources."json-schema-traverse-0.4.1"
+      sources."json-stringify-safe-5.0.1"
+      sources."jsonminify-0.4.1"
+      sources."jsonschema-1.2.4"
+      sources."jsonschema-draft4-1.0.0"
+      sources."jsprim-1.4.1"
+      sources."languages4translatewiki-0.1.3"
+      sources."lodash-4.17.15"
+      sources."lodash.assignin-4.2.0"
+      sources."lodash.bind-4.2.1"
+      sources."lodash.clonedeep-4.5.0"
+      sources."lodash.defaults-4.2.0"
+      sources."lodash.filter-4.6.0"
+      sources."lodash.flatten-4.4.0"
+      sources."lodash.foreach-4.5.0"
+      sources."lodash.get-4.4.2"
+      sources."lodash.isequal-4.5.0"
+      sources."lodash.map-4.6.0"
+      sources."lodash.merge-4.6.2"
+      sources."lodash.pick-4.4.0"
+      sources."lodash.reduce-4.6.0"
+      sources."lodash.reject-4.6.0"
+      sources."lodash.some-4.6.0"
+      (sources."log4js-0.6.35" // {
+        dependencies = [
+          sources."readable-stream-1.0.34"
+          sources."semver-4.3.6"
+          sources."string_decoder-0.10.31"
+        ];
+      })
+      sources."long-2.4.0"
+      sources."measured-core-1.11.2"
+      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.44.0"
+      sources."mime-types-2.1.27"
+      sources."mock-json-schema-1.0.8"
+      sources."ms-2.0.0"
+      (sources."mysql-2.18.1" // {
+        dependencies = [
+          sources."isarray-1.0.0"
+          sources."readable-stream-2.3.7"
+          sources."safe-buffer-5.1.2"
+          sources."string_decoder-1.1.1"
+        ];
+      })
+      (sources."nano-8.2.2" // {
+        dependencies = [
+          sources."debug-4.1.1"
+          sources."ms-2.1.2"
+        ];
+      })
+      sources."negotiator-0.6.2"
+      sources."nodeify-1.0.1"
+      sources."npm-6.14.4"
+      sources."nth-check-1.0.2"
+      sources."oauth-sign-0.9.0"
+      sources."object-component-0.0.3"
+      sources."on-finished-2.3.0"
+      sources."on-headers-1.0.2"
+      (sources."openapi-backend-2.4.1" // {
+        dependencies = [
+          sources."cookie-0.4.1"
+        ];
+      })
+      sources."openapi-schema-validation-0.4.2"
+      sources."openapi-types-1.3.5"
+      sources."optional-js-2.1.1"
+      sources."packet-reader-1.0.0"
+      sources."parseqs-0.0.5"
+      sources."parseuri-0.0.5"
+      sources."parseurl-1.3.3"
+      sources."path-to-regexp-0.1.7"
+      sources."performance-now-2.1.0"
+      (sources."pg-7.18.2" // {
+        dependencies = [
+          sources."semver-4.3.2"
+        ];
+      })
+      sources."pg-connection-string-0.1.3"
+      sources."pg-int8-1.0.1"
+      sources."pg-packet-stream-1.1.0"
+      sources."pg-pool-2.0.10"
+      sources."pg-types-2.2.0"
+      sources."pgpass-1.0.2"
+      sources."postgres-array-2.0.0"
+      sources."postgres-bytea-1.0.0"
+      sources."postgres-date-1.0.5"
+      sources."postgres-interval-1.2.0"
+      sources."process-nextick-args-2.0.1"
+      sources."promise-1.3.0"
+      sources."proxy-addr-2.0.6"
+      sources."psl-1.8.0"
+      sources."punycode-2.1.1"
+      sources."qs-6.7.0"
+      sources."random-bytes-1.0.0"
+      sources."range-parser-1.2.1"
+      (sources."raw-body-2.4.0" // {
+        dependencies = [
+          sources."http-errors-1.7.2"
+          sources."inherits-2.0.3"
+        ];
+      })
+      sources."readable-stream-3.6.0"
+      sources."redis-3.0.2"
+      sources."redis-commands-1.5.0"
+      sources."redis-errors-1.2.0"
+      sources."redis-parser-3.0.0"
+      (sources."request-2.88.0" // {
+        dependencies = [
+          sources."qs-6.5.2"
+        ];
+      })
+      sources."resolve-1.1.7"
+      sources."rethinkdb-2.4.2"
+      sources."safe-buffer-5.2.0"
+      sources."safer-buffer-2.1.2"
+      sources."security-1.0.0"
+      sources."semver-5.6.0"
+      (sources."send-0.17.1" // {
+        dependencies = [
+          sources."ms-2.1.1"
+        ];
+      })
+      sources."serve-static-1.14.1"
+      sources."setprototypeof-1.1.1"
+      sources."slide-1.1.6"
+      (sources."socket.io-2.1.1" // {
+        dependencies = [
+          sources."debug-3.1.0"
+        ];
+      })
+      sources."socket.io-adapter-1.1.2"
+      (sources."socket.io-client-2.1.1" // {
+        dependencies = [
+          sources."debug-3.1.0"
+        ];
+      })
+      (sources."socket.io-parser-3.2.0" // {
+        dependencies = [
+          sources."debug-3.1.0"
+          sources."isarray-2.0.1"
+        ];
+      })
+      sources."source-map-0.6.1"
+      sources."split-1.0.1"
+      sources."sprintf-js-1.0.3"
+      sources."sqlstring-2.3.1"
+      sources."sshpk-1.16.1"
+      sources."statuses-1.5.0"
+      sources."string_decoder-1.3.0"
+      sources."strip-ansi-3.0.1"
+      sources."supports-color-2.0.0"
+      sources."swagger-parser-9.0.1"
+      sources."swagger-schema-official-2.0.0-bab6bed"
+      sources."through-2.3.8"
+      sources."tinycon-0.0.1"
+      sources."to-array-0.1.4"
+      sources."toidentifier-1.0.0"
+      (sources."tough-cookie-2.4.3" // {
+        dependencies = [
+          sources."punycode-1.4.1"
+        ];
+      })
+      sources."tunnel-agent-0.6.0"
+      sources."tweetnacl-0.14.5"
+      sources."type-is-1.6.18"
+      (sources."ueberdb2-0.4.5" // {
+        dependencies = [
+          sources."async-3.2.0"
+        ];
+      })
+      sources."uglify-js-3.8.1"
+      sources."uid-safe-2.1.5"
+      sources."ultron-1.1.1"
+      sources."underscore-1.8.3"
+      sources."unorm-1.4.1"
+      sources."unpipe-1.0.0"
+      sources."uri-js-4.2.2"
+      sources."util-deprecate-1.0.2"
+      sources."utils-merge-1.0.1"
+      sources."uuid-3.4.0"
+      sources."validator-12.2.0"
+      sources."vary-1.1.2"
+      sources."verror-1.10.0"
+      (sources."ws-3.3.3" // {
+        dependencies = [
+          sources."safe-buffer-5.1.2"
+        ];
+      })
+      sources."xmlhttprequest-ssl-1.5.5"
+      sources."xtend-4.0.2"
+      sources."yeast-0.1.2"
+      sources."z-schema-4.2.3"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "A free and open source realtime collaborative editor";
+      homepage = https://etherpad.org/;
+      license = "Apache-2.0";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = false;
+  };
+in
+{
+  args = args;
+  sources = sources;
+  tarball = nodeEnv.buildNodeSourceDist args;
+  package = nodeEnv.buildNodePackage args;
+  shell = nodeEnv.buildNodeShell args;
+}
similarity index 83%
rename from pkgs/webapps/grocy/default.nix
rename to flakes/grocy/default.nix
index f87f6ec0df20672dcac2ed16b0c497e366934eaa..26b6ed847f7a05118211e4899490a5df5096076e 100644 (file)
@@ -1,8 +1,9 @@
-{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, mylibs, runCommand, git, which, jq, yarn2nix-moretea }:
+{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, src, runCommand, git, which, jq, yarn2nix-moretea }:
 let
   version = "2.6.1-1";
-  packagesource = mylibs.fetchedGithub ./grocy.json;
-  patchedPackages = stdenv.mkDerivation (packagesource // rec {
+  patchedPackages = stdenv.mkDerivation rec {
+    name = "grocy";
+    inherit src;
     buildInputs = [ jq ];
     patches = [ ./yarn.patch ];
     installPhase = ''
@@ -10,7 +11,7 @@ let
       cat package.json | jq -r '.version = "${version}"' > $out/package.json
       cp yarn.lock $out/
       '';
-  });
+  };
   yarnModules = yarn2nix-moretea.mkYarnModules rec {
     name = "grocy-yarn";
     pname = name;
@@ -26,8 +27,9 @@ let
   };
   app = composerEnv.buildPackage (
     import ./php-packages.nix { inherit composerEnv fetchurl; } //
-    packagesource //
     {
+      name = "grocy";
+      inherit src;
       noDev = true;
       buildInputs = [ yarnModules ];
       postInstall = ''
diff --git a/flakes/grocy/flake.lock b/flakes/grocy/flake.lock
new file mode 100644 (file)
index 0000000..3ae40a7
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "grocy": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "grocy": "grocy",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/grocy/flake.nix b/flakes/grocy/flake.nix
new file mode 100644 (file)
index 0000000..da2f04f
--- /dev/null
@@ -0,0 +1,34 @@
+{
+  description = "ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.grocy = {
+    url = "github:grocy/grocy/d7738aa1ec330c81f11e4976681df0299d4ed35a";
+    flake = false;
+  };
+  outputs = { self, nixpkgs, grocy, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      composerEnv = pkgs.callPackage ../../pkgs/composer-env {};
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.grocy.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.grocy = callPackage ./. { inherit composerEnv; src = grocy // { inherit version; }; };
+      defaultPackage = packages.grocy;
+      legacyPackages.grocy = packages.grocy;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+    ) // rec {
+      overlays = {
+        grocy = final: prev: {
+          grocy = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.grocy;
+    };
+}
index 3e0b21e783188c4769e959d4f13da197fe1bc2a8..8ca5b9ffb7c5d6fbaafc7a63d4d096e428aac431 100644 (file)
@@ -2,11 +2,11 @@
   "nodes": {
     "nixpkgs": {
       "locked": {
-        "lastModified": 1631570365,
-        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
         "type": "github"
       },
       "original": {
index 8faa136898ce51107e1ab6156f96a1c3b1cf40de..a352c4c018a4a395c52cb600cc0cba4d452b2e1a 100644 (file)
@@ -4,25 +4,19 @@
   description = "Useful libs";
   outputs = { self, nixpkgs }: {
     lib = rec {
-      computeNarHash = path:
-        let pkgs = import nixpkgs {};
-        in
-          builtins.readFile (pkgs.runCommand "narHash" {
-            buildInputs = [ pkgs.nix ];
-          } "echo -n $(nix hash-path ${path}) > $out");
-
       withNarKeyCompat = flakeCompat: path: moduleAttrs:
         let module = (flakeCompat path).${moduleAttrs};
-            narHash = computeNarHash path;
+            key = builtins.hashString "sha256" (builtins.path { inherit path; name = "source"; });
         in if builtins.isFunction module
-          then args@{ config, lib, pkgs, ... }: (module args // { key = narHash; })
-          else module // { key = narHash; };
+          then args@{ config, lib, pkgs, ... }: (module args // { inherit key; })
+          else module // { inherit key; };
 
       withNarKey = dep: moduleAttrs:
         let module = dep.${moduleAttrs};
+            key = builtins.hashString "sha256" (builtins.path { path = dep.sourceInfo.outPath; name = "source"; });
         in if builtins.isFunction module
-          then args@{ config, lib, pkgs, ... }: (module args // { key = dep.narHash; })
-          else module // { key = dep.narHash; };
+          then args@{ config, lib, pkgs, ... }: (module args // { inherit key; })
+          else module // { inherit key; };
     };
   };
 }
similarity index 82%
rename from pkgs/webapps/mastodon/default.nix
rename to flakes/mastodon/default.nix
index ce015c5d7d4751d9525a1c152e6ab5d4278ff88b..80bae39b4d84f06b48f5267f7351852868ad40c6 100644 (file)
@@ -1,23 +1,21 @@
-{ varDir ? "/var/lib/mastodon", mylibs,
-  stdenv, writeText, runCommand,
+{ varDir ? "/var/lib/mastodon",
+  stdenv, src, writeText, runCommand,
   ruby_2_6, bundlerEnv, defaultGemConfig,
   jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn, yarn2nix-moretea }:
 let
-  info = mylibs.fetchedGithub ./mastodon.json // {
-    src = runCommand "mastodon-patched" {
-      source = (mylibs.fetchedGithub ./mastodon.json).src;
+  patched = runCommand "mastodon-patched" {
+      source = src;
     } ''
     cp -a $source $out
     chmod -R u+w $out
     sed -i -e "/fuubar/s/2.4.0/2.4.1/" $out/Gemfile.lock
     sed -i -e "s/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9#4255dc41fa7df9c3a02c1595f058e248bc37b784/" $out/yarn.lock
     '';
-  };
   gems = bundlerEnv {
     name = "mastodon-env";
     ruby = ruby_2_6;
     gemset = ./gemset.nix;
-    gemdir = info.src;
+    gemdir = patched;
     groups = [ "default" "production" "test" "development" ];
     gemConfig = defaultGemConfig // {
       redis-rack = attrs: {
@@ -43,15 +41,15 @@ let
   };
   yarnModules = let
     packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
-      cat ${info.src}/package.json | jq -r '.version = "${info.version}"' > $out
+      cat ${patched}/package.json | jq -r '.version = "${src.version}"' > $out
       '';
   in
     yarn2nix-moretea.mkYarnModules rec {
       name = "mastodon-yarn";
       pname = name;
-      version = info.version;
+      version = src.version;
       packageJSON = packagejson;
-      yarnLock = "${info.src}/yarn.lock";
+      yarnLock = "${patched}/yarn.lock";
       yarnNix = ./yarn-packages.nix;
       pkgConfig = {
         uws = {
@@ -61,13 +59,16 @@ let
         };
       };
     };
-  mastodon_with_yarn = stdenv.mkDerivation (info // rec {
+  mastodon_with_yarn = stdenv.mkDerivation {
+    pname = "mastodon";
+    version = src.version;
+    inherit src;
     installPhase = ''
       cp -a . $out
       cp -a ${yarnModules}/node_modules $out
     '';
     buildInputs = [ yarnModules ];
-  });
+  };
 in
 stdenv.mkDerivation {
   name = "mastodon";
@@ -88,5 +89,5 @@ stdenv.mkDerivation {
       ln -sf ${varDir}/tmp/cache tmp
   '';
   buildInputs = [ gems gems.ruby nodejs yarn ];
-  passthru = { inherit gems varDir; };
+  passthru = { inherit gems varDir nodejs; };
 }
diff --git a/flakes/mastodon/flake.lock b/flakes/mastodon/flake.lock
new file mode 100644 (file)
index 0000000..685a82a
--- /dev/null
@@ -0,0 +1,80 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mastodon": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "dir": "flakes/myuids",
+        "lastModified": 1636390024,
+        "narHash": "sha256-6T3re6sKcnla66im7UgG14UNa/Vvj6d/98JAOHbDpjQ=",
+        "ref": "master",
+        "rev": "fa25ffd4583cc362075cd5e1b4130f33306103f0",
+        "revCount": 901,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+      },
+      "original": {
+        "dir": "flakes/myuids",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "mastodon": "mastodon",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/mastodon/flake.nix b/flakes/mastodon/flake.nix
new file mode 100644 (file)
index 0000000..fb1842c
--- /dev/null
@@ -0,0 +1,333 @@
+{
+  description = "Your self-hosted, globally interconnected microblogging community";
+  inputs.myuids = {
+    url = "https://git.immae.eu/perso/Immae/Config/Nix.git";
+    type = "git";
+    dir = "flakes/myuids";
+  };
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.mastodon = {
+    url = "github:tootsuite/mastodon/v2.9.4";
+    flake = false;
+  };
+
+  outputs = { self, myuids, nixpkgs, mastodon, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mastodon.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.mastodon = callPackage ./. { src = mastodon // { inherit version; }; };
+      defaultPackage = packages.mastodon;
+      legacyPackages.mastodon = packages.mastodon;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      mastodon = final: prev: {
+        mastodon = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.mastodon;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "mastodon";
+        cfg = config.immaeServices.mastodon;
+      in
+        {
+          options.immaeServices.mastodon = {
+            enable = lib.mkEnableOption "Enable Mastodon’s service";
+            user = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "User account under which Mastodon runs";
+            };
+            group = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "Group under which Mastodon runs";
+            };
+            dataDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/var/lib/${name}";
+              description = ''
+                The directory where Mastodon stores its data.
+              '';
+            };
+            socketsPrefix = lib.mkOption {
+              type = lib.types.str;
+              default = "live";
+              description = ''
+                The prefix to use for Mastodon sockets.
+                '';
+            };
+            socketsDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/run/${name}";
+              description = ''
+                The directory where Mastodon puts runtime files and sockets.
+                '';
+            };
+            configFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The configuration file path for Mastodon.
+                '';
+            };
+            package = lib.mkOption {
+              type = lib.types.package;
+              default = pkgs.mastodon;
+              description = ''
+                Mastodon package to use.
+                '';
+            };
+            # Output variables
+            workdir = lib.mkOption {
+              type = lib.types.package;
+              default = cfg.package.override { varDir = cfg.dataDir; };
+              description = ''
+              Adjusted mastodon package with overriden varDir
+              '';
+              readOnly = true;
+            };
+            systemdStateDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if varDir is outside of /var/lib
+              default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+                lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+              description = ''
+              Adjusted Mastodon data directory for systemd
+              '';
+              readOnly = true;
+            };
+            systemdRuntimeDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if socketsDir is outside of /run
+              default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+                lib.strings.removePrefix "/run/" cfg.socketsDir;
+              description = ''
+              Adjusted Mastodon sockets directory for systemd
+              '';
+              readOnly = true;
+            };
+            sockets = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                node  = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
+                rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
+              };
+              readOnly = true;
+              description = ''
+                Mastodon sockets
+                '';
+            };
+          };
+
+          config = lib.mkIf cfg.enable {
+            nixpkgs.overlays = [ self.overlay ];
+            users.users = lib.optionalAttrs (cfg.user == name) {
+              "${name}" = {
+                uid = myuids.lib.uids.mastodon;
+                group = cfg.group;
+                description = "Mastodon user";
+                home = cfg.dataDir;
+                useDefaultShell = true;
+              };
+            };
+            users.groups = lib.optionalAttrs (cfg.group == name) {
+              "${name}" = {
+                gid = myuids.lib.gids.mastodon;
+              };
+            };
+
+            systemd.slices.mastodon = {
+              description = "Mastodon slice";
+            };
+
+            systemd.services.mastodon-streaming = {
+              description = "Mastodon Streaming";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" "mastodon-web.service" ];
+
+              environment.NODE_ENV = "production";
+              environment.SOCKET = cfg.sockets.node;
+
+              path = [ cfg.workdir.nodejs pkgs.bashInteractive ];
+
+              script = ''
+                exec npm run start
+              '';
+
+              postStart = ''
+                while [ ! -S $SOCKET ]; do
+                  sleep 0.5
+                done
+                chmod a+w $SOCKET
+              '';
+
+              postStop = ''
+                rm $SOCKET
+              '';
+
+              serviceConfig = {
+                Slice = "mastodon.slice";
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Restart = "always";
+                TimeoutSec = 15;
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            systemd.services.mastodon-web = {
+              description = "Mastodon Web app";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" ];
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.SOCKET = cfg.sockets.rails;
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ];
+
+              preStart = ''
+                install -m 0755 -d ${cfg.dataDir}/tmp/cache
+                ./bin/bundle exec rails db:migrate
+              '';
+
+              script = ''
+                exec ./bin/bundle exec puma -C config/puma.rb
+              '';
+
+              postStart = ''
+                exec ./bin/tootctl cache clear
+                '';
+              serviceConfig = {
+                Slice = "mastodon.slice";
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Restart = "always";
+                TimeoutSec = 60;
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            # To be run manually because computationnally heavy
+            systemd.services.mastodon-cleanup-manual = {
+              description = "Cleanup mastodon";
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.SOCKET = cfg.sockets.rails;
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
+
+              script = ''
+                exec ./bin/tootctl statuses remove --days 365
+              '';
+
+              serviceConfig = {
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Type = "oneshot";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            systemd.services.mastodon-cleanup = {
+              description = "Cleanup mastodon";
+              startAt = "daily";
+              restartIfChanged = false;
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.SOCKET = cfg.sockets.rails;
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
+
+              script = ''
+                exec ./bin/tootctl media remove --days 30
+              '';
+
+              serviceConfig = {
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Type = "oneshot";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            systemd.services.mastodon-sidekiq = {
+              description = "Mastodon Sidekiq";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" "mastodon-web.service" ];
+
+              environment.RAILS_ENV="production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.DB_POOL="5";
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
+
+              script = ''
+                exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
+              '';
+
+              serviceConfig = {
+                Slice = "mastodon.slice";
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Restart = "always";
+                TimeoutSec = 15;
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+          };
+        };
+      };
+}
+
+
diff --git a/flakes/mediagoblin/bower-packages.nix b/flakes/mediagoblin/bower-packages.nix
new file mode 100644 (file)
index 0000000..03af849
--- /dev/null
@@ -0,0 +1,8 @@
+# Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
+{ fetchbower, buildEnv }:
+buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
+  (fetchbower "jquery" "2.1.4" "~2.1.3" "1ywrpk2xsr6ghkm3j9gfnl9r3jn6xarfamp99b0bcm57kq9fm2k0")
+  (fetchbower "video.js" "4.11.4" "~4.11.4" "05prdvyk0rxbkh7sdd0d9ns5l5crwvc68wzkyqmrdjw367pcv8sn")
+  (fetchbower "leaflet" "0.7.7" "~0.7.3" "0jim285bljmxxngpm3yx6bnnd10n2whwkgmmhzpcd1rdksnr5nca")
+  (fetchbower "tinymce" "4.1.10" "~4.1.7" "16jyvdb9bq8gjwhs69q8p88vdixalajrz81nsmbrzzxhkih57dyx")
+]; }
diff --git a/flakes/mediagoblin/default.nix b/flakes/mediagoblin/default.nix
new file mode 100644 (file)
index 0000000..f50d1c3
--- /dev/null
@@ -0,0 +1,213 @@
+{ src, makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit, fetchFromGitHub }:
+let
+  overridePython = let
+    packageOverrides = self: super: {
+      pybcrypt = super.buildPythonPackage rec {
+        pname = "pybcrypt";
+        version = "0.4";
+
+        src = self.fetchPypi {
+          inherit pname version;
+          sha256 = "5fa13bce551468350d66c4883694850570f3da28d6866bb638ba44fe5eabda78";
+        };
+      };
+      celery = super.celery.overridePythonAttrs(old: rec {
+        version = "3.1.26.post2";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "5493e172ae817b81ba7d09443ada114886765a8ce02f16a56e6fac68d953a9b2";
+        };
+        patches = [];
+        doCheck = false;
+      });
+      billiard = super.billiard.overridePythonAttrs(old: rec {
+        version = "3.3.0.23";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "02wxsc6bhqvzh8j6w758kvgqbnj14l796mvmrcms8fgfamd2lak9";
+        };
+        doCheck = false;
+        doInstallCheck = false;
+      });
+      amqp = super.amqp.overridePythonAttrs(old: rec {
+        version = "1.4.9";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "2dea4d16d073c902c3b89d9b96620fb6729ac0f7a923bbc777cb4ad827c0c61a";
+        };
+        doCheck = false;
+      });
+      kombu = super.kombu.overridePythonAttrs(old: rec {
+        version = "3.0.37";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "e064a00c66b4d1058cd2b0523fb8d98c82c18450244177b6c0f7913016642650";
+        };
+        propagatedBuildInputs = old.propagatedBuildInputs ++ [ self.anyjson ];
+        doCheck = false;
+      });
+      markdown = super.markdown.overridePythonAttrs(old: rec {
+        version = "3.1.1";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a";
+        };
+      });
+      sqlalchemy = super.sqlalchemy.overridePythonAttrs(old: rec {
+        version = "1.1.18";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "8b0ec71af9291191ba83a91c03d157b19ab3e7119e27da97932a4773a3f664a9";
+        };
+        doCheck = false;
+      });
+      tempita_5_3_dev = super.buildPythonPackage rec {
+        version = "47414a7-master";
+        pname = "tempita";
+        name = "${pname}-${version}";
+        src = fetchFromGitHub {
+          owner = "gjhiggins";
+          repo = "tempita";
+          rev = "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d";
+          sha256 = "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn";
+          fetchSubmodules = true;
+        };
+        buildInputs = with self; [ nose ];
+        disabled = false;
+      };
+      sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec {
+        propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ];
+      });
+      pasteScript = super.pasteScript.overridePythonAttrs(old: rec {
+        version = "2.0.2";
+        name = "PasteScript-${version}";
+        src = fetchurl {
+          url = "mirror://pypi/P/PasteScript/${name}.tar.gz";
+          sha256 = "1h3nnhn45kf4pbcv669ik4faw04j58k8vbj1hwrc532k0nc28gy0";
+        };
+        propagatedBuildInputs = with self; [ six paste PasteDeploy ];
+      });
+      werkzeug = super.werkzeug.overridePythonAttrs(old: rec {
+        version = "0.16.1";
+        src = self.fetchPypi {
+          inherit version;
+          inherit (old) pname;
+          sha256 = "b353856d37dec59d6511359f97f6a4b2468442e454bd1c98298ddce53cac1f04";
+        };
+      });
+    };
+    in
+      python36.override { inherit packageOverrides; };
+  pythonEnv = python-pkgs: with python-pkgs; [
+    waitress alembic dateutil wtforms pybcrypt
+    pytest pytest_xdist werkzeug celery
+    kombu jinja2 Babel webtest configobj markdown
+    sqlalchemy itsdangerous pytz sphinx six
+    oauthlib unidecode jsonschema PasteDeploy
+    requests PyLD exifread
+    typing pasteScript lxml
+    # For images plugin
+    pillow
+    # For video plugin
+    gst-python
+    # migrations
+    sqlalchemy_migrate
+    # authentication
+    ldap3
+    redis
+    psycopg2
+  ];
+  python = overridePython.withPackages pythonEnv;
+  gmg = writeScript "gmg" ''
+    #!${python}/bin/python
+    __requires__ = 'mediagoblin'
+    import sys
+    from pkg_resources import load_entry_point
+
+    if __name__ == '__main__':
+        sys.exit(
+            load_entry_point('mediagoblin', 'console_scripts', 'gmg')()
+        )
+    '';
+  bowerComponents = buildBowerComponents {
+    name = "mediagoblin-bower-components";
+    generated = ./bower-packages.nix;
+    inherit src;
+  };
+  pluginNames = [ "basicsearch" ];
+  allPlugins = lib.attrsets.genAttrs pluginNames
+    (name: callPackage (./plugins + "/${name}") {});
+  toPassthru = pkg: {
+    inherit allPlugins;
+    withPlugins = withPlugins pkg;
+  };
+  withPlugins = pkg: toPlugins:
+    let
+      plugins = toPlugins allPlugins;
+      toBuildPlugin = n: "ln -s ${n} mediagoblin/plugins/${n.pluginName}";
+      newMediagoblin = pkg.overrideAttrs(old: {
+        postBuild = old.postBuild + "\n" + builtins.concatStringsSep "\n" (map toBuildPlugin plugins);
+        passthru = toPassthru newMediagoblin;
+      });
+    in newMediagoblin;
+  package = stdenv.mkDerivation rec {
+    pname = "mediagoblin";
+    name = "${pname}-${version}";
+    version = "cd465eb-stable";
+    inherit src;
+    preConfigure = ''
+      # ./bootstrap.sh
+      aclocal -I m4 --install
+      autoreconf -fvi
+      # end
+      export HOME=$PWD
+      '';
+    configureFlags = [ "--with-python3" "--without-virtualenv" ];
+    postBuild = ''
+      cp -a ${bowerComponents}/bower_components/* extlib
+      chmod -R u+w extlib
+      make extlib
+      '';
+    installPhase = let
+      libpaths = with gst_all_1; [
+        python
+        gstreamer
+        gst-plugins-base
+        gst-libav
+        gst-plugins-good
+        gst-plugins-bad
+        gst-plugins-ugly
+      ];
+      plugin_paths = builtins.concatStringsSep ":" (map (x: "${x}/lib") libpaths);
+      typelib_paths = with gst_all_1; "${gstreamer}/lib/girepository-1.0:${gst-plugins-base}/lib/girepository-1.0";
+    in ''
+      sed -i "s/registry.has_key(current_theme_name)/current_theme_name in registry/" mediagoblin/tools/theme.py
+      sed -i -e "s@\[DEFAULT\]@[DEFAULT]\nhere = $out@" mediagoblin/config_spec.ini
+      sed -i -e "/from gi.repository import GstPbutils/s/^/gi.require_version('GstPbutils', '1.0')\n/" mediagoblin/media_types/video/transcoders.py
+      cp ${./ldap_fix.py} mediagoblin/plugins/ldap/tools.py
+      find . -name '*.pyc' -delete
+      find . -type f -exec sed -i "s|$PWD|$out|g" {} \;
+      python setup.py build
+      cp -a . $out
+      mkdir $out/bin
+      makeWrapper ${gmg} $out/bin/gmg --prefix PYTHONPATH : "$out:$PYTHONPATH" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
+        --prefix GI_TYPELIB_PATH : ${typelib_paths}
+      makeWrapper ${python}/bin/paster $out/bin/paster --prefix PYTHONPATH : "$out:$PYTHONPATH" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
+        --prefix GI_TYPELIB_PATH : ${typelib_paths}
+      makeWrapper ${python}/bin/celery $out/bin/celery --prefix PYTHONPATH : "$out:$PYTHONPATH" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
+        --prefix GI_TYPELIB_PATH : ${typelib_paths}
+      '';
+    buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ];
+    propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ];
+    passthru = toPassthru package;
+  };
+in package
diff --git a/flakes/mediagoblin/flake.lock b/flakes/mediagoblin/flake.lock
new file mode 100644 (file)
index 0000000..a822299
--- /dev/null
@@ -0,0 +1,83 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mediagoblin": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "dir": "flakes/myuids",
+        "lastModified": 1636390024,
+        "narHash": "sha256-6T3re6sKcnla66im7UgG14UNa/Vvj6d/98JAOHbDpjQ=",
+        "ref": "master",
+        "rev": "fa25ffd4583cc362075cd5e1b4130f33306103f0",
+        "revCount": 901,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+      },
+      "original": {
+        "dir": "flakes/myuids",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "mediagoblin": "mediagoblin",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/mediagoblin/flake.nix b/flakes/mediagoblin/flake.nix
new file mode 100644 (file)
index 0000000..4df7da4
--- /dev/null
@@ -0,0 +1,273 @@
+{
+  description = "a free software media publishing platform that anyone can run.";
+  inputs.myuids = {
+    url = "https://git.immae.eu/perso/Immae/Config/Nix.git";
+    type = "git";
+    dir = "flakes/myuids";
+  };
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.mediagoblin = {
+    url = "git+https://git.savannah.gnu.org/git/mediagoblin.git?submodules=1&ref=stable&rev=cd465ebfec837a75a44c4ebd727dffe2fff6d850";
+    flake = false;
+  };
+
+  outputs = { self, myuids, nixpkgs, mediagoblin, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mediagoblin.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.mediagoblin = callPackage ./. { src = mediagoblin // { inherit version; }; };
+      defaultPackage = packages.mediagoblin;
+      legacyPackages.mediagoblin = packages.mediagoblin;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      mediagoblin = final: prev: {
+        mediagoblin = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.mediagoblin;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "mediagoblin";
+        cfg = config.services.mediagoblin;
+
+        uid = config.ids.uids.mediagoblin;
+        gid = config.ids.gids.mediagoblin;
+
+        paste_local = pkgs.writeText "paste_local.ini" ''
+          [DEFAULT]
+          debug = false
+
+          [pipeline:main]
+          pipeline = mediagoblin
+
+          [app:mediagoblin]
+          use = egg:mediagoblin#app
+          config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini
+          /mgoblin_static = ${cfg.package}/mediagoblin/static
+
+          [loggers]
+          keys = root
+
+          [handlers]
+          keys = console
+
+          [formatters]
+          keys = generic
+
+          [logger_root]
+          level = INFO
+          handlers = console
+
+          [handler_console]
+          class = StreamHandler
+          args = (sys.stderr,)
+          level = NOTSET
+          formatter = generic
+
+          [formatter_generic]
+          format = %(levelname)-7.7s [%(name)s] %(message)s
+
+          [filter:errors]
+          use = egg:mediagoblin#errors
+          debug = false
+
+          [server:main]
+          use = egg:waitress#main
+          unix_socket = ${cfg.sockets.paster}
+          unix_socket_perms = 777
+          url_scheme = https
+          '';
+      in
+      {
+        options.services.mediagoblin = {
+          enable = lib.mkEnableOption "Enable Mediagoblin’s service";
+          user = lib.mkOption {
+            type = lib.types.str;
+            default = name;
+            description = "User account under which Mediagoblin runs";
+          };
+          group = lib.mkOption {
+            type = lib.types.str;
+            default = name;
+            description = "Group under which Mediagoblin runs";
+          };
+          dataDir = lib.mkOption {
+            type = lib.types.path;
+            default = "/var/lib/${name}";
+            description = ''
+              The directory where Mediagoblin stores its data.
+            '';
+          };
+          socketsDir = lib.mkOption {
+            type = lib.types.path;
+            default = "/run/${name}";
+            description = ''
+              The directory where Mediagoblin puts runtime files and sockets.
+              '';
+          };
+          configFile = lib.mkOption {
+            type = lib.types.path;
+            description = ''
+              The configuration file path for Mediagoblin.
+              '';
+          };
+          package = lib.mkOption {
+            type = lib.types.package;
+            default = pkgs.mediagoblin;
+            example = lib.literalExample ''
+              pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch])
+            '';
+            description = ''
+              Mediagoblin package to use.
+              '';
+          };
+          systemdStateDirectory = lib.mkOption {
+            type = lib.types.str;
+            # Use ReadWritePaths= instead if varDir is outside of /var/lib
+            default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+              lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+            description = ''
+            Adjusted Mediagoblin data directory for systemd
+            '';
+            readOnly = true;
+          };
+          systemdRuntimeDirectory = lib.mkOption {
+            type = lib.types.str;
+            # Use ReadWritePaths= instead if socketsDir is outside of /run
+            default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+              lib.strings.removePrefix "/run/" cfg.socketsDir;
+            description = ''
+            Adjusted Mediagoblin sockets directory for systemd
+            '';
+            readOnly = true;
+          };
+          sockets = lib.mkOption {
+            type = lib.types.attrsOf lib.types.path;
+            default = {
+              paster = "${cfg.socketsDir}/mediagoblin.sock";
+            };
+            readOnly = true;
+            description = ''
+              Mediagoblin sockets
+              '';
+          };
+          pids = lib.mkOption {
+            type = lib.types.attrsOf lib.types.path;
+            default = {
+              paster = "${cfg.socketsDir}/mediagoblin.pid";
+              celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
+            };
+            readOnly = true;
+            description = ''
+              Mediagoblin pid files
+              '';
+          };
+        };
+
+        config = lib.mkIf cfg.enable {
+          nixpkgs.overlays = [ self.overlay ];
+          users.users = lib.optionalAttrs (cfg.user == name) {
+            "${name}" = {
+              inherit uid;
+              group = cfg.group;
+              description = "Mediagoblin user";
+              home = cfg.dataDir;
+              useDefaultShell = true;
+            };
+          };
+          users.groups = lib.optionalAttrs (cfg.group == name) {
+            "${name}" = {
+              inherit gid;
+            };
+          };
+
+          systemd.slices.mediagoblin = {
+            description = "Mediagoblin slice";
+          };
+          systemd.services.mediagoblin-web = {
+            description = "Mediagoblin service";
+            wantedBy = [ "multi-user.target" ];
+            after = [ "network.target" ];
+            wants = [ "postgresql.service" "redis.service" ];
+
+            environment.SCRIPT_NAME = "/mediagoblin/";
+
+            script = ''
+              exec ./bin/paster serve \
+                ${paste_local} \
+                --pid-file=${cfg.pids.paster}
+              '';
+            preStop = ''
+              exec ./bin/paster serve \
+                --pid-file=${cfg.pids.paster} \
+                ${paste_local} stop
+              '';
+            preStart = ''
+              if [ -d ${cfg.dataDir}/plugin_static/ ]; then
+                rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
+                ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
+              fi
+              ./bin/gmg -cf ${cfg.configFile} dbupdate
+              '';
+
+            serviceConfig = {
+              Slice = "mediagoblin.slice";
+              User = cfg.user;
+              PrivateTmp = true;
+              Restart = "always";
+              TimeoutSec = 15;
+              Type = "simple";
+              WorkingDirectory = cfg.package;
+              RuntimeDirectory = cfg.systemdRuntimeDirectory;
+              StateDirectory= cfg.systemdStateDirectory;
+              PIDFile = cfg.pids.paster;
+            };
+
+            unitConfig.RequiresMountsFor = cfg.dataDir;
+          };
+
+          systemd.services.mediagoblin-celeryd = {
+            description = "Mediagoblin service";
+            wantedBy = [ "multi-user.target" ];
+            after = [ "network.target" "mediagoblin-web.service" ];
+
+            environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
+            environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
+
+            script = ''
+              exec ./bin/celery worker \
+                --logfile=${cfg.dataDir}/celery.log \
+                --loglevel=INFO
+              '';
+
+            serviceConfig = {
+              Slice = "mediagoblin.slice";
+              User = cfg.user;
+              PrivateTmp = true;
+              Restart = "always";
+              TimeoutSec = 60;
+              Type = "simple";
+              WorkingDirectory = cfg.package;
+              RuntimeDirectory = cfg.systemdRuntimeDirectory;
+              StateDirectory= cfg.systemdStateDirectory;
+              PIDFile = cfg.pids.celery;
+            };
+
+            unitConfig.RequiresMountsFor = cfg.dataDir;
+          };
+        };
+      };
+  };
+}
+
+
diff --git a/flakes/mediagoblin/ldap_fix.py b/flakes/mediagoblin/ldap_fix.py
new file mode 100644 (file)
index 0000000..10cc375
--- /dev/null
@@ -0,0 +1,93 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors.  See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from ldap3 import Server, Connection, SUBTREE
+from ldap3.core.exceptions import LDAPException
+import logging
+
+import six
+
+from mediagoblin.tools import pluginapi
+
+_log = logging.getLogger(__name__)
+
+
+class LDAP(object):
+    def __init__(self):
+        self.ldap_settings = pluginapi.get_config('mediagoblin.plugins.ldap')
+
+    def _connect(self, server):
+        _log.info('Connecting to {0}.'.format(server['LDAP_SERVER_URI']))
+        self.server = Server(server['LDAP_SERVER_URI'])
+
+        if 'LDAP_START_TLS' in server and server['LDAP_START_TLS'] == 'true':
+            _log.info('Initiating TLS')
+            self.server.start_tls()
+
+    def _manager_auth(self, settings, username, password):
+        conn = Connection(self.server,
+                settings['LDAP_BIND_DN'],
+                settings['LDAP_BIND_PW'],
+                auto_bind=True)
+        found = conn.search(
+                search_base=settings['LDAP_SEARCH_BASE'],
+                search_filter=settings['LDAP_SEARCH_FILTER'].format(username=username),
+                search_scope=SUBTREE,
+                attributes=[settings['EMAIL_SEARCH_FIELD']])
+        if (not found) or len(conn.entries) > 1:
+            return False, None
+
+        user = conn.entries[0]
+        user_dn = user.entry_dn
+        try:
+            email = user.entry_attributes_as_dict[settings['EMAIL_SEARCH_FIELD']][0]
+        except KeyError:
+            email = None
+
+        Connection(self.server, user_dn, password, auto_bind=True)
+
+        return username, email
+
+    def _direct_auth(self, settings, username, password):
+        user_dn = settings['LDAP_USER_DN_TEMPLATE'].format(username=username)
+        conn = Connection(self.server, user_dn, password, auto_bind=True)
+        email_found = conn.search(
+                search_base=settings['LDAP_SEARCH_BASE'],
+                search_filter='uid={0}'.format(username),
+                search_scope=SUBTREE,
+                attributes=[settings['EMAIL_SEARCH_FIELD']])
+
+        if email_found:
+            try:
+                email = conn.entries[0].entry_attributes_as_dict[settings['EMAIL_SEARCH_FIELD']][0]
+            except KeyError:
+                email = None
+
+        return username, email
+
+    def login(self, username, password):
+        for k, v in six.iteritems(self.ldap_settings):
+            try:
+                self._connect(v)
+
+                if 'LDAP_BIND_DN' in v:
+                    return self._manager_auth(v, username, password)
+                else:
+                    return self._direct_auth(v, username, password)
+
+            except LDAPException as e:
+                _log.info(e)
+
+        return False, None
diff --git a/flakes/mediagoblin/plugins/basicsearch/default.nix b/flakes/mediagoblin/plugins/basicsearch/default.nix
new file mode 100644 (file)
index 0000000..16be613
--- /dev/null
@@ -0,0 +1,18 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  name = "mediagoblin-plugin-basicsearch-${version}";
+  version = "ba0a154-master";
+  src = fetchFromGitHub {
+    owner = "ayleph";
+    repo = "mediagoblin-basicsearch";
+    rev = "ba0a1547bd24ebaf363227fe17644d38c6ce8a6b";
+    sha256 = "0d4r7xkf4gxmgaxlb264l44xbanis77g49frwfhfzsflxmdwgncy";
+  };
+  phases = "unpackPhase installPhase";
+  installPhase = ''
+    cp -R ./basicsearch $out
+    '';
+  passthru = {
+    pluginName = "basicsearch";
+  };
+}
similarity index 88%
rename from pkgs/python-packages/buildbot/plugins/buildslist/default.nix
rename to flakes/private/buildbot/buildslist/default.nix
index 4ab4c5474689db480f61c0263d6da98e0f03a6a6..7f725033ecc1a88ccca86c1f9dcc53b465561289 100644 (file)
@@ -1,16 +1,15 @@
-{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, libsass, python, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, sources }:
+{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, buildslist_src }:
 let
   yarn2nix-moretea' = yarn2nix-moretea.override({
     yarn = yarn.override({ nodejs = nodejs-10_x; });
     nodejs = nodejs-10_x;
   });
-  buildslist_src = sources.buildbot-plugin-buildslist;
   packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
     cat ${buildslist_src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"|.license= "MIT"' > $out
     '';
   nodeHeaders = fetchurl {
     url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz";
-    sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c";
+    sha256 = "sha256-LEk6BOW/vwdUXGAialDOoyFIkZ81k6ADy6MhMfRiE5Y=";
   };
   buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec {
     name = "buildslist-yarn-modules";
@@ -21,7 +20,7 @@ let
     yarnNix = ./yarn-packages.nix;
     pkgConfig = {
       node-sass = {
-        buildInputs = [ libsass python ];
+        buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ];
         postInstall =
           ''
             node scripts/build.js --tarball=${nodeHeaders}
diff --git a/flakes/private/buildbot/flake.lock b/flakes/private/buildbot/flake.lock
new file mode 100644 (file)
index 0000000..8952f75
--- /dev/null
@@ -0,0 +1,61 @@
+{
+  "nodes": {
+    "buildslist": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "buildslist": "buildslist",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/buildbot/flake.nix b/flakes/private/buildbot/flake.nix
new file mode 100644 (file)
index 0000000..eb699a0
--- /dev/null
@@ -0,0 +1,73 @@
+{
+  description = "The continuous integration framework";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.buildslist = {
+    url = "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist";
+    type = "git";
+    flake = false;
+  };
+  outputs = { self, nixpkgs, flake-utils, buildslist }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      python = pkgs.python38;
+      wokkel = python.pkgs.buildPythonPackage rec {
+        pname = "wokkel";
+        version = "18.0.0";
+        src = python.pkgs.fetchPypi {
+          inherit pname version;
+          sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
+        };
+        propagatedBuildInputs = with python.pkgs; [ twisted.extras.tls twisted incremental dateutil ];
+        doCheck = false;
+      };
+      buildbot_common = python.pkgs.buildPythonPackage {
+        name = "buildbot_common";
+        src = ../../../modules/private/buildbot/common;
+        format = "other";
+        installPhase = ''
+          mkdir -p $out/${python.sitePackages}
+          cp -a $src $out/${python.sitePackages}/buildbot_common
+        '';
+      };
+      buildbot-full = python.pkgs.buildbot-full.withPlugins [ buildslist-plugin ] // {
+        inherit buildbot_common;
+        buildbot_config = project: python.pkgs.buildPythonPackage (rec {
+          name = "buildbot_config-${project.name}";
+          src = ../../../modules/private/buildbot/projects + "/${project.name}";
+          format = "other";
+          installPhase = ''
+            mkdir -p $out/${python.sitePackages}
+            cp -a $src $out/${python.sitePackages}/buildbot_config
+            '';
+        });
+        common_packages = pkgs: [
+          pkgs.libvirt pkgs.treq pkgs.ldap3 buildbot-full
+          pkgs.buildbot-worker pkgs.pip buildbot_common wokkel
+        ];
+      };
+      buildslist-plugin = pkgs.callPackage ./buildslist {
+        pythonPackages = python.pkgs;
+        buildslist_src = buildslist;
+      };
+    in rec {
+      packages = {
+        buildslist = buildslist-plugin;
+        buildbot-full = buildbot-full;
+        buildbot_common = buildbot_common;
+      };
+      defaultPackage = packages.buildbot-full;
+      legacyPackages = packages;
+      checks = packages;
+    }) // rec {
+      overlays = {
+        immae-buildbot = final: prev: {
+          immae-buildbot = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.immae-buildbot;
+    };
+}
similarity index 71%
rename from pkgs/webapps/surfer/default.nix
rename to flakes/surfer/default.nix
index 9a04da5347740e3f7972ddc34c3a6ca43ef50a40..7a25199865df3402204ac7dcd400cc01b08c34de 100644 (file)
@@ -1,9 +1,9 @@
-{ callPackage, mylibs, sources }:
+{ callPackage, nodeEnv, src }:
 # built using node2nix -l package-lock.json
 # and changing "./." to "src"
 (callPackage ./node-packages.nix {
-  src = sources.webapps-surfer;
-  nodeEnv = callPackage mylibs.nodeEnv {};
+  inherit src;
+  nodeEnv = callPackage nodeEnv {};
 }).package.overrideAttrs(old: {
   postInstall = ''
     mkdir -p $out/bin
diff --git a/flakes/surfer/flake.lock b/flakes/surfer/flake.lock
new file mode 100644 (file)
index 0000000..088b082
--- /dev/null
@@ -0,0 +1,61 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "surfer": "surfer"
+      }
+    },
+    "surfer": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/surfer/flake.nix b/flakes/surfer/flake.nix
new file mode 100644 (file)
index 0000000..e6a7322
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  description = "Surfer is a Simple static file server";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.surfer = {
+    url = "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git";
+    type = "git";
+    rev = "476177380452c9c7c5b1624805feedc824c5995e";
+    flake = false;
+  };
+  outputs = { self, nixpkgs, surfer, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      nodeEnv = import ../../lib/node-env.nix;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.surfer = callPackage ./. { inherit nodeEnv; src = surfer; };
+      defaultPackage = packages.surfer;
+      legacyPackages.surfer = packages.surfer;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+    ) // rec {
+      overlays = {
+        surfer = final: prev: {
+          surfer = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.surfer;
+    };
+}
similarity index 75%
rename from pkgs/webapps/taskwarrior-web/default.nix
rename to flakes/taskwarrior-web/default.nix
index d5368c58c32580f57ccdbbe08935c1178e86d538..7678b3c6e556270d5902948327742a99c4544006 100644 (file)
@@ -1,4 +1,4 @@
-{ ruby_2_6, bundlerEnv, mylibs, stdenv }:
+{ ruby_2_6, bundlerEnv, src, stdenv }:
 let
   gems = bundlerEnv {
     name = "taskwarrior-web-env";
@@ -8,7 +8,10 @@ let
     gemdir = package.out;
     groups = [ "default" "local" "development" ];
   };
-  package = stdenv.mkDerivation (mylibs.fetchedGithub ./taskwarrior-web.json // rec {
+  package = stdenv.mkDerivation {
+    pname = "taskwarrior-web";
+    version = src.shortRev;
+    inherit src;
     phases = [ "unpackPhase" "patchPhase" "installPhase" ];
     patches = [ ./fixes.patch ./thin.patch ];
     installPhase = ''
@@ -18,5 +21,5 @@ let
     passthru = {
       inherit gems;
     };
-  });
+  };
 in package
similarity index 56%
rename from pkgs/webapps/taskwarrior-web/fixes.patch
rename to flakes/taskwarrior-web/fixes.patch
index 851f9f05ffc0110e953df5d1c877074faae3f913..c4cea34f868876d5954cbdd58dc5940e1f7d2b11 100644 (file)
@@ -11,6 +11,25 @@ index 212aed7..94c57df 100644
    def format_date(timestamp)
      format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y'
      Time.parse(timestamp).localtime.strftime(format)
+diff --git a/lib/taskwarrior-web/model/task.rb b/lib/taskwarrior-web/model/task.rb
+index 212aed7..94c57df 100644
+--- a/lib/taskwarrior-web/model/task.rb
++++ b/lib/taskwarrior-web/model/task.rb
+@@ -15,8 +15,14 @@
+     def initialize(attributes = {})
+       attributes.each do |attr, value|
++        if attr == "uuid"
++          next
++        end
+         send("#{attr}=", value) if respond_to?(attr.to_sym)
+       end
++      if attributes.has_key? "uuid"
++        send("uuid=", attributes["uuid"])
++      end
+       @_errors = []
+       @tags = [] if @tags.nil?
 diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb
 index 58d246e..8f716ac 100644
 --- a/lib/taskwarrior-web/services/builder/base.rb
@@ -24,6 +43,44 @@ index 58d246e..8f716ac 100644
      :tags => '_tags',
      :sync => 'sync'
    }
+@@ -21,7 +21,7 @@
+       substitute_parts if @command_string =~ /:id/
+     end
+     parse_params
+-    @built = "#{@command_string}#{@params}"
++    @built = "#{@params}#{@command_string}"
+   end
+   def task_command
+@@ -43,23 +43,23 @@
+   def parse_params
+     string = ''
+-    string << %( #{@params.delete(:description).shellescape}) if @params.has_key?(:description)
++    string << %(#{@params.delete(:description).shellescape} ) if @params.has_key?(:description)
+     if tags = @params.delete(:tags)
+       tag_indicator = TaskwarriorWeb::Config.property('tag.indicator') || '+'
+-      tags.each { |tag| string << %( #{tag_indicator}#{tag.to_s.shellescape}) }
++      tags.each { |tag| string << %(#{tag_indicator}#{tag.to_s.shellescape} ) }
+     end
+     if tags = @params.delete(:remove_tags)
+-      tags.each { |tag| string << %( -#{tag.to_s.shellescape}) } 
++      tags.each { |tag| string << %(-#{tag.to_s.shellescape} ) } 
+     end
+     @params.each do |attr, value|
+       if @command != :update or attr != :uuid
+         if value.respond_to? :each
+-          value.each { |val| string << %( #{attr.to_s}:\\"#{val.to_s.shellescape}\\") }
++          value.each { |val| string << %(#{attr.to_s}:\\"#{val.to_s.shellescape}\\" ) }
+         else
+-          string << %( #{attr.to_s}:\\"#{value.to_s.shellescape}\\")
++          string << %(#{attr.to_s}:\\"#{value.to_s.shellescape}\\" )
+         end
+       end
+     end
 diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb
 index 789e7a1..fa08698 100644
 --- a/lib/taskwarrior-web/views/tasks/_form.erb
diff --git a/flakes/taskwarrior-web/flake.lock b/flakes/taskwarrior-web/flake.lock
new file mode 100644 (file)
index 0000000..ce87931
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "taskwarrior-web": "taskwarrior-web"
+      }
+    },
+    "taskwarrior-web": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/taskwarrior-web/flake.nix b/flakes/taskwarrior-web/flake.nix
new file mode 100644 (file)
index 0000000..b08290a
--- /dev/null
@@ -0,0 +1,33 @@
+{
+  description = "A web interface for the Taskwarrior todo application. Because being a neckbeard is only fun sometimes.";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.taskwarrior-web = {
+    url = "github:theunraveler/taskwarrior-web/a79cfe2b42791b62364118e58b21b892fff6ded8";
+    flake = false;
+  };
+
+  outputs = { self, nixpkgs, taskwarrior-web, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.taskwarrior-web = callPackage ./. { src = taskwarrior-web; };
+      defaultPackage = packages.taskwarrior-web;
+      legacyPackages.taskwarrior-web = packages.taskwarrior-web;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      taskwarrior-web = final: prev: {
+        taskwarrior-web = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.taskwarrior-web;
+  };
+}
index 217a99fad89daa712c84c3c9671136ae7f59a18c..af98425fa9ea2990de05a8e157b491da8883bf78 100644 (file)
@@ -39,11 +39,11 @@ let
       } else {
       })
     else if info.type == "path" then
-      { outPath = builtins.path { path =
+      { outPath = builtins.toPath (
           if builtins.substring 0 1 info.path == "."
           then builtins.toString src + "/" + info.path
-          else info.path;
-        };
+          else info.path
+        );
         narHash = info.narHash;
       }
     else if info.type == "tarball" then
index 4516c8458099b67187531b77d76b3cff76bf70aa..6f8ba10c7723f93da8b086f4317a249cf2b97b9f 100644 (file)
@@ -8,10 +8,10 @@ in
   filesWatcher = flakeLib.withNarKeyCompat flakeCompat ../flakes/files-watcher "nixosModule";
 
   webstats = ./webapps/webstats;
-  diaspora = ./webapps/diaspora.nix;
-  etherpad-lite = ./webapps/etherpad-lite.nix;
-  mastodon = ./webapps/mastodon.nix;
-  mediagoblin = ./webapps/mediagoblin.nix;
+  diaspora = (flakeCompat ../flakes/diaspora).nixosModule;
+  etherpad-lite = (flakeCompat ../flakes/etherpad-lite).nixosModule;
+  mastodon = (flakeCompat ../flakes/mastodon).nixosModule;
+  mediagoblin = (flakeCompat ../flakes/mediagoblin).nixosModule;
   peertube = (flakeCompat ../flakes/peertube).nixosModule;
   fiche = flakeLib.withNarKeyCompat flakeCompat ../flakes/fiche "nixosModule";
   paste = flakeLib.withNarKeyCompat flakeCompat ../flakes/paste "nixosModule";
index 44549307e6b19e71fd50b2433df40a5aeff27059..e8d656b204e36fcc62b2cde919c881a950446eca 100644 (file)
@@ -1,16 +1,8 @@
 { lib, pkgs, config, ... }:
 let
   varDir = "/var/lib/buildbot";
-  buildbot_common = pkgs.python3Packages.buildPythonPackage rec {
-    name = "buildbot_common";
-    src = ./common;
-    format = "other";
-    installPhase = ''
-      mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages}
-      cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common
-      '';
-  };
-  buildbot = pkgs.python3Packages.buildbot-full;
+  bb-python = buildbot.pythonModule;
+  buildbot = pkgs.immae-buildbot;
 in
 {
   options = {
@@ -185,9 +177,9 @@ in
       description = "Buildbot Continuous Integration Server ${project.name}.";
       after = [ "network-online.target" ];
       wantedBy = [ "multi-user.target" ];
-      path = project.packages pkgs ++ (project.pythonPackages buildbot.pythonModule pkgs);
+      path = project.packages pkgs;
       preStart = let
-        master-cfg = "${buildbot_common}/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common/master.cfg";
+        master-cfg = "${buildbot.buildbot_common}/${bb-python.pythonForBuild.sitePackages}/buildbot_common/master.cfg";
         tac_file = pkgs.writeText "buildbot.tac" ''
             import os
 
@@ -240,23 +232,11 @@ in
       ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name}
       '';
       environment = let
-        buildbot_config = pkgs.python3Packages.buildPythonPackage (rec {
-          name = "buildbot_config-${project.name}";
-          src = ./projects + "/${project.name}";
-          format = "other";
-          installPhase = ''
-            mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages}
-            cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_config
-            '';
-        });
         HOME = "${varDir}/${project.name}";
-        PYTHONPATH = "${buildbot.pythonModule.withPackages (self: project.pythonPackages self pkgs ++ [
-          pkgs.python3Packages.libvirt
-          pkgs.python3Packages.wokkel
-          pkgs.python3Packages.treq pkgs.python3Packages.ldap3 buildbot
-          pkgs.python3Packages.buildbot-worker
-          buildbot_common buildbot_config
-        ])}/${buildbot.pythonModule.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${pkgs.python3.pythonForBuild.sitePackages}" else ""}";
+        PYTHONPATH = "${bb-python.withPackages (self:
+          buildbot.common_packages self ++
+          [ (buildbot.buildbot_config project) ]
+        )}/${bb-python.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${bb-python.sitePackages}" else ""}";
       in { inherit PYTHONPATH HOME; };
 
       serviceConfig = {
index 069f3558a444a2e7d72aec27b9b54b6c10c537c4..7b13870d578d948c90357da63a54da0eb4810634 100644 (file)
@@ -866,17 +866,6 @@ in
                     Takes pkgs as argument.
                   '';
                 };
-                pythonPackages = mkOption {
-                  type = unspecified;
-                  example = literalExample ''
-                    p: pkgs: [ pkgs.python3Packages.pip ];
-                    '';
-                  description = ''
-                    Function.
-                    Builds python packages list to make available to buildbot project.
-                    Takes buildbot python module as first argument and pkgs as second argument in order to augment the python modules list.
-                    '';
-                };
                 pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; };
                 workerPort = mkOption { type = port; description = "Port for the worker"; };
                 secrets = mkOption {
index 0dfa3a45da56fa78425bd5926cda93d3570e6e3f..4ef46f37492ffc039b212e9d22e5300a05fb6ed8 100644 (file)
           fi
           '';
         scripts = lib.attrsets.mapAttrs (n: v:
-          toScript n (pkgs.callPackage (builtins.fetchGit { url = v.src.url; ref = "master"; rev = v.src.rev; }) { scriptEnv = config.secrets.fullPaths."postfix/scripts/${n}-env"; })
+          toScript n (
+            (pkgs.mylibs.flakeCompat
+              (builtins.fetchGit { url = v.src.url; ref = "master"; rev = v.src.rev; })
+            ).outputs.envToScript.x86_64-linux
+            config.secrets.fullPaths."postfix/scripts/${n}-env"
+          )
         ) config.myEnv.mail.scripts // {
           testmail = pkgs.writeScript "testmail" ''
             #! ${pkgs.stdenv.shell}
index 3a115ed1f82e7bc076dc6ae4da3adca695012af5..60e32ff6a9c4d325c6b7892ed1e9cc8fd5264c50 100644 (file)
@@ -142,7 +142,7 @@ in {
 
     services.diaspora = {
       enable = true;
-      package = pkgs.webapps.diaspora.override { ldap = true; };
+      withLdap = true;
       dataDir = "/var/lib/diaspora_immae";
       adminEmail = "diaspora@tools.immae.eu";
       configDir = config.secrets.fullPaths."webapps/diaspora";
index 173a4b841b14e649dd802ad188322950e25dcb7f..6ac6a76f07e1725956bf27d730cc6bbce9909753 100644 (file)
@@ -3,7 +3,7 @@ let
   env = config.myEnv.tools.mastodon;
   root = "${mcfg.workdir}/public/";
   cfg = config.myServices.websites.tools.mastodon;
-  mcfg = config.services.mastodon;
+  mcfg = config.immaeServices.mastodon;
 in {
   options.myServices.websites.tools.mastodon = {
     enable = lib.mkEnableOption "enable mastodon's website";
@@ -56,7 +56,7 @@ in {
         LDAP_SEARCH_FILTER="${env.ldap.filter}"
       '';
     };
-    services.mastodon = {
+    immaeServices.mastodon = {
       enable = true;
       configFile = config.secrets.fullPaths."webapps/tools-mastodon";
       socketsPrefix = "live_immae";
diff --git a/modules/webapps/diaspora.nix b/modules/webapps/diaspora.nix
deleted file mode 100644 (file)
index d9e9989..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "diaspora";
-  cfg = config.services.diaspora;
-
-  uid = config.ids.uids.diaspora;
-  gid = config.ids.gids.diaspora;
-in
-{
-  options.services.diaspora = {
-    enable = lib.mkEnableOption "Enable Diaspora’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Diaspora runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Diaspora runs";
-    };
-    adminEmail = lib.mkOption {
-      type = lib.types.str;
-      example = "admin@example.com";
-      description = "Admin e-mail for Diaspora";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Diaspora stores its data.
-      '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Diaspora puts runtime files and sockets.
-        '';
-    };
-    configDir = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The configuration path for Diaspora.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.diaspora;
-      description = ''
-        Diaspora package to use.
-        '';
-    };
-    # Output variables
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Diaspora data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Diaspora sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    workdir = lib.mkOption {
-      type = lib.types.package;
-      default = cfg.package.override {
-        varDir = cfg.dataDir;
-        podmin_email = cfg.adminEmail;
-        config_dir = cfg.configDir;
-      };
-      description = ''
-        Adjusted diaspora package with overriden values
-        '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        rails = "${cfg.socketsDir}/diaspora.sock";
-        eye   = "${cfg.socketsDir}/eye.sock";
-      };
-      readOnly = true;
-      description = ''
-        Diaspora sockets
-        '';
-    };
-    pids = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        eye   = "${cfg.socketsDir}/eye.pid";
-      };
-      readOnly = true;
-      description = ''
-        Diaspora pids
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    users.users = lib.optionalAttrs (cfg.user == name) {
-      "${name}" = {
-        inherit uid;
-        group = cfg.group;
-        description = "Diaspora user";
-        home = cfg.dataDir;
-        packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ];
-        useDefaultShell = true;
-      };
-    };
-    users.groups = lib.optionalAttrs (cfg.group == name) {
-      "${name}" = {
-        inherit gid;
-      };
-    };
-
-    systemd.services.diaspora = {
-      description = "Diaspora";
-      wantedBy = [ "multi-user.target" ];
-      after = [
-        "network.target" "redis.service" "postgresql.service"
-      ];
-      wants = [
-        "redis.service" "postgresql.service"
-      ];
-
-      environment.RAILS_ENV = "production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.EYE_SOCK = cfg.sockets.eye;
-      environment.EYE_PID = cfg.pids.eye;
-
-      path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ];
-
-      preStart = ''
-        install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log
-        install -m 0700 -d ${cfg.dataDir}/tmp/pids
-        if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
-          echo "{}" > ${cfg.dataDir}/schedule.yml
-        fi
-        ./bin/bundle exec rails db:migrate
-      '';
-
-      script = ''
-        exec ${cfg.workdir}/script/server
-      '';
-
-      serviceConfig = {
-        User = cfg.user;
-        PrivateTmp = true;
-        Restart = "always";
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StandardInput = "null";
-        KillMode = "control-group";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-  };
-}
diff --git a/modules/webapps/etherpad-lite.nix b/modules/webapps/etherpad-lite.nix
deleted file mode 100644 (file)
index 2e09952..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "etherpad-lite";
-  cfg = config.services.etherpad-lite;
-
-  uid = config.ids.uids.etherpad-lite;
-  gid = config.ids.gids.etherpad-lite;
-in
-{
-  options.services.etherpad-lite = {
-    enable = lib.mkEnableOption "Enable Etherpad lite’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Etherpad lite runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Etherpad lite runs";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Etherpad lite stores its data.
-      '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Etherpad lite stores its sockets.
-      '';
-    };
-    configFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The config file path for Etherpad lite.
-        '';
-    };
-    sessionKeyFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The Session key file path for Etherpad lite.
-        '';
-    };
-    apiKeyFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The API key file path for Etherpad lite.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.etherpad-lite;
-      description = ''
-        Etherpad lite package to use.
-        '';
-      example = lib.literalExample ''
-        pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
-      '';
-    };
-    modules = lib.mkOption {
-      type = lib.types.listOf lib.types.package;
-      default = [];
-      description = ''
-        Etherpad lite modules to use.
-        DEPRECATED: use package directly
-        '';
-    };
-    # Output variables
-    workdir = lib.mkOption {
-      type = lib.types.package;
-      default = cfg.package.withModules (_: cfg.modules);
-      description = ''
-      Adjusted Etherpad lite package with plugins
-      '';
-      readOnly = true;
-    };
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Etherpad lite data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Etherpad lite sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        node  = "${cfg.socketsDir}/etherpad-lite.sock";
-      };
-      readOnly = true;
-      description = ''
-        Etherpad lite sockets
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    systemd.services.etherpad-lite = {
-      description = "Etherpad-lite";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "postgresql.service" ];
-      wants = [ "postgresql.service" ];
-
-      environment.NODE_ENV = "production";
-      environment.HOME = cfg.workdir;
-
-      path = [ pkgs.nodejs ];
-
-      script = ''
-        exec ${pkgs.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
-          --sessionkey ${cfg.sessionKeyFile} \
-          --apikey ${cfg.apiKeyFile} \
-          --settings ${cfg.configFile}
-      '';
-
-      postStart = ''
-        while [ ! -S ${cfg.sockets.node} ]; do
-          sleep 0.5
-        done
-        chmod a+w ${cfg.sockets.node}
-        '';
-      serviceConfig = {
-        DynamicUser = true;
-        User = cfg.user;
-        Group = cfg.group;
-        WorkingDirectory = cfg.workdir;
-        PrivateTmp = true;
-        NoNewPrivileges = true;
-        PrivateDevices = true;
-        ProtectHome = true;
-        ProtectControlGroups = true;
-        ProtectKernelModules = true;
-        Restart = "always";
-        Type = "simple";
-        TimeoutSec = 60;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StateDirectory= cfg.systemdStateDirectory;
-        ExecStartPre = [
-          "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized"
-          "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
-        ];
-      };
-    };
-
-  };
-}
diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix
deleted file mode 100644 (file)
index 76c17b4..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "mastodon";
-  cfg = config.services.mastodon;
-
-  uid = config.ids.uids.mastodon;
-  gid = config.ids.gids.mastodon;
-in
-{
-  options.services.mastodon = {
-    enable = lib.mkEnableOption "Enable Mastodon’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Mastodon runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Mastodon runs";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Mastodon stores its data.
-      '';
-    };
-    socketsPrefix = lib.mkOption {
-      type = lib.types.str;
-      default = "live";
-      description = ''
-        The prefix to use for Mastodon sockets.
-        '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Mastodon puts runtime files and sockets.
-        '';
-    };
-    configFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The configuration file path for Mastodon.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.mastodon;
-      description = ''
-        Mastodon package to use.
-        '';
-    };
-    # Output variables
-    workdir = lib.mkOption {
-      type = lib.types.package;
-      default = cfg.package.override { varDir = cfg.dataDir; };
-      description = ''
-      Adjusted mastodon package with overriden varDir
-      '';
-      readOnly = true;
-    };
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Mastodon data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Mastodon sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        node  = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
-        rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
-      };
-      readOnly = true;
-      description = ''
-        Mastodon sockets
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    users.users = lib.optionalAttrs (cfg.user == name) {
-      "${name}" = {
-        inherit uid;
-        group = cfg.group;
-        description = "Mastodon user";
-        home = cfg.dataDir;
-        useDefaultShell = true;
-      };
-    };
-    users.groups = lib.optionalAttrs (cfg.group == name) {
-      "${name}" = {
-        inherit gid;
-      };
-    };
-
-    systemd.slices.mastodon = {
-      description = "Mastodon slice";
-    };
-
-    systemd.services.mastodon-streaming = {
-      description = "Mastodon Streaming";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "mastodon-web.service" ];
-
-      environment.NODE_ENV = "production";
-      environment.SOCKET = cfg.sockets.node;
-
-      path = [ pkgs.nodejs pkgs.bashInteractive ];
-
-      script = ''
-        exec npm run start
-      '';
-
-      postStart = ''
-        while [ ! -S $SOCKET ]; do
-          sleep 0.5
-        done
-        chmod a+w $SOCKET
-      '';
-
-      postStop = ''
-        rm $SOCKET
-      '';
-
-      serviceConfig = {
-        Slice = "mastodon.slice";
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 15;
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mastodon-web = {
-      description = "Mastodon Web app";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" ];
-
-      environment.RAILS_ENV = "production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.SOCKET = cfg.sockets.rails;
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ];
-
-      preStart = ''
-        install -m 0755 -d ${cfg.dataDir}/tmp/cache
-        ./bin/bundle exec rails db:migrate
-      '';
-
-      script = ''
-        exec ./bin/bundle exec puma -C config/puma.rb
-      '';
-
-      postStart = ''
-        exec ./bin/tootctl cache clear
-        '';
-      serviceConfig = {
-        Slice = "mastodon.slice";
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 60;
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    # To be run manually because computationnally heavy
-    systemd.services.mastodon-cleanup-manual = {
-      description = "Cleanup mastodon";
-
-      environment.RAILS_ENV = "production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.SOCKET = cfg.sockets.rails;
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
-
-      script = ''
-        exec ./bin/tootctl statuses remove --days 365
-      '';
-
-      serviceConfig = {
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Type = "oneshot";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mastodon-cleanup = {
-      description = "Cleanup mastodon";
-      startAt = "daily";
-      restartIfChanged = false;
-
-      environment.RAILS_ENV = "production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.SOCKET = cfg.sockets.rails;
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
-
-      script = ''
-        exec ./bin/tootctl media remove --days 30
-      '';
-
-      serviceConfig = {
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Type = "oneshot";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mastodon-sidekiq = {
-      description = "Mastodon Sidekiq";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "mastodon-web.service" ];
-
-      environment.RAILS_ENV="production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.DB_POOL="5";
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
-
-      script = ''
-        exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
-      '';
-
-      serviceConfig = {
-        Slice = "mastodon.slice";
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 15;
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-  };
-}
diff --git a/modules/webapps/mediagoblin.nix b/modules/webapps/mediagoblin.nix
deleted file mode 100644 (file)
index 3fe5e38..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "mediagoblin";
-  cfg = config.services.mediagoblin;
-
-  uid = config.ids.uids.mediagoblin;
-  gid = config.ids.gids.mediagoblin;
-
-  paste_local = pkgs.writeText "paste_local.ini" ''
-    [DEFAULT]
-    debug = false
-
-    [pipeline:main]
-    pipeline = mediagoblin
-
-    [app:mediagoblin]
-    use = egg:mediagoblin#app
-    config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini
-    /mgoblin_static = ${cfg.package}/mediagoblin/static
-
-    [loggers]
-    keys = root
-
-    [handlers]
-    keys = console
-
-    [formatters]
-    keys = generic
-
-    [logger_root]
-    level = INFO
-    handlers = console
-
-    [handler_console]
-    class = StreamHandler
-    args = (sys.stderr,)
-    level = NOTSET
-    formatter = generic
-
-    [formatter_generic]
-    format = %(levelname)-7.7s [%(name)s] %(message)s
-
-    [filter:errors]
-    use = egg:mediagoblin#errors
-    debug = false
-
-    [server:main]
-    use = egg:waitress#main
-    unix_socket = ${cfg.sockets.paster}
-    unix_socket_perms = 777
-    url_scheme = https
-    '';
-in
-{
-  options.services.mediagoblin = {
-    enable = lib.mkEnableOption "Enable Mediagoblin’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Mediagoblin runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Mediagoblin runs";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Mediagoblin stores its data.
-      '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Mediagoblin puts runtime files and sockets.
-        '';
-    };
-    configFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The configuration file path for Mediagoblin.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.mediagoblin;
-      example = lib.literalExample ''
-        pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch])
-      '';
-      description = ''
-        Mediagoblin package to use.
-        '';
-    };
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Mediagoblin data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Mediagoblin sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        paster = "${cfg.socketsDir}/mediagoblin.sock";
-      };
-      readOnly = true;
-      description = ''
-        Mediagoblin sockets
-        '';
-    };
-    pids = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        paster = "${cfg.socketsDir}/mediagoblin.pid";
-        celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
-      };
-      readOnly = true;
-      description = ''
-        Mediagoblin pid files
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    users.users = lib.optionalAttrs (cfg.user == name) {
-      "${name}" = {
-        inherit uid;
-        group = cfg.group;
-        description = "Mediagoblin user";
-        home = cfg.dataDir;
-        useDefaultShell = true;
-      };
-    };
-    users.groups = lib.optionalAttrs (cfg.group == name) {
-      "${name}" = {
-        inherit gid;
-      };
-    };
-
-    systemd.slices.mediagoblin = {
-      description = "Mediagoblin slice";
-    };
-    systemd.services.mediagoblin-web = {
-      description = "Mediagoblin service";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" ];
-      wants = [ "postgresql.service" "redis.service" ];
-
-      environment.SCRIPT_NAME = "/mediagoblin/";
-
-      script = ''
-        exec ./bin/paster serve \
-          ${paste_local} \
-          --pid-file=${cfg.pids.paster}
-        '';
-      preStop = ''
-        exec ./bin/paster serve \
-          --pid-file=${cfg.pids.paster} \
-          ${paste_local} stop
-        '';
-      preStart = ''
-        if [ -d ${cfg.dataDir}/plugin_static/ ]; then
-          rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
-          ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
-        fi
-        ./bin/gmg -cf ${cfg.configFile} dbupdate
-        '';
-
-      serviceConfig = {
-        Slice = "mediagoblin.slice";
-        User = cfg.user;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 15;
-        Type = "simple";
-        WorkingDirectory = cfg.package;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StateDirectory= cfg.systemdStateDirectory;
-        PIDFile = cfg.pids.paster;
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mediagoblin-celeryd = {
-      description = "Mediagoblin service";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "mediagoblin-web.service" ];
-
-      environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
-      environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
-
-      script = ''
-        exec ./bin/celery worker \
-          --logfile=${cfg.dataDir}/celery.log \
-          --loglevel=INFO
-        '';
-
-      serviceConfig = {
-        Slice = "mediagoblin.slice";
-        User = cfg.user;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 60;
-        Type = "simple";
-        WorkingDirectory = cfg.package;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StateDirectory= cfg.systemdStateDirectory;
-        PIDFile = cfg.pids.celery;
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-  };
-}
index 2eda437f47a6fddc49ac429ea944a77ec622a12c..f73ea55d5c9705bd6b8828547c4090e0dab70bb6 100644 (file)
         "url_template": "https://releases.nixos.org/nixos/<version>/nixos-<version>.<revision>/nixexprs.tar.xz",
         "version": "19.03"
     },
-    "buildbot-plugin-buildslist": {
-        "ref": "master",
-        "repo": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist",
-        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
-        "type": "git",
-        "version": "f1d42ba-master"
-    },
     "home-manager": {
         "branch": "master",
         "description": "Manage a user environment using Nix",
         "type": "git",
         "version": "e0a72b7-local"
     },
-    "webapps-surfer": {
-        "ref": "master",
-        "repo": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git",
-        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
-        "type": "git",
-        "version": "4761773-master"
-    },
     "webapps-ttrss": {
         "ref": "master",
         "repo": "https://git.tt-rss.org/fox/tt-rss.git",
index bdc99d26301db69537c98d5eac0e1e31b2a76845..ccdaa3c781e88e30278cca1d0e90f7e44d65b278 100644 (file)
@@ -2,10 +2,16 @@ let
   flakeCompat = import ../lib/flake-compat.nix;
   flakes = builtins.foldl' (a: b: a // b) {} (map (n: (flakeCompat n).overlays) [
     ../flakes/backports
+    ../flakes/etherpad-lite
+    ../flakes/grocy
     ../flakes/openarc
     ../flakes/opendmarc
     ../flakes/peertube
+    ../flakes/diaspora
+    ../flakes/mastodon
+    ../flakes/mediagoblin
     ../flakes/private/peertube
+    ../flakes/private/buildbot
   ]);
 in flakes // {
   mylibs = self: super: { mylibs = import ../lib { pkgs = self; }; };
diff --git a/overlays/python-packages/buildbot.nix b/overlays/python-packages/buildbot.nix
deleted file mode 100644 (file)
index ccf2f6a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-self: super: {
-  pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
-    buildbot-plugins = pysuper.buildbot-plugins // {
-      buildslist = self.python3PackagesPlus.buildbot-plugins.buildslist;
-    };
-    buildbot-full = pysuper.buildbot-full.withPlugins [ pyself.buildbot-plugins.buildslist ];
-  }) super.pythonOverrides;
-}
index ddd4b7d8ada881fc11bda5d5dabb557745f57062..720e777498a08c13f6db78770d710553c9c7a4a0 100644 (file)
@@ -23,8 +23,6 @@ in
 
 
   blivet3 = fromMyPythonPackages "blivet3";
-  buildbot = import ./buildbot.nix;
-  wokkel = fromMyPythonPackages "wokkel";
   pymilter = fromMyPythonPackages "pymilter";
   matrix-webhook = fromMyPythonPackages "matrix-webhook";
 }
diff --git a/pkgs/python-packages/buildbot/plugins/default.nix b/pkgs/python-packages/buildbot/plugins/default.nix
deleted file mode 100644 (file)
index 22a8507..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-{ callPackage, python }:
-{
-  buildslist = callPackage ./buildslist {
-    pythonPackages = python.pkgs;
-  };
-}
index 2ba2126a5ed57f4b1fbf695732af8b513ee46f72..21c4204bf054034aca40fe7e1cf5b562ac7f6409 100644 (file)
@@ -1,8 +1,6 @@
 { mylibs, callPackage, python }:
 {
   blivet3 = callPackage ./blivet { inherit python; pythonPackages = python.pkgs; };
-  buildbot-plugins = callPackage ./buildbot/plugins { inherit python; };
-  wokkel = callPackage ./wokkel.nix { pythonPackages = python.pkgs; };
   pymilter = callPackage ./pymilter.nix { pythonPackages = python.pkgs; };
   matrix-webhook = callPackage ./matrix-webhook.nix { pythonPackages = python.pkgs; };
 }
diff --git a/pkgs/python-packages/wokkel.nix b/pkgs/python-packages/wokkel.nix
deleted file mode 100644 (file)
index 3237f2b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{ pythonPackages }: with pythonPackages;
-buildPythonPackage rec {
-  pname = "wokkel";
-  version = "18.0.0";
-  src = fetchPypi {
-    inherit pname version;
-    sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
-  };
-  propagatedBuildInputs = [ twisted.extras.tls twisted incremental dateutil ];
-  doCheck = false;
-}
index 08a9a869ac1b381bf32e5e79713430b206f740ba..fc984aa39f9c14d2970051feea7aa80056baea10 100644 (file)
@@ -5,14 +5,14 @@ rec {
   awl = callPackage ./awl {};
   copanier = (mylibs.flakeCompat ../../flakes/copanier).default;
   davical = callPackage ./davical {};
-  diaspora = callPackage ./diaspora { inherit mylibs; };
+  diaspora = (mylibs.flakeCompat ../../flakes/diaspora).default;
   dokuwiki = callPackage ./dokuwiki { inherit mylibs; };
-  etherpad-lite = callPackage ./etherpad-lite {};
-  grocy = callPackage ./grocy { inherit mylibs composerEnv; };
+  etherpad-lite = (mylibs.flakeCompat ../../flakes/etherpad-lite).default;
+  grocy = (mylibs.flakeCompat ../../flakes/grocy).default;
   infcloud = callPackage ./infcloud {};
   mantisbt_2 = callPackage ./mantisbt_2 {};
-  mastodon = callPackage ./mastodon { inherit mylibs; };
-  mediagoblin = callPackage ./mediagoblin { inherit mylibs; };
+  mastodon = (mylibs.flakeCompat ../../flakes/mastodon).default;
+  mediagoblin = (mylibs.flakeCompat ../../flakes/mediagoblin).default;
   nextcloud_20 = callPackage ./nextcloud { nextcloudVersion = 20; };
   nextcloud_21 = callPackage ./nextcloud { nextcloudVersion = 21; };
   nextcloud_22 = callPackage ./nextcloud { nextcloudVersion = 22; };
@@ -23,8 +23,8 @@ rec {
   rompr = callPackage ./rompr { inherit mylibs; };
   roundcubemail = callPackage ./roundcubemail {};
   spip = callPackage ./spip {};
-  surfer = callPackage ./surfer { inherit mylibs; };
-  taskwarrior-web = callPackage ./taskwarrior-web { inherit mylibs; };
+  surfer = (mylibs.flakeCompat ../../flakes/surfer).default;
+  taskwarrior-web = (mylibs.flakeCompat ../../flakes/taskwarrior-web).default;
   ttrss = callPackage ./ttrss {};
   wallabag = callPackage ./wallabag { inherit composerEnv; };
   yourls = callPackage ./yourls { inherit mylibs; };
diff --git a/pkgs/webapps/diaspora/diaspora.json b/pkgs/webapps/diaspora/diaspora.json
deleted file mode 100644 (file)
index e6795aa..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "v0.7.10.0",
-  "meta": {
-    "name": "diaspora",
-    "url": "https://github.com/diaspora/diaspora",
-    "branch": "refs/tags/v0.7.10.0"
-  },
-  "github": {
-    "owner": "diaspora",
-    "repo": "diaspora",
-    "rev": "f0085cf5bb1c45bdfba866f628153d299e56eca8",
-    "sha256": "02mnb40rdkk6jlnvpy61fad59gbpgnlwz1k35w4wfqdwzq0znaqp",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/grocy/grocy.json b/pkgs/webapps/grocy/grocy.json
deleted file mode 100644 (file)
index cd75c18..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "d7738aa-master",
-  "meta": {
-    "name": "grocy",
-    "url": "https://github.com/grocy/grocy/",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "grocy",
-    "repo": "grocy",
-    "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
-    "sha256": "13zxzq71hvs3dzywrdwqflnkx6dpdc40l9klm4slv0fmmyclbbdf",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/mastodon/mastodon.json b/pkgs/webapps/mastodon/mastodon.json
deleted file mode 100644 (file)
index a0a6cfd..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "v2.9.4",
-  "meta": {
-    "name": "mastodon",
-    "url": "https://github.com/tootsuite/mastodon",
-    "branch": "refs/tags/v2.9.4"
-  },
-  "github": {
-    "owner": "tootsuite",
-    "repo": "mastodon",
-    "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
-    "sha256": "1x9pai1q73lsq1i685w7z4v3w478iyij65mar13k4hq9zdz9d2b0",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json b/pkgs/webapps/taskwarrior-web/taskwarrior-web.json
deleted file mode 100644 (file)
index 70f396d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "a79cfe2-master",
-  "meta": {
-    "name": "taskwarrior-web",
-    "url": "https://github.com/theunraveler/taskwarrior-web",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "theunraveler",
-    "repo": "taskwarrior-web",
-    "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
-    "sha256": "028rb4wry2an19707bvy4n305f3s0hipg214224p1m0mb61c3cq4",
-    "fetchSubmodules": true
-  }
-}