Profpatsch / yarn2nix

Build and deploy node packages with nix from yarn.lock files.
MIT License
85 stars 21 forks source link

Link transitive dependencies into node_modules #54

Open sternenseemann opened 3 years ago

sternenseemann commented 3 years ago

It seems like we need to link transitive dependencies into the top-level node_modules directory because JavaScript's import routines are all kinds of broken.

The solution is to implement a simple “link transitive dependencies” subcommand for node-package-tool which optionally can copy the dependencies (in case symlinks are a problem for a particular package).

What remains to be found out is the precise algorithm yarn uses for building node_modules, mainly how we can solve different versions of packages being present at the same level of the dependency tree.

Profpatsch commented 3 years ago

Do you have a minimal reproduction of this problem?

sternenseemann commented 3 years ago

A bit messy, but this is an use case we want to support (running stuff at build time) which doesn't work nicely yet with buildNodePackage. I'm pretty sure such problems also occur more classical node packages:

let
  pkgs = import <nixpkgs> { };

  yarn2nix = import (pkgs.fetchFromGitHub {
    owner = "Profpatsch";
    repo = "yarn2nix";
    rev = "2eb5647049bde3301a005e6bc9f9ea330ed0e13d";
    sha256 = "0g875g4mhpw9vga1fq89sfwdd0gvnzfnn8y8nkbkcrw059k970rj";
  }) { };
  nixLib = yarn2nix.nixLib;

  packageJson = pkgs.writeText "package.json" ''
    {
      "name": "test",
      "version": "0.1.0",
      "devDependencies": {
        "parcel-bundler": "^1.12.4"
      }
    }
  '';

  yarnLock = pkgs.fetchurl {
    url = "https://gist.githubusercontent.com/sternenseemann/a6d2b9a30dd8c4602529459134a7a9b1/raw/147a9a3a88375147fc38bbfeee3ec4206fb35bc9/yarn.lock";
    sha256 = "1nsjg0rwm7b785l03wxdi7anhwwlw58l0i3whsvb015aihi35ksr";
  };

  pkgSrc = pkgs.runCommandLocal "frontend" {} ''
    mkdir $out
    ln -s ${packageJson} $out/package.json
    ln -s ${yarnLock} $out/yarn.lock

    cat > $out/index.html <<EOF
    <!doctype html>
    <html><head><meta charset="utf-8"><title>test</title></head>
      <body>
        nope
        <script src="main.js"></script>
      </body>
    </html>
    EOF

    cat > $out/main.js <<EOF
    console.log("lol")
    EOF
  '';

  template = nixLib.callPackageJson packageJson {};
  lock = nixLib.callYarnLock yarnLock {};
in {
  yarn2nixBuild =
    let
      tpl = template (nixLib.buildNodeDeps lock);
      linked = nixLib.linkNodeDeps {
        name = tpl.key.name;
        dependencies = tpl.nodeBuildInputs;
      };
    in pkgs.stdenv.mkDerivation {
      inherit (tpl) version;
      pname = tpl.key.name;
      src = pkgSrc;

      buildPhase = ''
        export PATH="${linked}/.bin:$PATH"
        parcel build index.html --out-dir=dist
      '';

      installPhase = ''
        cp dist $out
      '';
    };

  inherit pkgSrc;
}

If you run nix-build -A yarn2nixBuild, you get the following error:

building
(node:17) UnhandledPromiseRejectionWarning: Error: Cannot find module 'babel-types'
Require stack:
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/src/Asset.js
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/src/assets/RawAsset.js
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/src/Parser.js
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/src/Bundler.js
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/index.js
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/src/cli.js
- /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/bin/cli.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at require (/nix/store/02yfal8q6vx2md651ds7x99spb5rm3v3-v8-compile-cache-2.2.0/v8-compile-cache.js:159:20)
    at Object.<anonymous> (/nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4/src/Asset.js:12:11)
    at Module._compile (/nix/store/02yfal8q6vx2md651ds7x99spb5rm3v3-v8-compile-cache-2.2.0/v8-compile-cache.js:192:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
(node:17) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:17) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
installing
cp: cannot stat 'dist': No such file or directory
builder for '/nix/store/5nlnzyi3xbfylasrai2fjkzm0sykasp2-test-0.1.0.drv' failed with exit code 1
error: build of '/nix/store/5nlnzyi3xbfylasrai2fjkzm0sykasp2-test-0.1.0.drv' failed

This is because of a weird traversal parcel does to discover other packages. If you use yarn however, it works:

fish> cp --no-preserve=ownership,mode -r (nix-build yarn2nix-transitive.nix -A pkgSrc) test
fish> cd test && nix-shell -p yarn
nix-shell $ yarn install
nix-shell $ yarn run parcel build --out-dir=dist index.html
# works without a nasty stack trace

Below are a directory listing of the node_modules generated by yarn2nix and yarn respectively.

yarn2nix ``` fish> ls -lah /nix/store/nr69v1rxs30s6h30b7ibphmvid5gszi1-test-node_modules/ total 4.0K dr-xr-xr-x 1 root root 36 Jan 1 1970 . drwxrwxr-t 1 root nixbld 3.6M Jan 9 20:03 .. dr-xr-xr-x 1 root root 12 Jan 1 1970 .bin lrwxrwxrwx 1 root root 65 Jan 1 1970 parcel-bundler -> /nix/store/sq6sskky5rb6x2m749s10k5cqnv475bj-parcel-bundler-1.12.4 ```
yarn ``` fish> ls -lah test/node_modules total 124K drwxr-xr-x 1 lukas users 13K Jan 9 19:56 . drwxr-xr-x 1 lukas users 120 Jan 9 19:57 .. drwxr-xr-x 1 lukas users 128 Jan 9 19:56 abab drwxr-xr-x 1 lukas users 94 Jan 9 19:56 acorn drwxr-xr-x 1 lukas users 96 Jan 9 19:56 acorn-globals drwxr-xr-x 1 lukas users 88 Jan 9 19:56 acorn-walk drwxr-xr-x 1 lukas users 118 Jan 9 19:56 ajv drwxr-xr-x 1 lukas users 62 Jan 9 19:56 alphanum-sort drwxr-xr-x 1 lukas users 72 Jan 9 19:56 ansi-regex drwxr-xr-x 1 lukas users 72 Jan 9 19:56 ansi-styles drwxr-xr-x 1 lukas users 92 Jan 9 19:56 ansi-to-html drwxr-xr-x 1 lukas users 96 Jan 9 19:56 anymatch drwxr-xr-x 1 lukas users 102 Jan 9 19:56 argparse drwxr-xr-x 1 lukas users 120 Jan 9 19:56 array-equal drwxr-xr-x 1 lukas users 72 Jan 9 19:56 array-unique drwxr-xr-x 1 lukas users 72 Jan 9 19:56 arr-diff drwxr-xr-x 1 lukas users 72 Jan 9 19:56 arr-flatten drwxr-xr-x 1 lukas users 72 Jan 9 19:56 arr-union drwxr-xr-x 1 lukas users 62 Jan 9 19:56 asn1 drwxr-xr-x 1 lukas users 86 Jan 9 19:56 asn1.js drwxr-xr-x 1 lukas users 176 Jan 9 19:56 assert drwxr-xr-x 1 lukas users 94 Jan 9 19:56 assert-plus drwxr-xr-x 1 lukas users 72 Jan 9 19:56 assign-symbols drwxr-xr-x 1 lukas users 58 Jan 9 19:56 async-each drwxr-xr-x 1 lukas users 184 Jan 9 19:56 asynckit drwxr-xr-x 1 lukas users 132 Jan 9 19:56 async-limiter drwxr-xr-x 1 lukas users 174 Jan 9 19:56 atob drwxr-xr-x 1 lukas users 118 Jan 9 19:56 aws4 drwxr-xr-x 1 lukas users 72 Jan 9 19:56 aws-sign2 drwxr-xr-x 1 lukas users 5.3K Jan 9 19:56 @babel drwxr-xr-x 1 lukas users 184 Jan 9 19:56 babel-plugin-dynamic-import-node drwxr-xr-x 1 lukas users 190 Jan 9 19:56 babel-runtime drwxr-xr-x 1 lukas users 126 Jan 9 19:56 babel-types drwxr-xr-x 1 lukas users 94 Jan 9 19:56 babylon-walk drwxr-xr-x 1 lukas users 98 Jan 9 19:56 balanced-match drwxr-xr-x 1 lukas users 96 Jan 9 19:56 base drwxr-xr-x 1 lukas users 122 Jan 9 19:56 base64-js drwxr-xr-x 1 lukas users 102 Jan 9 19:56 bcrypt-pbkdf drwxr-xr-x 1 lukas users 484 Jan 9 19:56 .bin drwxr-xr-x 1 lukas users 100 Jan 9 19:56 binary-extensions drwxr-xr-x 1 lukas users 84 Jan 9 19:56 bindings drwxr-xr-x 1 lukas users 56 Jan 9 19:56 bn.js drwxr-xr-x 1 lukas users 58 Jan 9 19:56 boolbase drwxr-xr-x 1 lukas users 72 Jan 9 19:56 brace-expansion drwxr-xr-x 1 lukas users 78 Jan 9 19:56 braces drwxr-xr-x 1 lukas users 158 Jan 9 19:56 brfs drwxr-xr-x 1 lukas users 86 Jan 9 19:56 brorand drwxr-xr-x 1 lukas users 274 Jan 9 19:56 browserify-aes drwxr-xr-x 1 lukas users 128 Jan 9 19:56 browserify-cipher drwxr-xr-x 1 lukas users 124 Jan 9 19:56 browserify-des drwxr-xr-x 1 lukas users 96 Jan 9 19:56 browserify-rsa drwxr-xr-x 1 lukas users 126 Jan 9 19:56 browserify-sign drwxr-xr-x 1 lukas users 154 Jan 9 19:56 browserify-zlib drwxr-xr-x 1 lukas users 92 Jan 9 19:56 browser-process-hrtime drwxr-xr-x 1 lukas users 222 Jan 9 19:56 browserslist drwxr-xr-x 1 lukas users 128 Jan 9 19:56 buffer drwxr-xr-x 1 lukas users 114 Jan 9 19:56 buffer-equal drwxr-xr-x 1 lukas users 72 Jan 9 19:56 buffer-from drwxr-xr-x 1 lukas users 160 Jan 9 19:56 buffer-xor drwxr-xr-x 1 lukas users 108 Jan 9 19:56 builtin-status-codes drwxr-xr-x 1 lukas users 72 Jan 9 19:56 cache-base drwxr-xr-x 1 lukas users 198 Jan 9 19:56 call-bind drwxr-xr-x 1 lukas users 72 Jan 9 19:56 caller-callsite drwxr-xr-x 1 lukas users 72 Jan 9 19:56 caller-path drwxr-xr-x 1 lukas users 140 Jan 9 19:56 call-me-maybe drwxr-xr-x 1 lukas users 72 Jan 9 19:56 callsites drwxr-xr-x 1 lukas users 112 Jan 9 19:56 caniuse-api drwxr-xr-x 1 lukas users 96 Jan 9 19:56 caniuse-lite drwxr-xr-x 1 lukas users 86 Jan 9 19:56 caseless drwxr-xr-x 1 lukas users 132 Jan 9 19:56 chalk drwxr-xr-x 1 lukas users 98 Jan 9 19:56 chokidar drwxr-xr-x 1 lukas users 146 Jan 9 19:56 cipher-base drwxr-xr-x 1 lukas users 72 Jan 9 19:56 class-utils drwxr-xr-x 1 lukas users 72 Jan 9 19:56 cli-cursor drwxr-xr-x 1 lukas users 98 Jan 9 19:56 cli-spinners drwxr-xr-x 1 lukas users 110 Jan 9 19:56 clone drwxr-xr-x 1 lukas users 118 Jan 9 19:56 coa drwxr-xr-x 1 lukas users 72 Jan 9 19:56 collection-visit drwxr-xr-x 1 lukas users 72 Jan 9 19:56 color drwxr-xr-x 1 lukas users 140 Jan 9 19:56 color-convert drwxr-xr-x 1 lukas users 124 Jan 9 19:56 colorette drwxr-xr-x 1 lukas users 134 Jan 9 19:56 color-name drwxr-xr-x 1 lukas users 120 Jan 9 19:56 color-string drwxr-xr-x 1 lukas users 80 Jan 9 19:56 combined-stream drwxr-xr-x 1 lukas users 110 Jan 9 19:56 commander drwxr-xr-x 1 lukas users 150 Jan 9 19:56 command-exists drwxr-xr-x 1 lukas users 92 Jan 9 19:56 component-emitter drwxr-xr-x 1 lukas users 128 Jan 9 19:56 concat-map drwxr-xr-x 1 lukas users 72 Jan 9 19:56 concat-stream drwxr-xr-x 1 lukas users 150 Jan 9 19:56 console-browserify drwxr-xr-x 1 lukas users 100 Jan 9 19:56 constants-browserify drwxr-xr-x 1 lukas users 96 Jan 9 19:56 convert-source-map drwxr-xr-x 1 lukas users 54 Jan 9 19:56 copy-descriptor drwxr-xr-x 1 lukas users 278 Jan 9 19:56 core-js drwxr-xr-x 1 lukas users 384 Jan 9 19:56 core-js-compat drwxr-xr-x 1 lukas users 98 Jan 9 19:56 core-util-is drwxr-xr-x 1 lukas users 112 Jan 9 19:56 cosmiconfig drwxr-xr-x 1 lukas users 114 Jan 9 19:56 create-ecdh drwxr-xr-x 1 lukas users 164 Jan 9 19:56 create-hash drwxr-xr-x 1 lukas users 134 Jan 9 19:56 create-hmac drwxr-xr-x 1 lukas users 126 Jan 9 19:56 cross-spawn drwxr-xr-x 1 lukas users 134 Jan 9 19:56 crypto-browserify drwxr-xr-x 1 lukas users 82 Jan 9 19:56 css-color-names drwxr-xr-x 1 lukas users 104 Jan 9 19:56 css-declaration-sorter drwxr-xr-x 1 lukas users 102 Jan 9 19:56 cssesc drwxr-xr-x 1 lukas users 72 Jan 9 19:56 css-modules-loader-core drwxr-xr-x 1 lukas users 122 Jan 9 19:56 cssnano drwxr-xr-x 1 lukas users 72 Jan 9 19:56 cssnano-preset-default drwxr-xr-x 1 lukas users 96 Jan 9 19:56 cssnano-util-get-arguments drwxr-xr-x 1 lukas users 96 Jan 9 19:56 cssnano-util-get-match drwxr-xr-x 1 lukas users 96 Jan 9 19:56 cssnano-util-raw-cache drwxr-xr-x 1 lukas users 96 Jan 9 19:56 cssnano-util-same-parent drwxr-xr-x 1 lukas users 118 Jan 9 19:56 csso drwxr-xr-x 1 lukas users 76 Jan 9 19:56 cssom drwxr-xr-x 1 lukas users 98 Jan 9 19:56 css-select drwxr-xr-x 1 lukas users 108 Jan 9 19:56 css-select-base-adapter drwxr-xr-x 1 lukas users 86 Jan 9 19:56 css-selector-tokenizer drwxr-xr-x 1 lukas users 174 Jan 9 19:56 cssstyle drwxr-xr-x 1 lukas users 102 Jan 9 19:56 css-tree drwxr-xr-x 1 lukas users 62 Jan 9 19:56 css-what drwxr-xr-x 1 lukas users 96 Jan 9 19:56 dashdash drwxr-xr-x 1 lukas users 70 Jan 9 19:56 data-urls drwxr-xr-x 1 lukas users 228 Jan 9 19:56 deasync drwxr-xr-x 1 lukas users 258 Jan 9 19:56 debug drwxr-xr-x 1 lukas users 72 Jan 9 19:56 decode-uri-component drwxr-xr-x 1 lukas users 148 Jan 9 19:56 deep-is drwxr-xr-x 1 lukas users 130 Jan 9 19:56 defaults drwxr-xr-x 1 lukas users 190 Jan 9 19:56 define-properties drwxr-xr-x 1 lukas users 96 Jan 9 19:56 define-property drwxr-xr-x 1 lukas users 98 Jan 9 19:56 delayed-stream drwxr-xr-x 1 lukas users 98 Jan 9 19:56 depd drwxr-xr-x 1 lukas users 88 Jan 9 19:56 des.js drwxr-xr-x 1 lukas users 72 Jan 9 19:56 destroy drwxr-xr-x 1 lukas users 144 Jan 9 19:56 diffie-hellman drwxr-xr-x 1 lukas users 94 Jan 9 19:56 domain-browser drwxr-xr-x 1 lukas users 72 Jan 9 19:56 domelementtype drwxr-xr-x 1 lukas users 70 Jan 9 19:56 domexception drwxr-xr-x 1 lukas users 108 Jan 9 19:56 domhandler drwxr-xr-x 1 lukas users 150 Jan 9 19:56 dom-serializer drwxr-xr-x 1 lukas users 108 Jan 9 19:56 domutils drwxr-xr-x 1 lukas users 128 Jan 9 19:56 dotenv drwxr-xr-x 1 lukas users 116 Jan 9 19:56 dotenv-expand drwxr-xr-x 1 lukas users 92 Jan 9 19:56 dot-prop drwxr-xr-x 1 lukas users 78 Jan 9 19:56 duplexer2 drwxr-xr-x 1 lukas users 92 Jan 9 19:56 ecc-jsbn drwxr-xr-x 1 lukas users 72 Jan 9 19:56 ee-first drwxr-xr-x 1 lukas users 240 Jan 9 19:56 electron-to-chromium drwxr-xr-x 1 lukas users 48 Jan 9 19:56 elliptic drwxr-xr-x 1 lukas users 92 Jan 9 19:56 encodeurl drwxr-xr-x 1 lukas users 116 Jan 9 19:56 entities drwxr-xr-x 1 lukas users 64 Jan 9 19:56 envinfo drwxr-xr-x 1 lukas users 72 Jan 9 19:56 error-ex drwxr-xr-x 1 lukas users 508 Jan 9 19:56 es-abstract drwxr-xr-x 1 lukas users 92 Jan 9 19:56 escalade drwxr-xr-x 1 lukas users 72 Jan 9 19:56 escape-html drwxr-xr-x 1 lukas users 72 Jan 9 19:56 escape-string-regexp drwxr-xr-x 1 lukas users 118 Jan 9 19:56 escodegen drwxr-xr-x 1 lukas users 96 Jan 9 19:56 esprima drwxr-xr-x 1 lukas users 230 Jan 9 19:56 es-to-primitive drwxr-xr-x 1 lukas users 130 Jan 9 19:56 estraverse drwxr-xr-x 1 lukas users 70 Jan 9 19:56 esutils drwxr-xr-x 1 lukas users 92 Jan 9 19:56 etag drwxr-xr-x 1 lukas users 184 Jan 9 19:56 events drwxr-xr-x 1 lukas users 72 Jan 9 19:56 evp_bytestokey drwxr-xr-x 1 lukas users 102 Jan 9 19:56 expand-brackets drwxr-xr-x 1 lukas users 210 Jan 9 19:56 extend drwxr-xr-x 1 lukas users 72 Jan 9 19:56 extend-shallow drwxr-xr-x 1 lukas users 126 Jan 9 19:56 extglob drwxr-xr-x 1 lukas users 172 Jan 9 19:56 extsprintf drwxr-xr-x 1 lukas users 166 Jan 9 19:56 falafel drwxr-xr-x 1 lukas users 134 Jan 9 19:56 fast-deep-equal drwxr-xr-x 1 lukas users 112 Jan 9 19:56 fast-glob drwxr-xr-x 1 lukas users 194 Jan 9 19:56 fast-json-stable-stringify drwxr-xr-x 1 lukas users 90 Jan 9 19:56 fast-levenshtein drwxr-xr-x 1 lukas users 62 Jan 9 19:56 fastparse drwxr-xr-x 1 lukas users 62 Jan 9 19:56 filesize drwxr-xr-x 1 lukas users 162 Jan 9 19:56 file-uri-to-path drwxr-xr-x 1 lukas users 72 Jan 9 19:56 fill-range drwxr-xr-x 1 lukas users 150 Jan 9 19:56 foreach drwxr-xr-x 1 lukas users 72 Jan 9 19:56 forever-agent drwxr-xr-x 1 lukas users 72 Jan 9 19:56 for-in drwxr-xr-x 1 lukas users 106 Jan 9 19:56 form-data drwxr-xr-x 1 lukas users 72 Jan 9 19:56 fragment-cache drwxr-xr-x 1 lukas users 92 Jan 9 19:56 fresh drwxr-xr-x 1 lukas users 84 Jan 9 19:56 fs.realpath drwxr-xr-x 1 lukas users 220 Jan 9 19:56 function-bind drwxr-xr-x 1 lukas users 106 Jan 9 19:56 gensync drwxr-xr-x 1 lukas users 196 Jan 9 19:56 get-intrinsic drwxr-xr-x 1 lukas users 104 Jan 9 19:56 getpass drwxr-xr-x 1 lukas users 72 Jan 9 19:56 get-port drwxr-xr-x 1 lukas users 54 Jan 9 19:56 get-value drwxr-xr-x 1 lukas users 126 Jan 9 19:56 glob drwxr-xr-x 1 lukas users 96 Jan 9 19:56 globals drwxr-xr-x 1 lukas users 96 Jan 9 19:56 glob-parent drwxr-xr-x 1 lukas users 94 Jan 9 19:56 glob-to-regexp drwxr-xr-x 1 lukas users 158 Jan 9 19:56 graceful-fs drwxr-xr-x 1 lukas users 100 Jan 9 19:56 grapheme-breaker drwxr-xr-x 1 lukas users 62 Jan 9 19:56 har-schema drwxr-xr-x 1 lukas users 62 Jan 9 19:56 har-validator drwxr-xr-x 1 lukas users 78 Jan 9 19:56 has drwxr-xr-x 1 lukas users 72 Jan 9 19:56 has-ansi drwxr-xr-x 1 lukas users 72 Jan 9 19:56 has-flag drwxr-xr-x 1 lukas users 96 Jan 9 19:56 hash-base drwxr-xr-x 1 lukas users 102 Jan 9 19:56 hash.js drwxr-xr-x 1 lukas users 174 Jan 9 19:56 has-symbols drwxr-xr-x 1 lukas users 72 Jan 9 19:56 has-value drwxr-xr-x 1 lukas users 96 Jan 9 19:56 has-values drwxr-xr-x 1 lukas users 214 Jan 9 19:56 hex-color-regex drwxr-xr-x 1 lukas users 98 Jan 9 19:56 hmac-drbg drwxr-xr-x 1 lukas users 154 Jan 9 19:56 hsla-regex drwxr-xr-x 1 lukas users 154 Jan 9 19:56 hsl-regex drwxr-xr-x 1 lukas users 72 Jan 9 19:56 html-comment-regex drwxr-xr-x 1 lukas users 70 Jan 9 19:56 html-encoding-sniffer drwxr-xr-x 1 lukas users 174 Jan 9 19:56 htmlnano drwxr-xr-x 1 lukas users 86 Jan 9 19:56 htmlparser2 drwxr-xr-x 1 lukas users 100 Jan 9 19:56 html-tags drwxr-xr-x 1 lukas users 92 Jan 9 19:56 http-errors drwxr-xr-x 1 lukas users 84 Jan 9 19:56 https-browserify drwxr-xr-x 1 lukas users 184 Jan 9 19:56 http-signature drwxr-xr-x 1 lukas users 8 Jan 9 19:56 @iarna drwxr-xr-x 1 lukas users 104 Jan 9 19:56 iconv-lite drwxr-xr-x 1 lukas users 68 Jan 9 19:56 icss-replace-symbols drwxr-xr-x 1 lukas users 92 Jan 9 19:56 ieee754 drwxr-xr-x 1 lukas users 72 Jan 9 19:56 import-fresh drwxr-xr-x 1 lukas users 106 Jan 9 19:56 indexes-of drwxr-xr-x 1 lukas users 78 Jan 9 19:56 inflight drwxr-xr-x 1 lukas users 116 Jan 9 19:56 inherits drwxr-xr-x 1 lukas users 92 Jan 9 19:56 is-absolute-url drwxr-xr-x 1 lukas users 96 Jan 9 19:56 is-accessor-descriptor drwxr-xr-x 1 lukas users 158 Jan 9 19:56 isarray drwxr-xr-x 1 lukas users 166 Jan 9 19:56 is-arrayish drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-binary-path drwxr-xr-x 1 lukas users 80 Jan 9 19:56 is-buffer drwxr-xr-x 1 lukas users 210 Jan 9 19:56 is-callable drwxr-xr-x 1 lukas users 174 Jan 9 19:56 is-color-stop drwxr-xr-x 1 lukas users 192 Jan 9 19:56 is-core-module drwxr-xr-x 1 lukas users 96 Jan 9 19:56 is-data-descriptor drwxr-xr-x 1 lukas users 178 Jan 9 19:56 is-date-object drwxr-xr-x 1 lukas users 96 Jan 9 19:56 is-descriptor drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-directory drwxr-xr-x 1 lukas users 134 Jan 9 19:56 isexe drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-extendable drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-extglob drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-glob drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-html drwxr-xr-x 1 lukas users 200 Jan 9 19:56 is-negative-zero drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-number drwxr-xr-x 1 lukas users 92 Jan 9 19:56 is-obj drwxr-xr-x 1 lukas users 92 Jan 9 19:56 isobject drwxr-xr-x 1 lukas users 92 Jan 9 19:56 is-plain-object drwxr-xr-x 1 lukas users 184 Jan 9 19:56 is-regex drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-resolvable drwxr-xr-x 1 lukas users 158 Jan 9 19:56 isstream drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-svg drwxr-xr-x 1 lukas users 212 Jan 9 19:56 is-symbol drwxr-xr-x 1 lukas users 92 Jan 9 19:56 is-typedarray drwxr-xr-x 1 lukas users 130 Jan 9 19:56 is-url drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-windows drwxr-xr-x 1 lukas users 72 Jan 9 19:56 is-wsl drwxr-xr-x 1 lukas users 136 Jan 9 19:56 jsbn drwxr-xr-x 1 lukas users 118 Jan 9 19:56 jsdom drwxr-xr-x 1 lukas users 100 Jan 9 19:56 jsesc drwxr-xr-x 1 lukas users 100 Jan 9 19:56 json5 drwxr-xr-x 1 lukas users 102 Jan 9 19:56 json-parse-better-errors drwxr-xr-x 1 lukas users 248 Jan 9 19:56 json-schema drwxr-xr-x 1 lukas users 128 Jan 9 19:56 json-schema-traverse drwxr-xr-x 1 lukas users 148 Jan 9 19:56 json-stringify-safe drwxr-xr-x 1 lukas users 112 Jan 9 19:56 jsprim drwxr-xr-x 1 lukas users 96 Jan 9 19:56 js-tokens drwxr-xr-x 1 lukas users 140 Jan 9 19:56 js-yaml drwxr-xr-x 1 lukas users 72 Jan 9 19:56 kind-of drwxr-xr-x 1 lukas users 62 Jan 9 19:56 levn drwxr-xr-x 1 lukas users 16K Jan 9 19:56 lodash drwxr-xr-x 1 lukas users 72 Jan 9 19:56 lodash.clone drwxr-xr-x 1 lukas users 72 Jan 9 19:56 lodash.memoize drwxr-xr-x 1 lukas users 72 Jan 9 19:56 lodash.sortby drwxr-xr-x 1 lukas users 72 Jan 9 19:56 lodash.uniq drwxr-xr-x 1 lukas users 92 Jan 9 19:56 log-symbols drwxr-xr-x 1 lukas users 94 Jan 9 19:56 magic-string drwxr-xr-x 1 lukas users 72 Jan 9 19:56 map-cache drwxr-xr-x 1 lukas users 72 Jan 9 19:56 map-visit drwxr-xr-x 1 lukas users 72 Jan 9 19:56 md5.js drwxr-xr-x 1 lukas users 92 Jan 9 19:56 mdn-data drwxr-xr-x 1 lukas users 72 Jan 9 19:56 merge2 drwxr-xr-x 1 lukas users 96 Jan 9 19:56 merge-source-map drwxr-xr-x 1 lukas users 126 Jan 9 19:56 micromatch drwxr-xr-x 1 lukas users 104 Jan 9 19:56 miller-rabin drwxr-xr-x 1 lukas users 152 Jan 9 19:56 mime drwxr-xr-x 1 lukas users 106 Jan 9 19:56 mime-db drwxr-xr-x 1 lukas users 92 Jan 9 19:56 mime-types drwxr-xr-x 1 lukas users 72 Jan 9 19:56 mimic-fn drwxr-xr-x 1 lukas users 72 Jan 9 19:56 minimalistic-assert drwxr-xr-x 1 lukas users 98 Jan 9 19:56 minimalistic-crypto-utils drwxr-xr-x 1 lukas users 80 Jan 9 19:56 minimatch drwxr-xr-x 1 lukas users 128 Jan 9 19:56 minimist drwxr-xr-x 1 lukas users 96 Jan 9 19:56 mixin-deep drwxr-xr-x 1 lukas users 90 Jan 9 19:56 mkdirp drwxr-xr-x 1 lukas users 32 Jan 9 19:56 @mrmlnc drwxr-xr-x 1 lukas users 78 Jan 9 19:56 ms drwxr-xr-x 1 lukas users 126 Jan 9 19:56 nanomatch drwxr-xr-x 1 lukas users 86 Jan 9 19:56 nice-try drwxr-xr-x 1 lukas users 362 Jan 9 19:56 node-addon-api drwxr-xr-x 1 lukas users 104 Jan 9 19:56 node-forge drwxr-xr-x 1 lukas users 14 Jan 9 19:56 @nodelib drwxr-xr-x 1 lukas users 104 Jan 9 19:56 node-libs-browser drwxr-xr-x 1 lukas users 78 Jan 9 19:56 node-releases drwxr-xr-x 1 lukas users 72 Jan 9 19:56 normalize-path drwxr-xr-x 1 lukas users 72 Jan 9 19:56 normalize-url drwxr-xr-x 1 lukas users 108 Jan 9 19:56 nth-check drwxr-xr-x 1 lukas users 70 Jan 9 19:56 nwsapi drwxr-xr-x 1 lukas users 72 Jan 9 19:56 oauth-sign drwxr-xr-x 1 lukas users 72 Jan 9 19:56 object-assign drwxr-xr-x 1 lukas users 318 Jan 9 19:56 object.assign drwxr-xr-x 1 lukas users 54 Jan 9 19:56 object-copy drwxr-xr-x 1 lukas users 306 Jan 9 19:56 object.getownpropertydescriptors drwxr-xr-x 1 lukas users 262 Jan 9 19:56 object-inspect drwxr-xr-x 1 lukas users 232 Jan 9 19:56 object-keys drwxr-xr-x 1 lukas users 72 Jan 9 19:56 object.pick drwxr-xr-x 1 lukas users 284 Jan 9 19:56 object.values drwxr-xr-x 1 lukas users 72 Jan 9 19:56 object-visit drwxr-xr-x 1 lukas users 70 Jan 9 19:56 once drwxr-xr-x 1 lukas users 72 Jan 9 19:56 onetime drwxr-xr-x 1 lukas users 92 Jan 9 19:56 on-finished drwxr-xr-x 1 lukas users 88 Jan 9 19:56 opn drwxr-xr-x 1 lukas users 86 Jan 9 19:56 optionator drwxr-xr-x 1 lukas users 72 Jan 9 19:56 ora drwxr-xr-x 1 lukas users 110 Jan 9 19:56 os-browserify drwxr-xr-x 1 lukas users 110 Jan 9 19:56 pako drwxr-xr-x 1 lukas users 54 Jan 9 19:56 @parcel drwxr-xr-x 1 lukas users 96 Jan 9 19:56 parcel-bundler drwxr-xr-x 1 lukas users 48 Jan 9 19:56 parse5 drwxr-xr-x 1 lukas users 154 Jan 9 19:56 parse-asn1 drwxr-xr-x 1 lukas users 72 Jan 9 19:56 parse-json drwxr-xr-x 1 lukas users 92 Jan 9 19:56 parseurl drwxr-xr-x 1 lukas users 72 Jan 9 19:56 pascalcase drwxr-xr-x 1 lukas users 92 Jan 9 19:56 path-browserify drwxr-xr-x 1 lukas users 72 Jan 9 19:56 path-dirname drwxr-xr-x 1 lukas users 72 Jan 9 19:56 path-is-absolute drwxr-xr-x 1 lukas users 72 Jan 9 19:56 path-key drwxr-xr-x 1 lukas users 108 Jan 9 19:56 path-parse drwxr-xr-x 1 lukas users 122 Jan 9 19:56 pbkdf2 drwxr-xr-x 1 lukas users 154 Jan 9 19:56 performance-now drwxr-xr-x 1 lukas users 106 Jan 9 19:56 physical-cpu-count drwxr-xr-x 1 lukas users 754 Jan 9 19:56 pn drwxr-xr-x 1 lukas users 72 Jan 9 19:56 posix-character-classes drwxr-xr-x 1 lukas users 118 Jan 9 19:56 postcss drwxr-xr-x 1 lukas users 112 Jan 9 19:56 postcss-calc drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-colormin drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-convert-values drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-discard-comments drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-discard-duplicates drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-discard-empty drwxr-xr-x 1 lukas users 138 Jan 9 19:56 postcss-discard-overridden drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-merge-longhand drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-merge-rules drwxr-xr-x 1 lukas users 88 Jan 9 19:56 postcss-minify-font-values drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-minify-gradients drwxr-xr-x 1 lukas users 88 Jan 9 19:56 postcss-minify-params drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-minify-selectors drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-modules-extract-imports drwxr-xr-x 1 lukas users 120 Jan 9 19:56 postcss-modules-local-by-default drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-modules-scope drwxr-xr-x 1 lukas users 128 Jan 9 19:56 postcss-modules-values drwxr-xr-x 1 lukas users 88 Jan 9 19:56 postcss-normalize-charset drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-normalize-display-values drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-normalize-positions drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-normalize-repeat-style drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-normalize-string drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-normalize-timing-functions drwxr-xr-x 1 lukas users 120 Jan 9 19:56 postcss-normalize-unicode drwxr-xr-x 1 lukas users 120 Jan 9 19:56 postcss-normalize-url drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-normalize-whitespace drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-ordered-values drwxr-xr-x 1 lukas users 104 Jan 9 19:56 postcss-reduce-initial drwxr-xr-x 1 lukas users 72 Jan 9 19:56 postcss-reduce-transforms drwxr-xr-x 1 lukas users 164 Jan 9 19:56 postcss-selector-parser drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-svgo drwxr-xr-x 1 lukas users 96 Jan 9 19:56 postcss-unique-selectors drwxr-xr-x 1 lukas users 62 Jan 9 19:56 postcss-value-parser drwxr-xr-x 1 lukas users 96 Jan 9 19:56 posthtml drwxr-xr-x 1 lukas users 166 Jan 9 19:56 posthtml-parser drwxr-xr-x 1 lukas users 86 Jan 9 19:56 posthtml-render drwxr-xr-x 1 lukas users 86 Jan 9 19:56 prelude-ls drwxr-xr-x 1 lukas users 124 Jan 9 19:56 process drwxr-xr-x 1 lukas users 78 Jan 9 19:56 process-nextick-args drwxr-xr-x 1 lukas users 130 Jan 9 19:56 psl drwxr-xr-x 1 lukas users 238 Jan 9 19:56 public-encrypt drwxr-xr-x 1 lukas users 124 Jan 9 19:56 punycode drwxr-xr-x 1 lukas users 92 Jan 9 19:56 purgecss drwxr-xr-x 1 lukas users 100 Jan 9 19:56 q drwxr-xr-x 1 lukas users 172 Jan 9 19:56 qs drwxr-xr-x 1 lukas users 256 Jan 9 19:56 querystring drwxr-xr-x 1 lukas users 164 Jan 9 19:56 querystring-es3 drwxr-xr-x 1 lukas users 134 Jan 9 19:56 quote-stream drwxr-xr-x 1 lukas users 146 Jan 9 19:56 randombytes drwxr-xr-x 1 lukas users 146 Jan 9 19:56 randomfill drwxr-xr-x 1 lukas users 92 Jan 9 19:56 range-parser drwxr-xr-x 1 lukas users 394 Jan 9 19:56 readable-stream drwxr-xr-x 1 lukas users 104 Jan 9 19:56 readdirp drwxr-xr-x 1 lukas users 98 Jan 9 19:56 regenerate drwxr-xr-x 1 lukas users 232 Jan 9 19:56 regenerate-unicode-properties drwxr-xr-x 1 lukas users 90 Jan 9 19:56 regenerator-runtime drwxr-xr-x 1 lukas users 68 Jan 9 19:56 regenerator-transform drwxr-xr-x 1 lukas users 96 Jan 9 19:56 regex-not drwxr-xr-x 1 lukas users 140 Jan 9 19:56 regexpu-core drwxr-xr-x 1 lukas users 94 Jan 9 19:56 regjsgen drwxr-xr-x 1 lukas users 130 Jan 9 19:56 regjsparser drwxr-xr-x 1 lukas users 62 Jan 9 19:56 relateurl drwxr-xr-x 1 lukas users 92 Jan 9 19:56 remove-trailing-separator drwxr-xr-x 1 lukas users 72 Jan 9 19:56 repeat-element drwxr-xr-x 1 lukas users 72 Jan 9 19:56 repeat-string drwxr-xr-x 1 lukas users 146 Jan 9 19:56 request drwxr-xr-x 1 lukas users 98 Jan 9 19:56 request-promise-core drwxr-xr-x 1 lukas users 80 Jan 9 19:56 request-promise-native drwxr-xr-x 1 lukas users 220 Jan 9 19:56 resolve drwxr-xr-x 1 lukas users 72 Jan 9 19:56 resolve-from drwxr-xr-x 1 lukas users 182 Jan 9 19:56 resolve-url drwxr-xr-x 1 lukas users 72 Jan 9 19:56 restore-cursor drwxr-xr-x 1 lukas users 62 Jan 9 19:56 ret drwxr-xr-x 1 lukas users 154 Jan 9 19:56 rgba-regex drwxr-xr-x 1 lukas users 154 Jan 9 19:56 rgb-regex drwxr-xr-x 1 lukas users 86 Jan 9 19:56 rimraf drwxr-xr-x 1 lukas users 96 Jan 9 19:56 ripemd160 drwxr-xr-x 1 lukas users 92 Jan 9 19:56 safe-buffer drwxr-xr-x 1 lukas users 146 Jan 9 19:56 safer-buffer drwxr-xr-x 1 lukas users 128 Jan 9 19:56 safe-regex drwxr-xr-x 1 lukas users 62 Jan 9 19:56 sax drwxr-xr-x 1 lukas users 86 Jan 9 19:56 saxes drwxr-xr-x 1 lukas users 122 Jan 9 19:56 semver drwxr-xr-x 1 lukas users 116 Jan 9 19:56 send drwxr-xr-x 1 lukas users 68 Jan 9 19:56 serialize-to-js drwxr-xr-x 1 lukas users 92 Jan 9 19:56 serve-static drwxr-xr-x 1 lukas users 76 Jan 9 19:56 setimmediate drwxr-xr-x 1 lukas users 100 Jan 9 19:56 setprototypeof drwxr-xr-x 1 lukas users 72 Jan 9 19:56 set-value drwxr-xr-x 1 lukas users 226 Jan 9 19:56 sha.js drwxr-xr-x 1 lukas users 128 Jan 9 19:56 shallow-copy drwxr-xr-x 1 lukas users 72 Jan 9 19:56 shebang-command drwxr-xr-x 1 lukas users 72 Jan 9 19:56 shebang-regex drwxr-xr-x 1 lukas users 124 Jan 9 19:56 signal-exit drwxr-xr-x 1 lukas users 96 Jan 9 19:56 simple-swizzle drwxr-xr-x 1 lukas users 102 Jan 9 19:56 snapdragon drwxr-xr-x 1 lukas users 96 Jan 9 19:56 snapdragon-node drwxr-xr-x 1 lukas users 72 Jan 9 19:56 snapdragon-util drwxr-xr-x 1 lukas users 150 Jan 9 19:56 source-map drwxr-xr-x 1 lukas users 152 Jan 9 19:56 source-map-resolve drwxr-xr-x 1 lukas users 184 Jan 9 19:56 source-map-support drwxr-xr-x 1 lukas users 218 Jan 9 19:56 source-map-url drwxr-xr-x 1 lukas users 96 Jan 9 19:56 split-string drwxr-xr-x 1 lukas users 150 Jan 9 19:56 sprintf-js drwxr-xr-x 1 lukas users 92 Jan 9 19:56 srcset drwxr-xr-x 1 lukas users 116 Jan 9 19:56 sshpk drwxr-xr-x 1 lukas users 106 Jan 9 19:56 stable drwxr-xr-x 1 lukas users 198 Jan 9 19:56 static-eval drwxr-xr-x 1 lukas users 54 Jan 9 19:56 static-extend drwxr-xr-x 1 lukas users 152 Jan 9 19:56 static-module drwxr-xr-x 1 lukas users 112 Jan 9 19:56 statuses drwxr-xr-x 1 lukas users 82 Jan 9 19:56 stealthy-require drwxr-xr-x 1 lukas users 114 Jan 9 19:56 stream-browserify drwxr-xr-x 1 lukas users 160 Jan 9 19:56 stream-http drwxr-xr-x 1 lukas users 62 Jan 9 19:56 string_decoder drwxr-xr-x 1 lukas users 284 Jan 9 19:56 string.prototype.trimend drwxr-xr-x 1 lukas users 284 Jan 9 19:56 string.prototype.trimstart drwxr-xr-x 1 lukas users 96 Jan 9 19:56 strip-ansi drwxr-xr-x 1 lukas users 96 Jan 9 19:56 stylehacks drwxr-xr-x 1 lukas users 92 Jan 9 19:56 supports-color drwxr-xr-x 1 lukas users 188 Jan 9 19:56 svgo drwxr-xr-x 1 lukas users 62 Jan 9 19:56 symbol-tree drwxr-xr-x 1 lukas users 124 Jan 9 19:56 terser drwxr-xr-x 1 lukas users 84 Jan 9 19:56 through2 drwxr-xr-x 1 lukas users 100 Jan 9 19:56 timers-browserify drwxr-xr-x 1 lukas users 114 Jan 9 19:56 timsort drwxr-xr-x 1 lukas users 80 Jan 9 19:56 tiny-inflate drwxr-xr-x 1 lukas users 146 Jan 9 19:56 to-arraybuffer drwxr-xr-x 1 lukas users 72 Jan 9 19:56 to-fast-properties drwxr-xr-x 1 lukas users 72 Jan 9 19:56 toidentifier drwxr-xr-x 1 lukas users 72 Jan 9 19:56 to-object-path drwxr-xr-x 1 lukas users 96 Jan 9 19:56 to-regex drwxr-xr-x 1 lukas users 72 Jan 9 19:56 to-regex-range drwxr-xr-x 1 lukas users 62 Jan 9 19:56 tough-cookie drwxr-xr-x 1 lukas users 84 Jan 9 19:56 tr46 drwxr-xr-x 1 lukas users 84 Jan 9 19:56 tty-browserify drwxr-xr-x 1 lukas users 72 Jan 9 19:56 tunnel-agent drwxr-xr-x 1 lukas users 278 Jan 9 19:56 tweetnacl drwxr-xr-x 1 lukas users 62 Jan 9 19:56 type-check drwxr-xr-x 1 lukas users 128 Jan 9 19:56 typedarray drwxr-xr-x 1 lukas users 2 Jan 9 19:56 @types drwxr-xr-x 1 lukas users 98 Jan 9 19:56 uncss drwxr-xr-x 1 lukas users 88 Jan 9 19:56 unicode-canonical-property-names-ecmascript drwxr-xr-x 1 lukas users 88 Jan 9 19:56 unicode-match-property-ecmascript drwxr-xr-x 1 lukas users 96 Jan 9 19:56 unicode-match-property-value-ecmascript drwxr-xr-x 1 lukas users 88 Jan 9 19:56 unicode-property-aliases-ecmascript drwxr-xr-x 1 lukas users 220 Jan 9 19:56 unicode-trie drwxr-xr-x 1 lukas users 72 Jan 9 19:56 union-value drwxr-xr-x 1 lukas users 98 Jan 9 19:56 uniq drwxr-xr-x 1 lukas users 94 Jan 9 19:56 uniqs drwxr-xr-x 1 lukas users 92 Jan 9 19:56 unquote drwxr-xr-x 1 lukas users 96 Jan 9 19:56 unset-value drwxr-xr-x 1 lukas users 86 Jan 9 19:56 upath drwxr-xr-x 1 lukas users 82 Jan 9 19:56 uri-js drwxr-xr-x 1 lukas users 98 Jan 9 19:56 urix drwxr-xr-x 1 lukas users 180 Jan 9 19:56 url drwxr-xr-x 1 lukas users 72 Jan 9 19:56 use drwxr-xr-x 1 lukas users 132 Jan 9 19:56 util drwxr-xr-x 1 lukas users 110 Jan 9 19:56 util-deprecate drwxr-xr-x 1 lukas users 258 Jan 9 19:56 util.promisify drwxr-xr-x 1 lukas users 168 Jan 9 19:56 uuid drwxr-xr-x 1 lukas users 118 Jan 9 19:56 v8-compile-cache drwxr-xr-x 1 lukas users 76 Jan 9 19:56 vendors drwxr-xr-x 1 lukas users 156 Jan 9 19:56 verror drwxr-xr-x 1 lukas users 94 Jan 9 19:56 vlq drwxr-xr-x 1 lukas users 188 Jan 9 19:56 vm-browserify drwxr-xr-x 1 lukas users 108 Jan 9 19:56 w3c-hr-time drwxr-xr-x 1 lukas users 48 Jan 9 19:56 w3c-xmlserializer drwxr-xr-x 1 lukas users 132 Jan 9 19:56 wcwidth drwxr-xr-x 1 lukas users 68 Jan 9 19:56 webidl-conversions drwxr-xr-x 1 lukas users 70 Jan 9 19:56 whatwg-encoding drwxr-xr-x 1 lukas users 70 Jan 9 19:56 whatwg-mimetype drwxr-xr-x 1 lukas users 70 Jan 9 19:56 whatwg-url drwxr-xr-x 1 lukas users 102 Jan 9 19:56 which drwxr-xr-x 1 lukas users 92 Jan 9 19:56 word-wrap drwxr-xr-x 1 lukas users 74 Jan 9 19:56 wrappy drwxr-xr-x 1 lukas users 78 Jan 9 19:56 ws drwxr-xr-x 1 lukas users 150 Jan 9 19:56 xmlchars drwxr-xr-x 1 lukas users 70 Jan 9 19:56 xml-name-validator drwxr-xr-x 1 lukas users 132 Jan 9 19:56 xtend -rw-r--r-- 1 lukas users 124K Jan 9 19:56 .yarn-integrity ```

Note that yarn doesn't even use symlinks. I was told that they used to do that, but even symlinking everything into one directory breaks some packages.

Profpatsch commented 3 years ago

Okay, hm, seems like we might want two flags, then, or just bite the bullet and always copy the complete transitive closure, which makes the whole thing slow.

On btrfs the cp is fast (that is copy-on-write) if you use reflink=always, but will fail on other file systems.

Do you know if yarn links the combined transitive closure of dev and runtime dependencies?

Hmm, okay, so I’d propose having two flags

{ linkTransitiveClosure ? true
, linkingMode ? "symlink" }

since the symlinking the transitive closure at every stage shouldn’t be too much overhead, whereas actually copying it leads to considerable duplication and makes the build slower than necessary. Which means those few completely braindead packages fail until you flip linkingMode to "copy" (which we should implement with reflink=auto), but that’s a good trade-off I would say.

sternenseemann commented 3 years ago

Do you know if yarn links the combined transitive closure of dev and runtime dependencies?

I think so:

Development dependencies are very much like regular dependencies except that they only matter for local packages. Packages fetched from remote registries such as npm will not be able to access their development dependencies, but packages installed from local sources (such as workspaces or the portal: protocol) will. — Source

Hmm, okay, so I’d propose having two flags

Yeah that was roughly my idea, too. reflink=auto seems like a good idea, too.

sternenseemann commented 3 years ago

It seems to me that this function implements the building of node_modules. I haven't yet looked into it too much, though.