From c545354e621a8ff9cbe4ddd635a3c500794ac26e Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Sun, 10 Mar 2024 11:15:45 +0000 Subject: [PATCH 1/4] chore: review contribution document --- CONTRIBUTING.md | 100 +++++++++++++++++++++++++++++++----------------- justfile | 4 +- 2 files changed, 67 insertions(+), 37 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3757cd135908..412d94e2ce3a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,16 +68,11 @@ git clone https://github.com/biomejs/biome cd biome ``` -Compile all packages and dependencies: +You can use cargo to run Biome CLI in development mode: ```bash -cargo build -``` - -Biome can be used via the `biome` bin: - -```bash -cargo run --bin biome -- --help +# This is like running "biome --help" +cargo biome-cli-dev --help ``` ## Install the required tools @@ -90,8 +85,7 @@ You can install `just` using cargo: cargo install just ``` -But we **highly recommend** to [install it using an OS package manager](https://github.com/casey/just#packages), -so you won't need to prefix every command with `cargo`. +But we **highly recommend** to [install it using an OS package manager](https://github.com/casey/just#packages), so you won't need to prefix every command with `cargo`. Once installed, run the following command install the required tools: @@ -99,6 +93,13 @@ Once installed, run the following command install the required tools: just install-tools ``` +This command will install: +- `cargo-binstall`, to install binary extensions for `cargo`. +- `cargo-insta`, a `cargo` extension to manage snapshot testing inside the repository. +- `cargo-nextest`, a `cargo` extension to for optionally running tests faster. +- `taplo-cli`, a small tool for formatting TOML files. +- `wasm-pack` and `wasm-tools` for managing the WASM build of Biome. + And you're good to go hack with Biome and Rust! 🚀 ## Crates development @@ -117,7 +118,45 @@ To know the technical details of how our formatter works and how to write test, ### Testing -To run the tests, just run +You can either use `cargo` or `just` to run tests. For simplicity and running tests real quick, use `cargo`. + +With `cargo`, you can run tests with using the `test` command: + +```shell +# run tests +cargo test + +# or use the shortcut +cargo t +``` + +If you run `cargo t` from the root, it will run **all** tests of the whole repository. If you're inside a crate folder, `cargo` will run **tests of that crate**: + +```shell +cd crates/biome_cli + +# it will run only the tests of the `biome_cli` crate +cargo t +``` + +You can run **a single test** with cargo by passing the test name after the `test` command: + +```shell +cd crate/biome_js_formatter + +cargo t quick_test +``` + +This will run the `quick_test` test inside he `biome_js_formatter` crate. You should see an output similar to this: + +```shell +running 1 test +test quick_test::quick_test ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 224 filtered out; finished in 0.02s +``` + +You can also use `just` for running tests. With `just`, the scripts will use the same test runner we use in the CI. ```shell just test @@ -135,9 +174,7 @@ To run only the doctests, you would need to pass an argument to the command: just test-doc ``` -In some crates, we use snapshot testing. -The majority of snapshot testing is done using [`insta`](https://insta.rs). -`insta` is already installed by the command `just install-tools`. +In some crates, we use snapshot testing. The majority of snapshot testing is done using [`insta`](https://insta.rs). `insta` is already installed by the command `just install-tools`. When a snapshot test fails, you can run: @@ -145,6 +182,20 @@ When a snapshot test fails, you can run: - `cargo insta reject` to reject all the changes; - `cargo insta review` to review snapshots singularly; +### Debugging + +Sometimes you want to debug something when running tests. Like `console.log`, in JavaScript, in Rust you can use the macro `dbg!()` to print something during debugging something. Then, pass the option `--show-output` to `cargo`: + +```rs +fn some_function() { + dbg!(&some_variable); +} +``` + +```shell +cargo t --show-output +``` + ### Checks When you finished your work, and you are ready to **commit and open a PR**, @@ -157,27 +208,6 @@ just ready This command will run the same commands of the CI: format, lint, tests and code generation. Eventually everything should be "green" 🟢 and commit all the code that was generated. -#### Generated files - -If you work on some parser and create new nodes or modify existing ones, you must run a command to update some auto-generated files. - -##### `cargo codegen grammar` - -This command will update the syntax of the parsers. - -The source is generated from the [`ungram` files](https://github.com/biomejs/biome/blob/main/xtask/codegen/js.ungram). - -##### `cargo codegen test` - -This command will create new tests for JS or JSON parser. -These tests are generated from inline comments found inside the source code. - -On the other hand, we are moving away from this approach and have a straightforward process in other parser implementation like CSS. - -##### `cargo codegen analyzer` - -This command will detect linter rules declared in the `analyzers`, `assists` and `syntax` directories in the analyzer crates, e.g. `biome_js_analyze`, `biome_json_analyze`, etc., and regenerate the `registry.rs` file and its dependents to include all the rules. - ### crate dependencies [Workspace dependencies](https://doc.rust-lang.org/cargo/reference/workspaces.html#the-dependencies-table) are used, and many dependencies are defined in Cargo.toml in the root. diff --git a/justfile b/justfile index 11dba6a4f80a..51e683ff239d 100644 --- a/justfile +++ b/justfile @@ -11,12 +11,12 @@ alias qt := test-quick # Installs the tools needed to develop install-tools: cargo install cargo-binstall - cargo binstall cargo-insta cargo-nextest taplo-cli wasm-pack wasm-tools cargo-workspaces + cargo binstall cargo-insta cargo-nextest taplo-cli wasm-pack wasm-tools # Upgrades the tools needed to develop upgrade-tools: cargo install cargo-binstall --force - cargo binstall cargo-insta cargo-nextest taplo-cli wasm-pack wasm-tools cargo-workspaces --force + cargo binstall cargo-insta cargo-nextest taplo-cli wasm-pack wasm-tools --force # Generate all files across crates and tools. You rarely want to use it locally. gen: From f6da4a1d28c9c586178e9a318b7d5fa6116ef53d Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 11 Mar 2024 09:09:40 +0000 Subject: [PATCH 2/4] chore: more work --- CONTRIBUTING.md | 85 ++-- justfile | 2 + rfcs/001-js-grammar.md | 107 ----- rfcs/001-js-grammar.ungram | 799 ------------------------------------- rfcs/002-runtime-api.md | 426 -------------------- rfcs/Runtime design.png | Bin 158563 -> 0 bytes 6 files changed, 56 insertions(+), 1363 deletions(-) delete mode 100644 rfcs/001-js-grammar.md delete mode 100644 rfcs/001-js-grammar.ungram delete mode 100644 rfcs/002-runtime-api.md delete mode 100644 rfcs/Runtime design.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 412d94e2ce3a..2b6f4629791c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -102,21 +102,7 @@ This command will install: And you're good to go hack with Biome and Rust! 🚀 -## Crates development - -### Analyzers and lint rules - -To know the technical details of how our analyzer works, how to create a rule and how to write tests, please check our [internal page](https://docs.rs/biome_analyze/latest/biome_analyze/) - -### Parser - -To know the technical details of how our parser works and how to write test, please check our [internal page](https://docs.rs/biome_parser/latest/biome_parser/) - -### Formatter - -To know the technical details of how our formatter works and how to write test, please check our [internal page](https://docs.rs/biome_js_formatter/latest/biome_js_formatter/) - -### Testing +## Testing You can either use `cargo` or `just` to run tests. For simplicity and running tests real quick, use `cargo`. @@ -168,7 +154,20 @@ If you want to test the tests for a single crate: just test-crate biome_cli ``` -To run only the doctests, you would need to pass an argument to the command: +Rust has a concept of **doctest**. A doc test is a doc comment that runs some code. Usually, it looks something like this: + +```rust +/// I am a doc test +/// ``` +/// assert_eq!(true, true) // this is a doc test, and the assertion must pass +/// ``` +fn some_fn() { + +} +``` +The code inside the code blocks is **run** during the testing phase. + +To run only the doctest, you can run the command: ```shell just test-doc @@ -180,35 +179,59 @@ When a snapshot test fails, you can run: - `cargo insta accept` to accept all the changes and update all the snapshots; - `cargo insta reject` to reject all the changes; -- `cargo insta review` to review snapshots singularly; +- `cargo insta review` to review snapshots singularly. ### Debugging Sometimes you want to debug something when running tests. Like `console.log`, in JavaScript, in Rust you can use the macro `dbg!()` to print something during debugging something. Then, pass the option `--show-output` to `cargo`: -```rs -fn some_function() { +```rust +fn some_function() -> &'static str { + let some_variable = "some_variable"; dbg!(&some_variable); + some_variable +} +#[test] +fn test_some_function() { + let result = some_function(); + assert_eq!(result, "some_variable") } ``` ```shell -cargo t --show-output +cargo t test_some_function --show-output ``` ### Checks -When you finished your work, and you are ready to **commit and open a PR**, -run the following command: +When you finished your work, and you are ready to **commit and open a PR**, there are few other +things you would need to run and check: +- `just f` (alias for `just format`), formats Rust and TOML files. +- `just l` (alias for `just lint`), run the linter for the whole project. +- Code generation. The code generation of the repository is spread in the different parts of the code base. Sometimes is needed and sometime it isn't: + - run `just gen-lint` when you're working on the **linter**; + - run `just gen-bindings` in case you worked around the **workspace**; + - run `just gen-web` when you update the `CHANGELOG.md`. -```shell -just ready -``` +> [!NOTE] +> You can run `just ready` as well, although it's a command that runs the codegen of the whole repository, which will take some time + +## Crates development + +### Analyzers and lint rules + +To know the technical details of how our analyzer works, how to create a rule and how to write tests, please check our [internal page](https://docs.rs/biome_analyze/latest/biome_analyze/) + +### Parser + +To know the technical details of how our parser works and how to write test, please check our [internal page](https://docs.rs/biome_parser/latest/biome_parser/) + +### Formatter + +To know the technical details of how our formatter works and how to write test, please check our [internal page](https://docs.rs/biome_js_formatter/latest/biome_js_formatter/) -This command will run the same commands of the CI: format, lint, tests and code generation. -Eventually everything should be "green" 🟢 and commit all the code that was generated. -### crate dependencies +## Crate dependencies [Workspace dependencies](https://doc.rust-lang.org/cargo/reference/workspaces.html#the-dependencies-table) are used, and many dependencies are defined in Cargo.toml in the root. @@ -216,7 +239,7 @@ Internal crates are loaded with `workspace = true` for each crate. About `dev-de ## Node.js development -The npm module `npm/biome` contains Biome's Node JS API that supports different backends: +The npm module `packages/@biomejs/biome` contains Biome's Node.js API that supports different backends: - `wasm-nodejs` (WebAssembly) - `backend-jsonrpc` (Connection to the daemon) @@ -225,8 +248,8 @@ For testing and developing, you need to build these packages, following the step 1. install [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/) globally; 2. run the `build` command inside the package `backend-jsonrpc`; -3. run the `build` and `build:wasm-node-dev` commands inside the package `js-api` (folder `npm/js-api`); -4. run `pnpm i` inside the package `js-api` (folder `npm/js-api`), this will link the WebAssembly bindings and the +3. run the `build` and `build:wasm-node-dev` commands inside the package `js-api` (folder `packages/@biomejs/js-api`); +4. run `pnpm i` inside the package `js-api` (folder `packages/@biomejs/js-api`), this will link the WebAssembly bindings and the JSON-RPC bindings; The tests are run against the compiled files, which means that you need to run the diff --git a/justfile b/justfile index 51e683ff239d..3c516f6959f3 100644 --- a/justfile +++ b/justfile @@ -39,6 +39,8 @@ gen-lint: just gen-bindings just format cargo lintdoc + just gen-bindings + just gen-web # Generates code generated files for the website gen-web: diff --git a/rfcs/001-js-grammar.md b/rfcs/001-js-grammar.md deleted file mode 100644 index 5d697e452fc8..000000000000 --- a/rfcs/001-js-grammar.md +++ /dev/null @@ -1,107 +0,0 @@ - -## Codegen extensions - -* **Must**: Add support for labels so that we can influence how the child accessors are named. For example, we want to name the left and right expressions of `BinaryExpression` `left` and `right` and not `expression` and `expression. Ungrammar supports the `label: Type` syntax. All we need to do is to respect the naming when generating the fields. -* **Must**: Support inline token-union types. For example, the binary expression operator can be any of `==, +, -, ...`. That's why it's defined as `operator: ( '==' | '+' | '-' ...)`. The source gen should only generate a single field for the operator that returns a `SyntaxToken` -* **Must**: Generate different return types for mandatory/optional children. -* **Must/Wish**: It's convenient to define unions in respect of other unions. For example, `JsClassMemberName = JsObjectMemberName | JsPrivateClassMemberName` where `JsObjectMemberName` is an union type as well. This is convenient to maintain the grammar but makes the Facade more awkward to use because it requires two matches: first on the outer union and then on the inner union. We can avoid this if we flatten unions inside of the source gen and automatically generate `From` implementations. -* **Wish**: Automatically strip the `Js` extensions from field names to reduce the need for explicit labels. For example, `ExpressionStatement` must use an explicit label for its inner expression so that it isn't named `js_expression`. -* **Wish**: Generation of a union type over all nodes/tokens of a language, `JsElement = ..., JsNode = ..., JsToken = ...` - -## Proposed Changes - -### JS Prefixing -* Prefix nodes with `Js` to avoid conflicts with other languages -* Prefix tokens with `Js` if they are not representing a specific character sequence. For example, prefix `js_string` because different languages use different quotes for strings but don't prefix `;` or `true` because these are "pure" character sequences. `true` might be somewhat controversial because different languages use different casing `TRUE` vs `true` vs `True`. I don't think the casing is relevant. All these represent a `true` token and the corresponding parser shouldn't generate `TRUE` for a language expecting `true` and each language-impl can provide helpers to build common tokens. - - -### Separated sequences - -It's common in languages to have a sequence of elements that all are separated by a specific separator. Examples in JavaScript where elements are comma separated are: - -* Array elements -* Object properties -* Import/Export specifiers -* ... - -There are two ways how we can model this. I'll use a simplified version of JS arrays that ignores array holes. - -**Wrap elements in a node** - -One option is to create a new node representing an `ArrayElement` that contains the value and an optional trailing comma. - -``` -JsArray = '[' elements: JsArrayElement* '] - -JsArrayElement = - value: JsArrayElementValue - trailing_comma: ','? - -JsArrayElementValue = JsExpression | JsSpread -``` - -Creating a new node has a few downsides: - -* Undesired nesting -* Naming becomes tricky if the element values are over a union type. How to avoid the name clash of the union type and the `Element` type? -* Repetitive grammar: JS defines multiple element-lists that are separated by commas. -* Mutating the elements requires extra care to ensure that the appropriate number of commas are in (the right) place - -I saw that Roslyn' uses a [`SeparatedList`](https://docs.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.separatedsyntaxlist-1). It's just a nice view over a list of children and I think we can adopt a similar approach in the AST Facade by returning `AstSeparatedChildren` for such element lists. -`AstSeparatedChildren` is a view over a range of children that alternate between element and separator. It may provide the following methods: - -* `nodes() -> Iterable>`: Returns the nodes inside of the list. The return type is a result in case a node is missing between two separators -* `separators() -> Iterable`: returns all the separators. There should be no need for an `Option` or `Result` because the parser never starts a new element if a separator is missing -* `elements() -> Iterable<(Result, Option)>`: Returns a list of elements with their separator, for example for use inside of the formatter. The separator is optional because the last element may or may not have a trailing separator. - -We could add additional methods for mutating a separated list, querying a specific `node`/`separator`/`element` etc. - -I believe this gives us the same advantages as having distinct elements without the repetition: - -``` -JsArray = '[' elements: (JsArrayElement (',' JsArrayElement )* ','?) '] - -JsArrayElement = JsExpression | JsSpread -``` - -We should even be able to automatically generate the proper return type on the field by testing whenever we see the `(T (',' T)* ','?)` pattern inside of the grammar, something that [rust-analyzer does too](https://github.com/rust-analyzer/rust-analyzer/blob/dfa355b4313a7ea3eb5a262ee9f1da71f50884d5/crates/syntax/src/tests/sourcegen_ast.rs#L676) already does. - -## Open Questions - -### Member vs Property naming - -Should we call object and class members `Members` or `Properties`? - -* `MemberExpression` has an `object` and `property` field today which feels inconsistent. Shouldn't property be called member or should it be a `PropertyExpression` -* A property can be a value property, method, constructor, or a getter/setter. How to we prevent that we don't end up with property property? -* The term member is commonly used in other languages - -The main downside I see is that property is a commonly used term in the JS ecosystem. Changing property to member could be an entry barrier for people familiar with the term property. - -### AST conformance - -How strict should our AST API be? - -* Should directives be allowed into `BlockStatements` or should we have separate `FunctionBody` and `BlockStatement` nodes where only `FunctionBody` allows directives? -* Should a `script` allow module statements inside of the body? -* Should a `module` have an explicit field for `import` statements at the top? -* Should assignment expression allow left-hand sides that aren't valid assignment targets? - -There's probably no correct answer to this question but we can favour one over the other. - -A strict AST has the benefit that the mutation API prevents users from constructing invalid trees but it comes at the cost that our parser must fall back to `Unknown*` nodes more often and a more complex AST. - -I would recommend being more lenient so that the parser can flag the use of `import/export` inside a script but we can still provide auto-completion on imports/exports before the user converts the script to a module. But it's probably something we must decide case by case but would love to hear your thoughts. - -### Node granularity - -Having fine granular nodes has the advantage that the API allows querying for a very specific node when, for example, using `node.descendants::()`. - -Having more coarse-grained nodes on the other hand has the advantage that it's easier to implement common behaviour that, for example, applies to all Binary expressions. - -I guess, this isn't a specific question, but we should think about if we favour fine granular nodes, being even as extreme as having a different node for each `BinaryExpression` operator. - - -## Ungrammar extension proposals - -Add support for `///` comments that we can use to document nodes and tokens. diff --git a/rfcs/001-js-grammar.ungram b/rfcs/001-js-grammar.ungram deleted file mode 100644 index 141526c49e87..000000000000 --- a/rfcs/001-js-grammar.ungram +++ /dev/null @@ -1,799 +0,0 @@ -// Rules -// Create a node when: -// - contains multiple children (not just a token) -// - it is part of an union type over nodes -// otherwise, create a token - -// Create a wrapper node when the optionality of two or more children depend on each other. -// - For example, the 'else' token and the alternate branch must either be both present or absent. -// -> Create an ElseClause wrapping the token and the alternate branch. -// Create a wrapper node for lists of children that use a common separator, for example -// `ArrayElement = value: Expression, trailing_comma: ','` -// This to guarantee that all tokens can be accessed and that you have a single type of children nodes - -JsScript = - interpreter: 'js_shebang'? // rslint: shebang - directives: 'js_directive'* // Or a directive node? - statements: JsAnyStatement* // Called items - -JsModule = - interpreter: 'js_shebang'? - directives: 'js_directive'* - statements: JsAnyStatement* - -// --------------------- Unknowns --------------------- -// Hack to make ungrammar happy. Let's hope they never ban recursive types xD -// Add special handling in the source generator to skip the `SyntaxNode`, `SyntaxToken`, and `SyntaxElement` types, so that they resolve to the global `SyntaxNode`, `SyntaxToken`, and `SyntaxElement` definitions. -SyntaxNode = SyntaxNode -SyntaxToken = SyntaxToken -SyntaxElement = SyntaxNode | SyntaxToken - -JsUnknownStatement = SyntaxElement* -JsUnknownExpression = SyntaxElement* -JsUnknownPattern = SyntaxElement* -JsUnknownMember = SyntaxElement* -JsUnknownBinding = SyntaxElement* -JsUnknownAssignmentTarget = SyntaxElement* - -// --------------------- Statements --------------------- - - // RSLint -JsAnyStatement = JsBlockStatement // BlockStmt - | JsBreakStatement // BreakStmt - | JsClassDeclaration // ClassDecl - | JsDebuggerStatement // DebuggerStmt - | JsEmptyStatement // EmptyStmt - | JsExpressionStatement // ExprStmt - | JsForStatement // ForStmt - | JsForInStatement // ForInStmt - | JsForOfStatement // ForOfStmt - | JsFunctionDeclaration // FnDecl - | JsIfStatement // IfStmt - | JsLabeledStatement // LabelledStmt - | JsReturnStatement // ReturnStmt - | JsSwitchStatement // SwitchStmt - | JsTryStatement // TryStmt - | JsVariableDeclarationStatement // VarDecl - | JsWhileStatement // WhileStmt - | JsWithStatement // WithStmt - | JsExport // ExportDecl - | JsExportDefault // ExportDefaultDecl - | JsExportFrom // ExportNamed - | JsExportAllFrom // ExportWildcard - | JsImport // ?? - | JsImportModule // ?? - | JsUnknownStatement - -JsBlockStatement = - '{' statements: JsAnyStatement* '}' - -JsBreakStatement = - 'break' - (label: 'js_identifier')? - ';'? - -JsContinueStatement = - 'continue' - (label: 'js_identifier')? - ';'? - -JsDebuggerStatement = - 'debugger' ';'? - -// RSLint uses Condition for: (test) -JsDoWhileStatement = - 'do' body: JsAnyStatement - 'while' '(' test: JsAnyExpression ')' ';'? - -JsEmptyStatement = - ';' - -JsExpressionStatement = - expression: JsAnyExpression ';'? - -// Difference to RSLint: no ForInit, ForTest and ForUpdate: RSLint needed the extra kinds so that it could keep the test/update apart -JsForStatement = - 'for' '(' - init: JsForInit? init_semicolon: ';' - test: JsAnyExpression? test_semicolon: ';' - update: JsAnyExpression? - ')' - body: JsAnyStatement - -JsForInit = JsAnyExpression | JsVariableDeclaration - -JsForInStatement = - 'for' '(' left: JsForLeft 'in' right: JsAnyExpression ')' - body: JsAnyStatement - -JsForOfStatement = - 'for' 'await'? - '(' - left: JsForLeft - 'of' - right: JsAnyExpression - ')' - body: JsAnyStatement - -JsForLeft = JsVariableDeclaration | JsAnyAssignmentTarget - -JsFunctionDeclaration = - 'function' '*'? - id: JsIdentifierBinding - parameter_list: JsParameterList - body: JsFunctionBody - -// Doesn't exist in Rome, biome uses the same type for block/function bodies. -// Reason for splitting: Directives can only exist in function bodies (anything introducing new scope) -JsFunctionBody = - '{' - directives: 'directive'* - body: JsAnyStatement* - '}' - -JsIfStatement = - 'if' '(' test: JsAnyExpression ')' - consequence: JsAnyStatement - else_clause: JsElseClause? - -JsElseClause = - 'else' - alternate: JsAnyStatement - -JsLabeledStatement = - label: 'js_identifier' ':' - body: JsAnyStatement - -JsReturnStatement = - 'return' argument: JsAnyExpression? ';'? - -JsSwitchStatement = - 'switch' '(' discriminant: JsAnyExpression ')' - cases: JsSwitchCase* - -// Introduce a case clause / default because the optionality of the tokens depend on which variant it is -// An alternative would be to have preDefaultCases, defaultCases, postDefaultCases -JsSwitchCase = JsCaseClause | JsDefaultClause -JsCaseClause = 'case' test: JsAnyExpression ':' consequent: JsAnyStatement* -JsDefaultClause = 'default' ':' consequent: JsAnyStatement* - -JsThrowStatement = - 'throw' argument: JsAnyExpression ';'? - -JsTryStatement = - 'try' - block: JsBlockStatement - catch_clause: JsCatchClause - -// Having a `JsTryStatement` and a `JsTryFinallyStatement` isn't ideal because passes must query both if they want to handle try statements. -// Alternatives are -// - Keep single `JsTryStatement` type that contains a list of `try_handlers`+. less guarantess about the handlers -// - Keep single `JsTryStatement` type but create a `TryHandler = CatchClause | FinallyClause | CatchFinallyClause` node so that users can match the whole try statement. -JsTryFinallyStatement = - 'try' - block: JsBlockStatement - catch_clause: JsCatchClause? - finally_clause: JsFinallyClause - -// Group catch parameters because '(', parameter, ')' are all either optional or mandatory depending if any of them are -JsCatchClause = - 'catch' - declaration: JsCatchDeclaration? - body: JsBlockStatement - -JsCatchDeclaration = - '(' binding: JsAnyBinding ')' - -JsFinallyClause = - 'finally' - body: JsBlockStatement - -JsVariableDeclarationStatement = - declaration: JsVariableDeclaration ';'? - -JsVariableDeclaration = - kind_token: ('var' | 'let' | 'const') - declarators: (JsVariableDeclarator (',' JsVariableDeclarator)*) - -JsVariableDeclarator = - id: JsAnyBinding '=' init: JsAnyExpression? - -JsWhileStatement = - 'while' '(' test: JsAnyExpression ')' - body: JsAnyStatement - -JsWithStatement = - 'with' '(' object: JsAnyExpression ')' - body: JsAnyStatement - -// --------------------- EXPRESSIONS --------------------- - -// enum Expr { -// NewTarget, // new.target not supported -// ImportMeta, // import.meta not supported -// SuperCall, -> CallExpression -// PrivatePropAccess, -> MemberExpression -// } - // RSLint Name -JsAnyExpression = JsArrayExpression // ArrayExpr - | JsArrowFunctionExpression // ArrowExpr - | JsAssignmentExpression // AssignExpr - | JsAwaitExpression // AwaitExpr - | JsBinaryExpression // BinExpr - | JsCallExpression // CallExpr - | JsClassExpression // ClassExpr - | JsConditionalExpression // CondExpr - | JsDoExpression - | JsFunctionExpression // FnExpr - | JsImportCall // ImportCall - | JsLogicalExpression // BinExp - | JsMemberExpression // DotExpr, BracketExpr - | JsNewExpression // NewExpr - | JsObjectExpression // ObjectExpr - | JsOptionalCallExpression // CallExpr -> with access to optional token - | JsParenthesizedExpression // GroupingExpr - | JsReferenceIdentifierExpression // NameRef (Rome: JsReferenceIdentifier, Shift: IdentifierExpression) - | JsSequenceExpression // SeqExpr - | JsSuperExpression // Super -> Shift doesn't model Super as expression, I guess to make it sure that it is only allowed in very specific places (call expressions, member object etc. Might be worth making the same distingshen) - | JsTaggedTemplateExpression // TemplateString - | JsThisExpression // This - | JsUnaryExpression // UnaryExpression, covers `await` as well... but why does RSlint have await expression and the unary expression with await?? - | JsPreUpdateExpression // UnaryExpression (Rome: JsUpdateExpression) - | JsPostUpdateExpression // UnaryExpression (Rome: JsUpdateExpression) - | JsYieldExpression // YieldExpr - | JsBooleanLiteral // Literal - | JsBigIntLiteral // Literal - | JsNullLiteral // Literal - | JsNumberLiteral // Literal - | JsStringLiteral // Literal - | JsTemplateLiteral - | JsUnknownExpression - -JsArrayExpression = - '[' - // Not 100% correct because array holes must have a trailing comma. But enforcing - // this would make it too awkward to use - elements: (JsAnyArrayElement (',' JsAnyArrayElement)* ','?) - ']' - -// Doesn't exist in Rome classic nor RSLint. Required so that we can refer the ',' token -JsAnyArrayElement = JsSpread | JsAnyExpression | JsArrayHole - -JsArrowFunctionExpression = - 'async'? - parameters: JsAnyArrowFunctionParameters - '=>' - body: JsStatementOrExpression - -JsAnyArrowFunctionParameters = JsParameterList | JsAnyParameter - -JsAssignmentExpression = - left: JsAnyAssignmentTarget - operator: ('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '>>>=' | '|=' | '^=' | '&=' | '**=' | '&&=' | '||=' | '??=') - right: JsAnyExpression - -JsAwaitExpression = - 'await' argument: JsAnyExpression - -JsBinaryExpression = - left: JsAnyExpression - operator: ('==' | '!=' | '===' | '**' | '!==' | '<' | '<=' | '>' | '>=' | '<<' | '>>' | '>>>' | '+' | '-' | '*' | '/' | '%' | '|' | '^' | '&' | 'in' | 'instanceof') - right: JsAnyExpression - -// Rome classic adds super to callee but this isn't needed because Rome adds super to the expression union??? -JsCallExpression = - callee: JsAnyExpression - argument_list: JsArgumentList - -JsConditionalExpression = - test: JsAnyExpression - '?' - consequent: JsAnyExpression - ':' - alternate: JsAnyExpression - -JsDoExpression = - 'do' - body: JsBlockStatement - -JsFunctionExpression = - 'async'? - 'function' - '*'? - id: JsIdentifierBinding? - parameter_list: JsParameterList - body: JsFunctionBody - -JsLogicalExpression = - left: JsAnyExpression - operator: ('||' | '&&' | '??') - right: JsAnyExpression - -// Rome classic defines object as expr | super but super is already expression? -JsMemberExpression = - object: JsAnyExpression - member: JsAnyMember - -JsAnyMember = JsStaticMember | JsComputedMemberName - -JsStaticMember = '.' name: JsAnyStaticMemberName - -// Rome classic defines callee as expr | super but super is an expression? -JsNewExpression = - 'new' - callee: JsAnyExpression - argument_list: JsArgumentList - -// TODO Better to have a OptionalExpression type to support arrays, members, calls, template literal, private identifier -JsOptionalCallExpression = - callee: JsAnyExpression - optional: '?.' - argument_list: JsArgumentList - -JsParenthesizedExpression = - '(' expression: JsAnyExpression ')' - -JsReferenceIdentifierExpression = - name: 'js_identifier' - -// Even a + qualifier isn't sufficient. We have the following options to represent sequences in the AST: -// - first, second, ...rest: -// - specify that the parser never generates a sequence expression if there are less than 2 expressions. In that case, expressions* would be safe. `a,` would be parsed as unknown expression -// - Model as `BinaryExpression` where `,` is the operator. Results in deeper trees but at least, can be modelled correctly. a, b, c -> seq(left: seq(a, b), c) -JsSequenceExpression = - left: JsAnyExpression - comma: ',' - second: JsAnyExpression - -JsSuperExpression = 'super' - -// example`test` -JsTaggedTemplateExpression = - tag: JsAnyExpression - literal: JsTemplateLiteral - -JsThisExpression = 'this' - -JsUnaryExpression = - operator: ('-' | '+' | '!' | '~' | 'typeof' | 'void' | 'delete') - argument: JsAnyExpression - -// Pre/Post are needed to make the `operator` accessor mandatory. The only alternative would be to -// `JsUpdateExpression = **internal**_prefix: (...)? argument: JsAnyExpression **internal**_postfix: (...)?` and then -// define a public facing `operator` method that returns either one of them or missing if the operator isn't present at all -// (which is unlikely, because the parser would then just parse the argument) -JsPreUpdateExpression = - operator: ('--' | '++') - operand: JsAnySimpleAssignmentTarget - -JsPostUpdateExpression = - operand: JsAnySimpleAssignmentTarget - operator: ('--' | '++') - -JsYieldExpression = - 'yield' '*'? - argument: JsAnyExpression? - -// --------------------- LITERALS --------------------- - -// RSLint uses a single literal node for all kinds. I believe having different nodes is beneficial because it allows us to -// add helper methods on the corresponding `AstNode`s. For example, to get the representation of a number literal, testing -// if a boolean is true, getting the unquoted string... -// All the literal could implement a `Literal` trait that provides access to the "raw" value - -// "abcd" | 'abcd' -JsStringLiteral = value: 'js_string' - -// 4, 5.5, 0x00, ... -JsNumberLiteral = value: 'js_number' // Called JsNumericLiteral in Rome, helper for retrieving representation (hex|octal| etc) - -// 45n -JsBigIntLiteral = value: 'js_bigint' // should the `n` be part of the bigint token or not? Should quotes be part of a string token? -> 5.5d is a numeric_token in roslyn - -// true, false -JsBooleanLiteral = value: ('true' | 'false') - -// null -JsNullLiteral = value: 'null' - -// TODO RegEx - -// The contents of the template. This list must be alternating TemplateElements and Expressions, beginning and ending with TemplateElement. -// Parser guarantees that this list is never empty, always contains at least on element -// Rome uses two different lists: expressions and quasis -JsTemplateLiteral = - left_tick: '`' - elements: JsAnyTemplateElement* - right_tick: '`' - -JsAnyTemplateElement = JsStringTemplateElement | JsAnyExpression - -JsStringTemplateElement = value: 'js_string_template_element' - - -// --------------------- CLASSES --------------------- - -// RSLint: ClassDecl, has ClassBody type -// Rome calls the "members" body. Introduce `ClassBody`? -JsClassDeclaration = - 'class' - id: JsIdentifierBinding - extends_clause: JsExtendsClause? - '{' members: JsAnyClassMember* '}' - -JsExtendsClause = - 'extends' - super_class: JsAnyExpression - -JsClassExpression = - 'class' - id: JsIdentifierBinding? - extends_clause: JsExtendsClause? - '{' members: JsAnyClassMember* '}' - -JsAnyClassMember = // RSLint - JsConstructorClassMember // Constructor - | JsPropertyClassMember // ClassProp - | JsPrivatePropertyClassMember // PrivateProp - | JsMethodClassMember // Method - | JsGetterClassMember // Getter - | JsSetterClassMember // Setter - | JsUnknownMember - -// Main reason for splitting: Each of these have different requirements. For example, a setter without an argument is a syntax error but it's totally fine for a method -// We need to encode this into the grammar to ensure accessing the values will yield an Error when apporpriate. -// At the other hand, the fact that get doesn't accept a param means that we need to fallback to `UnknownMember` when someone creates a getter that accepts an argument. Because, no one would ever visit the params of the getter and, therefore, are not aware of the syntax error. - -JsConstructorClassMember = - 'constructor' - parameter_list: JsParameterList - body: JsFunctionBody - -JsAnyClassMemberName = JsAnyObjectMemberName | JsPrivateClassMemberName - -JsPropertyClassMember = - 'static' - key: JsAnyClassMemberName - value: JsPropertyClassMemberInitializer? ';' - -JsPropertyClassMemberInitializer = - '=' expression: JsAnyExpression - -// TODO share methods etc with objects? -JsMethodClassMember = - 'static'? - 'async'? - '*'? - key: JsAnyClassMemberName - parameter_list: JsParameterList - body: JsFunctionBody - -JsGetterClassMember = - 'static'? - 'get' - key: JsAnyClassMemberName - '(' ')' - body: JsFunctionBody - -JsSetterClassMember = - 'static'? - 'set' - key: JsAnyClassMemberName - '(' value: JsAnyParameter ')' - body: JsFunctionBody - -JsPrivateClassMemberName = '#' id: 'js_identifier' - -JsPrivateMethodClassMember = - 'static'? - 'async'? - '*'? - key: JsPrivateClassMemberName - parameter_list: JsParameterList - body: JsFunctionBody - -JsPrivatePropertyClassMember = - 'static' - key: JsPrivateClassMemberName - value: JsPropertyClassMemberInitializer? ';' - - -// --------------------- OBJECTS --------------------- - -// We should implement helpers that convert the content to a valid name, e.g. the name 0x02 = '2' and not '0x02' -JsAnyStaticMemberName = JsStaticMemberName | JsStringLiteral | JsNumberLiteral - -JsStaticMemberName = name: 'js_identifier' - -JsComputedMemberName = '[' name: JsAnyExpression ']' - -JsAnyObjectMemberName = JsAnyStaticMemberName | JsComputedMemberName - -// members = properties in Rome classic -JsObjectExpression = - '{' - members: (JsAnyObjectMember (',' JsAnyObjectMember)* ','?) - '}' - - // RSLint -JsAnyObjectMember = JsMethodObjectMember // Method, shared with class (allows static, object doesn't allow private names, trailing comma) - | JsGetterObjectMember // Getter, shared with class - | JsSetterObjectMember // Setter, shared with class - | JsPropertyObjectMember // LiteralProp? - | JsSpread // SpreadProp (Rome: JsSpreadProperty) - | JsUnknownMember - -JsPropertyObjectMember = - name: JsAnyObjectMemberName - ':' - value: JsAnyExpression - -JsMethodObjectMember = - 'async'? - '*'? - name: JsAnyObjectMemberName - parameter_list: JsParameterList - body: JsFunctionBody - -JsGetterObjectMember = - 'get' - name: JsAnyObjectMemberName - '(' ')' - body: JsFunctionBody - -JsSetterObjectMember = - 'set' - name: JsAnyObjectMemberName - '(' value: JsAnyParameter ')' - body: JsFunctionBody - - -// --------------------- MODULES --------------------- - -JsExport = - 'export' declaration: JsAnyExportDeclaration - ';'? - -JsAnyExportDeclaration = JsFunctionDeclaration | JsClassDeclaration | JsVariableDeclarationStatement - -JsExportFrom = - 'export' - '{' - specifiers: (JsExportFromSpecifier (',' JsExportFromSpecifier)* ','?) - '}' - 'from' - module_specifier: JsStringLiteral - ';'? - -JsExportFromSpecifier = - name: 'js_identifier' - export_name: JsExportName? - -JsExportName = - 'as' name: 'js_identifier' - -JsExportDefault = - 'export' 'default' argument: JsExportDefaultArgument - -JsExportDefaultArgument = JsClassDeclaration | JsFunctionDeclaration | JsExportDefaultExpressionArgument -// You may be tempted to use `ExpressionStatement` here. Don't! the `DefaultExpressionArgument` would appear -// wherever the user queries for all expression statements which isn't what we want. -JsExportDefaultExpressionArgument = expression: JsAnyExpression ';'? - -JsExportAllFrom = - 'export' - '*' - export_name: JsExportName? - 'from' source: JsStringLiteral - ';'? - -JsImportModule = - 'import' - module_specifier: JsStringLiteral - ';'? - -JsImport = - 'import' - clause: JsAnyImportClause - 'from' - module_specifier: JsStringLiteral - ';'? - -// Needed to guarantee we only allow valid combinations which are -// - default: import x from 'a' -// - named: import { a } from 'a'; -// - namespace: import * from 'a'; -// - default + namespace: import x, * as a from 'a' -// - default + named: import x, { a } from 'a' -JsAnyImportClause = JsImportDefaultBinding | JsNamespaceImportClause | JsNamedImportClause - -// Rome wraps the local name in JSImportSpecifierLocal -JsImportDefaultBinding = - local_name: JsIdentifierBinding - // The comma is required if followed by a {} but otherwise forbidden. Introducing another node just to - // enforce this in namespace import clause / named import clause feels overkill - trailing_comma: ','? - -// Flatten the 'as' + name or use 'JsImportBinding'? -JsNamespaceImportClause = - default_binding: JsImportDefaultBinding? - '*' - 'as' - name: JsIdentifierBinding - -JsNamedImportClause = - default_binding: JsImportDefaultBinding? - '{' - named_imports: (JsImportSpecifier (',' JsImportSpecifier)* ','?) - '}' - -JsImportSpecifier = - name: 'js_identifier' - binding: JsImportBinding? - -JsImportBinding = - 'as' name: JsIdentifierBinding - -JsImportCall = - 'import' - '(' - argument: JsAnyExpression - ')' - -// --------------------- Bindings --------------------- - -// Bindings introduce new variables. These can be variable declarations or patterns -// ``` -// let x = 10; // x is a binding identifier -// let { x, y: [a] } = { x: 1, y: [0] }, // x, introduces the new bindings x and a -// ``` - -JsAnyBinding = JsObjectBinding | JsArrayBinding | JsIdentifierBinding | JsUnknownBinding - -JsDefaultValueClause = - '=' - value: JsAnyExpression - -// let x = OR function(test) {} -// ^ ^^^^ -JsIdentifierBinding = name: 'js_identifier' - -// let [a, , b] = test -// ^^^^^^^^ -JsArrayBinding = - '[' - elements: (JsAnyArrayBindingElement (',' JsAnyArrayBindingElement)* ','?) - rest: JsArrayRestBinding? - ']' - -JsAnyArrayBindingElement = JsBindingWithDefault | JsArrayHole - -// Used in function parameters or for array elements in array bindings -JsBindingWithDefault = - binding: JsAnyBinding - default_value: JsDefaultValueClause - -JsArrayRestBinding = - '...' - binding: JsAnyBinding - - -// let {a, b, ...rest } = -// ^^^^^^^^^^^^^^^^ -JsObjectBinding = - '{' - properties: (JsAnyPropertyBinding (',' JsAnyPropertyBinding)* ','?) - rest: JsObjectRestBinding? - '}' - -// The approach of Babel/Rome to have a single property binding that uses the binding as the key if absent doesn't work because -// serializing that tree would result in a different source text (one that uses a:a) -JsAnyPropertyBinding = JsShorthandPropertyBinding | JsPropertyBinding - -// let { x } or let { x = "test" } -JsShorthandPropertyBinding = - identifier: JsIdentifierBinding - default_value: JsDefaultValueClause? - -// let { x: a } or let { x: a = "test" } -// JsDestructuredPropertyBinding -JsPropertyBinding = - member: JsAnyMember - ':' - binding: JsAnyBinding - default_value: JsDefaultValueClause? - - -JsObjectRestBinding = '...' binding: JsIdentifierBinding - -// --------------------- Assignment targets --------------------- - - -JsAnySimpleAssignmentTarget = JsMemberAssignmentTarget | JsIdentifierAssignmentTarget | JsUnknownAssignmentTarget - -JsAnyAssignmentTarget = JsAnySimpleAssignmentTarget | JsArrayAssignmentTarget | JsObjectAssignmentTarget - -// b = "test" -// ^ -JsIdentifierAssignmentTarget = name: 'js_identifier' - -// a.b = a['b'] = "test" -// ^^^ ^^^^^^ -JsMemberAssignmentTarget = - object: JsAnyExpression - member: JsAnyMember - -// [a, {b}, ...rest] = test -// ^^^^^^^^^^^^^^^^^ -JsArrayAssignmentTarget = - '[' - elements: (JsAnyArrayAssignmentTargetElement (',' JsAnyArrayAssignmentTargetElement)* ','?) - rest: JsArrayAssignmentRest? - ']' - -JsAnyArrayAssignmentTargetElement = JsAssignmentTargetWithDefault | JsArrayHole - -JsAssignmentTargetWithDefault = - target: JsAnyAssignmentTarget - default_value: JsDefaultValueClause - -JsArrayAssignmentRest = - '...' - target: JsAnyAssignmentTarget - -// {a, b: x, ...rest} = -// ^^^^^^^^^^^^^^^^^^ -JsObjectAssignmentTarget = - '{' - properties: (JsAnyPropertyAssignmentTarget (',' JsAnyPropertyAssignmentTarget)* ','?) - rest: JsObjectRestAssignmentTarget? - '}' - -JsAnyPropertyAssignmentTarget = JsShorthandPropertyAssignmentTarget | JsObjectPropertyAssignmentTarget - -// { x } or { x = "test" } -JsShorthandPropertyAssignmentTarget = - identifier: JsIdentifierAssignmentTarget - default_value: JsDefaultValueClause? - -// let { x: a } or let { x: a = "test" } -// JsDestructuredPropertyBinding -JsObjectPropertyAssignmentTarget = - member: JsAnyMember - ':' - target: JsAnyAssignmentTarget - default_value: JsDefaultValueClause? - -JsObjectRestAssignmentTarget = '...' target: JsAnySimpleAssignmentTarget - -// --------------------- Auxilary --------------------- - -// The hole token will always be missing. Needed to make ungrammar happy -JsArrayHole = hole: ''? - -JsStatementOrExpression = JsAnyStatement | JsAnyExpression - -// We can implement various helpers on the function union to replace `FunctionHead` (without paying for the abstraction) -JsFunction = JsFunctionDeclaration - | JsFunctionExpression - | JsArrowFunctionExpression - -JsParameterList = - '(' - parameters: (JsAnyParameter (',' JsAnyParameter)* ','?) - rest: JsRestParameter? - ')' - -JsAnyParameter = JsAnyBinding | JsBindingWithDefault - -JsRestParameter = '...' binding: JsAnyBinding - -JsArgumentList = - '(' - arguments: (JsAnyArgument (',' JsAnyArgument)* ','?) - ')' - -JsAnyArgument = JsAnyExpression | JsSpread - -JsSpread = - '...' argument: JsAnyExpression diff --git a/rfcs/002-runtime-api.md b/rfcs/002-runtime-api.md deleted file mode 100644 index d6ace9c08e1e..000000000000 --- a/rfcs/002-runtime-api.md +++ /dev/null @@ -1,426 +0,0 @@ -# Overview - -Biome is a toolchain where users can use only Biome to manage their code. On the other hand, users should be free to use only specific tools in their workflow, without too much hassle. - -While the latter is desirable, using Biome as all-in-one tool is preferred on the long run because it creates a homogeneous user experience in terms of: -- performance -- error messaging -- caching -- overall workflow between tools -- good defaults - -Considering what written above, the Node.js API should reflect what stated above. - -## Terminology - -From now on the document will use some terms, here's their context inside the document: - -- **Frontend**: the code written for the runtimes (Node.js, Deno, browser, etc.); -- **Rust Workspace**: the main hub where the bulk of the logic resides. It's the Rust code that live - inside the `biome_service` crate; -- **Runtime Workspace**: it's the shared code used by the different Frontends; - - -## Use case for Biome - -The first and foremost important tool that users should access to is Biome's compiler. The compiler, -as this time, it's not ready yet - at least not all the features we intend to implement, -but this was a design decision when it was first created. - -Exposing the compiler should allow a user to do multiple things (not limited to this list): -- allow to transform some code (transplilation, minification, compile to another language, etc.) -- analyze some code (linter, control flow analysis, type check, etc.) -- bundle some code -- generate documentation - -The end goal of how Biome can expose its compiler is via plugins. **Plugins are a non-goal for this -RFC**, but this first proposal should start taking them into consideration. - -As for today, Biome can expose a formatter and a linter (analyzer). - -## The aim of the APIs - -The APIs should only be a **medium** to eventually communicate with the Rust Workspace, -which means that the APIs can't provide more features than what the Rust Workspace can provide. - -While designing the APIs, it's important to take this in consideration. - - -# The current ecosystem - -As for today, different tools have different approaches - -## `prettier` - -Their APIs are not aligned with the CLI. The CLI allows to format a single file, a list of files or -some code passed via `stdin`. The APIs mostly orbit around formatting some content, and they are not -aware if prettier is installed already. This works well for most environments but the majority of the -work is responsibility of the user: -- read files and their contents -- resolve the configuration in case prettier is already installed in the project - -## `esbuild` - -Their APIs and CLI are almost aligned, meaning that the options passed via APIs are mapped 100% to the -CLI, for example: -```js -require('esbuild').buildSync({ - entryPoints: ['app.js'], - outfile: 'out.js', - bundle: true, - platform: 'node', - external: ['fsevents'], -}) -``` - -```shell -esbuild app.js --bundle --external:fsevents --platform=node -``` - -> It seems to me that esbuild is not designed to be a standalone dev server, then caching strategies -> and whatnot are designed for this goal. I might be wrong. - -`esbuild` is mostly designed to be a bundler, so their APIs and design decisions might orbit -around that. - -## `eslint` - -`eslint` takes a different approach compared to `prettier`. Their approach emulates their CLI but -with extra steps: -```js -// 1. Create an instance. -const eslint = new ESLint(); - -// 2. Lint files. -const results = await eslint.lintFiles(["lib/**/*.js"]); - -// 3. Format the results. -const formatter = await eslint.loadFormatter("stylish"); -const resultText = formatter.format(results); - -// 4. Output it. -console.log(resultText); -``` - -They use the instance pattern. The instance accept a [bunch of options](https://eslint.org/docs/latest/developer-guide/nodejs-api#parameters). - -```shell -eslint lib/**/*.js -``` - -There's also one more thing to note, their Node.js API is designed mostly for plugin authors. From -their website: -> The purpose of the Node.js API is to allow plugin and tool authors to use the ESLint functionality directly, without going through the command line interface. - -`eslint` also allows to lint some content: -```js -const results = await eslint.lintText(code, options); -``` - -## `postcss` - -They use the instance pattern: - -```js -let postcss = require('postcss') - -postcss(plugins).process(css, { from, to }).then(result => { - console.log(result.css) -}) -``` - -```shell -postcss input.css -o output.css -postcss src/**/*.css --base src --dir build -cat input.css | postcss -u autoprefixer > output.css -``` - -Even though the approach is slightly different from `eslint`, the result is the same. - -# Biome's APIs - -Here's a list possible proposals of how Biome could be used. - -There might be various cases, but first we need to understand how Biome is designed, and make proposal -based its design **AND** end-goal. - -![Runtime design](./Runtime%20design.png) - - -1. Biome is configuration aware, meaning that when communicating with Rust Workspace, - all configuration defaults are automatically applied. If the APIs are run - inside a Biome project, the configuration is automatically picked up from the `biome.json` file. -2. Biome's APIs should reflect the CLIs commands and arguments. What it's possible to do - via CLI, should be done also via APIs, but not vice-versa. This constraint would allow the team - to first design and test the feature natively, and expose it once it's stable. -3. Biome should be able, in the future, to expose plugins or a way to users to use its compiler capabilities - -> Point `2.` might not be true for ALL cases. For example, as for today, we can't format by -> range via CLI. Maybe this should be more of a guideline, and not a constraint. - - - -## Instance pattern - -Instance pattern - -```js -import { Biome } from "@biomejs/biome"; - -let biome = new Biome({}); -``` - -The instance pattern allows for better extensions on the long run, and allows to play better with -all the tools we want to expose. - -```js -import { Biome } from "@biomejs/biome"; - -const content = "function f() { return {} }"; -const biome = new Biome({ - formatter: { - lineWidth: 120 - }, - linter: { - recommended: false, - js: { - noDeadCode: "error" - } - } -}); -const ast = biome.parseContent(content); // not part of this paragraph -const new_content = biome.formatContent(content); // not part of this paragraph -const diagnostics = biome.checkContent(content); // not part of this paragraph -``` - -The first parameter of the instance should be a personalized configuration. The configuration -passed to the instance **will override** Biome's defaults **_BUT_** not the options inside a possible -`biome.json` file. - -This is an import point, because we might have cases where a user is using Biome for linting/formatting -of the project, but this project is actually using the runtime API to do some ad-hoc work. For example -scripts, some generated code, etc. - -In the future the instance pattern will be useful to register plugins. Plugin need to have access -to the compiler APIs (we don't know yet what kind of APIs and what information). - - -## Formatter - -While using functions à la `prettier` may seem quicker for prototyping, this approach might -create more friction in the future when we will extend the APIs with new features. - -### Formatting a file - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const result = biome.formatFiles(["./path/to/file.js"]); -console.log(result.code); // formatted content -console.log(result.errors); // possible parse errors -``` - -Which reflects - -```shell -biome format ./path/to/file.js -``` - -We can also write directly the new content to a file - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const result = biome.formatFile("./path/to/file.js", { write: true }); // `true` maps to the `--write` argument -console.log(result.code); // undefined, the new content is in the file -console.log(result.errors); // possible parse errors -``` - -Which reflects - -```shell -biome format --write ./path/to/file.js -``` - -### Formatting a directory - -It should be possible to format a directory - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const result = biome.formatFiles(["./path"]); -for (const [file_name, result] of result) { - console.log(file_name); - console.log(result.code); - console.log(result.errors); // errors thrown while formatting this file -} -``` - -Which reflects - -```shell -biome format ./path -``` - -We can also write directly the new content to files - - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const result = biome.formatFiles(["./path"], { write: true }); -for (const [file_name, result] of result) { - console.log(file_name); - console.log(result.code); // undefined, it's being written - console.log(result.errors); // errors thrown while formatting this file -} -``` - -> **Note**: `formatFile` could be removed in favour of only `formatFiles` - -### Formatting some content - -> **Warning**: as for today the CLI doesn't allow to format from `stdin`, but it's something -> that we plan to deliver ASAP - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const content = "function f() { return {}}"; -const result = biome.formatContent(content, { filePath: "example.js" }); -console.log(result.code); // formatted content -console.log(result.errors); // possible parse errors -``` - -Which will translate to - -```shell -echo "function f() { return {}}" | biome format --file-type=js -``` - -`filePath` is required to tell Biome how it should parse the file. - -### Format range - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const content = "function f() { return {}}"; -const result = biome.formatContent(content, { filePath: "example.js", range: [7, 10] }); -console.log(result.code); // formatted content -console.log(result.errors); // possible parse errors -``` - -> **Note**: the CLI doesn't allow to format ranges as for today, and it might not be needed. -> It can be an exception to the rule where each API should be supported by the CLI too. - -### Debugging - - -As you noticed each call accepts an object as second argument. This object could contain a -`debug` property, which allows us to return the IR emitted by Biome. - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const result = biome.formatFiles(["./path/to/file.js"], { debug: true }); -console.log(result.code); // formatted content -console.log(result.errors); // possible parse errors -console.log(result.ir); // the IR emitted by Biome -const content = "function f() { return {}}"; -const result2 = biome.formatContent(content, { filePath: "example.js", range: [7, 10], debug: true }); -console.log(result2.ir); // the IR emitted by the call formatContent -``` - -## Linter - -> **Note**: nowadays, Biome doesn't have a CLI command to _only lint_ files. We have the `check` -> command that does that *now*, but the command is designed to run multiple checks. - -It's also possible to run the linter and retrieve possible diagnostics - -### Lint files - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const result = biome.lintFiles(["./path/to/file.js"]); -console.log(result.errors); // diagnostics emitted while lint the files -``` - - -### Lint content - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const content = "function f() { return {}}"; -const result = biome.lintContent(content, { filePath: "example.js" }); -console.log(result.errors); // diagnostics emitted while lint the files -``` - -## Parse - -Allows to parse a file, and return the CST and AST emitted by the parsing phase. - -> **Note**: nowadays, the CLI doesn't a command to parse files, this could be perfect occasion -> to actually implement it. - - -> **Note**: The reason why `cst` and `ast` are emitted as strings is mostly because we don't have TypeScript file types -for our nodes. If we are able to generate TypeScript types for our AST, then `ast` could be -> returned as an object - -### Parse content - -```js -import { Biome } from "@biomejs/biome"; - -const biome = new Biome(); -const content = "function f() { return {}}"; -const result = biome.parseContent(content, { filePath: "example.js" }); -console.log(result.ast); // AST as string -console.log(result.cst); // CST as string -console.log(result.errors); // possible parse errors -``` - - -## Errors - -This proposal assumes that **all** APIs are prone to errors for different reasons. Internally, in the -Rust Workspace, we emit a `BiomeError`, which might contain other variants with other errors, -form example `ConfigurationError`. - -At the moment this `BiomeError` is not serialized, so it's not very easy to come up with a clear -proposal, but a runtime should receive at least a `code` of the error, e.g. `BiomeError:ConfigurationError`, -maybe a `sub_code` e.g. `ConfigurationError::ConfigAlreadyExists`, - - -## Q&A - -> Why not expose also functions like `format`, `lint`, etc.? - -While this can be an option, and it could be done, I think they don't exactly fit in the grand -scheme of what Biome should be. - -Of course there are exceptions, for example for a future testing framework: - -```js -import {test} from "@biomejs/biome"; - -test("test something", t => { - t.assert(true) -}) -``` - -> diff --git a/rfcs/Runtime design.png b/rfcs/Runtime design.png deleted file mode 100644 index 70f64151cf8988c82aad4d6fbcad1f47c4ed010c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158563 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 Date: Mon, 11 Mar 2024 09:41:31 +0000 Subject: [PATCH 3/4] add toc --- CONTRIBUTING.md | 64 +++++++++++++++++++++-------------------------- website/README.md | 17 ++++++------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2b6f4629791c..7e239ba29d64 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,39 +4,33 @@ We can use help in a bunch of areas and any help is greatly appreciated! ## Table of Contents -- [🚀 Contributing](#-contributing) - - [Table of Contents](#table-of-contents) - - [Asking questions, making proposals](#asking-questions-making-proposals) - - [Reporting bugs](#reporting-bugs) - - [Getting Started](#getting-started) - - [Install the required tools](#install-the-required-tools) - - [Crates development](#crates-development) - - [Analyzers and lint rules](#analyzers-and-lint-rules) - - [Parser](#parser) - - [Formatter](#formatter) - - [Testing](#testing) - - [Checks](#checks) - - [Generated files](#generated-files) - - [`cargo codegen grammar`](#cargo-codegen-grammar) - - [`cargo codegen test`](#cargo-codegen-test) - - [`cargo codegen analyzer`](#cargo-codegen-analyzer) - - [crate dependencies](#crate-dependencies) - - [Node.js development](#nodejs-development) - - [Website development](#website-development) - - [Translations](#translations) - - [Commit messages](#commit-messages) - - [Creating pull requests](#creating-pull-requests) - - [Changelog](#changelog) - - [Writing a changelog line](#writing-a-changelog-line) - - [Documentation](#documentation) - - [Magic comments](#magic-comments) - - [Versioning](#versioning) - - [Releasing](#releasing) - - [Resources](#resources) - - [Current Members](#current-members) - - [Lead team](#lead-team) - - [Core Contributors team](#core-contributors-team) - - [Maintainers team](#maintainers-team) +* [Asking questions, making proposals](#asking-questions-making-proposals) +* [Reporting bugs](#reporting-bugs) +* [Getting Started](#getting-started) +* [Install the required tools](#install-the-required-tools) +* [Testing](#testing) + + [Debugging](#debugging) +* [Checks](#checks) +* [Crates development](#crates-development) + + [Analyzers and lint rules](#analyzers-and-lint-rules) + + [Parser](#parser) + + [Formatter](#formatter) +* [Crate dependencies](#crate-dependencies) +* [Node.js development](#nodejs-development) +* [Website development](#website-development) + + [Translations](#translations) +* [Commit messages](#commit-messages) +* [Creating pull requests](#creating-pull-requests) + + [Changelog](#changelog) + - [Writing a changelog line](#writing-a-changelog-line) + + [Documentation](#documentation) + + [Versioning](#versioning) +* [Releasing](#releasing) +* [Resources](#resources) +* [Current Members](#current-members) + + [Lead team](#lead-team) + + [Core Contributors team](#core-contributors-team) + + [Maintainers team](#maintainers-team) ## Asking questions, making proposals @@ -202,7 +196,7 @@ fn test_some_function() { cargo t test_some_function --show-output ``` -### Checks +## Checks When you finished your work, and you are ready to **commit and open a PR**, there are few other things you would need to run and check: @@ -395,7 +389,7 @@ When releasing a new version of a Biome, follow these steps: Then execute `just gen-lint`. 1. [ ] Update the website with the new version number: - `BIOME_VERSION= cargo codegen-website`. + `BIOME_VERSION= just gen-web`. This will also copy the configuration schema in the right place. 1. [ ] Once the PR is merged, the CI will trigger the `Release: *` workflows. Once these workflows finish compiling the final artefact, **they need to be approved manually**. diff --git a/website/README.md b/website/README.md index 7158a8f202c8..393c49901e61 100644 --- a/website/README.md +++ b/website/README.md @@ -2,29 +2,28 @@ ## Installation -``` -$ cd website -$ pnpm install +```shell +pnpm install ``` ## Local Development -``` -$ pnpm start +```shell +pnpm start ``` This command starts a local development server. Most changes are reflected live without having to restart the server. If you want to work on the playground, additional artifacts are required and the following command must be used instead: -``` -$ pnpm start:playground +```shell +pnpm start:playground ``` ## Build -``` -$ pnpm build +```shell +pnpm build ``` This command generates static content into the build directory and can be served using any static contents hosting service. From 876f2e18f958bd5194e4c01e91cc68fa8d78cb08 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 11 Mar 2024 09:43:36 +0000 Subject: [PATCH 4/4] update justfile --- justfile | 1 - 1 file changed, 1 deletion(-) diff --git a/justfile b/justfile index 3c516f6959f3..3f840621dfee 100644 --- a/justfile +++ b/justfile @@ -39,7 +39,6 @@ gen-lint: just gen-bindings just format cargo lintdoc - just gen-bindings just gen-web # Generates code generated files for the website