Skip to content

Workspaces

JSTime’s package manager supports npm "workspaces". This allows you to split a codebase into multiple distinct “packages” that live in the same repository, can depend on each other, and (when possible) share a node_modules directory.


The root package.json should not contain any "dependencies", "devDependencies", etc. Each individual package should be self-contained and declare its own dependencies. Similarly, it’s conventional to declare "private": true to avoid accidentally publishing the root package to npm.

{
"name": "my-monorepo",
"private": true,
"workspaces": [
"packages/*"
]
}

It’s common to place all packages in a packages directory. The "workspaces" field in package.json supports glob patterns, so you can use packages/* to indicate that each subdirectory of packages should be considered separate package (also known as a workspace).

.
├── package.json
├── node_modules
└── packages
├── stuff-a
│ └── package.json
└── stuff-b
└── package.json

To add one workspace as a dependency of another, modify its package.json. Here were adding stuff-a as a dependency of stuff-b.

{
"name": "stuff-b",
"dependencies": {
+ "stuff-a": "*"
}
}

Once added, run jspm install from the project root to install dependencies for all workspaces.

Terminal window
$ jspm install

To add npm dependencies to a particular workspace, just cd to the appropriate directory and run jspm add commands as you would normally. JSTime will detect that you are in a workspace and hoist the dependency as needed.

Terminal window
$ cd packages/stuff-a
$ jspm add zod

See Docs > Package manager for complete documentation of JSTime’s package manager.