# Development

## Workspaces

It's recommended to use [npm workspaces](https://docs.npmjs.com/cli/v8/using-npm/workspaces) to allow testing changes to multiple packages. On Codespaces, this is already set up.

npm workspaces are really meant for mono-repos, but we can use that feature here to link our various packages together so you can make changes to a package and immediately consume those changes in a dependent package.

## Local Setup

The workspace files will be in the parent directory of the repository, so it's recommended to create a folder for all of the workspace repositories. We chose `vscode` for these instructions.

```shell
mkdir ~/vscode
cd ~/vscode
```

Then, clone this repository and run `script/bootstrap` to pull in the other repositories.

```shell
gh repo clone github/vscode-github-actions
cd vscode-github-actions
script/bootstrap
```

Finally, install packages in the workspace and build

```shell
cd ~/vscode
npm i
npm run build -ws
```

**Note**: We have included a `package-lock.json` in `script/workspace`. If `npm run build -ws` fails because packages are not installed correctly with `nmp i`, re-run `script/bootstrap` and run `npm ci` to
get working packages.

## Make changes

1. Open the workspace in VS Code `File -> Open Workspace from File...`: `/workspaces/vscode-github-actions.code-workspace`
    - If you're doing local development, replace `/workspaces` with the folder you created above (`~/vscode` in the example)
1. Make change to any of the packages
1. Build them all with `npm run build -ws` in `/workspaces/` (or `~/vscode/` for local dev)
1. Uninstall or disable the Actions extension in your development instance of VS Code
1. Start and debug extension with the `Watch & Launch Extension` configuration from the "Run and Debug" side panel menu
1. Open a workspace in the remote extension host that contains workflow files in the `.github/workflows` directory

### Updating dependencies

Once you're happy with your changes, publish the changes to the respective packages. You might have to adjust package versions, so if you made a change to `actions-workflow-parser` and increase the version there, you will have to consume the updated package in `actions-languageservice`.

`npm workspaces` hoists all dependencies into a shared `node_modules` folder at the root directory (`/workspaces/node_modules` or `~/vscode/node_modules` for local dev) and also creates a single `package-lock.json` file there for the whole workspace. We don't want that when pushing changes back to the individual repos.

There is a script in `/workspaces` (or `~/vscode` for local dev): `update-package-locks.sh` that does an `npm install` in every package directory _without_ using workspaces. That way, the local `package-lock.json` file is generated correctly and can be pushed to the repository.

## Debugging

Launching and debugging the extension should just work. If you need to debug the language server, start the extension first, then execute the `Attach to language-server` target to also attach to the language server.

## Troubleshooting

### npm error: "This command does not support workspaces"

Upgrade to a newer version of npm. You can use `npm install npm@latest -g`, `brew upgrade node` or other methods.
