Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions accepted/0000-workspaces-config-management.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# npm workspaces: Config management

## Summary

Series of subcommands to allow managing what paths/folders should be handled as **workspaces**.

## Motivation

Minimize manual editing of the `package.json` file while providing more resilient and automated workflows for defining **workspaces** within your project.

## Detailed Explanation

- Add positional `workspaces` argument e.g: `lib/workspaces.js` that provides subcommands to enable workflows for **workspaces*** config management.

## Rationale and Alternatives

- The obvious alternative is to choose to not provide subcommands to handle **workspaces** config management.
- Others? TBD

## Implementation

```
# Given a structure:
.
├── package.json { "name": "foo" }
└── packages
├── dep-a
│ └── package.json { "name": "dep-a", "version": "1.0.0" }
└── dep-b
└── package.json { "name": "dep-b", "version": "1.3.1" }

$ npm workspaces ls

$ npm workspaces add ./packages/dep-a

@jamiebuilds jamiebuilds Apr 6, 2021

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reading npm workspaces add <package> I would not expect it to mutate the root config. I would expect it to mirror npm workspaces install <package> in #117 since npm add/rm are already aliases to install/uninstall dependencies.

I think npm workspaces <subcommand> can either be a command that operates on package.json#workspaces or every <workspaces>/package.json mixing and matching is confusing.

One thing we did in Bolt was have a bolt project/p command that allowed you to run commands on the root package containing all the workspaces.

Alternatives:

  • npm workspaces-config add/rm
  • npm project workspaces add/rm
  • npm workspaces add-workspace/rm-workspace


$ cat package.json
{
"name": "foo",
"workspaces": [
"./packages/dep-a"
]
}

$ npm workspaces ls
dep-a@1.0.0 -> ./packages/dep-a

$ npm workspaces add ./dep-b

$ cat package.json
{
"name": "foo",
"workspaces": [
"./packages/dep-a",
"./packages/dep-b"
]
}

$ npm workspaces ls
dep-a@1.0.0 -> ./packages/dep-a
dep-b@1.3.1 -> ./packages/dep-b

# Remove by name/spec:
$ npm workspaces rm dep-a

# Remove by path:
$ npm workspaces rm ./packages/dep-b

$ cat package.json
{
"name": "foo",
"workspaces": []
}

$ npm workspaces ls

# Add glob:
$ npm workspaces add ./packages/*

$ cat package.json
{
"name": "foo",
"workspaces": [
"./packages/*"
]
}

$ npm workspaces ls
dep-a@1.0.0 -> ./packages/dep-a
dep-b@1.3.1 -> ./packages/dep-b
```

## Prior Art

TBD

## Unresolved Questions and Bikeshedding

TBD