[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme-html:EDM115\u002Fmonorepo-hash:master":3},"\u003Cdiv align=\"center\">\n\u003Ch1 id=\"monorepo-hash\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"monorepo-hash\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#monorepo-hash\">\u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fh1>\n\u003Cp>\u003Cstrong>A CLI tool to generate hashes for the workspaces of your monorepo\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FEDM115\u002Fmonorepo-hash\u002Frefs\u002Fheads\u002Fmaster\u002Flogo.webp\" alt=\"monorepo-hash logo\" width=\"200\" height=\"200\">\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fmonorepo-hash\" alt=\"NPM Version\" loading=\"lazy\"> \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdt\u002Fmonorepo-hash\" alt=\"NPM Downloads\" loading=\"lazy\"> \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002FEDM115\u002Fmonorepo-hash\u002Ftotal?label=Total%20binaries%20downloads\" alt=\"Total binaries downloads\" loading=\"lazy\"> \u003Ca href=\"https:\u002F\u002Fnpmx.dev\u002Fmonorepo-hash\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnpmx-More_info-orange?logo=npm\" alt=\"More info\" loading=\"lazy\">\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2 id=\"memo-features\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"memo-features\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#memo-features\">📝 Features\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>🏃 \u003Cstrong>Fast\u003C\u002Fstrong> : Runs in huge monorepos \u003Ca href=\"#rocket-benchmarks\">in no time\u003C\u002Fa>, processes workspaces in parallel, powered by Go\u002FRust\u003Cbr>\n🎯 \u003Cstrong>Accurate\u003C\u002Fstrong> : Generates hashes based on every tracked file\u003Cbr>\n↔️ \u003Cstrong>Complete\u003C\u002Fstrong> : Supports transitive workspace dependencies\u003Cbr>\n👌 \u003Cstrong>No config\u003C\u002Fstrong> : Drop-in and instantly usable\u003Cbr>\n🤹‍♂️ \u003Cstrong>Versatile\u003C\u002Fstrong> : Works with PNPM, Bun, Yarn, NPM and Deno\u003Cbr>\n💻 \u003Cstrong>Cross-platform\u003C\u002Fstrong> : Works on Windows, Linux and macOS\u003Cbr>\n#️⃣ \u003Cstrong>Deterministic\u003C\u002Fstrong> : Same input, same output\u003Cbr>\n📦 \u003Cstrong>Lightweight\u003C\u002Fstrong> : No bloat, just the essentials\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Ch2 id=\"thinking-why\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"thinking-why\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#thinking-why\">🤔 Why\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>When you’re working with monorepos, there’s often a lot of workspaces (packages) that end up being created.\u003Cbr>\nAnd as your project grows, so does the number of workspaces (and so does your build times…).\u003Cbr>\nIf you ever worked with stuff like Next.js, you know what I’m talking about. And since every workspace requires another, you need everything to be built to test your changes.\u003Cbr>\n\u003Cbr>\n\u003C\u002Fp>\n\u003Cp>Although there are tools that allow your scripts to run only when files have changed (ex \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">turbo\u003C\u002Fspan>\u003C\u002Fcode>), the complete CI step cannot benefit from this. For example with \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">turbo\u003C\u002Fspan>\u003C\u002Fcode> again, they allow you to prune just the right workspaces and dependencies when building in a Docker, but this requires copying the entire monorepo into the container so we can’t benefit from Docker’s layers caching.\u003Cbr>\nIf only there could be a way to determine if a workspace hasn’t changed to not rebuild it for nothing…\u003Cbr>\n\u003Cbr>\n\u003C\u002Fp>\n\u003Cp>Well lucky you, \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> is here to help with that !\u003C\u002Fp>\n\u003Cdiv class=\"markdown-alert markdown-alert-note\">\n\u003Cp class=\"markdown-alert-title\">Note\u003C\u002Fp>\n\u003Cp>\u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> was created when I was doing my internship at Nexelec.\u003Cbr>\nI really put a lot of energy in this script so I decided to release \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> as a standalone CLI tool to help anyone struggling with this problem !\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Ch2 id=\"beginner-usage\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"beginner-usage\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#beginner-usage\">🔰 Usage\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ch3 id=\"installation\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"installation\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#installation\">Installation\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>You can install \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> globally, but it’s best to add it as a dev dependency at the root of your monorepo :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm add -D monorepo-hash --allow-build=monorepo-hash\n\u003Cspan class=\"hljs-comment\"># or bun, yarn, npm, deno\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># monorepo-hash was originally made with only PNPM in mind, open an issue if you encounter any problem\u003C\u002Fspan>\nbun add -D monorepo-hash --trust\nyarn add -D monorepo-hash\nnpm install -D monorepo-hash\n\u003Cspan class=\"hljs-comment\"># add &quot;nodeModulesDir&quot;: &quot;auto&quot; to your deno.json(c) config file first\u003C\u002Fspan>\ndeno install -D npm:monorepo-hash --allow-scripts=npm:monorepo-hash\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>To install it globally, use your package manager’s global installation command, for example with PNPM : \u003Ccode class=\"hljs\">pnpm \u003Cspan class=\"hljs-built_in\">add\u003C\u002Fspan> -g monorepo-hash \u003Cspan class=\"hljs-attribute\">--allow-build\u003C\u002Fspan>=monorepo-hash\u003C\u002Fcode>.\u003Cbr>\nOn Windows only, you can also install it globally using WinGet :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>pwsh\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs pwsh'>winget install EDM115.monorepo\u003Cspan class=\"hljs-literal\">-hash\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cdiv class=\"markdown-alert markdown-alert-important\">\n\u003Cp class=\"markdown-alert-title\">Important\u003C\u002Fp>\n\u003Cp>Since \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode>, the \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> cli command is a direct binary that cut the Node overhead and allows for faster I\u002FO. To enable this, the postinstall script needs to be run, which is disabled by default in PNPM\u002FBun\u002FDeno for security reasons.\u003Cbr>\nYou can totally refuse to use it (whether it is for security reasons or size constraints). In such case, either run the older Node + plain JS version (\u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>-js\u003C\u002Fcode>) or use the \u003Ca href=\"#usage-outside-of-the-cli\">programmatic API\u003C\u002Fa>.\u003Cbr>\nIf you added \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> without allowing the postinstall script to run, you can do it later at anytime with \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">pnpm approve-scripts\u003C\u002Fspan>\u003C\u002Fcode>, \u003Ccode class=\"hljs\">bun pm trust monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> or \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">deno approve-scripts\u003C\u002Fspan>\u003C\u002Fcode>.\u003Cbr>\nFrom \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">8\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> up to \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> the binary have been made with Bun. Starting with \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> onwards, it is made with \u003Ccode class=\"hljs\">^(?\u003Cspan class=\"hljs-symbol\">:Go|Rust\u003C\u002Fspan>) \\?$\u003C\u002Fcode>\u003Cbr>\nVersion \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> exposes the \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>-go\u003C\u002Fcode> &amp; \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>-rust\u003C\u002Fcode> binaries to gather feedback on speed execution and consistency across environments before taking a decision on the default binary for \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"markdown-alert markdown-alert-tip\">\n\u003Cp class=\"markdown-alert-title\">Tip\u003C\u002Fp>\n\u003Cp>Make sure that your workspace configuration is set up correctly (\u003Ccode class=\"hljs\">pnpm-\u003Cspan class=\"hljs-keyword\">workspace\u003C\u002Fspan>.yaml\u003C\u002Fcode>, \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-keyword\">package\u003C\u002Fspan>.json\u003C\u002Fcode> workspaces or \u003Ccode class=\"hljs\">deno.json(\u003Cspan class=\"hljs-keyword\">c\u003C\u002Fspan>)\u003C\u002Fcode> workspace) as \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> will use it to find your workspaces. Globs are supported.\u003Cbr>\nMake sure that your lockfiles are present as well since they are used to detect the used package manager. To skip this resolution step, use the \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-comment\">--packagemanager\u003C\u002Fspan>\u003C\u002Fcode> argument to force one.\u003Cbr>\nTo detect internal transitive dependencies, \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> will check the deps of each of the packages included in the workspaces configs. This allows it to work regardless of the package manager’s standard (simple version, \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-symbol\">workspace:\u003C\u002Fspan>\u003C\u002Fcode> protocol or direct \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-built_in\">file\u003C\u002Fspan>:\u003C\u002Fcode> links).\u003Cbr>\nFinally, it will generate a single root \u003Ccode class=\"hljs\">.\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> file that you would need to keep in your VCS in order for it to be efficient (ex : to be reused in your CI). This is made to not clutter your filesystem and VCS, especially if you have a lot of packages, however if you prefer to have per-workspace \u003Ccode class=\"hljs\">.\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> files, use the \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-comment\">--workspaces\u003C\u002Fspan>\u003C\u002Fcode> mode.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Ch3 id=\"get-help\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"get-help\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#get-help\">Get help\u003C\u002Fa>\u003C\u002Fh3>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --\u003Cspan class=\"hljs-built_in\">help\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># or bun, yarn, npm, deno\u003C\u002Fspan>\nbunx monorepo-hash --\u003Cspan class=\"hljs-built_in\">help\u003C\u002Fspan>\nyarn run monorepo-hash --\u003Cspan class=\"hljs-built_in\">help\u003C\u002Fspan>\nnpx monorepo-hash --\u003Cspan class=\"hljs-built_in\">help\u003C\u002Fspan>\ndx monorepo-hash --\u003Cspan class=\"hljs-built_in\">help\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cdiv class=\"markdown-alert markdown-alert-tip\">\n\u003Cp class=\"markdown-alert-title\">Tip\u003C\u002Fp>\n\u003Cp>Short versions of all arguments are also available.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Ch3 id=\"generate-hashes-for-your-entire-monorepo\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"generate-hashes-for-your-entire-monorepo\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#generate-hashes-for-your-entire-monorepo\">Generate hashes for your entire monorepo\u003C\u002Fa>\u003C\u002Fh3>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --generate\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"generate-hashes-for-specific-workspaces\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"generate-hashes-for-specific-workspaces\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#generate-hashes-for-specific-workspaces\">Generate hashes for specific workspaces\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Specify them in quotes, separated by commas, no spaces, and with no leading or trailing slashes.\u003Cbr>\nThe target name is the path to the workspace relative to the root of your monorepo, and uses forward slashes no matter your platform.\u003Cbr>\nWe use the paths here to not have to compute the entire dependency graph only for few of them to be processed.\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --generate --target=\u003Cspan class=\"hljs-string\">&quot;packages\u002Fexample,services\u002Fui&quot;\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"compare-hashes\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"compare-hashes\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#compare-hashes\">Compare hashes\u003C\u002Fa>\u003C\u002Fh3>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --compare\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"compare-hashes-for-specific-workspaces\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"compare-hashes-for-specific-workspaces\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#compare-hashes-for-specific-workspaces\">Compare hashes for specific workspaces\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Same rules apply.\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --compare --target=\u003Cspan class=\"hljs-string\">&quot;packages\u002Fexample&quot;\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"run-in-silent-mode\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"run-in-silent-mode\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#run-in-silent-mode\">Run in silent mode\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>This will suppress all output. This can be useful for example in CI where only the exit code matters.\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --compare --silent\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"usage-outside-of-the-cli\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"usage-outside-of-the-cli\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#usage-outside-of-the-cli\">Usage outside of the CLI\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>You can also use \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> programmatically in your own scripts.\u003Cbr>\nWhether it’s because there’s some utilities that are interesting or because you prefer to integrate it in your scripts, you can just import about any function or type from \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode>.\u003Cbr>\nThe main functionality stems from \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">runCli\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>, check the autocomplete of your IDE to see the available functions\u002Ftypes, all with some documentation associated with them.\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>ts\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs ts'>\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> monorepoHash, { exists } \u003Cspan class=\"hljs-keyword\">from\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;monorepo-hash&quot;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\">\u002F\u002F runCli is a default export as well\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> { download, detectLibcFamily } \u003Cspan class=\"hljs-keyword\">from\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;monorepo-hash\u002Finstall-binary&quot;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\">\u002F\u002F additional functions live here\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\">\u002F\u002F tip : if you only need the `exists` function, import it from here instead to reduce bundle size\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F ...\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">async\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">checkFiles\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">\u003C\u002Fspan>) {\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F logic...\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (file \u003Cspan class=\"hljs-keyword\">in\u003C\u002Fspan> files) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> existsResult = \u003Cspan class=\"hljs-keyword\">await\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">exists\u003C\u002Fspan>(file)\n\n    \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (existsResult) {\n      \u003Cspan class=\"hljs-comment\">\u002F\u002F do something...\u003C\u002Fspan>\n    }\n  }\n}\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F ...\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">async\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">dlThings\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">\u003C\u002Fspan>) {\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> url = \u003Cspan class=\"hljs-string\">&quot;https:\u002F\u002Fexample.com\u002Fsomefile&quot;\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> dest = \u003Cspan class=\"hljs-string\">&quot;.\u002Fsomefile&quot;\u003C\u002Fspan>\n\n  \u003Cspan class=\"hljs-keyword\">await\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">download\u003C\u002Fspan>(url, dest)\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> libc = \u003Cspan class=\"hljs-keyword\">await\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">detectLibcFamily\u003C\u002Fspan>()\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F do something with it...\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F ...\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">async\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">function\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">checkHashes\u003C\u002Fspan>(\u003Cspan class=\"hljs-params\">\u003C\u002Fspan>) {\n  \u003Cspan class=\"hljs-keyword\">const\u003C\u002Fspan> compareResult = \u003Cspan class=\"hljs-keyword\">await\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">monorepoHash\u003C\u002Fspan>([\u003Cspan class=\"hljs-string\">&quot;--compare&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;--target=packages\u002Fexample&quot;\u003C\u002Fspan>])\n  \u003Cspan class=\"hljs-comment\">\u002F\u002F do something with it...\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"run-in-debug-mode\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"run-in-debug-mode\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#run-in-debug-mode\">Run in debug mode\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The debug mode will :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>in generate mode, output a root \u003Ccode class=\"hljs\">.debug-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> file which will contain the hashes of each individual file in the workspace as a JSON object (or per-workspace files when using \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-comment\">--workspaces\u003C\u002Fspan>\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>in compare mode, read those \u003Ccode class=\"hljs\">.debug-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> file(s) and tell you \u003Cem>exactly\u003C\u002Fem> which files have changed in each workspace, and what their hashes are\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>This can be useful to check why the hashes appear to be different, or to debug issues with the hashes generation.\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm monorepo-hash --generate --debug\n\u003Cspan class=\"hljs-comment\"># later on...\u003C\u002Fspan>\npnpm monorepo-hash --compare --debug\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>Don’t forget to delete these files afterwards !\u003C\u002Fp>\n\u003Ch3 id=\"exit-codes\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"exit-codes\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#exit-codes\">Exit codes\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"hljs\">0\u003C\u002Fcode> : No changes detected (or you wanted to get the help\u002Fversion)\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">1\u003C\u002Fcode> : Changes detected in the hashes\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">2\u003C\u002Fcode> : Error with the arguments (both \u003Ccode class=\"hljs\">--\u003Cspan class=\"hljs-keyword\">generate\u003C\u002Fspan>\u003C\u002Fcode> and \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-comment\">--compare\u003C\u002Fspan>\u003C\u002Fcode> were provided or an unsupported \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-comment\">--packagemanager\u003C\u002Fspan>\u003C\u002Fcode> was forced)\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">3\u003C\u002Fcode> : Unknown arguments provided\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">4\u003C\u002Fcode> : No workspaces found or unsupported package manager\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">5\u003C\u002Fcode> : Package manager forced with \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-comment\">--packagemanager\u003C\u002Fspan>\u003C\u002Fcode> not present in the repo\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">6\u003C\u002Fcode> : Circular dependency detected in the workspace packages\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"hljs\">99\u003C\u002Fcode> : An unexpected error occurred, please open an issue with the logs\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"test-tube-examples\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"test-tube-examples\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#test-tube-examples\">🧪 Examples\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ch3 id=\"outputs\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"outputs\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#outputs\">Outputs\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Tested in the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fmonorepo-hash\u002Fblob\u002Fmaster\u002Ftests\u002Fdemo\u002Fsmall-monorepo.7z\" target=\"_blank\" rel=\"noopener noreferrer\">small monorepo\u003C\u002Fa>, with the following directory structure :\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>plaintext\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs '>\u003Cspan class=\"hljs-bullet\">.\n\u003C\u002Fspan>├── database\n├── packages\n│   ├── cli-tools\n│   └── linter\n├── services\n│   ├── backend\n│   └── frontend\n└── pnpm-workspace.yaml\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cdetails>\u003Csummary>\u003Ch4>Hash generation\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --generate\nℹ️ Generating hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> all workspaces...\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (5)\n\n✅ database (34e5c3bb9a1545fcc7eab03d439bfe79abe1b12ebb0d2c7cdacb1744e58ab22a written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n✅ packages\u002Fcli-tools (b0b7271f403749b906dec2405e6127c58c2d267695a6d84bc96f1a2918fb0d07 written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n✅ packages\u002Flinter (aa37077b2c0034ce44a074d8a46778153cf51b1125e2623364de272d1b640bd6 written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n✅ services\u002Fbackend (1aa3f39996e526e3f530943f2d0081cde30efabc643af64ba95d157b0072c463 written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n✅ services\u002Ffrontend (7251bacb2abaec585b7faa4ea56c9c74a8b7ed20422255a72442bfa7ce7dbb71 written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>\u003Ch4>Hash comparison - no changes\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --compare\nℹ️ Comparing hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> all workspaces...\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (5)\n\n✅ Unchanged (5) :\n• database\n• packages\u002Fcli-tools\n• packages\u002Flinter\n• services\u002Fbackend\n• services\u002Ffrontend\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>\u003Ch4>Hash comparison - changes detected\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --compare\nℹ️ Comparing hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> all workspaces...\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (5)\n\n⚠️ Changed (5) :\n• database\n        old : 34e5c3bb9a1545fcc7eab03d439bfe79abe1b12ebb0d2c7cdacb1744e58ab22a\n        new : b10e0b4af3f4d25033e3116ffed89a6d73873b4238d27bcf48cf87318b701cf6\n        🚧 changed dependency(s) :\n                • packages\u002Flinter\n• packages\u002Fcli-tools\n        old : b0b7271f403749b906dec2405e6127c58c2d267695a6d84bc96f1a2918fb0d07\n        new : 0b42cd27826f37213e54535ff9f32808fc673b256a4bec1ce0288d8c02886f73\n        🚧 changed dependency(s) :\n                • packages\u002Flinter\n• packages\u002Flinter\n        old : aa37077b2c0034ce44a074d8a46778153cf51b1125e2623364de272d1b640bd6\n        new : 9ad670319943d97c8ffa11e2428f4fa9d91c63e826e2f5f8509ffa9d460c45f8\n• services\u002Fbackend\n        old : 1aa3f39996e526e3f530943f2d0081cde30efabc643af64ba95d157b0072c463\n        new : 3fcf8f991bfe7d69db962a29d56010877072ba42dfd6fb0b3b64f3e1fc30bed3\n        🚧 changed dependency(s) :\n                • database\n                • packages\u002Fcli-tools\n                • packages\u002Flinter\n• services\u002Ffrontend\n        old : 7251bacb2abaec585b7faa4ea56c9c74a8b7ed20422255a72442bfa7ce7dbb71\n        new : 5c2b81df00712306f0eaff7021808dd5efdbbcfb93e77d730d9812f4fd6194c8\n        🚧 changed dependency(s) :\n                • packages\u002Flinter\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>\u003Ch4>Hash comparison - missing hashes\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --compare\nℹ️ Comparing hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> all workspaces...\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (5)\n\n✅ Unchanged (4) :\n• packages\u002Fcli-tools\n• packages\u002Flinter\n• services\u002Fbackend\n• services\u002Ffrontend\n\n❓ Missing .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan> files (1) :\n• database (would be 34e5c3bb9a1545fcc7eab03d439bfe79abe1b12ebb0d2c7cdacb1744e58ab22a)\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>\u003Ch4>Hash generation - specific workspaces\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --generate --target=\u003Cspan class=\"hljs-string\">&quot;packages\u002Fcli-tools,services\u002Ffrontend&quot;\u003C\u002Fspan>\nℹ️ Generating hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> specified targets... (packages\u002Fcli-tools, services\u002Ffrontend)\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (3)\n\n✅ packages\u002Fcli-tools (b0b7271f403749b906dec2405e6127c58c2d267695a6d84bc96f1a2918fb0d07 written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n✅ services\u002Ffrontend (7251bacb2abaec585b7faa4ea56c9c74a8b7ed20422255a72442bfa7ce7dbb71 written to .\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>\u003Ch4>Hash comparison - specific workspaces - no changes\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --compare --target=\u003Cspan class=\"hljs-string\">&quot;packages\u002Fcli-tools,services\u002Ffrontend&quot;\u003C\u002Fspan>\nℹ️ Comparing hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> specified targets... (packages\u002Fcli-tools, services\u002Ffrontend)\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (3)\n\n✅ Unchanged (2) :\n• packages\u002Fcli-tools\n• services\u002Ffrontend\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>\u003Ch4>Hash comparison - specific workspaces - changes detected even outside of the specified targets\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>$ pnpm monorepo-hash --compare --target=\u003Cspan class=\"hljs-string\">&quot;services\u002Fbackend&quot;\u003C\u002Fspan>\nℹ️ Comparing hashes \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> specified targets... (services\u002Fbackend)\n\nℹ️ Using pnpm workspaces from C:\\Users\\EDM115\\Desktop\\\u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\\small-monorepo\n\n✅ Computed all hashes (4)\n\n⚠️ Changed (1) :\n• services\u002Fbackend\n        old : 36be1199988004d364bbe3ec945eb653beef7457d336cc4e3a12a0ce6ad845c1\n        new : 1aa3f39996e526e3f530943f2d0081cde30efabc643af64ba95d157b0072c463\n        🚧 changed dependency(s) :\n                • packages\u002Fcli-tools\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Ch3 id=\"usage-as-a-pre-commit-hook\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"usage-as-a-pre-commit-hook\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#usage-as-a-pre-commit-hook\">Usage as a pre-commit hook\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>This is a recommended way to use \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode>, as with this you won’t need to generate and add the files manually everytime you make a change.\u003Cbr>\nThis works with any git hooks manager since we have guards in place to not overwrite output in non-TTY environments (ex VS Code’s Source Control tab). You can use \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftoplenboren\u002Fsimple-git-hooks\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-built_in\">simple\u003C\u002Fspan>-git-hooks\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fj178\u002Fprek\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">prek\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftypicode\u002Fhusky\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">husky\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fevilmartians\u002Flefthook\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">lefthook\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> or even the native \u003Ca href=\"https:\u002F\u002Fgit-scm.com\u002Fdocs\u002Fgithooks\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">githooks\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>. Here’s an example with \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-built_in\">simple\u003C\u002Fspan>-git-hooks\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode class=\"hljs\">pnpm \u003Cspan class=\"hljs-built_in\">add\u003C\u002Fspan> -D simple-git-hooks \u003Cspan class=\"hljs-attribute\">--allow-build\u003C\u002Fspan>=simple-git-hooks\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Add this in your root \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-keyword\">package\u003C\u002Fspan>.json\u003C\u002Fcode> :\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>json\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs json'>\u003Cspan class=\"hljs-attr\">&quot;simple-git-hooks&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;pre-commit&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;pnpm monorepo-hash --generate &amp;&amp; git add **\u002F*.hash&quot;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fli>\n\u003Cli>Run once \u003Ccode class=\"hljs\">pnpm \u003Cspan class=\"hljs-built_in\">simple\u003C\u002Fspan>-git-hooks\u003C\u002Fcode> to install the hooks\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"usage-in-ci\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"usage-in-ci\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#usage-in-ci\">Usage in CI\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>This was the main reason I created this tool, and whether it’s in GitHub Actions or locally through \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnektos\u002Fact\" target=\"_blank\" rel=\"noopener noreferrer\">act\u003C\u002Fa>, it can help you to reduce drastically CI times.\u003C\u002Fp>\n\u003Cdetails>\u003Csummary>\u003Ch4>Here's an example workflow that only builds the workspaces that have changed :\u003C\u002Fh4>\u003C\u002Fsummary>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>yaml\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs yaml'>\u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">Build\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">and\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">test\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">build-and-test:\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">ubuntu-24.04\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">defaults:\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">run:\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">shell:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">bash\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">env:\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">IMAGE_TAG:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;demo-$\u003Cspan class=\"hljs-template-variable\">{{ github.sha }}\u003C\u002Fspan>&quot;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">strategy:\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">fail-fast:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">false\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">matrix:\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C\u002Fspan> [\u003Cspan class=\"hljs-number\">25\u003C\u002Fspan>]\n\n    \u003Cspan class=\"hljs-attr\">steps:\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Checkout code&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">actions\u002Fcheckout@v6\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Set up Docker Buildx&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">docker\u002Fsetup-buildx-action@v4\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Setup PNPM&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">pnpm\u002Faction-setup@v5\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Use Node $\u003Cspan class=\"hljs-template-variable\">{{ matrix.node-version }}\u003C\u002Fspan>&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">actions\u002Fsetup-node@v6\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">with:\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">node-version:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">${{\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">matrix.node-version\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">}}\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">cache:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;pnpm&quot;\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Install dependencies&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">run:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">pnpm\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">i\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">--frozen-lockfile\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Restore .hash cache&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">id:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">restore-hash-cache\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">actions\u002Fcache\u002Frestore@v5\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">with:\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">path:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">|\n            **\u002F.hash\n\u003C\u002Fspan>          \u003Cspan class=\"hljs-attr\">key:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">hash-files-${{\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">runner.os\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">}}-pnpm-${{\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">hashFiles(&#x27;**\u002Fpnpm-lock.yaml&#x27;)\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">}}\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">restore-keys:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">|\n            hash-files-${{ runner.os }}-pnpm-\n\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Force rebuild if no cache has been found&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">if:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">steps.restore-hash-cache.outputs.cache-hit\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">==\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">run:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">rm\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">-fr\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">**\u002F.hash\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Check if workspace-name is unchanged&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">id:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">check-workspace-name\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">run:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">|\n          # These 2 lines are useful only if you use act, as a way to ensure the images are built if not present\n          # WORKSPACENAME_DOCKER_EXISTS=$(docker images -q username\u002Fworkspace-name:${{ env.IMAGE_TAG }} | wc -l)\n          # echo &quot;WORKSPACENAME_DOCKER_EXISTS=$WORKSPACENAME_DOCKER_EXISTS&quot; &gt;&gt; ${GITHUB_OUTPUT}\n          set +e\n          pnpm monorepo-hash --compare --target=&quot;services\u002Fworkspace-name&quot;\n          EXIT_CODE=$?\n          echo &quot;WORKSPACENAME_HASH_EXIT_CODE=$EXIT_CODE&quot; &gt;&gt; ${GITHUB_OUTPUT}\n\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-comment\"># Do this as much as needed for your workspaces\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Build the workspace-name Docker image&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">if:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">steps.check-workspace-name.outputs.WORKSPACENAME_HASH_EXIT_CODE\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">!=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;0&#x27;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-comment\"># act version :\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-comment\"># if: (steps.check-workspace-name.outputs.WORKSPACENAME_HASH_EXIT_CODE != &#x27;0&#x27; || steps.check-workspace-name.outputs.WORKSPACENAME_DOCKER_EXISTS == &#x27;0&#x27;)\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">docker\u002Fbuild-push-action@v7\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">with:\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">context:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">.\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">file:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">services\u002Fworkspace-name\u002FDockerfile\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">tags:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">username\u002Fworkspace-name:${{\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">env.IMAGE_TAG\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">}}\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">load:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">true\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-comment\"># Build things and test them\u003C\u002Fspan>\n\n      \u003Cspan class=\"hljs-comment\"># Don&#x27;t do that if you delete\u002Fadd files during the action !\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Ensure hash files are up to date&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">run:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">|\n          pnpm monorepo-hash --generate\n\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-bullet\">-\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Save .hash cache&quot;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">actions\u002Fcache\u002Fsave@v5\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">with:\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">path:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">|\n            **\u002F.hash\n\u003C\u002Fspan>          \u003Cspan class=\"hljs-attr\">key:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">hash-files-${{\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">runner.os\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">}}-pnpm-${{\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">hashFiles(&#x27;**\u002Fpnpm-lock.yaml&#x27;)\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">}}\u003C\u002Fspan>\n          \u003Cspan class=\"hljs-attr\">restore-keys:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">|\n            hash-files-${{ runner.os }}-pnpm-\n\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdetails>\n\u003Cp>Here we use the actions cache to store the \u003Ccode class=\"hljs\">.\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> files, so that we can reuse them in the next runs.\u003Cbr>\nThis is especially useful because when you generate hashes, the action will pick them up from the latest commit and not the latest run.\u003C\u002Fp>\n\u003Ch2 id=\"construction-limitations\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"construction-limitations\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#construction-limitations\">🚧 Limitations\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>If you use another Version Control System than \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">git\u003C\u002Fspan>\u003C\u002Fcode>, we can’t ignore your files correctly for the hashes generation (note : any VCS that uses \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-title\">.gitignore\u003C\u002Fspan>\u003C\u002Fcode> files, such as \u003Ca href=\"https:\u002F\u002Fwww.jj-vcs.dev\u002Flatest\u002Fworking-copy\u002F#ignored-files\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Jujutsu\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> will work just fine)\u003C\u002Fli>\n\u003Cli>Your EOL (End of Line) should be consistent across your monorepo’s files and the different environments it’s being used in. Since Docker containers and GitHub Actions runners are based on Linux, it’s recommended to use \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-keyword\">LF\u003C\u002Fspan>\u003C\u002Fcode> as EOL.\u003Cbr>\nI recommend to set this up in your IDE and formatter config.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"rocket-benchmarks\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"rocket-benchmarks\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#rocket-benchmarks\">🚀 Benchmarks\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cdiv class=\"markdown-alert markdown-alert-caution\">\n\u003Cp class=\"markdown-alert-title\">Caution\u003C\u002Fp>\n\u003Cp>Those benchmarks aim to representing \u003Cem>overall\u003C\u002Fem> how the CLI performs across versions, runtimes and monorepo sizes, but they are not to be taken as absolute truth.\u003Cbr>\nThe performance can vary a lot based on the machine, the disk, the CPU load and many other factors.\u003Cbr>\nMinor variations are to be expected between runs as GitHub Actions aren’t an isolated environment and the servers are shared between multiple users.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cp>These benchmarks have been realised on Standard GitHub-hosted runner (\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">ubuntu\u003C\u002Fspan>-\u003Cspan class=\"hljs-number\">24\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">04\u003C\u002Fspan>\u003C\u002Fcode>) that you can get by running any Action.\u003Cbr>\nThe specs as I’m writing this are an AMD EPYC 7763 64-Core (4) @ 3.25 GHz CPU, 15.61 GiB of RAM and 144.26 GiB of SSD storage. Keep in mind that since the servers are shared between multiple users, the performance may vary slightly between runs.\u003Cbr>\nThey have been reproduced 10 times with a cold and warm disk cache thanks to \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsharkdp\u002Fhyperfine\" target=\"_blank\" rel=\"noopener noreferrer\">hyperfine\u003C\u002Fa>.\u003Cbr>\nCold cache results are more representative of a first run in CI or on a fresh boot. The script run speed doesn’t really change, the only performance overhead on a cold cache is the time it takes to run Node\u002FBun\u002FGo\u002FRust (and reading files from the disk). You can expect warm cache runs to be at least 1\u002F3 faster than cold cache ones.\u003Cbr>\nThe versions denoted with \u003Ccode class=\"hljs\">(\u003Cspan class=\"hljs-name\">bun\u003C\u002Fspan>)\u003C\u002Fcode> are using the Bun binary build of \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode>, which removes the Node overhead, uses Bun internal replacements and is generally faster. This build is the default one since \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode>.\u003Cbr>\nThe versions denoted with \u003Ccode class=\"hljs\">(\u003Cspan class=\"hljs-name\">go\u003C\u002Fspan>)\u003C\u002Fcode> are using the Go binary build of \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode>, which is even faster than the Bun version and 95% smaller. This build might be the default one since \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode>.\u003Cbr>\nThe versions denoted with \u003Ccode class=\"hljs\">(\u003Cspan class=\"hljs-name\">rust\u003C\u002Fspan>)\u003C\u002Fcode> are using the Rust binary build of \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode>, which is on-par with the Go version in terms of performance and is twice as small. This build might be the default one since \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode>.\u003Cbr>\nStarting with \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode>, the benchmark methodology has changed : we re-runned them for all versions in \u003Cem>the same runner and script\u003C\u002Fem> to avoid noisy neighbor effects and massive drifts in perf for no reason, and we also started to measure warm cache runs, noted in parenthesis. As a consequence, previous results that you could find in the releases aren’t comparable with these new ones. More info here : \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fmonorepo-hash\u002Fissues\u002F20\" target=\"_blank\" rel=\"noopener noreferrer\">[INFO] 📣 A change in the benchmarks methodology (#20)\u003C\u002Fa>\u003C\u002Fp>\n\u003Cdiv class=\"markdown-alert markdown-alert-note\">\n\u003Cp class=\"markdown-alert-title\">Note\u003C\u002Fp>\n\u003Cp>Here are the details of each demo monorepo used for the benchmarks :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Small monorepo\u003C\u002Fstrong> : 5 workspaces of 100 files each, files composed of 1 line of text\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Medium monorepo\u003C\u002Fstrong> : 5 workspaces of 100 folders each, with each folder containing 100 files, files composed of 10 lines of text\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Large monorepo\u003C\u002Fstrong> : 5 workspaces of 100 folders each, with each folder containing 10 files and 10 folders, and each of these folders containing 100 files, files composed of 100 lines of text\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Wide monorepo\u003C\u002Fstrong> : 50 workspaces of 10 folders each, with each folder containing 100 files, files composed of 10 lines of text \u003Cem>(the most representative of a real-world monorepo with many packages)\u003C\u002Fem>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>In order to not clunk up Git, these \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fmonorepo-hash\u002Ftree\u002Fmaster\u002Ftests\u002Fdemo\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">demo repos\u003C\u002Fa> are 7z ultra compressed.\u003Cbr>\nSymbols (comparing Node with Node, Bun with Bun, Go with Go, Rust with Rust, the first Bun\u002FGo\u002FRust version is compared with the same version’s Node, wide &gt; small &gt; medium &gt; large, warm &gt; cold) :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>📈 : Faster than the previous version\u003C\u002Fli>\n\u003Cli>📉 : Slower than the previous version\u003C\u002Fli>\n\u003Cli>⚖️ : Negligible or no perceivable change in performance compared to the previous version\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FEDM115\u002Fmonorepo-hash\u002Fmaster\u002Fbench-history\u002Fgraphs\u002Fall\u002Fall-overall.png\" alt=\"Benchmarks graph - Overall performance of the default runtime\" loading=\"lazy\">\u003Cbr>\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FEDM115\u002Fmonorepo-hash\u002Fmaster\u002Fbench-history\u002Fgraphs\u002Fall\u002Fall-small.png\" alt=\"Benchmarks graph - Small monorepo\" loading=\"lazy\">\u003Cbr>\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FEDM115\u002Fmonorepo-hash\u002Fmaster\u002Fbench-history\u002Fgraphs\u002Fall\u002Fall-medium.png\" alt=\"Benchmarks graph - Medium monorepo\" loading=\"lazy\">\u003Cbr>\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FEDM115\u002Fmonorepo-hash\u002Fmaster\u002Fbench-history\u002Fgraphs\u002Fall\u002Fall-large.png\" alt=\"Benchmarks graph - Large monorepo\" loading=\"lazy\">\u003Cbr>\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FEDM115\u002Fmonorepo-hash\u002Fmaster\u002Fbench-history\u002Fgraphs\u002Fall\u002Fall-wide.png\" alt=\"Benchmarks graph - Wide monorepo\" loading=\"lazy\">\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth style=\"text-align:left\">Version\u003C\u002Fth>\n\u003Cth style=\"text-align:left\">Small\u003C\u002Fth>\n\u003Cth style=\"text-align:left\">Medium\u003C\u002Fth>\n\u003Cth style=\"text-align:left\">Large\u003C\u002Fth>\n\u003Cth style=\"text-align:left\">Wide\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (rust)\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">63.9 ms (4.3 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.083 s (243.4 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">60.727 s (3.784 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">2.942 s (190.9 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (go)\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">55.2 ms (5.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.007 s (279.9 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">33.513 s (4.246 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.053 s (283.9 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (bun)\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">161 ms (56.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.472 s (857.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.653 s (13.104 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.328 s (852.4 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">189.2 ms (118.2 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.749 s (3.859 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">45.269 s (38.096 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.615 s (3.956 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan> (bun)\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">155.8 ms (58 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.474 s (839.7 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">47.196 s (12.960 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.462 s (846.7 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">191.3 ms (118.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.713 s (3.722 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">49.062 s (38.028 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.936 s (3.863 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (bun)\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">156.8 ms (56.9 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.502 s (821.8 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">47.464 s (12.921 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.254 s (824.9 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">197 ms (117.9 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.777 s (3.680 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">48.900 s (36.678 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.567 s (3.822 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (bun)\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">231 ms (69.33 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.295 s (802.3 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">41.083 s (17.319 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.081 s (761.9 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">282.6 ms (124.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.853 s (3.532 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">36.773 s (35.706 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.447 s (3.599 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">9\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (bun)\u003C\u002Fcode> ⚖️\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">224.3 ms (67.45 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.347 s (719.9 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">35.774 s (10.268 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.546 s (1.405 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">9\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">284.5 ms (129.3 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.140 s (3.548 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.666 s (36.751 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.063 s (3.617 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">8\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> (bun)\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">216.5 ms (73.16 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.285 s (752.5 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">35.464 s (10.382 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.536 s (1.444 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">8\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">276.2 ms (124 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.057 s (3.534 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.178 s (36.731 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.051 s (3.637 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">7\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> ⚖️\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">285.2 ms (124.5 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.117 s (3.535 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.534 s (37.125 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.924 s (3.643 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">6\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">285.3 ms (126.6 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.191 s (3.556 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.940 s (37.045 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.174 s (3.636 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">290.6 ms (128 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.225 s (3.593 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.419 s (36.959 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.062 s (3.644 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">265.9 ms (125.8 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.068 s (3.573 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.245 s (36.998 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.083 s (3.606 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">4\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">274.3 ms (130 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.227 s (3.574 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.901 s (36.902 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.007 s (3.625 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">4\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">280.6 ms (123.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.067 s (3.532 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.309 s (36.820 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.038 s (3.623 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">4\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">264.1 ms (119.3 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.150 s (3.535 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">42.384 s (37.046 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.894 s (3.640 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">274 ms (136.5 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.366 s (4.012 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">89.512 s (87.311 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.152 s (3.886 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📈\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">273.4 ms (137.9 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.417 s (4.098 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">89.956 s (88.009 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.152 s (3.898 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">280.4 ms (137.4 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.387 s (3.965 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">92.195 s (87.312 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.266 s (4.050 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> 📉\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">263.1 ms (122.9 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.894 s (3.586 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">56.071 s (37.309 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.299 s (4.021 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd style=\"text-align:left\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">v1\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>.\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\u003C\u002Fcode> ⚖️\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">247.9 ms (119.1 ms)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">3.752 s (3.576 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">56.198 s (37.479 s)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:left\">4.370 s (4.048 s)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"telescope-comparison\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"telescope-comparison\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#telescope-comparison\">🔭 Comparison\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>It would be foolish to pretend that \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> is the only player in the space, so here are some comparisons with other tools that have similar goals.\u003Cbr>\nSome of you might say “Why not just use \u003Ca href=\"https:\u002F\u002Fturborepo.dev\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Turborepo\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> since you mention it at the beginning ?” and you could but usage differs.\u003Cbr>\nYou can run \u003Ccode class=\"hljs\">turbo \u003Cspan class=\"hljs-keyword\">ls\u003C\u002Fspan> \u003Cspan class=\"hljs-params\">--affected\u003C\u002Fspan>\u003C\u002Fcode> to check which workspaces are affected by changes, and it \u003Cem>does\u003C\u002Fem> take in consideration transitive dependencies. But it isn’t aware of “is the root included in the workspaces list ?”, it doesn’t give reusable hashes for other tools and doesn’t have a programmatic API. However since it’s written in Rust, it’s very fast.\u003Cbr>\nOverall \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Turborepo\u003C\u002Fspan>\u003C\u002Fcode> is mainly a \u003Cstrong>task runner\u003C\u002Fstrong>, and its caching mechanism is centered around tasks and not packages themselves, although it is a byproduct of the way it works. It also compares against your VCS’s branch and not a specified snapshot.\u003Cbr>\nOther task runners like \u003Ca href=\"https:\u002F\u002Fnx.dev\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Nx\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fmoonrepo.dev\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">moonrepo\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Flerna.js.org\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Lerna\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> or \u003Ca href=\"https:\u002F\u002Frushjs.io\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Rush\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> have similar limitations (centered around tasks and not workspaces, based on VCS, no exposed hashes, …), and usually require their own configuration files (who doesn’t \u003Cem>love\u003C\u002Fem> having one more file on the repo root ? 🥰). On top of that, they might actually be quite slower than \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> since they have so much more features.\u003Cbr>\nA second category is \u003Cstrong>package managers\u003C\u002Fstrong> themselves. For example, \u003Ca href=\"https:\u002F\u002Fpnpm.io\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">PNPM\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> offers \u003Ccode class=\"hljs\">--\u003Cspan class=\"hljs-built_in\">filter\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;[&lt;since&gt;]&quot;\u003C\u002Fspan>\u003C\u002Fcode> to only run commands on packages that have changed since the specified branch\u002Fcommit, and it does take in consideration transitive dependencies. However, it is mainly here for task running (again…) and is tied again to your VCS.\u003Cbr>\nLastly there are \u003Cstrong>specialized tools\u003C\u002Fstrong> (like us !), such as \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FTinder\u002Fbazel-diff\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">bazel-diff\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> (specific to Bazel), \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fabuob\u002Fyanice\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">Yanice\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flemonade-hq\u002Ftraf\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">traf\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fapi.rushstack.io\u002Fpages\u002Fpackage-deps-hash\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-meta\">@rushstack\u003C\u002Fspan>\u002F\u003Cspan class=\"hljs-keyword\">package\u003C\u002Fspan>-deps-hash\u003C\u002Fcode>\u003C\u002Fa> (specific to Rush), to name a few. They all have their advantages and drawbacks, but overall they either work only with specific tooling, require some manual configuration, are language-specific or don’t even expose a CLI.\u003Cbr>\nIf you wish to read more about the comparison between \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> and other tools, check this issue : \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fmonorepo-hash\u002Fissues\u002F26\" target=\"_blank\" rel=\"noopener noreferrer\">[INFO] 📣 Alternatives comparison : a ChatGPT yap session (#26)\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2 id=\"hammer-and-wrench-contributing\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"hammer-and-wrench-contributing\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#hammer-and-wrench-contributing\">🛠️ Contributing\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Here’s a quick guide for contributing to \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> :\u003Cbr>\n0. Requirements :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Node v25+\u003C\u002Fli>\n\u003Cli>PNPM v10+\u003C\u002Fli>\n\u003Cli>Bun v1.3+\u003C\u002Fli>\n\u003Cli>Go 1.26+\u003C\u002Fli>\n\u003Cli>Rust 1.94+\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n\u003Cli>Fork the repository (and star it 😉)\u003C\u002Fli>\n\u003Cli>Clone your fork\u003C\u002Fli>\n\u003C\u002Fol>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>git \u003Cspan class=\"hljs-built_in\">clone\u003C\u002Fspan> https:\u002F\u002Fgithub.com\u002FUSERNAME\u002Fmonorepo-hash.git\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> monorepo-hash\npnpm i --frozen-lockfile\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> src\u002Fgo &amp;&amp; go mod download &amp;&amp; \u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> ..\u002F..\nrustup toolchain install 1.94.1\nrustup component add clippy --toolchain 1.94.1\nrustup toolchain install nightly\nrustup component add rustfmt --toolchain nightly\ncargo install cargo-binstall --locked\ncargo binstall cargo-edit --locked\ncargo binstall cargo-outdated --locked\n\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> src\u002Frust &amp;&amp; cargo fetch --locked &amp;&amp; \u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> ..\u002F..\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Col start=\"3\">\n\u003Cli>Do your changes\u003C\u002Fli>\n\u003Cli>Format, typecheck and lint your code\u003C\u002Fli>\n\u003C\u002Fol>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm format\npnpm typecheck\npnpm lint\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Col start=\"5\">\n\u003Cli>Test your changes (feel free to add tests to the \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">tests\u003C\u002Fspan>\u003C\u002Fcode> directory)\u003C\u002Fli>\n\u003C\u002Fol>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>pnpm \u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Col start=\"6\">\n\u003Cli>Commit your changes\u003C\u002Fli>\n\u003Cli>Open a pull request\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"release-process\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"release-process\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#release-process\">Release process\u003C\u002Fa>\u003C\u002Fh3>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>bash\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs bash'>\u003Cspan class=\"hljs-comment\"># bump the version in package.json, src\u002Frust\u002FCargo.toml, add changelog entry in CHANGELOG.md, &amp; update for all `const CLI_VERSION`\u003C\u002Fspan>\ngit add -A &amp;&amp; git status\npnpm typecheck\npnpm format\npnpm \u003Cspan class=\"hljs-built_in\">test\u003C\u002Fspan>\ngit commit -m \u003Cspan class=\"hljs-string\">&quot;the message&quot;\u003C\u002Fspan> &amp;&amp; git push\npnpm build:node\n\u003Cspan class=\"hljs-comment\"># run the actions that build the binaries and download the artifacts\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># create a draft release on GitHub with the artifacts\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\"># run the benchmarks action and download the results, put in `bench-history-new`\u003C\u002Fspan>\npnpm cli:get-bench-times\npnpm cli:get-bench-graphs\n\u003Cspan class=\"hljs-comment\"># include them in the README\u003C\u002Fspan>\ngit commit -m \u003Cspan class=\"hljs-string\">&quot;the message&quot;\u003C\u002Fspan> &amp;&amp; git push\n\u003Cspan class=\"hljs-comment\"># un-draft and publish the release on GitHub as latest\u003C\u002Fspan>\npnpm release\n\u003Cspan class=\"hljs-comment\"># create the new version&#x27;s manifest, check the latest wingetcreate &amp; manifest&#x27;s versions (https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fwinget-pkgs\u002Ftree\u002Fmaster\u002Fdoc\u002Fmanifest\u002Fschema)\u003C\u002Fspan>\nwingetcreate submit --prtitle \u003Cspan class=\"hljs-string\">&quot;New version: EDM115.monorepo-hash version x.x.x&quot;\u003C\u002Fspan> .\\manifests\\e\\EDM115\\monorepo-hash\\x.x.x\\\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Ch3 id=\"update-process\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"update-process\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#update-process\">Update process\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Check : \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">pnpm outdated\u003C\u002Fspan>\u003C\u002Fcode>\u002F\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-keyword\">cd\u003C\u002Fspan> src\u002F\u003Cspan class=\"hljs-keyword\">go\u003C\u002Fspan> &amp;&amp; \u003Cspan class=\"hljs-keyword\">go\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">list\u003C\u002Fspan> -\u003Cspan class=\"hljs-keyword\">u\u003C\u002Fspan> -\u003Cspan class=\"hljs-keyword\">m\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">all\u003C\u002Fspan>\u003C\u002Fcode>\u002F\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> src\u002Frust &amp;&amp; cargo outdated\u003C\u002Fcode> (requires \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">cargo binstall cargo-outdated\u003C\u002Fspan>\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>PNPM (Node\u002FBun) : \u003Ccode class=\"hljs\">pnpm up \u003Cspan class=\"hljs-meta\">&amp;&amp; pnpm dedupe\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Go : \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-keyword\">cd\u003C\u002Fspan> src\u002F\u003Cspan class=\"hljs-keyword\">go\u003C\u002Fspan> &amp;&amp; \u003Cspan class=\"hljs-keyword\">go\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">get\u003C\u002Fspan> -\u003Cspan class=\"hljs-keyword\">u\u003C\u002Fspan> &amp;&amp; \u003Cspan class=\"hljs-keyword\">go\u003C\u002Fspan> \u003Cspan class=\"hljs-built_in\">get\u003C\u002Fspan> -\u003Cspan class=\"hljs-keyword\">u\u003C\u002Fspan> tool &amp;&amp; \u003Cspan class=\"hljs-keyword\">go\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">mod\u003C\u002Fspan> tidy &amp;&amp; \u003Cspan class=\"hljs-keyword\">cd\u003C\u002Fspan> ..\u002F..\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Rust : \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> src\u002Frust &amp;&amp; cargo update &amp;&amp; \u003Cspan class=\"hljs-built_in\">cd\u003C\u002Fspan> ..\u002F..\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"eyes-who-uses-monorepo-hash\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"eyes-who-uses-monorepo-hash\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#eyes-who-uses-monorepo-hash\">👀 Who uses \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> ?\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fnexelec.eu\" target=\"_blank\" rel=\"noopener noreferrer\">Nexelec\u003C\u002Fa>, at least during my internship there\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\" target=\"_blank\" rel=\"noopener noreferrer\">Me\u003C\u002Fa> 😄\u003C\u002Fli>\n\u003Cli>You ?\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>If you use \u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> in your project(s), whether you’re an individual or a company, please let me know by opening an issue or a pull request, and I’ll add you to this list !\u003C\u002Fp>\n\u003Ch2 id=\"money-with-wings-donate\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"money-with-wings-donate\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#money-with-wings-donate\">💸 Donate\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>I’m a young developer from France. If you want to support me, here’s how you can do it :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Star this repository\u003C\u002Fli>\n\u003Cli>Follow me on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Donate :\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fpaypal.me\u002F8EDM115\" target=\"_blank\" rel=\"noopener noreferrer\">PayPal\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsponsors\u002FEDM115\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Sponsors\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwww.buymeacoffee.com\u002FEDM115\" target=\"_blank\" rel=\"noopener noreferrer\">BuyMeACoffee\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Ft.me\u002FEDM115bots\u002F698\" target=\"_blank\" rel=\"noopener noreferrer\">Donate on Telegram\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"scroll-license\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"scroll-license\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#scroll-license\">📜 License\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"hljs\">monorepo-\u003Cspan class=\"hljs-built_in\">hash\u003C\u002Fspan>\u003C\u002Fcode> is licensed under the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fmonorepo-hash\u002Fblob\u002Fmaster\u002FLICENSE\" target=\"_blank\" rel=\"noopener noreferrer\">MIT License\u003C\u002Fa>\u003C\u002Fp>\n",1779532541091]