# Utils

The `utils` library contains reusable code pieces or utilities that can be used across other libraries and applications. It differs from the core library as it can reference other libraries to generate components, patterns, or code that facilitate a process.

**Example**: `libs/utils/src/lib/product-data-source` is the functionality that handles resolving products for both the player and the selector that allows associating a product with a snack size video. The `product-data-source` could easily be a piece of `core` library code as it's central and indispensable. However, it's located in `utils` because resolving platform products depends on the `event-products` library, and including it in `core` would break the sole rule that core must not depend on any other library.

## Versioning

Manage library versioning using the `@jscutlery/semver` tool, which automates semantic versioning based on your git history:

```bash
pnpm nx run utils:version
```

For more details, refer to the official [SemVer documentation](https://github.com/jscutlery/semver).

## Publishing

Publish the library, automatically applying the appropriate tag based on the target environment:

- For feature branches (alpha release):
  ```bash
  pnpm nx run utils:publish:feat
  ```
- For development (beta release):
  ```bash
  pnpm nx run utils:publish:dev
  ```
- For production releases (stable release):
  ```bash
  pnpm nx run utils:publish:prod
  ```

## Building

Build the library, specifying the target environment:

- For development environment:
  ```bash
  pnpm nx run utils:build:dev
  ```
- For production:
  ```bash
  pnpm nx run utils:build:prod
  ```

## Cleaning

Clean up build artifacts to maintain a tidy workspace:

```bash
pnpm nx run utils:clean
```

## Testing

Run unit tests for the library:

```bash
pnpm nx run utils:test
```

## Linting

Lint the project to ensure code quality and adherence to standards:

```bash
pnpm nx run utils:lint
```
