diff --git a/website/public/biome.svg b/website/public/biome.svg new file mode 100644 index 0000000000..d9a20d3e69 --- /dev/null +++ b/website/public/biome.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/public/blog/cpp-vs-rust-build-times/index.ejs.html b/website/public/blog/cpp-vs-rust-build-times/index.ejs.html index 3085dcfc85..db95c8805e 100644 --- a/website/public/blog/cpp-vs-rust-build-times/index.ejs.html +++ b/website/public/blog/cpp-vs-rust-build-times/index.ejs.html @@ -400,7 +400,8 @@

Is coding in Rust as bad as in C++?

What do you think? I polled my audience to get their opinion:
<%- twitterPoll.makeReferenceHTML({ width: 510, height: 352, style: - 'border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.8) 0 5px 10px;' }) %> + `width: 510px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.8) 0 + 5px 10px;` }) %>
my poll on Twitter

diff --git a/website/public/blog/why-another-javascript-linter/deno-cover.svg b/website/public/blog/why-another-javascript-linter/deno-cover.svg new file mode 100644 index 0000000000..b824061711 --- /dev/null +++ b/website/public/blog/why-another-javascript-linter/deno-cover.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/public/blog/why-another-javascript-linter/eslint-bad-error-placement-still.png b/website/public/blog/why-another-javascript-linter/eslint-bad-error-placement-still.png new file mode 100644 index 0000000000..396b5f2860 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-bad-error-placement-still.png differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-bad-error-placement.webp b/website/public/blog/why-another-javascript-linter/eslint-bad-error-placement.webp new file mode 100644 index 0000000000..1ef9ca0bff Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-bad-error-placement.webp differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-config-missing.png b/website/public/blog/why-another-javascript-linter/eslint-config-missing.png new file mode 100644 index 0000000000..18b6f2f348 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-config-missing.png differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-esmodule-errors.png b/website/public/blog/why-another-javascript-linter/eslint-esmodule-errors.png new file mode 100644 index 0000000000..aebcb16165 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-esmodule-errors.png differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-jsx-old-config.png b/website/public/blog/why-another-javascript-linter/eslint-jsx-old-config.png new file mode 100644 index 0000000000..a94beb3f17 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-jsx-old-config.png differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-lag-still.png b/website/public/blog/why-another-javascript-linter/eslint-lag-still.png new file mode 100644 index 0000000000..8ac1de00ed Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-lag-still.png differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-lag.webp b/website/public/blog/why-another-javascript-linter/eslint-lag.webp new file mode 100644 index 0000000000..63266f2e4d Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-lag.webp differ diff --git a/website/public/blog/why-another-javascript-linter/eslint-without-node-config.png b/website/public/blog/why-another-javascript-linter/eslint-without-node-config.png new file mode 100644 index 0000000000..62c3188b93 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/eslint-without-node-config.png differ diff --git a/website/public/blog/why-another-javascript-linter/index.ejs.html b/website/public/blog/why-another-javascript-linter/index.ejs.html new file mode 100644 index 0000000000..3f34f6b937 --- /dev/null +++ b/website/public/blog/why-another-javascript-linter/index.ejs.html @@ -0,0 +1,768 @@ + + + + + + + + <%- await include("../../common-head.ejs.html") %> <%- await + include("../blog-head.ejs.html") %> + + + + +
<%- await include("../../common-nav.ejs.html") %>
+ +
+
+

<%= meta.title %>

+

<%= meta.description %>

+
+ +

+ Written by strager on + +

+ +
+ + + + A fight between ESLint, Biome, Deno, Oxc, and quick-lint-js + +
+ JavaScript linters fight to the death.
+ Isolated Vectors by Vecteezy. + Linter logos by their respective authors. +
+
+ +

+ When people hear about quick-lint-js, they ask me one of two questions: +

+
    +
  1. What makes quick-lint-js so fast?
  2. +
  3. + Why did you make another JavaScript linter? Why not use ESLint? +
  4. +
+ +

+ JavaScript linters find mistakes in your code, including real bugs, + outdated code patterns, and style issues. ESLint is the de-facto + standard JavaScript linter. It is highly customizable and readily + available. What's not to like about ESLint? +

+ +

Here is my list:

+
    +
  1. ESLint is editor-last
  2. +
  3. + ESLint is plugin & config hell +
  4. +
  5. ESLint is slow
  6. +
+ +

+ After a discussion of my ESLint grievances, I will evaluate new + JavaScript linters: +

+
    +
  1. Deno Lint
  2. +
  3. Biome
  4. +
  5. quick-lint-js
  6. +
  7. oxlint
  8. +
+ +

Finally, I will share my predictions:

+
    +
  1. + The future of JavaScript linters +
  2. +
+ +
+
+

ESLint is editor-last

+ +

+ ESLint is command-line first, CI second, and editor last. + ESLint focuses on checking your code after you write it, not while + you write it. Programmers typically run ESLint as a batch job + pre-commit. +

+ +

+ I want a JavaScript code assistant; I want to catch issues while I'm + typing. I miss the days when Visual Studio had my back when I hacked + away in C#: +

+
+ Visual Studio showing a bug: 'richTextBox1' may be null +
+ Visual Studio showing bugs in my WinForms C# code +
+
+ +

+ While you can run ESLint in your editor, the experience + isn't great. I teach JavaScript a lot, so I often make small + programs showcasing different JavaScript, Node.js, or browser + features. ESLint only really works inside projects, so it + fights you when you're writing one-off scripts. +

+ +

+ I use Vim. ESLint's Vim plugins are weak. The ALE plugin, for + example, starts a new Node.js process each time linting occurs. + ESLint takes over 150 milliseconds to just start up (on my + Zen 3 5950X CPU!); ESLint can't even keep up with typing at 80 WPM! + But let's talk about speed later. +

+ +

+ When typing, you often introduce syntax errors. You type + ( but don't write the closing ). ESLint + breaks. ESLint should at least give a helpful error message, but it + just tells me "unexpected token }": +

+
+ + + Typing 'console.log("hello"' into VS Code and showing the ESLint error + +
+ ESLint unhelpfully tells me that the bug is because of the + } +
+
+ +

+ Because ESLint's syntax error messages are low quality, you should + only use ESLint after you've tested your code. But at that point, + ESLint is useless to me: it only is for telling me that + row_index is an evil variable name, not that I have + serious bugs. +

+ +

+ I want a tool I can recommend to beginners. Unfortunately, the + ESLint Visual Studio Code extension does not bundle ESLint, so it + does not work out of the box. The extension doesn't tell you what's + wrong if you're missing ESLint or a config file; it silently doesn't + work. ESLint in VS Code is bad for beginners. +

+ +

+ I want a linter which works well in my editor. + Editor support should be a first-class feature. +

+
+ +
+

ESLint is plugin & config hell

+ +

+ Want to use ESLint to lint some JavaScript code? Great! Just run + ESLint: +

+
+ ESLint errors if you are missing an ESLint configuration file +
+ ESLint fails but suggests that you run + eslint --init to configure +
+
+ +

+ Nope. ESLint requires you to create a configuration file, even if + you want a default well-established configuration. As I mentioned + earlier, this makes it annoying to use ESLint for one-off scripts I + make while teaching. +

+ +

+ Want to use ESLint with a Node.js project? Great! ESLint works out + of the box. Not! You need to convince ESLint that you're in + a Node.js project. By default, ESLint complains: +

+
+ ESLint reporting error: 'console' is not defined (no-undef) +
ESLint being confused by modern JavaScript
+
+ +

+ Want to use ESLint for ES modules? Great! But it doesn't work out of + the box; you gotta configure it: +

+
+ ESLint reporting errors: Parsing error: 'import' and 'export' may appear only with 'sourceType: module' +
+ ESLint desperately trying to get your attention +
+
+ +

+ Want to use ESLint for JavaScript code from 2015, using advanced + features like arrow functions and async functions? Great! But it + doesn't work out of the box; you must configure the parser's + ecmaVersion. +

+ +

+ Want to use ESLint with a JSX/React project? Great! There's a plugin + for that. But you can't just install the React plugin; you also need + to configure ESLint's parser, and you should probably specify the + React version too. To make matters worse, the specifics for doing + these things have changed over the years, so old StackOverflow + answers don't work anymore. +

+ +
+ StackOverflow answer suggesting using babel-eslint with ESLint +
+ Old JSX ESLint configurations don't work with ESLint 8 +
+
+ +

+ Want to use ESLint with a TypeScript project? Great! There's a + plugin for that. But just like how installing the JSX plugin wasn't + enough, installing the TypeScript plugin isn't enough. You need to + replace the ESLint parser (which might mean you need to change your + parserOptions), and you also want to enable some TypeScript rules. + Lots of configuration. +

+ +

+ Want to use ESLint for bug-finding only and leave formatting to + Prettier? Great! There's a plugin for that. But why do you need a + plugin? Shouldn't I be able to just turn off ESLint's formatting + rules? Well, now + most ESLint formatting rules are gone + (deprecated as of ESLint v8.53.0), but a few (such as no-extra-semi + and no-irregular-whitespace) remain enabled by default. +

+ +

+ Configuring ESLint only needs to be done when you make major changes + to the project, or when you're just starting the project. There is + even an init tool to create an ESLint config for you. ESLint doesn't + make setup easy enough for me to recommend it to beginners, + and it's not easy enough for me to use for all my projects. +

+ +

+ I want my batteries included. No required config + file for the basics. No plugins for the basics. + Easy to beginners, please. +

+
+ +
+

ESLint is slow

+ +

+ Anyone who has used ESLint in a big project knows that ESLint's + performance sucks. But I work on smaller projects, so performance + shouldn't be too bad, right? +

+ +

+ On one 15k SLOC project, ESLint takes around 950 milliseconds + (16,000 lines per second). The --cache option helps, + bringing linting down to around 400 milliseconds if I change one + file. But even with lots of caching, that's only 38,000 lines per + second! C++ linters run at over 100,000 lines per second without + caching, and C++ is notoriously uglier to deal with than JavaScript. + And in bigger C++ projects, parallelization kicks in to improve + throughput more. +

+ +

+ Why does linting speed matter to me? Half a second isn't that bad. + But as I mentioned in the ESLint is editor-last section, I + need ESLint to keep up with my typing. ESLint being slow is + disorienting: +

+
+ + + Typing 'console' into Vim with ESLint. Squigglies are much slower than typing. + +
+ ESLint squigglies cannot keep up with slow typing
(Vim ALE + ESLint plugin shown) +
+
+ +

+ ESLint is distracting. "But strager, why are you linting while + typing? Just add debouncing so it doesn't flicker as much." No! + Unacceptable. The debouncing is less distracting, but it's still + distracting! In contrast, a fast linter like quick-lint-js is + not distracting to me: +

+
+ + + Typing 'console' into Vim with quick-lint-js. Squigglies keep up with typing. + +
+ quick-lint-js squigglies keep up with fast typing +
+
+ +

+ ESLint performance has been improving. + eslint_d and + the ESLint LSP server (hidden inside the Visual Studio Code extension) help with the latency. ESLint's core has gotten faster; I had to + adjust my "over 130× faster than ESLint" messaging to just "over 90× + faster". And Node.js, V8, and computer hardware are getting faster + too. +

+ +

+ Despite these improvements, + I want a 100× faster ESLint. +

+
+
+ +
+

New JavaScript linters

+ +

+ I don't like ESLint. What other options are there, and how do they + address the problems with ESLint? Let's look at four ESLint + alternatives: +

+
    +
  1. Deno Lint
  2. +
  3. Biome
  4. +
  5. quick-lint-js
  6. +
  7. oxlint
  8. +
+ +
+

Deno Lint

+ +

+ Deno Lint + is a part of the Deno project. Created in March 2020, it features + better performance than ESLint and integration with the rest of + Deno. +

+ +
+ Deno's mascot announcing a new version +
The mascot is one of the best parts of Deno
+
+ +

+ Compatibility: Because Deno Lint is designed for Deno + projects, it does not work well for non-Deno projects. For example, + Deno Lint recognizes JSX syntax, but only in + .jsx files. But most React-based projects use + .js files, so Deno Lint explodes on JSX. Deno Lint + probably won't ever support frameworks such as Vue and Svelte + either. +

+ +

+ Editor integration: Deno has an LSP server that can run the + linter. Editor support is not prominently advertised, but it does + seem to be well-supported (including in Vim). There are caveats, + though. The Visual Studio Code extension does not bundle Deno and + disables itself by default outside of Deno projects, making it + harder to use for beginners. +

+ +

+ Plugin & configs: Deno Lint works out of the box with no + configuration. No plugins are necessary for JSX and TypeScript. + Nice! +

+ +

+ Speed: Deno Lint's command-line interface is decently fast. + Sadly, the LSP server is slow. The slowness is caused by intentional + debouncing. I could fork Deno and patch it out, of course. +

+
+ +
+

Biome

+ +

+ Biome is a linter and formatter + for JavaScript and other languages. Biome's history is a bit weird: + Rome was created in February 2020. It was rewritten from scratch in + September 2021 based on + RSLint + (which was created in September 2020). The Rome dev team forked Rome + and called it Biome in August 2023. +

+ +

+ Compatibility: Biome is designed to meet developers where + they are. As such, it supports JavaScript, JSX, and TypeScript + today, and will support Vue and Svelte in the future. +

+ +

+ Editor integration: Biome has an LSP server that works in Vim + with coc.nvim. In my experience, the LSP server is a bit flaky + because it talks to a separate Biome daemon. Biome's Visual Studio + Code extension requires Biome to be installed separately, making it + harder to use for beginners. +

+ +

+ Plugin & configs: Biome does not suffer from plugin hell + for basic features. Biome also works out of the box without configs. + However, Biome is opinionated by default; it disallows code such as + this.icons["zoomIn"] and sometimes + requires blocks inside + switch statements. Therefore, I need + to configure Biome to shut it up. +

+ +

+ Speed: Biome started fast when it was a light fork of RSLint. + As new lint rules have been added over time, + Biome's linting performance has 50× gotten worse. In my testing, Biome's LSP server is slower than ESLint's! I'm + sure some of this can be fixed, but it looks like linting + performance is not a key feature of Biome. +

+
+ +
+

+ quick-lint-js +

+ +

+ quick-lint-js is my own JavaScript linter. I + started writing it in March 2020 after being annoyed by ESLint's + poor editor integration and + Flow being too picky. +

+ +

+ Compatibility: Like Biome, quick-lint-js is designed to meet + developers where they are. It supports JavaScript and JSX today, + with experimental support for TypeScript. Vue and Svelte support + will come eventually. +

+ +

+ Editor integration: quick-lint-js was designed to work with + editors from the beginning. It has first-party support for various + editors, including different Vim and Emacs plugins. The Visual + Studio Code extension comes with the linter bundled, simplifying + installation. +

+ +

+ Plugin & configs: quick-lint-js is like Biome and Deno + Lint: Your code is correctly linted out of the box. quick-lint-js + focuses on correctness issues and avoids stylistic nitpicks, making + it usable in any project without configuration. However, + quick-lint-js's lack of configuration means that it cannot enforce + style rules in a team. +

+ +

+ Speed: As its name implies, quick-lint-js is fast. Low + latency is a goal because quick-lint-js lints as you type and does + not want to be distracting. The other linters we've discussed + struggle to hit 30 FPS, and quick-lint-js easily passes 1000 FPS. + quick-lint-js isn't perfect, though; it currently cannot lint + directories and does not lint files in parallel. +

+ +
+ Dusty, the quick-lint-js mascot +
+ quick-lint-js's mascot is objectively the cutest +
+
+ +

+ When I created quick-lint-js, Deno Lint and Rome/Biome/RSLint didn't + really exist. If they had existed, I might have contributed to one + of those projects (probably Deno Lint). Today, it would be hard for + me to abandon quick-lint-js. Just thinking about it makes me sad, so + let's move on. 😆 +

+
+ +
+

oxlint

+ +

+ Oxc's oxlint, started in February 2023, is the newest of all the linters + discussed. Oxc has similar goals to Biome, but oxlint tries to be + compatible with ESLint. +

+ +

+ Compatibility: oxlint supports JavaScript, JSX, and + TypeScript out of the box with no configuration. However, Oxc + will not support + Svelte, Vue, or HTML, making its use limited for frameworks that + embed JavaScript in non-.js files. +

+ +

+ Editor integration: Oxc has a Visual Studio Code extension + that bundles the oxlint linter, meaning it works out of the box. + However, it is buggy; lint warnings get stuck until you save, and + squigglies are often in the wrong place, for example. oxlint's LSP + server exists but is not distributed, so if you want to use oxlint + from Vim or Neovim, you need to build oxlint and configure it + yourself. +

+
+ no-const-assign warning reported by Oxc's Visual Studio Code extension spanning multiple lines +
+ oxlint incorrectly warns about the + console.log statement on line 2 +
+
+ +

+ Plugin & configs: oxlint learned the same lesson as the + other modern linters: work out of the box without any ugly config + files or separate plugins. oxlint's default rule set seems less + annoying than Biome's, so I don't feel pressured to maintain oxlint + configs in my project either. oxlint does plan to support custom + rules, but how these extensions are distributed remains to be seen. +

+ +

+ Speed: oxlint claims to be very fast. And fast it is! + oxlint's editor latency is competitive with quick-lint-js according + to + quick-lint-js's LSP server benchmarks: +

+ +
+ LSP server benchmark comparing oxlint, quick-lint-js, ESLint, Biome, and Deno. oxlint and quick-lint-js are sub-millisecond; other linters are slower than 60 FPS. +
+ oxlint and quick-lint-js are very fast compared to ESLint.
+ Biome and Deno are slower than ESLint. +
+
+ +

+ oxlint also has niceties in its command line, such as parallelizing + by default, which makes oxlint useful for pre-commit hooks. +

+
+
+ +
+

The future of JavaScript linters

+ +

+ Biome started in February 2020. Deno Lint and quick-lint-js both + started in March 2020. RSLint (merged into Biome) started in September + 2020. Worldwide lockdowns sure gave people the time to start their + ESLint rewrites. 😅 +

+ +

+ But what about 2024 and beyond? Will the industry-standard ESLint + prevail, or will Deno Lint, Biome, quick-lint-js, or oxlint dethrone + ESLint? Or will even newer linters not yet created take the crown? +

+ +

The different linters of today have different strengths:

+ + +

+ I predict that some of these linters will converge. Biome might adopt + an 'easy mode', removing the need for quick-lint-js. Deno might + replace Deno Lint with a pre-configured ESLint. quick-lint-js might + add plugins and complicated configs and eventually replace ESLint. + oxlint might obsolete everything else! +

+ +

+ It's hard to say what will happen exactly. But I suspect that the + linter landscape will change in the coming years. I hope that my + project (quick-lint-js) is useful today and will push other linters + forward. +

+
+
+ + + + diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown-1x.webp b/website/public/blog/why-another-javascript-linter/linters-showdown-1x.webp new file mode 100644 index 0000000000..92e85aae4d Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/linters-showdown-1x.webp differ diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown-2x.webp b/website/public/blog/why-another-javascript-linter/linters-showdown-2x.webp new file mode 100644 index 0000000000..fcafd31924 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/linters-showdown-2x.webp differ diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown-splash.jpg b/website/public/blog/why-another-javascript-linter/linters-showdown-splash.jpg new file mode 100644 index 0000000000..3245572e5e Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/linters-showdown-splash.jpg differ diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown.svg b/website/public/blog/why-another-javascript-linter/linters-showdown.svg new file mode 100644 index 0000000000..27278834a7 --- /dev/null +++ b/website/public/blog/why-another-javascript-linter/linters-showdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/public/blog/why-another-javascript-linter/oxlint-editor-bug.png b/website/public/blog/why-another-javascript-linter/oxlint-editor-bug.png new file mode 100644 index 0000000000..971eecdd03 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/oxlint-editor-bug.png differ diff --git a/website/public/blog/why-another-javascript-linter/quick-lint-js-benchmark-results.png b/website/public/blog/why-another-javascript-linter/quick-lint-js-benchmark-results.png new file mode 100644 index 0000000000..4f02eee3f6 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/quick-lint-js-benchmark-results.png differ diff --git a/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag-still.png b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag-still.png new file mode 100644 index 0000000000..aa9d1f74ea Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag-still.png differ diff --git a/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag.webp b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag.webp new file mode 100644 index 0000000000..ab5714c860 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag.webp differ diff --git a/website/public/blog/why-another-javascript-linter/visual-studio-squigglies.png b/website/public/blog/why-another-javascript-linter/visual-studio-squigglies.png new file mode 100644 index 0000000000..d9e2285bb0 Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/visual-studio-squigglies.png differ diff --git a/website/public/deno.svg b/website/public/deno.svg new file mode 100644 index 0000000000..73cc87c73a --- /dev/null +++ b/website/public/deno.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/website/public/index.mjs b/website/public/index.mjs index 5d65cd3c85..204598c871 100644 --- a/website/public/index.mjs +++ b/website/public/index.mjs @@ -88,12 +88,14 @@ function getExtraIconAttributes(attributes) { let icons = { chocolatey: { path: "chocolatey.svg", alt: "Chocolatey" }, "arch-linux": { path: "arch-linux.svg", alt: "Arch Linux" }, + biome: { path: "biome.svg", alt: "Biome" }, "cli-and-lsp-server": { path: "gnome-terminal.svg", alt: "CLI and LSP server", }, codespaces: { path: "codespaces.png", alt: "GitHub Codespaces" }, debian: { path: "debian.svg", alt: "Debian" }, + deno: { path: "deno.svg", alt: "Deno" }, emacs: { path: "emacs.svg", alt: "Emacs", disableSpritesheet: true }, github: { path: "github.svg", alt: "GitHub" }, homebrew: { path: "homebrew.svg", alt: "Homebrew" }, @@ -105,6 +107,7 @@ let icons = { "notepad-plus-plus": { path: "notepad-plus-plus.svg", alt: "Notepad++" }, npm: { path: "npm.svg", alt: "npm" }, "open-vsx": { path: "open-vsx.svg", alt: "Open VSX" }, + oxc: { path: "oxc.png", alt: "Oxc" }, "quick-lint-js": { path: "dusty.svg", alt: "quick-lint-js" }, "quick-lint-js-small": { path: "favicon-32x32.png", alt: "quick-lint-js" }, "sublime-text": { diff --git a/website/public/license/biome.svg.html b/website/public/license/biome.svg.html new file mode 100644 index 0000000000..e03b2ac078 --- /dev/null +++ b/website/public/license/biome.svg.html @@ -0,0 +1,27 @@ +

MIT License

+ +

Copyright (c) 2023 Biome Developers and Contributors.

+ +

+ Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: +

+ +

+ The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. +

+ +

+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +

diff --git a/website/public/license/deno.svg.html b/website/public/license/deno.svg.html new file mode 100644 index 0000000000..6886959870 --- /dev/null +++ b/website/public/license/deno.svg.html @@ -0,0 +1,27 @@ +

MIT License

+ +

Copyright (c) 2018-2023 the Deno authors

+ +

+ Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: +

+ +

+ The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. +

+ +

+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +

diff --git a/website/public/license/index.ejs.html b/website/public/license/index.ejs.html index 8b8ae5b326..4c1db3810d 100644 --- a/website/public/license/index.ejs.html +++ b/website/public/license/index.ejs.html @@ -94,10 +94,12 @@

Website

let path = await import("path"); let files = [ "../arch-linux.svg", + "../biome.svg", "../blue-folder.svg", "../chocolatey.svg", "../codespaces.png", "../debian.svg", + "../deno.svg", "../dusty.svg", "../emacs.svg", "../gnome-terminal.svg", @@ -111,6 +113,7 @@

Website

"../notepad-plus-plus.svg", "../npm.svg", "../open-vsx.svg", + "../oxc.png", "../rust-cargo.png", "../rust-crab.svg", "../sublime-text.svg", diff --git a/website/public/license/oxc.png.html b/website/public/license/oxc.png.html new file mode 100644 index 0000000000..b4e48674c0 --- /dev/null +++ b/website/public/license/oxc.png.html @@ -0,0 +1,141 @@ +

CC0 1.0 Universal

+

+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL + SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT + RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. + CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE + INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES + RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. +

+

Statement of Purpose

+

+ The laws of most jurisdictions throughout the world automatically confer + exclusive Copyright and Related Rights (defined below) upon the creator and + subsequent owner(s) (each and all, an "owner") of an original work of + authorship and/or a database (each, a "Work"). +

+

+ Certain owners wish to permanently relinquish those rights to a Work for the + purpose of contributing to a commons of creative, cultural and scientific + works ("Commons") that the public can reliably and without fear of later + claims of infringement build upon, modify, incorporate in other works, reuse + and redistribute as freely as possible in any form whatsoever and for any + purposes, including without limitation commercial purposes. These owners may + contribute to the Commons to promote the ideal of a free culture and the + further production of creative, cultural and scientific works, or to gain + reputation or greater distribution for their Work in part through the use and + efforts of others. +

+

+ For these and/or other purposes and motivations, and without any expectation + of additional consideration or compensation, the person associating CC0 with a + Work (the "Affirmer"), to the extent that he or she is an owner of Copyright + and Related Rights in the Work, voluntarily elects to apply CC0 to the Work + and publicly distribute the Work under its terms, with knowledge of his or her + Copyright and Related Rights in the Work and the meaning and intended legal + effect of CC0 on those rights. +

+

1. Copyright and Related Rights.

+

+ A Work made available under CC0 may be protected by copyright and related or + neighboring rights ("Copyright and Related Rights"). Copyright and Related + Rights include, but are not limited to, the following: +

+
    +
  1. + the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; +
  2. +
  3. moral rights retained by the original author(s) and/or performer(s);
  4. +
  5. + publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; +
  6. +
  7. + rights protecting against unfair competition in regards to a Work, subject + to the limitations in paragraph 4(a), below; +
  8. +
  9. + rights protecting the extraction, dissemination, use and reuse of data in a + Work; +
  10. +
  11. + database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and +
  12. +
  13. + other similar, equivalent or corresponding rights throughout the world based + on applicable law or treaty, and any national implementations thereof. +
  14. +
+

2. Waiver.

+

+ To the greatest extent permitted by, but not in contravention of, applicable + law, Affirmer hereby overtly, fully, permanently, irrevocably and + unconditionally waives, abandons, and surrenders all of Affirmer's Copyright + and Related Rights and associated claims and causes of action, whether now + known or unknown (including existing as well as future claims and causes of + action), in the Work (i) in all territories worldwide, (ii) for the maximum + duration provided by applicable law or treaty (including future time + extensions), (iii) in any current or future medium and for any number of + copies, and (iv) for any purpose whatsoever, including without limitation + commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes + the Waiver for the benefit of each member of the public at large and to the + detriment of Affirmer's heirs and successors, fully intending that such Waiver + shall not be subject to revocation, rescission, cancellation, termination, or + any other legal or equitable action to disrupt the quiet enjoyment of the Work + by the public as contemplated by Affirmer's express Statement of Purpose. +

+

3. Public License Fallback.

+

+ Should any part of the Waiver for any reason be judged legally invalid or + ineffective under applicable law, then the Waiver shall be preserved to the + maximum extent permitted taking into account Affirmer's express Statement of + Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby + grants to each affected person a royalty-free, non transferable, non + sublicensable, non exclusive, irrevocable and unconditional license to + exercise Affirmer's Copyright and Related Rights in the Work (i) in all + territories worldwide, (ii) for the maximum duration provided by applicable + law or treaty (including future time extensions), (iii) in any current or + future medium and for any number of copies, and (iv) for any purpose + whatsoever, including without limitation commercial, advertising or + promotional purposes (the "License"). The License shall be deemed effective as + of the date CC0 was applied by Affirmer to the Work. Should any part of the + License for any reason be judged legally invalid or ineffective under + applicable law, such partial invalidity or ineffectiveness shall not + invalidate the remainder of the License, and in such case Affirmer hereby + affirms that he or she will not (i) exercise any of his or her remaining + Copyright and Related Rights in the Work or (ii) assert any associated claims + and causes of action with respect to the Work, in either case contrary to + Affirmer's express Statement of Purpose. +

+

4. Limitations and Disclaimers.

+
    +
  1. + No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. +
  2. +
  3. + Affirmer offers the Work as-is and makes no representations or warranties of + any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. +
  4. +
  5. + Affirmer disclaims responsibility for clearing rights of other persons that + may apply to the Work or any use thereof, including without limitation any + person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. +
  6. +
  7. + Affirmer understands and acknowledges that Creative Commons is not a party + to this document and has no duty or obligation with respect to this CC0 or + use of the Work. +
  8. +
diff --git a/website/public/main.css b/website/public/main.css index 0cda4dc045..bbd640b303 100755 --- a/website/public/main.css +++ b/website/public/main.css @@ -25,7 +25,9 @@ video + figcaption, pre + figcaption { font-style: italic; } +figure > picture > img, figure > img, +figure > svg, figure > video { width: 100%; height: auto; diff --git a/website/public/oxc.png b/website/public/oxc.png new file mode 100644 index 0000000000..230bd191bc Binary files /dev/null and b/website/public/oxc.png differ