You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/contributing.md
+94-50Lines changed: 94 additions & 50 deletions
Original file line number
Diff line number
Diff line change
@@ -30,15 +30,15 @@ Hi! I'm really excited that you are interested in contributing to Vue.js. Before
30
30
31
31
- If you are resolving a special issue, add `(fix #xxxx[,#xxxx])` (#xxxx is the issue id) in your PR title for a better release log, e.g. `update entities encoding/decoding (fix #3899)`.
32
32
- Provide a detailed description of the bug in the PR. Live demo preferred.
33
-
- Add appropriate test coverage if applicable. You can check the coverage of your code addition by running `npm test -- --coverage`.
33
+
- Add appropriate test coverage if applicable. You can check the coverage of your code addition by running `nr test-coverage`.
34
34
35
35
- It's OK to have multiple small commits as you work on the PR - GitHub can automatically squash them before merging.
36
36
37
37
- Make sure tests pass!
38
38
39
-
- Commit messages must follow the [commit message convention](./commit-convention.md) so that changelogs can be automatically generated. Commit messages are automatically validated before commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [yorkie](https://github.com/yyx990803/yorkie)).
39
+
- Commit messages must follow the [commit message convention](./commit-convention.md) so that changelogs can be automatically generated. Commit messages are automatically validated before commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [simple-git-hooks](https://github.com/toplenboren/simple-git-hooks)).
40
40
41
-
- No need to worry about code style as long as you have installed the dev dependencies - modified files are automatically formatted with Prettier on commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [yorkie](https://github.com/yyx990803/yorkie)).
41
+
- No need to worry about code style as long as you have installed the dev dependencies - modified files are automatically formatted with Prettier on commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [simple-git-hooks](https://github.com/toplenboren/simple-git-hooks)).
42
42
43
43
### Advanced Pull Request Tips
44
44
@@ -47,6 +47,7 @@ Hi! I'm really excited that you are interested in contributing to Vue.js. Before
47
47
- Consider the performance / size impact of the changes, and whether the bug being fixes justifies the cost. If the bug being fixed is a very niche edge case, we should try to minimize the size / perf cost to make it worthwhile.
48
48
49
49
- Is the code perf-sensitive (e.g. in "hot paths" like component updates or the vdom patch function?)
50
+
50
51
- If the branch is dev-only, performance is less of a concern.
51
52
52
53
- Check how much extra bundle size the change introduces.
@@ -69,14 +70,36 @@ $ pnpm i # install the dependencies of the project
69
70
A high level overview of tools used:
70
71
71
72
-[TypeScript](https://www.typescriptlang.org/) as the development language
72
-
-[Rollup](https://rollupjs.org) for bundling
73
-
-[Jest](https://jestjs.io/) for unit testing
73
+
-[Vite](https://vitejs.dev/) and [ESBuild](https://esbuild.github.io/) for development bundling
74
+
-[Rollup](https://rollupjs.org) for production bundling
75
+
-[Vitest](https://vitest.dev/) for unit testing
74
76
-[Prettier](https://prettier.io/) for code formatting
77
+
-[ESLint](https://eslint.org/) for static error prevention (outside of types)
78
+
79
+
## Git Hooks
80
+
81
+
The project uses [simple-git-hooks](https://github.com/toplenboren/simple-git-hooks) to enforce the following on each commit:
82
+
83
+
- Type check the entire project
84
+
- Automatically format changed files using Prettier
85
+
- Verify commit message format (logic in `scripts/verifyCommit.js`)
75
86
76
87
## Scripts
77
88
78
89
**The examples below will be using the `nr` command from the [ni](https://github.com/antfu/ni) package.** You can also use plain `npm run`, but you will need to pass all additional arguments after the command after an extra `--`. For example, `nr build runtime --all` is equivalent to `npm run build -- runtime --all`.
79
90
91
+
The `run-s` and `run-p` commands found in some scripts are from [npm-run-all](https://github.com/mysticatea/npm-run-all) for orchestrating multiple scripts. `run-s` means "run in sequence" while `run-p` means "run in parallel".
92
+
93
+
-[`nr build`](#nr-build)
94
+
-[`nr build-dts`](#nr-build-dts)
95
+
-[`nr check`](#nr-check)
96
+
-[`nr dev`](#nr-dev)
97
+
-[`nr dev-sfc`](#nr-dev-sfc)
98
+
-[`nr dev-esm`](#nr-dev-esm)
99
+
-[`nr dev-compiler`](#nr-dev-compiler)
100
+
-[`nr test`](#nr-test)
101
+
-[`nr test-dts`](#nr-test-dts)
102
+
80
103
### `nr build`
81
104
82
105
The `build` script builds all public packages (packages without `private: true` in their `package.json`).
@@ -91,6 +114,8 @@ nr build runtime-core
91
114
nr build runtime --all
92
115
```
93
116
117
+
Note that `nr build` uses `rollup-plugin-esbuild` for transpiling typescript and **does not perform type checking**. To run type check on the entire codebase, run `nr check`. Type checks are also automatically run on each commit.
118
+
94
119
#### Build Formats
95
120
96
121
By default, each package will be built in multiple distribution formats as specified in the `buildOptions.formats` field in its `package.json`. These can be overwritten via the `-f` flag. The following formats are supported:
@@ -124,13 +149,11 @@ nr build runtime-core -f esm-browser,cjs
124
149
125
150
Use the `--sourcemap` or `-s` flag to build with source maps. Note this will make the build much slower.
126
151
127
-
#### Build with Type Declarations
152
+
###`nr build-dts`
128
153
129
-
The `--types` or `-t` flag will generate type declarations during the build and in addition:
154
+
This command builds the type declarations for all packages. It first generates the raw `.d.ts` files in the `temp` directory, then uses [rollup-plugin-dts](https://github.com/Swatinem/rollup-plugin-dts) to roll the types into a single `.d.ts` file for each package.
130
155
131
-
- Roll the declarations into a single `.d.ts` file for each package;
132
-
- Generate an API report in `<projectRoot>/temp/<packageName>.api.md`. This report contains potential warnings emitted by [api-extractor](https://api-extractor.com/).
133
-
- Generate an API model json in `<projectRoot>/temp/<packageName>.api.json`. This file can be used to generate a Markdown version of the exported APIs.
156
+
### `nr check`
134
157
135
158
### `nr dev`
136
159
@@ -139,7 +162,7 @@ The `dev` script bundles a target package (default: `vue`) in a specified format
139
162
```bash
140
163
$ nr dev
141
164
142
-
>watching: packages/vue/dist/vue.global.js
165
+
>built: packages/vue/dist/vue.global.js
143
166
```
144
167
145
168
-**Important:** output of the `dev` script is for development and debugging only. While it has the same runtime behavior, the generated code should never be published to npm.
@@ -152,29 +175,44 @@ $ nr dev
152
175
153
176
- The `dev` script supports the `-i` flag for inlining all deps. This is useful when debugging `esm-bundler` builds which externalizes deps by default.
154
177
178
+
### `nr dev-sfc`
179
+
180
+
Shortcut for starting the SFC Playground in local dev mode. This provides the fastest feedback loop when debugging issues that can be reproduced in the SFC Playground.
181
+
182
+
### `nr dev-esm`
183
+
184
+
Builds and watches `vue/dist/vue-runtime.esm-bundler.js` with all deps inlined using esbuild. This is useful when debugging the ESM build in a reproductions that require real build setups: link `packages/vue` globally, then link it into the project being debugged.
185
+
155
186
### `nr dev-compiler`
156
187
157
-
The `dev-compiler` script builds, watches and serves the [Template Explorer](https://github.com/vuejs/core/tree/main/packages/template-explorer) at `http://localhost:5000`. This is extremely useful when working on the compiler.
188
+
The `dev-compiler` script builds, watches and serves the [Template Explorer](https://github.com/vuejs/core/tree/main/packages/template-explorer) at `http://localhost:5000`. This is useful when working on pure compiler issues.
158
189
159
190
### `nr test`
160
191
161
-
The `test` script simply calls the `jest` binary, so all [Jest CLI Options](https://jestjs.io/docs/en/cli) can be used. Some examples:
192
+
The `test` script simply calls the `vitest` binary, so all [Vitest CLI Options](https://vitest.dev/guide/cli.html#options) can be used. Some examples:
162
193
163
194
```bash
164
-
# run all tests
195
+
# run all tests in watch mode
165
196
$ nr test
166
197
198
+
# run once and exit (equivalent to `vitest run`)
199
+
$ nr test run
200
+
167
201
# run all tests under the runtime-core package
168
202
$ nr test runtime-core
169
203
170
-
# run tests in a specific file
171
-
$ nr testfileName
204
+
# run tests in files matching the pattern
205
+
$ nr test<fileNamePattern>
172
206
173
-
# run a specific test in a specific file
174
-
$ nr testfileName -t 'test name'
207
+
# run a specific test in specific files
208
+
$ nr test<fileNamePattern> -t 'test name'
175
209
```
176
210
177
-
The default `test` script includes the `--runInBand` jest flag to improve test stability, especially for the CSS transition related tests. When you are testing specific test specs, you can also run `npx jest` with flags directly to speed up tests (jest runs them in parallel by default).
211
+
Tests that test against source code are grouped under `nr test-unit`, while tests that test against built files that run in real browsers are grouped under `nr test-e2e`.
212
+
213
+
### `nr test-dts`
214
+
215
+
Runs `nr build-dts` first, then verify the type tests in `packages/dts-test` are working correctly against the actual built type declarations.
178
216
179
217
## Project Structure
180
218
@@ -198,14 +236,20 @@ This repository employs a [monorepo](https://en.wikipedia.org/wiki/Monorepo) set
198
236
199
237
-`compiler-ssr`: Compiler that produces render functions optimized for server-side rendering.
200
238
201
-
-`template-explorer`: A development tool for debugging compiler output. You can run `nr dev template-explorer` and open its `index.html` to get a repl of template compilation based on current source code.
202
-
203
-
A [live version](https://vue-next-template-explorer.netlify.com) of the template explorer is also available, which can be used for providing reproductions for compiler bugs. You can also pick the deployment for a specific commit from the [deploy logs](https://app.netlify.com/sites/vue-next-template-explorer/deploys).
204
-
205
239
-`shared`: Internal utilities shared across multiple packages (especially environment-agnostic utils used by both runtime and compiler packages).
206
240
207
241
-`vue`: The public facing "full build" which includes both the runtime AND the compiler.
208
242
243
+
- Private utility packages:
244
+
245
+
-`dts-test`: Contains type-only tests against generated dts files.
246
+
247
+
-`sfc-playground`: The playground continuously deployed at https://sfc.vuejs.org. To run the playground locally, use [`nr dev-sfc`](#nr-dev-sfc).
248
+
249
+
-`template-explorer`: A development tool for debugging compiler output, continuously deployed at https://template-explorer.vuejs.org/. To run it locally, run [`nr dev-compiler`](#nr-dev-compiler).
250
+
251
+
-`size-check`: Used for checking built bundle sizes on CI.
252
+
209
253
### Importing Packages
210
254
211
255
The packages can import each other directly using their package names. Note that when importing a package, the name listed in its `package.json` should be used. Most of the time the `@vue/` prefix is needed:
@@ -217,32 +261,34 @@ import { h } from '@vue/runtime-core'
217
261
This is made possible via several configurations:
218
262
219
263
- For TypeScript, `compilerOptions.paths` in `tsconfig.json`
220
-
-For Jest, `moduleNameMapper` in `jest.config.js`
264
+
-Vitest and Rollup share the sae set of aliases from `scripts/aliases.js`
221
265
- For plain Node.js, they are linked using [PNPM Workspaces](https://pnpm.io/workspaces).
There are some rules to follow when importing across package boundaries:
@@ -255,21 +301,19 @@ There are some rules to follow when importing across package boundaries:
255
301
256
302
## Contributing Tests
257
303
258
-
Unit tests are collocated with the code being tested in each package, inside directories named `__tests__`. Consult the [Jest docs](https://jestjs.io/docs/en/using-matchers) and existing test cases for how to write new test specs. Here are some additional guidelines:
304
+
Unit tests are collocated with the code being tested in each package, inside directories named `__tests__`. Consult the [Vitest docs](https://vitest.dev/api/) and existing test cases for how to write new test specs. Here are some additional guidelines:
259
305
260
306
- Use the minimal API needed for a test case. For example, if a test can be written without involving the reactivity system or a component, it should be written so. This limits the test's exposure to changes in unrelated parts and makes it more stable.
261
307
262
308
- If testing platform agnostic behavior or asserting low-level virtual DOM operations, use `@vue/runtime-test`.
263
309
264
310
- Only use platform-specific runtimes if the test is asserting platform-specific behavior.
265
311
266
-
Test coverage is continuously deployed at https://vue-next-coverage.netlify.app/. PRs that improve test coverage are welcome, but in general the test coverage should be used as a guidance for finding API use cases that are not covered by tests. We don't recommend adding tests that only improve coverage but not actually test a meaning use case.
312
+
Test coverage is continuously deployed at https://coverage.vuejs.org. PRs that improve test coverage are welcome, but in general the test coverage should be used as a guidance for finding API use cases that are not covered by tests. We don't recommend adding tests that only improve coverage but not actually test a meaning use case.
267
313
268
314
### Testing Type Definition Correctness
269
315
270
-
This project uses [tsd](https://github.com/SamVerschueren/tsd) to test the built definition files (`*.d.ts`).
271
-
272
-
Type tests are located in the `test-dts` directory. To run the dts tests, run `nr test-dts`. Note that the type test requires all relevant `*.d.ts` files to be built first (and the script does it for you). Once the `d.ts` files are built and up-to-date, the tests can be re-run by simply running `nr test-dts`.
316
+
Type tests are located in the `packages/dts-test` directory. To run the dts tests, run `nr test-dts`. Note that the type test requires all relevant `*.d.ts` files to be built first (and the script does it for you). Once the `d.ts` files are built and up-to-date, the tests can be re-run by running `nr test-dts-only`.
0 commit comments