b9c76511a2
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [prettier](https://prettier.io) ([source](https://togithub.com/prettier/prettier)) | [`2.8.8` -> `3.2.5`](https://renovatebot.com/diffs/npm/prettier/2.8.8/3.2.5) | [![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/prettier/3.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/prettier/2.8.8/3.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/2.8.8/3.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>prettier/prettier (prettier)</summary> ### [`v3.2.5`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#325) [Compare Source](https://togithub.com/prettier/prettier/compare/3.2.4...3.2.5) [diff](https://togithub.com/prettier/prettier/compare/3.2.4...3.2.5) ##### Support Angular inline styles as single template literal ([#​15968](https://togithub.com/prettier/prettier/pull/15968) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) [Angular v17](https://blog.angular.io/introducing-angular-v17-4d7033312e4b) supports single string inline styles. <!-- prettier-ignore --> ```ts // Input @​Component({ template: `<div>...</div>`, styles: `h1 { color: blue; }`, }) export class AppComponent {} // Prettier 3.2.4 @​Component({ template: `<div>...</div>`, styles: `h1 { color: blue; }`, }) export class AppComponent {} // Prettier 3.2.5 @​Component({ template: `<div>...</div>`, styles: ` h1 { color: blue; } `, }) export class AppComponent {} ``` ##### Unexpected embedded formatting for Angular template ([#​15969](https://togithub.com/prettier/prettier/pull/15969) by [@​JounQin](https://togithub.com/JounQin)) Computed template should not be considered as Angular component template <!-- prettier-ignore --> ```ts // Input const template = "foobar"; @​Component({ [template]: `<h1>{{ hello }}</h1>`, }) export class AppComponent {} // Prettier 3.2.4 const template = "foobar"; @​Component({ [template]: `<h1>{{ hello }}</h1>`, }) export class AppComponent {} // Prettier 3.2.5 const template = "foobar"; @​Component({ [template]: `<h1>{{ hello }}</h1>`, }) export class AppComponent {} ``` ##### Use `"json"` parser for `tsconfig.json` by default ([#​16012](https://togithub.com/prettier/prettier/pull/16012) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) In [v2.3.0](https://prettier.io/blog/2024/01/12/3.2.0#new-jsonc-parser-added-15831httpsgithubcomprettierprettierpull15831-by-fiskerhttpsgithubcomfisker), we introduced `"jsonc"` parser which adds trialing comma **by default**. When adding a new parser we also define how it will be used based on the [`linguist-languages`](https://www.npmjs.com/package/linguist-languages) data. `tsconfig.json` is a special file used by [TypeScript](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#using-tsconfigjson-or-jsconfigjson), it uses `.json` file extension, but it actually uses the [JSON with Comments](https://code.visualstudio.com/docs/languages/json#\_json-with-comments) syntax. However, we found that there are many third-party tools not recognize it correctly because of the confusing `.json` file extension. We decide to treat it as a JSON file for now to avoid the extra configuration step. To keep using the `"jsonc"` parser for your `tsconfig.json` files, add the following to your `.pretterrc` file ```json { "overrides": [ { "files": ["tsconfig.json", "jsconfig.json"], "options": { "parser": "jsonc" } } ] } ``` <!-- prettier-ignore --> ``` ``` ### [`v3.2.4`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#324) [Compare Source](https://togithub.com/prettier/prettier/compare/3.2.3...3.2.4) [diff](https://togithub.com/prettier/prettier/compare/3.2.3...3.2.4) ##### Fix incorrect parser inference ([#​15947](https://togithub.com/prettier/prettier/pull/15947) by [@​fisker](https://togithub.com/fisker)) Files like `.eslintrc.json` were incorrectly formatted as JSONC files. <!-- prettier-ignore --> ```jsx // Input prettier --file-info .eslintrc.json { "ignored": false, "inferredParser": "jsonc" } // Prettier 3.2.4 prettier --file-info .eslintrc.json { "ignored": false, "inferredParser": "json" } ``` ### [`v3.2.3`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#323) [Compare Source](https://togithub.com/prettier/prettier/compare/3.2.2...3.2.3) [diff](https://togithub.com/prettier/prettier/compare/3.2.2...3.2.3) ##### Throw errors for invalid code ([#​15881](https://togithub.com/prettier/prettier/pull/15881) by [@​fisker](https://togithub.com/fisker), [@​Josh-Cena](https://togithub.com/Josh-Cena), [@​auvred](https://togithub.com/auvred)) <!-- prettier-ignore --> ```ts // Input 1++; // Prettier 3.2.2 1++; // Prettier 3.2.3 SyntaxError: Invalid left-hand side expression in unary operation (1:1) > 1 | 1++; | ^ ``` <!-- prettier-ignore --> ```ts // Input try {} catch (error = 1){} // Prettier 3.2.2 try { } catch (error) {} // Prettier 3.2.3 SyntaxError: Catch clause variable cannot have an initializer. (1:23) > 1 | try {} catch (error = 1){} | ^ ``` ##### Fix parser inference ([#​15927](https://togithub.com/prettier/prettier/pull/15927) by [@​fisker](https://togithub.com/fisker)) <!-- prettier-ignore --> ```console // Prettier 3.2.2 prettier --file-info tsconfig.json { "ignored": false, "inferredParser": "json" } // Prettier 3.2.3 prettier --file-info tsconfig.json { "ignored": false, "inferredParser": "jsonc" } ``` ### [`v3.2.2`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#322) [Compare Source](https://togithub.com/prettier/prettier/compare/3.2.1...3.2.2) [diff](https://togithub.com/prettier/prettier/compare/3.2.1...3.2.2) ##### Fix crash when parsing template literal CSS in a JSX style tag using a spread attribute ([#​15896](https://togithub.com/prettier/prettier/pull/15896) by [@​eelco](https://togithub.com/eelco)) For example this code would crash before: <!-- prettier-ignore --> ```jsx <style {...spread}>{`.{}`}</style> ``` ##### Fix formatting error on optional call expression and member chain ([#​15920](https://togithub.com/prettier/prettier/pull/15920) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) <!-- prettier-ignore --> ```jsx // Input a(() => {}, c?.d()); // Prettier 3.2.1 TypeError: Cannot read properties of undefined (reading 'type') // Prettier 3.2.2 a(() => {}, c?.d()); ``` ### [`v3.2.1`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#321) [Compare Source](https://togithub.com/prettier/prettier/compare/3.2.0...3.2.1) [diff](https://togithub.com/prettier/prettier/compare/3.2.0...3.2.1) ##### Fix formatting error on member chain ([#​15915](https://togithub.com/prettier/prettier/pull/15915) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) <!-- prettier-ignore --> ```jsx // Input test().test2().test2(thing?.something); // Prettier 3.2.0 TypeError: Cannot read properties of undefined (reading 'type') // Prettier 3.2.1 test().test2().test2(thing?.something); ``` ### [`v3.2.0`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#320) [Compare Source](https://togithub.com/prettier/prettier/compare/3.1.1...3.2.0) [diff](https://togithub.com/prettier/prettier/compare/3.1.1...3.2.0) 🔗 [Release Notes](https://prettier.io/blog/2024/01/13/3.2.0.html) ### [`v3.1.1`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#311) [Compare Source](https://togithub.com/prettier/prettier/compare/3.1.0...3.1.1) [diff](https://togithub.com/prettier/prettier/compare/3.1.0...3.1.1) ##### Fix config file search ([#​15363](https://togithub.com/prettier/prettier/pull/15363) by [@​fisker](https://togithub.com/fisker)) Previously, we start search for config files from the filePath as a directory, if it happened to be a directory and contains config file, it will be used by mistake. ```text ├─ .prettierrc └─ test.js (A directory) └─ .prettierrc ``` ```js // Prettier 3.1.0 await prettier.resolveConfigFile(new URL("./test.js", import.meta.url)); // <CWD>/test.js/.prettierrc // Prettier 3.1.1 await prettier.resolveConfigFile(new URL("./test.js", import.meta.url)); // <CWD>/.prettierrc ``` ##### Skip explicitly passed symbolic links with `--no-error-on-unmatched-pattern` ([#​15533](https://togithub.com/prettier/prettier/pull/15533) by [@​sanmai-NL](https://togithub.com/sanmai-NL)) Since Prettier v3, we stopped following symbolic links, however in some use cases, the symbolic link patterns can't be filtered out, and there is no way to prevent Prettier from throwing errors. In Prettier 3.1.1, you can use `--no-error-on-unmatched-pattern` to simply skip symbolic links. ##### Consistently use tabs in ternaries when `useTabs` is `true` ([#​15662](https://togithub.com/prettier/prettier/pull/15662) by [@​auvred](https://togithub.com/auvred)) <!-- prettier-ignore --> ```jsx // Input aaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb : ccccccccccccccc ? ddddddddddddddd : eeeeeeeeeeeeeee ? fffffffffffffff : gggggggggggggggg; // Prettier 3.1.0 aaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb : ccccccccccccccc ? ddddddddddddddd : eeeeeeeeeeeeeee ? fffffffffffffff : gggggggggggggggg; // Prettier 3.1.1 aaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb : ccccccccccccccc ? ddddddddddddddd : eeeeeeeeeeeeeee ? fffffffffffffff : gggggggggggggggg; ``` ##### Improve config file search ([#​15663](https://togithub.com/prettier/prettier/pull/15663) by [@​fisker](https://togithub.com/fisker)) The Prettier config file search performance has been improved by more effective cache strategy. ##### Fix unstable and ugly formatting for comments in destructuring patterns ([#​15708](https://togithub.com/prettier/prettier/pull/15708) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) <!-- prettier-ignore --> ```tsx // Input const { foo, // bar // baz }: Foo = expr; // Prettier 3.1.0 const { foo1, } // bar // baz : Foo = expr; // Prettier 3.1.0 second output const { foo1, // bar } // baz : Foo = expr; // Prettier 3.1.1 const { foo1, // bar // baz }: Foo = expr; ``` ##### Support "Import Attributes" ([#​15718](https://togithub.com/prettier/prettier/pull/15718) by [@​fisker](https://togithub.com/fisker)) [TypeScript 5.3](https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/#import-attributes) supports the latest updates to the [import attributes](https://togithub.com/tc39/proposal-import-attributes) proposal. ```tsx import something from "./something.json" with { type: "json" }; ``` ##### Fix false claim in docs that cursorOffset is incompatible with rangeStart/rangeEnd ([#​15750](https://togithub.com/prettier/prettier/pull/15750) by [@​ExplodingCabbage](https://togithub.com/ExplodingCabbage)) The cursorOffset option has in fact been compatible with rangeStart/rangeEnd for over 5 years, thanks to work by [@​ds300](https://togithub.com/ds300). However, Prettier's documentation (including the CLI `--help` text) continued to claim otherwise, falsely. The documentation is now fixed. ##### Keep curly braces and `from` keyword in empty `import` statements ([#​15756](https://togithub.com/prettier/prettier/pull/15756) by [@​fisker](https://togithub.com/fisker)) <!-- prettier-ignore --> ```js // Input import { } from 'foo'; import { /* comment */ } from 'bar'; // Prettier 3.1.0 import {} from "foo"; import /* comment */ "bar"; // Prettier 3.1.1 import {} from "foo"; import {} from /* comment */ "bar"; ``` ##### Keep empty import attributes and assertions ([#​15757](https://togithub.com/prettier/prettier/pull/15757) by [@​fisker](https://togithub.com/fisker)) <!-- prettier-ignore --> ```js // Input import foo from "foo" with {}; import bar from "bar" assert {}; // Prettier 3.1.0 import foo from "foo"; import bar from "bar"; // Prettier 3.1.1 import foo from "foo" with {}; import bar from "bar" assert {}; ``` ### [`v3.1.0`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#310) [Compare Source](https://togithub.com/prettier/prettier/compare/3.0.3...3.1.0) [diff](https://togithub.com/prettier/prettier/compare/3.0.3...3.1.0) 🔗 [Release Notes](https://prettier.io/blog/2023/11/13/3.1.0.html) ### [`v3.0.3`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#303) [Compare Source](https://togithub.com/prettier/prettier/compare/3.0.2...3.0.3) [diff](https://togithub.com/prettier/prettier/compare/3.0.2...3.0.3) ##### Add `preferUnplugged: true` to `package.json` ([#​15169](https://togithub.com/prettier/prettier/pull/15169) by [@​fisker](https://togithub.com/fisker) and [@​so1ve](https://togithub.com/so1ve)) Prettier v3 uses dynamic imports, user [will need to unplug Prettier](https://togithub.com/yarnpkg/berry/pull/5411#issuecomment-1523502224) when Yarn's PnP mode is enabled, add [`preferUnplugged: true`](https://yarnpkg.com/configuration/manifest#preferUnplugged) to `package.json`, so Yarn will install Prettier as unplug by default. ##### Support shared config that forbids `require()` ([#​15233](https://togithub.com/prettier/prettier/pull/15233) by [@​fisker](https://togithub.com/fisker)) If an external shared config package is used, and the package `exports` don't have `require` or `default` export. In Prettier 3.0.2 Prettier fails when attempt to `require()` the package, and throws an error. ```text Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in <packageName>/package.json ``` ##### Allow argument of `require()` to break ([#​15256](https://togithub.com/prettier/prettier/pull/15256) by [@​fisker](https://togithub.com/fisker)) <!-- prettier-ignore --> ```jsx // Input const plugin = require( global.STANDALONE ? path.join(__dirname, "../standalone.js") : path.join(__dirname, "..") ); // Prettier 3.0.2 const plugin = require(global.STANDALONE ? path.join(__dirname, "../standalone.js") : path.join(__dirname, "..")); // Prettier 3.0.3 const plugin = require( global.STANDALONE ? path.join(__dirname, "../standalone.js") : path.join(__dirname, "..") ); ``` ##### Do not print trailing commas in arrow function type parameter lists in `ts` code blocks ([#​15286](https://togithub.com/prettier/prettier/pull/15286) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) <!-- prettier-ignore --> ````md <!-- Input --> ```ts const foo = <T>() => {} ``` <!-- Prettier 3.0.2 --> ```ts const foo = <T,>() => {} ``` <!-- Prettier 3.0.3 --> ```ts const foo = <T>() => {} ``` ```` ##### Support TypeScript 5.2 `using` / `await using` declaration ([#​15321](https://togithub.com/prettier/prettier/pull/15321) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) Support for the upcoming Explicit Resource Management feature in ECMAScript. [`using` / `await using` declaration](https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/#using-declarations-and-explicit-resource-management) <!-- prettier-ignore --> ```tsx { using foo = new Foo(); await using bar = new Bar(); } ``` ### [`v3.0.2`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#302) [Compare Source](https://togithub.com/prettier/prettier/compare/3.0.1...3.0.2) [diff](https://togithub.com/prettier/prettier/compare/3.0.1...3.0.2) ##### Break after `=` of assignment if RHS is poorly breakable AwaitExpression or YieldExpression ([#​15204](https://togithub.com/prettier/prettier/pull/15204) by [@​seiyab](https://togithub.com/seiyab)) <!-- prettier-ignore --> ```js // Input const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData); // Prettier 3.0.1 const { section, rubric, authors, tags } = await utils.upsertCommonData( mainData, ); // Prettier 3.0.2 const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData); ``` ##### Do not add trailing comma for grouped scss comments ([#​15217](https://togithub.com/prettier/prettier/pull/15217) by [@​auvred](https://togithub.com/auvred)) <!-- prettier-ignore --> ```scss /* Input */ $foo: ( 'property': (), // comment 1 // comment 2 ) /* Prettier 3.0.1 */ $foo: ( "property": (), // comment 1 // comment 2, ); /* Prettier 3.0.2 */ $foo: ( "property": (), // comment 1 // comment 2 ); ``` ##### Print `declare` and `export` keywords for nested namespace ([#​15249](https://togithub.com/prettier/prettier/pull/15249) by [@​sosukesuzuki](https://togithub.com/sosukesuzuki)) <!-- prettier-ignore --> ```tsx // Input declare namespace abc1.def {} export namespace abc2.def {} // Prettier 3.0.1 namespace abc1.def {} namespace abc2.def {} // Prettier 3.0.2 declare namespace abc1.def {} export namespace abc2.def {} ``` ### [`v3.0.1`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#301) [Compare Source](https://togithub.com/prettier/prettier/compare/3.0.0...3.0.1) [diff](https://togithub.com/prettier/prettier/compare/3.0.0...3.0.1) ##### Fix cursor positioning for a special case ([#​14812](https://togithub.com/prettier/prettier/pull/14812) by [@​fisker](https://togithub.com/fisker)) <!-- prettier-ignore --> ```js // <|> is the cursor position /* Input */ // All messages are represented in JSON. // So, the prettier.py controls a subprocess which spawns "node {this_file}". import {<|> } from "fs" /* Prettier 3.0.0 */ // All messages are represented in JSON. // So, the prettier.py <|>controls a subprocess which spawns "node {this_file}". import {} from "fs" /* Prettier 3.0.1 */ // All messages are represented in JSON. // So, the prettier.py controls a subprocess which spawns "node {this_file}". import {<|>} from "fs" ``` ##### Fix plugins/estree.d.ts to make it a module ([#​15018](https://togithub.com/prettier/prettier/pull/15018) by [@​kingyue737](https://togithub.com/kingyue737)) Add `export {}` in `plugins/estree.d.ts` to fix the "File is not a module" error ##### Add parenthesis around leading multiline comment in return statement ([#​15037](https://togithub.com/prettier/prettier/pull/15037) by [@​auvred](https://togithub.com/auvred)) <!-- prettier-ignore --> ```jsx // Input function fn() { return ( /** * @​type {...} */ expresssion ) } // Prettier 3.0.0 function fn() { return /** * @​type {...} */ expresssion; } // Prettier 3.0.1 function fn() { return ( /** * @​type {...} */ expresssion ); } ``` ##### Add support for Vue "Generic Components" ([#​15066](https://togithub.com/prettier/prettier/pull/15066) by [@​auvred](https://togithub.com/auvred)) https://blog.vuejs.org/posts/vue-3-3#generic-components <!-- prettier-ignore --> ```vue <!-- Input --> <script setup lang="ts" generic="T extends Type1 & Type2 & (Type3 | Type4), U extends string | number | boolean"></script> <!-- Prettier 3.0.0 --> <script setup lang="ts" generic="T extends Type1 & Type2 & (Type3 | Type4), U extends string | number | boolean" ></script> <!-- Prettier 3.0.1 --> <script setup lang="ts" generic=" T extends Type1 & Type2 & (Type3 | Type4), U extends string | number | boolean " ></script> ``` ##### Fix comments print in `IfStatement` ([#​15076](https://togithub.com/prettier/prettier/pull/15076) by [@​fisker](https://togithub.com/fisker)) <!-- prettier-ignore --> ```js function a(b) { if (b) return 1; // comment else return 2; } /* Prettier 3.0.0 */ Error: Comment "comment" was not printed. Please report this error! /* Prettier 3.0.1 */ function a(b) { if (b) return 1; // comment else return 2; } ``` ##### Add missing type definition for `printer.preprocess` ([#​15123](https://togithub.com/prettier/prettier/pull/15123) by [@​so1ve](https://togithub.com/so1ve)) ```diff export interface Printer<T = any> { // ... + preprocess?: + | ((ast: T, options: ParserOptions<T>) => T | Promise<T>) + | undefined; } ``` ##### Add missing `getVisitorKeys` method type definition for `Printer` ([#​15125](https://togithub.com/prettier/prettier/pull/15125) by [@​auvred](https://togithub.com/auvred)) ```tsx const printer: Printer = { print: () => [], getVisitorKeys(node, nonTraversableKeys) { return ["body"]; }, }; ``` ##### Add typing to support `readonly` array properties of AST Node ([#​15127](https://togithub.com/prettier/prettier/pull/15127) by [@​auvred](https://togithub.com/auvred)) <!-- prettier-ignore --> ```tsx // Input interface TestNode { readonlyArray: readonly string[]; } declare const path: AstPath<TestNode>; path.map(() => "", "readonlyArray"); // Prettier 3.0.0 interface TestNode { readonlyArray: readonly string[]; } declare const path: AstPath<TestNode>; path.map(() => "", "readonlyArray"); // ^ Argument of type '"readonlyArray"' is not assignable to parameter of type '"regularArray"'. ts(2345) // Prettier 3.0.1 interface TestNode { readonlyArray: readonly string[]; } declare const path: AstPath<TestNode>; path.map(() => "", "readonlyArray"); ``` ##### Add space before unary minus followed by a function call ([#​15129](https://togithub.com/prettier/prettier/pull/15129) by [@​pamelalozano](https://togithub.com/pamelalozano)) <!-- prettier-ignore --> ```less // Input div { margin: - func(); } // Prettier 3.0.0 div { margin: -func(); } // Prettier 3.0.1 div { margin: - func(); } ``` ### [`v3.0.0`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#300) [Compare Source](https://togithub.com/prettier/prettier/compare/2.8.8...3.0.0) [diff](https://togithub.com/prettier/prettier/compare/3.0.0-alpha.6...3.0.0) 🔗 [Release Notes](https://prettier.io/blog/2023/07/05/3.0.0.html) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/agbrs/agb). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=--> |
||
---|---|---|
.github | ||
.vscode | ||
agb | ||
agb-fixnum | ||
agb-gbafix | ||
agb-hashmap | ||
agb-image-converter | ||
agb-macros | ||
agb-sound-converter | ||
book | ||
emulator | ||
examples | ||
template | ||
tools | ||
tracker | ||
website | ||
.gitignore | ||
.gitmodules | ||
CHANGELOG.md | ||
justfile | ||
LICENSE | ||
logo-original.png | ||
README.md |
AGB
Rust for the Game Boy Advance
This is a library for making games on the Game Boy Advance using the Rust programming language. The library's main focus is to provide an abstraction that allows you to develop games which take advantage of the GBA's capabilities without needing to have extensive knowledge of its low-level implementation.
agb provides the following features:
- Simple build process with minimal dependencies
- Built in importing of sprites, backgrounds, music and sound effects
- High performance audio mixer
- Easy to use sprite and tiled background usage
- A global allocator allowing for use of both
core
andalloc
The documentation for the latest release can be found on docs.rs.
Getting started
The best way to get started with agb is to use the template, either within the
template
directory in this repository or cloning the template repository.
Once you have done this, you will find further instructions within the README in the template.
There is an (in progress) tutorial which you can find on the project website.
Help / Support
If you need any help, the discussions page is a great place to get help from the creators and contributors.
Feel free to create a new discussion in the Q&A category and we'll do our best to help!
Contributing to agb itself
In order to contribute to agb itself, you will need a few extra tools on top of what you would need to just write games for the Game Boy Advance using this library:
- Recent rustup, see the rust website
for instructions for your operating system.
- You can update rustup with
rustup update
, or using your package manager if you obtained rustup in this way.
- You can update rustup with
- libelf and cmake
- Debian and derivatives:
sudo apt install libelf-dev cmake
- Arch Linux and derivatives:
pacman -S libelf cmake
- Debian and derivatives:
- mgba-test-runner
- Run
cargo install --path emulator/test-runner
inside this directory
- Run
- The 'just' build tool
- Install with
cargo install just
- Install with
- mdbook
- Install with
cargo install mdbook
- Install with
- miri
- Some of the unsafe code is tested using miri, install with
rustup component add miri
- Some of the unsafe code is tested using miri, install with
With all of this installed, you should be able to run a full build of agb using by running
just ci
Note that before you create a PR, please file an issue so we can discuss what you are looking to change.
Structure of the repo
agb-fixnum
- a simple fixed point number storage since the GBA doesn't have a floating point unit, so required
for performant decimals.
agb-image-converter
- a crate which converts images in normal formats to a format supported by the game boy advance
agb-macros
- miscellaneous proc-macros which have to be in a different crate
agb-sound-converter
- a crate which converts wav files into a format supported by the game boy advance
agb-hashmap
- an no_std hashmap implementation tuned for use on the game boy advance
agb
- the main library code
agb/examples
- basic examples often targeting 1 feature, you can run these using just run-example <example-name>
tracker
- crates that make up the agb-tracker
library which allows playing of tracker files
book
- the source for the tutorial and website
book/games
- games made as part of the tutorial
examples
- bigger examples of a complete game, made during game jams
emulator
- Rust bindings for the mgba emulator used for our purposes. Currently this does not accept contributions.
template
- the source for the template repository
Stability
While agb is in the pre-1.0 phase, we follow a semi-semantic versioning scheme to ensure compatibility between minor releases. Specifically, any 0.x.y release is guaranteed to be compatible with another 0.x.z release provided that y > z, but there may be breaking changes between minor releases (i.e., changes to the second digit, e.g., between 0.1 and 0.2).
Once agb reaches version 1.0, we will transition to stronger semantic versioning, meaning that any breaking changes will be indicated by an increment to the major version (i.e., the first digit, e.g., from 1.0 to 2.0).
Acknowledgments
agb would not be possible without the help from the following (non-exhaustive) list of projects:
- The amazing work of the rust-console for making this all possible in the first place
- The asefile crate for loading aseprite files
- agbabi for providing high performance alternatives to common methods
- mgba for all the useful debugging / developer tools built in to the emulator
Licence
agb and all its subcrates are released under MPL version 2.0. See full licence text in the LICENSE
file.
agb contains a subset of the code from agbabi which is released under a zlib style licence,
details for which you can find under agb/src/agbabi
.
The template is released under CC0 to allow you to make whatever changes you wish.
The agb logo is released under Creative Commons Attribution-ShareAlike 4.0
The music used for the examples is by Josh Woodward and released under Creative Commons Attribution 4.0