---
slug: v0.13
title: moon v0.13 - Hashing and toolchain improvements
authors: [milesj]
tags: [hasher, toolchain]
---

With this release, we've landed some improvements to our smart hashing, and paved the road for
additional languages and tooling.

<!--truncate-->

## Node.js is now optional

Title may seem confusing at first, but don't worry, everything is fine! For some context, moon has
been designed to be language agnostic as we plan to support more than JavaScript in the future.
However, some aspects of the codebase were hard-coded for JavaScript and made the assumption that
JavaScript will always be used, with one such aspect being the [`node`](../docs/config/workspace)
setting in [`.moon/workspace.yml`](../docs/config/workspace).

We've reworked this setting to be optional, which allows a repository to opt out of JavaScript.
Right now, this basically does nothing as we do not support other languages yet, but we felt it
necessary to report it anyways! A side-effect of this change is that actions in the runner have been
renamed, for example, `SetupToolchain` -> `SetupNodeToolchain`.

## Improved hashing accuracy

Our [smart hashing layer](../docs/concepts/cache#hashing) is pretty powerful, but was not entirely
accurate. Up until now, when hashing a Node.js project, we'd include the `dependencies`,
`devDependencies`, and `peerDependencies` versions located within the project's `package.json` as
hash inputs. This was great, because if a dependency was explicitly upgraded in the `package.json`,
it would invalidate the previous hashes as the version number changed.

However, what if the dependency was implicitly upgraded by another project, but the `package.json`
was not modified? These kind of transitive changes were currently ignored by moon, but no longer, as
moon will now resolve all `package.json` dependencies to the resolved version found in the root
lockfile (`package-lock.json`, `yarn.lock`, etc)!

At moon, we believe in providing consumers with the ability to configure to their needs, and as
such, have added a new [`hasher`](../docs/config/workspace#hasher) setting to
[`.moon/workspace.yml`](../docs/config/workspace). This setting will allow you to choose between the
2 hashing patterns above!

## New `moon check` command

If you're like us, you're constantly testing, linting, typechecking, so on and so forth, a project
while developing. This was rather cumbersome, as you either had to use separate run commands
(`moon run project:test`, `moon run project:lint`, etc), or use the multi-run approach
(`moon run project:test project:lint`). Both approaches were not ideal for rapid development.

To simplify this process, we've added a new [`moon check`](../docs/commands/check) command, that
will automatically run _all_ build and test tasks for a project (or many projects)! Local and non-CI
tasks will _not_ be ran.

```shell
# Check project at current working directory
$ moon check

# Check project by name
$ moon check app

# Check multiple projects by name
$ moon check client server
```

## New `@moonrepo/types` package

We have many ideas for moon specific npm packages that we plan to release, but before we do that, we
need to ensure all of them are built with the correct interfaces. To solve this, we are shipping a
new package, [@moonrepo/types](https://www.npmjs.com/package/@moonrepo/types), that simply publishes
TypeScript declarations. It contains everything from project and task shapes, configuration
structures, runner information, and more.

```ts
import type { ProjectConfig } from '@moonrepo/types';
```

## Other changes

View the
[official release](https://github.com/moonrepo/moon/releases/tag/%40moonrepo%2Fcli%400.13.0) for a
full list of changes.

- The runner will now fail with an error if a task has defined `outputs` but an output was not
  created after the task is executed. This change was made so that artifacts are deterministic.
- The `actionRunner` setting in [`.moon/workspace.yml`](../docs/config/workspace) was renamed to
  `runner`.

## What's next?

Expect the following in the v0.14 release!

- A `moon generate` command to generate new projects, files, scaffolding, and more from pre-defined
  templates.
- Implicit dependency discovery. moon will now scan manifest files and determine project
  relationships.
