Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug?]: Yarn downloads irrelevant optional dependencies (e.g. for a different OS) #3317

Closed
1 task
evanw opened this issue Aug 18, 2021 · 11 comments · Fixed by #3575
Closed
1 task

[Bug?]: Yarn downloads irrelevant optional dependencies (e.g. for a different OS) #3317

evanw opened this issue Aug 18, 2021 · 11 comments · Fixed by #3575
Labels
ecosystem This feature affects the whole ecosystem enhancement New feature or request

Comments

@evanw
Copy link

evanw commented Aug 18, 2021

Self-service

  • I'd be willing to implement a fix

Describe the bug

I'm the main developer behind esbuild and I'm working on changing the installation strategy for the binary executable from an install script to a list of optional dependencies, one for each supported OS and architecture combination. This works fine with npm and pnpm but doesn't work well with Yarn because Yarn always downloads all optional dependencies instead of only downloading the optional dependency for the current OS and architecture. So switching installation strategies would presumably make installing esbuild with Yarn a lot slower than it should be.

The motivation for doing this is to move the complexity of figuring out what to download from where out of the esbuild package and into the package manager instead. That way installing esbuild should "just work" in complex scenarios including when offline, with a custom registry, with a custom proxy, or with limited file system permissions. Some of these scenarios don't work with esbuild's current install script and it's sometimes very hard to debug these issues since it's hard to replicate a user's network environment. See evanw/esbuild#789 (comment) and the surrounding thread for more context.

To reproduce

These specific instructions are for macOS:

$ echo '{ "dependencies": { "esbuild-experimental-optdeps": "0.12.3" } }' > package.json
$ touch yarn.lock
$ rm -f ~/.yarn/berry/cache/esbuild-*
$ yarn set version berry
$ yarn
$ ls ~/.yarn/berry/cache/esbuild-*
esbuild-darwin-64-npm-0.12.3-3bce268eff-8.zip
esbuild-darwin-arm64-npm-0.12.3-2067324df1-8.zip
esbuild-experimental-optdeps-npm-0.12.3-da58fe24de-8.zip
esbuild-freebsd-64-npm-0.12.3-b28b30bfa6-8.zip
esbuild-freebsd-arm64-npm-0.12.3-5601b669f5-8.zip
esbuild-linux-32-npm-0.12.3-182249b5a7-8.zip
esbuild-linux-64-npm-0.12.3-4067979d42-8.zip
esbuild-linux-arm-npm-0.12.3-91320e7a3b-8.zip
esbuild-linux-arm64-npm-0.12.3-ef73807905-8.zip
esbuild-linux-mips64le-npm-0.12.3-daf3dd1009-8.zip
esbuild-linux-ppc64le-npm-0.12.3-81866b1f7b-8.zip
esbuild-windows-32-npm-0.12.3-778762815e-8.zip
esbuild-windows-64-npm-0.12.3-5ac80b68d1-8.zip

The esbuild-experimental-optdeps package is one I have made specifically to test this optional dependency installation strategy. As you can see here, all 13 packages have been downloaded instead of only downloading the 2 relevant packages like both npm and pnpm. See evanw/esbuild#789 (comment) for more detail about npm and pnpm.

Environment

System:
  OS: macOS 11.5.1
  CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Binaries:
  Node: 16.5.0 - /private/var/folders/j6/np400cw17sz0n5ljd67byrzw0000gn/T/xfs-0b02617d/node
  Yarn: 3.0.1 - /private/var/folders/j6/np400cw17sz0n5ljd67byrzw0000gn/T/xfs-0b02617d/yarn
  npm: 7.20.6 - ~/.npm-local/bin/npm

Additional context

Yarn's inefficient behavior here isn't a deal-breaker for me since it isn't a correctness issue, just a performance issue. But at some point I may move forward with this different package installation strategy for esbuild, at which point installing esbuild with Yarn will become much slower than with npm and pnpm.

@arcanis

This comment has been minimized.

@arcanis arcanis added ecosystem This feature affects the whole ecosystem enhancement New feature or request and removed bug Something isn't working labels Aug 19, 2021
@evanw
Copy link
Author

evanw commented Aug 19, 2021

Forgive my lack of understanding (I don't know what the formal semantics of optionalDependencies are supposed to be), but I'm assuming what npm is doing is correct and when npm installs [email protected], it appears to download the metadata for all packages and construct a package-lock.json file with all packages but it appears to only actually download one package. This is different from Yarn which appears to actually download all packages.

Each of my packages is much bigger than its metadata (metadata is ~0.5mb, package is ~8mb), so I was hoping to use optional dependencies to have the install process still be relatively efficient despite having many dependencies. In other words while npm appears to be downloading approximately 0.5mb * 13 + 8mb = 14.5mb, Yarn appears to be downloading approximately 0.5mb * 13 + 8mb * 12 = 102.5mb making the install process slower, especially over slow connections. Edit: actually those sizes are uncompressed instead of compressed, but it's the same idea.

Is the difference in observed behavior here an indication that npm is doing something wrong? Or perhaps does way Yarn's internals work make it not viable to use the package metadata without downloading the package contents? I was hoping that this approach would be a good broadly-compatible path forward for packages with prebuilt binary executables, but I understand very little about how package managers actually work so I could be totally off. I really appreciate you taking the time to respond to my questions!

@arcanis
Copy link
Member

arcanis commented Aug 19, 2021

I just dig a little deeper - it appears you're correct, and other package managers skip installing this package. Strangely it goes against what the old Yarn doc stated, perhaps that's where I got confused. Since I'm wrong on that I'll be a little bit less passionate in my arguments, although I'm not quite sure we can/should change this behaviour yet 😄

One important thing about Yarn is that we try hard to provide a development environment that's the same from one person to the other. Of course native packages are kinda on their own, but at least we want to enforce that the package resolution is stable regardless of the system. In the case of node_modules installs it's perhaps even more important than PnP since different packages can lead to different hoisting. So not installing optional deps not only affects them, but also may change how the whole installed tree looks like (unless we do something like not hoisting optional deps' deps?).

I was wondering how that works. It looks like npm only downloads the package for the current platform so I assumed npm's cross-platform caching use case had to work out somehow. But maybe npm's caching is actually broken in this area?

I might be mistaken, but npm's cache isn't intended to be cross platform. By contrast Yarn has always offered a fairly strong set of caching guarantees via the Offline Mirror. Afaik npm never implemented this (although they came close once, with npm archive).

With 2+ we even introduced Zero-Installs, which push that even further. But native deps are already a problem with that, so adding optional deps to the mix may not change things much (although it'd lead to different .pnp.cjs files depending on the system, which isn't a problem currently ... could be adressed by encoding all the dependencies and filtering the right alternatives at runtime, but it starts to become quite complex).

Isn't that something that yarnpkg/berry#2751 would have to solve as well though? Or does that proposal still always download all packages for all platforms? If so, then the package variants feature wouldn't be helpful for esbuild's use case after all since I'm trying to avoid always downloading all packages for all platforms. I'm mentioning this since you asked about that proposal in relation to esbuild in #1154.

#2751 doesn't have this problem - by default it would only install for the current platform, but you could list other ones to be fetched and cached using your configuration (see the section called "Cache integration").

By writing this I notice however that #2751 would fall as well in the case where the resolution will necessarily be different depending on the systems. So perhaps my prejudices against skipping optional dependencies are a little bit too extreme and will have to be addressed sooner or later.

@larixer
Copy link
Member

larixer commented Aug 19, 2021

In the case of node_modules installs it's perhaps even more important than PnP since different packages can lead to different hoisting

I don't see how it's more important for node_modules installs, to be fair. The package for your system will be available on some spot inside node_modules, otherwise, the hoisting layout will be the same on all the systems.

@evanw
Copy link
Author

evanw commented Sep 22, 2021

Heads up that esbuild’s package installation now works this way as of version 0.13.0.

@merceyz
Copy link
Member

merceyz commented Sep 22, 2021

@evanw Thanks for the heads up, seems our e2e test isn't happy with the 0.13.0 release https://github.com/yarnpkg/berry/runs/3680543550#step:5:53

@evanw
Copy link
Author

evanw commented Sep 22, 2021

Ah, whoops. I have a Yarn PnP workaround that needs to copy the binary executable out of the zip file before it needs to be run and it looks like I forgot a mkdir -p before writing to the file. My testing worked on my machine because that directory already existed. I'll push out a fix for that now.

@merceyz
Copy link
Member

merceyz commented Sep 22, 2021

Since esbuild has a postinstall it is already out of the zip file so you could place it there instead

@evanw
Copy link
Author

evanw commented Sep 22, 2021

Thanks for the pointers! I like the sound of preferUnplugged: true. I think I'll take that approach since it's the simplest.

@merceyz
Copy link
Member

merceyz commented Sep 22, 2021

I edited it away as it will unpack all the versions when only one of them will be used, what you're doing now is more efficient disk usage. It would actually be preferable if you set preferUnplugged: false on them so they wont be unpacked unnecessarily

evanw added a commit to evanw/esbuild that referenced this issue Sep 23, 2021
This is a yarn-specific "package.json" flag and is being added at the recommendation of the Yarn team. Even though esbuild's binary packages are listed as optional dependencies of the main package, Yarn still installs all of them (even though only one applies to the current platform). And unlike npm, which always installs a given package into a directory on the file system, Yarn can represent a given package either as a zip file or as a directory of files. So ideally as many packages as possible are represented as zip files to minimize wasted space on the file system (since zip files are compressed). One of the heuristics that Yarn uses is to represent a package as a directory if it contains a file ending in ".exe" so unfortunately esbuild's three Windows packages are always stored as directories instead of as zip files, which means they are uncompressed and are larger than necessary. Specifying "preferUnplugged: false" should avoid this. Hopefully someday Yarn won't even install these packages on the file system in the first place to eliminate the wasted space completely.

See also:

* https://yarnpkg.com/configuration/manifest/#preferUnplugged
* yarnpkg/berry#3317 (comment)
@arcanis arcanis mentioned this issue Oct 14, 2021
3 tasks
eduardoboucas pushed a commit to netlify/esbuild that referenced this issue Dec 3, 2021
* fix evanw#1327: improve lowered template literals

* fix(linker): order of css imported from js (evanw#1342)

* release notes for evanw#1342

* update compat-table

* fix for "export default class" transform (evanw#1346)

* publish 0.12.6 to npm

* add support for es5-style identifiers (evanw#1349)

* runtime: remove "__platform" flag

* runtime: remove "__profiler" flag

* runtime: check "for-of" not "=>" for es6 support

* fix evanw#1349: quote modern unicode object properties

* fix evanw#1355: ignore tsconfig.json in node_modules

* fix evanw#1357: "--metafile" with "--watch"

* fix(linker): add missing esm flag (evanw#1338)

* Allow OnResolve plugins to mark modules as side effect free (evanw#1313)

* publish 0.12.7 to npm

* fix evanw#1358: remove warning about source map comment

* publish 0.12.8 to npm

* fix evanw#1361: allow "this" with "--define"

* fix evanw#1372: css minification bug with !important

* publish 0.12.9 to npm

* avoid checking "browser" for other platforms

* add an "es2021" target

* Avoid exporting a pointer to a loop variable in linker (evanw#1389)

The Bazel nogo (Go lint config) errored when I tried to compile esbuild:

    compilepkg: nogo: errors found by nogo during build-time code analysis:
    external/com_github_evanw_esbuild/internal/bundler/linker.go:3309:27:
     exporting a pointer for the loop variable stmt (export_loop_ref)

The simplified code nogo complains about is:

    for _, stmt := range partStmts {
      stmt.Data = &js_ast.SImport{
        StarNameLoc: &stmt.Loc,
      }
    }

The problem is `&stmt.Loc` points to the mutated loop variable `stmt`.  After
the loop iteration ends, all stored pointers will point to the last value of
`partStmts[-1].Loc`.

An alternative solution is to shadow `stmt` at the beginning of the loop, but
this felt cleaner:

    stmt := stmt

The lint rule is defined by https://github.com/kyoh86/exportloopref.

* feat: mangle Infinity (evanw#1385)

* add support for shorten transform/translate3d (evanw#1390)

* css: implement minification for all matrix forms

* fix evanw#1397: support "s" in css attribute selectors

* publish 0.12.10 to npm

* fix evanw#1399: avoid "os.MkdirAll" to fix WebAssembly

* fix evanw#1396: improve invalid loader error message

* improve sync performance of js api by ~20x (evanw#1000)

* fix windows issues

* publish 0.12.11 to npm

* move unique key prefix from compile to scan phase

* add "C" to unique keys for chunks

* fix evanw#1044: correct relative paths for file loader

* fix a windows path issue

* publish 0.12.12 to npm

* Fix using JS synchronous API from from non-main threads (evanw#1411)

* publish 0.12.13 to npm

* keep wasm tests self-contained

* factor out some code related to "outfile"

* pull out relative-to-outbase code

* fix evanw#1404: "file" loader always copies to "outdir"

* publish 0.12.14 to npm

* fix evanw#1421: bug with css color lowering and "var()"

* avoid "var()" issues with other css minifications

* publish 0.12.15 to npm

* update the compat table

* allow out-of-range tagged template unicode escapes

* fix evanw#1426: remove warning about bad CSS "@" rules

* fix evanw#1470: allow "ES2021" in "tsconfig.json"

* fix evanw#1462: avoid worker_threads in node <v12.17.0

* fix evanw#1466: paths with "node:" prefix are external

* Consider `\` and `/` to be the same in file paths (evanw#1472)

* publish 0.12.16 to npm

* fix evanw#1455: bundler hoisting bug with var+for loops

* fix evanw#1418: private fields and logical assignment

* Abort esbuild if stdin is closed when serving (evanw#1449)

* release notes for evanw#1449

* fix evanw#1424: always generate private method names

* publish 0.12.17 to npm

* fix evanw#1483: UTF-8 and utf-8 are the same @charset

* improve error about missing sub-condition (evanw#1484)

* refactor(deno): use denoflate instead of compress (evanw#1482)

deno.land/x/denoflate is about 10% smaller, and a lot more polished and
up to date than deno.land/x/compress.

* fix evanw#1493: nullish coalescing assignment edge case

* fix evanw#1489: do not warn about "es3" in node_modules

* fix evanw#1497: "this" before "super()" when minifying

* avoid shadowing "expr" in "lowerClass"

* fix evanw#1498: variable shadowing broke class lowering

* fix: CSS import relative paths (evanw#1494)

* add release notes for evanw#1494

* publish 0.12.18 to npm

* move source map code to source map module

* css: add location info to rules

* css: printer returns result object

* move span object to logger

* css: add support for source maps

* add extension to source map tests

* add a basic css source map test

* fix evanw#519: release notes for css source maps

* fix evanw#1507: wrong ts class field side effect order

* publish 0.12.19 to npm

* avoid printing "</style" in CSS code (evanw#1509)

* attempt to fix flaky test

* update browser compat data

* fix evanw#1512: asi issue with "." and type parameters

* fix evanw#1509: make `</script` escape case-insensitive

* publish 0.12.20 to npm

* update to go version 1.17.0

* fix evanw#995: windows arm64 support

* run go format from go 1.17.0

* css: terminate source map comment before "*/"

* add windows 64-bit arm build to installer (evanw#995)

* publish 0.12.21 to npm

* fix evanw#1536: http range requests now use less memory

* fix evanw#1538: minify bug for "var()" and "box-shadow"

* publish 0.12.22 to npm

* fix evanw#1553: rest bindings in TypeScript arrow types

* fix evanw#1545: "watch" is not allowed with "buildSync"

* fix evanw#1552: keep names + minify + nested functions

* forbid "watch" w/ "buildSync" w/o "worker_threads"

* publish 0.12.23 to npm

* fix direct "eval" variable renaming edge case

* publish 0.12.24 to npm

* fix evanw#1560: bug with "!" after "new" in TypeScript

* capture and report parser panics

* fix parser panic due to "#a in #b in c"

* class static blocks are a parse error

* illumos 64-bit support (evanw#1562)

* release notes for evanw#1562

* publish 0.12.25 to npm

* feat: Optimizing the __require function (evanw#1580)

* release notes for evanw#1579

* move "NO_COLOR" handling into the logger itself

* add an "analyze metafile" api

* add import paths to analysis

* add a "verbose" flag to analysis

* fix evanw#1568: release notes for "--analyze"

* upgrade "golang.org/x/sys" (evanw#1572)

* publish 0.12.26 to npm

* fix evanw#1594: update manual compat table overrides

* replace math.MaxInt usage (evanw#1585)

This constant is only available in go >= 1.17, so I've inlined its value
so dependents don't have to upgrade their go version.

reference implementation: https://cs.opensource.google/go/go/+/refs/tags/go1.17:src/math/const.go;l=38

* fix evanw#1589: server "stop()" waits for active builds

* use "math.MaxUint32" not "math.MaxInt"

* update go 1.17.0 => go 1.17.1

* publish 0.12.27 to npm

* fix evanw#1599: U+30FB and U+FF65 in ES5 vs. ES6+

* fix evanw#1600: "++" and "--" on class private fields

* publish 0.12.28 to npm

* fix evanw#1614: proxy from "__require" to "require"

* fix evanw#1623: ignore class fields marked "abstract"

* "typeof identifier" has no side effects

* fix "__require" to have no side effects

* fix mangle syntax edge case with "==" and "!="

* fix missing return in "IsNumericValue"

* add "--analyze" to cli help text

* publish 0.12.29 to npm

* no side effects for "typeof x != undefined && x"

* separate "ignore annotations" from "tree shaking" (evanw#1625)

* install using "optionalDependencies" (evanw#1621)

* release notes

* publish 0.13.0 to npm

* fix release gh action to ignore nested headers

* fix the "esbuild" package in yarn 2+

* yarn pnp compat: copy binary into the current pkg

* publish 0.13.1 to npm

* fix evanw#1628: "export {}" with "--tree-shaking=true"

* fix cache condition in iswin_wasm (evanw#1630)

* publish 0.13.2 to npm

* add "preferUnplugged: false" to binary packages

This is a yarn-specific "package.json" flag and is being added at the recommendation of the Yarn team. Even though esbuild's binary packages are listed as optional dependencies of the main package, Yarn still installs all of them (even though only one applies to the current platform). And unlike npm, which always installs a given package into a directory on the file system, Yarn can represent a given package either as a zip file or as a directory of files. So ideally as many packages as possible are represented as zip files to minimize wasted space on the file system (since zip files are compressed). One of the heuristics that Yarn uses is to represent a package as a directory if it contains a file ending in ".exe" so unfortunately esbuild's three Windows packages are always stored as directories instead of as zip files, which means they are uncompressed and are larger than necessary. Specifying "preferUnplugged: false" should avoid this. Hopefully someday Yarn won't even install these packages on the file system in the first place to eliminate the wasted space completely.

See also:

* https://yarnpkg.com/configuration/manifest/#preferUnplugged
* yarnpkg/berry#3317 (comment)

* support type-only import/export specifiers (evanw#1637)

* publish 0.13.3 to npm

* fix evanw#1642: permission issues with install script

* basic support for ".mts" and ".cts" from TS 4.5

* fix evanw#1647: add a fallback for "npm --no-optional"

* make pnpapi workaround platform-specific (evanw#1656)

I'm not sure if this will fix anything, but it probably couldn't hurt.

* no optimizations with yarn 1 just in case (evanw#1656)

* fix evanw#1657: invalid css transform of margin/padding

* remove ".mts" and ".cts" from resolve extensions

* publish 0.13.4 to npm

* fix evanw#1113: improve watch mode accuracy (evanw#1676)

* disallow certain "<" in ".mts/.cts" files

* fix evanw#1665: don’t remove empty @Keyframes (evanw#1669)

* release notes for evanw#1665

* Don't emit "duplicate label" error across function scopes. (evanw#1671)

* release notes for evanw#1671

* publish 0.13.5 to npm

* Add NetBSD amd64 binary (evanw#1624)

* https in changelog, rebalance makefile

* Allow bundled esbuild with ESBUILD_BINARY_PATH (evanw#1678)

* feat: drop catch binding when optional catch binding is supported (evanw#1660)

* fix subtle minify issues with eval

* ts: forbid "declare" fields from being initialized

* ts: forbid "declare" on non-field class properties

* fix evanw#1675: run decorators for "declare" fields

* avoid direct eval retaining unused imports in ts

* publish 0.13.6 to npm

* update parcel 2 version in benchmark

* remove now-unnecessary "@parcel/transformer-typescript-tsc"

* remove old bundler versions

* update rollup and webpack too

* update benchmark image

* fix evanw#1682: always use the shortest css alpha value

* fix evanw#1680: match node's core module behavior

* update go 1.17.1 => 1.17.2

* fix wasm on go 1.17.2 (evanw#1684)

* update rollup tests so they work on node v16.11.1

* publish 0.13.7 to npm

* fix evanw#1425: super inside arrow inside lowered async

* add "and CSS" to package description

* fix evanw#1661: remove implicit trailing "/" in "[dir]"

* add a test for evanw#1362

* publish 0.13.8 to npm

* fix evanw#1702: invalid css transform of border-radius

* make yaml formatting consistent

* add simple end-to-end tests

* fix evanw#1703: handle silent "rename" syscall failure

* add pnpm end-to-end tests

* check end-to-end test output

* resolver: rename "pe" => "pj"

* remove unused range

* fix evanw#1691: support "imports" in "package.json"

* publish 0.13.9 to npm

* yarn berry end-to-end test

* try running end-to-end tests on github

* check that esbuild builds on go 1.13

* Use `io.SeekStart` instead of deprecated `os.SEEK_SET` (evanw#1701)

`os.SEEK_SET` has been deprecated since Go 1.7.
Ref: https://pkg.go.dev/os#pkg-constants

* add "check out code" to old go version ci

* update @next targets for npm and yarn

* link from code to docs for vs code autocomplete

* remove invalid "es7" option in tsconfig parser

* update the compat table

* Allow target for ES-Version to be uppercase (evanw#1718)

* fix evanw#1539: implement legal comments for css

* update to unicode 14

* add ".mts" and ".cts" to exports kind checking

* publish 0.13.10 to npm

* reorder some functions

* get tests working on node 17+

* also run async transform tests un-transformed

* run tests w/ node 16 not 14 to avoid hard-crash

Node 14 has some bug that results in an "unreachable code" panic. For the record, the traceback is as follows:

     1: node::NodePlatform::GetStackTracePrinter()::$_3::__invoke()
     2: V8_Fatal(char const*, ...)
     3: v8::internal::interpreter::BytecodeGenerator::VisitCompoundAssignment(v8::internal::CompoundAssignment*)
     4: v8::internal::interpreter::BytecodeGenerator::VisitNoStackOverflowCheck(v8::internal::AstNode*)
     5: v8::internal::interpreter::BytecodeGenerator::GenerateBytecodeBody()
     6: v8::internal::interpreter::BytecodeGenerator::GenerateBytecode(unsigned long)
     7: v8::internal::interpreter::InterpreterCompilationJob::ExecuteJobImpl()
     8: v8::internal::(anonymous namespace)::ExecuteSingleUnoptimizedCompilationJob(v8::internal::ParseInfo*, v8::internal::FunctionLiteral*, v8::internal::AccountingAllocator*, std::__1::vector<v8::internal::FunctionLiteral*, std::__1::allocator<v8::internal::FunctionLiteral*> >*)
     9: v8::internal::(anonymous namespace)::IterativelyExecuteAndFinalizeUnoptimizedCompilationJobs(v8::internal::Isolate*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Handle<v8::internal::Script>, v8::internal::ParseInfo*, v8::internal::AccountingAllocator*, v8::internal::IsCompiledScope*, std::__1::vector<v8::internal::FinalizeUnoptimizedCompilationData, std::__1::allocator<v8::internal::FinalizeUnoptimizedCompilationData> >*)
    10: v8::internal::Compiler::Compile(v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Compiler::ClearExceptionFlag, v8::internal::IsCompiledScope*)
    11: v8::internal::Compiler::Compile(v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Compiler::ClearExceptionFlag, v8::internal::IsCompiledScope*)
    12: v8::internal::Runtime_CompileLazy(int, unsigned long*, v8::internal::Isolate*)
    13: Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit
    14: Builtins_CompileLazy
    15: Builtins_InterpreterEntryTrampoline

* also run class lowering tests untransformed

* test coverage for super and object methods

* fix writing to a "super" property

* also handle "super" inside static class fields

* implement class static blocks (evanw#1729)

* publish 0.13.11 to npm

* enable tree shaking for empty "static {}" blocks

* fix evanw#1730: crash with legal comment and @import

* enable tree shaking of "Reflect" static methods

* implement "calc()" reduction for css (evanw#1731)

* publish 0.13.12 to npm

* fix evanw#1739: tree shaking bug with "var exports"

* border radius tests: use length instead of number

* Add css to help text for --loader (evanw#1744)

* allow empty string for CLI string arrays

* move "main fields" logic to a separate function

* make debug meta available to the entire resolver

* say if "main" is missing from main fields (evanw#1754)

* fix evanw#1755: merge adjacent selectors with same body

* add spack to benchmarks (not ready due to bugs)

* Shorten "top", "right" properties into "inset" property (evanw#1758)

* add credit to changelog

* publish 0.13.13 to npm

* chore: make build pass

* chore: update publishing scripts

Co-authored-by: Evan Wallace <[email protected]>
Co-authored-by: dmitrage <[email protected]>
Co-authored-by: Liu Bowen <[email protected]>
Co-authored-by: Chris Casola <[email protected]>
Co-authored-by: Joe Schafer <[email protected]>
Co-authored-by: Gusted <[email protected]>
Co-authored-by: Weilin Shi <[email protected]>
Co-authored-by: José Valim <[email protected]>
Co-authored-by: Luca Casonato <[email protected]>
Co-authored-by: Rongjian Zhang <[email protected]>
Co-authored-by: Dominik Hassler <[email protected]>
Co-authored-by: FM <[email protected]>
Co-authored-by: David Zukowski <[email protected]>
Co-authored-by: John Doe <[email protected]>
Co-authored-by: Georges Varouchas <[email protected]>
Co-authored-by: Pig Fang <[email protected]>
Co-authored-by: Eelco Lempsink <[email protected]>
Co-authored-by: Nevkontakte <[email protected]>
Co-authored-by: Greg Troxel <[email protected]>
Co-authored-by: Piotr Krawiec <[email protected]>
Co-authored-by: 翠 / green <[email protected]>
Co-authored-by: y-yagi <[email protected]>
Co-authored-by: timse <[email protected]>
Co-authored-by: Dan Rosén <[email protected]>
Co-authored-by: Netlify Team Account 1 <[email protected]>
@FezVrasta
Copy link

Related question here #3872

Why isn't Yarn downloading all the versions in cache? I see it skips linking them because of platform incompatibility, but I still expect them all to be in the cache so that zero-installs work across different machines.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ecosystem This feature affects the whole ecosystem enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants