Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yowainwright/codependence
Stop wrestling with code dependencies. Use Codependence! 🤼♀️
https://github.com/yowainwright/codependence
dependencies dependency-manager monorepo nodejs npm publishing release-management releases security-tools
Last synced: about 3 hours ago
JSON representation
Stop wrestling with code dependencies. Use Codependence! 🤼♀️
- Host: GitHub
- URL: https://github.com/yowainwright/codependence
- Owner: yowainwright
- License: mit
- Created: 2022-06-08T06:58:30.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-20T05:03:07.000Z (6 months ago)
- Last Synced: 2024-05-21T07:12:57.372Z (6 months ago)
- Topics: dependencies, dependency-manager, monorepo, nodejs, npm, publishing, release-management, releases, security-tools
- Language: TypeScript
- Homepage: https://jeffry.in/codependence/
- Size: 2.37 MB
- Stars: 16
- Watchers: 3
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: .github/CODE_OF_CONDUCT.md
- Codeowners: .github/CODEOWNERS
- Security: SECURITY.md
Awesome Lists containing this project
README
Codependence
![Typed with TypeScript](https://flat.badgen.net/badge/icon/Typed?icon=typescript&label&labelColor=blue&color=555555)
[![npm version](https://badge.fury.io/js/codependence.svg)](https://badge.fury.io/js/codependence)
![ci](https://github.com/yowainwright/codependence/actions/workflows/ci.yml/badge.svg)
[![Github](https://badgen.net/badge/icon/github?icon=github&label&color=grey)](https://github.com/yowainwright/codependence)
![Twitter](https://img.shields.io/twitter/url?url=https%3A%2F%2Fgithub.com%2Fyowainwright%2Fcodependence)#### Stop wrestling with your code dependencies. Use Codependence!
**Codependence** is a JavaScript utility for checking dependencies to ensure they're up-to-date or match a specified version.
---
## _Main Usecase_
#### Keep dependencies up-to-date
Codependence updates `package.json`'s dependencies based on a "codependencies" array of dependency names.
The difference from `{npm,pnpm} update` or `yarn upgrade` is Codependence _allows you to pin what you want and update the rest_!
Furthermore, Codependence works with monorepos and is package manager agnostic.#### \*yes, dependencies can be pinned to `~` or `^` versions in `package.json` files!
Readme more about [Codependence](#synopsis) why you might want to use it [below](#why-use-codependence)!
---
## Usage
**Codependence** can be used as a standalone CLI, in npm scripts or, secondarily, as node utility!
#### Install
```sh
npm install codependence --save-dev
```#### Quick setup
Pure CLI quick run
```sh
codependence --condependencies 'fs-extra' 'lodash'
```Or use it with a config in the root `package.json` file
```ts
{
"codependence": {
"condependencies": ["fs-extra", "lodash"]
},
"scripts": {
"update-codependencies": "codependence --update",
"prepare": "npm run update-codependencies"
}
}
```---
## Codependence as a CLI
**Codependence** is built as a CLI-first, set-it-and-forget-it tool.
It is recommendeded to install and setup **Codependence** as a `devDependency` within your root `package.json` and use a `codependence.codependencies` array to define dependencies you need to keep updated or pinned to a specific version.
Furthermore, you can add a `codependence.codependencies` array to child packages' `package.json` in your monorepo to ensure specific dependencies are pinned to a specific versions within your monorepo packages.
```sh
Usage: program [options]Codependency, for code dependency. Checks `codependencies` in package.json files to ensure dependencies are up-to-date
Options:
-f, --files [files...] file glob pattern
-u, --update update dependencies based on check
-r, --rootDir root directory to start search
-i, --ignore [ignore...] ignore glob pattern
--debug enable debugging
--silent enable mainly silent logging
-cds, --codependencies [codependencies...] a path to a file with a codependenies object
-c, --config accepts a path to a config file
-s, --searchPath a search path string for locationing config files
-h, --help display help for command
```## Codependence in Node
Although, **Codependence** is built to primarily be a CLI utility, it can be used as a node utility.
```ts
import codependence from 'codependence'const checkForUpdate = async () => {
const isLatest = await codependence({ codependencies: ['fs-extra', 'lodash'] })
if (!isLatest) {
console.log('This repo is update-to-date')
} else {
console.error('This repo is not update-to-date')
}
}
checkForUpdate()
```## Configuration Options
Codependence **options** can be used via CLI options, a config file read from the CLI, or with node by passing them into exported Codependence functions. Read more below!
---
### `codependencies`: `Array`
A **required** option or \*config array! **Codependencies** are required via being passed in an array as a cli option \*\*or as within a `codependence.codependencies` array.
- The default value is `undefined`
- An array is required!---
### \*Config Array Detail
The Codependence `codependencies` array supports `latest` out-of-the-box.
> So having this `["fs-extra", "lodash"]` will return the `latest` versions of the packages within the array. It will also match a specified version, like so `[{ "foo": "1.0.0" }]` and `[{ "foo": "^1.0.0" }]` or `[{ "foo": "~1.0.0" }]`. You can also include a `*` **at the end** of a name you would like to match. For example, `@foo/*` will match all packages with `@foo/` in the name and return their latest versions. This will also work with `foo-*`, etc.
**Codependence** is built in to give you more capability to control your dependencies!
---
### Using the `codependence.codependencies` array in Monorepo child packages
You can add a `codependence.codependencies` array to child packages in your monorepo to ensure specific dependencies are pinned to a specific different versions within your monorepo packages.
#### For example
You can have a `package.json` file in a `@foo/bar` package with following:
```typescript
{
"name": "@foo/bar",
"dependencies": {
"fs-extra": "^9.0.0",
},
"codependence": {
"codependencies": [{ "fs-extra": "^9.0.0" }]
}
}```
And another `package.json` file in a `@foo/baz` package with following:
```typescript
{
"name": "@foo/baz",
"dependencies": {
"fs-extra": "^11.1.0",
},
"codependence": {
"codependencies": [{ "fs-extra": "^11.1.0" }]
}
}```
Codependencies will install the right dependency version for each package in your monorepo!
> _**Note:** Codependencies can and will still install the expected version defined at the monorepo's root for packages that don't specify differences in their `package.json` files!_
---
### `files`: `Array`
An **optional** array of strings to check for `package.json` files to update.
- The default value is `['package.json']`
- This array accepts glob patterns as well, example `["package.json", "**/package.json"`---
### `update`: `boolean`
An **optional** boolean which defines whether **Codependence** should update dependencies in `package.json`'s or not.
- The default value is `false`
---
### `rootDir`: `string`
An **optional** string which can used to specify the root directory to run checks from;
- The default value is `"./"`
---
### `ignore`: `Array`
An **optional** array of strings used to specify directories to ignore
- The default value is `["node_modules/**/*", "**/node_modules/**/*"]`
- glob patterns are accepted---
### `debug`: `boolean`
An **optional** boolean value used to enable debugging output
- The default value is `false`
---
### `silent`: `boolean`
An **optional** boolean value used to enable a more silent developer experience
- The default value is `false`
---
### `config`: `string`
An **optional** string containing a package to file which contains `codependence` config.
- The default is `undefined`
---
### `searchPath`: `string`
An **optional** string containing a search path for location config files.
- The default value is `undefined`
### `yarnConfig`: `boolean`
An **optional** boolean value used to enable \***yarn config** checking
- The default value is `false`
---
## Recipes
Listed below are some common patterns (recipes) for using **Codependence**.
### Don't want a config? No problem!
Starting out, you may not want a config object. Have no fear, **Codependence** can be used as a CLI utility ONLY!
```sh
codependence --codependencies 'lodash' '{ \"fs-extra\": \"10.0.1\" }'
```### Want to grab all dependencies which match a `*` (name star) pattern to return the latest version of them? Sure!
```sh
codependence --codependencies '@foo/*' --update
```---
## Synopsis
Codependence is a JavaScript utility CLI and node tool that compares a `codependencies` array against `package.json` `dependencies`, `devDependencies`, and `peerDependencies` for \***codependencies**.
For each dependency included in the `codependencies` array, Codependence will either **a)** check that versions are at `latest` or **b)** Check that a specified version is matched within `package.json` files. Codependence can either **a)** return a pass/fail result _or_ **b)** update dependencies, devDependencies, and peerDependencies, in package.json file(s).
---
Codependence is useful for ensuring specified dependencies are up-to-date—or at a specified version within a project's `package.json` files(s)!
This utility is built to work alongside dependency management tools like [dependabot](https://dependabot.com/). It _could_ work instead of dependency management tool but is built for managing specific dependency versions vs _all_ dependencies.
---
#### \*Codependencies: are project dependencies which **must be** up-to-date or set to a specific version!
In example, if your repository requires the latest version and `latest` can't be specified as the dependency version within your `package.json`, Codependence will ensure your `package.json` has the **actual latest semver version** set in your `package.json`. It can/will do the same if an exact version is specified!
---
## Why use Codependence?
**Codependence** is a utility tool focused on a single task—managing specified dependency versions!
- It is built to work along side tools (like Dependabot) but it [can also manage dependencies fully](https://github.com/yowainwright/codependence-cron)!
- It handles monorepos child package dependencies _with ease_ and **without** package manager bias!
- It is as immediate as you want it to be, via [npm install scripts](https://docs.npmjs.com/cli/v8/using-npm/scripts#npm-install) and build pipeline tools, such as [Husky](https://typicode.github.io/husky/)
- It can be run along with npm scripts or in github actions---
## Why _not_ use Codependence?
**Codependence** isn't for everybody or every repository. Here are some reasons why it _might not_ be for you!
- You don't need intricate dependency version management
- You prefer specifying necessary dependencies with `latest`, or manually `pinning`, or using a tool like [Dependabot's ignore spec](https://github.blog/changelog/2021-05-21-dependabot-version-updates-can-now-ignore-major-minor-patch-releases/) within a `dependabot.yml`.---
## Demos
Check out Codependence in Action!
- **[Codependence Cron](https://github.com/yowainwright/codependence-cron):** Codependence running off a Github Action cron job.
- **[Codependence Monorepo](https://github.com/yowainwright/codependence-monorepo):** Codependence monorepo example.---
## Codependence Debugging
### `private packages`
If there is a `.npmrc` file, there is no issue with **Codependence** monitoring private packages. However, if a yarn config is used, Codependence must be instructed to run `version` checks differently.
---
### Fixes
- With the CLI, add the `--yarnConfig` option.
- With node, add `yarnConfig: true` to your options or your config.
- For other private package issues, submit an [issue](https://github.com/yowainwright/codependence/issues) or [pull request](https://github.com/yowainwright/codependence/pulls).---
## Contributing
[Contributing](.github/CONTRIBUTING.md) is straightforward.
### Setup
```sh
nvm install && npm install pnpm && pnpm install
```### Issues
- Sprinkle some context
- Can you submit a pull request if needed?### Pull Requests
- Add a test (or a description of the test) that should be added
- Update the readme (if needed)
- Sprinkle some context in the [pull request](.github/PULL_REQUEST_TEMPLATE.md).
- Hope it's fun!Thank you!
---
## Roadmap
- **Code:**
- add better spying/mocking (in progress)
- add init cmd to cli
- add utils functions to be executed with the cli cmd (monorepo, cadence, all deps)
- **Demo Repos**
- **monorepo:** present how **codependence** can work to support monorepo updates (in progress)
- **cadence:** present how cadence can be implemented with **codependence**
- **Documentation**
- write recipes section after the demo repos are complete (in progress)---
## Shoutouts
Thanks to [Dev Wells](https://github.com/devdumpling) and [Steve Cox](https://github.com/stevejcox) for the aligned code leading to this project. Thanks [Navid](https://github.com/NavidK0) for some great insights to improve the api!
---
Made by [@yowainwright](https://github.com/yowainwright), MIT 2022